2日しかなかったような気がするのは、きっと気のせい。
「http://rthfgwegferyhty.com/erfglkjh4.html」とか、「http://kjfeg.ergvrtibkj33.com/erfglkjh4.html」とか、謎のリンク元が出現。ドメインは存在しないのにファイル名は同じ。アクセス元も同じというところが気味悪い。
googleによると、「erfglkjh4.html の検索結果 約 158 件」というこれまた微妙な数字。「ergvrtibkj33.com」とセットになっているところが多いみたい。どこかで誰かが運用している秘密(?)サイト??
Rubyの軽量フレームワークSinatraでI18nライブラリを使う方法のメモです。I18nについては別の実装としてR18nライブラリというのもあるようです。
まずはライブラリのデフォルトに従い、最小のコードで最低限の機能を実現することを目標にします。
# gem install i18n # gem install sinatra-i18n # gem install rack-contrib
;i18n
;sinatra-i18n
;rack-contrib
# mkdir i18n-sample # cd i18n-sample
# mkdir -p config/locales
config/locales/の下にen.ymlというファイルを作る。ファイルはYAMLフォーマットでロケールをトップレベルのキーとしたハッシュの形で記述します。
en: message: hello: hello! ja: message: hello: こんにちは!
このサンプルでは、message.hello というラベルに、:en ロケールでは"hello!"、:ja ロケールでは"こんにちは!"という文字列が対応するようになります。
i18n-sampleディレクトリにstart.rbを作る。
require 'rubygems' require 'sinatra' require 'sinatra/i18n' require 'rack/contrib' Sinatra.register Sinatra::I18n use Rack::Locale get '/?' do t('message.hello') end
# ruby start.rb == Sinatra/1.0 has taken the stage on 4567 for development with backup from Mongrel
この状態でブラウザから http://sample-host:4567/ にアクセスすると、ブラウザの言語設定にしたがって"Hello!"または"こんにちは!"と表示されます。
というわけで、非常に簡単にI18n対応できたのですが、次のような問題もあります。
ということで、次のエントリではこの問題に対処します。
SinatraとI18n、Rack::Localeライブラリを組み合わせると簡単にI18n対応することができますが、以下のような問題がありました。
このエントリではこれらの問題の解決を図ります。
libというディレクトリを作り、その下に変更するライブラリをコピーします。
# mkdir -p lib/sinatra # mkdir -p lib/rack/contrib # cp /GEM/LIBRARY/ROOT/sinatra-i18n-0.1.0/lib/sinatra/i18n.rb lib/sinatra/ # cp /GEM/LIBRARY/ROOT/rack-contrib-1.0.1/lib/rack/contrib/locale.rb lib/rack/contrib
このようにディレクトリ階層を再現することにより、元のソースの変更を最小限で済ませることができ、またオリジナルのライブラリで問題が解決した際にはコピーしたファイルを消すだけで元に戻せるようにできます。
コピーしたライブラリファイルを以下のように修正します。 ;lib/sinatra/i18n.rb
Sinatra の :locales 設定に複数のファイルを指定できるようにします。
% diff -U0 i18n.rb.old i18n.rb --- i18n.rb.old 2010-09-26 18:40:05.000000000 +0900 +++ i18n.rb 2010-09-26 18:40:26.000000000 +0900 @@ -18 +18 @@ - ::I18n.backend.load_translations(app.locales) + ::I18n.backend.load_translations(*app.locales)
))) ;lib/rack/contrib/locale.rb
ブラウザのACCEPT_LANGUAGEを優先順に評価し、アプリ側で有効なロケールが見つかったら設定します。見つからなかった場合はI18n.default_localeに設定します。
% diff -u locale.rb.old locale.rb --- locale.rb.old 2010-09-26 18:54:43.000000000 +0900 +++ locale.rb 2010-09-26 19:40:04.000000000 +0900 @@ -12,14 +12,14 @@ # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 if lang = env["HTTP_ACCEPT_LANGUAGE"] - lang = lang.split(",").map { |l| + lang.split(",").each { |l| l += ';q=1.0' unless l =~ /;q=\d+\.\d+$/ - l.split(';q=') - }.first - locale = lang.first.split("-").first - else - locale = I18n.default_locale + locale = l.split(';q=').first.split("-").first.to_sym + break if I18n.available_locales.include?(locale) + locale = nil + } end + locale ||= I18n.default_locale locale = env['rack.locale'] = I18n.locale = locale.to_s status, headers, body = @app.call(env)
)))
サンプルコードを次のように修正します。
$LOAD_PATH.unshift './lib' require 'rubygems' require 'sinatra' require 'sinatra/i18n' require 'rack/contrib' set :locales, Dir[ "config/locales/*.yml" ] I18n.default_locale = :ja Sinatra.register Sinatra::I18n use Rack::Locale get '/?' do t('message.hello') end
;1行目
;7行目
;8行目
config/locales/ の下のen.ymlをja.ymlにコピーし、ロケールの設定を分けます。
;en.yml
en: message: hello: hello!
))) ;ja.yml
ja: message: hello: こんにちは!
)))
# ruby start.rb == Sinatra/1.0 has taken the stage on 4567 for development with backup from Mongrel
- aparadekto [Hey, I can't view your site properly within Opera, I actua..]
- hs [Hmm... I checked with Opera 10.63 and it looks no problem ..]