【发布时间】:2010-03-09 14:02:17
【问题描述】:
我正在使用带有 i18n 的 rails 2.3.5。我有没有办法在所有视图中找到所有尚未翻译的语言环境? 可能是应用程序控制器中的 after_filter,但我可以使用哪些代码来完成这项工作?
谢谢
【问题讨论】:
标签: ruby-on-rails ruby internationalization
我正在使用带有 i18n 的 rails 2.3.5。我有没有办法在所有视图中找到所有尚未翻译的语言环境? 可能是应用程序控制器中的 after_filter,但我可以使用哪些代码来完成这项工作?
谢谢
【问题讨论】:
标签: ruby-on-rails ruby internationalization
当使用 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 中打印一条警告。
希望这会有所帮助!
【讨论】:
我找不到一个简单的技巧来做到这一点,所以我做了这个。首先在 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' 的查询字符串。
【讨论】: