綾小路龍之介の素人思考

[gettext] po ファイルのマージ

msgmerge を使うと、2つの po ファイルをマージすることができる。オプションをつけたり、msgattrib で整形することで労力なしにうまくマージができる。

msgmerge を使って現在のブランチにある po/ja.po の内容を先ほど取り出したファイル po/ja.po.c6c3015 のエントリで置き換えて、po/ja.po.new に出力する。つまり po/ja.po に含まれる msgid に対する msgstr を po/ja.po.c6c3015 から探し出して、見つかった場合は po/ja.po の msgstr を po/ja.po.c6c3015 のもので置き換えて po/ja.po.new に出力される。また、 po/ja.po.c6c3015 に含まれて po/ja.po に含まれない msgid は obsolete #~ message として po/ja.po.new に出力される。なお、msgid のマッチングは完全一致ではなくfuzzyマッチングなので、これを抑制したい場合は --no-fuzzy-matching を使う。

$ msgmerge -o po/ja.po.new po/ja.po.c6c3015 po/ja.po
................................................................................................................................................................................................................. done.
$ msgmerge --no-fuzzy-matching -o po/ja.po.new po/ja.po.c6c3015 po/ja.po

出力された po/ja.po.new には obsolete #~ message が含まれる。これを削除したいわけだが、これらの中には先に述べた po/ja.po.c6c3015 に含まれて po/ja.po に含まれない msgid のほかに、po/ja.po.c6c3015 や po/ja.po で obsolete #~ message だったものも含まれる。まずは msgattrib --only-obsolete を使って元の 2 ファイルに obsolete #~ message が含まれているかを確認すると、含まれていなかったことが分かる。つまり、po/ja.po.new に含まれる obsolete #~ message はすべて po/ja.po.c6c3015 に含まれて po/ja.po に含まれない msgid ということだ。現在のブランチにある po/ja.po には obsolete #~ message がなかったということなので、po/ja.po.new に含まれる obsolete #~ message は削除して、po/ja.po.new2 に出力する。

$ msgattrib --only-obsolete po/ja.po
$ msgattrib --only-obsolete po/ja.po.c6c3015
$ msgattrib --no-obsolete -o po/ja.po.new2 po/ja.po.new

現在のブランチにある po/ja.po がマージ作業で正しく po/ja.po.new2 に更新できたか最終的に確認した後、po/ja.po を po/ja.po.new2 で置き換える。

$ vimdiff po/ja.po po/ja.po.new2
$ diff po/ja.po po/ja.po.new2 | vim -R -
$ cat po/ja.po.new2 > po/ja.po

リファレンス

  1. Git - git-show Documentation
  2. Git - git-cat-file Documentation
  3. GNU gettext utilities: msgmerge Invocation
  4. GNU gettext utilities: msgattrib Invocation

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2008-10-31T21:43:14+09:00
  2. Modified: 2008-10-31T21:43:14+09:00
  3. Generated: 2017-06-28T23:09:17+09:00