彭金勝
?
一種新型的Web國(guó)際化解決思路及實(shí)踐
彭金勝
(中國(guó)工商銀行股份有限公司軟件開(kāi)發(fā)中心,上海 201206)
目前Web應(yīng)用程序常見(jiàn)的國(guó)際化方案中,大多以前端或者后端為核心,導(dǎo)致另一端國(guó)際化能力弱及前后端交互頻繁等問(wèn)題。本文提出使用JSON作為資源文件的解決思路,前后端讀取此文件用于國(guó)際化,并且通過(guò)Hash,提供良好的緩存支持。以解決一端國(guó)際化能力弱,占用內(nèi)存空間大及前后端頻繁交互等問(wèn)題。目前部分內(nèi)容已應(yīng)用于實(shí)際項(xiàng)目中,受到同事們的一致好評(píng)。實(shí)踐表明該方案能夠很好的解決目前常見(jiàn)國(guó)際化方案中存在的不足。
Java Web國(guó)際化;JSON數(shù)據(jù)交換格式;JSON國(guó)際化
目前,Web應(yīng)用程序常見(jiàn)的國(guó)際化方案有些已經(jīng)過(guò)時(shí),例如以后端為核心,基于Java的properties的國(guó)際化方案,它需要在Java的Web容器當(dāng)中運(yùn)行,而且占用大量?jī)?nèi)存空間;而另一些則不成熟,比如當(dāng)前以前端為核心的國(guó)際化方案,jQuery等框架插件,它們與后端高頻的交互,對(duì)服務(wù)器帶來(lái)巨大壓力[1]。
JSON作為一種輕量級(jí)數(shù)據(jù)交換格式,具有良好讀寫(xiě)及跨語(yǔ)言平臺(tái)的能力,已經(jīng)成為數(shù)據(jù)交換的主要格式,非常適合以Java為代表的后端,及以JavaScript為前端的運(yùn)行環(huán)境,而國(guó)際化正是一種前后端都需要的資源。
基于以上當(dāng)前國(guó)際化方案存在的不足,以及JSON在數(shù)據(jù)交換領(lǐng)域所展現(xiàn)出來(lái)的優(yōu)勢(shì),本文提出使用JSON作為資源文件的解決方案,前后端讀取此文件用于國(guó)際化,并且通過(guò)Hash,提供良好的緩存支持[2]。以解決服務(wù)器壓力大,占用內(nèi)存空間大及前后端交互頻繁等問(wèn)題。
目前該方案部分內(nèi)容已應(yīng)用于實(shí)際項(xiàng)目中,受到同事們的一致好評(píng)。實(shí)踐表明該方案能夠很好的解決目前常見(jiàn)國(guó)際化方案中存在的不足。
現(xiàn)有Web應(yīng)用程序常用的國(guó)際化方案有很多種,大致可以分為兩類(lèi):一類(lèi)是在后端負(fù)責(zé)國(guó)際化,另一類(lèi)是前端負(fù)責(zé)國(guó)際化[3]。
其中前者相對(duì)來(lái)說(shuō)使用的更為廣泛,基于Java讀取相應(yīng)的properties文件(exaple_zh_CN.properties/ example_en_US.properties),以達(dá)到實(shí)現(xiàn)國(guó)際化的目的。缺陷比較明顯:
(1)都要經(jīng)過(guò)Java的Web容器,不管是Java程序直接讀取,或者Velocity模版引擎,還是JSP里自定義標(biāo)簽的方式。
(2)文件內(nèi)容需要裝載到內(nèi)存中,占有大量?jī)?nèi)存空間。
(3)文件通常會(huì)按模塊切分到各個(gè)模塊中,導(dǎo)致難于一起整理和翻譯。
(4)同一詞匯出現(xiàn)在多個(gè)文件中,導(dǎo)致系統(tǒng)整體內(nèi)容不一,并且維護(hù)困難。
隨著前后端分離思想的出現(xiàn),越來(lái)越多的項(xiàng)目選擇前端靜態(tài)化,通過(guò)Nginx等前端服務(wù)器或者CDN等方式部署靜態(tài)資源,隨之而來(lái)的便是另一類(lèi):前端國(guó)際化,通常采用頁(yè)面調(diào)用JavaScript文件(example_zh_CN.js/example_en_US.js)或者使用jQuery等成熟框架的國(guó)際化插件等方式,這類(lèi)方式的缺陷在于:
(1)使后端喪失了國(guó)際化的能力,比如后端的報(bào)錯(cuò)信息,生成pdf文件等。
(2)前后端交互頻繁,給服務(wù)器造成巨大的壓力。
JSON憑借輕量級(jí),良好的讀寫(xiě)及跨語(yǔ)言平臺(tái)等優(yōu)勢(shì),快速成為最流行的數(shù)據(jù)交換格式[4]。本文利用JSON格式文件優(yōu)勢(shì),提出以JSON存儲(chǔ)國(guó)際化資源的思路,以實(shí)際生產(chǎn)流程為例,一步一步實(shí)現(xiàn)前后臺(tái)分離應(yīng)用的國(guó)際化。
1.1.1 開(kāi)發(fā)
國(guó)際化JSON文件應(yīng)遵循如下原則:
(1)根據(jù)國(guó)家語(yǔ)言劃分,每種國(guó)家語(yǔ)言生成一份JSON文件。開(kāi)發(fā)時(shí),維護(hù)一份主文件,其它語(yǔ)言由主文件翻譯。
(2)內(nèi)容按字母排序,有助于后續(xù)維護(hù)。
(3)詞匯對(duì)應(yīng)的鍵值以頁(yè)面展現(xiàn)的英文或拼音為準(zhǔn),假如項(xiàng)目以中文為主,詞匯“搜索”對(duì)應(yīng)的鍵值應(yīng)該是“SouSuo”,假如項(xiàng)目以英文為主,則鍵值為“Search”。
(4)多個(gè)單詞的鍵值用下劃線連接,比如“收件日期”的鍵值為“Received_date”。
(5)按功能路徑分塊的方式進(jìn)行組織,以便于相同的內(nèi)容可以提取到更高層級(jí),以及按功能路徑切分文件。
以下摘取某工程部分內(nèi)容為例,文件內(nèi)容組織如圖1所示。

