Silverlight i lokalizowanie interfejsu graficznego

Po przeszukaniu kilku stron na temat lokalizowania w Silverlight mam pewną krótką ale dość skuteczną metodę na ten problem. Tworzymy sobie zasoby zawierające tekst oraz zlokalizowane zasoby z identyfikatorami kultur które obsługujemy



Ustawiamy opcjach edytora zasobów dla zasobu którego będziemy się odwoływać (w tym przypadku dla pliku ApplicationStrings.resx ) pole Access Modifier na Public w pozostałych plikach dla poszczególnych kultur na No code generation ponieważ nie jest nam potrzebny ich wygenerowany kod (menadżer zasobów wgrywa odpowiedni plik dla wybranej kultury)

Stworzyłem sobie klasę która zawiera zasób z łańcuchami oraz ma zaimplementowany interfejs INotifyPropertyChanged który będzie informował o zmianach jakie zajdą w przypadku zmiany kultury


using System.ComponentModel;

public class LocalizationString : INotifyPropertyChanged
{
#region Fields
private static GameOfLife.Assets.Resources.ApplicationStrings _strings = new GameOfLife.Assets.Resources.ApplicationStrings();
#endregion Fields
#region Events
public event PropertyChangedEventHandler PropertyChanged;
#endregion Events
#region Properties
public GameOfLife.Assets.Resources.ApplicationStrings Strings
{
get
{
return _strings;
}
set
{
_strings = value;
OnPropertyChanged("Strings");
}
}
#endregion Properties
#region Methods
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion Methods
}

Następnie umieszczamy tą klase jako zasób aplikacji aby była dostępna dla całej aplikacji

<ResourceDictionary>
<res:LocalizationString x:Key="LocalizationString" />
</ResourceDictionary>

Następnie podpinamy poprzez wyrażenie bindowania kontrolkach:

<Button x:Name="PrepareButton" Content="{Binding Path=Strings.PrepareButton, Source={StaticResource LocalizationString}}" />

Co daje nam taka konstrukcja ? Ano daje nam to że zmieniając właściwość Strings w klasie LocalizationString wszystkie kontrolki mające odwołanie do tej właściwości zostaną automatycznie zaktualizowane i wyświetlą tekst zgodnie z wybraną kulturą.

Przykładowy kod który uruchomi ten mechanizm to :

LocalizationString localizationString = Application.Current.Resources["LocalizationString"] as LocalizationString;
if (localizationString != null)
{
CultureInfo newCulture = new CultureInfo(lang);
Thread.CurrentThread.CurrentCulture = newCulture;
Thread.CurrentThread.CurrentUICulture = newCulture;
ApplicationStrings.Culture = newCulture;
localizationString.Strings = new GameOfLife.Assets.Resources.ApplicationStrings();
}

0 komentarze:

Prześlij komentarz