本地化你的 Node.js 服务,3 部分中的第 1 部分 - Node.js 节日季,第 9 部分

这是 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 是您用于将翻译集成到您自己的服务中的主要模块。让我们一起了解如何添加它。

在这些示例中,我们将假设您的代码使用 ExpressEJS 模板

安装

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 还提供其他变量和函数,例如 langlang_dir

  • lang 是根据用户的浏览器和首选语言设置的语言代码。
  • lang_dir 用于 双向文本 支持。
    它将是 ltrrtl。英语从左到右渲染为 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 篇。之前的文章是

关于 Austin King

西雅图的非教条艺术家/程序员类型人。应用程序工程团队的非主流 Web 开发人员。拼写检查留给下周吧。

更多 Austin King 的文章...

关于 Robert Nyman [编辑名誉退休]

Mozilla Hacks 的技术布道者和编辑。发表演讲并撰写关于 HTML5、JavaScript 和开放 Web 的博客文章。Robert 是 HTML5 和开放 Web 的坚定支持者,自 1999 年以来一直在瑞典和纽约市从事 Web 前端开发工作。他还经常在 http://robertnyman.com 上写博客,喜欢旅行和结识新朋友。

更多 Robert Nyman [编辑名誉退休] 的文章...


2 条评论

  1. Manuel Strehl

    非常有趣的帖子,尤其是因为我正在使用 Esprima 作为解析器编写自己的 jsxgettext。又少做了一项工作...

    L20n 的现状如何?您是否考虑过使用它来本地化 Persona?如果是,为什么最终没有决定使用它?

    干杯!

    2013 年 4 月 2 日 下午 10:22

  2. Austin King

    Manuel,我很高兴你能重复使用 jsxgettext 解析器!请参与该项目 (https://github.com/zaach/jsxgettext)。

    是的,此代码用于运行 Persona。这是一个使用它的例子 https://github.com/mozilla/browserid/blob/dev/bin/browserid#L18

    在 Persona 代码在生产环境中运行良好后,我们将其提取到了 i18n-abide 模块中。

    我对 L20n 并不了解。我的印象是它早期的目标是针对客户端代码(如 Firefox),并且我们没有在任何 Web 属性上使用它。我对此可能错了。

    2013 年 4 月 4 日 上午 00:53

本文的评论已关闭。