c#多语言实现

news/2025/3/10 5:22:17/文章来源:https://www.cnblogs.com/bfyx/p/18619555

也许你会有多语言这样的需求,后期方便添加语言,基于这样的需求写了个辅助类;

先看代码:

  1 public class LanguageHelper
  2 {
  3     private static Dictionary<string, string> m_lstLanguage = new Dictionary<string, string>();
  4     private static Dictionary<string, FontFamily[]> m_lstLanguageFontFamily = new Dictionary<string, FontFamily[]>();
  5     /// <summary>
  6     /// 语言改变事件委托
  7     /// </summary>
  8     /// <param name="lang">语言</param>
  9     public delegate void LanguageChangedHandler(string lang);
 10     /// <summary>
 11     /// 语言改变事件
 12     /// </summary>
 13     public static event LanguageChangedHandler LanguageChanged;
 14     /// <summary>
 15     /// 当前语言
 16     /// </summary>
 17     public static string Language { get; private set; }
 18     /// <summary>
 19     /// 语言文件所在文件夹
 20     /// </summary>
 21     public static string LanguageDirectory { get; private set; } = "Language";
 22     /// <summary>
 23     /// 初始化
 24     /// </summary>
 25     /// <param name="langDirectory">语言文件所在文件夹</param>
 26     public static void InitLanguage(string langDirectory)
 27     {
 28         LanguageDirectory = langDirectory;
 29     }
 30     /// <summary>
 31     /// 初始化语言对应使用的字体样式(可多次调用设置)
 32     /// </summary>
 33     /// <param name="language">语言</param>
 34     /// <param name="fontFamily">字体样式列表,0:常规字体,1:加粗字体(可空)</param>
 35     public static void InitLanguageFont(string language, FontFamily[] fontFamily)
 36     {
 37         m_lstLanguageFontFamily[language] = fontFamily;
 38     }
 39     /// <summary>
 40     /// 加载语言文件
 41     /// </summary>
 42     /// <param name="lang">语言文件名称,如zh-CN,UTF-8编码</param>
 43     /// <returns>是否加载成功</returns>
 44     public static bool LoadLanguage(string lang = "zh-CN")
 45     {
 46         if (File.Exists(Path.Combine(LanguageDirectory, lang + ".json")))
 47         {
 48             Language = lang;
 49             m_lstLanguage = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(Path.Combine(LanguageDirectory, lang + ".json"), Encoding.UTF8));
 50             if (LanguageChanged != null)
 51             {
 52                 LanguageChanged(lang);
 53             }
 54             return true;
 55         }
 56         return false;
 57     }
 58 
 59     /// <summary>
 60     /// 使用关键词获取语言文本
 61     /// </summary>
 62     /// <param name="strKey">关键词</param>
 63     /// <returns>文本内容</returns>
 64     public static string GetLanguageText(string strKey)
 65     {
 66         if (m_lstLanguage.ContainsKey(strKey))
 67         {
 68             return m_lstLanguage[strKey];
 69         }
 70         return strKey;
 71     }
 72 
 73     /// <summary>
 74     /// 根据语言获取对应的字体
 75     /// </summary>
 76     /// <param name="lang">语言</param>
 77     /// <param name="blnBold">是否粗体</param>
 78     /// <returns></returns>
 79     public static FontFamily GetFontFamilyByLanguage(string lang, bool blnBold = false)
 80     {
 81         if (m_lstLanguageFontFamily.ContainsKey(lang))
 82         {
 83             var fs = m_lstLanguageFontFamily[lang];
 84             if (blnBold)
 85             {
 86                 if (fs.Length > 1)
 87                 {
 88                     return fs[1];
 89                 }
 90             }
 91             return fs[0];
 92         }
 93         return new FontFamily("微软雅黑");
 94     }
 95     /// <summary>
 96     /// 根据语言获取对应的字体,以1080为基准进行计算
 97     /// </summary>
 98     /// <param name="size"></param>
 99     /// <param name="lang"></param>
