国际化(Internationalization)

概述

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

用法

在检视内:

<%= __('Hello')="" %="">

<%= __('Hello="" %s,="" how="" are="" you="" today?',="" 'Mike')="" %="">

<%= i18n('That\'s="" right--="" you="" can="" use="" either="" i18n()="" or="" __()')="" %="">

在控制器或政策内:

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

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

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

语系

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

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

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

{
    "Hello!": "Hola!",
    "Hello %s, how are you today?": "¿Hola %s, como estas?",
}

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

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

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

以及这里 config/locales/en.json

{
    "hello": "Hello!",
    "hello-how-are-you-today": "Hello, how are you today?",
}

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

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

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

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

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

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

<!--

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