如何在多文化應用程序中為非基于表單的接口啟用RTL模式
您的應用程序可能包含顯示自定義字符串和圖像的視覺元素,這些元素不存儲在表單資源中(例如,硬編碼字符串,消息框,DXPopupMenu等),把這些元素調整為從右到左模式還包括一個本地化步驟。
消息框
其字符串不存儲在表單資源中的典型元素是Message Box。與標準的MessageBox不同,當檢測到RTL模式時,會自動調整(鏡像)其布局(對于標準的MessageBox需要啟用一個特殊的標志),所以創建RTL-ready XtraMessageBox時要做的兩件事是:
- 翻譯消息框的自定義文本和標題(如下面的演練所示)。
- 本地化標準按鈕的文本(OK, Cancel, Yes, No,等等),此任務對于顯示某些內置可本地化資源的所有DevExpress控件都是通用的,并且在本地化文檔中有介紹。
在下圖中,您可以看到顯示默認區域性的 XtraMessageBox。
啟用RTL模式的本地化XtraMessageBox。
DXPopupMenu
DXPopupMenu在RTL模式下自動反轉其項目的布局,您只需要將自定義文本翻譯為目標語言,如下所示:
下面的演練演示了如何在中本地化自定義文本,所示的文本本地化方法也適用于中的文本、硬編碼字符串等。
演練:如何在XtraMessageBox中本地化自定義字符串
雖然表單和控件中的字符串和圖像應使用基于表單的資源進行本地化,但非基于表單的用戶界面字符串和圖像(例如消息框中的字符串)必須使用項目資源進行本地化,要使用基于非表單的資源文件為消息框提供特定于區域性的文本,請按照以下步驟操作。
1.在Visual Studio菜單欄中,調用 Project 菜單,然后單擊Add New Item,使用Add New Item對話框,創建一個新的資源文件,然后命名為Messages.resx,該文件用于默認語言。
2.使用默認區域性所需的字符串值填充數據表。
3.為本地化的應用程序版本添加另一個新的資源文件并將文件命名為Messages.he.resx,文件名包含一個后綴,該后綴指定資源文件對應的區域性。
4.使用 Solution Explorer window打開創建的文件,并用適當的字符串填充數據表。
5.要在調用 XtraMessageBox 時使用本地化字符串,請參閱以下代碼。
C#:
using System.Resources; //... private void button_Click(object sender, EventArgs e) { ResourceManager RM = new ResourceManager("WindowsFormsApplication1.Messages", typeof(Form1).Assembly); XtraMessageBox.Show( this.LookAndFeel, RM.GetString("strDiscardChangesMessage"), RM.GetString("strDiscardChangesCaption"), MessageBoxButtons.YesNoCancel ); }
VB.NET:
Imports System.Resources '... Private Sub Button_Click(sender As Object, e As EventArgs) Dim RM As New ResourceManager("WindowsFormsApplication1.Messages", GetType(Form1).Assembly) XtraMessageBox.Show(Me.LookAndFeel, RM.GetString("strDiscardChangesMessage"), RM.GetString("strDiscardChangesCaption"), MessageBoxButtons.YesNoCancel) End Sub
6.完成這些步驟后,如果應用程序在使用 Hebrew的操作系統上運行,則會自動翻譯消息框中的自定義文本。
7.本地化內置按鈕標題,如文檔中所述,這種方法可以幫助您本地化DevExpress控件的所有內置字符串資源。
本主題中描述的方法涉及使用來獲取附屬資源程序集,下載程序集時,找到一個根據所需區域性的縮寫命名的文件夾(例如,他代表希伯來文化),然后將其復制到應用程序可執行文件所在的目錄中,不需要編寫任何代碼,因為應用程序會自動確定當前區域性,并在啟動時加載適當的程序集。下圖顯示了完全翻譯后的消息框。
要測試控件和其他可視元素(包括)如何轉換為特定區域性,可以在應用程序啟動時手動啟用該區域性。
C#:
using System.Globalization; using System.Threading; Thread.CurrentThread.CurrentCulture = new CultureInfo("he"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("he");
VB.NET:
Imports System.Globalization Imports System.Threading Thread.CurrentThread.CurrentCulture = New CultureInfo("he") Thread.CurrentThread.CurrentUICulture = New CultureInfo("he")