如何漢化 po 文件及編譯成 mo 文件

原文地址:http://www.cnblogs.com/yan5lang/archive/2010/04/01/1702639.html

背景知識
po文件簡介

  po文件本來是用來翻譯程序源代碼裏的字符串的。先來稍微解釋一下它本來的用途,需要一點點C語言的基礎才能完全理解。如果理解有困難 ,可以忽略這段內容,不會對我們使用po來翻譯造成任何影響。

  目前大部分自由軟件實現國際化使用的是gettext。國際化就是讓程序可以使用多國語言來顯示程序裏的字符串。程序裏一般都有很多字符串,菜單名也好,錯 誤信息也好,都是字符串。假設字符串爲string,非國際化的程序裏都是直接寫"string"。如果用了gettext來實現國際化的話,就要寫成 gettext("string")。有時也會看到_("string"),那實際上也是gettext,只不過通過宏的定義把 gettext改頭換面了。這個string就是msgid。然後使用xgettext來從程序源代碼文件產生po文件。然後交給專門的翻譯人員來翻譯 po。翻譯人員根本不需要懂編程。翻譯完畢後,使用msgfmt來把po轉化成mo文件,並安裝到系統裏合適的位置。程序運行時,到底顯示什麼字符串就是 由gettext 函數來決定的了。主要有兩個決定因素,一個是系統的locale及相關環境變量(LANGUAGE,LC_ALL,LC_MESSAGES和LANG), 一個是相關的mo文件。具體可以看我的這篇 文章 。

  隨着程序版本的升級,程序裏的字符串的數量和內容都會發生變化,但變化不會很大,以 前翻譯過的po裏大部分msgid都能被重複利用。所以維護po的翻譯人員在每次得到從新的程序源代碼產生的po時,都用msgmerge來根據舊的已翻 譯過的po來先處理一下新的未翻譯的po。處理過後,大部分情況下新po就翻譯的差不多了。翻譯人員的工作量被大幅度減輕了。
po文件格式解析

  po文件都是由一對對的msgid和msgstr組成的。msgid就是原文。msgstr就是譯文。原文譯文相互對照,所以非常適於翻譯。

msgid "Flash Player 9 released"
msgstr ""

  有的msgid前面一行有fuzzy的字樣。這說明,第一這個po是被msgmerge處理過的;第二,已翻譯的po裏沒有和這個msgid完全等同的 msgid,只有非常相似的。這種情況下,msgmerge仍然會用那個相似的msgid來翻譯此msgid。不過會給這個msgid標記爲fuzzy, 表示翻譯人員仍然要翻譯這 個msgid,並在翻譯後去掉上面帶fuzzy的這一行。
#, fuzzy
msgid "Gentoo Linux PPC Handbook"
msgstr "Gentoo Linux Alpha手冊"

po文件翻譯的好處
1. 原文譯文相互對照,適於翻譯
2. 一篇文章裏同一個msgid不管出現多少次,都只需要翻譯一次
3. 舊有的已翻譯過的po,可以重複利用,不必再次翻譯,且利於統一風格
4. 有非常好的翻譯工具,熟練使用後可大幅度提高工作效率


應用實例

我們在使用 WordPress 及其插件時,經常可以找到漢化的版本,一般是通過一個漢化過(翻譯過)的 mo 文件來實現( WordPress 僅可識別 mo 文件),實際上不單 WordPress ,包括很多桌面應用程序都是是依靠 po 文件或 mo 文件來實現多語言版本。如果原作者提供了一個 po 文件或 mo 文件,那麼我們就可以通過相關工具來自行漢化,或者翻譯成其他語言版本。因爲 mo 文件不能直接編輯,所以我們得編輯 po 文件,若僅有 mo 文件,那麼就應該先把它轉換成 po 文件後再進行編輯翻譯。

至於編輯工具,由於 po 文件本身就是一個文本文件,所以任何文本編輯器都可以使用。除了專門編輯 po 文件的 poEdit ,還推薦使用 poEdit 、EditPlus、UltraEdit或者你喜歡的 vi 或 vim。

我們來看一個 po 文件,這是 yskin 製作的 WordPress 2.11 中文版 po 文件 中的一部分

msgid “”
msgstr “”
“Project-Id-Version: WordPress 2.1-1.0\n”
“PO-Revision-Date: 2007-02-22 12:35+0800\n”
“Last-Translator: yskin \n”
“MIME-Version: 1.0\n”
“Content-Type: text/plain; charset=utf-8\n”
“Content-Transfer-Encoding: 8bit\n”
“X-Poedit-Basepath: d:/wordpress\n”
“X-Poedit-Language: Simplified Chinese\n”
“X-Poedit-Country: China\n”
“X-Poedit-SourceCharset: utf-8\n”
“X-Poedit-KeywordsList: _e;__;__ngettext:1,2\n”
“Language-Team: \n”
“POT-Creation-Date: \n”
“Plural-Forms: nplurals=1; plural=0;\n”
“X-Poedit-SearchPath-0: .\n”

# 第一條要翻譯的字符串。
#: wp-comments-post.php:15
msgid “Sorry, comments are closed for this item.”
msgstr “對不起,這篇文章禁止評論。”

上面是這個 po 文件的最初部分,各行意思一目瞭然,注意編碼儘可能採用UTF-8。

# 第一條要翻譯的字符串。
#: wp-comments-post.php:15
msgid “Sorry, comments are closed for this item.”
msgstr “對不起,這篇文章禁止評論。”

  這段就是po文件的主體結構了,每一個翻譯項佔一段。#: wp-comments-post.php:15 說明字符串相應的位置; msgid “Sorry, comments are closed for this item.” 翻譯前的原文; msgstr “對不起,這篇文章禁止評論。” 翻譯後的字符串。以此類推,即可完成所有資源的翻譯。非常簡單。

那麼如何將 po 文件編譯成(轉換) mo 文件呢?

如果你使用的是 poEdit ,按 Ctrl + s 保存就會自動生成相應的 po 文件和 mo 文件;
或者在命令提示符界面,使用 msgfmt demo.po 命令將po文件編譯爲可用的 demo.mo 文件,用 msgunfmt demo.mo 命令轉回 demo.po 文件,這些命令在 poEdit 的安裝目錄下有,可以拷貝msgunfmt.exe 、msgfmt.exe 及相關鏈接庫文件 gettextlib.dll 、gettextsrc.dll 、iconv.dll 、intl.dll 到 c:/windows/system32 目錄下,或者安裝 .Net 2.0環境。
  另外推薦一款 GUI 界面的轉化程序 po2mo.exe ,作者的說明:該程序是調用 msgfmt.exe 和 msgunfmt.exe 文件,從而進行po 、mo 文件互轉。文件是用C#寫的,需要.Net 2.0環境。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章