国际化开发及配置

平台支持国际化(多语言),对于平台提供的应用,分别提供了中文简体、中文繁体和英文等三种语言。

中文简体界面

中文繁体界面

英文界面

1 开发多语言应用

开发多语言应用的步骤如下

  1. 正常开发应用
  2. 修改js文件,将中文替换为多语言函数
  3. 使用系统工具
    1. 检测并替换多语言表达式
    2. 扫描生成资源文件
    3. 填入语言资源
    4. 开启多语言

1.1 开启多语言

开启多语言,参考《2.1 开启多语言、设置当前语言》一节。开启多语言后,门户右上角会显示语言切换图标,系统默认显示三种语言,如需添加其它语言,在开启多语言配置中添加。用户登录后默认使用设置的语言,也可以通过门户右上角的语言切换图标切换语言。

一些常用内容,系统已经翻译,在语言资源文件中无需再翻译

1.2 在js文件中使用多语言函数

js文件中使用的多语言函数是:this.i18n("中文内容",import.meta.url),替换的作用有两个

  1. 系统扫描js文件时,会将多语言函数中的中文内容生成到资源文件中
  2. 运行时,将中文内容替换为资源文件中的语言内容

例如将“提示”替换为多语言函数,代码如下

title: '提示'
改为
title: this.i18n('提示',import.meta.url)

1.3 模型的多语言配置

在ide中,点击右上角的齿轮图标,弹出下拉菜单。点击多语言配置菜单,打开多语言配置对话框。

系统默认三种语言,点击语言选项按钮,修改语言选项。

1.3.1 前端多语言配置

选择桌面端,依次点击检测并替换多语言表达式、扫描生成资源文件、开启多语言等三个按钮。系统自动扫描桌面端(UI2/pcx目录)下的w和js文件,将其中的中文内容生成到资源文件中。

  • 系统检查w文件时,对其中可作为语言资源的内容,增加多语言函数,例如text="操作"被替换为text="{$page.i18n('操作')}"
  • 系统扫描w和js文件时,将其中多语言函数的第一个参数生成到语言资源文件中

生成后,展开左侧的资源树,可以看到系统扫描出的w和js文件,点击某个文件,切换语言,右侧表格中显示出该语言的语言资源。在“值”列中输入该语言资源,

可以通过点击新建键值按钮,添加新的键值。例如数据集的必填提示和约束提示,就需要手工添加相应的语言资源。

每个端每种语言对应一个资源文件,桌面端生成的语言资源文件为UI2/pcx/i18n/语言/resource.json

1.3.2 后端多语言配置

选择后端,点击扫描生成资源文件按钮。系统自动扫描后端(service/main目录)下的data.m文件,将其中的中文内容生成到资源文件中。

生成后,展开左侧的资源树,可以看到系统扫描出的数据集,点击某个数据集,切换语言,右侧表格中显示出该语言的语言资源。在“值”列中输入该语言资源,

每个端每种语言对应一个资源文件,后端生成的语言资源文件为service/service-meta-info/src/main/resources/i18n/语言/resource.json

1.3.3 系统翻译规则

运行时语言资源经过一些处理,会合并为一个JSON对象,在浏览器的控制台中,输入getCurrentReactPage().getCurrentLanguage()即可看到

  1. 数据集(data.m)的资源会生成到服务名下
  2. 多语言函数i18n的查找顺序是,先通过精确路径查找,如果没找到,再找服务名下的资源,如果还没找到,直接找根下的资源
  3. 数据集(data.m)的资源建议定义在后端资源文件中,在所有使用到该数据集的w文件中都不用再定义
  4. 运行时,会将“键”里面的内容替换为“值”里面的内容进行显示。当“值”为空时,会显示“键”里面的内容
  5. 数据集的必填提示和约束提示,需要手工添加相应的语言资源
  6. 资源内容中不是静态的,需要显示上下文中的变量,做法如下

    1. 在资源内容中使用{}表示参数,例如下面的代码中使用了两个参数:{begin}和{end}

        "确认将{begin}至{end} 期间已结束的任务归档?": "Confirm to archive the completed tasks from {begin} to {end}?",
      
      1. 在js文件中,先进行资源替换,再给参数赋值,代码如下

        tipsTxt = this.i18n("确认将{begin}至{end}期间已结束的任务归档?",import.meta.url); tipsTxt = wx.String.stringFormatByKey(tipsTxt, {"begin":begin,"end":end});

  7. 当资源内容中包括>和:等特殊字符,系统不能找到对应的语言资源时,需要对语言内容执行md5(32位 小写),作为键的值。例如中文内容为:以fn:开头定义js,语言资源应写成

     "718e5376e126f3ebece6a3c083490da8": "Define JavaScript starting with fn:",
    

    其中718e5376e126f3ebece6a3c083490da8为“以fn:开头定义js”md5后的值

  8. 数据集组件提供了加载数据前事件,事件参数event.data是要加载的数据,此时可修改event.data,最终数据集会将event.data加载到数据集中。可以使用此特性对一些需要翻译的数据进行翻译。步骤如下:

    1. 静态数据集channelData中name列里面的中文需要翻译

        <wx:tableData id="channelData" idColumn="id" type="custom" >
            <column id="default66" label="id" name="id" type="String"/>
            <column id="default67" label="name" name="name" type="String"/>
            <data id="default68" ><![CDATA[[{"id":"portal","name":"门户"},{"id":"email","name":"邮件"},{"id":"dingtalk","name":"钉钉"},{"id":"wx","name":"企业微信"},{"id":"sms","name":"短信"}]]]></data>
        </wx:tableData>
      
      1. 在channelData的加载数据前事件中,调用jsonI18n方法翻译要加载的数据。注意为了使用当前js的语言资源,i18n方法必须使用当前js里面的。js代码如下

        onChannelDataBeforeLoad = (event) => {

           this.i18nFn = (key) => {
               return this.i18n(key, import.meta.url);
           }
           wx.String.jsonI18n(event.data, ["name"], this.i18nFn);
        

        }

      2. 如果页面上有多个数据集需要翻译,可以将this.i18nFn定义到constructor方法中,代码如下

        constructor(props, context) {

           super(props, context);
           this.i18nFn = (key) => {
               return this.i18n(key, import.meta.url);
           }
        

        }

