query: tag:i18n

会社設立以来ほとんど更新していなかったのですが、
iPhoneアプリ等の開発で製品を紹介するページを置く場所が必要になったので、
Rails-2.3.2がリリースされた事もあり、I18nを使って国際化仕様のサイトを作りました。

http://ja.www.s21g.com/ 日本語
ss1

http://en.www.s21g.com/ 英語
ss2

従来通り、http://www.s21g.com/にアクセスすると、ブラウザの設定に従って、自動的に日本語か英語のサイトに振り分けられます。
localizationファイルをもっと用意すれば、ISOで定義されてる言語なら何語でも大丈夫なのですが、とりあえずはjaとenのみサポートです。

I18nの使い方

ローカライズファイルは、デフォルトではconfig/locales/*.ymlに配置します。
mutohさんの、
locale、
locale_rails
を使うと色々と便利です。
EdgeバージョンはRails-2.3.2でも利用出来ました。

自動的にロケールを判別するために、以下のようなコードを
ApplicationControllerに書きました。

ruby>>
class ApplicationController < ActionController::Base
before_filter :set_locale

(..snip..)

def set_locale
I18n.locale = @original_locale = fallback_locale(I18n.locale)
if request.host =~ /^([\w-]+).#{HOST.split(':')[0]}/i
I18n.locale = fallback_locale($1)
end
end

private
def fallback_locale(locale)
locale = locale.to_s
@available_locales ||= Set.new(I18n.available_locales)
until locale.empty? || @available_locales.include?(locale.intern)
locale = locale.split(/([-_])/)[0..-3].join
end
locale.present? ? locale.intern : I18n.default_locale
end
<<--

実際にローカライズする手順は、以下のような感じになります。

文字列のローカライズ

*.ymlファイルで定義されているメッセージキーに対して、

yaml>>
ja:
"hello": "こんにちわ"
<<--

こんな感じにt(...)ヘルパーメソッドを使います。

ruby>>
t("hello") #=> "こんにちわ"
<<--

時刻などのローカライズ

時刻の場合もほぼ同様で、以下のような*.ymlファイルで定義されている設定に対応して、

yaml>>
ja:
date:
formats:
default: "%Y/%m/%d"
short: "%m/%d"
long: "%Y年%m月%d日(%a)"
<<--

以下のようにl(...)ヘルパーメソッドを使ってローカライズします。

ruby>>
l(Date.today, :format => :short) #=> "03/22"
<<--

テンプレートのローカライズ

Viewテンプレートを丸ごとローカライズする場合は、

  • top/index.ja.html.erb
  • top/index.en.html.erb

のようなファイル名すればOKです。

posted by genki genki on Sun 22 Mar 2009 at 09:44 with 0 comments

Mattettiさんから連絡があって、
forkして開発していたmerb_babel
を
本家に取り込んでもらいました。
以下のような機能を追加しています。

  • Merb::Requestからの国コード判別機能
  • YAMLを利用した階層化ローカライゼーション
  • 時刻のローカライゼーション

将来的には、merb-sliceの形にして、ローカライズファイルの
オンライン編集が出来るようにしたい。

posted by genki genki on Sat 17 Jan 2009 at 04:49 with 0 comments

merb_babel
はmattettiさんが開発しているmerb用のi18n/l9nライブラリです。

オリジナルのmerb_babelは、ブラウザが渡すHTTP_ACCEPT_LANGUAGEを考慮して、ユーザのロケールを自動判別する機能が無かったので、実装を追加してみました。

こんな感じに使います。

img

PokéDia
の今日の出来事情報を管理するためのバックエンドとなるサービスの開発に利用しています。

posted by genki genki on Mon 5 Jan 2009 at 01:37 with 0 comments