在国际化(i18n)项目中,字段命名需要遵循一致性可维护性原则,同时避免硬编码语言相关的值(如直接存储 'Xiaoming')。以下是针对我的需求的解决方案:

1. 字段命名规范

推荐方案
  • 使用通用字段名(不包含语言后缀):
    直接存储原始数据(如 name: '小明'),不在数据结构中硬编码翻译后的值(如 nameEn)。翻译应在渲染时通过国际化工具(如 vue-i18n)动态处理。

  • // 错误示范(硬编码翻译)

  • { "name": "小明", "nameEn": "Xiaoming" // ❌ 避免这种设计 }

  • // 正确示范(原始数据 + 国际化key)

  • { "name": "小明", "i18nKey": "user.name" // 可选:用于映射到翻译文件 }

如果必须存储多语言值(如后端返回多语言数据):
使用统一的后缀规则,例如:

{

        "name": "小明",

         "name_i18n": {

                "en": "Xiaoming",

                "zh": "小明",

                "ja": "シャオミン"

        }

}

或按语言代码作为键:

{ "name": { "zh": "小明", "en": "Xiaoming" } }

2. 国际化实现方案

方案 1:前端动态翻译(推荐)
  1. 数据结构(仅存储原始数据):
    1. { "name": "小明" }
  2. 在翻译文件中定义映射(如 zh.json 和 en.json):

                // zh.json { "user.name": "小明" } // en.json { "user.name": "Xiaoming" }

     3.在 Vue 组件中使用 vue-i18n

`        <template> <p>{{ $t('user.name') }}</p> <!-- 根据当前语言自动切换 --> </template>

方案 2:后端返回多语言数据

如果后端支持多语言,可以设计 API 返回结构化的多语言字段:

        { "data": { "name": { "zh": "小明", "en": "Xiaoming" } } }

前端通过当前语言选择显示的值:

        const currentLang = 'en'; // 从 i18n 配置中获取 const displayName = userData.name[currentLang] || userData.name.zh;

3. 为什么避免 nameEn 这样的命名?

  1. 维护困难:新增语言需修改数据结构(如 nameFrnameJa)。
  2. 冗余存储:同一数据在多语言环境下重复存储。
  3. 违反 DRY 原则:翻译应与数据解耦,由专门的国际化层处理。
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