APP下载

一种新型的Web国际化解决思路及实践

2018-08-13彭金胜

软件 2018年7期
关键词:键值功能模块页面

彭金胜



一种新型的Web国际化解决思路及实践

彭金胜

(中国工商银行股份有限公司软件开发中心,上海 201206)

目前Web应用程序常见的国际化方案中,大多以前端或者后端为核心,导致另一端国际化能力弱及前后端交互频繁等问题。本文提出使用JSON作为资源文件的解决思路,前后端读取此文件用于国际化,并且通过Hash,提供良好的缓存支持。以解决一端国际化能力弱,占用内存空间大及前后端频繁交互等问题。目前部分内容已应用于实际项目中,受到同事们的一致好评。实践表明该方案能够很好的解决目前常见国际化方案中存在的不足。

Java Web国际化;JSON数据交换格式;JSON国际化

0 引言

目前,Web应用程序常见的国际化方案有些已经过时,例如以后端为核心,基于Java的properties的国际化方案,它需要在Java的Web容器当中运行,而且占用大量内存空间;而另一些则不成熟,比如当前以前端为核心的国际化方案,jQuery等框架插件,它们与后端高频的交互,对服务器带来巨大压力[1]。

JSON作为一种轻量级数据交换格式,具有良好读写及跨语言平台的能力,已经成为数据交换的主要格式,非常适合以Java为代表的后端,及以JavaScript为前端的运行环境,而国际化正是一种前后端都需要的资源。

基于以上当前国际化方案存在的不足,以及JSON在数据交换领域所展现出来的优势,本文提出使用JSON作为资源文件的解决方案,前后端读取此文件用于国际化,并且通过Hash,提供良好的缓存支持[2]。以解决服务器压力大,占用内存空间大及前后端交互频繁等问题。

目前该方案部分内容已应用于实际项目中,受到同事们的一致好评。实践表明该方案能够很好的解决目前常见国际化方案中存在的不足。

1 Web应用程序国际化方案的缺陷

现有Web应用程序常用的国际化方案有很多种,大致可以分为两类:一类是在后端负责国际化,另一类是前端负责国际化[3]。

其中前者相对来说使用的更为广泛,基于Java读取相应的properties文件(exaple_zh_CN.properties/ example_en_US.properties),以达到实现国际化的目的。缺陷比较明显:

(1)都要经过Java的Web容器,不管是Java程序直接读取,或者Velocity模版引擎,还是JSP里自定义标签的方式。

(2)文件内容需要装载到内存中,占有大量内存空间。

(3)文件通常会按模块切分到各个模块中,导致难于一起整理和翻译。

(4)同一词汇出现在多个文件中,导致系统整体内容不一,并且维护困难。

随着前后端分离思想的出现,越来越多的项目选择前端静态化,通过Nginx等前端服务器或者CDN等方式部署静态资源,随之而来的便是另一类:前端国际化,通常采用页面调用JavaScript文件(example_zh_CN.js/example_en_US.js)或者使用jQuery等成熟框架的国际化插件等方式,这类方式的缺陷在于:

(1)使后端丧失了国际化的能力,比如后端的报错信息,生成pdf文件等。

(2)前后端交互频繁,给服务器造成巨大的压力。

1.1 解决

JSON凭借轻量级,良好的读写及跨语言平台等优势,快速成为最流行的数据交换格式[4]。本文利用JSON格式文件优势,提出以JSON存储国际化资源的思路,以实际生产流程为例,一步一步实现前后台分离应用的国际化。

1.1.1 开发

国际化JSON文件应遵循如下原则:

(1)根据国家语言划分,每种国家语言生成一份JSON文件。开发时,维护一份主文件,其它语言由主文件翻译。

(2)内容按字母排序,有助于后续维护。

(3)词汇对应的键值以页面展现的英文或拼音为准,假如项目以中文为主,词汇“搜索”对应的键值应该是“SouSuo”,假如项目以英文为主,则键值为“Search”。

(4)多个单词的键值用下划线连接,比如“收件日期”的键值为“Received_date”。

