# SunnyUI.Localization **Repository Path**: zhangfeigitMirac/SunnyUI.Localization ## Basic Information - **Project Name**: SunnyUI.Localization - **Description**: SunnyUI.Localization 是基于.Net框架的C# Winform国际化多语言切换解决方案。 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: https://gitee.com/yhuse/SunnyUI.Localization - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 15 - **Created**: 2023-06-14 - **Last Updated**: 2023-06-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![SunnyUI](https://images.gitee.com/uploads/images/2021/0324/213615_54240ba9_416720.png "SunnyUI.png") - Gitee: https://gitee.com/yhuse/SunnyUI.Localization - Nuget: https://www.nuget.org/packages/SunnyUI.Localization/ - Blog: https://www.cnblogs.com/yhuse 欢迎交流,QQ群: 56829229 (SunnyUI技术交流群),请给源码项目点个Star吧!!! #### 介绍 SunnyUI.Localization 是基于.Net框架的C# Winform国际化多语言切换解决方案。 MIT开源协议,免费使用。 **该项目并不完善,只作为一种多语言切换的思路,作为技术拓展。未计划更新及增加技术支持。** #### 架构 C# Winform国际化多语言切换主要包含两个内容: * 软件界面上的字符串资源 * 软件代码内的字符串资源 SunnyUI.Localization 能够方便、快捷的加载、切换上述两种多语言字符串资源。 SunnyUI.Localization 主要包含: * 翻译器(Translator),通过软件界面翻译器(FormTranslator)、软件代码翻译器(CodeTranslator),实现多语言切换。 * 生成器(Generator),通过读取界面文件(Form.Designer.cs)、软件代码翻译器(CodeTranslator)配置内容,生成多语言配置文件(ini文件),打开多语言配置文件,翻译其内容后,供翻译器使用。 软件界面翻译器已经实现对Button、TextBox、Label、LinkLabel、CheckBox、RadioButton、GroupBox、RichTextBox、TabControl、DataGridView、MenuStrip、ContextMenuStrip、FolderBrowserDialog、OpenFileDialog、SaveFileDialog等原生控件的语言资源读取。 并兼容后续以Text属性存储界面语言资源的控件的语言资源读取。 #### 实现 1、定义CodeTranslator ~~~~ // CodeTranslator,从BaseCodeTranslator继承 public class CodeTranslator : BaseCodeTranslator { // [ConfigSection("Form1")],关联Form1,资源保存于ini的Form1的Section内 [ConfigSection("Form1")] public string CloseInfo { get; set; } // [ConfigSection("Form2")],关联Form1,资源保存于ini的Form2的Section内 [ConfigSection("Form2")] public string HelloWorld { get; set; } // 未关联,资源保存于ini的CodeLanguage的Section内 public string AskCaption { get; set; } // 未关联,资源保存于ini的CodeLanguage的Section内 public string InfoCaption { get; set; } // 设置默认值 public override void SetDefault() { base.SetDefault(); CloseInfo = "您确认要退出程序吗?"; HelloWorld = "你好世界!"; AskCaption = "询问"; InfoCaption = "提示"; } } ~~~~ 2、创建生成器,保存资源文件 ~~~~ //定义语言资源文件夹 Define.LanguageDir = "Languages"; //创建生成器,输入项目文件(*.csproj)、项目可执行文件路径(*.exe) Generator generator = new Generator( @"C:\Users\Sunny\source\repos\SunnyUI.Localization\SunnyUI.Localization.Demo\SunnyUI.Localization.Demo.csproj", @"C:\Users\Sunny\source\repos\SunnyUI.Localization\Bin\net40\SunnyUI.Localization.Demo.exe"); //保存界面原始语言资源文件 string rawFile = generator.Save(); //生成界面对应语言的资源文件,可重复生成,已有的不覆盖 generator.Save(rawFile, CultureInfos.SimplifiedChinese); generator.Save(rawFile, CultureInfos.English); //生成代码对应语言的资源文件,可重复生成,已有的不覆盖 CodeTranslator.Current.Save(CultureInfos.SimplifiedChinese); CodeTranslator.Current.Save(CultureInfos.English); ~~~~ 生成的语言文件保存于可执行文件路径下语言资源文件夹下: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0909/153927_32954b01_416720.png "屏幕截图.png") 3、打开语言资源文件,翻译其内容 [Language]此节内容勿动 [Form1]翻译=后面的文字 [Form2]翻译=后面的文字 [CodeLanguage]翻译=后面的文字 整个文件浏览下,可以很容易看到界面文字资源和代码的文字资源都已经在语言资源文件里了。 zh-CN.lang ~~~~ ; [Language] Name=zh-CN ID=2052 NativeName=中文(中国) DisplayName=中文(简体,中国) EnglishName=Chinese (Simplified, China) [Form1] button1.Text=按钮1 checkBox1.Text=复选框1 Column1.HeaderText=列1 Column2.HeaderText=列2 Column3.HeaderText=列3 menu1ToolStripMenuItem.Text=菜单1 menu2ToolStripMenuItem.Text=菜单2 groupBox1.Text=分组框1 label1.Text=标签1 linkLabel1.Text=链接标签1 tabPage1.Text=页面1 tabPage2.Text=页面2 textBox1.Text=文本 button2.Text=创建多语文件 button3.Text=中文 button4.Text=English button5.Text=... Text=演示 radioButton1.Text=单选按钮1 button6.Text=... menuStrip1.Text=主菜单1 menu1ToolStripMenuItem1.Text=菜单1 menu11ToolStripMenuItem.Text=菜单11 menu12ToolStripMenuItem.Text=菜单12 menu2ToolStripMenuItem1.Text=菜单2 menu21ToolStripMenuItem.Text=菜单21 menu22ToolStripMenuItem.Text=菜单22 folderBrowserDialog1.Description=请选择文件夹 openFileDialog1.FileName=openFileDialog1 openFileDialog1.Title=请选择文件 richTextBox1.Text=你好世界 saveFileDialog1.Title=请输入文件名 button7.Text=打开窗体 CloseInfo=您确认要退出程序吗? [Form2] button1.Text=按钮1 Text=窗体2 HelloWorld=你好世界! [CodeLanguage] InfoCaption=提示 AskCaption=询问 ~~~~ en-US.lang ~~~~ ; [Language] Name=en-US ID=1033 NativeName=English (United States) DisplayName=英语(美国) EnglishName=English (United States) [Form1] button1.Text=button1 checkBox1.Text=checkBox1 Column1.HeaderText=Column1 Column2.HeaderText=Column2 Column3.HeaderText=Column3 menu1ToolStripMenuItem.Text=Menu1 menu2ToolStripMenuItem.Text=Menu2 groupBox1.Text=groupBox1 label1.Text=label1 linkLabel1.Text=linkLabel1 tabPage1.Text=tabPage1 tabPage2.Text=tabPage2 textBox1.Text=Text button2.Text=Create language files button3.Text=中文 button4.Text=English button5.Text=... Text=Demo radioButton1.Text=radioButton1 button6.Text=... menuStrip1.Text=menuStrip1 menu1ToolStripMenuItem1.Text=Menu1 menu11ToolStripMenuItem.Text=Menu11 menu12ToolStripMenuItem.Text=Menu12 menu2ToolStripMenuItem1.Text=Menu2 menu21ToolStripMenuItem.Text=Menu21 menu22ToolStripMenuItem.Text=Menu22 folderBrowserDialog1.Description=Please select a folder openFileDialog1.FileName=openFileDialog1 openFileDialog1.Title=Please select a file richTextBox1.Text=Hello world! saveFileDialog1.Title=Please enter the file name button7.Text=Open form CloseInfo=Are you sure you want to exit the program? [Form2] button1.Text=button1 Text=Form2 HelloWorld=Hello world! [CodeLanguage] InfoCaption=Info AskCaption=Ask ~~~~ 4、运行翻译器,实现多语言切换 ~~~~ Global.CultureInfo = CultureInfos.SimplifiedChinese; //读取界面语言资源并翻译 FormTranslator.Translate(this, Global.CultureInfo); //读取代码语言资源供代码使用 CodeTranslator.Current.Load(Global.CultureInfo); ~~~~ 翻译器原理为读取语言资源文件,直接给代码使用并通过反射对界面字符串资源赋值。 #### 演示 中文 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0909/162727_8efd9ed5_416720.png "屏幕截图.png") English ![输入图片说明](https://images.gitee.com/uploads/images/2021/0909/162745_a87126b2_416720.png "屏幕截图.png")