Egg 國際化(I18n)

2020-02-06 14:11 更新

為了方便開發(fā)多語言應用,框架內(nèi)置了國際化(I18n)支持,由 egg-i18n 插件提供。

默認語言

默認語言是 en-US。假設我們想修改默認語言為簡體中文:

// config/config.default.js
exports.i18n = {
defaultLocale: 'zh-CN',
};

切換語言

我們可以通過下面幾種方式修改應用的當前語言(修改后會記錄到 locale 這個 Cookie),下次請求直接用設定好的語言。

優(yōu)先級從高到低:

  1. query: /?locale=en-US
  2. cookie: locale=zh-TW
  3. header: Accept-Language: zh-CN,zh;q=0.5

如果想修改 query 或者 Cookie 參數(shù)名稱:

// config/config.default.js
exports.i18n = {
queryField: 'locale',
cookieField: 'locale',
// Cookie 默認一年后過期, 如果設置為 Number,則單位為 ms
cookieMaxAge: '1y',
};

編寫 I18n 多語言文件

多種語言的配置是獨立的,統(tǒng)一存放在 config/locale/*.js 下。

- config/locale/
- en-US.js
- zh-CN.js
- zh-TW.js

不僅對于應用目錄生效,在框架,插件的 config/locale 目錄下同樣生效。

注意單詞拼寫,是 locale 不是 locals。

例如:

// config/locale/zh-CN.js
module.exports = {
Email: '郵箱',
};

或者也可以用 JSON 格式的文件:

// config/locale/zh-CN.json
{
"Email": "郵箱"
}

獲取多語言文本

我們可以使用 __ (Alias: gettext) 函數(shù)獲取 locale 文件夾下面的多語言文本。

注意: __ 是兩個下劃線

以上面配置過的多語言為例:

ctx.__('Email')
// zh-CN => 郵箱
// en-US => Email

如果文本中含有 %s,%j 等 format 函數(shù),可以按照 util.format() 類似的方式調用:

// config/locale/zh-CN.js
module.exports = {
'Welcome back, %s!': '歡迎回來,%s!',
};

ctx.__('Welcome back, %s!', 'Shawn');
// zh-CN => 歡迎回來,Shawn!
// en-US => Welcome back, Shawn!

同時支持數(shù)組下標占位符方式,例如:

// config/locale/zh-CN.js
module.exports = {
'Hello {0}! My name is {1}.': '你好 {0}! 我的名字叫 {1}。',
};

ctx.__('Hello {0}! My name is {1}.', ['foo', 'bar'])
// zh-CN => 你好 foo!我的名字叫 bar。
// en-US => Hello foo! My name is bar.

Controller 中使用

class HomeController extends Controller {
async index() {
const ctx = this.ctx;
ctx.body = {
message: ctx.__('Welcome back, %s!', ctx.user.name)
// 或者使用 gettext,gettext 是 __ 函數(shù)的 alias
// message: ctx.gettext('Welcome back', ctx.user.name)
user: ctx.user,
};
}
}

View 中使用

假設我們使用的模板引擎是 Nunjucks

<li>{{ __('Email') }}: {{ user.email }}</li>
<li>
{{ __('Welcome back, %s!', user.name) }}
</li>
<li>
{{ __('Hello {0}! My name is {1}.', ['foo', 'bar']) }}
</li>


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號