Webアプリケーションの国際化

3,668 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,668
On SlideShare
0
From Embeds
0
Number of Embeds
49
Actions
Shares
0
Downloads
79
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Webアプリケーションの国際化

  1. 1. Webアプリケーション の国際化 2007/08/09 - ウノウ株式会社 - 駒形真幸 <komagata@p0t.jp>
  2. 2. GNU gettextを使おう
  3. 3. GNU gettextのいいところ 多機能 ● (多過ぎて紹介しきれません・・・) 関連ツールが揃ってる ● 枯れてる ●
  4. 4. 国際化の大体の手順 1. ソース中の文字列をgettext関数で置き 換える 2. 置き換えた部分を元にpotファイル (PO Template)を作る 3. potファイルから各言語用のpoファイル (Portable Object)にコピー・編集 4. poファイルをmoファイル (Machine Object)にコンパイル
  5. 5. Rubyの例で説明 (他の言語でもあまり違わない)
  6. 6. Ruby-GetTextで国際化 GNU gettextと共通のツールが使える ● (ファイルのパースはRacc) Railsをサポート ●
  7. 7. Hello, Worldを国際化
  8. 8. hello.rb: #!/usr/bin/env ruby require 'rubygems' require 'gettext' include GetText bindtextdomain('hello') puts _('Hello, World') # 文字列を_()関数で置き換える $ mkdir -p po/ja $ rgettext hello.rb -o po/hello.pot $ msginit -i po/hello.pot -o po/ja/hello.po -l ja msginitが言語によってpluralを設定してくれるので便利
  9. 9. po/ja/hello.po (略) quot;Plural-Forms: nplurals=1; plural=0;nquot; #: hello.rb:8 msgid quot;Hello, Worldquot; msgstr quot;こんにちは、世界quot; _()関数の部分を自動的にmsgidとして抽出してくれてるので対応する文 字列をmststrに入れていく
  10. 10. $ mkdir -p locale/ja/LC_MESSAGES $ rmsgfmt po/ja/hello.po -o locale/ja/LC_MESSAGES/hello.mo $ export GETTEXT_PATH='locale' $ ./hello.rb こんにちは、世界 rmsgfmtコマンドでpoファイルをmoファイルにコンパイルする。 $ export LANG=en_us.UTF-8 $ ./hello.rb Hello, World 環境変数の言語設定によって切り替わる。
  11. 11. Railsアプリケーションの国際化
  12. 12. デフォルトの状態
  13. 13. Ruby-GetTextを利用
  14. 14. config/environment.rb: の下の方 require 'gettext/rails' app/controller/application.rb class ApplicationController < ActionController::Base init_gettext 'rails_gettext' end
  15. 15. Ruby-GetText自体がrailsのmoファイル を持ってるのでデフォルトのエラーメッセ ージなどがいきなり国際化
  16. 16. アプリ固有部分も国際化
  17. 17. lib/tasks/gettext.rake desc quot;Update pot/po files.quot; task :updatepo do require 'gettext/utils' GetText.update_pofiles( quot;rails_gettextquot;, Dir.glob(quot;{app,config,components,lib}/**/*.{rb,rhtml,rxml}quot;), quot;rails_gettext 0.0.1quot; ) end desc quot;Create mo-filesquot; task :createmo do require 'gettext/utils' GetText.create_mofiles(true, quot;poquot;, quot;localequot;) end こんな感じのtaskを作っておくと楽に。
  18. 18. Webアプリケーションの場合 言語はどうやって選ばれるのか
  19. 19. 優先順位 1. GetText.localeの値 2. QUERY_STRINGのlangの値 3. クッキーに保持されたlangという値 4. HTTPヘッダのAccept-Language (ブラウザで設定できるアレ) ※↑優先順位高 / ↓優先順位低
  20. 20. 国際化で言語毎にDBを分ける という選択 (ソースは共通)
  21. 21. ユーザーは知らない言語が画面に あると使ってくれない
  22. 22. どうやってソース共通で DBを分けるか
  23. 23. config/environment.rb: GetText.locale = ENV['RAILS_LANG'] config/database.yml: development: adapter: sqlite3 database: db/development<%= ENV['RAILS_LANG'] %>.sqlite3 timeout: 5000 ※環境変数RAILS_LANGは勝手に作った変数です。
  24. 24. その発想は無かったわ
  25. 25. Apache + mod_fcgidの場合: DefaultInitEnv RAILS_LANG en mongrelなどの場合: export RAILS_LANG=en; ruby script/server
  26. 26. 翻訳作業を簡単に 翻訳はエンジニアがやるとは限らない ● gettextによる国際化は非エンジニアには ● 辛い(覚えるのに時間もかかる) 翻訳する人が複数いる場合の管理が大 ● 変 → そこでPootle
  27. 27. Pootle Webからpoファイルの編集、svnへのコミ ● ットが出来る ユーザー管理や言語管理もWebから出 ● 来る Python製 ● パッケージがあれば一発インスール ● (無いとインストール地獄)
  28. 28. まとめ • gettextは歴史があり、なんだかんだ いって便利。 • poの編集はPootleがおすすめ。

×