100     /// <returns></returns>
101     public static Font GetFontByLanguage(float size, string lang)
102     {
103         return GetFontByLanguage(size, lang, 1080);
104     }
105     /// <summary>
106     /// 根据语言和显示宽度获取对应的字体
107     /// </summary>
108     /// <param name="size">原始文字大小</param>
109     /// <param name="lang">语言</param>
110     /// <param name="width">当前缩放后界面显示宽度,根据原始宽度来进行比例缩放</param>
111     /// <param name="oldWidth">原始宽度</param>
112     /// <param name="blnBold">是否加粗</param>
113     /// <returns>字体</returns>
114     public static Font GetFontByLanguage(float size, string lang, int width, float oldWidth = 1080.0f, bool blnBold = false)
115     {
116         var ff = GetFontFamilyByLanguage(lang, blnBold);
117         return new Font(ff, size * width / oldWidth, blnBold ? FontStyle.Bold : FontStyle.Regular);
118     }
119     /// <summary>
120     /// 根据字体和显示宽度获取对应的字体
121     /// </summary>
122     /// <param name="font">原始文字字体</param>
123     /// <param name="width">当前缩放后界面显示宽度,根据原始宽度来进行比例缩放</param>
124     /// <param name="oldWidth">原始宽度</param>
125     /// <returns>字体</returns>
126     public static Font GetFontByFont(Font font, int width, float oldWidth = 1080.0f)
127     {
128         return new Font(font.FontFamily, font.Size * width / oldWidth, font.Style);
129     }
130 }
View Code

调用代码

//多语言测试
SL.Tools.LanguageHelper.InitLanguage("Language");
//设置语言对应字体的时候,也可以使用FontHelper类加载的文件字体
SL.Tools.LanguageHelper.InitLanguageFont("zh-CN", new System.Drawing.FontFamily[] { new System.Drawing.FontFamily("微软雅黑"), new System.Drawing.FontFamily("微软雅黑") })
SL.Tools.LanguageHelper.InitLanguageFont("zh-TW", new System.Drawing.FontFamily[] { new System.Drawing.FontFamily("微软雅黑"), new System.Drawing.FontFamily("微软雅黑") })
SL.Tools.LanguageHelper.LanguageChanged += (lang) =>
{Console.WriteLine("语言改变:" + lang);Console.WriteLine("-------------------");//重新加载语言Console.WriteLine(SL.Tools.LanguageHelper.GetLanguageText("欢迎"));Console.WriteLine(SL.Tools.LanguageHelper.GetLanguageText("无操作时间"));Console.WriteLine(SL.Tools.LanguageHelper.GetLanguageText("等待时间"));Console.WriteLine(SL.Tools.LanguageHelper.GetLanguageText("退出系统"));Console.WriteLine(SL.Tools.LanguageHelper.GetLanguageText("错误提示"));//根据语言设置字体,一般用于语言切换,节目大小改变时,重新设置字体Font f1 = SL.Tools.LanguageHelper.GetFontByLanguage(15, "zh-CN", 800, 1080, true);//原始15号字体,中文,界面宽度800,设计时原始宽度1080,是否加粗Console.WriteLine("缩放后字体:" + f1);
};
Console.WriteLine();
SL.Tools.LanguageHelper.LoadLanguage("zh-CN");
Console.WriteLine();
SL.Tools.LanguageHelper.LoadLanguage("zh-TW");
SL.Tools.Language.LanguageHelper.LoadLanguage("zh-TW");
View Code

多语言文件格式

 语言配置文件为json格式,如zh-CN.json,UTF-8编码;格式为:{"key1":"value1","key2":"value2"};
{"欢迎": "欢迎","无操作时间": "无操作时间/秒","等待时间": "等待时间/秒","退出系统": "退出系统","错误提示": "错误提示"
}

你可以在界面上注册事件LanguageChanged,在事件中修改界面的文字,配合GetFontByLanguage函数可以进行方便设置字体,效果更好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855915.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无法访问 Maven 3.8.1 http 仓库

