2015-11-19 7 views
4

Я создаю приложение для Windows Phone 8.1 в SilverLight с Visual Studio 2015. Я создаю многоязычное приложение на английском и арабском языках. Для этого я создал папку Strings в проекте с двумя папками en-US и ar-KW с файлом Resources.resw в каждой папке.Windows Phone 8.1 приложение Многоязычный

Я x: Uid настройка свойств. Например Key:- Actual.Text Value:- Actual

<TextBlock x:Uid="Actual" TextWrapping="Wrap" MaxWidth="65" HorizontalAlignment="Center" /> 

Выше работает очень хорошо. У меня есть combobox с элементами EN и AR. Я запускаю событие SelectionChanged, чтобы изменить язык Но проблема в том, что я останавливаю приложение и запускаю его снова, чем только меняют текст и макет.

Как это сделать во время выполнения без перезагрузки.

private void LanguageComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      string selectedItem = (e.AddedItems[0] as ComboBoxItem).Content as string; 
      var RootFrame = Window.Current.Content as SlideApplicationFrame; 

      if (selectedItem == "EN") 
       ApplicationLanguages.PrimaryLanguageOverride = "en-US"; 
      else if (selectedItem == "AR") 
       ApplicationLanguages.PrimaryLanguageOverride = "ar-KW"; 

      RootFrame.Navigate(this.GetType()); 
    } 

ответ

4

Насколько я помню, Microsoft не рекомендует менять язык во время выполнения (переопределяя его), но вы можете это сделать, перезагрузив страницу. Самый простой способ - поместить ваш combobox с кодом на другую страницу, и там вы переопределите язык, поэтому, когда вы перейдете обратно (и страница будет перезагружена), у вас будет то, что вы хотите. Имейте в виду, что переопределяющий язык не будет локализовать элементы управления во время выполнения (но это не должно быть большой проблемой для вас). Необходимо перезапустить приложение для локализации элементов управления.

При переопределении язык с этим кодом:

ApplicationLanguages.PrimaryLanguageOverride = "xx-XX"; 

, то она сохраняется, и вы не должны переопределить его снова на старте. Приложение будет загружаться с помощью переопределенного языка.

Кроме того, когда вы локализовать приложение хорошо переопределить данные культуры, потому что если у вас есть какие-то даты - они показаны правильно для культуры (например, 12/01/2015 или 01-12-2015)

string lang = "en-US"; //default 
var culture = new CultureInfo(lang); 
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = lang; 
CultureInfo.DefaultThreadCurrentCulture = culture; 
CultureInfo.DefaultThreadCurrentUICulture = culture; 

Есть еще один важный вещь.

В вашем манифесте приложения или том, что у вас есть, вам необходимо установить Сгенерировать набор приложений на «Никогда». Причина в том, что при загрузке упакованной версии в хранилище ваша локализация во время выполнения не будет работать. Вы можете локализовать свое приложение во время исполнения с эмулятором или отладочными версиями или даже иногда с развернутыми версиями релизов. Но вам нужно сделать это, поэтому, когда ваше приложение находится в магазине, тогда нет проблем с локализацией, и все строки для языков могут быть доступны (потому что для упакованной версии некоторые из них могут отсутствовать, если вы не установили язык на вашем телефоне).

0

Если вы хотите, чтобы приложение зависит от языка через пользовательский выбор, вам нужно сохранить этот выбор и прочитать его на старте приложения. Таким образом вы можете изменить ApplicationLanguage при запуске приложения.

Так App.xaml.cs искать метод InitializePhoneApplication() и добавьте следующие строки (или вы могли бы попробовать свой подход здесь с ApplicationLanguages.PrimaryLanguageOverride)

string savedLanguage = string.Empty; 
var hasSavedLanguage = AppSettings.TryGetSetting(Constants.LanguageSettingKey, out savedLanguage); 
if (hasSavedLanguage) 
{ 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(savedLanguage); 
    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture; 
} 

Конечно, вы также должны сохранить язык, когда пользователь выбрал его из combobox

+0

В моем приложении я не могу найти метод InitializePhoneApplication() ' – Milind

+0

Возьмите OnLaunched(), затем ... – Depechie

+0

Это не сработало. Я пытаюсь отлаживать код, когда он переопределяет язык и когда я переориентируюсь. Он не вернется к событию OnLaunched() – Milind

Смежные вопросы