在國際化環(huán)境下,越來越多的程序需要做多語言版本,以適應(yīng)各種業(yè)務(wù)需求的變化。在Winform應(yīng)用程序中實(shí)現(xiàn)多語言也有常規(guī)的處理方式處理,不過需要針對每個語言版本,重新修改Winform界面的顯示,對一些常規(guī)的輔助類,也需要引入一個統(tǒng)一的資源管理類來處理多語言的問題,相對比較繁瑣。本篇隨筆針對多語言的需求,希望盡量避免繁瑣的操作,既能符合本地語種開發(fā)人員的開發(fā)習(xí)慣,又能快速實(shí)現(xiàn)Winform程序的多語言場景處理。
業(yè)務(wù)包括:企業(yè)網(wǎng)站建設(shè)、成都做手機(jī)網(wǎng)站、成都做商城網(wǎng)站、網(wǎng)站營銷推廣等服務(wù),并且涵蓋域名申請、網(wǎng)絡(luò)空間、云服務(wù)器、等互聯(lián)網(wǎng)基礎(chǔ)服務(wù);成都創(chuàng)新互聯(lián)公司聯(lián)建站以互聯(lián)網(wǎng)的創(chuàng)新理念,成熟完善的建站體系,開拓進(jìn)取的精神,專業(yè)的解決方案和顧問咨詢服務(wù),幫助客戶在互聯(lián)網(wǎng)時代提升形象、把握商機(jī)、實(shí)現(xiàn)價(jià)值,提高企業(yè)的核心競爭力。1、多語言開發(fā)的困惑和思路
在常規(guī)的多語言版本程序中,開發(fā)總是伴隨著很多不愉快的事情,大概列舉一些僅供參考:
1)對窗體的多語言處理時,維護(hù)多個語言版本的界面非常繁瑣;
2)多語言處理的時候,以資源參照的時候,默認(rèn)鍵值為一些英文字符串或者單詞,不太符合如中文語境的開發(fā),調(diào)整代碼則需要很多工作量;
3)對于已開發(fā)好的程序,全面引入多語言的處理代碼,需要大量修改;
4)對于大量中文的多語言處理,工作量望而卻步;
5)對于常規(guī)Resx文件的處理覺得繁瑣
6)缺乏一個統(tǒng)一處理多語言需求的方案
在多語言的處理上,我一直希望找出一種高效的處理方式,由于我的Winform開發(fā)框架中很多模塊是現(xiàn)成的,希望能夠使用繼承處理的方式,實(shí)現(xiàn)最簡化的處理;
同時大量中文的英文(針對英文版本)翻譯也是一個頭痛的事情,突然想到百度的翻譯API接口可以利用,那么我們可以利用翻譯接口實(shí)現(xiàn)開始的翻譯,然后對資源進(jìn)行一定的調(diào)整則可以提高效率和準(zhǔn)確率。
對于編輯和承載多語言的信息,我一直覺得JSON格式挺好的,可以利用它序列化為字典集合,通過字典獲取對應(yīng)鍵值的多語言版本字符串也是很高效的一種方式,那么就決定用JSON來存儲多語言信息了,易讀好用。
對于多余的處理邏輯,盡量封裝為獨(dú)立的模塊,可以在多個模塊中進(jìn)行調(diào)用處理。
2、多語言的處理實(shí)現(xiàn)
在思考多語言的合理處理方案過程中,參考了另一位博友的文章《分享兩種實(shí)現(xiàn)Winform程序的多語言支持的解決方案》,思路有點(diǎn)符合我的期望,因此吸收了一些處理思想進(jìn)行處理,目的就是提高開發(fā)效率。
1)多語言的信息存儲和加載
首先,我們來看看多語言處理的目錄和格式問題,目錄大概是根據(jù)多語言的簡稱進(jìn)行放置,如下所示。
這個目錄就是會輸出到debug或者Release的運(yùn)行目錄中,我們就是根據(jù)相對于運(yùn)行目錄進(jìn)行資源讀取即可,所有模塊共用同一的多語言文件,我們可以把各個模塊基礎(chǔ)通用的多語言文件放在Basic.json文件中,也可以根據(jù)模塊獨(dú)立起名,主程序如TestMultiLanguage的多語言文件我則放在TestMultiLanguage.json文件中。實(shí)際上目錄名稱是為了區(qū)分而已,程序加載的時候,會把目錄下面所有的JSON文件進(jìn)行加載,讀取里面的鍵值作為資源的字典參照。
多語言的JSON文件是標(biāo)準(zhǔn)的Json格式,只是我們只用鍵值的字典參考即可,不需要使用復(fù)雜的JSON對象格式,如下是basic.json文件的部分內(nèi)容。
這些資源文件采用中文-英文的參照方式,我們以我們常規(guī)的母語開發(fā),即使我們不做多語言,也不影響代碼的正常處理,我們只需要把窗體上和代碼里面的中文提取出來,然后進(jìn)行多語言處理(如變?yōu)橛⑽模┘纯伞?/p>
由于我們使用鍵值字典對象的JSON內(nèi)容,那么我們就可以把這些內(nèi)容序列號為字典集合,如下代碼我們可以通過 JSON.NET 組件把它們序列化為字典集合,這些字典集合就是我們用來做多語言的關(guān)鍵。
var content = File.ReadAllText(file, Encoding.UTF8); if (!string.IsNullOrEmpty(content)) { var dict = JsonConvert.DeserializeObject>(content); foreach (string key in dict.Keys) { //遍歷集合如果語言資源鍵值不存在,則創(chuàng)建,否則更新 if (!resources.ContainsKey(key)) { resources.Add(key, dict[key]); } else { resources[key] = dict[key]; } } }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。