当前位置: 首页 > news >正文

C# Winforms 本地化 多语言支持 字符串资源

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


        一般我们写程序最初都是单语言的,中文版,完成以后考虑多语言的时候发现要改的地方太多了。

        如果只是为了一次性翻译成英文版还比较简单,改文字呗,工作量大点而已。

        但是如果是要正式支持多语言,那就涉及到太多修改了。

        所以最好一开始就按照多语言方式开发。

        Winforms程序的本地化分两种情况:一种是窗体的本地化,一种是其他资源(主要是字符串)的本地化。

        这两种都是基于资源文件实现本地化的,只不过由于窗体具有单独的编辑工具,所以操作有所不同。

目录

一、资源文件本地化机制

二、窗体的本地化

三、字符串本地化

四、程序代码读取字符串资源

五、闲话


一、资源文件本地化机制

        资源文件的本地化机制是通过资源文件名称来识别,资源文件名称中增加语言和地区名称,运行时自动从最精确的文件找到默认文件,例如:

        Resources.resx是项目的默认资源文件,项目创建时自动创建的,Resources.zh-Hans.resx是新建的,中间的“zh-Hans”表示的语言是“中文(简体)”,不带具体地区,如果程序运行时区域和语言选项设置的是简体中文,就会首先在匹配的资源文件里搜索资源,没有才去找默认资源文件。

        窗体的资源文件类似:

二、窗体的本地化

        窗体的本地化通过窗体的属性进行:

        先将Localizable设置为True(默认是False,因为本地化会降低程序运行速度),然后可以选择不同的Language。选择语言以后窗体上的所有控件的资源的修改都会写入到专门的资源文件里(不修改的不写,向上搜索直到默认资源文件)。

        当你选择了指定的语言,就会在项目里生成指定语言的资源文件,你做的修改就会写在指定的资源文件里。建议窗体的默认语言用英文,毕竟比较通用啊。

        注意,窗体的特定语言的资源文件不会显示在解决方案资源管理器里,因此你可能会无意中创造出多余的资源文件,可以手工在项目文件里删掉(仅仅删除资源文件而不编辑项目文件会导致无法编译,因为缺失文件)。

三、字符串本地化

        字符串本地化需要手工增加资源文件,在项目的“Properties”上右键,添加新项:

        注意名字,一定要正确,默认的名字是“Resouce”,没有“s”的。

        名字不正确系统就识别不到。

        中间的语言名称有地方查,我看到过,不过忘了在哪里了。不过没所谓,只要先设置一个窗体的语言,随便修改一个文本,看一下生成的资源文件名字就知道了。

        生成了特定语言的资源文件之后,可以双击编辑这个文件,也可以在默认资源文件里编辑。不过都要选择一下显示的列:

        不过我发现后来再双击特定语言的资源文件打开的也是默认资源文件,似乎有一点混乱。

        反正能编辑就行了啊。

四、程序代码读取字符串资源

        程序里读取字符串资源很简单:

			string Trial = Resources.ResourceManager.GetString("Trial");string NotTrial = Resources.ResourceManager.GetString("NotTrial");

        Resources是项目的命名空间下的Properties的属性。代码贴进去开发环境就会自动加上合适的using语句。

五、闲话

        实话说我觉得这些本地化方式都不是很理想。form的方式不方便对照修改,字符串表的方式不方便编辑长字符串。

        能在一个界面下同时编辑所有语言的字符串才比较方便,而且源码里的字符串都要再起个名字也不理想,而且只能用字符串名字去调用,如果写错了就得不到字符串,成为一个隐含的大BUG。


(这里是文档结束)

相关文章:

  • 如何管理两个Git账户
  • Android第六次面试总结之Java设计模式篇(一)
  • 使用VMware Workstation pro 17.5.1在Windows上安装Ubuntu 24.04.2的 详细步骤
  • 结合Hutool 突增突降检测的算法
  • javascript Map 和对象使用
  • 安卓基础(点击按钮动态添加视图到容器)
  • 单片机-STM32部分:5、STM32CubeMX实现HAL点灯
  • Leetcode Hot 100字母异位词分词
  • Vue 项目中使用 EJS 模板动态注入环境变量
  • 哪些岗位需要考取城市客运安全员证?
  • SCINet 训练代码修改
  • cmake qt 项目编译(win)
  • npm下载插件无法更新package.json和package-lock.json文件的解决办法
  • clickhouse - 重新建表覆盖旧表-解决分区时间错误问题-197001
  • AI内容检测的技术优势与应用场景
  • Java注解
  • Linux开发工具【上】
  • win11共享打印机主机设置
  • 使用 Python 监控系统资源
  • LeetCode 解题思路 45(分割等和子集、最长有效括号)
  • 习近平向“和平薪火 时代新章——纪念中国人民抗日战争和苏联伟大卫国战争胜利80周年中俄人文交流活动”致贺信
  • 重庆荣昌机关食堂五一期间受热捧:肉类总消耗2万斤,单日吃卤鹅800只
  • 五角大楼要裁一批四星上将
  • Neuralink脑接设备获FDA突破性医疗设备认证
  • 郭旭涛转任河北省科协党组书记、常务副主席,曾任团省委书记
  • “五一”假期预计全社会跨区域人员流动累计14.67亿人次