阳光VIP

少壮不努力,老大徒伤悲。平日弗用功,自到临期悔。
posts - 1395, comments - 8, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

mono:国际化文本

Posted on 2012-02-03 10:31 阳光VIP 阅读(...) 评论(...) 编辑 收藏

在上一篇文章中介绍了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