国际化(Internationalization)

概述

如果你的应用程序会触及从世界各地而来的人或系统,国际化(i18n)和本地化(l10n)会是你国际化策略重要的一部分。Sails 提供内建支持,用于侦测用户语言偏好设置和翻译静态单字/句子,这要归功于 i18n-nodenpm)。

用法

在检视内:

  1. <h1> <%= __('Hello') %> </h1>
  2. <h1> <%= __('Hello %s, how are you today?', 'Mike') %> </h1>
  3. <p> <%= i18n('That\'s right-- you can use either i18n() or __()') %> </p>

在控制器或政策内:

  1. req.__('Hello'); // => Hola
  2. req.__('Hello %s', 'Marcus'); // => Hola Marcus
  3. req.__('Hello {{name}}', { name: 'Marcus' }); // => Hola Marcus

或者,你已经知道语系 ID,你可以在应用程序内的任何地方使用 sails.__ 翻译:

  1. sails.__({
  2. phrase: 'Hello',
  3. locale: 'es'
  4. });
  5. // => 'Hola!'

语系

i18n 挂勾(hook)会从工程的「locales」目录(默认是 config/locales)读取 JSON 格式翻译文档。每个文档对应一个 Sails 后端所支持的语系(通常是语言)。

这些文档包含特定的语系字串(为 JSON 键值对),你可以使用在检视、控制器等地方。

这里有一个语系例子文档(config/locales/es.json):

  1. {
  2. "Hello!": "Hola!",
  3. "Hello %s, how are you today?": "¿Hola %s, como estas?",
  4. }

请注意,语系档内的键(例如 “Hello %s, how are you today?”)有区分大小写且需要精准匹配。这里有几个不同思想流派的最佳翻译,要选择哪个翻译取决于未来最常会由谁编辑语系档与 HTML。特别是如果你会手动编辑,将键的名称全部小写会最提供最佳的可维护性。

例如,这里有另一个翻译在 config/locales/es.json

  1. {
  2. "hello": "Hola!",
  3. "hello-how-are-you-today": "Hola %s, ¿cómo estás?",
  4. }

以及这里 config/locales/en.json

  1. {
  2. "hello": "Hello!",
  3. "hello-how-are-you-today": "Hello, how are you today?",
  4. }

侦测和/或覆写请求的所需语系

使用新的语系代码呼叫 req.setLocale() 来覆写请求的自动侦测语言/本地化偏好设置:

  1. // 强制让请求使用德文:
  2. req.setLocale('de');
  3. //(这会使用在 `config/locales/de.json` 的字串来翻译)

默认情况下,node-i18n 会通过检查请求的 Language 标头来侦测所需的语言。Language 标头是设置在用户的浏览器,且它们大多是正确的,你可能需要灵活覆写所侦测到的语系并提供翻译。

例如,如果你的应用程序允许使用者选择偏好语言,你可能会建立一个政策用来检查使用者会话(Session)内的自定义语言,如果存在的话,设置相应语系以便在后续的政策、控制器动作和检视使用:

  1. // api/policies/localize.js
  2. module.exports = function(req, res, next) {
  3. req.setLocale(req.session.languagePreference);
  4. next();
  5. };

<!—

Alternatively, here’s another extended example: (todo: at the very least pull this into a sep