如何漢化 po 檔案及編譯成 mo 檔案

2022-08-02 14:36:12 字數 2994 閱讀 7191

背景知識

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」

上面是這個 po 檔案的最初部分,各行意思一目了然,注意編碼盡可能採用utf-8。

那麼如何將 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環境。

如何漢化 po 檔案及編譯成 mo 檔案

背景知識 po檔案簡介 po檔案本來是用來翻譯程式源 裡的字串的。先來稍微解釋一下它本來的用途,需要一點點c語言的基礎才能完全理解。如果理解有困難 可以忽略這段內容,不會對我們使用po來翻譯造成任何影響。目前大部分自由軟體實現國際化使用的是gettext。國際化就是讓程式可以使用多國語言來顯示程式裡...

如何漢化 po 檔案及編譯成 mo 檔案

背景知識 po檔案簡介 po檔案本來是用來翻譯程式源 裡的字串的。先來稍微解釋一下它本來的用途,需要一點點c語言的基礎才能完全理解。如果理解有困難 可以忽略這段內容,不會對我們使用po來翻譯造成任何影響。目前大部分自由軟體實現國際化使用的是gettext。國際化就是讓程式可以使用多國語言來顯示程式裡...

Linux下如何將原始檔逐步編譯成目標檔案的過程

請講一下linux如何原始檔逐步編譯成可執行檔案。首先先上圖對編譯的整個過程有個感性的認識,然後再逐步分析各個過程。以hello.c 程式為例 乙個.c源程式需要經過預處理器生成.i檔案,再經過編譯器生成.s檔案,再經過彙編器生成可重定位目標檔案.o檔案,再與其他.o檔案經過鏈結器生成最終的可執行目...