【发布时间】: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 谢谢,那种工作;但是,它在游戏过程中导致屏幕变暗,给人的印象是应用程序崩溃了,应用程序重新加载不需要很长时间,所以在我的情况下我可以接受这种效果,但其他人可能不会