在rails中找到未翻译的语言环境

时间:2010-03-09 14:02:18

标签: ruby-on-rails ruby internationalization

我正在使用带有i18n的rails 2.3.5。我有办法在所有视图中找到所有尚未翻译的区域设置吗? 也许是应用程序控制器中的after_filter,但是我可以使用哪些代码来完成这项工作?

感谢

2 个答案:

答案 0 :(得分:5)

使用i18n gem(Rails确实如此)时,您可以指定自己的异常处理程序。试试这段代码:

# A simple exception handler that behaves like the default exception handler
# but additionally logs missing translations to a given log.
#
module I18n
  class << self
    def missing_translations_logger
      @@missing_translations_logger ||= Logger.new("#{RAILS_ROOT}/log/missing_translations.log")
    end

    def missing_translations_log_handler(exception, locale, key, options)
      if MissingTranslationData === exception # use MissingTranslation in Rails 3.x !!!
        puts "logging #{exception.message}"
        missing_translations_logger.warn(exception.message)
        return exception.message
      else
        raise exception
      end
    end
  end
end

I18n.exception_handler = :missing_translations_log_handler

(例如把它放到RAILS_ROOT / config / initializers / i18n.rb中)

现在,每当您尝试翻译未指定翻译的密钥时,都会在RAILS_ROOT / log / missing_translations.log中打印一条警告。

希望这有帮助!

答案 1 :(得分:0)

我找不到一个简单的技巧,所以我这样做了。首先在application_controller.rb

中实现'before_filter'
before_filter :set_user_language

# set the language, 'zen' is a special URL parameter that makes localizations the use the 't' method visible
def set_user_language
  # turn on 'zen' to see localization by adding 'zen=true' to query string, will stay on until a query with 'zen=false'
  session[:zen] = (session[:zen] || params[:zen] == "true") && params[:zen] != "false"
  I18n.locale = 'en'
end

以上在查询字符串中找到'zen = true'和'zen = false'。然后将此方法添加到application_helper.rb:

def t(*args)
  result = super(*args)
  result = "[#{result}]" if session[:zen] && result.is_a?(String)
  result
end

使用此方法'zen = true'使't'方法在方括号[]中显示本地化字符串。要关闭它,请输入带有'zen = false'的查询字符串。