国际化信息系统研发全流程案例

313 阅读12分钟

背景

      这是一篇老文章,仅做回忆与记录,新时代多语言应该结合AI实现更加智能。项目背景是信息系统需要支持 英语,阿拉伯语等多种语言自动识别与切换,团队结构是项目经理熟悉英语,其他团队成员英语阅读能力欠佳,其有一个名翻译,但非IT行业背景。阿语是所有团员成员都不懂的语言。产生如下国际化研发流程

clipboard

竞品

Jumia

Konga

Bidorbuy

Shopee

Lazada

Kilimall

业务功能模块

B2B2C商城,需要商户入驻,其他包括:

  1. 客户中心
  2. 商户中心
  3. 商品中心
  4. 库存中心
  5. 订单中心
  6. 会员中心
  7. 营销中心
  8. 建站中心

登录集成:Facebook, Google, Twitter.

支付集成: Alipay, Paypal, stripe.

物流集成:Aramex, FedEx, DHL

内容审计:文字图片国际化: 鉴黄,恐怖,广告

集成客户-CRM

集成 客户-BI商业智能

集成  客户-呼叫中心zendesk

UI设计

image

后端

     框架本身提供了一套多语言机制来帮助我们实现本地化,基本思路是 本身维护一个键值对集合。只需要将展示给客户的文字信息处都使用一个语言 Key 来进行填充,当用户登录系统之后,会取得当前用户的区域文化信息进行文本渲染。

50-790124107

启动流程图

clipboard

当前系统所支持的区域文化代码,可以通过执行 CultureInfo.GetCultures(CultureTypes.AllCultures);

clipboard

用字典本地化资源对象获取数据的时候,其实也就是从其内部的字典提供器来获取数据。

30-110231968

数据库设计

多语言表

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;

资源文件列表

clipboard

默认是英语en-us

clipboard

中文zh-cn

clipboard

前端PC端工程中i18n

"vue-i18n": "^8.22.2",

clipboard

分模块资源文件

clipboard

index.ts

clipboard

商品资源文件 -中文zh-cn

clipboard

英文en-us

clipboard

Vue代码

使用多语言其中lang('xxxx')

clipboard

前端工程中 商品导入模板

clipboard

clipboard

AR

clipboard

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语言研发,适配生成多个客户端资源文件

clipboard

功能包括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设计图请前往蓝湖查看

阿语

用于测试的

阿语输入生成器

www.branah.com/arabic

英语原型制作

中文先设计,英语再翻译

资源文件

过去我们把程序中资源文件导出为EXCEL,提供给WCT协助翻译

  1. 前端与移动端 资源文件导出与导入 工程。

  2. 服务端多语言导出与导入 工程

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;

审计日志子表数据 多语言

clipboard

英语文档翻译工具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