既存翻訳を流用してJavaFX Scene Builder 2を日本語化した

JavaFX Scene Builderは、バージョン1.1の頃はUIが日本語で表示されていたが、バージョン2になりGluonに移管されてからは英語表示だけになってしまっていた。

旧propertiesファイルをそのまま持ってきたのでは駄目なようだ。とはいえ既に一度和訳されてるなら比較的簡単に訳せるだろう、というのはその通り。だけど、両バージョンを見比べながら訳文を手入力していくというのは相当面倒な作業になるのが目に見えている（だから今まで誰も日本語化しないままだったのではないかと思う）。面倒なだけではなく非効率かつミスが入りやすい作業で、プログラマとしても翻訳者としてもあまりにもやり方がダサい。そこで、なるべくソフトに頼れるところは頼る方針でやってみた。

全体の流れとしては、

1. 既存の翻訳物と原文のペアを入手する
2. 翻訳メモリ[^1]で使えるtmx形式に変換する
3. 新たに翻訳したい原文を翻訳メモリを使って半自動で翻訳する
4. 未翻訳のまま残った文を翻訳する
5. 訳文を生成する

という感じ。今回は翻訳メモリとして[OmegaT](http://omegat.org/ja/)を使った。
[^1]: 翻訳メモリとは何かについては[JTF日本翻訳連盟による解説](https://www.jtf.jp/jp/tools/tools_memory.html)などを参照。

# 既存の翻訳物と原文のペアを入手する
1. [JavaFX Scene Builder Archive](http://www.oracle.com/technetwork/java/javafxscenebuilder-1x-archive-2199384.html)
から javafx_scenebuilder-1_1 をダウンロードしてインストールする
1. インストール先の app/SceneBuilder.jar を適当な作業フォルダにコピーし、 `jar tf SceneBuilder.jar` で展開する
1. 必要となる既存翻訳物ペアは以下の通り:
  - com/oracle/javafx/authoring/resources/SceneBuilderI18NBundle.properties
  - com/oracle/javafx/authoring/resources/SceneBuilderI18NBundle_en.properties
  - com/oracle/javafx/authoring/resources/SceneBuilderI18NBundle_ja.properties

# 翻訳メモリで使えるtmx形式に変換する
1. 「[既存翻訳物を翻訳メモリに取り込む方法](http://mail.ring.gr.jp/doc-ja/200607/msg00001.html)」を参考に、「[Java.properties import ツール](https://sourceforge.net/projects/omegat/files/OldFiles/Java%20.properties%20Import%201.3/)」をダウンロードし展開する。
1. 展開先ディレクトリにて `java -cp lib -jar properties-import.jar` で　Java.properties import ツールを実行する。
1. 原文の言語、訳文の言語、既存翻訳物を含むディレクトリ、保存する .tmx ファイル名を指定する。スクリーンショット参照。

![Screenshot from 2017-11-29 21-59-43.png](https://qiita-image-store.s3.amazonaws.com/0/119785/70ccb1c9-a187-0d42-aea9-378beef734c5.png)

# 新たな原文を翻訳メモリを使って半自動で翻訳する
1. OmegaTで新規プロジェクトを作成する
1. 先ほど生成した .tmx ファイルをプロジェクトの tm/ フォルダーに入れる。
1. 新たに翻訳したい原文ファイルをプロジェクトの source/ フォルダーに入れておく。
1. OmegaT を起動して翻訳作業を開始する。「参考訳文」ペインに .tmx ファイルの訳文が表示されるはず。表示されない場合は F5 キーでプロジェクトを再読み込みする。
1. 「設定」→「編集」→「最も一致率の高い参考訳文を自動で挿入」にチェックを入れておく。今回は既存翻訳物と完全に一致するものだけを自動で挿入させたいので、しきい値は 100% に、先頭に付加する文字列は空にしておく。
1. 「設定」→「TABキーで次の文節に移動」にチェックを入れておき、ひたすら TAB キーを押して翻訳する。
1. 「ツール」→「翻訳状況」で進捗を確認できる。今回の例では 262/407 が未翻訳で残った。

# 未翻訳のまま残った文を翻訳する
ここからは手作業と言えば手作業だ。しかし、似た原文には参考訳文が出たり、重複する原文は一回訳すだけで良かったりと、翻訳メモリのお陰でかなり省力化できる。

余談だが、メニューの項目を訳す場合はちょっと注意が必要。例えばアンダースコア付きの "_Edit" という原文に対して単に "編集" という参考訳文が出ることが多々ある。正しくは "編集(E)" としないとアクセラレーション
 キー（Alt+Eとか）が使えなくなる。また、通常の文では半角括弧の外側に半角空白を置くのが正しいが、アクセラレーション
 キーの場合は例外的に半角空白は置かない[^2]。
[^2]: 翻訳には他にも細かいルールがたくさんあるので、MicrosoftとかJTFとかが公開している日本語スタイルガイドからどれかひとつ選んで準拠するのが良い。…2019/07/30追記: 各種スタイルガイドについて、記事「[シェーダー本を書いて得た知見まとめ](https://qiita.com/midnightSuyama/items/cb6932d4e6efbd7e264c#%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%81%A8%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%83%BC)」内で紹介されていて参考になる。

# 訳文を生成する
翻訳が終わったら（途中でも良いが）、`Ctrl-D` で訳文を target/ フォルダーに出力する。今回のようにJava の .properties ファイルの場合は、ロケールのサフィックス (_ja) が付いたファイル名で、`native2ascii` で処理されたうえで出力される。

# 実際の表示を確認して完了
最終的に、出力した訳文を含めた状態でGluon版のScene Builderを動作させて一通り確認した。

バージョン管理の差分が読みやすいように native2ascii を外してみた (`native2ascii -reverse`) 。特に表示に問題なさそうだったため、そのままプルリクエストを投げた。

https://bitbucket.org/gluon-oss/scenebuilder/pull-requests/59/

2018/02/22現在、日本語が分かる人がいないようでレビュー待ちの状態。誰かお願いします。→2018/03/18 acceptされた。

2018/06/22追記: Gluonで配布され始めたものが（少なくともWindowsインストーラー版で）激しく文字化けする不具合が出ている。[@izayoi5776さんの記事](https://qiita.com/izayoi5776/items/6e06265c8761a1753f61)へのコメントで対処法を書いたので参考にしてください。