15

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

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

4

4 回答 4

37

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

  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

于 2012-07-04T11:53:44.323 回答
8

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

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

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

WPF 本地化

WPF 本地化指南 - 白皮书

于 2012-07-04T13:14:45.937 回答
4

只是为了改进@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>
于 2018-01-17T13:21:42.130 回答
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带有翻译的键。

于 2016-07-18T12:23:54.557 回答