В настоящее время я разрабатываю кроссплатформенное приложение, используя 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, похоже, не работает.
У вас есть идеи, что может мне помочь?
Спасибо.