(5)按功能路径分块的方式进行组织,以便于相同的内容可以提取到更高层级,以及按功能路径切分文件。

以下摘取某工程部分内容为例,文件内容组织如图1所示。

图1 JSON文件内容组织示意图

1.1.2 构建

国际化JSON文件通过生成Hash目录文件“i18n_Hash_zh_CN.json”及其它Hash内容文件的流程如下:

(1)建立一个Map,用于存储模块路径及其对应的内容。

(2)进入一个JSON对象,并带入该JSON对象对应的key值,如果是根对象,则为空(“”)。

(3)新建对象,用户存储带入key值对应的内容。

(4)循环读取该对象下的属性,如果属性不以斜线(“/”)开头,则将属性及对应的值添加到新建对象中。

(5)如果属性以斜线(“/”)开头,则进入第(2)步,带入当前key值加上该属性。

(6)将key值加上斜线(“/”)结尾与新建对象一起放入Map中

通过以上流程便可以获取所有的功能模块路径及其内容,将内容进行md5取值并截前8位得Hash值,再将路径及这些Hash值写入Hash目录文件,最后将内容写入由功能模块路径加Hash加上语言后缀组合成的Hash内容文件中[5-7]。由于生成出的Hash内容文件名中的Hash值为其文件内容,以此便保证其文件名的唯一性,可被后端服务器,前端服务器及浏览器等端点永久缓存,JSON文件编译结果如图2所示。

1.1.3 使用

首先要根据语言获取相应的Hash目录文件,然后再根据路径获取相应的一个或多个国际化JSON文件,以下以简体中文(zh_CN)为例,如在“/dashboard”功能模块或页面中,根据“i18n_Hash_ zh_CN.json”,则需要获取:

图2 JSON文件编译结果示意图

(1)“/”对应的4f668ad4_zh_CN.json。

(2)“/dashboard/”对应的92b4dee5_zh_CN.json。

在“/user/resetpwd”功能模块或页面中时,则需要获取:

(1)“/”对应的4f668ad4_zh_CN.json(如果已缓存则无需在获取,在该示例中,由于“/dashboard”已加载过一次,所以此处无需再加载)。

(2)“/user/”对应的eeacdaac_zh_CN.json。

(3)“/user/resetpwd/” 对应的d21e76d5_zh_ CN.json。

其次是获取国际化值,与获取Hash文件类似,如在“/dashboard”功能模块或页面中,需要获取“Failed_Times”对应的“失败次数”:

(1)在“/dashboard/”对应的92b4dee5_zh_CN. json里找“Failed_Times”,找到并返回。

当在“/user/resetpwd”功能模块或页面中,需要获取“Submit”对应的“提交”:

(2)在“/user/resetpwd/”对应的d21e76d5_zh_ CN.json里找“Submit”,未找到,下一步。

(3)在“/user/”对应的eeacdaac_zh_CN.json里找“Submit”,未找到,下一步。

(4)在“/”对应的4f668ad4_zh_CN.json里找“Submit”,找到并返回。

1.1.4 部署

国际化JSON文件可独立部署,亦可在前端或后端服务器上部署,以下以独立部署为例,架构部署如图3所示:

通过以上步骤,便实现JSON文件的国际化方案。经历开发、构建、部署及使用后,不难看出,对比目前常见国际化方案,该方案具有如下优势:

图3 JSON文件独立部署架构示意图

(1)不再需要Java Web容器。

(2)内容可根据模块路径按需缓存。

(3)开发时只有一份文件,可直接发给翻译部进行翻译。

(4)可通过简单的CTRL+F来确认是否已国际化,防止同一词汇多次出现。

(5)后端拥有国际化的能力,无需再去解析JavaScript文件。

(6)前端页面渲染时,根据功能模块路径一次性按文件装载,而不再是单个词汇请求后台服务。

1.2 结果

JSON文件国际化方案部分内容已应用于实际项目中,受到同事们的一致好评。因为可以按需缓存,按文件装载,所以大大提高了服务器性能,提升用户体验;因为只有一份文件,仅需要跟翻译部门讲解沟通一次,就可以免去整理翻译文档的工作,大大缩减开发工作量;因为后端Java可以直接读取JSON文件,而不再需要去解析JavaScript文件,有效防止了解析出错等问题[8-10]。

