翻訳

Luna Flow は Blender マニュアルと同じ方法でドキュメントを翻訳します。英語のページが唯一のソースであり、ほかの言語はすべて翻訳済みメッセージからなる gettext 翻訳カタログです。中国語や日本語のページは、サイトのビルド時に英語のページとカタログから生成されます。

これには 3 つの利点があります。

  • どの言語も、英語と構造がずれることはありません。ページ、見出し、コード、リンクは 1 つのソースから生まれます。
  • 未翻訳または古くなった部分は、消えたり誤ったりせず、英語で表示されます。ページには、どれだけ翻訳されているかが表示されます。
  • サイトはすべてのページとリポジトリの翻訳率を把握し、ライブラリに表示します。

メッセージ

lunadoc はすべてのページをメッセージに分割します。見出し、段落、リスト項目、表のセル、そしてフロントマターの title キーと description キーです。コードブロック、ディスプレイ数式、生の HTML はメッセージにならず、どの言語でも英語で書かれたとおりに表示されます。

複数行にわたる段落は 1 つのメッセージです。英語の文章を折り返し直してもメッセージは変わらないため、翻訳が無効になることはありません。

ワークフロー

  1. doc/manual の英語ページを編集します。
  2. lunadoc update を実行します。doc/locale/manual.pot が再生成され、各 manual.po にマージされます。
  3. ページとカタログを一緒にコミットします。

update は GNU msgmerge と同じように動作します。

  • 英語の文章が変わっていないメッセージは、翻訳がそのまま保たれます。
  • 英語の文章が変わったメッセージには、最も似ている旧メッセージの翻訳が割り当てられ、fuzzy の印が付きます。以前の英語の文章は #| msgid コメントに残されるので、翻訳者は何が変わったかを確認できます。
  • メッセージがなくなった翻訳は、廃止エントリ(#~)としてカタログの末尾に残され、後で update が復元できます。

fuzzy の翻訳はサイトに表示されません。翻訳者が確認して fuzzy フラグを外すまで、未翻訳として扱われます。

翻訳の手順

doc/locale/<locale>/LC_MESSAGES/manual.po をテキストエディタや Poedit などの gettext エディタで開き、各 msgid に対応する msgstr を記入します。

#: manual/core/api.md:12
msgid "The `Ring` trait models rings with $0$ and $1$."
msgstr "`Ring` trait 刻画带有 $0$ 与 $1$ 的环。"

翻訳するときは、次の点を守ってください。

  • インラインコード、数式、リンク先は英語とまったく同じにします。リンクテキストは翻訳します。
  • Markdown の記法を保ちます。強調、インラインコード、リンクは対応が取れている必要があります。
  • [!NOTE] のような GitHub アラートのマーカーは、メッセージの先頭に残します。
  • 識別子は、本文中であっても翻訳しません。
  • 推測で埋めるくらいなら、msgstr は空のままにします。空のメッセージは英語にフォールバックします。

lunadoc status --pages で結果を確認し、サイトでプレビューします。

ロケール

ロケール名は gettext に従います。簡体字中国語は zh_CN、日本語は ja_JP です。ロケール名は conf.json、カタログのパス、そしてサイトの config/locales.json に現れます。サイトの設定ファイルでは、各ロケールの URL セグメントと表示名も定めます。サイトに言語を追加するにはそこに追加し、リポジトリに言語を追加するには conf.json に列挙して update を実行します。