rails:如何基于子域覆盖覆盖区域设置?

Pie*_*rre 4 ruby-on-rails internationalization ruby-on-rails-3 rails-i18n

我已经使用标准rails机制对应用程序进行了国际化和本地化。一切都存储在en,fr,de.yml文件中。

我的应用程序是基于子域的多租户。

我想允许我的用户覆盖应用程序中的某些翻译(例如,将“ Employee”更改为“ Associate”,因为它与他们自己的术语相匹配)。

我曾尝试根据每个请求更改yml文件的加载路径,但无济于事。

知道如何针对每个请求先在用户特定的yaml文件中查找,然后在未覆盖翻译的情况下回到默认的yaml文件吗?

Mih*_*van 6

假设您将子域存储在控制器过滤器的实例变量中,则可以覆盖翻译助手以首先使用子域特定的范围进行查找,然后回退到指定的范围或默认范围。像这样:

module ApplicationHelper

  def t(key, original_options = {})
    options = original_options.dup
    site_translation_scope = ['subdomain_overrides', @subdomain.name]
    scope =
      case options[:scope]
      when nil
        site_translation_scope
      when Array
        options[:scope] = site_translation_scope + options[:scope]
      when String
        [site_translation_scope, options[:scope]].join(".")
      end
    translate(key, options.merge(:scope => scope, :raise => true))
  rescue I18n::MissingTranslationData
    translate(key, original_options)
  end

end
Run Code Online (Sandbox Code Playgroud)

然后添加您的特定于子域​​的替代,如下所示:

en:
  customer: Customer
  subdomain_overrides:
    subdomain_1:
      customer: Buyer
Run Code Online (Sandbox Code Playgroud)