请自行参考以下方案
转载:https://vladislavantonyuk.github.io/articles/Localize-.NET-MAUI-application/
本地化 .NET MAUI 应用程序
26 2022月 <>
.NET MAUI/Xamarin
Привіт!你好!你好!
.NET MAUI
、 和已发布,因此是时候迁移旧的 Xamarin 应用程序了!
CommunityToolkit.MAUI
CommunityToolkit.MAUI.Markup
许多应用程序支持不同的语言,以为用户提供使用其母语的最佳体验。根据您的需要,有几种方法可以本地化 .NET MAUI 程序。
.NET MAUI
与其他 .NET 应用程序一样,使用这些文件来存储字符串、图像和其他文件。
Resources
让我们添加 2 个新的资源文件和 .第一个文件包含默认的应用程序本地化资源。在我们的例子中,它是英语。第二个文件包含乌克兰语的资源。
AppResources.resx
AppResources.uk.resx
首先,我们需要导入资源的命名空间。
<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-xml">xmlns:localization="clr-namespace:MauiLocalization.Resources.Localization"
</code></span></span>
然后我们可以设置主页标题:
<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-xml">Title = {x:Static localization:AppResources.MainPageTitle}
</code></span></span>
另外,将此行添加到您的 csproj 文件中:
<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-xml"><span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>GenerateSatelliteAssembliesForCore</span><span style="color:#999999">></span></span>true<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"></</span>GenerateSatelliteAssembliesForCore</span><span style="color:#999999">></span></span>
</code></span></span>
可在此处阅读有关附属程序集的详细信息:为 .NET 应用创建附属程序集。
现在,如果您启动应用程序,您将看到默认标题内容 - “主页”。切换到乌克兰语并重新启动应用程序。现在标题内容是“Головна сторінка”。
它工作得很好,但是如果我不想重新启动应用程序或只想更改此应用程序的语言怎么办?
在这种情况下,我们需要添加一些代码。我们需要通知我们的属性资源已更改。为此,我们创建:
LocalizationResourceManager
<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-csharp">public class LocalizationResourceManager : INotifyPropertyChanged
{
private LocalizationResourceManager()
{
AppResources.Culture = CultureInfo.CurrentCulture;
}
public static LocalizationResourceManager Instance { get; } = new();
public object this[string resourceKey] => AppResources.ResourceManager.GetObject(resourceKey, AppResources.Culture) ?? Array.Empty<byte>();
public event PropertyChangedEventHandler? PropertyChanged;
public void SetCulture(CultureInfo culture)
{
AppResources.Culture = culture;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
}
}
</code></span></span>
现在,您的值可以更新为:
Title
<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-xml">Title = "{Binding MyCodeBehindLocalizationResourceManager[MainPageTitle], Mode=OneWay}"
</code></span></span>
其中是具有值的代码隐藏属性。
MyCodeBehindLocalizationResourceManager
LocalizationResourceManager.Instance
因此,这里的值绑定到资源值。每次我们调用该方法时,我们的属性值都会更新。
Title
LocalizationResourceManager.SetCulture
如果您不想为 创建额外的属性,我们可以将其隐藏在:
LocalizationResourceManager
MarkupExtension
<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-csharp">[ContentProperty(nameof(Name))]
public class TranslateExtension : IMarkupExtension<BindingBase>
{
public string? Name { get; set; }
public BindingBase ProvideValue(IServiceProvider serviceProvider)
{
return new Binding
{
Mode = BindingMode.OneWay,
Path = $"[{Name}]",
Source = LocalizationResourceManager.Instance
};
}
object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
return ProvideValue(serviceProvider);
}
}
</code></span></span>
现在,该值可以更新为:
Title
<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-xml">Title="{localization:Translate MainPageTitle}"
</code></span></span>
因此,您应该收到这样的应用程序:
这就是您无需重新启动应用程序即可切换语言所需的全部内容。
完整的代码可以在GitHub上找到。
祝您编码愉快!