天天看點

MAUI 原生APPI18N多語言解決方案本地化 .NET MAUI 應用程式

請自行參考以下方案

轉載:https://vladislavantonyuk.github.io/articles/Localize-.NET-MAUI-application/

MAUI 原生APPI18N多語言解決方案本地化 .NET MAUI 應用程式

本地化 .NET MAUI 應用程式

26 2022月 <>

.NET MAUI/Xamarin

MAUI 原生APPI18N多語言解決方案本地化 .NET MAUI 應用程式

Привіт!你好!你好!

.NET MAUI

、 和已釋出,是以是時候遷移舊的 Xamarin 應用程式了!

CommunityToolkit.MAUI

CommunityToolkit.MAUI.Markup

許多應用程式支援不同的語言,以為使用者提供使用其母語的最佳體驗。根據您的需要,有幾種方法可以本地化 .NET MAUI 程式。

.NET MAUI

與其他 .NET 應用程式一樣,使用這些檔案來存儲字元串、圖像和其他檔案。

Resources

MAUI 原生APPI18N多語言解決方案本地化 .NET MAUI 應用程式

讓我們添加 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>
           

是以,您應該收到這樣的應用程式:

MAUI 原生APPI18N多語言解決方案本地化 .NET MAUI 應用程式

這就是您無需重新啟動應用程式即可切換語言所需的全部内容。

完整的代碼可以在GitHub上找到。

祝您編碼愉快!

繼續閱讀