我按照 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 个项目..,请大家告诉我如何一劳永逸地完成这个全局实时。从我打开应用程序的那一刻起,直到我退出应用程序,这将永远存在。
要检测/触发
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
适用于不同的用例:
当应用程序运行时,通常,操作系统级别的更改只会体现在前者的更改中,即
CultureInfo.CurrentCulture
。您的应用必须决定何时将这些更改传播到 CultureInfo.CurrentUICulture
。