如何在多文化应用程序中为非基于表单的接口启用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")