为程序设定多语言版本

(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都帮你做了。具体可参考:

https://docs.microsoft.com/zh-cn/dotnet/api/system.resources.neutralresourceslanguageattribute?view=netframework-4.8

如果程序中指定的本地化资源无法找到(如删除对应先前的代码,删除了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"去掉了其拓展名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值