読者です 読者をやめる 読者になる 読者になる

xgettextの使い方のメモ

I18N gettext

いつも使い方を忘れてしまうxgettextの使い方のメモ。

とは言っても、xgettextのlanguageオプションで正式に対応しているプログラミング言語以外で、シングルクォートもダブルクォートも共に文字列として扱える言語を念頭においている。以下の翻訳抽出元コードはなぜかDartっぽいコードだが、Dartを選んだ深い意味はない。

_tr(String key) {
  print(key);
  return key;
}

main() {
  //#NOTE 'xgettext'は固有名詞なので翻訳不要です                                                                                                                                                         
  String s1 = _tr("hello, 'xgettext'!");
  String s2 = _tr('single "quote"');
}

_trという関数でマークされた翻訳可能文字列を抽出するには、

xgettext --language=python --from-code=UTF-8 --keyword=_tr --add-comments=NOTE -o - i18n.dart

ポイント。

  • language=pythonを指定しないで、例えばCとかにしてしまうとシングルクォートの文字列を翻訳可能文字列として扱ってくれない。
  • from-code=UTF-8を入れないとascii以外の文字列が出現した時にエラーになってしまう。
  • add-commentsはlanguageに指定したプログラミング言語のコメントだけを処理するようだが、上の通りlanguage=pythonにしたので # がコメントになる。ところが、# がコメント扱いにならない言語(JavaScriptとかDartとか)では困る。
    • 解決策として翻訳者向けのコメントは "//#" で始めるというルールに自分の中で決定した

何かもっとうまい方法がありそうなのだが・・・