c#-本地化-在wpf应用程序中更改语言

c#-本地化-在wpf应用程序中更改语言,c#,.net,wpf,C#,.net,Wpf,我正在制作一些wpf应用程序,我需要更改语言的选项。我的解决方案中有一个名为Resorces的文件夹,在那里我存储了所有的resx文件-实际上是language.resx和language.en-en.resx。我的XAML看起来像: <Window x:Class="CoinCatalogue.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="htt

我正在制作一些wpf应用程序,我需要更改语言的选项。我的解决方案中有一个名为Resorces的文件夹,在那里我存储了所有的resx文件-实际上是language.resx和language.en-en.resx。我的XAML看起来像:

<Window x:Class="CoinCatalogue.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CoinCatalogue"
    xmlns:resx="clr-namespace:CoinCatalogue.Resources"
    mc:Ignorable="d"
    Title="{x:Static resx:language.WindowName}" Height="480" Width="640">
<Grid>
    <Menu x:Name="menu" HorizontalAlignment="Left" Height="auto" VerticalAlignment="Top" Width="517">
        <MenuItem x:Name="File" Header="{x:Static resx:language.File}">
            <MenuItem x:Name="Open" Header="{x:Static resx:language.Open}"/>
        </MenuItem>
    </Menu>

</Grid>
但我的应用程序什么也没发生。此行位于InitializeComponent()之前


我做错了什么?我正在使用Visual Studio 2015/以这种方式更改应用程序语言是一个好主意吗?

我认为您是如何更改文化的

我只是将一个快速示例放在一起,其中包含以下resx文件:

Resources.en-US.resx

Resources.fr-fr.resx

Resources.resx

如果我在不尝试更改区域性的情况下运行应用程序,我会从
Resources.en US.resx
文件中获取字符串,因为这是我的默认值。如果我在
InitializeComponent
之前添加此代码,则我的字符串来自
Resources.fr-fr.resx
文件:

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("fr-FR");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("fr-FR");

您的程序如何知道语言正在变化?无论何时更改WPF应用程序中显示的内容,都需要通过调用OnPropertyChanged()让演示文稿知道。您可以通过文本和控件来让应用程序知道需要更新某些内容。如果要更改保存信息以显示给用户的资源,则最有可能需要调用OnPropertyChange以获取所有应更新的文本。我是基于这样的教程:。需要通过OnPropertChanged更改所有控件(它们的标签)?现在,它通过新的编译进行了更改,但总的来说,它在菜单中有可检查选项。是的。该教程还在应用程序启动时设置语言。因此,如果您将其设置在那里,您将在每次应用程序更改时重新构建应用程序。您可能需要花一些时间熟悉MVVM范例。看看这个:这样我可以在运行时更改语言吗?例如,我点击按钮,在it应用程序刷新并使用所选语言后?不,如果您想在运行时执行此操作,我建议使用类似这样的实现。Ok。我试试看。我也试着用你的方式改变文化——什么也没发生。但我发现问题在于文化的名称。它不是与前“fr fr”一起工作,而是与“fr”(名称中没有破折号的任何东西)一起工作。奇怪。。。
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("fr-FR");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("fr-FR");