Node.js 国际化 (i18n):i18next 和 polyglot

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 的一个轻量级且简单的替代方案。它非常适合小型项目,或者当不需要

推荐