惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
Last Week in AI
Last Week in AI
罗磊的独立博客
量子位
Jina AI
Jina AI
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
美团技术团队
雷峰网
雷峰网
爱范儿
爱范儿
S
SegmentFault 最新的问题
小众软件
小众软件
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - 毛毛虫

[Maui] 轮子——插件式开发 [Maui] Windows部署 [Maui] 造轮子——LoggerSqlite [Maui] 造轮子——Exception处理 [Maui] 造轮子——MessageBox [C#] 日积月累 [.net10] 极简数据库对象关系映射 [C#] 扩展Enumerable,实现类似Sqlserver的窗口函数lag [Blazor] 学习随笔——呈现约定 [Blazor] 学习随笔——生命周期 [Blazor] 学习随笔——RZ10012警告的处理 [Blazor WebAssembly] 学习随笔——组件1.微信弹框(WXDialog) [Blazor WebAssembly] 学习随笔——身份验证 Asp.net Help ASP.NET Web 应用 Docker踩坑历程——续 [Net6]自己写个消息推送 Docker批处理笔记 Asp.net6.0 Swagger使用备忘 ASP.NET Web 应用 Docker踩坑历程
[Maui] 造轮子——前言、本地化
毛毛虫 · 2026-03-08 · via 博客园 - 毛毛虫

前言

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

  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

好了,就这样了。