国际化i18n

国际化是什么

国际化(Internationalization,缩写为i18n)指的是在设计和开发网页时,考虑到不同的语言、文化和地区,使得网页可以适应不同的语言和地区的用户,以便于在全球范围内使用。

国际化的主要目标是使得网页可以适应多语言环境,包括字符集、日期和时间格式、货币单位、数字格式、文本方向等等。通过使用国际化技术,可以使得网页能够在不同的语言环境下自动切换,使得用户可以更加方便地使用网页。

在网页开发中,通常会使用特定的国际化工具或框架来实现国际化功能,比如通过提供多语言资源文件、使用国际化标识符等方式来实现。同时,在设计和开发网页时,还需要注意一些特定的国际化规范和标准,比如Unicode字符编码、HTML语言标准等等。

在项目中使用国际化

在 jianghujs project 项目中,网页国际化的使用通常需要配置如下步骤:

  1. config/config.default.js:增加language属性en/zh/…
    1. // appId: '...',
    2. language: 'zh', // en | zh | ...
  2. _constant_ui数据表:增加对应pageId的常量,和对应语言列
    1. CREATE TABLE `_constant_ui` (
    2. `id` int(11) NOT NULL AUTO_INCREMENT,
    3. `constantKey` varchar(255) DEFAULT NULL,
    4. `constantType` varchar(255) DEFAULT NULL COMMENT '常量类型; object, array',
    5. `pageId` varchar(255) DEFAULT 'all' COMMENT '页面id',
    6. `desc` varchar(255) DEFAULT NULL COMMENT '描述',
    7. `en` text COMMENT '常量内容; object, array',
    8. `zh` text COMMENT '常量内容; object, array',
    9. `operation` varchar(255) DEFAULT 'insert' COMMENT '操作; insert, update, jhInsert, jhUpdate, jhDelete jhRestore',
    10. `operationByUserId` varchar(255) DEFAULT NULL COMMENT '操作者userId',
    11. `operationByUser` varchar(255) DEFAULT NULL COMMENT '操作者用户名',
    12. `operationAt` varchar(255) DEFAULT NULL COMMENT '操作时间; E.g: 2021-05-28T10:24:54+08:00 ',
    13. PRIMARY KEY (`id`) USING BTREE,
    14. UNIQUE KEY `pageId_constantKey_unique` (`constantKey`,`pageId`) USING BTREE
    15. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
  3. 数据获取:page table 相应页面增加pageHook通过service方法assign到页面变量里
    1. // pageHook
    2. {
    3. "beforeHook":[
    4. {"field": "constantUiMap", "service": "constantUi", "serviceFunc": "getConstantUiMap"},
    5. ]
    6. }
    1. // app/service/constantUi.js
    2. async getConstantUiMap() {
    3. const { jianghuKnex } = this.app;
    4. const { pageId } = this.ctx.packagePage;
    5. const { language } = this.app.config;
    6. const constantUiList = await jianghuKnex(tableEnum._constant_ui).whereIn('pageId', ['all', pageId]).select();
    7. const constantUiMap = Object.fromEntries(
    8. constantUiList.map(obj => [obj.constantKey, JSON.parse(obj[language] || '{}')])
    9. );
    10. return constantUiMap;
    11. }
  4. 页面渲染:页面里根据变量取出相应的值
    1. <!-- seo -->
    2. <div class="text-center p-4 jianghu-footer-copyright">
    3. <$ constantUiMap.footer.copyright $>
    4. </div>