这是 Mozilla 身份团队的 Node.JS 节日季系列 中的第 9 集,共 12 集。现在是深入了解本地化的时刻!
你知道 Mozilla 的产品和服务被本地化为多达 90 种语言吗?
以下只是一些本地化的例子
- 文本被翻译成区域语言变体
- 针对特定语言的屏幕从右到左渲染
- 能够适应可变长度文本的防弹设计
- 与当地受众产生共鸣的标签、标题和按钮文本
在本系列文章中,我将介绍如何本地化 Node.js 服务的一些技术方面。
在我们开始之前,我将使用缩写词 L10n(Localization)和 I18n Internationalization。I18n 是使 L10n 成为可能的必要技术基础设施。
Mozilla Persona 是一款基于 Node.js 的服务,已本地化为 X 种语言。我们的团队有非常具体的目标,这些目标阻止我们使用现有的 Node L10n 库。
目标
我们创建了这些模块,以实现以下目标
- 与现有的 Mozilla L10n 社区良好协作
- 让开发人员使用纯 JS 工具包
生成的工具包包含多个新的 Node 模块
- i18n-abide
- jsxgettext
- po2json.js
- gobbledygook
i18n-abide 是您用于将翻译集成到您自己的服务中的主要模块。让我们一起了解如何添加它。
在这些示例中,我们将假设您的代码使用 Express 和 EJS 模板。
安装
npm install i18n-abide
准备您的代码库
在您的代码中
var i18n = require('i18n-abide');
app.use(i18n.abide({
supported_languages: ['en-US', 'de', 'es', 'zh-TW'],
default_lang: 'en-US',
translation_directory: 'static/i18n'
}));
我们将在本 L10n 系列的第三部分详细了解配置值。
i18n abide
中间件设置请求处理并注入各种函数,我们将使用这些函数进行翻译。下面,我们将看到这些函数在请求对象和模板化上下文中可用。
好的,下一步是浏览所有包含用户可见文本的代码。
这是一个模板文件示例
<%= gettext('Mozilla Persona') %>
abide 做的最重要的事情是将对 gettext
函数的引用注入到 Node 和 express 框架中。
Abide 还提供其他变量和函数,例如 lang
、lang_dir
。
lang
是根据用户的浏览器和首选语言设置的语言代码。lang_dir
用于 双向文本 支持。
它将是ltr
或rtl
。英语从左到右渲染为ltr
。gettext
是一个 JS 函数,它将接收一个英文字符串并返回一个本地化字符串,同样也是根据用户的首选地区和语言。
在进行本地化时,我们指的是 字符串 或 Gettext 字符串:这些是文本片段、标签、按钮等。任何对最终用户可见的文本都是字符串。
从技术上讲,我们不指 JavaScript 字符串,因为您的程序中可能包含一些字符串,但从未向用户显示过。字符串的含义扩展到必须翻译的任何内容。
这是一个 JavaScript 文件示例
app.get('/', function(req, res) {
res.render('homepage.ejs', {
title: req.gettext('Hello, World!')
});
});
我们可以看到这些变量和函数(如 gettext
)被放置在 req
对象中。
因此,要设置网站以进行本地化,我们必须检查所有代码和模板,并将 字符串 包含在对 gettext
的调用中。
语言检测
我们如何知道用户的首选语言是什么?
在运行时,中间件将检测用户的首选语言。
i18n-abide 模块查看 Accept-Language
HTTP 标头。这由浏览器发送,其中包含用户的首选语言以及优先级顺序。
i18n-abide 处理此值,并将其与您的应用程序的 supported_languages
配置进行比较。它将尽可能地匹配,并提供该语言。
如果找不到匹配项,它将使用您已放入代码和模板中的字符串,这些字符串通常是英文字符串。
总结
在下一篇文章中,我们将了解如何提取、翻译和准备使用诸如“Hello, World!”之类的字符串。
在第三篇文章中,我们将深入了解中间件和配置选项。我们还将测试我们的本地化工作。
系列中的先前文章
这是 关于 Node.js 的 12 篇文章系列 中的第 9 篇。之前的文章是
- 跟踪 Node.js 中的内存泄漏
- 完全加载的 Node
- 使用安全的客户端会话构建简单且可扩展的 Node.JS 应用程序
- 出色的前端性能第 1 部分 - 连接、压缩和缓存
- 构建不会熔化的 Node.JS 服务器
- 出色的前端性能,第 2 部分:使用 etagify 缓存动态内容
- 使用 node-convict 驯服配置
- 出色的前端性能,第 3 部分 - 通过优化字体获得重大性能提升
关于 Austin King
西雅图的非教条艺术家/程序员类型人。应用程序工程团队的非主流 Web 开发人员。拼写检查留给下周吧。
关于 Robert Nyman [编辑名誉退休]
Mozilla Hacks 的技术布道者和编辑。发表演讲并撰写关于 HTML5、JavaScript 和开放 Web 的博客文章。Robert 是 HTML5 和开放 Web 的坚定支持者,自 1999 年以来一直在瑞典和纽约市从事 Web 前端开发工作。他还经常在 http://robertnyman.com 上写博客,喜欢旅行和结识新朋友。
2 条评论