【问题标题】:multilingual wpf application多语言 wpf 应用程序
【发布时间】:2012-07-04 21:13:12
【问题描述】:

我有一个 WPF 应用程序(英文),我想让用户选择不同的语言。我已经阅读了一些在运行时应用程序中更改语言的可能性,但我只想在安装期间选择一种语言并且永远不会更改它。

您认为最快和最简单的方法是开发不同版本的程序(仅更改文本语言)并让用户在安装过程中选择其中一个?可能重复代码只更改文本框或标签不是很优雅,但请注意我的应用程序是用英文完成的,我不需要在运行时更改语言。

【问题讨论】:

    标签: c# .net wpf multilingual


    【解决方案1】:

    您可以按照以下步骤操作:

    1. 创建资源文件

      将此文件 StringResources.xaml 添加到 Resources 目录。这是一个例子:

      <ResourceDictionary 
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:system="clr-namespace:System;assembly=mscorlib">
      
           <system:String x:Key="close">Close</system:String>
      </ResourceDictionary>
      

      您可以创建多个文件,每个文件对应一种语言。

    2. 添加资源(启动应用程序时调用它)

      private void SetLanguageDictionary()
      {
           ResourceDictionary dict = new ResourceDictionary();
           switch (Thread.CurrentThread.CurrentCulture.ToString())
           { 
             case "en-US":
               dict.Source = new Uri("..\\Resources\\StringResources.xaml", UriKind.Relative);
               break;
             case "fr-CA":
               dict.Source = new Uri("..\\Resources\\StringResources.fr-CA.xaml", UriKind.Relative);
               break;
             default :
               dict.Source = new Uri("..\\Resources\\StringResources.xaml",UriKind.Relative);
               break;
           }
           this.Resources.MergedDictionaries.Add(dict);
      }
      
    3. 像这样使用资源 -

      <Button      
         x:Name="btnLogin"
         Click="btnLogin_Click"
         Content="{DynamicResource close}"
         Grid.Row="3"
         Grid.Column="0" 
         Padding="10" />
      

    来源:https://www.codeproject.com/Articles/123460/Simplest-Way-to-Implement-Multilingual-WPF-Applica

    【讨论】:

    • 在将所有文本存储在数据库中时非常有用。谢谢!
    • 动态资源在设计时未解析。所以在我看来,这是这个解决方案的一个缺点。
    • 我试过这个解决方案,它可以工作,但是我有一个警告错误,说无法解决资源登录,我尝试重建,清理解决方案,重新启动 VS,仍然得到这个警告.我是否必须在 app.xaml 之类的地方声明我的资源,还是有什么我忘了做的?
    • @Steeven_b - 该示例可能需要小幅更新。它在步骤 1 中定义了一个名为“close”的字符串资源,但随后在步骤 3 中尝试定位并使用名为“login”的资源。
    【解决方案2】:

    我认为Aghilas提出的解决方案很好;但是您可以在第 3 步中使用StaticResource 而不是使用DynamicResource,在您的情况下不需要DynamicResource,因为您不会在应用程序运行时更改语言。

    还可以查看这些文章,其中包含有关在 WPF 中使用 Resx 文件进行本地化的详细信息 -

    Localizing a WPF Application with ResX Files

    WPF Localization

    WPF Localization Guidance - Whitepaper

    【讨论】:

      【解决方案3】:

      为了改进@AghilasYakoub的正确答案,我想我需要指出的是,除了他所说的之外,应该将以下代码添加到文件App.xaml中:

      <Application.Resources>
          <ResourceDictionary>
              <ResourceDictionary.MergedDictionaries>
                  <ResourceDictionary Source="Resources/StringResources.xaml"/>
                  <ResourceDictionary Source="Resources/StringResources.fr-CA.xaml"/>
              </ResourceDictionary.MergedDictionaries>
          </ResourceDictionary>
      </Application.Resources>
      

      【讨论】:

      • 我有点困惑,为什么您觉得需要静态定义要合并的资源字典来改进 Aghilas 的答案?步骤 2 中定义的方法的最后一行代码应该确保将正确的资源字典添加到合并字典列表中,不是吗? this.Resources.MergedDictionaries.Add(dict);
      【解决方案4】:

      如果您想使用 RESX 文件而不是资源字典,您可以使用 XAML 中的静态引用轻松完成。

      <Window x:Class="MyApp.MainWindow"
                      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                      xmlns:res="clr-namespace:MyApp.Resources">
          <Button Text="{x:Static res:MainWindow.MyTestKey}">
      </Window>
      

      Resource 文件夹中有 MainWindow.resxMainWindow.de.resx 等,每个文件都包含一个带有翻译的键 MyTestKey

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 2015-12-14
        • 1970-01-01
        相关资源
        最近更新 更多