C# WPF MVVM本地化

vtwuwzda  于 2023-05-08  发布在  C#
关注(0)|答案(1)|浏览(153)

我决定将本地化添加到C# WPF MVVM,在搜索互联网后,我发现了几个选项如何做到这一点,但没有一个在我的情况下工作,因为文件资源不存在后,我命名为lang. en-us. resx。

这是UserControl的代码

xmlns:lang="clr-namespace:tSeracherr.WPF.Languages">

<TextBlock Text="{x:Static lang:Lang.Home}"
           FontSize="28"
           Width="120"
           TextAlignment="Center"
           HorizontalAlignment="Center"
           Margin="5"                  
           Style="{DynamicResource TextBlockInListBox}"/>

我试过这种改变语言的方法,但是不起作用

public ICommand UkrLang
{
    get
    {
            return ChangeLanguage("uk-uk");
    }
}

private ICommand ChangeLanguage(string langCode)
{
    return new DelegateCommand(obj =>
    {
        var culture = new CultureInfo(langCode);
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;
        Process.Start(Process.GetCurrentProcess().MainModule.FileName);
        Application.Current.Shutdown();
    });
}

我也试过这个方法,但我不知道如何正确地完成它,因为我的选项都不起作用。

public ICommand UkrLang
{
    get
    {
        return ChangeLanguage("uk-uk");
    }
}
private ICommand ChangeLanguage(string langCode)
{
    return new DelegateCommand(obj =>
    {
        Properties.Settings.Default.LanguageCode = langCode;
        Properties.Settings.Default.Save();

        // dont now

        Process.Start(Process.GetCurrentProcess().MainModule.FileName);
        Application.Current.Shutdown();
    });
}
at0kjp5o

at0kjp5o1#

您必须保留所选的语言/区域性,以支持应用程序的重新启动。
有一个appliction设置权内置,你只需要使用它们。

当您启动应用程序时,首先要读取该设置并设置区域性。

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        var cultureName = WpfApp.Properties.Settings.Default.CultureName;

        if ( !string.IsNullOrEmpty( cultureName ) )
        {
            var culture = CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo( cultureName );
            CultureInfo.CurrentCulture = culture;
            CultureInfo.CurrentUICulture = culture;

        }
            FrameworkElement.LanguageProperty.OverrideMetadata(
                typeof( FrameworkElement ),
                new FrameworkPropertyMetadata( XmlLanguage.GetLanguage( CultureInfo.CurrentCulture.IetfLanguageTag ) ) );
    }
}

命令代码现在应该如下所示

private ICommand ChangeLanguage(string langCode)
{
    return new DelegateCommand(obj =>
    {
        // write to application settings
        // that path may be different in your app
        WpfApp.Properties.Settings.Default.CultureName = langcode;
        WpfApp.Properties.Settings.Default.Save();
        Process.Start(Process.GetCurrentProcess().MainModule.FileName);
        Application.Current.Shutdown();
    });
}

顺便说一句根据Country Language List有已知的语言代码uk-UA(和主uk)。uk-uk未知。

前两个字母代表语言,后两个字母代表国家。
德语de f.i.德国de-DE,奥地利为de-AT,瑞士为de-CH

相关问题