views:

361

answers:

3

I need to support UI language change through the application menu. The texts are localized using resource files (similar to approach 1 here)

if I set the Thread.CurrentThread.CurrentUICulture before the ctor calls to InitializeComponent(), the UI is changed as it should.

However, if the CurrentUICulture is changed during the normal run of the application, the controls are not updated (i.e. the text remains the same, regardless of the current culture).

Is there a way to force the controls to refresh according the the CurrentUICulture?

A: 

Assuming the DataContext for the menu is an object that implements INotifyPropertyChanged, you can refresh all controls by specifying null (nothing) in the PropertyChanged event...

from msdn:

The PropertyChanged event can indicate all properties on the object have changed by using either a null reference (Nothing in Visual Basic) or String.Empty as the property name in the PropertyChangedEventArgs.

IanR
Thanks. However, most of the UI are just static strings, and therefore without any DataContext.
Elad
A: 
foreach(Window win in Application.Current.Windows)
{
    win.InvalidateVisual();
}

This will cause all window and their children to be refreshed. You will have to call this manually after you do your changes to culture.

Akash Kava
Thanks, but it didn't work for me
Elad
+2  A: 

You could use the ResourceDictionary approach along with the DynamicResourceMarkupExtension. Using this approach you can swap out the resource dictionary representing the language the user has selected and the DynamicResourceMarkupExtension will ensure the new value is reflected in the UI.

Also, if you're willing to venture into the realm of a custom solution, there is the LocalizeMarkupExtension which is provided in this WPF tutorial.

Drew Marsh