JianghuJS-国际化i18n

12002

1、概念

  • 国际化是什么

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

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

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

2、在项目中使用国际化

  • jianghujs中的配置步骤

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

  1. config/config.default.js:增加language属性en/zh/…
  1. // appId: '...',
  2. language: 'zh', // en | zh | ...
  1. _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;
  1. 数据获取: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. }
  1. 页面渲染:页面里根据变量取出相应的值
  1. <!-- seo -->
  2. <div class="text-center p-4 jianghu-footer-copyright">
  3. <$ constantUiMap.footer.copyright $>
  4. </div>