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国际化不仅能提升应用的全球用户体验,也是现代企业级应用的必备能力。立即开始实践,让你的应用走向世界!
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0154- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112
