PrimuS
PrimuS

Reputation: 2683

Change Language/Resource programmatically w/ WPF

I have a DropDown (using MahApps if that is important) that I'd like to use to switch the language "on the fly" in my program.

Language Class

namespace SAM
{
    public class Language
    {
        public string Title { get; set; }
        public string Culture { get; set; }
    }
}

Change Language

private void DropLanguage_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    Language lang = DropLanguage.SelectedItem as Language;
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang.Culture);
}

I have all my strings as resources in Resources.resx (default) and Resources.en.resx (english)

3 issues I don't understand

Upvotes: 3

Views: 2182

Answers (2)

S_D
S_D

Reputation: 236

I tried to solve a similar problem. The simplest solution for me was to move all Window content to UserControl and create an interface for window with method refreshLanguage(). Then I call from the model:

private void SetLanguage(string cultureName)
    {
        var cul = new System.Globalization.CultureInfo(cultureName);
        Properties.Resources.Culture = cul;
        System.Globalization.CultureInfo.DefaultThreadCurrentCulture = cul;
        System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = cul;
        System.Threading.Thread.CurrentThread.CurrentUICulture = cul;
        System.Threading.Thread.CurrentThread.CurrentCulture = cul;

        InitializeHamburgerMenu();
        MainWindowView.RefreshLanguage();
        RaisePropertyChanged("Title");
    }

And RefreshLanguage in Window looks like:

 public void RefreshLanguage()
    {
        GlobalUserControl content = new GlobalUserControl("Views/SettingsPage.xaml");
        ContentPresenter_GlobalUserControl.Content = content;
    }

In my case, UserControl provides navigation, so I passed last navigated URI as parameter. So, if you need to preserve state you can pass it as parameter to new UserControl. Recreating usercontrol cause all strings to reload without window recreation. Maybe good idea would be to call GC.Collect(); here, but depends on your scenario.

About default neutral culture. For me works to call SetLanguage("").

Upvotes: 4

iltzortz
iltzortz

Reputation: 2412

There are 2 things

Thread.CurrentThread.CurrentCulture  

and Thread.CurrentThread.CurrentUICulture

In order to set these valuse use the static method

CultureInfo.GetCultureInfo(String langCode)

where some examples of the parameter langCode are the following strings

"de-DE"
"en-US"

etc.

more info at

https://msdn.microsoft.com/en-us/library/yck8b540(v=vs.110).aspx

So, overall these lines of code sould work for change in German Language:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");

Upvotes: 0

Related Questions