在上一篇文章中介绍了mono的中文问题,不管怎样,我们总算可以让mono编译的程序显示汉字了。如果你要开发国际化的程序或者组件,你就应该使用Mono的国际化方法,处理相关的国际化文本。
在本篇文章中国际化专指程序中设计的字符串,不会讨论日期、货币等国际化问题。
现在,Mono利用gettext进行程序中字符串的翻译,你也可以采用gettext#进行国际化,但它不是Mono推荐的方式。
在Mono.Posix配件中的Mono.Unix命令空间下,有一个Catalog类,它包装了libintl提供国际化服务。
本文以一个控制台程序演示如果进行国际化处理。
先看一个不进行国际化的控制台程序:
using System; class MainClass { public static void Main(string[] args) { Console.WriteLine("Hello everyone!My name is smallnest"); int i = 32; Console.WriteLine("I'm {0} years old.",i); } } |
其中涉及到两个字符串:
"Hello everyone!My name is smallnest"
"I'm {0} years old."
其中第二个字符串涉及到单复数的问题,作为一个友好的字符串,如果年龄是1的话,字符串应该为"I'm {0} year old.",其中的year应该为单数形式。
下面我们处理国际化:
首先在monodevelop中引入Mono.Posix.dll(如果手工编译,需要加-t: Mono.Posix),
然后Main.cs文件中加入
using Mono.Unix;
在Main方法中初始化Catalog类:
Catalog.Init("i18n","./locale");
程序在运行时将在. locale/zh_CN/ LC_MESSAGES/目录下查找i18n.mo文件,如果文件存在,并且含有国际化的文本,将使用国际化的文本替换,否则不替换。
最后,Main.cs文件如下:
Catalog.GetString方法是采用普通的方式替换文本。
Catalog.GetPluralString将根据条件选择单数形式的文本还是复数形式的文本,如果第三个参数是1,将采用单数形式的文本,否则采用复数形式的文本。
到Main.cs文件所在的目录下,运行生成Main.exe文件:
mcs –codepage:utf8 Main.cs |
使用xgettext导出需要国际化的po文件:
xgettext --from-code=UTF-8 Main.cs -o zh_CN.po |
翻译zh_CN.po文件:
# a sample for Internationalization # smallnest <smallnest@gmail.com> # http://www.kuaff.com #
msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION/n" "Report-Msgid-Bugs-To: /n" "POT-Creation-Date: 2005-12-15 11:32+0800/n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE/n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>/n" "Language-Team: LANGUAGE <LL@li.org>/n" "MIME-Version: 1.0/n" "Content-Type: text/plain; charset=gb2312/n" "Content-Transfer-Encoding: 8bit/n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;/n"
#: Main.cs:10 msgid "Hello everyone!My name is smallnest" msgstr "大家好,我叫晁岳攀."
#: Main.cs:12 #, csharp-format msgid "I'm {0} year old." msgid_plural "I'm {0} years old." msgstr[0] "我今年{0}岁了" msgstr[1] "岁月不饶人,兄弟今年{0}岁了." |
注意将其中Content-Type: text/plain; charset=charset修改为
Content-Type: text/plain; charset=gb2312
将zh_CN.po转化为zh_CN.mo文件:
mkdir -p locale/zh_CN/LC_MESSAGES msgfmt zh_CN.po -o locale/zh_CN/LC_MESSAGES/i18n.mo |