闪仓国际化实战:中文、英文、俄文三语言支持的技术实现
闪仓WMS已实现中文、英文、俄文三语言支持,覆盖PC端、移动端和营销网站。本文详解vue-i18n与next-intl的实际集成方案、IP自动检测机制、俄语UI截断问题的处理策略,以及面向中亚贸易走廊用户的语言选择考量。
为什么仓库管理系统需要国际化
仓库管理软件的用户群体正在发生变化。随着跨境电商和"一带一路"贸易通道的发展,越来越多的中小企业需要与海外合作伙伴共享库存数据、协同管理仓库。一套只支持中文的WMS系统,在这些场景中会成为协作的障碍。
闪仓WMS目前已实现三种语言的完整支持:简体中文(zh-CN)、英文(en-US) 和 俄文(ru-RU)。这三种语言覆盖了PC管理端、移动端应用以及营销网站,涉及超过10个业务模块、数千条翻译文本。
技术架构:两套i18n方案并行
由于闪仓的前端由三个独立项目组成,我们采用了两套不同的国际化方案。
PC端与移动端:vue-i18n
PC管理端(Vue 3 + TDesign)和移动端(uni-app)均使用 vue-i18n 9.x,采用 Composition API 模式。翻译文件按业务模块拆分,每个语言目录下包含独立的模块文件:
flash_warehouse_pc/src/locales/
zh-CN/
common.js # 通用文案(按钮、状态、提示、单位)
login.js # 登录注册
home.js # 首页仪表盘
purchase.js # 采购模块
sales.js # 销售模块
warehouse.js # 仓库模块
staff.js # 员工管理
partner.js # 供应商/客户
settings.js # 系统设置
mcp.js # MCP集成
en-US/ # 同样结构
ru-RU/ # 同样结构
移动端的结构类似,但额外包含了 bill.js、cooperative.js、permission.js、profile.js 等移动端专有模块,总计16个模块文件。PC端每种语言约2400行翻译代码,移动端每种语言约1700行。
在模板中使用标准的 $t('common.button.add') 语法,vue-i18n 的 createI18n 配置了 legacy: false 以启用 Composition API,fallbackLocale 设为 zh-CN 确保任何缺失的翻译都有中文兜底。
营销网站:next-intl
营销网站基于 Next.js 15 部署在 Cloudflare Pages 上,使用 next-intl 作为国际化方案。目前支持中文(zh)和英文(en)两种语言,翻译文件为JSON格式:
flash_warehouse_website/messages/
zh.json # ~2800行
en.json # ~2700行
由于 Cloudflare Workers 的 Edge Runtime 限制,翻译文件采用静态导入而非动态 import()。路由配置使用 localePrefix: 'always' 策略,URL始终包含语言前缀(如 /zh/about、/en/about)。服务端组件通过 setRequestLocale(locale) 获取语言,客户端组件使用 useTranslations('Namespace') Hook。
IP自动检测:让用户无需手动选择
首次访问时手动选择语言是一种糟糕的用户体验。闪仓PC端实现了基于IP地理位置的语言自动检测机制,检测优先级如下:
- localStorage 中用户手动设置的语言(最高优先级)
- IP地理位置检测(通过 ip-api.com 服务)
- 浏览器语言偏好(navigator.language)
- 默认中文
IP检测的核心逻辑将国家代码映射到语言:
- 中文地区:CN、TW、HK、MO、SG
- 俄语地区:RU、BY、KZ、UA
- 其他地区:默认英文
检测结果会缓存到 localStorage 的 wms-language-ip-detected 标记中,避免重复请求。一旦用户手动切换语言,系统会清除IP检测标记,后续不再自动覆盖。
俄语UI的特殊挑战
在三种语言中,俄语对UI布局的影响最为显著。
文本长度膨胀
同一含义的文本,俄语通常比中文长3到5倍,比英文长1.5到2倍。例如:
| 中文 | 英文 | 俄文 |
|---|---|---|
| 删除 | Delete | Удалить |
| 进行列配置 | Column Config | Колонки |
| 已审批 | Approved | Одобрено |
| 数据请求失败 | Data Request Failed | Не удалось получить данные |
为了在有限的按钮和表格列空间中容纳俄文,我们对俄语翻译进行了系统性的缩写处理。在 common.js 的按钮文案中可以看到:
// 俄语按钮采用缩写形式
button: {
add: 'Добав.', // 而非完整的 Добавить
edit: 'Ред.', // 而非 Редактировать
delete: 'Удал.', // 而非 Удалить
save: 'Сохр.', // 而非 Сохранить
export: 'Эксп.', // 而非 Экспортировать
refresh: 'Обнов.', // 而非 Обновить
}
TDesign组件库的俄语适配
TDesign UI官方不提供俄语语言包。闪仓为此编写了完整的俄语组件翻译,覆盖了分页、级联选择、日历、日期选择器、上传、表单验证、表格等全部组件,总计超过260行自定义配置。这些翻译通过 t-config-provider 的 globalConfig 注入,随语言切换实时生效。
日期格式差异
俄语的日期格式为 DD.MM.YYYY(如 31.05.2026),与中文的"2026年5月31日"和英文的"May 31, 2026"完全不同。在日期选择器的配置中,需要为俄语单独设置 dayjsLocale: 'ru' 和对应的日期格式。
为什么选择俄语
闪仓选择俄语作为第三种支持语言,并非随意决定。中亚贸易走廊(哈萨克斯坦、乌兹别克斯坦、吉尔吉斯斯坦等国)是中国中小企业重要的出口市场。这些国家的商业往来中,俄语是通用的工作语言。
在IP检测的国家映射中,俄语覆盖了俄罗斯(RU)、白俄罗斯(BY)、哈萨克斯坦(KZ)和乌克兰(UA)四个国家代码。这些地区的仓库管理需求与中国内地存在差异,但闪仓的多租户架构(基于 binding_user_id 的数据隔离)天然支持跨地域部署。
翻译文件的维护策略
管理三种语言的翻译文件,最大的风险是翻译缺失和键名不一致。闪仓采用以下策略:
模块化拆分:每个业务模块一个翻译文件,而非将所有翻译集中到一个巨大的JSON中。PC端有10个模块文件,移动端有16个。这使得在新增功能时,只需修改对应模块的翻译文件。
中文作为基准:中文语言包(zh-CN)是所有翻译的基准。新增翻译键时,先在中文文件中添加,再同步到英文和俄文。vue-i18n 的 fallbackLocale: 'zh-CN' 配置确保即使英文或俄文遗漏了某个键,用户也不会看到空白。
一一对应结构:三种语言的聚合文件(index.js)导入完全相同的模块集合。中文有 common、login、home 等10个模块,英文和俄文也必须有完全相同的10个模块,结构保持一致。
总结
国际化不只是翻译文字。它涉及语言检测策略、UI布局适配、组件库本地化、日期格式处理等一系列工程决策。闪仓当前的三语言支持体系覆盖了PC管理端(10模块 x 3语言)、移动端(16模块 x 3语言)和营销网站(2语言),总计超过15,000行翻译代码。
对于同样需要实施多语言支持的WMS项目,建议在设计初期就确定国际化架构,避免后期大规模重构。尤其是俄语等字符宽度较大的语言,需要在UI设计阶段就预留足够的空间。