简析Etoys的多语言支持 之 翻译

Etoys使用gettext的方式处理多语言翻译。当然,由于GNU gettext并没有提供Smalltalk接口,Etoys只是在翻译文件的格式上与GNU gettext保持兼容,而像翻译的接口、字符串的摘取以及翻译文件的读取都是在Etoys中重新实现的。以下就分别予以介绍。

domain

在10年8月份,Etoys将以前的单个po文件拆分为多个文件。是以Package为分类依据的,Package的名称也就是TextDomain的名称。调用PackageOrganizer default packageNames可以获得所有包的名称列表。

消息接口

在GNU gettext中,一般是由gettext()及getttext_noop()处理需要翻译的字符串,通常会定义宏_及N_以方便书写。而在Etoys中也同样有这样两个消息,分别是String>>translated及String>>translatedNoop。功能上是相似的,translated将字符串翻译为LocaleID current所指明的语言。而translatedNoop不直接返回翻译后的文本,它只是一个标记,提示Etoys在摘取字符串时需要摘取这个字符串。真正的翻译动作是在随后使用这个字符串时调用translated来实现,translatedNoop可以延迟翻译,这在处理运行于语言选择之前的代码时需要用到。

translated主要是通过NaturalLanguageTranslator>>translate:toLocaleID:inDomain:消息实现对字符串的翻译。NaturalLanguageTranslator是各类语言翻译的集合,在该消息被调用时,它会根据localeID取得当前语言的一个GetTextTranslator实例,并调用它的translate:inDomain:消息。translate:inDomain:会利用moFileForDomain:查找相应的mo文件,再利用translationFor:在对应的mo文件内容中查找翻译。这里的“mo文件”已经是从文件转化为Etoys内部的结构,具体过程在后面介绍。

字符串的摘取

从上面的说明中可以看到,String>>translated和String>>translatedNoop除了作为翻译的消息调用接口外,还担负着标记的功能,用于生成翻译文件的模板,即pot文件。pot文件的生成主要在GetTextExporter中实现。调用GetTextExporter exportAll会生成多个pot文件,文件可以在Windows用户目录中的etoys里找到。查找所有字符串的过程在TranslatedReceiverFinder中实现,主要是通过SystemNavigation default allCallsOn:找到所有调用过translated和translatedNoop的消息。

读取翻译文件

Etoys在选择了语言后读取相应的mo文件。用户在选择语言之后,通过层层调用,到NaturalLanguageTranslator class>>localeChanged,进而调用了GetTextTranslator>>loadMOFiles。具体的mo文件的解析在MOFile class中实现。

Advertisements
此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s