跳至正文
首页 » 博客 » Internationalizing and Localizing .NET Desktop Applications

Internationalizing and Localizing .NET Desktop Applications

导言

本博客将提供两个国际化和本地化的示例。NET平台-Windows窗体和WPF。尽管语法略有不同,但方法相似。在ASP.NET中可以使用类似的方法。在HTML5和JavaScript中,经常使用第三方库,事情变得非常不同。

项目概况

我们将在Windows Forms和WPF中创建的项目是一个非常简单的UI,带有一个标签和一个下拉菜单。仅使用这些元素,我们可以演示国际化的以下方面:

  1. 字符串在外部文件
  2. 修改UI布局
  3. 一种替代检查字符串相等性

Windows窗体示例

    1. 在Visual Studio中,创建一个新的Windows窗体项目。

    2. 从 “工具箱” 的 “公共控件” 部分,添加一个Label和一个ComboBox。将它们命名为lblQuestion和cmbColor。
    3. 将标签的Text属性设置为 “您最喜欢的颜色是什么?”。我们可以垂直放置UI,而不是水平放置。这将为问题的翻译留出更多空间,因为英语中的间距很紧,其他语言可能会有更长的字符串,这会截断。


    4. 通过后面的代码向ComboBox添加一些颜色,而不是直接向设计器中的Items属性添加字符串。这样做是为了可以有一个与每个项目相关联的值属性,而不是只有文本。

      cmbColor.DisplayMember = "Text";cmbColor.ValueMember = "Value";var颜色 = 新 [] {new { Text = "Red", Value = "red" },new { Text = "Blue", Value = "blue" },新 {Text = "黄色",值 = "黄色"},new { Text = "Green", Value = "green" },new { Text = "Pink", Value = "pink"}};cmbColor.DataSource = 颜色;
    5. 将代码添加到SelectedValueChanged事件以检查用户是否选择了绿色下拉项。请注意,这使用 “SelectedValue”,而不是 “SelectedText”,这就是为什么我们必须在代码中设置项目,以包含一个不会根据区域设置更改的值。

      private void cmbColor_SelectedValueChanged (对象发件人,EventArgs e){if (字符串) cmbColor.SelectedValue = = "green"){MessageBox.Show (“绿色也是我最喜欢的颜色!”);}}
    6. 现在我们已经设置好了一切,让我们外部化UI字符串资源。这可以在初始设计之前或之后完成,因为Visual Studio可以为您处理任何一种方式。

      1. 将窗体的Localizable属性设置为true。这将为您设置表单资源文件。
      2. 在 “解决方案资源管理器” 中,打开Form1.resx文件。你可以看到这个问题已经被添加到这里。
      3. 您可以复制此文件,根据目标区域设置的区域性代码重命名副本,然后将其添加到项目中。我用日语 (ja) 作为一个例子。
      4. 在目标区域设置的文件中,您可以删除以 “>>” 开头的任何条目,因为这些条目不需要重复。您还可以删除 “其他” 下的任何条目,以及您不打算更改的任何图像,图标,文件等。然后你可以翻译这个问题。
    7. 这不会在后面的代码中的任何工作,因为Form1.resx文件是由设计器自动生成。如果你添加的东西。设计器中不存在的resx文件,然后更改设计器,它将删除您添加的内容。相反,对于后面的代码,让我们向项目添加一个单独的资源文件。

      1. 在后面的代码中添加消息的键和值。在这里也添加颜色。
      2. 复制、重命名文件并将其添加到项目中。
      3. 从后面的代码翻译条目。
      4. 将后面代码中的硬编码字符串替换为对此资源文件的引用。您可能需要重建才能看到intellisense。

        private void cmbColor_SelectedValueChanged (对象发件人,EventArgs e){if (字符串) cmbColor.SelectedValue = = "green"){MessageBox.Show(Strings.favoriteColorMatch);}}
        var colors = new[] {新 {Text = Strings.colorRed,Value = "red"},new { Text = Strings.colorBlue, Value = "blue" },新 {Text = Strings.colorYellow,Value = "黄色"},新 {Text = Strings.colorGreen,Value = "green"},新 {Text = Strings.colorPink,Value = "pink"}};
    8. 生成并运行项目。

您可以在InitializeComponent之前在构造函数中使用以下代码来测试其他区域设置:

