博客 / 詳情

返回

[Maui] 造輪子——前言、本地化

前言

新的一年開始了,公司提了新的要求:

  1. 國產化
  2. 國際化

開發部的應對是:從wpf轉換Maui:

  1. 安卓版也是國產化
  2. 國際化就是本地化,弄個多國語言的事情

話説華為的鴻蒙,為了國產化,在華為P40手機上運行了Maui的缺省項目,天真的以為鴻蒙支持Maui Android。於是去買了個華為的平板,然後悲劇了。親測:P40手機的鴻蒙4.2支持,新平板的5.0、6.0不支持。要不要為了這個牛繩去買頭牛,學一般華為的那什麼javascript的超集typescript的超集,叫什麼來着?

誰能推薦個安卓平板?

華為的事情是個庭外話,題內化就是開始新一輪的造輪子。

你説,輪子到處都是,非得自己造?

是的,有毛病: 不相信別人,別人走過的路,自己也要走,除非自己不會走。

廢話到此為止。

本地化

微軟本地化文檔,報了個到。

一、準備工作

  1. 新建項目兩個,分別為LunZi和Demo;刪除iOS、MacCatalyst相關的東西。(話説微軟就不能讓我選擇一下要支持的操作系統嗎?非得讓我手動刪除?)
  2. LunZi項目新建文件夾Resources,並添加三個資源文件(Resource.resx,Resource.en.resx,Resource.zh-Hans.resx)
  3. 修改 Demo 項目的 Windows 的 Package.appxmanifest文件,將
<Resources>
    <Resource Language="x-generate"/>
</Resources>

替換為

	<Resources>
		<Resource Language="en-US"/>
		<Resource Language="zh-CN"/>
	</Resources>

表示本Demo支持中英文。

二、LunZi添加資源

  1. 雙擊 Resource.resx文件
  2. 單擊 +
  3. 輸入
    image
  4. 添加後編輯
    image
  5. 將資源的屬性從internal改為public
    如此循環往復,便是添加資源。

備註一下:回頭弄個程序來添加資源。

三、Demo使用資源

  1. 添加項目引用,引用LunZi
  2. 修改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>

  1. 運行
    image
    看樣子,使用了本地是中國

四、中英文動態切換

  1. 修改頁面
<?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>
  1. 修改代碼
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;
    }
}

  1. 運行
    image
    單擊 English
    image

好了,就這樣了。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.