Я пытаюсь создать приложение, поддерживающее многоуровневые языки, на котором у меня есть страница настроек, позволяющая пользователю выбрать язык, затем модель представления опубликует sh сообщение с использованием MessagingCenter, а затем, наконец, MainActivity ответит на это сообщение
, и это пример кода для вышеупомянутого
private async void HandleSelectedLanguageChanged()
{
if (SelectedLanguage == null || !this.isInitialized)
return;
MessagingCenter.Send(this, Constants.LanguageChanged, SelectedLanguage);
ShowLoading();
await Task.Delay(1000);
await NavigationService.NavigateAsync($"/{Routes.Landing}/{CallbackPage ?? Routes.Login}");
HideLoading();
}
MainAcitivty
CultureInfo.CurrentCulture = selectedCulture;
CultureInfo.CurrentUICulture = selectedCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = selectedCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = selectedCulture;
var selectedCulture = Common.Settings.Settings.CurrentCultureInfo.ToDescriptionString().Split('-');
if (selectedCulture.Length == 2)
{
var selectedLang = selectedCulture[0];
var selectedCountry = selectedCulture[1];
var locale = new Java.Util.Locale(selectedLang, selectedCountry);
Java.Util.Locale.Default = locale;
var config = new Android.Content.Res.Configuration { Locale = locale };
Resources.UpdateConfiguration(config, BaseContext.Resources.DisplayMetrics);
}
код в MainActivity был упрощен для целей этого вопроса есть некоторые специфичные для устройства c культурные конфигурации, которые не имеют отношения к этому вопросу, также я убедился, что selectedCulture содержит предполагаемую культуру, код создания этого объекта не имеет отношения к этому вопросу.
Странно то, что культура меняется только для первой страницы, на которую я перехожу, и возвращается к предыдущей странице в приложении. Вот код для перевода MarkupExtension, который я использую для этого
[ContentProperty ("Text")] publi c class BaseTranslateExtension: IMarkupExtension {private string _resourceId; private Type _assemblyType;
public BaseTranslateExtension(string resourceId, Type assemblyType)
{
_resourceId= resourceId;
_assemblyType = assemblyType;
}
public string Text { get; set; }
public object ProvideValue(IServiceProvider serviceProvider)
{
if (Text == null)
return null;
ResourceManager resourceManager = new ResourceManager(_resourceId, _assemblyType.GetTypeInfo().Assembly);
return resourceManager.GetString(Text, CultureInfo.CurrentCulture);
}
}
Кажется, что CurrentCulture настроен только на новую культуру только для первой страницы, для каждой другой страницы это просто то же самое старое значение, что странно, так как это состояние c свойство, которое, я уверен, нигде не установлено в коде