JavaScript (Node.js) 中的国际化 (i18n)
国际化(缩写为 i18n——源自英文“internationalization”,其中 18 表示首字母“i”和尾字母“n”之间的字母数量)是指设计和开发软件的过程,使其能够轻松适应不同的语言和地区,而无需修改代码。在 Node.js 生态系统中,有几个强大的库可以大大简化此任务。在本文中,我们将介绍两个最流行的库:i18next 和 node-polyglot。
为什么需要国际化?
现代 Web 应用程序和后端服务通常需要服务来自不同国家的用户。支持多种语言可以提高用户体验 (UX) 并扩大受众范围。如果没有 i18n,开发人员将不得不将字符串硬编码为一种语言,这使得多语言支持的维护变得极其繁琐且容易出错。
Node.js 中 i18n 库解决的主要问题:
- 支持翻译文件(通常是 JSON 或 YAML 格式)。
- 复数形式(根据数字正确变格单词:“1 杯咖啡”、“2 杯咖啡”、“5 杯咖啡”)。
- 字符串中的变量插值(例如,“你好,{{name}}!”)。
- 支持嵌套键以组织翻译结构。
- 自动检测用户语言(通过 HTTP 头、cookie、子域名)。
i18next 库
i18next 可以说是 JavaScript 世界中最流行、功能最全面的国际化库。它既可以在浏览器中运行,也可以在 Node.js 服务器上运行。i18next 提供了丰富的插件生态系统,包括与 React、Vue、Express 和其他框架的集成。
安装和基本配置
// 通过 npm 安装npm install i18next创建翻译文件。通常将它们存储在 locales 文件夹中:
locales/ru/translation.json
{ "greeting": "你好,{{name}}!", "coffee": "你喝了 {{count}} 杯咖啡", "coffee_plural": "你喝了 {{count}} 杯咖啡", "menu": { "home": "首页", "about": "关于我们" }}locales/en/translation.json
{ "greeting": "Hello, {{name}}!", "coffee": "You drank {{count}} cup of coffee", "coffee_plural": "You drank {{count}} cups of coffee", "menu": { "home": "Home", "about": "About us" }}现在在应用程序中初始化 i18next:
const i18next = require('i18next');const fs = require('fs');const path = require('path');
// 从文件加载翻译function loadTranslation(lng) { const filePath = path.join(__dirname, 'locales', lng, 'translation.json'); return JSON.parse(fs.readFileSync(filePath, 'utf8'));}
i18next.init({ lng: 'ru', // 默认语言 fallbackLng: 'en', // 备用语言 resources: { ru: { translation: loadTranslation('ru') }, en: { translation: loadTranslation('en') } }, interpolation: { escapeValue: false // 对于 Node.js,无需转义 HTML }});
// 使用console.log(i18next.t('greeting', { name: '阿列克谢' }));// 输出:你好,阿列克谢!
console.log(i18next.t('coffee', { count: 1 }));// 输出:你喝了 1 杯咖啡
console.log(i18next.t('coffee', { count: 5 }));// 输出:你喝了 5 杯咖啡
console.log(i18next.t('menu.home'));// 输出:首页动态切换语言
i18next.changeLanguage('en');console.log(i18next.t('greeting', { name: 'Alex' }));// 输出:Hello, Alex!node-polyglot 库
node-polyglot 是 i18next 的一个轻量级且简单的替代方案。它非常适合小型项目,或者当不需要