Локализация приложения Silverlight с использованием ресурсов - PullRequest
6 голосов
/ 19 января 2012

У меня проблема с локализацией приложения Silverlight с использованием ресурсов. Я хотел сделать мой многоязычный механизм кроссплатформенным, поэтому я поместил все локализуемые ресурсы в проект типа Portable Class Library. В этом проекте я создал два файла ресурсов Localization.resx и Localization.en.resx и я устанавливаем и «модификатор доступа» для public в обоих файлах. Затем я создал прокси-класс с именем «LocalizationProxy», который является прокси-классом для включения привязок.

public class LocalizationProxy : INotifyPropertyChanged
{
    public Localization LocalizationManager { get; private set; }

    public LocalizationProxy()
    {
        LocalizationManager = new Localization();
    }

    public void ResetResources()
    {
        OnPropertyChanged(() => LocalizationManager);
    }


    #region INotifyPropertyChanged region
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged<T>(Expression<Func<T>> selector)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(GetPropertyNameFromExpression(selector)));
        }
    }

    public static string GetPropertyNameFromExpression<T>(Expression<Func<T>> property)
    {
        var lambda = (LambdaExpression)property;
        MemberExpression memberExpression;

        if (lambda.Body is UnaryExpression)
        {
            var unaryExpression = (UnaryExpression)lambda.Body;
            memberExpression = (MemberExpression)unaryExpression.Operand;
        }
        else
        {
            memberExpression = (MemberExpression)lambda.Body;
        }

        return memberExpression.Member.Name;
    }
    #endregion
}

На следующем шаге я изменил файл Silverlight csproj и добавил культуру «en» для поддерживаемых типов

<SupportedCultures>en</SupportedCultures>

Кроме того, в ресурсах приложения я создал и экземпляр класса LocalizationProxy

 <Application.Resources>
        <Localization:LocalizationProxy x:Key="LocalizationProxy"></Localization:LocalizationProxy>
    </Application.Resources>

Я также изменил «Нейтральный язык» в информации о сборке на «Польский» - это должен быть язык приложения по умолчанию. На последнем шаге я вывел некоторые значения из вида на ресурсы

<TextBlock TextWrapping="Wrap" x:Name="PageTitle" Text="{Binding Source={StaticResource LocalizationProxy},Path=LocalizationManager.Title,Mode=TwoWay}" />

К сожалению, несмотря на то, что Thread.CurrentThread.CurrentCulture является «pl-PL», мое приложение все еще на английском языке. Однако, если я использую тот же код в приложении Windows Phone, все работает нормально - я даже могу изменить язык приложения во время выполнения , Есть ли разница в локализации приложения Silverlight и локализации приложений Windows Phone?

Вот мое заявление

http://www.fileserve.com/file/TkQkAhV/LocalizationSolution.rar

Как я уже говорил, локализация в Windows Phone работает нормально, но в приложениях Silverlight ярлыки не переводятся

Ответы [ 2 ]

0 голосов
/ 09 апреля 2013

убедитесь, что вы сделали все шаги ниже.

Создайте ViewModel Класс

Реализация интерфейса INotifyPropertyChanged :

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Создайте свойство, которое будет возвращать правильный язык:

    public object MainResourcesSmart
    {
        get
        {
            var myCulture = Thread.CurrentThread.CurrentUICulture.Name.ToUpper();
            switch (myCulture)
            {
                case "EN-US":
                    return new MyResourceEn();
                case "ES-AR":
                    return new MyResourceEs();
                default:
                    return new MyResource();
            }
        }
    }

Установить все ресурсы общедоступными

Используйте метод ниже, чтобы обновлять его на экране каждый раз, когда вы меняете язык:

    private void MainResourcesSmartRefresh()
    {
        OnPropertyChanged("MainResourcesSmart");
    }

Свяжите ViewModel с View (MainPage), например:

    public MyViewModel ViewModel
    {
        get { return (MyViewModel)DataContext; }
        set { DataContext = value; }
    }

    public MainPage()
    {
        ViewModel = new MyViewModel();
    }

Свяжите свойство Resouce с вашим UserControl как:

  <TextBlock Height="20" HorizontalAlignment="Left" VerticalAlignment="Bottom" Foreground="#7F4F8AB2" FontSize="10.667" Text="{Binding MainResourcesSmart.NameOfTheCompany}" FontFamily="Trebuchet MS" />
0 голосов
/ 08 февраля 2012

Вы должны использовать полностью квалифицированные коды ISO 3166 и 639 в сочетании с дефисом, как описывает Rumplin .

см

...