千家信息网

如何使用gettext技术为ASP.NET网站实现国际化支持

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,这篇文章将为大家详细讲解有关如何使用gettext技术为ASP.NET网站实现国际化支持,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。不知道有多少人对
千家信息网最后更新 2024年11月28日如何使用gettext技术为ASP.NET网站实现国际化支持

这篇文章将为大家详细讲解有关如何使用gettext技术为ASP.NET网站实现国际化支持,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

不知道有多少人对这个题目感兴趣,因为最近在做一个网站玩玩,有点闲心给网站加了国际化支持。虽然ASP.NET已经有ResourceManager这个类,并且有标签实现国际化的支持了,但是它的问题是,ResourceManager对每一个需要翻译的句子都要求有一个键(Key):

1. 要先创建一个.resx文件,在Visual Studio里,有一个工具编辑这个.resx文件。

2. 对每一个需要翻译的句子,添加一个键值对。

3. 然后在代码里,使用ResourceManager或者<%#这个标签,通过定义好的键来告诉ASP.NET在运行的时候查找正确的翻译文本。

太麻烦了,不知道大家有什么其它好的方法,我使用的方法是从unix gettext那边借用过来的理念。

理念

Gettext的理念很简单,文本翻译吗,说白了就是把一句话翻译成另外一句话嘛,这个要翻译的句子,本身就可以当做检索要用的关键字,何必要再新建一个另外的关键字呢?gettext的方式很简单:

1. 在源代码里,你可以编写一个特殊的函数执行翻译,这个函数只接受一个参数,就是要翻译的文本。

2. 使用一个辅助程序xgettext扫描源代码的文本,将所有待翻译的文本都找出来,保存到一个文件里,一般来说,这个文件叫做po文件。

3. 因为ASP.NET程序不支持po文件,再使用一个辅助程序msgfmt将po文件转换成ASP.NET支持的.resources文件。这个方法的优点在于:

1. 你在编写程序的时候,不用为需要翻译的句子,定义一个新的关键字——这个关键字一般都比较难理解,也不好取名。在维护代码的时候很麻烦——因为你需要不停地在.resx编辑器和cs文件之间切换。

2. 不知道怎么搞的,很难找到可以编辑.resx文件的工具,而gettext生成的po文件是普通的文本文件,而且格式非常简单。这样在翻译的时候,就很方便了。

做法

比如写了一个ASP.NET MVC程序,当然窗体(Web Form)形式的程序理念也是一样的,

1. 写一个控制器和视图页的基类,里面都有一个执行翻译的函数T:

public class G18nController : Controller  {  public CultureInfo Culture { get; set; }  public string T(string message)  {  var obj = HttpContext.GetGlobalResourceObject("website", message, Culture);  var translated = obj == null ? null : obj.ToString();  if (string.IsNullOrEmpty(translated))  return message;  else return translated;  }  }  public abstract class G18nWebViewPage : WebViewPage  {  public CultureInfo Culture { get; set; }  public string T(string message)  {  var obj = HttpContext.GetGlobalResourceObject("website", message, Culture);  var translated = obj == null ? null : obj.ToString();  if (string.IsNullOrEmpty(translated))  return message;  else return translated;  }  }

上面的Culture属性,可以从Request.Headers["Accept-Language"]属性取得。

2. 在代码里,针对每个要翻译的句子,直接调用这个T函数好了:

throw new ArgumentException(string.Format(T("找不到ID为{0}的项目!"), id));

3. 程序写好后,要开始翻译,调用gettext程序将所有要翻译的句子找出来,保存到指定的po文件里。可以在http://gnuwin32.sourceforge.net/packages/gettext.htm这个网页下载gettext。

但是悲剧的是,gettext好像要求主语言是英文,对中文字符串支持的不是很好。所以我就用C#自己写了一个gettext,你可以在本文的附件里下载它,命令的格式是:

Zgettext -k T -i 源代码路径名 -o 输出的po文件名

Zgettext -k T -f 源代码路径列表文件 -o 输出的po文件名

比如:

Zgettext -k T -i AccountController.cs -o test.po

4. 生成的po文件格式其实非常简单易懂:

#: C:\workspace\Views\Role\Edit.cshtml:9  msgid "管理用户组" msgstr "" #: C:\workspace\Views\Role\Edit.cshtml:23  msgid "用户组[{0}]的权限" msgstr ""

Msgid就是要翻译的句子,msgstr就是翻译好的句子。

5. 完成翻译后,使用一个辅助程序msgfmt将翻译好的po文件转换成ASP.NET支持的格式。因为原始的gettext程序包里的msgfmt.exe好像不能生成ASP.NET识别的.resources文件,所以 我也写了一个msgfmt程序完成这个工作——在本文的附件里可以下载到,命令格式是:

Msgfmt -o 输出的resource文件路径 -i 输入的po文件路径

例如:

Msgfmt -o website.en-US.resources -i website.po

注意:输出的resource文件名,必须与你在***步里,使用HttpContext.GetGlobalResourceObject函数的***个参数相同。

6. 我写了一个小的批处理,将3、4、5步结合在一起执行:

pushd src  del /F source.lst  dir /s /b src\*.cs >> source.lst  dir /s /b src\*.cshtml >> source.lst  tools\zgettext\zgettext\bin\Debug\zgettext.exe -k T -f source.lst -o glob\website.po  tools\zgettext\msgfmt\bin\Debug\msgfmt.exe -o src\App_GlobalResources\website.resources -i glob\ website.po  popd

关于如何使用gettext技术为ASP.NET网站实现国际化支持就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

文件 程序 支持 句子 文本 函数 格式 国际 网站 关键 关键字 就是 时候 源代码 理念 路径 输出 代码 文件名 方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 潜渊症服务器存档转移 数据库包括哪三类文件 质量可靠的优质软件开发 松江区品牌软件开发值得推荐 网络安全知识法试题及答案 avg 服务器 软件开发助理工程师什么级别 为什么要保障网络安全ppt 网络安全要注意哪一些问题 纯真IP数据库系统 交通行业网络安全工作方案报价 aspen导出物流数据库 崇明区散射网络技术优势 华为智慧屏软件开发合作公司 数据库查询实验总结 删除微软账户中的同步数据库 2020网络安全大赛有哪些 阿尔法连接bt数据库 rpu软件开发 昆明易学java软件开发 广西企业展示厅分布式服务器 新乡市吉乾网络技术有限公司 质量可靠的优质软件开发 2022年网络安全进校园动漫 设计数据库的三张表满足第三范式 怎么看国际服的服务器 外包的软件开发和测试 大数据数据库查询计算很慢 怎样查看本机数据库服务器名字 中国网络安全的发展史
0