使用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文件,再使用一个辅助程序msgfmtpo文件转换成ASP.NET支持的.resources文件。

这个方法的优点在于:

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

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

做法

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

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

    public class G18nController : Controller

    {

        public CultureInfo Culture { getset; }

 

        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 { getset; }

 

        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文件格式其实非常简单易懂:

1.  #: C:\workspace\Views\Role\Edit.cshtml:9

2.  msgid "管理用户组"

3.  msgstr ""

4.  

 

5.  #: C:\workspace\Views\Role\Edit.cshtml:23

6.  msgid "用户组[{0}]的权限"

7.  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.       我写了一个小的批处理,将345步结合在一起执行:

1.  pushd src

2.  del /F source.lst

3.  dir /s /b src\*.cs >> source.lst

4.  dir /s /b src\*.cshtml >> source.lst

5.  tools\zgettext\zgettext\bin\Debug\zgettext.exe -k T -f source.lst -o glob\website.po

6.  tools\zgettext\msgfmt\bin\Debug\msgfmt.exe -o src\App_GlobalResources\website.resources -i glob\ website.po

7.       popd

 

希望对你有点帮助。




本文转自 donjuan 博客园博客,原文链接:  http://www.cnblogs.com/killmyday/archive/2011/04/21/2023816.html   ,如需转载请自行联系原作者
相关文章
|
1月前
|
人工智能 前端开发 Devops
.NET技术在现代开发中的作用:.NET技术的核心价值、在现代应用开发中的实际应用、以及面临的挑战与未来趋势。
.NET技术是软件开发领域的核心力量,本文从其核心价值、实际应用及未来挑战三方面进行探讨。它支持多种语言,提供强大的开发工具和丰富的类库,并具备跨平台能力。在现代应用开发中,.NET广泛应用于企业级系统、Web应用、移动应用、云服务和游戏开发等领域。面对性能优化、容器化、AI集成等挑战,.NET持续创新以适应不断发展变化的技术环境。
48 4
|
1月前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
60 4
|
1月前
|
人工智能 物联网 开发者
.NET技术在现代软件开发中的应用愈发广泛和深入
.NET技术是软件开发的关键支柱,本文分为三部分探讨其创新应用:最新进展如.NET 5/6统一平台、性能提升、跨平台支持增强、云集成优化及开源社区贡献;应用场景涵盖微服务架构、物联网、AI/机器学习、游戏及移动应用开发;未来发展潜力在于持续性能优化、云原生支持、新兴技术集成、生态扩张及教育培训加强。.NET正以其强大适应性和创新潜力引领软件开发的新方向。
29 3
|
1月前
|
人工智能 开发框架 .NET
如何掌握.NET技术,引领开发前沿:.NET技术的核心能力、在现代开发中的应用实践、以及如何通过.NET技术实现持续创新。
.NET技术已成为软件开发不可或缺的部分,本文分三部分探讨:核心能力如多语言支持、统一运行时环境、丰富的类库及跨平台能力;现代开发实践包括企业级应用、Web与移动开发、云服务及游戏开发;并通过性能优化、容器化、AI集成等方面实现持续创新,使开发者站在技术前沿。
45 3
|
11天前
|
监控 网络协议 API
.NET WebSocket 技术深入解析,你学会了吗?
【9月更文挑战第4天】WebSocket 作为一种全双工协议,凭借低延迟和高性能特点,成为实时应用的首选技术。.NET 框架提供了强大的 WebSocket 支持,使实时通信变得简单。本文介绍 WebSocket 的基本概念、.NET 中的使用方法及编程模型,并探讨其在实时聊天、监控、在线游戏和协同编辑等场景的应用,同时分享最佳实践,帮助开发者构建高效实时应用。
51 12
|
5天前
|
人工智能 前端开发 Devops
.NET技术自发布以来,在软件开发领域发挥了重要作用
【9月更文挑战第12天】.NET技术自发布以来,在软件开发领域发挥了重要作用。本文分为三部分探讨其在现代开发中的应用:首先介绍.NET的核心价值,包括语言多样性、强大的开发工具支持、丰富的类库、跨平台能力和活跃的社区;接着分析其在企业级应用、Web开发、移动应用、云服务及游戏开发中的实际应用;最后讨论.NET面临的挑战与未来趋势,如性能优化、容器化、AI集成及跨平台框架竞争等。通过不断的技术创新和社区驱动,.NET将持续推动软件开发的进步。
16 4
|
10天前
|
人工智能 开发框架 算法
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
|
10天前
|
传感器 应用服务中间件 Linux
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
|
10天前
|
人工智能 算法 C#
C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)
C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)
|
20天前
|
大数据 开发工具 开发者
从零到英雄:.NET核心技术带你踏上编程之旅,构建首个应用,开启你的数字世界探险!
【8月更文挑战第28天】本文带领读者从零开始,使用强大的.NET平台搭建首个控制台应用。无论你是新手还是希望扩展技能的开发者,都能通过本文逐步掌握.NET的核心技术。从环境搭建到创建项目,再到编写和运行代码,详细步骤助你轻松上手。通过计算两数之和的小项目,你不仅能快速入门,还能为未来开发更复杂的应用奠定基础。希望本文为你的.NET学习之旅开启新篇章!
26 1