2009年8月26日水曜日

[Rails][CodeReading] Rails::Initializer (19) initialize_i18n

Initializer.process で19番目に呼ばれる initialize_i18n メソッド。

def initialize_i18n
configuration.i18n.each do |setting, value|
if setting == :load_path
I18n.load_path += value
else
I18n.send("#{setting}=", value)
end
end
end


Configuration.i18n は、Arrayを拡張したOrderedOprionsクラスのオブジェクトが格納されています。

def default_i18n
i18n = Rails::OrderedOptions.new
i18n.load_path = []

if File.exist?(File.join(RAILS_ROOT, 'config', 'locales'))
i18n.load_path << Dir[File.join(RAILS_ROOT, 'config', 'locales', '*.{rb,yml}')]
i18n.load_path.flatten!
end

i18n
end


class Rails::OrderedOptions < Array #:nodoc:
def []=(key, value)
key = key.to_sym

if pair = find_pair(key)
pair.pop
pair << value
else
self << [key, value]
end
end

def [](key)
pair = find_pair(key.to_sym)
pair ? pair.last : nil
end

def method_missing(name, *args)
if name.to_s =~ /(.*)=$/
self[$1.to_sym] = args.first
else
self[name]
end
end

private
def find_pair(key)
self.each { |i| return i if i.first == key }
return false
end
end

デフォルトでは、$RAILS_ROOT/config/locale/*.{rb, yml} ファイルが、I18n.load_path に追加されます。初期状態では、このディレクトリには en.yml というファイルだけが入っていました。environment.rb 内で
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
# config.i18n.default_locale = :de
をコメントアウトして適宜書き換えることで、独自のロケールファイルパスを追加したり、デフォルトロケールを変更することができるはず。

[Rails][CodeReading] Railsの初期化コードを読む (イントロ&目次)

0 件のコメント:

コメントを投稿