【问题标题】:CurrentCulture Resets Automatically Xamarin AndroidCurrentCulture 自动重置 Xamarin Android
【发布时间】:2020-07-23 17:49:33
【问题描述】:

我正在尝试创建一个支持多标签语言的应用程序,其中我有一个允许用户选择语言的设置页面,然后 View Model 将使用 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 包含预期的文化,创建的代码 此对象与此问题无关。

奇怪的是,文化只在我导航到的第一个页面发生变化,并在应用程序中的每个其他页面恢复。 这是我用于此的翻译 MarkupExtension 的代码

[内容属性(“文本”)] 公共类 BaseTranslateExtension : 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 似乎只设置为第一页的新文化,对于其他所有页面,它只是相同的旧值,这很奇怪,因为它是一个静态属性,我确信它不会在其他任何地方设置在代码中

【问题讨论】:

  • 你可以创建一个BaseActivity并重写方法attachBaseContext。它将在OnCreate之前调用。然后更改其中的语言。
  • @LucasZhang-MSFT 刚刚尝试过,但没有成功,如果我重新启动应用程序,新的文化加载就好了,问题是它似乎不起作用运行时
  • @LucasZhang-MSFT 谢谢,那种工作;但是,它在游戏过程中导致屏幕变暗,给人的印象是应用程序崩溃了,应用程序重新加载不需要很长时间,所以在我的情况下我可以接受这种效果,但其他人可能不会

标签: xamarin xamarin.android


【解决方案1】:

我在 Android 资源中没有语言字符串,但在(旧的?) resx 文件中。也许这就是我可以使用以下解决方案的原因:同时设置默认线程的文化。

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,仅在(每个)应用启动时运行此代码就足够了。您还可以在运行时通过这种方式切换语言,而无需重新启动您的应用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多