Gettext mo 轉回 po 和 PHP 讀取 mo 檔

Gettext 詳可見: 使用 gettext 來實做 PHP 多國語系支援(I18N)

  • po 檔: 原始文件, 也就是平常翻譯時修改的文件檔案
  • mo 檔: 程式在看的文件(binary).

但是如果 po 檔不見, 要從 mo 檔轉換回來要怎麼辦?

mo 轉 po (msgunfmt)

  • 使用 msgunfmt - uncompile message catalog from binary format
  • msgunfmt xxx.mo > xxx.po # 這樣子 xxx.po 就是轉換回來的文字檔, 但是原本 po 檔的註解部份資料不會存在(不過通常這些資料也不需要了).

PHP 讀取 mo 檔

另外發現 WordPress 的程式裡面有 gettext 的 Library, 找一下發現此篇: [wp-polyglots] .mo to .po (下述程式轉載於此)

使用 WordPress 的 Library, 可以直接將 mo 檔讀出來, 蠻有趣的, 用途可以再想想.

到 WordPress 解開的目錄中, wp-includes 裡面, 找到 l10n.php / streams.php / gettext.php, 將這三個檔案 cp 到同一個目錄後, 再使用下面這程式即可.

程式: mo_reader.php


<?php
include 'l10n.php';
include 'streams.php';
include 'gettext.php';
$mofile = './xxx.mo';

if (is_readable($mofile)) {
    $input = new CachedFileReader($mofile);
    $mo2po = new gettext_reader($input);

    $mo2po->load_tables();
    echo "<xmp>"; // I know that xmp is officially deprecated , but it works ;)
    foreach ($mo2po->cache_translations as $msgid => $msgstr) {
        echo "\n";
        if ($msgid == "") {
            echo 'msgid ""' . "\n";
            echo 'msgstr ""' . "\n";
            foreach (split("\n",$msgstr) as $val) {
                if ($val != "")
                    echo '"' . $val . '\n"' . "\n";
            }
        } else {
            echo 'msgid "' . $msgid . '"' . "\n";
            echo 'msgstr "' . $msgstr . '"' . "\n";
        }
    }
    echo "</xmp>";
} else {
    echo 'ERROR: file not readable: ' . $mofile;
}
?>

完整程式含 WordPress Library 壓縮檔可見: gettext-reader.tgz


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

Gettext mo 轉回 po 和 PHP 讀取 mo 檔 有 2 則回應

  1. 聽.風 說道:

    可以拿來做多國語系!
    感謝大大的文章
    另外大大您網誌好像沒有支援RSS?

發表迴響