关于ASP.NET 2.0 中的资源与本地化
请看:http://www.microsoft.com/china/msdn/library/webservices/asp.net/BasicInstincts0608.mspx?mfr=true
关于Resources and Localization
请看:http://msdn.microsoft.com/msdnmag/issues/06/05/BasicInstincts/
以下是我在微软新闻组提出的问题及得到的答案。
2006年11月3日 10:11
microsoft.public.cn.dotnet.languages.csharp
请教:关于资源本地化的问题
1、
我有个用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();
}
}
}
各项目生成后,运行ConsoleApplication1,得到运行结果:
CurrentCulture is zh-CN.
Al00001 =Hello
我的问题就是:我的Culture 是zh-CN, 为什么 “Al00001 =Hello”, 而不是
“Al00001 =您好” ?
谢谢!
本机环境:
windows 2003中文版 + vs2005 中文版
操作系统的区域选项 为“中文(中国)”
2、
你好,
由于您使用了ResourceWriter直接创建资源文件,所以您在获取资源的时候应该这样写:m_rm = ResourceManager.CreateFileBasedResourceManager("Res", "..\\..\\", null);
希望可以对您的问题有所帮助。
胡文毅
在线技术支持工程师
微软全球技术支持中心
---------------------------------------------------------------------------------------
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。
3、
使用 ResourceManager.CreateFileBasedResourceManager,对 程序的发布有点不好,并且没能用上 .net提供的默认程序集的优势。
另:我在vs2003下测试问题中所列的代码,得到的结果是:
CurrentCulture is zh-CN.
Al00001 =您好
难道vs2005和vs2003对于资源本地化,有不同的处理吗?
4、
VS2005默认使用resx(xml格式)资源文件。
您可以在生成资源的时候使用ResXResourceWriter,代码如下
ResXResourceWriter rsxw = new ResXResourceWriter("..\\..\\..\\ConsoleApplication1\\Res.zh-CN.resx");
rsxw.AddResource("Al00001", "您好");
rsxw.Close();
关于框架资源更详细的内容参考如下:
Microsoft .NET 框架资源基础
http://www.microsoft.com/china/MSDN/library/netFramework/netframework/Nfdnformswinforms02202003.mspx?mfr=true
.Resx 文件格式
http://msdn2.microsoft.com/zh-cn/library/ekyft91f(VS.80).aspx
如果您还是想直接使用resources文件,您需要手动将本地资源文件编译成附属程序集,方法如下:
al /t:lib /embed:Res.zh-CN.resources,ConsoleApplication1.Res.zh-CN.resources /culture:zh-CN /out:ConsoleApplication.resources.dll
您也可以使用Post-build Event:
md "$(TargetDir)zh-CN"
$(FrameworkDir)\$(FrameworkVersion)Al.exe /t:lib /embed:"$(ProjectDir)Res.zh-CN.resources",ConsoleApplication1.Res.zh-CN.resources /culture:zh-CN /out:"$(TargetDir)zh-CN\ConsoleApplication1.resources.dll"
希望对您的问题有所帮助。
胡文毅
在线技术支持工程师
微软全球技术支持中心