尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SunnyUI 控件库国际化指南:内置中文资源的 UILocalize 静态变量重写与 UIStyles.CultureInfo 切换机制

SunnyUI 控件库国际化指南:内置中文资源的 UILocalize 静态变量重写与 UIStyles.CultureInfo 切换机制 UI组件桌面应用【免费下载链接】SunnyUISunnyUI.NET 是基于.NET Framework 4.0、.NET6、.NET8、.NET9 框架的 C# WinForm UI、开源控件库、工具类库、扩展类库、多页面开发框架。项目地址https://gitcode.com/gh_mirrors/su/SunnyUI点击查看免费下载SunnyUI 是基于 .NET Framework 4.0、.NET6、.NET8、.NET9 的 C# WinForm 开源控件库其控件内部默认使用中文。本文聚焦 SunnyUI 自身内置中文资源的国际化方案如何通过重写UILocalize静态字符串变量、调用UILocalizeHelper的默认语言配置以及结合源码中的UIBuiltInResources、UIStyles.CultureInfo与TranslateHelper机制将提示框标题、按钮文字、表格提示等内置文案切换为英文等其他语言。读完本文你将掌握三套可落地的多语言切换手段并能自行扩展任意语言的资源配置。注意本文所述国际化只针对 SunnyUI 内部按钮、标题、提示等内置中文资源的翻译如果您开发的业务系统需要做国际化请自行开发SunnyUI 不负责业务层文案的翻译。一、国际化的核心对象内置中文静态字符串SunnyUI 中常用的按钮、标题、提示等文字已经被设计为静态字符串变量集中存放在UILocalize类中原文档描述位于ULocalize.cs文件。也就是说所有对话框标题提示正确警告错误、按钮文字确定取消、表格提示[ 无数据 ]数据加载中等都不是硬编码散落在各控件里而是收敛到一组可替换的公共变量上public static class UILocalize { public static string InfoTitle 提示; public static string SuccessTitle 正确; public static string WarningTitle 警告; public static string ErrorTitle 错误; public static string AskTitle 提示; public static string InputTitle 输入; public static string CloseAll 全部关闭; public static string OK 确定; public static string Cancel 取消; public static string GridNoData [ 无数据 ]; public static string GridDataLoading 数据加载中 ......; public static string GridDataSourceException 数据源必须为DataTable或者List; }从当前仓库源码看这套设计在后续版本中演进为抽象资源类UIBuiltInResources其默认值即全部中文定义在 SunnyUI/Style/UBuiltInResources.cs文件头注释明确标注多语言字符串定义除上述字段外还扩展了星期、月份、分页、搜索、保存、编辑框校验等更多内置文案Yes / No是 / 否Monday ~ Sunday一 ~ 日英文版为 MON ~ SUNPrev / Next / SelectPageLeft / SelectPageRight上一页 / 下一页 / 第 / 页January ~ December一月 ~ 十二月英文版为 Jan. ~ Dec.Today / Search / Clear / Open / Save / All今天 / 搜索 / 清除 / 打开 / 保存 / 全部SystemProcessing系统正在处理中请稍候...EditorCantEmpty编辑框内容不能为空。借助这种变量集中 可覆盖的结构切换语言时只需替换这些静态变量的值全库控件即可统一生效。二、使用 UILocalizeHelper 快速切换中英文UILocalizeHelper类已内置了中文和英文的默认配置函数可以直接调用无需手写赋值public static class UILocalizeHelper { public static void SetEN() { UILocalize.InfoTitle Info; UILocalize.SuccessTitle Success; UILocalize.WarningTitle Warning; UILocalize.ErrorTitle Error; UILocalize.AskTitle Query; UILocalize.InputTitle Input; UILocalize.CloseAll Close all; UILocalize.OK OK; UILocalize.Cancel Cancel; UILocalize.GridNoData [ No data ]; UILocalize.GridDataLoading Data loading ......; UILocalize.GridDataSourceException The data source must be DataTable or List; } public static void SetCH() { UILocalize.InfoTitle 提示; UILocalize.SuccessTitle 正确; UILocalize.WarningTitle 警告; UILocalize.ErrorTitle 错误; UILocalize.AskTitle 提示; UILocalize.InputTitle 输入; UILocalize.CloseAll 全部关闭; UILocalize.OK 确定; UILocalize.Cancel 取消; UILocalize.GridNoData [ 无数据 ]; UILocalize.GridDataLoading 数据加载中 ......; UILocalize.GridDataSourceException 数据源必须为DataTable或者List; } }用法上只需一行在程序启动或语言切换点调用UILocalizeHelper.SetEN()即切换到英文调用UILocalizeHelper.SetCH()即恢复中文。当前仓库实现中与之对应的英文资源配置类为en_US_Resources它重写了UIBuiltInResources的全部属性例如InfoTitle Info、AskTitle Confirm注意与旧版Query的差异、GridDataLoading Data loading, please wait...等详见 SunnyUI/Style/UBuiltInResources.cs。三、自定义其他语言如果内置的中英文配置不满足需求只需要在自己的程序里编写函数更新UILocalize类的静态变量值即可。例如切换到日语void SetJP() { UILocalize.InfoTitle 情報; UILocalize.SuccessTitle 成功; UILocalize.WarningTitle 警告; UILocalize.ErrorTitle エラー; UILocalize.AskTitle 確認; UILocalize.InputTitle 入力; UILocalize.CloseAll すべて閉じる; UILocalize.OK OK; UILocalize.Cancel キャンセル; UILocalize.GridNoData [ データなし ]; UILocalize.GridDataLoading データ読み込み中 ......; UILocalize.GridDataSourceException データソースはDataTableまたはListである必要があります; }在基于UIBuiltInResources的当前版本中等价做法是继承抽象资源类并重写属性再通过 LCID 注册进资源字典例如仓库中zh_CN_Resources、en_US_Resources就是两个现成的子类SunnyUI/Style/UBuiltInResources.cs而繁体中文资源类zh_TW_Resources则定义在演示工程的 SunnyUI.Demo/Units/UZhTW.cs并在 SunnyUI.Demo/Program.cs 中注册//增加一个繁体中文的内置资源配置 UIStyles.BuiltInResources.TryAdd(CultureInfos.zh_TW.LCID, new zh_TW_Resources());四、源码级实现CultureInfo、资源注册与全局切换链路要让语言切换真正生效需要理解仓库中三个核心部件的配合以下均可在源码中验证1. 语言 ID 与 CultureInfo 常量 —— CultureInfosSunnyUI/Style/UCultureInfo.cs 定义了常用的 LCID 常量与对应的CultureInfo实例并附有完整的语言 ID 对照表文件注释常量LCID语言LCID_zh_CN2052简体中文LCID_zh_TW1028繁体中文LCID_en_US1033英语同时提供只读属性CultureInfos.zh_CN、CultureInfos.zh_TW、CultureInfos.en_US由CultureInfo.GetCultureInfo(LCID)生成后续UIStyles.CultureInfo的赋值即使用这些对象。2. 内置资源注册表 —— UIStyles.BuiltInResourcesSunnyUI/Style/UIStyles.cs 在初始化时将简体中文与英文资源按 LCID 注册进线程安全的字典UIBuiltInResources lcn new zh_CN_Resources(); UIBuiltInResources len new en_US_Resources(); BuiltInResources.TryAdd(lcn.CultureInfo.LCID, lcn); BuiltInResources.TryAdd(len.CultureInfo.LCID, len);UIStyles.BuiltInResources是ConcurrentDictionaryint, UIBuiltInResources而UIStyles.CurrentResources则根据当前CultureInfo.LCID直接取出对应资源UIStyles.cspublic static readonly ConcurrentDictionaryint, UIBuiltInResources BuiltInResources new(); public static UIBuiltInResources CurrentResources BuiltInResources[CultureInfo.LCID];实际使用中消息框、等待窗体等控件正是通过UIStyles.CurrentResources.InfoTitle等属性取标题文案的例如 SunnyUI/Forms/UIFormHelper.cs、SunnyUI/Forms/UIStatusForm.cs、SunnyUI/Forms/UIWaitForm.cs。3. 全局切换入口 —— UIStyles.CultureInfoUIStyles.CultureInfo属性是切换语言的总开关UIStyles.cs赋值时会校验 LCID 是否变化若变化则从BuiltInResources中取出对应资源更新内部文化信息并触发UIStyles.Translate()对所有已注册窗体执行翻译未注册的 LCID 会回退到简体中文public static CultureInfo CultureInfo { get _cultureInfo; set { if (value null) return; if (value.LCID ! _cultureInfo.LCID) { if (BuiltInResources.TryGetValue(value.LCID, out var cultureInfo)) { _cultureInfo cultureInfo.CultureInfo; } else { _cultureInfo CultureInfos.zh_CN; } UIStyles.Translate(); } } }演示工程 SunnyUI.Demo/FMain.cs 中简体中文、繁体中文、英文三个菜单项的点击事件正是直接给该属性赋值实现即时切换private void NZhCN_Click(object sender, EventArgs e) { UIStyles.CultureInfo CultureInfos.zh_CN; } private void NZhTW_Click(object sender, EventArgs e) { UIStyles.CultureInfo CultureInfos.zh_TW; } private void NEnUS_Click(object sender, EventArgs e) { UIStyles.CultureInfo CultureInfos.en_US; }五、界面控件文案的翻译Language 目录与 .ini 文件机制除了内置资源字符串SunnyUI 还提供了对整个窗体Form/Page上 SunnyUI 控件文案的翻译机制核心实现在 SunnyUI/Style/UTranslate.cs生成语言文件调用TranslateHelper.LoadCsproj(csprojFile)解析工程文件csproj中所有SubType Form的编译项扫描对应.Designer.cs里被InitializeComponent添加的控件将需要翻译的控件白名单Includes中包括UIButton、UISymbolButton、UIGroupBox、UICheckBox、UIDatePicker、UILabel、UIPanel、UIRadioButton、UITitlePanel、ToolStripMenuItem等写入可执行文件夹Language目录下以命名空间.类名.ini命名的文件UTF-8 编码并在Info节写入警告注意请先关闭应用程序然后再修改此文档。否则修改可能会应用程序生成代码覆盖。。仓库演示工程 SunnyUI.Demo/Program.cs 中保留了该调用示例及注释//从项目方案生成多语言配置文件生成文件在可执行文件夹的Language目录下 //生成后界面没有修改的情况下可注释掉下一行只运行一次即可 //TranslateHelper.LoadCsproj(D:\Source\SunnyUI\SunnyUI.Demo\SunnyUI.Demo.csproj);在 .NET Framework 下链接属性取Include在 NET8 及以上会自动附加.user后缀并取Update属性UTranslate.cs。运行时读取翻译窗体的TranslateOther扩展方法UTranslate.cs按当前UIStyles.CultureInfo.LCID读取对应.ini把Controls节中的控件文案批量替换。生成的成品语言文件可直接在仓库演示程序目录 SunnyUI.Demo/Bin/Language 下查看例如Sunny.UI.Demo.FMain.ini、Sunny.UI.Demo.FButton.ini等。窗体重写 Translate需要自绘翻译的窗体可重写Translate()方法。演示主窗体 SunnyUI.Demo/FMain.cs 的做法是先调用base.Translate()再用CodeTranslator.Load(this)读取翻译代码中的多语资源最后手动设置导航菜单节点文本。六、实际显示效果切换语言后的实际显示效果如下。中文界面对话框标题显示为提示/错误按钮为确定/取消。英文界面对话框标题显示为Query/Error按钮为OK/Cancel。七、实践建议与注意事项切换时机内置资源切换UILocalizeHelper.SetEN()/SetCH()或重写UILocalize变量应发生在界面创建之前而基于UIStyles.CultureInfo的切换可在运行时进行会自动触发已注册窗体重翻译。业务文案自持UILocalize/UIBuiltInResources只负责 SunnyUI 内部文案您业务系统自己的界面文字需自行实现国际化。Language 文件修改前先关闭程序.ini文件由LoadCsproj生成界面未改动时只运行一次即可手动修改.ini前需退出应用否则可能被生成代码覆盖。未注册语言回退给UIStyles.CultureInfo赋值未在BuiltInResources注册的 LCID 时会自动回退到简体中文UIStyles.cs因此新增语言务必先通过BuiltInResources.TryAdd(LCID, resources)注册对应资源类。八、相关文件索引国际化文档原文docs/i18n.md内置多语言字符串定义与中英文资源类SunnyUI/Style/UBuiltInResources.cs语言 ID 与 CultureInfo 常量SunnyUI/Style/UCultureInfo.cs全局切换入口与资源注册表SunnyUI/Style/UIStyles.cs窗体控件翻译与 .ini 生成机制SunnyUI/Style/UTranslate.cs繁体中文资源类SunnyUI.Demo/Units/UZhTW.cs语言切换演示代码SunnyUI.Demo/FMain.cs程序入口注册示例SunnyUI.Demo/Program.cs生成的成品语言文件目录SunnyUI.Demo/Bin/Language赞分享UI组件桌面应用【免费下载链接】SunnyUISunnyUI.NET 是基于.NET Framework 4.0、.NET6、.NET8、.NET9 框架的 C# WinForm UI、开源控件库、工具类库、扩展类库、多页面开发框架。项目地址https://gitcode.com/gh_mirrors/su/SunnyUI点击查看免费下载相关推荐Univer国际化完整指南从资源文件配置到动态语言切换实战Univer作为企业级文档协作解决方案提供了强大的国际化 i18n 支持让开发者能够轻松实现多语言界面。本文将详细介绍Univer的国际化实现流程帮助您快前端企业应用QuickLook国际化架构多语言资源文件组织与动态切换QuickLook国际化架构多语言资源文件组织与动态切换 QuickLook作为一款高效的文件预览工具其国际化架构设计确保了全球用户能够获得本地化的使用体验桌面应用插件系统终极指南GitHub Docs变量系统如何实现动态内容与国际化终极指南GitHub Docs变量系统如何实现动态内容与国际化 GitHub Docs作为面向全球开发者的官方文档系统需要应对多产品版本、多语言环境和复杂内文档教程知识库上一篇grpc-spring-boot-starter拦截器详解如何构建高效的gRPC中间件链下一篇抖音批量下载工具5分钟无水印跑通首次任务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表