張 舒
(北京全路通信信號(hào)研究設(shè)計(jì)院集團(tuán)有限公司,北京 100070)
目前越來(lái)越多的項(xiàng)目有了國(guó)際化需求,國(guó)際化主要是指根據(jù)語(yǔ)言選擇,顯示符合不同國(guó)家閱讀習(xí)慣的頁(yè)面和數(shù)據(jù)。國(guó)際化功能不僅需要將前臺(tái)界面固定使用的文本元素進(jìn)行翻譯,對(duì)于程序動(dòng)態(tài)產(chǎn)生的數(shù)據(jù)也需要進(jìn)行翻譯展示。針對(duì)固定文本信息的翻譯,可以使用通用的i18n組件,根據(jù)用戶當(dāng)前選擇語(yǔ)言類型,從語(yǔ)言配置文件中提取相應(yīng)的內(nèi)容。后臺(tái)數(shù)據(jù)的翻譯功能,目前主流方案主要有以下兩種。
使用翻譯網(wǎng)站提供的在線翻譯api。這種方式不需要自備翻譯數(shù)據(jù)集,方便靈活。但是當(dāng)需要前后臺(tái)交互并涉及到業(yè)務(wù)邏輯時(shí),雖然可以將前臺(tái)輸入內(nèi)容進(jìn)行反向翻譯統(tǒng)一成同一種語(yǔ)言內(nèi)容,但是無(wú)法保證傳遞給邏輯業(yè)務(wù)數(shù)據(jù)內(nèi)容的唯一可識(shí)別性。因此該方法僅適用于只展示動(dòng)態(tài)數(shù)據(jù),不對(duì)動(dòng)態(tài)數(shù)據(jù)進(jìn)行業(yè)務(wù)邏輯的情況。此外,正常網(wǎng)絡(luò)訪問(wèn)也是使用此方法的必備條件。
構(gòu)建數(shù)據(jù)字典,包括鍵值及對(duì)應(yīng)的翻譯語(yǔ)言內(nèi)容。前后臺(tái)交互及后臺(tái)業(yè)務(wù)使用鍵值,前臺(tái)顯示時(shí)使用翻譯內(nèi)容。此方案完美解決了輸入內(nèi)容唯一可識(shí)別的需求,但是需要將待翻譯的字段擴(kuò)展為鍵值和翻譯內(nèi)容兩個(gè)字段。這種方式要在程序設(shè)計(jì)時(shí)就考慮進(jìn)去,如果是在業(yè)務(wù)開發(fā)完成或部分完成后增加,需要重新梳理并修改前后臺(tái)數(shù)據(jù)結(jié)構(gòu),增大了開發(fā)工作量。
基于以上情況,因此需要設(shè)計(jì)一種易于配置并且具有高可復(fù)用性的框架實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)翻譯工作。
動(dòng)態(tài)數(shù)據(jù)翻譯框架設(shè)計(jì)如圖1所示。
圖1 翻譯框架設(shè)計(jì)Fig.1 Translation framework design
此框架設(shè)計(jì)遵循分層原則,劃分不同層的功能職責(zé)。其中Aspect用于對(duì)請(qǐng)求的參數(shù)及返回值攔截,調(diào)用翻譯服務(wù)進(jìn)行字段翻譯更新數(shù)據(jù)內(nèi)容;Service層(服務(wù)層)提供翻譯服務(wù),承擔(dān)該框架的主要業(yè)務(wù);Dao層(數(shù)據(jù)訪問(wèn)層)實(shí)現(xiàn)數(shù)據(jù)持久化功能,與數(shù)據(jù)源交互??蚣軆?nèi)默認(rèn)設(shè)置翻譯服務(wù)包括中文、英文,如需擴(kuò)展語(yǔ)言類型,使用時(shí)需要填寫在配置文件中并更新數(shù)據(jù)庫(kù)結(jié)構(gòu)及內(nèi)容。此功能是通過(guò)使用Cglib動(dòng)態(tài)擴(kuò)展java類及其接口實(shí)現(xiàn)。應(yīng)用此框架,后臺(tái)接收到請(qǐng)求后的運(yùn)行時(shí)序如下。
1)解析請(qǐng)求的語(yǔ)言類型;
2)具有入?yún)⒎g標(biāo)簽的方法進(jìn)行入?yún)⒔Y(jié)構(gòu)掃描,國(guó)際化功能處理成統(tǒng)一可識(shí)別鍵值;
3)核心業(yè)務(wù)邏輯處理;
受胎率用SPSS19.0統(tǒng)計(jì)軟件進(jìn)行卡方檢驗(yàn),精子活率和精子頂體完整率用單因素方差分析,結(jié)果用“平均值±標(biāo)準(zhǔn)差”表示。P<0. 05表示差異顯著,P>0. 05表示差異不顯著。
4)具有返回值翻譯標(biāo)簽的方法進(jìn)行返回值結(jié)構(gòu)掃描,國(guó)際化功能處理成翻譯后的內(nèi)容;
5)返回替換翻譯值后的響應(yīng)內(nèi)容。
應(yīng)用此方案,基于動(dòng)態(tài)數(shù)據(jù)翻譯的請(qǐng)求http請(qǐng)求過(guò)程如圖2所示,對(duì)于B/S架構(gòu)的前臺(tái)而言,僅需在http請(qǐng)求頭中增加語(yǔ)言類型屬性。
圖2 http請(qǐng)求過(guò)程Fig.2 HTTP request process
此方案的優(yōu)點(diǎn)如下。
1)對(duì)于已存在的項(xiàng)目進(jìn)行國(guó)際化功能添加時(shí),不會(huì)變動(dòng)原有數(shù)據(jù)結(jié)構(gòu),與業(yè)務(wù)解耦。
2)使用注解標(biāo)注需要翻譯的接口、翻譯類型(正向翻譯/反向翻譯)以及待翻譯字段,使用AOP進(jìn)行請(qǐng)求攔截和翻譯織入,可以縮減代碼,控制開發(fā)成本。
3)對(duì)于需要增擴(kuò)翻譯的語(yǔ)言種類和語(yǔ)言內(nèi)容,可以動(dòng)態(tài)擴(kuò)展字典表并進(jìn)行文件配置,無(wú)需增添代碼。
動(dòng)態(tài)數(shù)據(jù)翻譯框架與已有程序的結(jié)構(gòu)兼容情況如圖3所示。
圖3 翻譯框架兼容Fig.3 Compatibility of translation framework
動(dòng)態(tài)數(shù)據(jù)翻譯框架搭建步驟如下。
1) 建立數(shù)據(jù)表,內(nèi)容包括鍵值、需要翻譯的語(yǔ)言類型,比如中文、英文。其中鍵值是標(biāo)記翻譯內(nèi)容的唯一后臺(tái)通用語(yǔ)言,用于在后臺(tái)服務(wù)中進(jìn)行數(shù)據(jù)交換和數(shù)據(jù)存儲(chǔ)。
2) 翻譯字典查詢業(yè)務(wù),提供正向翻譯和反向翻譯功能。正向翻譯是指輸入鍵值和語(yǔ)言種類,返回對(duì)應(yīng)的語(yǔ)言內(nèi)容;反向翻譯是指輸入翻譯內(nèi)容和語(yǔ)言種類,返回唯一鍵值。語(yǔ)言種類包括中文、英文、以及自定義的語(yǔ)言類型。對(duì)于后者,程序讀取配置文件并通過(guò)Cglib自動(dòng)進(jìn)行裝配,讀取數(shù)據(jù)源數(shù)據(jù)提供對(duì)應(yīng)的翻譯功能。
3)自定義注解TranslateRequest,Translate Response和Translate。其中TranslateRequest標(biāo)記需要對(duì)入?yún)⑦M(jìn)行反向翻譯的接口,Translate Response標(biāo)記需要對(duì)返回值進(jìn)行翻譯的接口,Translate標(biāo)記結(jié)構(gòu)體中需要參與翻譯的字段。
4)AOP切面級(jí)別攔截接口的請(qǐng)求和返回值。對(duì)于請(qǐng)求進(jìn)行攔截,根據(jù)請(qǐng)求頭所帶語(yǔ)言類型,將語(yǔ)言內(nèi)容反向翻譯為唯一鍵值,在服務(wù)中進(jìn)行數(shù)據(jù)交換;對(duì)于接口返回值進(jìn)行攔截,根據(jù)請(qǐng)求頭所帶語(yǔ)言類型,將返回內(nèi)容中的唯一鍵值進(jìn)行翻譯,替換成翻譯內(nèi)容作為接口調(diào)用的響應(yīng)內(nèi)容。
1)前臺(tái)在http請(qǐng)求頭增加Language字段,標(biāo)記當(dāng)前前臺(tái)選擇語(yǔ)言類型,作為后臺(tái)接口輸入?yún)?shù)反向翻譯以及輸出參數(shù)翻譯的標(biāo)準(zhǔn)。
2)數(shù)據(jù)庫(kù)中添加翻譯字典。
3)并不是所有的接口和參數(shù)都有翻譯需求,因此只為有翻譯需求的接口和字段添加注解。在需要對(duì)入?yún)⑦M(jìn)行反向翻譯的接口進(jìn)行TranslateRequest標(biāo)記,在需要對(duì)返回值進(jìn)行翻譯的接口進(jìn)行TranslateResponse標(biāo)記,結(jié)構(gòu)體中需要參與翻譯的字段進(jìn)行Translate標(biāo)記。這樣操作可以最大化減少不必要的翻譯工作。
4)如果需要增擴(kuò)翻譯語(yǔ)言類型,需要在application.yml文件中以json的key-value格式寫入dict字段。如:dict: "{id-ID: 'C_ID'}",其中key是前后臺(tái)交互的語(yǔ)言類型,value是對(duì)應(yīng)的數(shù)據(jù)庫(kù)列名。
需要正向翻譯的方法及返回值結(jié)構(gòu)如圖4所示。
圖4 參考用例代碼Fig.4 Code of reference use case
外部調(diào)用該接口,根據(jù)請(qǐng)求頭Language字段值不同,返回內(nèi)容不同,測(cè)試結(jié)果如圖5所示。
圖5 翻譯測(cè)試結(jié)果Fig.5 Translation test results
本文設(shè)計(jì)了一種動(dòng)態(tài)數(shù)據(jù)翻譯框架,可以應(yīng)用于有翻譯需求的軟件開發(fā),尤其適用于增量式開發(fā)和有前后臺(tái)交互需求的情況。借助AOP技術(shù)實(shí)現(xiàn)國(guó)際化翻譯工作與核心業(yè)務(wù)的分離,使用注解方式提高框架的易用性和可復(fù)用性。通過(guò)使用本框架,可以有效提高系統(tǒng)的開發(fā)效率,降低人力和時(shí)間成本。該方案已經(jīng)應(yīng)用于海外鐵路的信息化產(chǎn)品中并且使用效果良好,希望本框架可以為更多具有多語(yǔ)言動(dòng)態(tài)數(shù)據(jù)翻譯需求的項(xiàng)目提供服務(wù)或設(shè)計(jì)思路。