.NET MAUI实时检测当前CultureInfo是否发生变化?

问题描述 投票:0回答:1

我按照 Geralt 的 YouTube 视频中有关 .NET MAUI 上的多语言的教程进行操作,非常好且非常详细:https://www.youtube.com/watch?v=cf4sXULR7os 我多次在 StackOverFlow 上 Google 搜索结果后,我自己都找不到答案。

我有一个像这样的 MVVM 类:

namespace MyNameProject.Models
{
    [ContentProperty(nameof(Name))]
    public partial class ResourceModels : ObservableObject, IMarkupExtension<BindingBase>
    {
        private ResourceModels() => Language.Culture = CultureInfo.CurrentCulture;
        private static ResourceModels obj;
        internal static ResourceModels Obj { get { if (obj == null) obj = new(); return obj; } set => obj = value; }
        public object this[string resourceKey]
        => Language.ResourceManager.GetObject(resourceKey, Language.Culture) ?? Array.Empty<byte>();
        public void setCulture(CultureInfo culture) => Language.Culture = culture;
    }
}

能够检测CultureInfo的变化。在每个 XAML 页面上,我必须像这样编写和调用事件: 在页面构造函数中我写:

ResourceModels.Obj.PropertyChanged += Obj_PropertyChanged;

这个方法:

private void Obj_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    ResourceModels.Obj.setCulture(CultureInfo.CurrentCulture);
}

处理一个有很多 PAGE 的项目真的很麻烦,而且我不是只处理 1 个项目..,请大家告诉我如何一劳永逸地完成这个全局实时。从我打开应用程序的那一刻起,直到我退出应用程序,这将永远存在。

c# mvvm maui
1个回答
0
投票

要检测/触发

CultureInfo.CurrentValue
的机会,应致电
CultureInfo.CurrentCulture.ClearCachedData()
。通常,我定义一个
LocalizationManager
类来执行此操作并将其注册为单例,例如

public partial class LocalizationManager : ObservableObject
{
    public CultureInfo CurrentCulture => CultureInfo.CurrentCulture;

    public void Update()
    {
        string _name = CultureInfo.CurrentCulture.Name;
        CultureInfo.CurrentCulture.ClearCachedData(); // trigger update
        if (_name != CultureInfo.CurrentCulture.Name)
        {
            OnPropertyChanged(nameof(CurrentCulture));
            CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture; // optional update resources
        }
    }
}

然后,使用上面的代码,您可以自行决定拨打电话的频率

LocalizationManger.Update()
。有几个选项:(1) 您可以定期轮询它,(2) 您可以在应用程序丢失并重新获得活动焦点时轮询它。后者利用了这样一个事实:大多数用户会更新操作系统中的语言设置,并且通常会离开和进入应用程序。

您需要了解

CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
适用于不同的用例:

  1. CultureInfo.CurrentCulture - 通常保留用于货币、数字、小数和千位分隔符
  2. CultureInfo.CurrentUICulture - 通常保留用于本地化文本(例如英语、法语等中的“Hello World”)

当应用程序运行时,通常,操作系统级别的更改只会体现在前者的更改中,即

CultureInfo.CurrentCulture
。您的应用必须决定何时将这些更改传播到
CultureInfo.CurrentUICulture

© www.soinside.com 2019 - 2024. All rights reserved.