【发布时间】:2010-08-16 11:19:50
【问题描述】:
我当前的应用程序有完整的英文翻译,但我不能确保其他语言也完全实现。
这会导致 translation_missing 警告,或者更确切地说是“de, install, steps, language”之类的字符串
如果没有(在这个例子中)德语翻译,有没有办法告诉 Rails 使用英文翻译?
【问题讨论】:
标签: ruby-on-rails internationalization
我当前的应用程序有完整的英文翻译,但我不能确保其他语言也完全实现。
这会导致 translation_missing 警告,或者更确切地说是“de, install, steps, language”之类的字符串
如果没有(在这个例子中)德语翻译,有没有办法告诉 Rails 使用英文翻译?
【问题讨论】:
标签: ruby-on-rails internationalization
我们在config/initializers/i18n.rb:
module I18n
# For MissingTranslationData, fall back to the default locale and then to the last key.
# For other exceptions, use the default_exception_handler.
def self.fallback_exception_handler(exception, locale, key, options)
options ||= {}
if !Rails.env.development? && exception.is_a?(MissingTranslationData)
if locale == self.default_locale
send(:normalize_translation_keys, locale, key, options[:scope]).last.to_s
else
self.t(key, options.merge(:locale => self.default_locale))
end
else
send :default_exception_handler, exception, locale, key, options
end
end
end
I18n.exception_handler = :fallback_exception_handler
请注意,根据设计,它不会退回到开发中(因此您会注意到缺少翻译)。
另外,这是一个 Rails 2 应用程序。我相信 Rails 3 中的回退异常处理有所改变。
【讨论】:
@tsdbrown 是个好建议。我的比较简单一些。例如,当您创建德语资源文件时,一种处理方法是从您的英语文件开始,然后将其传递给您的翻译人员。他们不翻译的东西仍然存在,只是用英语。那你根本就没有这个问题。使用此方法的另一个优点是,您可以确保在要完全翻译文件时,不必进行大量搜索和比较来添加缺失的字符串。
【讨论】:
我同意忍者猫的观点。 Henrik 的解决方案看起来很有希望 +1!
我发现用 +++ 之类的标记标记那些新缺失的翻译(在“de”文件中显示为英语)很有用,以便翻译人员可以轻松找到它们。
这里有一个额外的提示:
您可以在开发模式下覆盖 I18N 后端中的查找方法,以使其打印出 Rails 尝试在 I18N 后端中查找的键 - 这样您就可以在开发模式中有效地仔细检查 I18N您在代码中某处放置的密钥实际上是在您认为它们应该位于的位置的后端中查找的......(我已经看到了很多翻译字符串在 L10N 文件中的情况,但密钥不正确 -这种方法有助于解决这个问题)。
http://unixgods.org/~tilo/Rails/where_is_Rails_trying_to_lookup_L10N_strings.html
另见:
【讨论】:
已经是这样了!
Rails 只会在开发时输出“Translation missing”。
在生产模式下,Rails 将完全按照您的要求执行:从config/application.rb 中指定的默认语言环境回退到翻译。
【讨论】:
【讨论】:
有一种相当简单的方法可以做到这一点:只需将 I18n gem 配置为使用后备后端:https://github.com/svenfuchs/i18n/wiki/Fallbacks
【讨论】: