ククログ

株式会社クリアコード > ククログ > Vimでgettext(Sphinx)の翻訳対象ファイルとPOファイルを紐付けて簡単に開けるようにする方法

Vimでgettext(Sphinx)の翻訳対象ファイルとPOファイルを紐付けて簡単に開けるようにする方法

横山です。この記事では、gettext(GNU gettext)を使って翻訳対象ファイルと翻訳ファイル(POファイル)をVimで編集するときの便利設定を紹介します。

gettextを使ったことがない方は、ククログの過去記事を読んでみると雰囲気がわかるかもしれません。

gettextによる翻訳は、まず翻訳対象のファイルからメッセージを抽出し、それぞれのメッセージに対応する翻訳をPOファイルに記述するという流れで行われます。翻訳対象のファイルとPOファイルの間を行き来することになるので、その手間を減らすのが今回の目標です。

バッファで開いておく、NERDTreeなどでブックマークしておくといった方法もあるのですが、POファイルの数が多いと探す時間がばかにならないので、翻訳対象ファイルに対応するPOファイルを自動で検出できると効率が上がります。1

ここでは、vim-altrというプラグインを使ってみます。

vim-altrは、設定されたルールに従って、編集中のファイルに関連する別のファイルを開いてくれるプラグインです。 以下のように任意のキーバインドを設定して使います。

nmap <Leader>a  <Plug>(altr-forward)

デフォルトでもルールが用意されているので、各言語の一般的なファイル構成であればこれだけでいい感じに動作してくれるようです。 が、gettextの対象ファイルの配置はプロジェクトによって異なるため、これだけだと動作しないので、vimrcに設定を追加していきます。

ここではGroongaプロジェクトを例に説明します。GroongaではSphinxと一緒にgettextを使用していて、ドキュメント構成は以下のようになっています。

  • 翻訳対象ファイル(抜粋)

    • doc/source/news.rst(毎月更新)

    • doc/source/news/5.x.rst(ほとんど更新しない)

    • doc/source/news/6.x.rst(ほとんど更新しない)

    • doc/source/install.rst(ほとんど更新しない)

    • doc/source/install/debian.rst(たまに更新)

    • doc/source/install/centos.rst(たまに更新)

  • POファイル(抜粋)

    • doc/locale/ja/LC_MESSAGES/news.rst

      • news.rstとnews/5.x.rstとnews/6.x.rstが対象
    • doc/locale/ja/LC_MESSAGES/install.rst

      • install.rstとinstall/debian.rstとinstall/centos.rstが対象

上記の例の中では、更新頻度的に一番頻繁に行き来するのはdoc/source/news.rstとdoc/locale/ja/LC_MESSAGES/news.rstの間です。よって、まずはこの2ファイル用の設定を追加してみます。

1対1の関係のファイル間の移動

.rst(reStructuredText形式)決め打ちでよいのであれば、以下の1行をvimrcなどに追加するだけです。

call altr#define('doc/source/%.rst', 'doc/locale/ja/LC_MESSAGES/%.po')

これで、doc/source/news.rstとdoc/locale/ja/LC_MESSAGES/news.rstの間を設定したキーバインド(<Leader>aなど)で行き来することができるようになります。

.rst以外にも対応させておきたい場合、以下のように設定します。

call altr#define('doc/source/%.*', 'doc/locale/ja/LC_MESSAGES/%.po')

(2018/5/10追記: 初稿では2行目として call altr#define('doc/locale/ja/LC_MESSAGES/%.po', 'doc/source/%.*') を記載していたのですが、これがなくてもaltr-forwardだけで行き来できました。)

`(altr-back)`に対するキーバインドを設定しておけば上の1行だけで行き来できる(altr-forwordでsourceから.po、altr-backで.poからsource)のですが、2行目を追加しておけば`(altr-forward)`だけで行き来できます。好みに応じて設定してください。

多対1の関係のファイル間の移動

頻度は多くありませんが、doc/source/install/debian.rstとdoc/locale/ja/LC_MESSAGES/install.rstの間や、doc/source/install/centos.rstとdoc/locale/ja/LC_MESSAGES/install.rstの間もたまに行き来します。これらは、複数の翻訳対象ファイルに1つのPOファイルが対応しています。このような場合、POファイルから翻訳対象ファイルを検出することは難しいので、翻訳対象ファイルからPOファイルへの一方通行の設定を追加しておくのがおすすめです。具体的には以下のような設定を追加します。

call altr#define('doc/source/%/%.*', 'doc/locale/ja/LC_MESSAGES/%.po')

この設定を追加することで、doc/source/install/debian.rstやdoc/source/install/centos.rstからdoc/locale/ja/LC_MESSAGES/install.rstを簡単に開くことができるようになります。 この場合、翻訳対象ファイルに戻るときは、vim-altrではなくC-^(直前に開いていたバッファを開く)などを使うことになります。

細かいところですが、doc/source/%/%.*doc/source/%/*.*などとしてしまうと、doc/source/install/debian.rstとdoc/source/install/centos.rstがお互いに行き来する対象になってしまうので注意してください。

後から定義したルールが優先されるようなので、1対1と多対1の設定を両方追加する場合、以下のようにしておくと1対1のルールが優先されます(doc/locale/ja/LC_MESSAGES/news.poからaltr-forwardするときに、doc/source/news/ではなくdoc/source/news.rstが開かれるようになる)。

call altr#define('doc/source/%/%.*', 'doc/locale/ja/LC_MESSAGES/%.po')
call altr#define('doc/source/%.*', 'doc/locale/ja/LC_MESSAGES/%.po')

1対1の関係のファイル間の移動の設定が不要であれば、以下のように.poからaltr-forwardするときは明示的にディレクトリを開くようにしておくのも一案だと思います。

call altr#define('doc/source/%/%.*', 'doc/locale/ja/LC_MESSAGES/%.po', 'doc/source/%/')

または

call altr#define('doc/source/%/%.*', 'doc/locale/ja/LC_MESSAGES/%.po', 'doc/source/')

まとめ

Vimでgettextの翻訳対象ファイルとPOファイルを紐付けて簡単に開けるようにする方法を紹介しました。 gettext以外にも応用できる方法だと思うので、ぜひ活用してみてください。

  1. POファイル自体はVimではなくPoeditなどで編集することが多いと思いますが、Poeditで編集するときでも、一旦Vimで開いてから

    :! poedit % &
    などでPoeditで開くようにすると、ファイルを探す手間が省けて効率が上がります。