Как установить язык UWP во время выполнения - PullRequest
0 голосов
/ 23 января 2019

В настоящее время я разрабатываю кроссплатформенное приложение, используя Xamarin.Forms 3.4 и Visual Studio 2017 (последняя версия к настоящему времени).

Поскольку это приложение должно поддерживать несколько языков, которые можно изменить во время выполнения, в настоящее время я ищу способы сделать это. Я уже добавил несколько ресурсов и перевел все элементы интерфейса, что прекрасно работает. Я прочитал эту статью, чтобы начать: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/localization/

На данный момент, при использовании приложения UWP, язык автоматически устанавливается на мои текущие настройки системы, то есть на немецкий язык, даже если язык приложения по умолчанию - английский. Это хорошо.

Теперь у меня есть метод, который настраивает мой текущий язык путем установки нескольких сведений, например, объекта CultureInfo по умолчанию. Этот метод выглядит следующим образом:

    public void UpdateAppLanguage()
    {
      CultureInfo ci;
      Language l;

      // storage is a class containing several persistent information, like
      // the language selected by the user to be used
      // the Local attribute states if the language is actually present on
      // the current user's system
      if(Storage.GetCurrentLanguage().Local == true)
      {
        // language is present locally, so the user wants to use that one for
        // the interface
        ci = new CultureInfo(Storage.GetCurrentLanguage().Code);
        AppResources.Culture = ci;
        CultureInfo.CurrentCulture = ci;
        CultureInfo.CurrentUICulture = ci;
        CultureInfo.DefaultThreadCurrentCulture = ci;
        CultureInfo.DefaultThreadCurrentUICulture = ci;
        DependencyService.Get<ILocalize>().SetLocale(ci); // set the Thread for locale-aware methods
      }
      else
      {
        // no preferences available yet, use the system's current ci
        if (Device.RuntimePlatform != Device.UWP)
          ci = DependencyService.Get<ILocalize>().GetCurrentCultureInfo();
        else
          ci = CultureInfo.CurrentCulture;

        l = new Language{
          Name = ci.EnglishName,
          Code = ci.TwoLetterISOLanguageName
        };

        Storage.SetCurrentLanguage(l);
        CultureInfo.CurrentCulture = ci;
        CultureInfo.CurrentUICulture = ci;
        AppResources.Culture = ci; // set the RESX for resource localization
        DependencyService.Get<ILocalize>().SetLocale(ci); // set the Thread for locale-aware methods
     }
    }

В настоящее время я тестирую с набором языков, и этот язык является английским.

А вот реализация службы зависимостей для подпроекта UWP:

  public class Localize : stereopoly.ILocalize
  {
    public void SetLocale (CultureInfo ci)
    {
      //Windows.Globalization.ApplicationSettings.PrimaryLanguageOverride = ci.Name;
      Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "EN-US";
      Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
      Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
    }

    public CultureInfo GetCurrentCultureInfo ()
    {
      return null;
    }
  }

Как видите, я также пытался принудительно установить язык EN-US, что тоже не работает. Я вызываю метод UpdateAppLanguage () еще до запуска начального метода Application.InitializeComponent (), я также пытался вызвать его в методе события OnStart (), ни один из них не работает.

Я бы ожидал, что изменение языка будет применено, поскольку оно выполнено еще до запуска самого приложения, но я могу переключать несколько страниц моего приложения так часто, как я хочу, язык всегда будет немецким, независимо от того, что я делаю , Я нашел несколько ответов на этот вопрос для простых приложений UWP, но не для реализаций Xamarin.Forms проектов UWP, и здесь, похоже, проблема, потому что никакой другой намек на чистые приложения UWP, похоже, не работает.

У вас есть идеи, что может мне помочь?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я наконец нашел ответ на свою проблему, он был таким же простым, как обычно, когда дело доходит до таких ошибок.Оказывается, что все проекты начальной загрузки, такие как подпроекты UWP, iOS и Android, также наследуют нейтральный язык сборки от родительского проекта, независимо от того, какая конфигурация определена в конкретном подпроекте (по крайней мере, именно так он работает для UWP),Я только что заметил, что могу установить Нейтральный язык сборки в настройках моего основного проекта .Net, и как только я это сделал, все предупреждения исчезли, и мое приложение UWP показало английский текст вместо системного немецкого по умолчанию.Теперь я также могу переключиться обратно на немецкий, хотя мне все еще нужно перезапустить приложение, чтобы перевести все кадры, но это не такая большая проблема, я могу поработать над этим позже.Вот ссылка, которая, наконец, меня охватила: Xamarin.Forms: локализация приложения UWP

Спасибо за вашу удивительную помощь в любом случае:).

0 голосов
/ 23 января 2019

Убедитесь, что вы нацелены как минимум на UWP 16299 (FCU), потому что до этой версии у UWP были проблемы с правильным переключением языков в режиме отладки.Однако, если вы работаете в режиме Release, оно должно работать нормально.

Кроме того, приложению UWP необходимо знать, что оно поддерживает данный язык, поскольку оно генерируется во время компиляции (с использованием <Resource Language="x-generate"/> в Package.appxmanifest).

Вы можете сделать это, добавив папку Strings в свой проект UWP, а затем добавив несколько подпапок - по одной для каждого поддерживаемого языка.Наконец, в каждом из них добавьте файл Resources.resw (щелкните правой кнопкой мыши папку, Добавить> Новый элемент ..., Файл ресурсов (RESW)).Результат будет выглядеть следующим образом.

RESW folders

Затем внутри каждого файла RESW добавьте некоторый ресурс.Я обычно добавляю AppName, как я часто локализую его:

Resource

После этого приложение должно понять, что выподдержка данного языка и отображение локализовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...