在
每天一剂Rails良药之Adding Support for Localization里我们讲到了globalize插件
今天来看另一个提供本地化功能的插件localization,localization的特性:
1,支持任何数量的languages和locales
2,定义singluar/plural翻译的简单方法
3,使用lambdas来提供基于Ruby代码的动态翻译
4,定制应用程序的不同实例
安装好该插件后,自动就可以使用它了
我们在RAILS_ROOT/lang/目录下定义翻译文件,如lang/de_DE.rb:
Localization.define('de_DE') do |l|
l.store '%d entries', ['Ein Eintrag', '%d Eintr@#$ge']
l.store '(time)', lambda { |t| t.strftime('%H:%M') }
end
在application.rb里定义:
Localization.lang = 'de_DE'
在视图里使用_()方法来翻译:
<%=_ '%d entries', 1 %> # singular variant is chosen
<%=_ '%d entries', 4 %> # plural variant is chosen
<%=_ '(time)', Time.now %> # call the block with a parameter
因为_()方法是对Object类的扩展,所以我们可以在任何地方使用它(models/controllers/views/libs)
我们看看localization.rb里的一段代码:
module Localization
# ...
def self._(string_to_localize, *args)
translated = @@l10s[@@lang][string_to_localize] || string_to_localize
return translated.call(*args).to_s if translated.is_a? Proc
if translated.is_a? Array
translated = if translated.size == 3
translated[args[0]==0 ? 0 : (args[0]>1 ? 2 : 1)]
else
translated[args[0]>1 ? 1 : 0]
end
end
sprintf translated, *args
end
# ...
end
class Object
def _(*args); Localization._(*args); end
end