[Maui] 造轮子——前言、本地化
<h1 id="前言">前言</h1><p>新的一年开始了,公司提了新的要求:</p>
<ol>
<li>国产化</li>
<li>国际化</li>
</ol>
<p>开发部的应对是:从wpf转换Maui:</p>
<ol>
<li>安卓版也是国产化</li>
<li>国际化就是本地化,弄个多国语言的事情</li>
</ol>
<p>话说华为的鸿蒙,为了国产化,在华为P40手机上运行了Maui的缺省项目,天真的以为鸿蒙支持Maui Android。于是去买了个华为的平板,然后悲剧了。亲测:P40手机的鸿蒙4.2支持,新平板的5.0、6.0不支持。要不要为了这个牛绳去买头牛,学一般华为的那什么javascript的超集typescript的超集,叫什么来着?</p>
<p>谁能推荐个安卓平板?</p>
<p>华为的事情是个庭外话,题内化就是开始新一轮的造轮子。</p>
<p>你说,轮子到处都是,非得自己造?</p>
<p>是的,有毛病: 不相信别人,别人走过的路,自己也要走,除非自己不会走。</p>
<p>废话到此为止。</p>
<h1 id="本地化">本地化</h1>
<p>微软本地化文档,报了个到。</p>
<p><strong>一、准备工作</strong></p>
<ol>
<li>新建项目两个,分别为LunZi和Demo;删除iOS、MacCatalyst相关的东西。(话说微软就不能让我选择一下要支持的操作系统吗?非得让我手动删除?)</li>
<li>LunZi项目新建文件夹Resources,并添加三个资源文件(Resource.resx,Resource.en.resx,Resource.zh-Hans.resx)</li>
<li>修改 Demo 项目的 Windows 的 Package.appxmanifest文件,将</li>
</ol>
<pre><code><Resources>
<Resource Language="x-generate"/>
</Resources>
</code></pre>
<p>替换为</p>
<pre><code> <Resources>
<Resource Language="en-US"/>
<Resource Language="zh-CN"/>
</Resources>
</code></pre>
<p>表示本Demo支持中英文。</p>
<p><strong>二、LunZi添加资源</strong></p>
<ol>
<li>双击 Resource.resx文件</li>
<li>单击 +</li>
<li>输入<br>
<img src="https://img2024.cnblogs.com/blog/10915/202603/10915-20260308114703826-235861313.png" alt="image" loading="lazy"></li>
<li>添加后编辑<br>
<img src="https://img2024.cnblogs.com/blog/10915/202603/10915-20260308114850780-1994865278.png" alt="image" loading="lazy"></li>
<li>将资源的属性从internal改为public<br>
如此循环往复,便是添加资源。</li>
</ol>
<p>备注一下:回头弄个程序来添加资源。</p>
<p><strong>三、Demo使用资源</strong></p>
<ol>
<li>添加项目引用,引用LunZi</li>
<li>修改MainPage.xaml<br>
添加命名空间</li>
</ol>
<pre><code> xmlns:lunzi="clr-namespace:LunZi.Resouces;assembly=LunZi"
</code></pre>
<p>使用资源</p>
<pre><code> <Label Text="{x:Static lunzi:Resource.Test}"/>
</code></pre>
<p>整个文件变成</p>
<pre><code><?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>
</code></pre>
<ol start="3">
<li>运行<br>
<img src="https://img2024.cnblogs.com/blog/10915/202603/10915-20260308121229794-777613244.png" alt="image" loading="lazy"><br>
看样子,使用了本地是中国</li>
</ol>
<p><strong>四、中英文动态切换</strong></p>
<ol>
<li>修改页面</li>
</ol>
<pre><code><?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>
</code></pre>
<ol>
<li>修改代码</li>
</ol>
<pre><code>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;
}
}
</code></pre>
<ol>
<li>运行<br>
<img src="https://img2024.cnblogs.com/blog/10915/202603/10915-20260308123526109-1669912343.png" alt="image" loading="lazy"><br>
单击 English<br>
<img src="https://img2024.cnblogs.com/blog/10915/202603/10915-20260308123612093-916568580.png" alt="image" loading="lazy"></li>
</ol>
<p>好了,就这样了。</p><br><br>
来源:https://www.cnblogs.com/catzhou/p/19685427
頁:
[1]