请教:关于资源本地化的问题我有个用C#写的测试资源文件的解决方案(ResTest),由3个项目组成,分别是ConsoleApplication1,ConsoleApplication2,ConsoleApplication3。
    
其中ConsoleApplication1 是主应用程序,ConsoleApplication2 和 ConsoleApplication3分别为ConsoleApplication1 生成 Res.zh-CN.resources和 Res.resources资源文件。(Res.zh-CN.resources和 Res.resources已经跟ConsoleApplication1项目关联好)各程序代码如下:
ConsoleApplication1: 
-----------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Resources;
using System.Reflection;
using System.Globalization;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly SampleAssembly= Assembly.GetExecutingAssembly();
            System.Resources.ResourceManager m_rm = null;            Console.WriteLine("CurrentCulture is {0}.", CultureInfo.CurrentCulture.Name);            m_rm = new ResourceManager("ConsoleApplication1.Res", SampleAssembly);
            Console.Write("Al00001 =" + m_rm.GetString("Al00001"));            Console.Read();
        }    }}
ConsoleApplication2: 
-----------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;using System.Resources;namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            ResourceWriter rw = new ResourceWriter("..\\..\\..\\ConsoleApplication1\\Res.zh-CN.resources");            rw.AddResource("Al00001", "您好");
            rw.Close();            Console.WriteLine("Res.zh-CN.resources builded OK.");
            Console.ReadKey();        }
    }
}ConsoleApplication3: 
-----------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Resources;namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            ResourceWriter rw = new ResourceWriter("..\\..\\..\\ConsoleApplication1\\Res.resources");            rw.AddResource("Al00001", "Hello");
            rw.Close();            Console.WriteLine("Res.resources builded OK.");
            Console.ReadKey();        }
    }
}程序目录如下:
ResTest
|
|——ConsoleApplication1
|——ConsoleApplication2
|——ConsoleApplication3
各项目生成后,运行ConsoleApplication1,得到运行结果:
CurrentCulture is zh-CN.
Al00001 =Hello我的问题就是:我的Culture 是zh-CN, 为什么 “Al00001 =Hello”, 而不是 “Al00001 =您好” ?
谢谢!
本机环境:
windows 2003中文版 + vs2005 中文版
操作系统的区域选项 为“中文(中国)”另:我在vs2003下测试以上代码,得到的结果是:
CurrentCulture is zh-CN.
Al00001 =您好难道vs2005和vs2003对于资源本地化,有不同的处理吗?
恳请高手指点。

解决方案 »

  1.   

    本地化资源文件,由先必须保证资源文件的版本和原文件的版本相同,[assembly: AssemblyVersion(??)),还得保证使用的强名称一致。楼主上的两个资源文件,应该是还没有一起编译到 ConsoleApplication1 中。
      

  2.   

    raozhiven(raozhiven) ,
    你说的[assembly: AssemblyVersion(??),我都一样了,但是结果还是 Al00001 =Hello,
    我觉得资源文件应该是编译到 ConsoleApplication1 ,要不怎么能提示出Al00001 =Hello。你试运行我的代码,看结果是不是和我的一样?等待
      

  3.   

    关键的关键,你在ConsolApplication1中这样调用:m_rm = new ResourceManager("ConsoleApplication1.Res", SampleAssembly);读出的值当然只能是 Hello了。看看 .Net 读取本地化资源的代码吧:
    resources = new ResourceManager(typeof(Form1));如果你将上面那句代码改成这样,应该就可以了:
    m_rm = new ResourceManager("ConsoleApplication1.Res" + CultureInfo.CurrentCulture.Name, SampleAssembly);
      

  4.   

    中间少了个“.”m_rm = new ResourceManager("ConsoleApplication1.Res" + "." + CultureInfo.CurrentCulture.Name, SampleAssembly);
      

  5.   

    你使用 Reflector 查看一下 ResourceManager 你就明白问题出在哪里了。
      

  6.   

    不是很懂你是这么创建的,为啥要建议三个Application啊,我有一片帖子解决了这个问题,楼主感兴趣的可以看看:http://blog.csdn.net/alvachien/archive/2006/09/24/1272441.aspx
      

  7.   

    根据raozhiven建议,我把程序改成,使用m_rm = new ResourceManager("ConsoleApplication1.Res" + "." + CultureInfo.CurrentCulture.Name, SampleAssembly)后,但程序运行时出现了以下问题:未处理 System.Resources.MissingManifestResourceException
      Message="未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“ConsoleApplication1.Res.zh-CN.resources”正确嵌入或链接到程序集“ConsoleApplication1”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。"
      Source="mscorlib"根据错误提示,我仍然不能知道,到底错在什么地方,因为Res.zh-CN.resources 我是跟ConsoleApplication1 关联着的。难道编译时,编译器没有自动编译进去吗?困惑。。
      

  8.   

    对于alvachien,提出的为啥要建三个Application。缘由是这样的:假设ConsoleApplication1 就是你开发的主应用程序,那么ConsoleApplication2和 ConsoleApplication3,就是专门为你主应用程序生成本地化资源的。把资源和程序分离开来,能够很好的开发出国际化的应用程序。当以后我要为某种语言进行本地化时,只要新写一个ConsoleApplication4就可以了,不用改ConsoleApplication1 。你提供的:
    http://blog.csdn.net/alvachien/archive/2006/09/24/1272441.aspx
    对我来说,非常要价值。正在研究当中
      

  9.   

    错误明显提示你未将资源嵌入到 ConsolApplication1 中。不明白?
    你应将 ConsoleApplication1 目录下的 Res.zh-CN.resources 文件包含在 ConsolApplication1 项目中,并设置生成操作为“嵌入的资源”
      

  10.   

    是的,我已经是把Res.zh-CN.resources  文件包含在  ConsolApplication1  项目中,并设置生成操作为“嵌入的资源”了,但结果就是以上的错误提示,这就是我困惑的地方。。