圖1 JSON文件內(nèi)容組織示意圖
1.1.2 構(gòu)建
國(guó)際化JSON文件通過(guò)生成Hash目錄文件“i18n_Hash_zh_CN.json”及其它Hash內(nèi)容文件的流程如下:
(1)建立一個(gè)Map,用于存儲(chǔ)模塊路徑及其對(duì)應(yīng)的內(nèi)容。
(2)進(jìn)入一個(gè)JSON對(duì)象,并帶入該JSON對(duì)象對(duì)應(yīng)的key值,如果是根對(duì)象,則為空(“”)。
(3)新建對(duì)象,用戶(hù)存儲(chǔ)帶入key值對(duì)應(yīng)的內(nèi)容。
(4)循環(huán)讀取該對(duì)象下的屬性,如果屬性不以斜線(“/”)開(kāi)頭,則將屬性及對(duì)應(yīng)的值添加到新建對(duì)象中。
(5)如果屬性以斜線(“/”)開(kāi)頭,則進(jìn)入第(2)步,帶入當(dāng)前key值加上該屬性。
(6)將key值加上斜線(“/”)結(jié)尾與新建對(duì)象一起放入Map中
通過(guò)以上流程便可以獲取所有的功能模塊路徑及其內(nèi)容,將內(nèi)容進(jìn)行md5取值并截前8位得Hash值,再將路徑及這些Hash值寫(xiě)入Hash目錄文件,最后將內(nèi)容寫(xiě)入由功能模塊路徑加Hash加上語(yǔ)言后綴組合成的Hash內(nèi)容文件中[5-7]。由于生成出的Hash內(nèi)容文件名中的Hash值為其文件內(nèi)容,以此便保證其文件名的唯一性,可被后端服務(wù)器,前端服務(wù)器及瀏覽器等端點(diǎn)永久緩存,JSON文件編譯結(jié)果如圖2所示。
1.1.3 使用
首先要根據(jù)語(yǔ)言獲取相應(yīng)的Hash目錄文件,然后再根據(jù)路徑獲取相應(yīng)的一個(gè)或多個(gè)國(guó)際化JSON文件,以下以簡(jiǎn)體中文(zh_CN)為例,如在“/dashboard”功能模塊或頁(yè)面中,根據(jù)“i18n_Hash_ zh_CN.json”,則需要獲取:

