前言
新的一年開始了,公司提了新的要求:
- 國產化
- 國際化
開發部的應對是:從wpf轉換Maui:
- 安卓版也是國產化
- 國際化就是本地化,弄個多國語言的事情
話説華為的鴻蒙,為了國產化,在華為P40手機上運行了Maui的缺省項目,天真的以為鴻蒙支持Maui Android。於是去買了個華為的平板,然後悲劇了。親測:P40手機的鴻蒙4.2支持,新平板的5.0、6.0不支持。要不要為了這個牛繩去買頭牛,學一般華為的那什麼javascript的超集typescript的超集,叫什麼來着?
誰能推薦個安卓平板?
華為的事情是個庭外話,題內化就是開始新一輪的造輪子。
你説,輪子到處都是,非得自己造?
是的,有毛病: 不相信別人,別人走過的路,自己也要走,除非自己不會走。
廢話到此為止。
本地化
微軟本地化文檔,報了個到。
一、準備工作
- 新建項目兩個,分別為LunZi和Demo;刪除iOS、MacCatalyst相關的東西。(話説微軟就不能讓我選擇一下要支持的操作系統嗎?非得讓我手動刪除?)
- LunZi項目新建文件夾Resources,並添加三個資源文件(Resource.resx,Resource.en.resx,Resource.zh-Hans.resx)
- 修改 Demo 項目的 Windows 的 Package.appxmanifest文件,將
<Resources>
<Resource Language="x-generate"/>
</Resources>
替換為
<Resources>
<Resource Language="en-US"/>
<Resource Language="zh-CN"/>
</Resources>
表示本Demo支持中英文。
二、LunZi添加資源
- 雙擊 Resource.resx文件
- 單擊 +
- 輸入
- 添加後編輯
- 將資源的屬性從internal改為public
如此循環往復,便是添加資源。
備註一下:回頭弄個程序來添加資源。
三、Demo使用資源
- 添加項目引用,引用LunZi
- 修改MainPage.xaml
添加命名空間
xmlns:lunzi="clr-namespace:LunZi.Resouces;assembly=LunZi"
使用資源
<Label Text="{x:Static lunzi:Resource.Test}"/>
整個文件變成
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:lunzi="clr-namespace:LunZi.Resouces;assembly=LunZi"
x:Class="Demo.MainPage">
<VerticalStackLayout>
<Label Text="{x:Static lunzi:Resource.Test}"/>
</VerticalStackLayout>
</ContentPage>
- 運行
看樣子,使用了本地是中國
四、中英文動態切換
- 修改頁面
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:lunzi="clr-namespace:LunZi.Resouces;assembly=LunZi"
x:Class="Demo.MainPage">
<VerticalStackLayout HorizontalOptions="Center" VerticalOptions="Center" Spacing="10">
<Label x:Name="LabelTest"/>
<HorizontalStackLayout Spacing="10">
<Button Text="中文" Clicked="BtnCn_Clicked"/>
<Button Text="English" Clicked="BtnEn_Clicked"/>
</HorizontalStackLayout>
</VerticalStackLayout>
</ContentPage>
- 修改代碼
using System.Globalization;
namespace Demo;
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
this.LabelTest.Text = LunZi.Resouces.Resource.Test;
}
private void BtnEn_Clicked(object sender, EventArgs e)
{
SetCulture("en-US");
this.LabelTest.Text = LunZi.Resouces.Resource.Test;
}
private void BtnCn_Clicked(object sender, EventArgs e)
{
SetCulture("zh-Hans");
this.LabelTest.Text = LunZi.Resouces.Resource.Test;
}
private void SetCulture(string cultureCode)
{
var culture = new CultureInfo(cultureCode);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
}
- 運行
單擊 English
好了,就這樣了。