Gallery:本地化
Gallery2的本地化[ ]
综述[ ]
Gallery是国际化的。不对特定语言文本消息的包含, 取而代之地,它使用特殊的方法追踪文本 以进行抽取并翻译成其他语言。用户则会看见 文本被翻译成他们使用的语言版本。
为了能够让用户看到Gallery文本的本地化版本, 就需要先将这些Gallery要显示的文本消息进行 翻译。此过程就被称为"本地化"。
这里我们尝试说明一下如何创建并维护G2中本地化 文件的内容。这并不是特别困难的任务, 但要求无论何时基础内容有改变,我们都要保证 各类文件的更新度。我们挺幸运的,因为有这样的工具能 协助我们完成此类操作过程。
要求[ ]
为了能够有效率地进行,你需要在计算机上 安装一些工具。我仅在FreeBSD box中做了测试,但我想如果用在Linux,Solaris或其他Unix类系统 上也不会太麻烦。在Windows上可能会有些难度, 但也是有可能实现的。 以下为必须安装,并在你的路径中:
- gettext
- http://www.gnu.org/software/gettext/
- gmake (或make)
- http://www.gnu.org/software/make/make.html
- php二进制
- http://php.net
- perl
- http://perl.com
注:如果你使用FreeBSD,并希望能取代make而使用gmake,因为FreeBSD的默认不与GNU兼容。
你还需要用当前G2文件创建最新的翻译。就目前的SVN或nightly快照版的运行情况都不错。最新的G2开发者版本也能运行,但某些翻译的字串可能有些过时了。
本地化的新建[ ]
浏览一下Gallery就能发现不少名为"po"的目录。("po"是一gettext术语,即"可移植对象(portable object)")。以下为找到它们的一个方法:
find . -type d -name po <-- 输入这个 ./themes/matrix/po <-- 会看到这个 ./lib/tools/po ./modules/core/po ./modules/comment/po ./modules/netpbm/po ** 忽略"lib/tools/po"目录。
这些目录还有翻译源文件。你要 使用合适的语言代码来新建文件,接着在它们之中 添入经过翻译的文本。首先要做的就是从 下面的两个表格中识别出正确的代码:
- 语言代码
- http://www.gnu.org/software/gettext/manual/html_mono/gettext.html#SEC221
- (or http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt)
- 国家代码
- http://www.gnu.org/software/gettext/manual/html_mono/gettext.html#SEC222
- (or http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html)
在大多数情况下,你只需要语言代码即可,如德语就是"de"。要为多个国家中提供特定国家语言的翻译,你可以使用这样的代码格式,xx_XX,例如"pt_BR"表示葡萄牙语/巴西。如果你确定该用哪一个,包括语言和国家。如果你发现已有你使用语言的翻译的话,请接着看 本地化的维护。
一旦选好了代码,就需要为你的代码新建一个.po 文件。假定你选择是的"de"。那么对各po目录, 你需要做的是:
make de.po
这将找到该本地化标记的所有文本(tpl文件中的{g->text},php代码中的translate()或i18n()),并创建一个即将进行翻译的po文件。
有关文本编辑器。
- 有一些工具可以处理.po文件:
- poEdit(多平台)
- KBabel(Unix KDE)
- GTranslator(Unix Gnome)
- Emacs with po-mode(多平台)
- Vim with PO plug-in(多平台)
我比较喜欢用XEmacs,因此我会 在下面的例子中拿XEmacs做例子。如果你有其他编辑器 的使用指导,请分享一下。XEmacs的主要模式被称为"po-模式",如果你安装了它,在编辑.po文件时就会 自动转入。我在这里不准备这么做,但 你可以尝试一下。
现在我们来编辑de.po。在其顶部应有Gallery的证书。你需要对以下值做自定义:
- Last-Translator
- 将你的名字及email以此格式输入:"FirstName LastName <email@address>"
- Language-Team
- 输入语言及-翻译邮件列表,如"German <gallery-translations@lists.sourceforge.net>"
- Content-Type
- 将此设置给"Content-Type:text/plain; charset=UTF-8\n"
- 我们希望你使用UTF-8字符集。因为它允许我们在同一页面上对多个语言进行渲染,这对某一语言站点页面上其他语言的用户评论是有好处的。
这里有modules/core/po/de.po的完整的header样例。注意编写者是如何维护前任翻译者名单的。
# 前任翻译者(迄今所知,如有脱漏,请在此添加): # - Jens Tkotz <jens@peino.de> # - Ernesto Baschny <ernst@baschny.de> ... # msgid "" msgstr "" "Project-Id-Version: Gallery: Core 1.0.32\n" "POT-Creation-Date: 2003-02-11 03:09-0800\n" "PO-Revision-Date: 2006-03-05 02:25+0000\n" "Last-Translator: Frederik Kunz <frederik.kunz@web.de>\n" "Language-Team: German <gallery-devel@lists.sourceforge.net>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
如果你的语言中不包含复数词用法,如汉语或土耳其语,就得修改以下语句:
"Plural-Forms: nplurals=2; plural=(n != 1);\n" -> Change to "Plural-Forms: nplurals=1; plural=0;\n".
这样,你只需翻译msgstr[0]并注释掉或移除msgstr [1].
接着来看看Gallery证书下的语句行:
#, fuzzy msgid "" msgstr ""
模糊的关键词告知你区块的翻译 不完整。但一旦更新了administration entry,就 可以移除"#, fuzzy"这一行以允许稍后翻译的 编译。
接下来你会看到一系列区块:
#, c-format (<-- 在某些语句行中仅能看到这个) msgid "a message in english, with %d or %s tags in it" msgstr ""
你需要将英语消息的翻译置入 msgstr区块中,用引号括起来,例如:
#, c-format msgid "a message in english, with %d or %s tags in it" msgstr "eine Anzeige auf englisch, mit %d oder %s etikettiert in ihr"
某些msgid值含有有助于进行翻译的提示信息:
#. HINT: Button label for Bold msgid "B" msgstr "F"
注意提示内容不应翻译或包括在msgstr文本中。你可以使用翻译追踪器(Translations Tracker)为特殊字串请求额外的提示文本。指定模块/外观主题以及msgid。注意strings.raw文件列出了用到msgid的文件。
在编辑这些消息之前,你确实应当将编辑器设为UTF-8模式, 这样编辑器才能使用正确的字符集。 如果你由于某种原因无法在UTF-8模式中进行编辑, 请考虑使用GNU的"recode"程序,在提交翻译内容给我们之前, 将其转为UTF-8(或者直接发给我们也许,我们会进行重新编码)。
如果你使用XEmacs的MULE(即多语言支持(MULtilanguagE)),你可以将一下内容添加到 ~/.xemacs/init.el中去
; Enable Unicode support (via Mule-UCS) ; (require 'un-define) (set-coding-priority-list '(utf-8)) (set-coding-category-system 'utf-8 'utf-8)
当你编辑UTF-8的文件时,会有一些"u" 出现在屏幕底部状态条左侧。使用现有的 .po文件来看一看。
在进行一些翻译之后,来看看效果。运行:
make install PO=de
它会将你的.po文件编译到一个.mo文件中,并将其安装到合适的位置。在修改.po文件之后,对各目录都要重复此步骤。如果你在创建locale目录时发生错误,请在运行make之前建立目录结构(如:modules/mymodule/locale/de/LC_MESSAGES)。
最后,你需要编辑modules/core/classes/GalleryTranslator.class,并在函数getLanguageData中加入如下语句:
/* German */ $this->_supportedLanguages['de']['DE']['description'] = 'Deutsch'; $defaultCountry['de'] = 'DE';
批注应为该语言的英语说法;语言 '描述'则应是该语言的本土说法。
现在登入G2,在用户偏好(你可能需要 通过站点管理对用户进行编辑)中,你应能在下拉列表中看到 German。而如果你选择了它,并以刚才那个用户的身份登入的话, 就能看到消息被翻译为该语言了。你还可以将语言选择器区块 添加到站点中,使用外观主题设定就可以做到。
注: 如果语言修改没有起效,请回顾一下语言设定的优先级(会话语言(Session language) > 用户偏好(user preferences) > 站点范围的默认语言(site wide default language))。如果有疑虑的话,可以使用语言区块或在用户偏好中反复尝试。
本地化的提交[ ]
现在本地化就应创建号了,你需要将其 打包并发送给我们,这样我们就能将其添入存储库。 最好的打包方式如下:
cd gallery2 zip de.zip `find . -name de.po`
or:
cd gallery2 tar czf nl.tar.gz `find . -name nl.po`
你翻译过的文件会被做成zipfile或tarball。当然使用你自己的语言代码取代上面的de或nl。接着浏览SourceForge 的Gallery项目页面上的翻译追踪器并点击"Submit New"按钮。将你的翻译放入"Gallery 2"组中,并将文件加入附件上传。如果你的翻译 过了几天还没有被采用的话,请上IRC(参见帮助部分)告知我们。
本地化的维护[ ]
cd po make de.po (using German as an example)
这会从你所在的模块中提取出所有消息 并更新.po文件。浏览.po文件,找到所有具有 空msgstr或被标记为"模糊(fuzzy)"的区块并更新它们。在它们 被修复之后,移除fuzzy标识。你看到的标识会是如下的 样子:
#, fuzzy #~ msgid "User" #~ msgstr "Gebruikersnaam"
"#, fuzzy"表示它是模糊的,但"#~"表明该 字串不存在于G2中(我们可能将其删除或修改了 )。你可以删除这些内容.
你应当快速地做一次gettext提供的检查,以验证.po文件:
msgfmt -v -c --stat de.po
当一切都设置好后,运行:
make install PO=de
翻译文件被PHP缓存(这就是其快速的原因) 因此在重启web服务器之前,可能无法看到所作的修改。这是 有点麻烦,但我还没有想出好的解决办法。
参见[[#本地化的新建]|本地化的新建]]部分的测试信息,并向我们提交新文件。
何处寻求帮助?[ ]
如果你需要帮助,有三个地方可以求助:
- The Gallery translations forums
- http://gallery.menalto.com/forum/74
- The gallery-translations mailing list
- http://codex.gallery2.org/index.php/Mailing_Lists
- The Gallery IRC channel
- #gallery on irc://chat.freenode.net
翻译列表[ ]
所有可用的Gallery2翻译,都在此以字母表顺序列出了,带有维护者/作者名单。某些翻译100%保持更新并且完成,某些则仅完成了2%或过期了。参见 本地化报告。如果你有G2的开发者整合包,就可以运行http://www.example.com/gallery/lib/tools/reports/localization.php来查看所有已安装翻译的状态。
语言 | 语言代码 | 最后翻译者 | 翻译者列表 |
---|---|---|---|
Afrikaans
Afrikaans |
af | Renier | Renier |
العربية
Arabic |
ar | Mohammad Saleh | Mohammad Saleh |
Български
Bulgarian |
bg | Bisser Dobrev | Bisser Dobrev |
Беларуская
Belarusian |
be | Alex Lavysh | Alex Lavysh |
Català
Catalan |
ca_ES | Roger Cervantes | Juan Vega Aiguadé; Roger Cervantes |
中国
Chinese [简体] |
zh_CN | Wayne Zhang | Wayne Zhang |
台灣
Chinese [繁體] |
zh_TW | Stephen Chu | Stephen Chu |
Česky
Czech |
cs | Jan Korbel | Jan Korbel |
Dansk
Danish |
da | Jens Hyllegaard | Lasse Bang Mikkelsen, Allan Beaufour, Bjørn Graabek, Jens Hyllegaard |
Deutsch
German |
de | Andy Staudacher | Jens Tkotz, Ernesto Baschny, Frederik Kunz, Georg Rehfeld, Bananeweizen, Moritz Stoltenburg |
Ελληνικά
Greek |
el | Anthi Andreou | Nikos Batsis, Anthi Andreou |
English [British] | en_GB | Stephen Ryan | Joan McGalliard, Alan Harder, Stephen Ryan |
Español
Spanish |
es | Oscar Garcia Amor | Oscar Garcia Amor |
Español de Argentina
Spanish [Argentine] |
es_AR | Alvaro Cortizo | Alvaro Cortizo |
Español de Mexico
Spanish [Mexican] |
es_MX | Wieland E. Kublun | Wieland E. Kublun |
Eesti
Estonian |
et | poromaan | poromaan |
Euskera
Basque |
eu | Piarres Beobide | Piarres Beobide |
فارسی
Farsi |
fa | Mohammad Samini | Jalal Kheradmand, Pedram Hayati, Mohammad Samini |
Français
French |
fr | Arnaud MOURONVAL | Arnaud MOURONVAL |
עברית
Hebrew |
he | Guy Sheffer | Guy Sheffer, Omri Amos |
Irish Gaelic
Irish |
ga | Beckett Madden-Woods | Beckett Madden-Woods |
Íslenska
Icelandic |
is | Johann S Jonsson | Johann S Jonsson |
Italiano
Italian |
it | Ermanno Baschiera | Ermanno Baschiera |
日本語
Japanese |
ja | Kennichi Uehara | Kennichi Uehara, Yosuke Suzuki |
한국말
Korean |
ko | Juice | Juice |
Latviešu
Latvian |
lv | Jānis Baiža | Jānis Baiža |
Lietuvių
Lithuanian |
lt | Darius Žitkevičius | Darius Žitkevičius |
Magyar
Hungarian |
hu | Sandor Dibuz | Gergely Dömsödi, József R.Nagy, Sandor Dibuz |
Nederlands
Dutch |
nl | Marijke van Velsen | Marcel van Groenigen, Kees van den Broek, Arjen Gideonse, B. Scheijgrond, Marijke van Velsen |
Norsk Bokmål
Norwegian |
no | Sverre M. Vikan | Frode Tviberg, Sverre M. Vikan, Jon Harald Carlsen, Robin Smidsrod (sponsored by Grieg Multimedia AS), Terje Dahl |
Polski
Polish |
pl | Kappana | Sebastian Marek, Kappana |
Português
Portuguese |
pt | Francisco Neto | Hugo Cruz, Francisco Neto |
Português Brasileiro
Portuguese [Brazilian] |
pt_BR | Paulino Michelazzo | Ernesto Baschny, José Ricardo, Celso Reeks, Paulino Michelazzo |
Română
Romanian |
ro | Serban Constantintinescu | Serban Constantintinescu |
Русский
Russian |
ru | Ser Moro | Konstantin Ivanov, modus, Ser Moro |
Українська
Ukrainian |
uk | Anton Gladky | Yurii Smetana, Anton Gladky |
Quốc Ngữ (國語)
Vietnamese |
vi | Trung Dong Huynh | Trung Dong Huynh |
Suomea
Finnish |
fi | Jyrki Heinonen | Jussi Karppanen; Erkka Hakkarainen; Jyrki Heinonen |
Srpski
Serbian |
sr | Jozef Selesi | Jozef Selesi |
Slovenčina
Slovak |
sk | Branislav Hanacek | Branislav Hanacek |
Slovenščina
Slovenian |
sl | Jure Babnik | Janez Troha, Jure Babnik |
Svenska
Swedish |
sv | Anders Lindquist | Christian Wallin, Mikael Gustafsson, Peter Liversten, Hampus Nygren, Anders Lindquist |
Türkçe
Turkish |
tr | Goker ISIK | Goker ISIK, Roman Neumüller |