1.情景展示 从git上面下载下来的项目,项目导包失败,具体报错信息如下: 无法访问 Maven 3.8.1 http 仓库 可能的解决方案:检查 Maven settings.xml 是否不包含 http 仓库 检查 Maven pom 文件是否不包含 http 仓库 http://maven.aliyun.com/nexus/content/groups/public/ 在 …

类文件结构详解 .class文件

回顾一下字节码 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运…

《黑神话:悟空》史诗级更新!ToDesk云电脑免下载畅玩!

重磅消息!《黑神话:悟空》终于迎来史诗级更新!新功能、新玩法、还有新套装,之前玩家提的地图、小曲进度条,游戏科学都安排上了,这更新内容的诚意度堪比DLC!首先是新玩法增加挑战又叫boss rush,天命人打通一周目后,在土地庙进入挑战,分为复战和连战模式。 复战模式可以…

昂瑞微 OM6626:芯片界的超级 “多面手”

嘿,各位科技迷们!今天咱要来探秘一下芯片界的一位 “全能明星”—— 昂瑞微 OM6626。这小家伙的诞生,那可是有一番精彩故事呢!一、诞生背景:时代呼唤的 “超级英雄” 如今这物联网的世界,那发展速度就跟坐了火箭似的。大家对低功耗、高性能的无线通信芯片,那叫一个渴望啊…

C++实现windows自动化按键

1.选择目标窗口 获取窗口句柄 void KeyPresser::selectWindow() {SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);selectedWindowLabel->setText("请点击目标窗口..."); }void CALLBACK K…

C语言的头文件包含,竟存在这么多知识点!

文章来自:https://zhuanlan.zhihu.com/p/472808057 很多事不深入以为自己懂了,但真正用到项目上,才会发现其中的问题。曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的。 本人曾经认为,一个.c文件对应一个.h文件…

OpenApi 下达指令

Completions模型将字符串作为输入,模型将返回一个或多个预测的完成项。大多数开发者应该使用的 chatCompletions API 来使用OpenAI最好和最新的模型。大部分支持传统Completions端点的模型将在2024年1月4日停止服务Chat Completions APl Chat Completions服务是一种特定的Comp…

昇腾MindSpeed-LLM全流程实践及踩坑记录

目录昇腾MindSpeed-LLM全流程实践及踩坑记录1、 MindSpeed-LLM简介1.1 MindSpeed简介1.2MindSpeed-LLM核心功能1.3 业界主流加速库对比2、全流程实践2.1 环境搭建流程正式开始前必看前置:所以,一、直接在mcore下进行全流程操作;二、不要按照主页readme上的脚本执行任务指令,…

Go调试运行时出现 Failed to launch:could not launch process:not an executable file 错误

在调试运行时,点击 Start Debugging 时出现 这个问题是当前打开的文件中没有 main() 函数 所以 当 点击 Start Debugging 时,要选择打开 当前页有 main() 函数的文件 例

Origin绘图教程 | 第一张绘图从这里开始

主要内容:生成数据+绘图图形+简单美化+保存项目 生成数据并绘图 1. 打开Origin。默认会打开一个空白的工作簿,其中包含一个两列的工作表。 2. 右键单击A列,在弹出菜单中选择填充列: 一组数字...(若菜单列表被折叠,你需要展开整个右键菜单来找到这个选项——可做如下设置关…

Go使用zap和lumberjack库,实现每小时间轮转日志文件

创建一个文件夹,命名为 loggerDemo 打开这个文件夹 打开终端,点击左下角 叉和感叹号 在弹出的窗口中点击 TERMINAL 进入终端(也可以使用快捷键 CTRL+` 直接打开)初始化 Go 的 Modulego mod init loggerDemo点击文件创建图标创建文件 创建一个名为 main.go 的文件 ,按下 …

Goby自定义编写EXP入门篇:编写模板基础使用讲解

众所周知,Goby可以利用便捷的Json图形化编写PoC/EXP,但由于Goby的PoC/EXP基于Go代码,所以很多新手同学可能不太理解其中的变量和代码逻辑,为此,我们将开展从入门到精通的系列教程,为大家详细讲解如何使用Goby的JSON图形化界面进行漏洞编写。 入门篇:Goby Poc模板架构讲解…