多语言 WPF 应用程序

19

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

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

4个回答

44
你可以按照以下步骤操作:
  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>

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

  • 添加资源(在启动您的应用程序时调用此函数)

  • 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);
    }
    
  • 使用资源的方法如下 -

    <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


    在将所有文本存储到数据库中时非常有用。谢谢! - BendEg
    2
    最简单的实现WPF多语言应用程序的方法 - Nick
    动态资源在设计时无法解析。因此我认为这是这种解决方案的缺点。 - DrMarbuse
    我尝试了这个解决方案,它可以工作,但是我收到了一个警告错误,说无法解析资源登录。我已经尝试重新构建、清理解决方案、重启VS,但仍然收到此警告。我需要在app.xaml之类的地方声明我的资源吗?还是有什么我忘记做的事情? - Steeven_b
    var existedDict = Resources.MergedDictionaries.Where(d => d.Source.OriginalString == dict.Source.OriginalString).FirstOrDefault(); if (existedDict != null) { Resources.MergedDictionaries.Remove(existedDict); } - Hanabi
    显示剩余2条评论

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

    另外,请查看以下文章,详细了解如何在WPF中使用Resx文件进行本地化 -

    使用ResX文件本地化WPF应用程序

    WPF本地化

    WPF本地化指南-白皮书


    5

    为了完善@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>
    

    3
    我有些困惑,不太明白为什么您认为需要静态定义要合并的资源字典才能改进Aghilas的答案?第2步中定义的方法的最后一行代码应该确保正确的资源字典被添加到已合并的字典列表中,难道不是吗?this.Resources.MergedDictionaries.Add(dict); - Mitselplik

    1
    如果您想使用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 的键和相应的翻译。

    语言选择是如何工作的? - undefined

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接