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} } ]} isLoadAllisLoadAll表示會把所有語言版本的文件通過po2json轉換成json,然后組合成一個json作為數據傳給引用的地方。
codecode選項一般需要在代碼發布時指定,不同語言版本打包時通過傳入不同的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可以用于單復數處理,第一個參數傳入單數情況下的翻譯,第二個參數傳入復數情況下的翻譯,第三個傳入實際需要執行判斷的數據。
sprintfJed內置提供了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] ""
新聞熱點
疑難解答
圖片精選