1.4 服务的多语言配置

系统提供对服务返回结果和报错信息的翻译能力,例如门户功能树就是对服务返回结果的翻译。

1.4.1 翻译服务返回结果

  • 定义一个服务,GET请求,在服务中返回JSON字符串数据

      public String returnInfo() throws Exception {
          JSONObject ret = new JSONObject();
          ret.put("message", "这是服务返回信息");
          return ret.toJSONString();
      }
    
  • 在js中调用这个服务,获取服务返回的JSON数据

      try{
          let ret = await this.request({
              url:"$serviceName/main/fuwu/returninfo"
          })    
          message.info(ret.data.message);        
      }catch(e){
          message.error(e.data.message);
      }
    
  • 在后端的语言资源文件中添加服务返回结果的语言资源

      {
          "$service": {
              "/main": {
                  "/fuwu": {
                      "/returninfo:GET":{
                          "message":{
                              "这是服务返回信息": "This is service return info"
                          }
                      }
                  }
              }
          }
      }
    
  • 运行效果

1.4.2 翻译服务报错信息

  • 定义一个服务,在服务中返回404

      public String returnError() throws Exception {
          throw new BaseRuntimeException(HttpStatus.NOT_FOUND.value(),"这是服务报错信息");    
      }
    
  • 在js中调用这个服务,获取异常信息

      try{
          let ret = await this.request({
              url:"$serviceName/main/fuwu/returnerror"
          })    
          message.info(ret.data.message);        
      }catch(e){
          message.error(e.data.message);
      }    
    
  • 在后端的语言资源文件中添加服务报错信息的语言资源

      {
          "$service": {
              "@error": {
                  "message": {
                      "这是服务报错信息": "This is service error info"
                  }
              }
          }
      }
    
  • 运行效果

1.5 功能树的多语言配置

上面配置的内容都是页面内的语言资源,对于显示到门户功能树上的菜单的语言资源,需要在统一通用配置中的多语言配置中配置,如下图所示。

其中/entry/manager/authorized/menus:GET是获取菜单的请求

{
    "/entry": {
        "/service": {
            "/manager": {
                "/authorized": {
                    "/menus:GET": {
                        "title": {
                            "订单(多语言)": "Order(International)"
                        }
                    }
                }
            }
        }
    }
}

运行效果

2 开启多语言配置

系统默认不开启多语言,在企业门户中开启多语言。访问企业门户,打开统一通用配置,有三个多语言相关配置,分别是:开启多语言、当前语言、多语言配置。

2.1 开启多语言、设置当前语言

  • 开启多语言:在这里开启多语言和设置系统支持的语言

  • 当前语言:打开统一按组织配置,可以按组织设置当前语言

2.2 系统标题的多语言配置

打开统一通用配置,先设置系统名称和登录页标题,再设置语言资源。

  • 在门户配置中设置系统名称

  • 在登录配置中设置登录页标题

  • 在移动端登录配置中设置登录页标题

  • 在多语言配置中,配置某种语言的语言资源,一种语言对应一个配置项

其中/entry/config/config/getconfig:GET是获取统一通用配置的请求

{
    "/entry": {
        "/service": {
            "/config": {
                "/config": {
                    "/getconfig:GET":{
                        "loginTitle":{
                            "登录": "Login",
                            "欢迎": "Welcome"
                        },
                        "sysName":{
                            "系统": "System"
                        }
                    }
                }
            }
        }
    }
}

运行效果

results matching ""

    No results matching ""

    results matching ""

      No results matching ""