CurrentCulture自动重置Xamarin Android

CurrentCulture自动重置Xamarin Android,xamarin,xamarin.android,Xamarin,Xamarin.android,我正在尝试创建一个支持多标签语言的应用程序,其中我有一个允许用户选择语言的设置页面,然后视图模型将使用MessagingCenter发布消息,最后MainActivity将响应此消息 这就是上面提到的代码示例 private async void HandleSelectedLanguageChanged() { if (SelectedLanguage == null || !this.isInitialized) return; MessagingCente

我正在尝试创建一个支持多标签语言的应用程序,其中我有一个允许用户选择语言的设置页面,然后视图模型将使用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();
}
维护性

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中的代码进行了简化 问题有一些特定于设备的文化配置 与这个问题无关,我也确定 selectedCulture包含预期的区域性,即创建代码 这个物体与这个问题无关

奇怪的是,文化只在我导航到的第一个页面上改变,而在应用程序中的每一个页面上都会恢复。 下面是我用于此目的的翻译标记扩展的代码

[内容属性(“文本”)] 公共类BaseTransateExtension:IMarkupExtension { 私有字符串_resourceId; 私有类型_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似乎只在第一页设置为新的区域性,对于其他每一页,它都是相同的旧值,这很奇怪,因为它是一个静态属性,我确信在代码中的其他任何地方都没有设置它

我在Android资源中没有语言字符串,但在(old?)中没有也许这就是为什么我可以使用以下解决方案:还可以设置默认线程的区域性

string cultureCode = GetUserRequestedAppCultureCode(); // For example: "en-US".
var selectedCulture = new CultureInfo(cultureCode);
CultureInfo.DefaultThreadCurrentCulture = selectedCulture;
CultureInfo.DefaultThreadCurrentUICulture = selectedCulture;
CultureInfo.CurrentCulture = selectedCulture;
CultureInfo.CurrentUICulture = selectedCulture;

对于Xamarin.Android,在(每个)站点上运行此代码就足够了仅适用于应用程序启动。您也可以在运行时以这种方式切换语言,而无需重新启动应用程序。

您可以创建
BaseActivity
并重写方法
attachBaseContext
。该方法将在
OnCreate
之前调用。然后更改其中的语言。@LucasZhang MSFT刚刚尝试过,但没有成功,问题是,如果我重新启动应用程序,新的区域性加载很好,问题是它在runtimeCheck@LucasZhang MSFT上似乎不起作用,谢谢,这种方式起作用了;但是,它在娱乐期间导致屏幕变暗,给人一种应用程序崩溃的印象,在我的情况下,应用程序很快就会重新加载我可以接受这种效果,但其他人可能不会