天天看點

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

在這篇《如何快速實作多語言處理:WinForm應用實戰開發指南 - 如何快速實作多語言處理?》裡面介紹了WinForms開發中多語言的處了解決方案,整個多語言解決方案是以實際需求為驅動,以減少代碼改動,高效處理為目的,通過基類繼承的方式減少代碼修改,通過引入翻譯API方式減少翻譯處理時間,本随筆繼續深化這個多語言處理方案的介紹,是指整合在開發架構中進行無縫的使用。

PS:給大家推薦這個WinForm應用界面開發元件——DevExpress WinForms,它能完美建構流暢、美觀且易于使用的應用程式,無論是Office風格的界面,還是分析處理大批量的業務資料,它都能輕松勝任!

DevExpress WinForms Subscription官方最新版免費下載下傳試用,曆史版本下載下傳,線上文檔和幫助檔案下載下傳-慧都網

多語言的處理步驟

1. 提取多語言處理JSON檔案

我們通過把程式界面或者代碼裡面的中文提取出來,放到JSON檔案中,對不同子產品可以分為不同的JSON檔案,如下所示。

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

然後使用輔助類的接口調用實作英文内容的翻譯,如下代碼所示:

//界面漢化
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");//英文界面

//如果語言包有空白的翻譯内容,可以調用下面語句(百度翻譯)獲得翻譯内容,減少手工翻譯的繁瑣
//翻譯後将内容進行稽核或調整一下即可使用
//正式釋出程式需要屏蔽這個調用
JsonLanguage.Default.Translate();           

可以把内容翻譯并調整好。

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

這些JSON資源檔案,按照程式運作的相對目錄 Lang/en-US/ABC.json 目錄放置即可,可以根據不同的子產品或者需求分開不同的檔案,程式加載多語言資訊的時候,會全部進行加載。

2. 繼承窗體基類和使用統一的資訊提示輔助類

準備好多語言檔案後,那麼多語言的處理還需要一些輔助的處理才能實作,由于我們已經把多語言處理的邏輯放在了窗體的基類,如BaseForm窗體基類裡面,如果原來窗體就是繼承了這個基類,那麼多語言處理邏輯會在窗體加載後自動進行處理的了。

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

通過繼承關系的處理,我們可以不用修改子窗體任何代碼就可以自動具有多語言的處理過程了,子窗體在加載完畢後,自動周遊内部控件實作多語言的處理邏輯。

如果我們一些窗體,不友善內建這些基類,那麼也可以使用增加代碼的方式進行處理即可,在窗體的Load或者Shown事件裡面實作處理,如下代碼所示。

private void Form1_Shown(object sender, EventArgs e)
{
//窗體加載并顯示後,對窗體實作多語言處理
if (!this.DesignMode)
{
LanguageHelper.InitLanguage(this);
}
}           

還有一種特殊的界面,就是一些資訊的提示,如消息框的提示,這種預設的處理方式,如下面是一般的消息提示代碼。

XtraMessageBox.Show("歡迎使用Winform開發架構", "提示資訊", MessageBoxButtons.OK, MessageBoxIcon.Information);

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

我們在架構裡面也是通過輔助類封裝的方式進行提示的,是以多語言也隻需要修改這個輔助類就可以了,不用修改我們窗體裡面已完成的代碼。

MessageDxUtil.ShowTips("歡迎使用Winform開發架構");           

由于我們在架構裡面統一使用消息提示處理,那麼多語言的處理,在其内部實作即可,如下所示。

/// <summary>
/// 顯示一般的提示資訊
/// </summary>
/// <param name="message">提示資訊</param>
/// <param name="args">字元串裡面的參數内容</param>
/// <returns></returns>
public static DialogResult ShowTips(string message, params object[] args)
{
//對消息的内容進行多語言處理
message = JsonLanguage.Default.GetString(message);
if (args != null)
{
message = string.Format(message, args);
}
return DevExpress.XtraEditors.XtraMessageBox.Show(message, Caption_Tips, MessageBoxButtons.OK, MessageBoxIcon.Information);
}           

如果是帶有一些參數占位符的多語言處理,我們一樣可以實作它。

MessageDxUtil.ShowTips("使用者【{0}】身份驗證正确", loginName);           
WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

通過窗體基類BaseForm内部邏輯的修改,以及一些輔助類如MessageDxUtil的修改,我們悄悄的就實作了多語言的處理邏輯,原來的代碼還是不用修改就支援了多語言的處理,大大節省了工作量。

當然如果是一些特殊的情況,我們還是可以通過統一的多語言處理邏輯來獲得它的内容,如下代碼所示。

3. 子產品化的多語言支援

除了上面介紹的一些總體邏輯,我們在WinForms開發過程中,往往也是以子產品化的開發方式來提高開發效率,如利用架構的公用類庫、基礎界面子產品、分頁控件子產品、字典子產品、權限管理系統等等,這些子產品都是整個子產品化過程中的一部分,當然多語言的支援也是很必要,由于我們已經通過基類和多餘與子產品獨立的方式來簡化它,但是裡面的多語言資源我們也應該以子產品方式提供,翻譯好并內建在系統中使用即可。

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

上面的Basic.json是架構整個基礎的界面(如分頁、字典等)英文參照資源,Security.json為權限系統的界面資源,Commons.json為一些其他子產品的多語言資源等等 。

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

以及權限系統的多語言參照資源。

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

例如分頁控件的展示界面,我們的英文版效果如下所示(以使用者管理界面為例):

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

編輯界面效果如下所示:

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

權限管理系統整體的界面效果如下所示,包括工具欄、菜單、頁籤,以及裡面的所有控件,測試均表現OK。

當然,裡面的資料源肯定還是中文的,除非我們系統的資料全部以英文語境進行錄入。

WinForm應用實戰開發指南 - 如何實作多語言開發架構子產品的整合?

本文轉載自:部落格園 - 伍華聰

繼續閱讀