C# 核心概念 – C# 程序集本地化
Posted 工控上位机学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 核心概念 – C# 程序集本地化相关的知识,希望对你有一定的参考价值。
工控课堂【www.gkket.com】工程师必备网站
电气工控自动化-超万元免费资料
来源:老白说IT(头条)
在之前几讲中,老白给大家介绍了C#中module和Assembly的生成和使用。在这一篇中,老白将更加深入的介绍下Assembly其中的一个知识点——本地化(Localization)。
什么是本地化
如何标识本地化
Assembly中的本地化
示例
什么是本地化
在我们进入正题之前,我们需要先搞清楚什么是本地化。
顾名思义,本地化就是将C#所使用的资源变成本地所特有的一些性质或形式或方式等。有了本地化我们可以很方便的为某一个项目或应用程序提供多语言的版本,比如XX中文版、XX繁体版和XX英文版等。
有了本地化的好处就是,我们可以使用同一个应用程序来适配各个不同国家地区的不同语言使用者的使用习惯。而不需要每种语言或者针对每个地区来开发不同的程序。这也进而方便维护以及管理程序。
如何标识本地化
既然本地化能够适配各个地区和不同语言的使用者,那要如何进行标识或者区分不同的地区和语言呢?
我相信很多同学都想到了,没错就是类似于cn这样的标识,我们在上网的时候其实也会经常用到。比如苹果中国的官网就是https://www.apple.com.cn/而如果是访问的香港的页面那就是https://www.apple.com/hk/(至于为什么一个是/hk一个是.cn这个就不用太纠结了,多半是因为域名管理的问题)。但是即使是香港,有些人使用的是英语有些朋友使用的是中文,那要怎么进行区分呢?默认的https://www.apple.com/hk/使用的是繁体中文,如果需要使用英文可以使用https://www.apple.com/hk/en/。也就是hk代表了地区是香港,en代表了是英语(英语和英语还是有些不同的,所以地区+语言的组合能够更加准备的代表使用习惯)。
在上面的例子中我们看到了如何进行标识本地化。这部分的定义,感兴趣的同学可以查阅RFC 4646。里面为每一个区域定义了唯一名称。其标准的格式是“小写两字母语言代码-大写两字母/三字母语言代码”。比如zh-CN中的zh代表了中文,CN代表了中国,这使用的都是两字母代码。
Assembly中的本地化
在理解C# 核心概念 – C# 程序集(Assembly)下中我们谈及到了可以将资源文件内嵌到Assembly中。既然有资源文件,那就离不开本地化,接下来我们来谈谈Assembly如何支持本地化。
默认情况下,Assembly中嵌入的是默认的资源文件,而支持本地化的资源文件应该是另外独立的文件。这样做的能够达到一种隔离效果:
本地化处理不会对主程序产生影响
本地化的准备可以外包给第三方团队
因此,Assembly需要两部分来支持本地化:
Assembly本身内嵌默认的资源文件
为每一个所需要支持的本地化标识创建一个文件夹,比如支持ja-JP,就需要创建一个文件夹是ja-JP。文件夹包含针对这个语言的资源文件的Assembly
其中的资源文件又有如下要求:
资源文件必须是扩展名为.resources的二进制文件
默认资源文件不需包含本地化标识,本地化资源文件需要包含。比如默认资源文件是./A.resources。那么在ja-JP使用的资源文件就应该是./ja-JP/A.ja-JP.resources
资源文件需要打包成Assembly,且Assembly名需包含resources
以上的内容想必看起来晦涩难懂,让我们一起看看示例。
示例
准备资源文件
首先,我们创建一个文件夹,en-US。在文件夹下创建资源文件。
en-US/resource.en-US.txt内容如下:
note=(en-US)嵌入到Assembly文件中的文字
创建默认资源文件resource.txt内容如下:
note=(默认)嵌入到Assembly文件中的文字
注意,这里的资源文件的内容都是键值对。这个例子中,键是note,一会我们需要使用这个键来访问其对应的值。
准备源码
更改下我们之前使用到的Program.cs和Free.cs文件,Free.cs文件如下:
public sealed class Free{
public static void Run() {
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Resources.ResourceManager rm = new System.Resources.ResourceManager("resource", assembly);
string note = rm.GetString("note");
System.Console.WriteLine("========Reading from embedded file from Free.Run()=======");
System.Console.WriteLine(note);
}
}
这里我们使用的是ResourceManager来访问资源,在上一篇理解C# 核心概念 – C# 程序集(Assembly)下我们使用的GetManifestResourceStream方法来访问资源。其实这本质上是一样的,ResourceManager也是调用GetManifestResourceStream来获取资源文件的,不过其提供一层封装使用更加方便。
这里我们使用的是ResourceManager(name, assembly)这个构造函数,name是完整的资源名。在我们这个例子中默认的资源文件是resource.resources(一会会谈到这个文件如何生成),因此name就是resource。
刚刚提到,我们资源文件保存的是键值对,这里通过GetString(key)来访问note这个键。
再来看看更改后的Program.cs文件:
public sealed class Program{
public static void Main() {
System.Console.WriteLine("hello world");
System.Console.WriteLine("========Free Function========");
Free.Run();
}
}
文件夹结构
项目目录
|---Program.cs
|---Free.cs
|---resource.txt
|---en-US
|---resource.en-US.txt
转换和添加资源文件
在前面提到过,资源文件必须是.resources二进制文件,之前准备的txt文件并不能直接使用(在上一篇中我们直接使用了txt文件,使用ResourceManager来进行管理我们就不能直接使用txt文件了)。因此,我们需要将txt文件转换成resources文件。然后再将resources文件嵌入到Assembly中。
以en-US的为例,使用resgen将txt文件转换成.resources文件:
resgen resource.en-US.txt
运行完上述命令,文件夹中将会多出一个resource.en-US.resources文件。
然后运行下述命令来生成一个只包含resource的Assembly:
al /out:Free.resources.dll /c:en-US /embed:resource.en-US.resources
这里由于只是生成包含资源文件的Assembly而没有涉及编译源码,所以这里我们只能使用al而不能使用csc。
完整的过程如下图所示:
resource文件生成以及添加到Assembly
编译代码并添加默认资源文件
跟en-US的一样,先将resource.txt转换成resource.resources。
然后,我们生成一个Free.dll的library文件,这个Assembly包含了Free.cs的源码以及默认资源文件,代码如下:
csc /out:Free.dll /t:library /resource:resource.resources Free.cs
最后生成Program.exe,由于Free.Run方法在Free.dll中,所以需要引用Free.dll:
csc /r:Free.dll Program.cs
测试
这个时候,如果我们运行Program.exe(如果使用的是中文系统的话),得到的应该是默认的输出“(默认)嵌入到Assembly文件中的文字”。
将系统文字转换成英文,如下:
设置系统显示语言为en-US
再次运行Program.exe,得到的输出将是“(en-US)嵌入到Assembly文件中的文字”。
此时,如果我们将en-US文件夹删除,再次运行,得到的又将是默认的输出。整个过程如下:
Program在en-US文件夹删除前后的输出
转发是最大的鼓励!谢谢您的支持!
重要通知
想加入工控上位机学习技术交流群
请添加班长为好友
并备注:地区-行业-姓名昵称获取进群资格。
工控上位机学习 专业专注分享
——————————————————————
▣ 来源:网络-百度文库,侵删!
▣ 声明:本文素材系网络收集,工控上位机学习编辑整理。文中所用视频、图片、文字版权归原作者所有。但因转载众多,无法确认真正原始作者,故仅标明转载来源。如涉及作品版权问题,烦请及时联系17621634088(微信同号),我们将即刻确认版权并按国家相关规定支付稿酬!
她们都关注了,你还等什么?
以上是关于C# 核心概念 – C# 程序集本地化的主要内容,如果未能解决你的问题,请参考以下文章