日本語 : Internationalization

オリジナル: Internationalization

開発者が知っておくべきこと、すべきこと

Jenkinsのi18n化について開発者が知っておくべきことが2点あります。

  1. Messages.properties からタイプセーフな Messages クラスを生成する。
  2. Jellyファイルのメッセージを作成する。

Message クラスの生成

Jenkinsは、localizerを使用して、タイプセーフな方法でメッセージリソースにアクセスするためのクラスを生成します。各src/main/resources/**/Messages.properties毎に、メッセージクラスが1つ生成されます。このクラスがどのようなものかは、リファレンスページを参照してください。IDEがこれらのクラスを見つけられない場合、手動で"target/generated-sources/localizer"ディレクトリをソースディレクトリに追加してください。

表示目的の文字列を返す箇所(例えば、Descriptor.getDisplayName())では、ローカライズされたメッセージを取得するために、Messageクラスを使用します。動作時に、適切なロケールが自動的に選択されます。この一般的な手順は以下の通りです。

  1. ローカライズする必要があるメッセージを確認します。
  2. そのメッセージをMessages.propertiesに記述します。One can choose to have this file for each package, or you could just have one such file for the whole module/plugin.
  3. mvn compile を移動して、Messages.java を再生成します。
  4. 新しく生成されたメッセージフォーマットメソッドを使用するように、コードを更新します。

    例によって、coreのコードを参考にすれば、役に立つでしょう。

Jellyファイルでのメッセージのマークアップ

src/main/resources のJellyファイルには、ローカライズすべきメッセージがあり、マークアップする必要があります。

簡単なケースとして、次のようなJellyファイルの一部があるとします。

<h1>Output</h1>
<p>...</p>

これを次のように変更するだけです。

<h1>${%Output}</h1>
<p>...</p>

${%...} は、staplerにローカライズされたリソースを参照するよう指示します。見つからなければ、"Output"とだけ出力します。

ローカライズされたリソースがパラメータを必要とするケースを考えてみましょう。次のような foo.jelly ファイルがあるとしましょう。

<p>Click <a href="${obj.someMethod(a,b,c)}" >here</a></p>

この場合、ます、デフォルトのロケール用に foo.properties を書く必要があります。

click.here.link=Click <a href="{0}" >here</a>

次に、以下のように foo.jelly を更新します。

<p>${%click.here.link(obj.someMethod(a,b,c))}</p>

複数のパラメータがある場合、','区切りで渡します(ファンクションコールのように)。そうすれば、そのパラメータを{0}や{1}のように、the MessageFormat class conventionに従って、プロパティファイルから参照できます。

最後に、次のような式の中にあるメッセージについて考えてみましょう。次のようなJellyファイルがあるとすると、

<p>${h.ifThenElse(x,"no error","error")}</p>

次のように、ローカライズ用に2つの文字列を記述できます。

<p>${h.ifThenElse(x,"%no error","%error")}</p>

翻訳者が知っておくべきこと、やるべきこと

Jenkinsプロジェクトでは、翻訳者を歓迎します。もし、私たちのお手伝いに興味があるならコミット権をあげるので、jenkinsci-dev@googlegroups.comに連絡してください。 残りのセクションでは、何をどのように翻訳すべきかについて説明します。

Messages.properties の翻訳

開発者は、Messages.properties にローカライズする必要があるメッセージを記述します。翻訳が初めてなら、参考としてcoreディレクトリにある Messages_ja.properties を参照してください。

Messages.properties だけ見ても、メッセージが使われている箇所での文脈上の意味がわからないことがあります。その場合、localizer で生成したタイプセーフな Messages を使って、そのメッセージを参照してみるといいでしょう。メッセージが本当に使用されている箇所を発見するには、IDEを使ってメッセージフォーマットメソッドの全ての使用箇所を探してください。

Jellyで参照されているメッセージの翻訳

上記以外にも、Jellyのビューファイルにも翻訳が必要なメッセージがあります。それらは、src/main/resources/**.jelly にあります。ローカライズするには、まずMavenを実行して対象ロケール用のプロパティファイルのひな形を生成します。

$ cd hudson/main/core  (or hudson/plugins/xyz)
$ mvn stapler:i18n -Dlocale=fr

上記を実行すると、src/main/resources に対して空の値を持つ *_fr.properties を生成します。 ファイルが既にあれば、足りないメッセージを追加します。

各プロパティファイルについて、メッセージを翻訳します。ファイル全てを翻訳する必要はありません。---- 空のままにすると、デフォルトのロケールが使用されます。

FirefoxのアドオンであるQuick locale switcher が、いろいろなロケールを切り替えるのに便利です。

静的なHTMLリソースの翻訳

Jenkinsでは、ヘルプメッセージのように、HTMLファイルが単独で使用されます。これらのリソースを翻訳するには、ファイル名と拡張子の間にロケールコードを追加して、翻訳する必要があります。例えば、abc.html の日本語版は、abc_ja.html になりますし、英国版は abc_en_GB.html になります。エンコーディングはUTF-8を使用します。

変更の反映

何らかの変更を行ったら、コミットします。翻訳者は、翻訳者自身がそのロケールのプロパティファイルの持ち主なので、気楽にコミットしてください。コミットするのが初めてなら、小さなコミットをまず最初に行うのもいい考えです。安全策をとるなら、パッチを送るのもいいでしょう。

翻訳を始めたら、誰か他の人が同じロケールで翻訳していないか確認してください。翻訳済みのリソースを見つけて、Subversionの履歴を探せば誰なのかわかります。抜け駆けを防ぐためにも、彼らと話し合いましょう。

IntelliJ IDEAのStaplerプラグイン

i18n化できるように、既存のコードをリファクタリングするのは面倒です。これを簡単にできるように、Stapler plugin for IntelliJ IDEAが開発されました。(注記 JetBrains社はHudsonプロジェクトにオープンソースライセンスを提供してくれましたので、開発者は無償でライセンスを取得できます。--- もし必要なら、川口さんに連絡してください。)

Once installed, this adds a menu item in the main menu, under "Refactor." It is highly recommended to give some keyboard short cut to this. I use "Ctrl+Alt+I":

Now, to use this feature, select the message you'd like to internationalize, then trigger this refactoring command. It'll ask you the message property name for this, so pick a name:

IDEA will place the message into the resource file, and adjust the code accordingly. Note that an error is highlighted until you run mvn compile again to generate new methods on the Messages class.