プロジェクト

全般

プロフィール

GuideI18n » 履歴 » バージョン 2

Mitsuyoshi Yoshida, 2011/06/26 00:58

1 1 Mitsuyoshi Yoshida
h1. 国際化
2
3
このプラグインを日本語に対応させるためには国際化する必要があります。
4
この国際化について説明します。
5
6
7
h2. 国際化
8
9
Rails の国際化には *i18n* というライブラリを使用します。 
10
国際化は英語でいうと internationalization で 18 文字なので、 i18n と略記されます。ライブラリはそのままの名前です。
11
12
英語以外の言語を使えるようにするためにはレベルがあります。 http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l2
13
14
|_. 名称   |_. 略号 |_. 説明 |
15
| 地域化 (localization) | L10N | マルチバイト文字を扱える |
16
| 国際化 (internationalization) | I18N | 各種メッセージや通貨記号等を地域ごとに容易に切り替えられる |
17
| 多言語化 (Multilingualization) | M17N | 同時に複数の言語を扱える |
18
19
Rails の i18n は国際化に対応していて、ユーザの言語環境の設定に応じて、メッセージの切り替えや日付などの表示形式を変えることが出来ます。
20
Ruby はバージョン 1.9 から m17n に対応しました。今のバージョンの Redmine は 1.9 に対応していませんが、 Ruby の m17n にはメッセージ切り替えの機能はありませんので、今後も i18n による国際化の方法は変わらないのではないかと思います。
21
22
23
h2. メッセージファイル
24
25
プラグインのスケルトン生成スクリプトでは config/locales/en.yml ファイルが生成されます。
26
*config/locales* が国際化用のメッセージファイルを置くディレクトリで、ここに言語別のメッセージファイルを置けば、ユーザの指定した言語のメッセージファイルの内容がラベルやメッセージとして使用されます。
27
生成された *en.yml* が英語用のファイルです。日本語用のメッセージファイル名は *ja.yml* となります。
28
29
日本語表示するだけならば ja.yml だけでもよいのですが、プラグインを公開する場合などは英語のメッセージも付けてください。英語は苦手だという方もいるかと思いますが、無いよりまし ぐらいのつもりで適当にでも書いておきましょう。私も英語は苦手で、なにか違う気はするなと思いつつ、多分伝わるだろうという感じで一応つけています。
30
31
メッセージファイルは YAML(YAML Ain't a Markup Language) というフォーマットでかかれます。これは読み書きしやすい XML のようなもので、 ruby ではよく使用されるフォーマットです。 ここでは YAML の詳しい説明は行わず、メッセージファイルとしての最低限の説明だけにします。より詳しく知りたい方は他のサイトを見てください。
32
33
* Ruby Magazine
34
** http://jp.rubyist.net/magazine/?0009-YAML
35
* 公式ページ
36
** http://www.yaml.org/
37
38
39
h2. YAML ファイル
40
41
config/locales/en.yml ファイルの中身をみてみましょう。
42
43
<pre><code class="yaml">
44
# English strings go here for Rails i18n
45
en:
46
  my_label: "My label"
47
</code></pre>
48
49 2 Mitsuyoshi Yoshida
最初の <notextile>#</notextile> から始まる行はコメントです。
50 1 Mitsuyoshi Yoshida
51
先頭は *言語の識別子:* で始める必要があります。日本語の場合は *ja:* となります。
52
その後、メッセージを取得するためのキーとメッセージのペアを書いていくことになります。
53
54
<pre><code class="yaml">
55
言語の識別子:
56
  シンボル名: メッセージ
57
  シンボル名: メッセージ
58
          # :
59
</code></pre>
60
61
記述する場合にはインデントに気をつけてください。YAML では *インデントによって階層化* されます。また、 ファイル内での *タブは使用禁止* です。
62
また生成されたファイルではメッセージをダブルクオートで囲んでいますが、簡単なものであれば囲う必要はありません。大抵は囲っていなくても大丈夫です。
63
あとこれはフォーマットの仕様ではなく Rals の決まりなのですが、文字コードは必ず *UTF-8* にしてください。
64
65
66
h2. メニューを日本語化する
67
68
いきなり、少し特殊な例になってしまいますが、作ったメニューと権限レポートの項目を日本語化することにします。そのためのメッセージを en.yml と ja.yml に追加します。また、生成時に付けられているコメントは削除しています。 
69
ja.yml の方のファイルの中身は次のような感じです。
70
71
<pre><code class="yaml">
72
ja:
73
  label_standard: 標準
74
  project_module_standard: 標準プラグイン
75
  permission_view_foos: サンプルデータの閲覧
76
  permission_manage_foos: サンプルデータの管理
77
</code></pre>
78
79
これを記述したら、 Redmine を起動してメニューと権限レポートを確認してみましょう。
80
ちなみにメッセージファイルも app 以下と同様に development モードでは再起動なしで編集が反映されます。
81
82
h3. メニュー
83
84
作成しているプラグインのメニューを見てください。 ja.yml に記述しただけでいきなり日本語化されています。
85
86
!sample_proj_menu_ja.png!
87
88
これはメニューの場合、 *label_メニュー項目名* というシンボル名で対応する翻訳メッセージを探し、見つかればその翻訳メッセージでラベルを表示するようになっているためです。 サンプルではメニューの項目名を starndard にしました。そこで label_standard をキーとするメッセージを書いたので、メニュー項目が日本語化されたというわけです。
89
90
91
h3. モジュール名、権限レポートの項目
92
93
権限レポートも見てみましょう。こちらも日本語化されています。
94
95
!permission_ja.png!
96
97
モジュール名は *project_module_モジュール名* というシンボル名のメッセージが使用されます。 init.rb の project_module メソッドでモジュール名を :standard としたので、 project_module_standard のメッセージが使用されています。
98
権限メニューの権限項目で使用されるメッセージのシンボルは *permission_権限名* です。
99
100
<pre><code class="ruby">
101
  project_module :standard do
102
    permission :view_foos, :foos => [:index, :show]
103
    permission :manage_foos, {:foos => [:new, :edit, :destroy]},
104
               :require => :member
105
  end
106
</code></pre>
107
108
モジュール名はプロジェクトの設定ページなどでも使用されますが、そちらも日本語で表示されるようになっていると思います。
109
110
111
h2. メッセージの取得方法
112
113
それではメッセージの通常の取得方法に移ります。 メッセージを取得するには i18n の次のメソッドを使用します。
114
115
|_. メソッド |_. 引数 |_. 例 |
116
| l | メッセージのシンボル名、Time などのオブジェクト | l(:label_standard) |
117
| t | メッセージキーの文字列 | t('label_standard') |
118
119
*l* メソッドの場合、メッセージだけでなく、日付などのオブジェクトを渡して地域別の表示形式にした文字列を取得することも出来ます。通常こちらを使用します。
120
*t* の場合はシンボル名ではなく、文字列を渡します。基本的に l を使えばいいのですが、メッセージを階層化した場合などはこちらを使用して t('foo.bar') というようにアクセスします。
121
122
また、 app 以下のファイル内では場合は l, t をそのまま記述できますが、 init.rb や lib 以下のファイル中では *I18n.l* というようにモジュール名を指定しておく必要があります。ただし、 Rails の名前の推測によるファイルのロードのおかげで i18n を require する必要はありません。
123
124
実際に index ページで使って表示してみましょう。
125
126
<pre><code class="rhtml">
127
<h2> <%=h l :label_standard %> </h2>
128
</code></pre>
129
130
ここの *h* は Rails のメソッドで <>& などの html で使用できない文字を <notextile>&amp;</notextile> といった形式に変換してます。
131
132
!i18n_index.png!
133
134
h2. サンプルプラグインのメッセージ
135
136
サンプルプラグインのメッセージファイルに今後使用しそうなメッセージも追加します。
137
138
*en.yml*
139
<pre><code class="yaml">
140
en:
141
  label_standard: Standard
142
  project_module_standard: Standard plugin
143
  permission_view_foos: View sample data
144
  permission_manage_foos: Manage sample data
145
146
  label_foos_new: New sample data
147
  label_foo: Sample data
148
</code></pre>
149
150
*ja.yml*
151
<pre><code class="yaml">
152
ja:
153
  label_standard: 標準
154
  project_module_standard: 標準プラグイン
155
  permission_view_foos: サンプルデータの閲覧
156
  permission_manage_foos: サンプルデータの管理
157
158
  label_foos_new: 新しいサンプルデータ
159
  label_foo: サンプルデータ
160
</code></pre>
161
162
ちょっと少ないと思いましたか? 
163
プラグインでは Redmine でもともと定義されているメッセージも使用できます。"編集"や"説明"といったよく使うラベルは Redmine のものを使用します。このためサンプルで記述するメッセージは少なくなっています。
164
165
これはサンプルだから手を抜いているというわけではありません。メッセージを追加する場合はまず Redmine の @app/config@ 以下のメッセージファイルですでに定義ずみでないか調べ、なるべく Redmine のものを使用した方がよいと私は思います。
166
そうすると Redmine のバージョンが上がった場合、メッセージが翻訳されなくなる危険性がありますが、Redmine のものを利用した方がプラグインを公開した場合などで翻訳者の負担が減りますし、 DRY だと思うからです。
167
168
169
---
170
171
| [[プラグイン開発ガイド|^]] | [[GuideForProject|<<]] | [[GuideIndexAction|>>]] |