首页 > 语言 > JavaScript > 正文

详解基于webpack&gettext的前端多语言方案

2024-05-06 15:42:45
字体:
来源:转载
供稿:网友

gettext 是GNU 提供的一套 国际化与本地化 处理的相关函数库。大多数语言都有对应的gettext实现。本文主要使用jed 来实现gettext 一系列方法对应的功能。

pot/po文件

pot文件 是po文件的模板文件,一般是通过 xgettext 程序生成出来的。 po文件 是根据pot文件通过msginit程序,设置对应的国家语言生成用于填写实际翻译内容的文件。

xgettext/msginit/msgmerge

xgettext 程序可以扫描指定的代码文件,取出其中gettext部分的内容生成对应的pot文件。 msginit 根据对应的pot文件生成对应语言版本用于实际翻译的po文件。 msgmerge 如果对应语言版本的po文件存在的话,则需要使用msgmerge方式把pot文件中新加入的一些msgid合并到po文件当中。

多语言支持流程

安装gettext

brew install gettextbrew link gettext

langs-loader 加载语言文件

安装
npm install git@github.com:ezbuy/langs-loader.git --save-dev
配置

需要修改webpack.config.js文件在module->rules(webpack 2.0)下面添加loader规则:

{  test: //.pot$/i,  use: [    "json",    {      loader: 'langs',      options: {isLoadAll: isDev,format:"jed1.x", "fallback-to-msgid":true, code:langCode}    }  ]}
isLoadAll

isLoadAll表示会把所有语言版本的文件通过po2json转换成json,然后组合成一个json作为数据传给引用的地方。

code

code选项一般需要在代码发布时指定,不同语言版本打包时通过传入不同的code区分不同语言版本的代码打包。

代码中使用gettext系列函数

各端开发时使用各自实现的gettext方法去包装需要实现多语言的文案。使用gettext函数包装后, langs-util 就能知道代码中有需要多语言翻译的地方,并可以通过 langs-util 生成相关的pot及po文件。gettext方法底层我们使用jed 来实现其对应功能。

import toi18n from "common/i18n";const _ = toi18n(require("langs/index.pot"));const hiStr = _.gettext("Hi!");const num = Math.ceil(Math.random() * 2);const numStr = _.ngettext("item", "items", num);// I like your red shirt.console.log(_.sprintf( "I like your %1$s %2$s.", 'red', 'shirt'));
gettext

一般使用 gettext 方法包装一个需要翻译的字符串。

ngettext

可以用于单复数处理,第一个参数传入单数情况下的翻译,第二个参数传入复数情况下的翻译,第三个传入实际需要执行判断的数据。

sprintf

Jed内置提供了sprintf的支持,它是使用javascript-sprintf的sprintf函数的实现。

通过gettext 一系列函数的配合,使用 langs-util 进行生成处理后就能生成对应的pot及po文件。

langs-util gen -i src/
# langs/index.potmsgid "Hi!"msgstr ""msgid "item"msgid_plural "items"msgstr[0] ""msgstr[1] ""            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选