(1)一个多语言支持示例:
1、添加控制台程序Localization,添加资源文件Res.resx,给资源文件添加字符串资源:Hello,值为“你好”;
2、继续添加资源Res.zh-CN.resx,添加字符串资源:Hello,值为“你好哇”;
3、再添加资源Res.en-US.resx,添加字符串资源:Hello,值为“Hi!”;
4、添加代码:
static void Main(string[] args)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
//Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("zh-CN");
Console.WriteLine(Res.Hello);
Console.ReadKey();
}
根据设置可以不同语言显示输出;注意Res是自动生成的资源类(类似Form窗体)。Res.Hello可获得Hello字符串指定语言结果,
它的定义是这样:
/// <summary>
/// 查找类似 你好 的本地化字符串。
/// </summary>
internal static string Hello {
get {
return ResourceManager.GetString("Hello", resourceCulture);
}
}
5、编译程序,系统自动根据资源文件的名称生成3个本地化资源(其中Res.resx嵌入到主程序中):
en-US及zh-CN目录均包含1个Localization.resources.dll,这是二进制本地化资源,它们是由3个resx资源文件(XML格式)分别生成Localization.Res.en-US.resources、Localization.Res.resources,Localization.Res.zh-CN.resources文件后,再生成dll的。可以在obj目录找到这些中间文件。可通过resgen.exe将resx文件生成Localization.Res.resources等文件,再由al.exe生成Localization.resources.dll等文件(手动比较麻烦,可通过批处理来做),这些VS都帮你做了。具体可参考:
如果程序中指定的本地化资源无法找到(如删除对应先前的代码,删除了en-US目录的资源),则会使用嵌入主程序的资源。
(2)反编译的情况处理:
有时候用反编译工具(如dnspy)反编译出来的程序们有1个形如Localization.Res.resources的文件和Localization.cs资源类,编译后执行时会出现内部异常。因为你把嵌入的资源从主程序中提取出来了,此时你没有resx文件,无法再将资源嵌入到你的新程序。解决方法是修改Localization.cs文件:
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
// global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Localization.Res", typeof(Res).Assembly);
System.Resources.ResourceManager temp = System.Resources.ResourceManager.CreateFileBasedResourceManager(
"Localization.Res", Directory.GetCurrentDirectory(), null);
resourceMan = temp;
}
return resourceMan;
}
}
其中CreateFileBasedResourceManager方法是直接从Localization.Res.resources文件加载资源,参数"Localization.Res"去掉了其拓展名。