2 结论

通过JSON文件国际化方案,可以有效解决实际应用的多个问题,包括资源缓存,开发工作量及程序高可靠性等。

JSON文件国际化方案,非常适用于全量发版的项目,对于增量发版的项目则不太适合,因为如果项目很大,每次国际化文件被切成多个Hash的JSON文件,由于增量发版只会增量累积,随之而来的便是国际化JSON文件难以清理的问题。特别是7×24服务的应用,清理成本更高。

当然,随着项目越来越大,JSON文件国际化方案还会遇到功能模块路径划分的问题,何种路径划分能够很好支撑后续的发展,而不至于越来越多的内容往根路径上添加,导致根路径Hash的JSON文件内容过多。

当前该方案不但适用于信息的国际化,而且适用于简单的字典值/代码表(即下拉框数据)的国际化,完整的字典值/代码表的国际化方案正在研究当中,相对于信息的国际化,字典值/代码表的国际化则无需严格的功能路径划分,但是却会有字典值/代码表过大的情况,比如车型库等。

[1] 冀振燕, 程虎, 梅嘉. Java语言国际化的设计与实现[J]. 软件学报, 2000, 11(11): 1541-1546.

[2] 李长春, 廖建新, 王纯, 等. 软件界面国际化及设计模式的应用[J]. 食品科学技术学报, 2007, 25(5): 53-56.

[3] 张爱玲, 米应凯. 软件系统国际化的设计研究[J]. 软件工程, 2010(4): 52-53.

[4] 潘诗瑶, 黄建明. Web应用系统中的MOCK测试技术[J]. 软件, 2016, 37(12): 214-218.

[5] 朱培源. 一种新型的Web应用程序框架的设计与实现[D]. 电子科技大学, 2017.

[6] 王登辉. 基于工作流模式的语义Web服务组合信任度模型的研究与实现[D]. 华中科技大学, 2016.

[7] 王文明, 李志安, 程怀舟. 一种新型的泵站Web发布系统[J]. 可编程控制器与工厂自动化, 2010(5): 61-63.

[8] 周娜. 基于Web的制造业电子商务平台关键技术的研究与应用[D]. 南京航空航天大学, 2005.

[9] 王庆福. 网站建设中数据库技术与WEB技术的应用对比研究[J]. 软件, 2013, 34(2): 86-87.

[10] 李天翼, 许鲁, 常致全. 一种新型的基于网络存储的Web集群解决方案[J]. 计算机应用研究, 2003(10): 78-79+112.

A Mew Solution and Practice of Web Internationalization

PENG Jin-sheng

(Industrial Commercial Bank of China Co., Ltd. Software Development Center, Shanghai 201206)

Abstract: at present, most of common international schemes of Web applications take front or back end as core, which leads to weak international ability of other end and frequent interaction between front and back end. The article proposes solution of taking JSON as resource file, which can be read by front and back end for internationalization, and Hash provides good caching support to solve problem of weak internationalization at one end, and occupying large memory space and frequent interaction between front and back end. At present, some contents have been applied to practical projects and received good evaluation from colleagues. Practice shows the scheme can solve shortcomings of current common international solutions well.

Java Web internationalization; JSON data interchange format; JSON internationalization

TP274+.2

A

10.3969/j.issn.1003-6970.2018.07.030

彭金胜(1988-),本科,信息科技经理,主要研究方向:大数据分析挖掘及可视化。

本文著录格式:彭金胜. 一种新型的Web国际化解决思路及实践[J]. 软件,2018,39(7):143-145

猜你喜欢

键值功能模块页面
刷新生活的页面
输电线路附着物测算系统测算功能模块的研究
M市石油装备公服平台网站主要功能模块设计与实现
功能模块的设计与应用研究
网站结构在SEO中的研究与应用
浅析ASP.NET页面导航技术
注册表值被删除导致文件夹选项成空白
“扫除”技巧之清除恶意程序