2012年5月4日星期五

在代码中直接写母语,通过T4模板自动生成母语的.resx文件

在代码中直接写母语,通过T4模板自动生成母语的.resx文件

    这篇文章不讨论多语言的方案,只是介绍使用资源文件(.resx)解决多语言的一个自动化工具。

 

T4模板

    T4模板不用太多介绍了,博客园里面搜T4就有很多文章介绍。

 

.resx资源文件

    在VS中添加一个资源文件,默认会自动生成一个支持强类型的资源文件类,比如,添加Resources.resx,并有一个字符串资源:

image

那么默认的代码生成器会生成一个强类型的资源访问方式Resources.FileNotExisted供你使用:

throw new Exception(Resources.FileNotExisted, fileName);

这样当我们需要某个字符串资源的时候就先要在resx文件里面添加一个key-value项之后才能使用。之前在博客园看到一篇文章(不好意思,找不到文章链接了)用类似如下的方式来使用资源文件:

throw new Exception(Resources.Resource("文件{0}不存在", fileName));

我也不记得他的文章是怎么把这个字符串资源转换成.resx文件的,不过我还记得我当时第一个念头就是使用T4模板来自动生成.resx文件,这就是自动生成的.resx文件:

image

对于其他语言的resx文件,只需要翻译Value列就可以了:

image

这种方式实际就是直接将你需要使用的文本信息(比如提示信息,错误信息等)作为.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文件夹,并且增加以下文件:

image

其中.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也会被抓取出来

 

优缺点

优点就是可以直接使用母语。

缺点就是对于表达相同意思的信息,不同的人(同一个人不同时间)写出来的信息可能不一样,这样就增加了冗余。

 

欢迎提出修改意见。


TAG: