背景
这是一篇老文章,仅做回忆与记录,新时代多语言应该结合AI实现更加智能。项目背景是信息系统需要支持 英语,阿拉伯语等多种语言自动识别与切换,团队结构是项目经理熟悉英语,其他团队成员英语阅读能力欠佳,其有一个名翻译,但非IT行业背景。阿语是所有团员成员都不懂的语言。产生如下国际化研发流程
竞品
业务功能模块
B2B2C商城,需要商户入驻,其他包括:
- 客户中心
- 商户中心
- 商品中心
- 库存中心
- 订单中心
- 会员中心
- 营销中心
- 建站中心
登录集成:Facebook, Google, Twitter.
支付集成: Alipay, Paypal, stripe.
物流集成:Aramex, FedEx, DHL
内容审计:文字图片国际化: 鉴黄,恐怖,广告
集成客户-CRM
集成 客户-BI商业智能
集成 客户-呼叫中心zendesk
UI设计
后端
框架本身提供了一套多语言机制来帮助我们实现本地化,基本思路是 本身维护一个键值对集合。只需要将展示给客户的文字信息处都使用一个语言 Key 来进行填充,当用户登录系统之后,会取得当前用户的区域文化信息进行文本渲染。
启动流程图
当前系统所支持的区域文化代码,可以通过执行 CultureInfo.GetCultures(CultureTypes.AllCultures);
用字典本地化资源对象获取数据的时候,其实也就是从其内部的字典提供器来获取数据。
数据库设计
多语言表
CREATE TABLE `languages` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`CreationTime` datetime(6) NOT NULL,
`CreatorUserId` bigint(20) NULL DEFAULT NULL,
`LastModificationTime` datetime(6) NULL DEFAULT NULL,
`LastModifierUserId` bigint(20) NULL DEFAULT NULL,
`IsDeleted` bit(1) NOT NULL,
`DeleterUserId` bigint(20) NULL DEFAULT NULL,
`DeletionTime` datetime(6) NULL DEFAULT NULL,
`TenantId` int(11) NULL DEFAULT NULL,
`Name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`DisplayName` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`Icon` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`IsDisabled` bit(1) NOT NULL,
PRIMARY KEY (`Id`) USING BTREE,
INDEX `IX_Languages_TenantId_Name`(`TenantId`, `Name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of languages
-- ----------------------------
INSERT INTO `languages` VALUES (1, '2020-12-05 13:11:04.756349', NULL, NULL, NULL, b'0', NULL, NULL, NULL, 'en', 'English', 'famfamfam-flags gb', b'0');
INSERT INTO `languages` VALUES (2, '2020-12-05 13:11:04.756351', NULL, NULL, NULL, b'0', NULL, NULL, NULL, 'ar', 'العربية', 'famfamfam-flags sa', b'0');
**多语言扩展表**
CREATE TABLE `languagetexts` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`CreationTime` datetime(6) NOT NULL,
`CreatorUserId` bigint(20) NULL DEFAULT NULL,
`LastModificationTime` datetime(6) NULL DEFAULT NULL,
`LastModifierUserId` bigint(20) NULL DEFAULT NULL,
`TenantId` int(11) NULL DEFAULT NULL,
`LanguageName` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`Source` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`Key` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`Value` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`Id`) USING BTREE,
INDEX `IX_LanguageTexts_TenantId_Source_LanguageName_Key`(`TenantId`, `Source`, `LanguageName`, `Key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
资源文件列表
默认是英语en-us
中文zh-cn
前端PC端工程中i18n
"vue-i18n": "^8.22.2",
分模块资源文件
index.ts
商品资源文件 -中文zh-cn
英文en-us
Vue代码
使用多语言其中lang('xxxx')
前端工程中 商品导入模板
AR
Android移动端资源文件
Libya/blob/master/app/src/main/res/values/strings.xml
iOS移动端资源文件
ios-apps/app-Libya/blob/master/Libya/Libya/zh-Hans.lproj/Localizable.strings
前端资源翻译导入导出工具js-resources-translator及使用示例
工程采用JAVA语言研发,适配生成多个客户端资源文件
功能包括libya-admin、libya-pc-mall、libya-android、libya-ios各前端项目中语言资源文件的翻译、excel导出、excel导入
1 目录结构
|-- android_zh-CN 安卓简体中文资源(xml格式)示例文件目录
|-- android_en-US 安卓英文资源(xml格式)示例文件目录
|-- android_ar-LY 安卓阿拉伯文资源(xml格式)示例文件目录
|-- android_resources.xlsx 安卓资源excel示例文件
|-- h5_zh-CN H5简体中文资源(JS或TS格式)示例文件目录
|-- h5_en-US H5英文资源(JS或TS格式)示例文件目录
|-- h5_ar-LY H5阿拉伯文资源(JS或TS格式)示例文件目录
|-- h5-resources.xlsx H5资源excel示例文件
|-- ios_zh-CN IOS简体中文资源(strings格式)示例文件目录
|-- ios_en-US IOS英文资源(strings格式)示例文件目录
|-- ios_ar-LY IOS阿拉伯文资源(strings格式)示例文件目录
|-- ios_resources.xlsx IOS资源excel示例文件
|-- tools 程序运行根目录
|-- lang-resources-tools-1.0.1.jar 程序可运行jar包
|-- lib 其他依赖jar包目录
|-- android-translate.bat 翻译安卓资源文件示例脚本
|-- h5-translate.bat 翻译H5资源文件示例脚本
|-- ios-translate.bat 翻译IOS资源文件示例脚本
|-- android-export.bat 安卓资源导出到excel示例脚本
|-- h5-export.bat H5资源导出到excel示例脚本
|-- ios-export.bat IOS资源导出到excel示例脚本
|-- android-import.bat excel导入安卓资源示例脚本
|-- h5-import.bat excel导入H5资源示例脚本
|-- ios-import.bat excel导入IOS资源示例脚本
2 运行环境
该工具为java应用程序,需要java运行环境1.8及以上版本,JDK请自行安装
程序翻译功能使用必应翻译api,使用需互联网环境
windows CMD窗口下,由于PC语言环境问题控制台阿拉伯文字显示异常,可忽略,输出文件编码正常
3 运行命令说明
该工具翻译功能默认从简体中文翻译至指定目标语言,支持的语言和运行相关命令说明如下,示例命令中的参数请根据具体路径自行修改
3.1 显示帮助
java -Dfile.encoding=utf-8 -jar jar包路径 -help
3.2 批量翻译指定目录下H5(JS或TS)资源文件,-p、-d、-l为必传参数,翻译后自动生成以"h5_目标语言简写"命名的资源目录
java -Dfile.encoding=utf-8 -jar jar包路径 -p=h5_translate -d=文件夹路径 -l=目标语言(多语言用英文逗号,连接)
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=h5_translate -d="D:\test\h5_zh-CN" -l=en,ar
3.3 批量翻译指定目录下Android(xml)资源文件,-p、-d、-l为必传参数,翻译后自动生成以"android_目标语言简写"命名的资源目录
java -Dfile.encoding=utf-8 -jar jar包路径 -p=android_translate -d=文件夹路径 -l=目标语言(多语言用英文逗号,连接)
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=android_translate -d="D:\test\android_zh-CN" -l=en,ar
3.4 批量翻译指定目录下IOS(strings)资源文件,-p、-d、-l为必传参数,翻译后自动生成以"ios_目标语言简写"命名的资源目录
java -Dfile.encoding=utf-8 -jar jar包路径 -p=ios_translate -d=文件夹路径 -l=目标语言(多语言用英文逗号,连接)
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=ios_translate -d="D:\test\ios_zh-CN" -l=en,ar
3.5 h5资源导出到excel,-p、-zhd、-ef为必传参数,-end、-ard非必传参数
java -Dfile.encoding=utf-8 -jar jar包路径 -p=h5_export -zhd=中文资源目录 -end=英文资源目录 -ard=阿拉伯文资源目录 -ef=excel文件路径
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=h5_export -zhd="D:\test\h5_zh-CN" -end="D:\test\h5_en-US" -ard="D:\test\h5_ar-LY" -ef="D:\test\h5-resources.xlsx"
3.6 安卓资源导出到excel,-p、-zhf、-ef为必传参数,-enf、-arf非必传参数
java -Dfile.encoding=utf-8 -jar jar包路径 -p=android_export -zhf=中文资源文件路径 -enf=英文资源文件路径 -arf=阿拉伯文资源文件路径 -ef=excel文件路径
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=android_export -zhf="D:\test\android_zh-CN\strings.xml" -enf="D:\test\android_en-US\strings.xml" -arf="D:\test\android_ar-LY\strings.xml" -ef="D:\test\android-resources.xlsx"
3.7 IOS资源导出到excel,-p、-zhd、-ef为必传参数,-end、-ard非必传参数
java -Dfile.encoding=utf-8 -jar jar包路径 -p=ios_export -zhd=中文资源目录 -end=英文资源目录 -ard=阿拉伯文资源目录 -ef=excel文件路径
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=ios_export -zhd="D:\test\ios_zh-CN" -end="D:\test\ios_en-US" -ard="D:\test\ios_ar-LY" -ef="D:\test\ios-resources.xlsx"
3.8 从excel文件导入生成h5资源,-p、-ef、-zhd为必传参数,-end、-ard二者至少传其一
java -Dfile.encoding=utf-8 -jar jar包路径 -p=h5_import -ef=excel文件路径 -zhd=中文资源目录 -end=英文资源目录 -ard=阿拉伯文资源目录
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=h5_import -ef="D:\test\h5-resources.xlsx" -zhd="D:\test\h5_zh-CN" -end="D:\test\h5_en-US" -ard="D:\test\h5_ar-LY"
3.9 从excel文件导入生成安卓资源,-p、-ef、-zhf为必传参数,-enf、-arf二者至少传其一
java -Dfile.encoding=utf-8 -jar jar包路径 -p=android_import -ef=excel文件路径 -zhf=中文资源文件路径 -enf=英文资源文件路径 -arf=阿拉伯文资源文件路径
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=android_import -ef="D:\test\android-resources.xlsx" -zhf="D:\test\android_zh-CN\strings.xml" -enf="D:\test\android_en-US\strings.xml" -arf="D:\test\android_ar-LY\strings.xml"
3.10 从excel文件导入生成IOS资源,-p、-ef、-zhd为必传参数,-end、-ard二者至少传其一
java -Dfile.encoding=utf-8 -jar jar包路径 -p=ios_import -ef=excel文件路径 -zhd=中文资源目录 -end=英文资源目录 -ard=阿拉伯文资源目录
示例:
java -Dfile.encoding=utf-8 -jar lang-resources-tools-1.0.1.jar -p=ios_import -ef="D:\test\ios-resources.xlsx" -zhd="D:\test\ios_zh-CN" -end="D:\test\ios_en-US" -ard="D:\test\ios_ar-LY"
3.11 其他说明
命令中-d、-zhd、-end、-ard、-zhf、-enf、-arf、-ef、后面的参数为文件或目录路径,如果路径包含空格,请使用英文双引号""包括起来
命令中-l后支持一个或多个目标语言,请使用英文逗号,连接
命令中-l后参数请使用目标语言简写,支持的语言如下:
简体中文,简写:zh-CHS
繁体中文,简写:zh-CHT
粤语(繁体),简写:yue
英语,简写:en
阿拉伯语,简写:ar
南非荷兰语,简写:af
保加利亚语,简写:bg
孟加拉语,简写:bn
波斯尼亚语,简写:bs
加泰隆语,简写:ca
捷克语,简写:cs
威尔士语,简写:cy
丹麦语,简写:da
德语,简写:de
希腊语,简写:el
西班牙语,简写:es
爱沙尼亚语,简写:et
波斯语,简写:fa
芬兰语,简写:fi
菲律宾语,简写:fil
斐济,简写:fj
法语,简写:fr
爱尔兰语,简写:ga
古吉拉特语,简写:gu
希伯来语,简写:he
印地语,简写:hi
克罗地亚语,简写:hr
海地克里奥尔语,简写:ht
匈牙利语,简写:hu
印度尼西亚语,简写:id
冰岛语,简写:is
意大利语,简写:it
日语,简写:ja
哈萨克语,简写:kk
卡纳拉语,简写:kn
朝鲜语,简写:ko
立陶宛语,简写:lt
拉脱维亚语,简写:lv
马尔加什语,简写:mg
毛利语,简写:mi
马拉雅拉姆语,简写:ml
马拉地语,简写:mr
马来语,简写:ms
马耳他语,简写:mt
白苗文,简写:mww
挪威语,简写:nb
荷兰语,简写:nl
克雷塔罗奥托米语,简写:otq
旁遮普语,简写:pa
波兰语,简写:pl
葡萄牙语(巴西),简写:pt
葡萄牙语(葡萄牙),简写:pt-pt
罗马尼亚语,简写:ro
俄语,简写:ru
斯洛伐克语,简写:sk
斯洛文尼亚语,简写:sl
萨摩亚语,简写:sm
塞尔维亚语(西里尔文),简写:sr-Cyrl
塞尔维亚语(拉丁文),简写:sr-Latn
瑞典语,简写:sv
斯瓦希里语,简写:sw
泰米尔语,简写:ta
泰卢固语,简写:te
泰语,简写:th
Klingon(Latin),简写:tlh-Latn
Klingon(pIqaD),简写:tlh-Piqd
汤加语,简写:to
土耳其语,简写:tr
塔希提语,简写:ty
乌克兰语,简写:uk
乌尔都语,简写:ur
越南语,简写:vi
尤卡坦玛雅语,简写:yua
字体
PC商城英语环境下的字体统一为:
Avenir,Helvetica,Arial,sans-serif
PC商城阿语环境下的字体与IOS端字体保持一致,统一使用“苹方”,
UI设计图请前往蓝湖查看
阿语
用于测试的
阿语输入生成器
英语原型制作
中文先设计,英语再翻译
资源文件
过去我们把程序中资源文件导出为EXCEL,提供给WCT协助翻译
-
前端与移动端 资源文件导出与导入 工程。
-
服务端多语言导出与导入 工程
4)Audit_logs日志表多语言与导入工程
示例EXCEL格式:
KEY
CN
EN
AR
rejectReason
Reject Reason:
Reject Reason:
whetherToPass
是否通过
Approval
日志表中数据多语言
后端日志数据在数据库中的中文,采用Bing的API翻译后,写入不同数据语言表
审计日志主表
CREATE TABLE `auditlogs` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`TenantId` int(11) NULL DEFAULT NULL,
`UserId` bigint(20) NULL DEFAULT NULL,
`ServiceName` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`MethodName` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Parameters` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ReturnValue` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
`ExecutionTime` datetime(6) NOT NULL,
`ExecutionDuration` int(11) NOT NULL,
`ClientIpAddress` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ClientName` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`BrowserInfo` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`Exception` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ImpersonatorUserId` bigint(20) NULL DEFAULT NULL,
`ImpersonatorTenantId` int(11) NULL DEFAULT NULL,
`CustomData` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`Id`) USING BTREE,
INDEX `IX_AuditLogs_TenantId_ExecutionDuration`(`TenantId`, `ExecutionDuration`) USING BTREE,
INDEX `IX_AuditLogs_TenantId_ExecutionTime`(`TenantId`, `ExecutionTime`) USING BTREE,
INDEX `IX_AuditLogs_TenantId_UserId`(`TenantId`, `UserId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 209207 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
//扩展审计日志子表
CREATE TABLE `auditlogsdescribe` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`CreationTime` datetime(6) NOT NULL,
`CreatorUserId` bigint(20) NULL DEFAULT NULL,
`LastModificationTime` datetime(6) NULL DEFAULT NULL,
`LastModifierUserId` bigint(20) NULL DEFAULT NULL,
`ServiceName` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`MethodName` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ChDescription` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`EnDescription` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ArDescription` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 813 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
审计日志子表数据 多语言
英语文档翻译工具Microsoft Document Translator
www.microsoft.com/en-us/trans…
Microsoft Document Translator>DocumentTranslatorCmd setcredentials /APIkey:dc66aaa023474c6f87be8489f5f7442e /Region:Global /Cloud:Global /categoryID:0
Argument [Reset] has value [].
Argument [APIkey] has value [dc66aaa023474c6f87be8489f5f7442e].
Argument [categoryID] has value [0].
Argument [Region] has value [Global].
Argument [Cloud] has value [Global].
翻译指定路径
DocumentTranslatorCmd translatedocuments /documents:E:\tmp\xxx\*.docx /from:en /to:zh-Hans
DocumentTranslatorCmd translatedocuments /documents:E:\tmp\xxx\*.docx /from:en /to:tr