文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-17 13:31

关注

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

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

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

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

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

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

理念

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

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

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

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

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

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

做法

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

写一个控制器和视图页的基类,里面都有一个执行翻译的函数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<U> : WebViewPage<U>  {  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"]属性取得。

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

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

程序写好后,要开始翻译,调用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

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

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

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

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

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

例如:

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

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

我写了一个小的批处理,将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网站实现国际化支持就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