Ruby on rails 轨道i18n:我可以关掉吗;翻译缺失“;错误?

Ruby on rails 轨道i18n:我可以关掉吗;翻译缺失“;错误?,ruby-on-rails,internationalization,Ruby On Rails,Internationalization,我有一个多租户应用程序,我正在尝试使用i18ngem,让我们的每个客户根据自己的喜好定制系统,更改不同页面上的文本,定制电子邮件,等等。诚然,我并没有像预期的那样使用i18n,因为我实际上并没有翻译不同的“语言”,所有的东西都是英语的,但是每个客户都有不同的英语,如果这有意义的话 尽管如此,我还是在i18ngem中遇到了一个我认为非常糟糕的设计决策:如果翻译不存在,而不是简单地不进行翻译并打印出它通常会做的任何事情,那么它会引发一个错误。比如说, <%= distance_of_time_

我有一个多租户应用程序,我正在尝试使用i18ngem,让我们的每个客户根据自己的喜好定制系统,更改不同页面上的文本,定制电子邮件,等等。诚然,我并没有像预期的那样使用i18n,因为我实际上并没有翻译不同的“语言”,所有的东西都是英语的,但是每个客户都有不同的英语,如果这有意义的话

尽管如此,我还是在i18ngem中遇到了一个我认为非常糟糕的设计决策:如果翻译不存在,而不是简单地不进行翻译并打印出它通常会做的任何事情,那么它会引发一个错误。比如说,

<%= distance_of_time_in_words_to_now @press_release.submitted_at %>
我是说,来吧!我甚至不想把它翻译出来

我知道发生这种情况的原因是因为我没有加载默认的翻译,但我使用ActiveRecord作为后端,我希望保持它干净。“解决方案”是将所有yaml翻译文件导入我的数据库翻译存储,但这似乎不是一个好主意。如果我将来升级rails呢?我将不得不担心保持所有这些翻译的同步

同样,我无法理解为什么这是默认行为。什么时候会有人希望显示那个时髦的错误消息,而不是只使用默认的“3天前”


无论如何,我的问题是,有没有一种方法可以让它自动关闭翻译,并在翻译不存在的情况下使用未翻译的消息?谢谢

这似乎奏效了

require 'i18n' # without this, the gem will be loaded in the server but not in the console, for whatever reason

# store translations in the database's translations table
I18n.backend = I18n::Backend::ActiveRecord.new

# for translations that don't exist in the database, fallback to the Simple Backend which loads the default English Rails YAML files
I18nSimpleBackend = I18n::Backend::Simple.new
I18n.exception_handler = lambda do |exception, locale, key, options|
  case exception
  when I18n::MissingTranslationData
    I18nSimpleBackend.translate(:en, key, options || {})
  else
    raise exception
  end
end

如果您对使用默认异常处理程序处理其他异常感兴趣,那么这段来自Philip Brocoum的答案的修改代码应该会起到作用(Rails 3.2.2版本):


此代码将允许您仅捕获需要以不同方式处理的异常。

您将此代码放置在何处?可能位于
config/initializers/
I18n.backend=I18n::backend::ActiveRecord下的
.rb
文件中。新的
将导致Rails 4.2中的未初始化常量错误<代码>i18n_simple_后端。翻译(:en,key,options | |{})
导致错误
require 'i18n' # without this, the gem will be loaded in the server but not in the console, for whatever reason

# store translations in the database's translations table
I18n.backend = I18n::Backend::ActiveRecord.new

# for translations that don't exist in the database, fallback to the Simple Backend which loads the default English Rails YAML files
I18nSimpleBackend = I18n::Backend::Simple.new
I18n.exception_handler = lambda do |exception, locale, key, options|
  case exception
  when I18n::MissingTranslationData
    I18nSimpleBackend.translate(:en, key, options || {})
  else
    raise exception
  end
end
i18n_simple_backend = I18n::Backend::Simple.new
old_handler = I18n.exception_handler
I18n.exception_handler = lambda do |exception, locale, key, options|
  case exception
  when I18n::MissingTranslation
    i18n_simple_backend.translate(:en, key, options || {})
  else
    old_handler.call(exception, locale, key, options)
  end
end