裏紙に書く程度の内容

poファイルをnodeでコンパイルする方法

gettextで言語ファイルを作成する際、Poeditで編集・コンパイルすると思いますが、別の方法はないものかと調べてみたメモです。

gettext-parserを使用します。

インストール

npm install gettext-parser --save-dev

簡単ですね。

poファイルを読み込む

まずは簡単な使い方から。 mo作りたいだけならばここは読み飛ばしてください。

Poedit等で作成したpoファイルを読み込む方法です。

gettext-parser のREADME のとおりなんですが、

gettextParser = require "gettext-parser"
input = require('fs').readFileSync 'en.po'
po = gettextParser.po.parse input
console.log po.translations['']

これで poファイルの中身がjson形式で出力されます。

またpoオブジェクトのheadersにはカタログの設定情報等が入っています。

poファイルをmoにコンパイルする

続いて、読み込んだpoファイルをmoにコンパイルする方法です。

gettextParser = require "gettext-parser"
input = require('fs').readFileSync 'en.po'
po = gettextParser.po.parse input

output = gettextParser.mo.compile po
require('fs').writeFileSync "en.mo", output

poを読み込むところは前述のとおりで、読み込んだpoオブジェクトをgettextParser.mo.compile()に渡すとmoにコンパイルされます。 それを任意のファイルに書き込めばOK。

moファイルを作成する

ここまで読んでいただいたらmoの作り方はもうわかるかと思います。

gettextParser = require "gettext-parser"

transData = {
  "ほげ":
    msgid: "ほげ"
    msgstr: ["hoge"]

  "こんにちわ":
    msgid: "こんにちわ"
    msgstr: ["Hello"]

  "世界!":
    msgid: "世界!"
    msgstr: ["World!"]

}

data = {
  "charset": "UTF-8",

  "headers":
    "content-type": "text/plain; charset=UTF-8"
    "plural-forms": "nplurals=1; plural=0;"

  "translations":
    "": transData
}

output = gettextParser.mo.compile(data)
require('fs').writeFileSync("en.mo", output)

poを読み込んだ時と同じ形式のデータオブジェクトをcompile()に渡してやればいいわけです。

※README の一番最後のExampleだと "charset": "iso-8859-1",となっていますが、このままだと日本語は文字化けします。 上記のようにUTF-8等とするのがよいでしょう。

※ここまでcoffeescriptで例をあげてきましたが、jsで書き直すと以下。

var data, gettextParser, output, transData;

gettextParser = require("gettext-parser");

transData = {
  "ほげ": {
    msgid: "ほげ",
    msgstr: ["hoge"]
  },
  "こんにちわ": {
    msgid: "こんにちわ",
    msgstr: ["Hello"]
  },
  "世界!": {
    msgid: "世界!",
    msgstr: ["World!"]
  }
};

data = {
  "charset": "UTF-8",
  "headers": {
    "content-type": "text/plain; charset=iso-8859-1",
    "plural-forms": "nplurals=1; plural=0;"
  },
  "translations": {
    "": transData
  }
};

output = gettextParser.mo.compile(data);

require('fs').writeFileSync("en.mo", output);

transDataの部分を外部ファイルから読み込むようにしたら扱いやすい!

URABLO
広告
Index
広告