CurrentCulture автоматически сбрасывает Xamarin Android - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь создать приложение, поддерживающее многоуровневые языки, на котором у меня есть страница настроек, позволяющая пользователю выбрать язык, затем модель представления опубликует 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 свойство, которое, я уверен, нигде не установлено в коде

...