Как изменить язык приложения Windows Phone во время выполнения? - PullRequest
3 голосов
/ 04 августа 2011

Я следовал этому примеру для создания многоязычного приложения: Как: создать локализованное приложение для Windows Phone .

Я успешно связал данные ресурса с текстом следующим образом:

<TextBlock x:Name="ApplicationTitle" Text="{Binding Path=MultiLangResources.Mainpage_Welcome, Source={StaticResource MultiLang}}"/>

И я попытался изменить Thread.CurrentThread.CurrentUICulture, и я могу вывести правильный ключ с кодом:

ApplicationTitle.Text = LangResource.Mainpage_Welcome;

Однако связанный текст никогда не обновляется.

Как заставить связанный текст обновляться как обычный bind?

Кто-нибудь может мне помочь с этой проблемой? Я тоже попробовал это без удачи.

public class MultiLang : INotifyPropertyChanged
{
    public MultiLang()
    {
    }

    private static MLTest.LangResource multiLangResources = new GigapodV2.LangResource();

    public MLTest.LangResource MultiLangResources
    {
        get { return multiLangResources; }
        set
        {
            if (value != multiLangResources)
            {
                multiLangResources = value;
                NotifyPropertyChanged("MultiLangResources");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 10 мая 2013

Это легко сделать:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("ca-ES");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ca-ES");

Основная проблема заключается в том, что текст на всех страницах, которые УЖЕ загружены (например, на главной странице, если вы поставите язык там)необходимо "обновить вручную".

Но это легко сделать программно:

this.btnChangeLanguage.Content = AppResources.Txt_Aceptar;
3 голосов
/ 04 августа 2011

Класс LangResource сам по себе не наблюдается, поэтому никакие связанные с ним свойства не будут соблюдаться. Кроме того, телефон не будет уведомлять все свойства, связанные с CurrentCulture, только потому, что вы меняете его на лету.

В противном случае изменение языка потребует перезагрузки вашего приложения. Но я бы посоветовал вам быть осторожным с этим, так как сама ОС допускает обмен языками, а это означает, что у вас должна быть действительно веская причина, чтобы ваше приложение позволяло себе это.

Решение заключается в создании класса-оболочки, который уведомляет все свойства, которые они обновили, при изменении CurrentCulture. Использование NotifyPropertyWeaver атрибута Саймона [DependsOn], вероятно, может сделать это очень просто.

...