Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,753 views

Published on

Published in: Technology
  • Be the first to comment

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がおすすめ。

×