在代码中直接写母语,通过T4模板自动生成母语的.resx文件
2012-05-04 13:53
645 查看
这篇文章不讨论多语言的方案,只是介绍使用资源文件(.resx)解决多语言的一个自动化工具。
那么默认的代码生成器会生成一个强类型的资源访问方式Resources.FileNotExisted供你使用:
这样当我们需要某个字符串资源的时候就先要在resx文件里面添加一个key-value项之后才能使用。之前在博客园看到一篇文章(不好意思,找不到文章链接了)用类似如下的方式来使用资源文件:
我也不记得他的文章是怎么把这个字符串资源转换成.resx文件的,不过我还记得我当时第一个念头就是使用T4模板来自动生成.resx文件,这就是自动生成的.resx文件:
对于其他语言的resx文件,只需要翻译Value列就可以了:
这种方式实际就是直接将你需要使用的文本信息(比如提示信息,错误信息等)作为.resx文件的Key值,Resources.Resouce的代码就是根据这个key值去获取多语言的Value值:
其中langs指定你需要的除母语外的其他语言,这样就可以生成对应语言的.resx文件。
另外一种更简单的办法就是使用NuGet的来安装:
安装完成后会在你的当前的项目添加一个Resources文件夹,并且增加以下文件:
其中.resx文件是根据源代码中的Resources.Resource自动生成的,这些文件可以使用VS的默认资源编辑器进行编辑修改的。
Resources.Resource可以如下方式使用:
2.只支持C#
3.所有使用了这种方式的文件必须保存后才能自动生成完整
4.如果修改了某条信息,老信息已经没有任何地方使用了,.resx文件中的仍将保留该条信息,只是将该条注释修改成!!!!!!NOT EXSITED!!!!!!,没有删除的原因是对于其他语言的版本可能此条修改并不会影响到原翻译,那么保留下来可以手工拷贝到新的信息对应位置,然后再人工删除。
5.只支持字符串资源
6.注释中的Resources.Resource也会被抓取出来
缺点就是对于表达相同意思的信息,不同的人(同一个人不同时间)写出来的信息可能不一样,这样就增加了冗余。
欢迎提出修改意见。
T4模板
T4模板不用太多介绍了,博客园里面搜T4就有很多文章介绍。.resx资源文件
在VS中添加一个资源文件,默认会自动生成一个支持强类型的资源文件类,比如,添加Resources.resx,并有一个字符串资源:那么默认的代码生成器会生成一个强类型的资源访问方式Resources.FileNotExisted供你使用:
throw new Exception(Resources.FileNotExisted, fileName);
这样当我们需要某个字符串资源的时候就先要在resx文件里面添加一个key-value项之后才能使用。之前在博客园看到一篇文章(不好意思,找不到文章链接了)用类似如下的方式来使用资源文件:
throw new Exception(Resources.Resource("文件{0}不存在", fileName));
我也不记得他的文章是怎么把这个字符串资源转换成.resx文件的,不过我还记得我当时第一个念头就是使用T4模板来自动生成.resx文件,这就是自动生成的.resx文件:
对于其他语言的resx文件,只需要翻译Value列就可以了:
这种方式实际就是直接将你需要使用的文本信息(比如提示信息,错误信息等)作为.resx文件的Key值,Resources.Resouce的代码就是根据这个key值去获取多语言的Value值:
internal static string Resource(string name, params object[] args)
{
string text;
try
{
text = string.Format(ResourceManager.GetString(name, Culture), args);
}
catch
{
text = string.Format(name, args);
}
return text;
}
如何使用
你可以去项目的网址下载所有的T4模板文件,然后在项目中包含这些T4 include文件并添加一个.tt文件,修改成如下内容:<#@ template debug="true" hostSpecific="true" #>
<#@ include file="Resources.CS.ttinclude" #><#@
output extension=".cs"#><#
VSHost vsHost = new VSHost(this);
string[] langs = new string[]{"en"};
GenResx(vsHost, langs);
#>
其中langs指定你需要的除母语外的其他语言,这样就可以生成对应语言的.resx文件。
另外一种更简单的办法就是使用NuGet的来安装:
install-package ResxGenViaT4
安装完成后会在你的当前的项目添加一个Resources文件夹,并且增加以下文件:
其中.resx文件是根据源代码中的Resources.Resource自动生成的,这些文件可以使用VS的默认资源编辑器进行编辑修改的。
Resources.Resource可以如下方式使用:
Resources.Resource("提示信息");
Resources.Resource("错误信息:{0}", err);
//可以包含引号
Resources.Resource("提示\"信息\"");
Resources.Resource(@"提示""信息""");
系统要求
需要使用Visual Studio 2010以及安装Visual Studio 2010 SDK。使用注意事项及问题
1. Resources.Resource中的信息必须在一行中写完,不能分行:Resources.Resource(@"Abc
123");
2.只支持C#
3.所有使用了这种方式的文件必须保存后才能自动生成完整
4.如果修改了某条信息,老信息已经没有任何地方使用了,.resx文件中的仍将保留该条信息,只是将该条注释修改成!!!!!!NOT EXSITED!!!!!!,没有删除的原因是对于其他语言的版本可能此条修改并不会影响到原翻译,那么保留下来可以手工拷贝到新的信息对应位置,然后再人工删除。
5.只支持字符串资源
6.注释中的Resources.Resource也会被抓取出来
优缺点
优点就是可以直接使用母语。缺点就是对于表达相同意思的信息,不同的人(同一个人不同时间)写出来的信息可能不一样,这样就增加了冗余。
欢迎提出修改意见。
相关文章推荐
- 通过t4模板结合XML定义文件生成MVVM中的Model Entity Class 代码
- 通过t4模板结合XML定义文件生成MVVM中的Model Entity Class 代码
- HibernateTools工具通过hbm文件自动生成ddl、pojo等代码
- 在运行程序时报错:"如果在 Code First 模式下使用,则使用 T4 模板为 Database First 和 Model First 开发生成的代码可能无法 正常运行。若要继续使用 Database First 或 Model First,请确保在执行应用程序的 config 文件中指 定 Entity Framework 连接字符串。若要将这些从 Database First 或 Mod
- 根据tt文件模板自动生成代码
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]
- 新建文件夹的时候自动按照文档库模板生成子文件夹和文件的解决代码
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]
- C# 通过T4自动生成代码
- HibernateTools工具通过hbm文件自动生成ddl、pojo等代码
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
- 一起谈.NET技术,创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
- eclipse develop for C\C++ 文件注释函数注释代码模板自动生成方法
- 一起谈.NET技术,创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]
- java代码通过freemarker模板实现自动生成dao,model,service,jsp
- [转]创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
- 采用axis2c进行webservice发布的流程3-通过wsdl文件,自动生成C的服务端代码