如何检查本地化是否存在?

时间:2010-08-13 12:54:01

标签: ruby-on-rails localization

我正在创建一个目前正在翻译成不同语言的小网站。我使用Rails开箱即用的翻译:l18n。要更改本地化,必须提供名为locale的参数,例如:http://localhost:3000/?locale=nl

ApplicationController中,此参数将保存到会话变量中并用作本地化。如何检查区域设置是否确实存在?是否有内置函数,或者我是否需要在每个本地化文件中添加exists: "true"来检查它?

1 个答案:

答案 0 :(得分:1)

如果区域设置不存在,Rails将默认为“en”作为默认语言环境。因此,如果我通过http://localhost:3000/?locale=de并且该翻译不存在,那就太讨厌了,将会使用'en'。

在这里查看http://guides.rubyonrails.org/i18n.html,尤其是“2.3设置和传递区域设置”部分

#config/initializers/available_locales.rb 

# Get loaded locales conveniently 

module I18n 
 class << self  
  def available_locales; backend.available_locales; end  
 end  
 module Backend 
   class Simple 
     def available_locales; translations.keys.collect { |l| l.to_s }.sort; end  
   end  
 end 
end 

# You need to "force-initialize" loaded locales 
I18n.backend.send(:init_translations) 

AVAILABLE_LOCALES = I18n.backend.available_locales 
RAILS_DEFAULT_LOGGER.debug "* Loaded locales: #{AVAILABLE_LOCALES.inspect}" 

然后,您可以在ApplicationController中包装常量以便于访问:

class ApplicationController < ActionController::Base 
  def available_locales; AVAILABLE_LOCALES; end 
end 

您可以在ApplicationController中实现它:

before_filter :set_locale 

def set_locale 
  I18n.locale = extract_locale_from_params 
end 

def extract_locale_from_params 
  parsed_locale = params[:locale] 
 (available_locales.include? parsed_locale) ? parsed_locale : nil 
end  

HTH