System.Threading.Thread.CurrentThread.CurrentUICulture =新System.Globalization.CultureInfo("ja"); 

WPF示例

      1. 在Visual Studio中,创建一个新的WPF项目。
      2. 从 “工具箱” 的 “通用WPF控件” 部分,向XAML文件的 “ <Grid> ” 部分添加Label和ComboBox。将它们命名为lblQuestion和cmbColor。将标签的Content属性设置为 “您最喜欢的颜色是什么?”。您可以在堆栈面板中垂直排列它们,这将为本地化文本提供更多空间。

        <网格><StackPanel VerticalAlignment = "Center"><Label Content = “你最喜欢的颜色是什么?”HorizontalAlignment = "Center"Name = "lblQuestion" /><ComboBox HorizontalAlignment = "Center" Name = "cmbColor" Width = "120" /></StackPanel></Grid>
      3. 使用设计器将项添加到ComboBox。设置文本的内容和值的标签。生成的XAML将如下所示:

        <ComboBox HorizontalAlignment = "Center" Name = "cmbColor" Width = "120"DropDownClosed = "cmbColor_DropDownClosed"><ComboBoxItem Content = "Red" Tag = "red" /><ComboBoxItem Content = "Blue" Tag = "blue" /><ComboBoxItem Content = "Yellow" Tag = "yellow" /><ComboBoxItem Content = "Green" Tag = "green" /><ComboBoxItem Content = "Pink" Tag = "pink" /></ComboBox>
      4. 将代码添加到DropDownClosed事件以查看用户是否选择了绿色下拉列表项。请注意,我们将检查Tag属性,而不是Content属性,以避免国际化问题。

        private void cmbColor_DropDownClosed(object sender, EventArgs e){ComboBoxItem cbi = (ComboBoxItem)cmbColor.SelectedItem;if (cbi.Tag.ToString() = = "green"){MessageBox.Show(Properties.Resources.favoriteColorMatch);}}
      5. 现在我们已经设置好了一切,让我们外部化UI字符串资源。

        1. 打开项目附带的Resources.resx文件。
        2. 添加问题的键和值,代码后面的消息和颜色。
        3. 复制、重命名文件并将其添加到项目中。
        4. 从后面的代码翻译条目。
        5. 将XAML文件中的硬编码字符串和后面的代码替换为对此资源文件的引用。首先,将命名空间声明添加到XAML文件中。
          xmlns:resx = "clr-namespace:WPFI18N.Properties"

          确保已将资源文件的访问修饰符设置为Public。

          ,则可以在XAML中使用该文件的绑定。

          <Label Content = "{x:Static resx:Resources.question}"HorizontalAlignment = "Center" Name = "lblQuestion" /><ComboBox HorizontalAlignment = "Center" Name = "cmbColor" Width = "120"DropDownClosed = "cmbColor_DropDownClosed"><ComboBoxItem Content = "{x:Static resx:Resources.colorRed}"Tag = "red" /><ComboBoxItem Content = "{x:Static resx:Resources.colorBlue}"Tag = "blue" /><ComboBoxItem Content = "{x:Static resx:Resources.colorYellow}"标签 = “黄色”/><ComboBoxItem Content = "{x:Static resx:Resources.colorGreen}"标签 = “绿色”/><ComboBoxItem Content = "{x:Static resx:Resources.colorPink}"Tag = "pink" /></ComboBox>后面的代码中的

          :

        6. MessageBox.Show(Properties.Resources.favoriteColorMatch);
      6. 生成并运行项目。

您可以在InitializeComponent之前在构造函数中使用以下代码来测试其他区域设置:

System.Threading.Thread.CurrentThread.CurrentUICulture =新System.Globalization.CultureInfo("ja"); 

结论

在这两个示例中,我们演示了如何在设计桌面应用程序时考虑文本,布局和比较。

对于测试,您还可以更改CurrentCulture,这将影响日期和数字格式等内容。这在我们的简单示例中不适用,但会影响更完整的应用程序。

请注意,即使使用另一种语言,该消息也仅在选择绿色项目时才显示。这就是为什么我们没有比较所选项目的文本 — 这样我们就不用担心它不起作用了。

通过尽早计划国际化,我们使自己不必在开发周期的后期更改UI的布局或更改比较逻辑。</p