国际化规范
说明
国际化采用统一的命名规范,开发者在开发具体功能的时候要按照语言 code 定义描述,不能直接写死描述.
01. 引入多语言工具类
首先引入 intl 类
import intl from "utils/intl";
02. 调用多语言方法
<FormItem label={intl.get("hpfm.event.model.event.code").d("事件编码")}>
{getFieldDecorator("eventCode")(<Input style={{ width: "150px" }} />)}
</FormItem>
说明:
intl.get(code).d(defaultMessage)
code
: 多语言 codedefaultMessage
: 默认描述,当多语言找不到的情况下返回默认值
03. CODE 命名规范
CODE 分为两段
第一段:
[服务名].[功能名]
例如上述例子中: hfpm.event 其中 hpfm 是服务名, event 是功能名
第二段
第二段分为 2 种类型:
模型
model.[模型名].[字段名]
例如: model.event.code 是 event 模型的 code 字段
视图
view.[类型].[具体类型].[具体含义]
例如:
- 验证类型: view.validation.require
- 提示信息: view.message.success
- 操作类型: view.option.submitOrder
注意:统一按照 [具体类型].[具体含义] 的方式定义
例如:view.button.save, view.button.submit
注意:
内容中如果包含:
以及以{
开头,比如用引号包裹下
abc: "测试:冒号"
cde: "{name} 姓名"
如果内容中包含引号,需要转义
abc: '引"号'
04. 增加多语言注解
最后在需要用到多语言的类上增加注解
import formatterCollections from 'utils/intl/formatterCollections';
@formatterCollections({
code: ['hpfm.event'], // code 为 [服务].[功能]的字符串数组
})
其中 code 是对应到上面 服务
.功能
的字符串数组
05. 常用编码
平台通用的编码统一在 hzero.common
下,例如 新建,保存等按钮
可以在“平台多语言” 中按照模块 hzero.common
查询
- 必输字段的提示信息
rules: [{ required: true, message: intl.get('hzero.common.validation.notNull', {name: intl.get('hpfm.event.model.event.code').d('事件编码')}) }],
hzero.common.validation.notNull
多语言描述是{name} 不能为空
, intl.get() 函数第二个参数是变量的值
- 引用其他模块的多语言描述
有时候我们会遇到在模块 A 中需要模块 B 的某个多语言描述,这个时候只需要在模块 A 中定义一个多语言引用模块 B 对应的编码即可。
举例:
模块 B 中有一个多语言
hpfm.event.model.event.code = 事件编码
模块 A 中可以定义一个编码
hpfm.xxxA.model.event.code = ${hpfm.event@model.event.code}
hpfm.event
是模块代码,model.event.code
是具体的代码值
06. 通用多语言
通用多语言如下:
- 通用多语言分为两类,一类是普通的国际化,一类是默认值不固定的模板国际化。
// 普通国际化
intl.get('hzero.common.button.action').d('操作')
intl.get('hzero.common.button.viewMore').d('更多查询')
intl.get('hzero.common.button.collected').d('收起查询')
intl.get('hzero.common.button.reset').d('重置')
intl.get('hzero.common.button.search').d('查询')
intl.get('hzero.common.button.save').d('保存')
intl.get('hzero.common.button.cancel').d('取消')
intl.get('hzero.common.button.update').d('修改')
intl.get('hzero.common.button.add').d('新增')
intl.get('hzero.common.button.delete').d('删除')
intl.get('hzero.common.button.edit').d('编辑')
intl.get('hzero.common.button.create').d('新建')
intl.get('hzero.common.button.close').d('关闭')
intl.get('hzero.common.button.next').d('下一步')
intl.get('hzero.common.button.reload').d('刷新')
intl.get('hzero.common.button.expand').d('展开')
intl.get('hzero.common.button.up').d('收起')
intl.get('hzero.common.button.export').d('导出')
intl.get('hzero.common.button.clean').d('清除')
intl.get('hzero.common.button.copy').d('复制')
intl.get('hzero.common.button.ok').d('确定')
intl.get('hzero.common.button.pay').d('支付')
intl.get('hzero.common.button.disable').d('禁用')
intl.get('hzero.common.button.enable').d('启用')
intl.get('hzero.common.button.result').d('结果')
intl.get('hzero.common.button.refresh').d('刷新')
intl.get('hzero.common.button.download').d('下载')
intl.get('hzero.common.button.review').d('预览')
intl.get('hzero.common.button.sure').d('确定')
intl.get('hzero.common.button.import').d('导入')
intl.get('hzero.common.button.release').d('发布')
intl.get('hzero.common.button.preview').d('预览')
intl.get('hzero.common.button.remove').d('移除')
intl.get('hzero.common.button.view').d('查看')
intl.get('hzero.common.button.select').d('选择')
intl.get('hzero.common.button.trigger').d('执行')
intl.get('hzero.common.button.pause').d('暂停')
intl.get('hzero.common.button.resume').d('恢复')
intl.get('hzero.common.button.upload').d('上传')
intl.get('hzero.common.button.deploy').d('部署记录')
intl.get('hzero.common.button.back').d('返回')
intl.get('hzero.common.button.test').d('测试')
intl.get('hzero.common.button.setting').d('设置')
intl.get('hzero.common.button.detail').d('详情')
intl.get('hzero.common.button.refund').d('退款')
intl.get('hzero.common.button.refund').d('拒绝')
intl.get('hzero.common.button.submit').d('提交')
intl.get('hzero.common.button.collapseAll').d('全部收起')
intl.get('hzero.common.button.expandAll').d('全部展开')
intl.get('hzero.common.button.settingLayout').d('设置布局')
intl.get('hzero.common.button.updatePassword').d('更新密码')
intl.get('hzero.common.button.addServer').d('添加服务器')
intl.get('hzero.common.button.addChildren').d('新增下级')
intl.get('hzero.common.button.republish').d('重新发布')
intl.get('hzero.common.button.previous').d('上一步')
intl.get('hzero.common.button.refundReason').d('拒绝原因')
intl.get('hzero.common.basicLayout.userInfo').d('个人中心')
intl.get('hzero.common.basicLayout.emptyText').d('您已读完所有消息')
intl.get('hzero.common.basicLayout.gotoUserMessage').d('进入消息中心')
intl.get('hzero.common.basicLayout.greetMessage').d('尊敬的用户您好')
intl.get('hzero.common.basicLayout.accountNoBind').d('系统检测到您的账号尚未绑定')
intl.get('hzero.common.basicLayout.passwordReset').d('、系统密码为初始密码,')
intl.get('hzero.common.basicLayout.safeMessage1').d('为保证消息的正常接收及您的账户安全,请前往')
intl.get('hzero.common.basicLayout.safeMessage2').d('进行修改。')
intl.get('hzero.common.components.export').d('导出Excel')
intl.get('hzero.common.components.export.condition').d('设置导出条件')
intl.get('hzero.common.components.export.columns').d('选择要导出的列')
intl.get('hzero.common.custom').d('自定义')
intl.get('hzero.common.currency.ten.thousand').d('万元')
intl.get('hzero.common.cellphone').d('手机号')
intl.get('hzero.common.date.active.from').d('有效日期从')
intl.get('hzero.common.date.active.to').d('有效日期至')
intl.get('hzero.common.date.creation').d('创建时间')
intl.get('hzero.common.date.creation.from').d('创建日期从')
intl.get('hzero.common.date.creation.to').d('创建日期至')
intl.get('hzero.common.date.release.from').d('发布日期从')
intl.get('hzero.common.date.release.to').d('发布日期至')
intl.get('hzero.common.date.register.from').d('注册时间从')
intl.get('hzero.common.date.register.to').d('注册时间至')
intl.get('hzero.common.date.register').d('注册时间')
intl.get('hzero.common.date.releaseTime').d('发布时间')
intl.get('hzero.common.date.unit.day').d('天')
intl.get('hzero.common.date.unit.hours').d('小时')
intl.get('hzero.common.date.unit.minutes').d('分钟')
intl.get('hzero.common.email').d('邮箱')
intl.get('hzero.common.globalExcetion.button.backWorkplace').d('返回首页')
intl.get('hzero.common.gender').d('性别')
intl.get('hzero.common.interfaceCode').d('接口编码')
intl.get('hzero.common.interfaceName').d('接口名称')
intl.get('hzero.common.interfaceUrl').d('接口地址')
intl.get('hzero.common.jobGroup.auto').d('自动注册')
intl.get('hzero.common.jobGroup.byHand').d('手动录入')
intl.get('hzero.common.message.loginOut').d('退出登录')
intl.get('hzero.common.message.globalError').d('很抱歉!出现预料之外的错误')
intl.get('hzero.common.message.errorMessage').d('错误信息:')
intl.get('hzero.common.message.errorLocation').d('错误页面:')
intl.get('hzero.common.message.confirm.giveUpTip').d('你有修改未保存,是否确认离开?')
intl.get('hzero.common.message.confirm.title').d('提示框?')
intl.get('hzero.common.message.confirm.remove').d('确定删除选中数据?')
intl.get('hzero.common.message.confirm.remove').d('请至少选择一条数据')
intl.get('hzero.common.message.confirm.delete').d('是否确认删除?')
intl.get('hzero.common.message.confirm.delete').d('是否删除此条记录')
intl.get('hzero.common.message.confirm.selected.atLeast').d('请至少选择一行数据')
intl.get('hzero.common.message.priority.overTime').d('已超时:')
intl.get('hzero.common.message.priority.remainTime').d('剩余时间:')
intl.get('hzero.common.message.confirm.refund').d('是否确认退款?')
intl.get('hzero.common.message.confirm.pay').d('是否确定支付?')
intl.get('hzero.common.message.confirm.ckEditor').d('请输入富文本内容')
intl.get('hzero.common.message.confirm.generate').d('是否生成订单?')
intl.get('hzero.common.model.tenantName').d('租户')
intl.get('hzero.common.model.common.tenantId').d('租户')
intl.get('hzero.common.message.confirm.apply').d('是否应用该规则?')
intl.get('hzero.common.message.dataExists').d('数据已存在')
intl.get('hzero.common.model.param').d('参数')
intl.get('hzero.common.message.confirm.stopProcess').d('是否终止此条记录')
intl.get('hzero.common.message.confirm.suspend').d('是否挂起此条记录')
intl.get('hzero.common.notification.export.error').d('导出异常')
intl.get('hzero.common.notification.success.save').d('保存成功')
intl.get('hzero.common.notification.error.webSocket').d('webSocket连接失败!')
intl.get('hzero.common.notification.error').d('操作失败')
intl.get('hzero.common.notification.typeError').d('网络请求异常')
intl.get('hzero.common.notification.typeError.description').d('请稍后重试')
intl.get('hzero.common.notification.success.create').d('创建成功')
intl.get('hzero.common.notification.download.error').d('下载异常')
intl.get('hzero.common.notification.success.delete').d('删除成功')
intl.get('hzero.common.priority.low').d('低')
intl.get('hzero.common.priority.high').d('高')
intl.get('hzero.common.priority.medium').d('中')
intl.get('hzero.common.phone').d('手机')
intl.get('hzero.common.publishUrl').d('发布地址')
intl.get('hzero.common.predefined').d('预定义')
intl.get('hzero.common.priority').d('优先级')
intl.get('hzero.common.process.readFlagY').d('已读')
intl.get('hzero.common.process.readFlagN').d('未读')
intl.get('hzero.common.richTextEditor.insertFile').d('插入文件')
intl.get('hzero.common.richTextEditor.insertImage').d('插入文件')
intl.get('hzero.common.richTextEditor.selectFile').d('选择图片')
intl.get('hzero.common.richTextEditor.uploading').d('正在上传')
intl.get('hzero.common.richTextEditor.startUpload').d('开始上传')
intl.get('hzero.common.releaseType').d('发布类型')
intl.get('hzero.common.remark').d('备注')
intl.get('hzero.common.status.edit').d('编辑')
intl.get('hzero.common.status.cancel').d('取消')
intl.get('hzero.common.status.enable').d('启用')
intl.get('hzero.common.status').d('状态')
intl.get('hzero.common.status.normal').d('正常')
intl.get('hzero.common.status.abnormal').d('故障')
intl.get('hzero.common.status.unmonitor').d('未在监控')
intl.get('hzero.common.status.finished').d('已结束')
intl.get('hzero.common.status.suspended').d('挂起中')
intl.get('hzero.common.status.running').d('运行中')
intl.get('hzero.common.status.read').d('已读')
intl.get('hzero.common.status.unread').d('未读')
intl.get('hzero.common.status.agree').d('同意')
intl.get('hzero.common.status.reject').d('拒绝')
intl.get('hzero.common.status.addSign').d('加签')
intl.get('hzero.common.status.ApproveAndAddSign').d('同意并加签')
intl.get('hzero.common.status.delegate').d('转交')
intl.get('hzero.common.status.jump').d('驳回')
intl.get('hzero.common.status.recall').d('撤回')
intl.get('hzero.common.status.revoke').d('撤销')
intl.get('hzero.common.status.autoDelegate').d('自动转交')
intl.get('hzero.common.status.carbonCopy').d('抄送')
intl.get('hzero.common.status.reset').d('重置')
intl.get('hzero.common.status.search').d('查询')
intl.get('hzero.common.status.no').d('否')
intl.get('hzero.common.status.yes').d('是')
intl.get('hzero.common.status.disable').d('禁用')
intl.get('hzero.common.status.enabledFlag').d('状态')
intl.get('hzero.common.status.enableFlag').d('是否启用')
intl.get('hzero.common.status.delete').d('删除')
intl.get('hzero.common.status.create').d('新建')
intl.get('hzero.common.source').d('来源')
intl.get('hzero.common.status.requiredFlag').d('是否必输')
intl.get('hzero.common.status.ip').d('IP')
intl.get('hzero.common.status.port').d('端口')
intl.get('hzero.common.status.loginUser').d('登录用户名')
intl.get('hzero.common.status.loginEncPwd').d('登录密码')
intl.get('hzero.common.table.column.option').d('操作')
intl.get('hzero.common.title.userInfo').d('个人中心')
intl.get('hzero.common.title.userInfo').d('__hzero-common-title__')
intl.get('hzero.common.title.userMessage').d('站内消息')
intl.get('hzero.common.table.column.option').d('更多')
intl.get('hzero.common.title.wordEdit').d('__hzero-common-title__')
intl.get('hzero.common.title.content').d('必须先选择上传类型')
intl.get('hzero.common.time.creation.from').d('创建日期从')
intl.get('hzero.common.time.creation.to').d('创建日期至')
intl.get('hzero.common.title.batchImport').d('批量导入')
intl.get('hzero.common.title.individuation.formInputPropsSize').d('控件大小')
intl.get('hzero.common.title.individuation.formInputPropsTypeCase').d('组件的大小写输入限制')
intl.get('hzero.common.title.individuation.formInputPropsDbc2sbc').d('是否转换全角到半角')
intl.get('hzero.common.title.individuation.formInputPropsTrim').d('是否删除前后空格')
intl.get('hzero.common.title.individuation.formInputPropsTrimAll').d('是否删除所有空格')
intl.get('hzero.common.title.individuation.formInputPropsMax').d('最大值')
intl.get('hzero.common.title.individuation.formInputPropsMin').d('最小值')
intl.get('hzero.common.title.individuation.formInputPropsPrecision').d('数值精度')
intl.get('hzero.common.title.individuation.allowThousandth').d('是否启用千分位')
intl.get('hzero.common.title.individuation.required').d('是否必输')
intl.get('hzero.common.title.individuation.formInputPropsDisabled').d('是否不可编辑')
intl.get('hzero.common.title.individuation.row').d('字段行')
intl.get('hzero.common.title.individuation.row').d('字段列')
intl.get('hzero.common.title.formula').d('公式')
intl.get('hzero.common.upload.error.type.null').d('上传文件类型缺失,请检查类型')
intl.get('hzero.common.upload.status.error').d('上传失败')
intl.get('hzero.common.upload.txt').d('上传')
intl.get('hzero.common.upload.view').d('查看附件')
intl.get('hzero.common.upload.text').d('上传附件')
intl.get('hzero.common.upload.modal.title').d('附件')
intl.get('hzero.common.upload.template').d('附件模板')
intl.get('hzero.common.validation.atLeast').d('请至少选择一条数据')
intl.get('hzero.common.validation.ip').d('ip地址不正确')
intl.get('hzero.common.validation.email').d('邮箱格式不正确')
intl.get('hzero.common.validation.phone').d('手机格式不正确')
intl.get('hzero.common.validation.notChange').d('未更改')
intl.get('hzero.common.validation.httpUrl').d('请输入以“http/https”开头的正确网址')
intl.get('hzero.common.validation.codeUpper').d('全大写及数字,必须以字母、数字开头,可包含“-”、“_”、“.”、“/”')
intl.get('hzero.common.validation.code').d('大小写及数字,必须以字母、数字开头,可包含“-”、“_”、“.”、“/”')
intl.get('hzero.common.validation.password').d('至少包含数字/字母/字符2种组合,长度为6-30个字符')
intl.get('hzero.common.validation.codeLower').d('全小写及数字,必须以字母、数字开头,可包含“-”、“_”、“.”、“/”')
// 模板国际化
intl.get('hzero.common.validation.max').d('长度不能超过{max}个字符')
intl.get('hzero.common.upload.support').d('上传格式:{type}')
intl.get('hzero.common.validation.notNull').d('{name}不能为空')
intl.get('hzero.common.upload.error.size').d('上传文件大小不能超过:{fileSize}')
intl.get('hzero.common.upload.error.type').d('上传文件类型必须是:{fileType}')
07. 注意事项
界面多语言除了采用统一的命名规范以外,还需要注意以下几点:
- 多语言编码中不能出现字符串/变量拼接,必须为纯字符串。
举例:
const messageCode = 'hpfm.message.model.message';
intl.get(`${messageCode}.code`).d('消息编码')
上面这种国际化的书写是不规范的,应写成如下形式:
intl.get('hpfm.message.model.message.code').d('消息编码')
注意: 多语言编码中出现字符串/变量拼接是不推荐使用的,如果一定要使用这种方法,请勿在多个文件中传递使用
- 多语言的编码长度不能过长,一般规定长度不能大于60
错误示例:
// bad
intl.get('hwfp.interfaceDefinition.model.interfaceDefinition.description').d('接口说明')
像上面这种键值过长的国际化编码,我们一般会采用简写的形式来书写(例如:description可以简写为desc)
-
一个编码只能对应唯一一个默认值
-
如果默认值出现了拼接,需要换成intl的模板国际化
举例:
rules:[
{
required: true,
message: intl.get('hzero.common.validation.notNull',
{name: intl.get('hpfm.event.model.event.code').d('事件编码')})
}
],
hzero.common.validation.notNull
多语言描述是{name} 不能为空
, intl.get() 函数第二个参数是变量的值
- 在书写组件的时候,不要使用纯组件,纯组件会导致国际化无法切换问题