為了方便開發(fā)多語(yǔ)言應(yīng)用,框架內(nèi)置了國(guó)際化(I18n)支持,由 egg-i18n 插件提供。
默認(rèn)語(yǔ)言
默認(rèn)語(yǔ)言是 en-US。假設(shè)我們想修改默認(rèn)語(yǔ)言為簡(jiǎn)體中文:
// config/config.default.js exports.i18n = { defaultLocale: 'zh-CN', };
|
切換語(yǔ)言
我們可以通過(guò)下面幾種方式修改應(yīng)用的當(dāng)前語(yǔ)言(修改后會(huì)記錄到 locale 這個(gè) Cookie),下次請(qǐng)求直接用設(shè)定好的語(yǔ)言。
優(yōu)先級(jí)從高到低:
- query: /?locale=en-US
- cookie: locale=zh-TW
- header: Accept-Language: zh-CN,zh;q=0.5
如果想修改 query 或者 Cookie 參數(shù)名稱:
// config/config.default.js exports.i18n = { queryField: 'locale', cookieField: 'locale', // Cookie 默認(rèn)一年后過(guò)期, 如果設(shè)置為 Number,則單位為 ms cookieMaxAge: '1y', };
|
編寫 I18n 多語(yǔ)言文件
多種語(yǔ)言的配置是獨(dú)立的,統(tǒng)一存放在 config/locale/*.js 下。
- config/locale/ - en-US.js - zh-CN.js - zh-TW.js
|
不僅對(duì)于應(yīng)用目錄生效,在框架,插件的 config/locale 目錄下同樣生效。
注意單詞拼寫,是 locale 不是 locals。
例如:
// config/locale/zh-CN.js module.exports = { Email: '郵箱', };
|
或者也可以用 JSON 格式的文件:
// config/locale/zh-CN.json { "Email": "郵箱" }
|
獲取多語(yǔ)言文本
我們可以使用 __ (Alias: gettext) 函數(shù)獲取 locale 文件夾下面的多語(yǔ)言文本。
注意: __ 是兩個(gè)下劃線
以上面配置過(guò)的多語(yǔ)言為例:
ctx.__('Email') // zh-CN => 郵箱 // en-US => Email
|
如果文本中含有 %s,%j 等 format 函數(shù),可以按照 util.format() 類似的方式調(diào)用:
// config/locale/zh-CN.js module.exports = { 'Welcome back, %s!': '歡迎回來(lái),%s!', };
ctx.__('Welcome back, %s!', 'Shawn'); // zh-CN => 歡迎回來(lái),Shawn! // en-US => Welcome back, Shawn!
|
同時(shí)支持?jǐn)?shù)組下標(biāo)占位符方式,例如:
// 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 中使用
假設(shè)我們使用的模板引擎是 Nunjucks
<li>{{ __('Email') }}: {{ user.email }}</li> <li> {{ __('Welcome back, %s!', user.name) }} </li> <li> {{ __('Hello {0}! My name is {1}.', ['foo', 'bar']) }} </li> |
更多建議: