国际化开发及配置
平台支持国际化(多语言),对于平台提供的应用,分别提供了中文简体、中文繁体和英文等三种语言。
中文简体界面
中文繁体界面
英文界面
1 开发多语言应用
开发多语言应用的步骤如下
- 正常开发应用
- 修改js文件,将中文替换为多语言函数
- 使用系统工具
- 检测并替换多语言表达式
- 扫描生成资源文件
- 填入语言资源
- 开启多语言
1.1 开启多语言
开启多语言,参考《2.1 开启多语言、设置当前语言》一节。开启多语言后,门户右上角会显示语言切换图标,系统默认显示三种语言,如需添加其它语言,在开启多语言配置中添加。用户登录后默认使用设置的语言,也可以通过门户右上角的语言切换图标切换语言。
一些常用内容,系统已经翻译,在语言资源文件中无需再翻译
1.2 在js文件中使用多语言函数
js文件中使用的多语言函数是:this.i18n("中文内容",import.meta.url),替换的作用有两个
- 系统扫描js文件时,会将多语言函数中的中文内容生成到资源文件中
- 运行时,将中文内容替换为资源文件中的语言内容
例如将“提示”替换为多语言函数,代码如下
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()即可看到
- 数据集(data.m)的资源会生成到服务名下
- 多语言函数i18n的查找顺序是,先通过精确路径查找,如果没找到,再找服务名下的资源,如果还没找到,直接找根下的资源
- 数据集(data.m)的资源建议定义在后端资源文件中,在所有使用到该数据集的w文件中都不用再定义
- 运行时,会将“键”里面的内容替换为“值”里面的内容进行显示。当“值”为空时,会显示“键”里面的内容
- 数据集的必填提示和约束提示,需要手工添加相应的语言资源
资源内容中不是静态的,需要显示上下文中的变量,做法如下
在资源内容中使用{}表示参数,例如下面的代码中使用了两个参数:{begin}和{end}
"确认将{begin}至{end} 期间已结束的任务归档?": "Confirm to archive the completed tasks from {begin} to {end}?",
在js文件中,先进行资源替换,再给参数赋值,代码如下
tipsTxt = this.i18n("确认将{begin}至{end}期间已结束的任务归档?",import.meta.url); tipsTxt = wx.String.stringFormatByKey(tipsTxt, {"begin":begin,"end":end});
当资源内容中包括>和:等特殊字符,系统不能找到对应的语言资源时,需要对语言内容执行md5(32位 小写),作为键的值。例如中文内容为:以fn:开头定义js,语言资源应写成
"718e5376e126f3ebece6a3c083490da8": "Define JavaScript starting with fn:",
其中718e5376e126f3ebece6a3c083490da8为“以fn:开头定义js”md5后的值
数据集组件提供了加载数据前事件,事件参数event.data是要加载的数据,此时可修改event.data,最终数据集会将event.data加载到数据集中。可以使用此特性对一些需要翻译的数据进行翻译。步骤如下:
静态数据集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>
在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);
}
如果页面上有多个数据集需要翻译,可以将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"
}
}
}
}
}
}
}
运行效果