圖2 JSON文件編譯結(jié)果示意圖
(1)“/”對(duì)應(yīng)的4f668ad4_zh_CN.json。
(2)“/dashboard/”對(duì)應(yīng)的92b4dee5_zh_CN.json。
在“/user/resetpwd”功能模塊或頁(yè)面中時(shí),則需要獲取:
(1)“/”對(duì)應(yīng)的4f668ad4_zh_CN.json(如果已緩存則無(wú)需在獲取,在該示例中,由于“/dashboard”已加載過(guò)一次,所以此處無(wú)需再加載)。
(2)“/user/”對(duì)應(yīng)的eeacdaac_zh_CN.json。
(3)“/user/resetpwd/” 對(duì)應(yīng)的d21e76d5_zh_ CN.json。
其次是獲取國(guó)際化值,與獲取Hash文件類(lèi)似,如在“/dashboard”功能模塊或頁(yè)面中,需要獲取“Failed_Times”對(duì)應(yīng)的“失敗次數(shù)”:
(1)在“/dashboard/”對(duì)應(yīng)的92b4dee5_zh_CN. json里找“Failed_Times”,找到并返回。
當(dāng)在“/user/resetpwd”功能模塊或頁(yè)面中,需要獲取“Submit”對(duì)應(yīng)的“提交”:
(2)在“/user/resetpwd/”對(duì)應(yīng)的d21e76d5_zh_ CN.json里找“Submit”,未找到,下一步。
(3)在“/user/”對(duì)應(yīng)的eeacdaac_zh_CN.json里找“Submit”,未找到,下一步。
(4)在“/”對(duì)應(yīng)的4f668ad4_zh_CN.json里找“Submit”,找到并返回。
1.1.4 部署
國(guó)際化JSON文件可獨(dú)立部署,亦可在前端或后端服務(wù)器上部署,以下以獨(dú)立部署為例,架構(gòu)部署如圖3所示:
通過(guò)以上步驟,便實(shí)現(xiàn)JSON文件的國(guó)際化方案。經(jīng)歷開(kāi)發(fā)、構(gòu)建、部署及使用后,不難看出,對(duì)比目前常見(jiàn)國(guó)際化方案,該方案具有如下優(yōu)勢(shì):

