多语种wpf应用程序

Car*_*llo 10 .net c# wpf multilingual

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

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

Agh*_*oub 28

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

  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>
    
    Run Code Online (Sandbox Code Playgroud)

    您可以创建多个文件,每种语言一个.

  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);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用资源,像这样 -

    <Button      
       x:Name="btnLogin"
       Click="btnLogin_Click"
       Content="{DynamicResource close}"
       Grid.Row="3"
       Grid.Column="0" 
       Padding="10" />
    
    Run Code Online (Sandbox Code Playgroud)

  • 来源:http://www.codeproject.com/Articles/123460/Simplest-Way-to-Implement-Multilingual-WPF-Applica (2认同)

akj*_*shi 5

我认为Aghilas提出的解决方案很好; 但是你可以使用StaticResource而不是DynamicResource在步骤3 中使用,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>
Run Code Online (Sandbox Code Playgroud)

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