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

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。


(这里是文档结束)

http://www.xdnf.cn/news/4104.html

相关文章:

  • 【商城系统中的多商户和单商户模式差异】
  • 第22节:深度学习基础-损失函数介绍
  • 神经网络:节点、隐藏层与非线性学习
  • 【WPS】怎么解决“word的复制表格”粘贴到“excel的单元格”变多行单元格的问题
  • Suno v4.5:AI 音乐创作的新突破
  • PHP分页显示数据,在phpMyadmin中添加数据
  • window 显示驱动开发-线程同步和 TDR
  • 【Docker系列】使用格式化输出与排序技巧
  • 如何对 Redis 进行水平扩展和垂直扩展以应对微服务流量的增长?
  • 【ARM】DS-试用授权离线激活
  • 动手学深度学习12.1. 编译器和解释器-笔记练习(PyTorch)
  • Kubernetes环境部署OwnCloud网盘服务
  • 学苑教育杂志学苑教育杂志社学苑教育编辑部2025年第9期目录
  • 前端知识-hook
  • 荣耀A8互动娱乐组件部署实录(第4部分:房间服务端逻辑与玩家交互处理)
  • spring cloud gateway(网关)简介
  • C++ 类
  • 02 mysql 管理(Windows版)
  • LintCode407-加一,LintCode第479题-数组第二大数
  • [Linux_69] 数据链路层 | Mac帧格式 | 局域网转发 | MTU MSS
  • 虚标的WIFI连接速度
  • n8n系列(1)初识n8n:工作流自动化平台概述
  • 第二章 Logback的架构(二)
  • RabbitMQ ①-MQ | Linux安装RabbitMQ | 快速上手
  • 游戏引擎学习第261天:切换到静态帧数组
  • (提升)媒体投稿技能
  • 机器学习 day6 -线性回归练习
  • 云计算与大数据进阶 | 21、可扩展系统构建
  • PyTorch 与 TensorFlow 中基于自定义层的 DNN 实现对比
  • 应用服务器Tomcat