Egg.js国际化完全指南:5个实用技巧打造多语言应用
Egg.js作为基于Node.js和Koa的企业级框架,提供了完善的国际化解决方案,帮助开发者构建支持多语言的全球化应用。本文将系统介绍Egg.js国际化的核心概念、环境配置、实战应用及进阶技巧,通过5个实用技巧帮助你快速掌握企业级应用的国际化实践。
一、国际化概念解析:Egg.js多语言架构
什么是国际化
国际化(i18n)是指设计和开发应用时,使其能够轻松适应不同语言和地区的需求。在Egg.js中,这一功能主要通过官方提供的i18n插件实现,该插件位于项目的plugins/i18n/目录下。
Egg.js国际化核心机制
Egg.js i18n插件通过以下机制实现多语言支持:
- 语言检测:自动从URL参数、Cookie、请求头检测用户语言偏好
- 资源管理:加载并解析不同格式的语言资源文件
- 文本转换:提供模板函数实现动态文本翻译
- 持久化:通过Cookie存储用户语言偏好设置
图:Egg.js请求处理流程展示了国际化中间件在请求生命周期中的作用
二、环境搭建:从零开始配置国际化
1. 准备项目环境
操作目标:创建并初始化Egg.js项目
实现方法:
git clone https://gitcode.com/gh_mirrors/eg/egg
cd egg/examples/helloworld-typescript
npm install
预期效果:获取基础项目结构并安装依赖,为后续国际化配置做好准备。
2. 安装i18n插件
操作目标:添加i18n插件到项目依赖
实现方法:在项目package.json中添加依赖:
{
"dependencies": {
"egg-i18n": "^2.1.0"
}
}
然后执行npm install安装插件。
预期效果:i18n插件被添加到项目依赖中,可在代码中引用相关功能。
3. 启用i18n插件
操作目标:在Egg.js中启用i18n插件
实现方法:在config/plugin.ts中添加配置:
// config/plugin.ts
export default {
// 其他插件配置...
i18n: {
enable: true,
package: 'egg-i18n',
},
};
预期效果:Egg.js应用启动时会加载并初始化i18n插件。
三、核心功能:Egg.js国际化配置详解
基础配置策略
Egg.js i18n插件的核心配置文件位于plugins/i18n/src/config/config.default.ts,主要配置项包括:
// config/config.default.ts
export default {
i18n: {
defaultLocale: 'en_US', // 默认语言,当未检测到语言时使用
dirs: [ 'app/locales' ], // 语言资源文件存放目录
queryField: 'locale', // URL参数名,用于通过URL切换语言
cookieField: 'locale', // Cookie键名,用于存储用户语言偏好
cookieMaxAge: '1y', // Cookie有效期,设置为1年
localeAlias: { // 语言别名映射,简化语言切换
'zh': 'zh_CN',
'en': 'en_US'
}
}
};
语言资源文件组织
操作目标:创建结构化的语言资源文件
实现方法:在项目中创建以下目录结构:
app/
└── locales/
├── en_US.json // 英文语言包
├── zh_CN.json // 中文语言包
└── fr_FR.json // 法语语言包
JSON格式示例(en_US.json):
{
"greeting": "Hello",
"welcome": "Welcome to {name} application",
"menu": {
"home": "Home",
"about": "About Us",
"contact": "Contact"
}
}
预期效果:建立清晰的语言资源文件结构,便于维护和扩展多语言支持。
四、实战应用:在项目中使用国际化功能
在控制器中使用
操作目标:在控制器中获取国际化文本
实现方法:使用ctx.__()方法:
// app/controller/home.ts
import { Controller } from 'egg';
export default class HomeController extends Controller {
async index() {
const { ctx } = this;
// 获取带参数的国际化文本
const welcomeMessage = ctx.__('welcome', { name: 'Egg.js' });
ctx.body = {
message: welcomeMessage,
currentLocale: ctx.locale // 当前语言
};
}
}
预期效果:根据用户语言偏好,返回对应语言的欢迎消息。
在模板中使用
操作目标:在视图模板中展示国际化文本
实现方法:直接在模板中使用__()函数:
<!-- app/view/index.nj -->
<!DOCTYPE html>
<html>
<head>
<title>{{ __('page.title') }}</title>
</head>
<body>
<h1>{{ __('welcome', { name: 'Egg.js' }) }}</h1>
<nav>
<ul>
<li><a href="/">{{ __('menu.home') }}</a></li>
<li><a href="/about">{{ __('menu.about') }}</a></li>
<li><a href="/contact">{{ __('menu.contact') }}</a></li>
</ul>
</nav>
</body>
</html>
预期效果:模板根据当前语言环境自动渲染对应语言的文本内容。
语言切换实现
操作目标:允许用户手动切换语言
实现方法:创建语言切换控制器:
// app/controller/locale.ts
import { Controller } from 'egg';
export default class LocaleController extends Controller {
async switch() {
const { ctx } = this;
const { lang } = ctx.query;
// 验证语言参数是否有效
const validLocales = ['zh_CN', 'en_US', 'fr_FR'];
if (validLocales.includes(lang)) {
// 设置语言并持久化到Cookie
ctx.i18n.setLocale(lang);
ctx.body = {
success: true,
message: ctx.__('language.changed'),
currentLocale: lang
};
} else {
ctx.body = {
success: false,
message: ctx.__('language.invalid')
};
}
}
}
在路由中添加:
// app/router.ts
router.get('/switch-language', controller.locale.switch);
预期效果:用户访问/switch-language?lang=zh_CN即可切换到中文语言,并通过Cookie记住偏好。
五、进阶技巧:优化国际化体验
1. 语言自动检测优化
操作目标:提高语言检测准确性
实现方法:扩展语言检测逻辑,优先使用用户显式选择的语言,其次使用Cookie,最后使用浏览器默认语言:
// app/middleware/locale.ts
export default () => {
return async (ctx, next) => {
// 先检查URL参数
const queryLocale = ctx.query.locale;
// 再检查Cookie
const cookieLocale = ctx.cookies.get('locale');
// 最后使用浏览器语言
const headerLocale = ctx.get('Accept-Language')?.split(',')[0];
// 设置检测到的语言
if (queryLocale) {
ctx.i18n.setLocale(queryLocale);
// 更新Cookie
ctx.cookies.set('locale', queryLocale, { maxAge: 365 * 24 * 3600 * 1000 });
} else if (cookieLocale) {
ctx.i18n.setLocale(cookieLocale);
} else if (headerLocale) {
ctx.i18n.setLocale(headerLocale);
}
await next();
};
};
预期效果:提供更智能的语言检测体验,优先尊重用户显式选择。
2. 大型项目的语言资源管理
操作目标:优化大型项目的语言资源组织
实现方法:按模块拆分语言文件,实现按需加载:
app/
└── locales/
├── common/
│ ├── en_US.json
│ └── zh_CN.json
├── user/
│ ├── en_US.json
│ └── zh_CN.json
└── order/
├── en_US.json
└── zh_CN.json
在代码中指定模块加载:
// 加载user模块的语言资源
const userName = ctx.__('user.name', null, { module: 'user' });
预期效果:提高大型项目的语言资源管理效率,减少不必要的资源加载。
3. 性能优化策略
操作目标:提升国际化功能的性能
实现方法:
- 使用
tegg/core/metadata/实现语言资源缓存 - 生产环境预编译语言文件
- 对高频访问的多语言内容进行内存缓存
// app/service/i18n.ts
import { Service } from 'egg';
export default class I18nService extends Service {
private cache = new Map();
async getMessage(key: string, locale: string = this.ctx.locale) {
const cacheKey = `${locale}:${key}`;
// 检查缓存
if (this.cache.has(cacheKey)) {
return this.cache.get(cacheKey);
}
// 从文件加载
const message = this.ctx.__({ key, locale });
// 缓存结果,设置10分钟过期
this.cache.set(cacheKey, message);
setTimeout(() => this.cache.delete(cacheKey), 10 * 60 * 1000);
return message;
}
}
预期效果:减少语言资源文件的读取次数,提高应用响应速度。
总结
Egg.js国际化方案通过插件化设计,为企业级应用提供了全面的多语言支持。从基础的文本翻译到复杂的动态语言切换,从Cookie持久化到性能优化,开发者可以根据项目需求灵活选择实现方式。通过本文介绍的5个实用技巧,你已经掌握了构建多语言企业应用的核心技能。
进一步学习建议:
- 查阅官方文档:
plugins/i18n/README.md - 研究高级应用示例:
examples/helloworld-tegg/ - 探索数据库存储多语言内容的实现方式
掌握Egg.js国际化不仅能提升应用的全球用户体验,也是现代企业级应用的必备能力。立即开始实践,让你的应用走向世界!
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
LongCat-AudioDiT-1BLongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前该领域的最高水平(SOTA),它直接在波形潜空间中进行操作。00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
HY-Embodied-0.5这是一套专为现实世界具身智能打造的基础模型。该系列模型采用创新的混合Transformer(Mixture-of-Transformers, MoT) 架构,通过潜在令牌实现模态特异性计算,显著提升了细粒度感知能力。Jinja00
FreeSql功能强大的对象关系映射(O/RM)组件,支持 .NET Core 2.1+、.NET Framework 4.0+、Xamarin 以及 AOT。C#00
