CurrentCulture自动重置Xamarin Android
我正在尝试创建一个支持多标签语言的应用程序,其中我有一个允许用户选择语言的设置页面,然后视图模型将使用MessagingCenter发布消息,最后MainActivity将响应此消息 这就是上面提到的代码示例CurrentCulture自动重置Xamarin Android,xamarin,xamarin.android,Xamarin,Xamarin.android,我正在尝试创建一个支持多标签语言的应用程序,其中我有一个允许用户选择语言的设置页面,然后视图模型将使用MessagingCenter发布消息,最后MainActivity将响应此消息 这就是上面提到的代码示例 private async void HandleSelectedLanguageChanged() { if (SelectedLanguage == null || !this.isInitialized) return; MessagingCente
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上似乎不起作用,谢谢,这种方式起作用了;但是,它在娱乐期间导致屏幕变暗,给人一种应用程序崩溃的印象,在我的情况下,应用程序很快就会重新加载我可以接受这种效果,但其他人可能不会