圖3 JSON文件獨(dú)立部署架構(gòu)示意圖
(1)不再需要Java Web容器。
(2)內(nèi)容可根據(jù)模塊路徑按需緩存。
(3)開(kāi)發(fā)時(shí)只有一份文件,可直接發(fā)給翻譯部進(jìn)行翻譯。
(4)可通過(guò)簡(jiǎn)單的CTRL+F來(lái)確認(rèn)是否已國(guó)際化,防止同一詞匯多次出現(xiàn)。
(5)后端擁有國(guó)際化的能力,無(wú)需再去解析JavaScript文件。
(6)前端頁(yè)面渲染時(shí),根據(jù)功能模塊路徑一次性按文件裝載,而不再是單個(gè)詞匯請(qǐng)求后臺(tái)服務(wù)。
JSON文件國(guó)際化方案部分內(nèi)容已應(yīng)用于實(shí)際項(xiàng)目中,受到同事們的一致好評(píng)。因?yàn)榭梢园葱杈彺妫次募b載,所以大大提高了服務(wù)器性能,提升用戶(hù)體驗(yàn);因?yàn)橹挥幸环菸募瑑H需要跟翻譯部門(mén)講解溝通一次,就可以免去整理翻譯文檔的工作,大大縮減開(kāi)發(fā)工作量;因?yàn)楹蠖薐ava可以直接讀取JSON文件,而不再需要去解析JavaScript文件,有效防止了解析出錯(cuò)等問(wèn)題[8-10]。
通過(guò)JSON文件國(guó)際化方案,可以有效解決實(shí)際應(yīng)用的多個(gè)問(wèn)題,包括資源緩存,開(kāi)發(fā)工作量及程序高可靠性等。
JSON文件國(guó)際化方案,非常適用于全量發(fā)版的項(xiàng)目,對(duì)于增量發(fā)版的項(xiàng)目則不太適合,因?yàn)槿绻?xiàng)目很大,每次國(guó)際化文件被切成多個(gè)Hash的JSON文件,由于增量發(fā)版只會(huì)增量累積,隨之而來(lái)的便是國(guó)際化JSON文件難以清理的問(wèn)題。特別是7×24服務(wù)的應(yīng)用,清理成本更高。
當(dāng)然,隨著項(xiàng)目越來(lái)越大,JSON文件國(guó)際化方案還會(huì)遇到功能模塊路徑劃分的問(wèn)題,何種路徑劃分能夠很好支撐后續(xù)的發(fā)展,而不至于越來(lái)越多的內(nèi)容往根路徑上添加,導(dǎo)致根路徑Hash的JSON文件內(nèi)容過(guò)多。
當(dāng)前該方案不但適用于信息的國(guó)際化,而且適用于簡(jiǎn)單的字典值/代碼表(即下拉框數(shù)據(jù))的國(guó)際化,完整的字典值/代碼表的國(guó)際化方案正在研究當(dāng)中,相對(duì)于信息的國(guó)際化,字典值/代碼表的國(guó)際化則無(wú)需嚴(yán)格的功能路徑劃分,但是卻會(huì)有字典值/代碼表過(guò)大的情況,比如車(chē)型庫(kù)等。
[1] 冀振燕, 程虎, 梅嘉. Java語(yǔ)言國(guó)際化的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件學(xué)報(bào), 2000, 11(11): 1541-1546.
[2] 李長(zhǎng)春, 廖建新, 王純, 等. 軟件界面國(guó)際化及設(shè)計(jì)模式的應(yīng)用[J]. 食品科學(xué)技術(shù)學(xué)報(bào), 2007, 25(5): 53-56.
[3] 張愛(ài)玲, 米應(yīng)凱. 軟件系統(tǒng)國(guó)際化的設(shè)計(jì)研究[J]. 軟件工程, 2010(4): 52-53.
[4] 潘詩(shī)瑤, 黃建明. Web應(yīng)用系統(tǒng)中的MOCK測(cè)試技術(shù)[J]. 軟件, 2016, 37(12): 214-218.
[5] 朱培源. 一種新型的Web應(yīng)用程序框架的設(shè)計(jì)與實(shí)現(xiàn)[D]. 電子科技大學(xué), 2017.
[6] 王登輝. 基于工作流模式的語(yǔ)義Web服務(wù)組合信任度模型的研究與實(shí)現(xiàn)[D]. 華中科技大學(xué), 2016.
[7] 王文明, 李志安, 程懷舟. 一種新型的泵站W(wǎng)eb發(fā)布系統(tǒng)[J]. 可編程控制器與工廠自動(dòng)化, 2010(5): 61-63.
[8] 周娜. 基于Web的制造業(yè)電子商務(wù)平臺(tái)關(guān)鍵技術(shù)的研究與應(yīng)用[D]. 南京航空航天大學(xué), 2005.
[9] 王慶福. 網(wǎng)站建設(shè)中數(shù)據(jù)庫(kù)技術(shù)與WEB技術(shù)的應(yīng)用對(duì)比研究[J]. 軟件, 2013, 34(2): 86-87.
[10] 李天翼, 許魯, 常致全. 一種新型的基于網(wǎng)絡(luò)存儲(chǔ)的Web集群解決方案[J]. 計(jì)算機(jī)應(yīng)用研究, 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-),本科,信息科技經(jīng)理,主要研究方向:大數(shù)據(jù)分析挖掘及可視化。
本文著錄格式:彭金勝. 一種新型的Web國(guó)際化解決思路及實(shí)踐[J]. 軟件,2018,39(7):143-145