rails:如何覆盖基于子域的语言环境?

时间:2013-03-07 09:11:18

标签: ruby-on-rails ruby-on-rails-3 internationalization rails-i18n

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

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

我想允许我的用户覆盖应用程序中的某些翻译(例如,将“员工”更改为“关联”,因为它符合他们自己的术语)。

我试图在每个请求的基础上更改yml文件的加载路径,但无济于事。

我知道如何为每个请求首先在我的用户特定的yaml文件中查找,如果翻译未被覆盖,则回退到默认的yaml文件?

3 个答案:

答案 0 :(得分:5)

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

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

然后添加子域特定的覆盖,如下所示:

en:
  customer: Customer
  subdomain_overrides:
    subdomain_1:
      customer: Buyer

答案 1 :(得分:1)

我最近创建的I18n_global_scope gem完全符合您的描述,请查看源代码https://github.com/mobilityhouse/i18n_global_scope并告诉我您的反馈。

答案 2 :(得分:1)

如果您想允许租户使用特定语言但是回退到默认语言,我已经写了一个微library来完成工作:

https://github.com/ElMassimo/i18n_multitenant

它负责将I18n配置为回退到基本语言环境,允许您使用特定于租户的翻译(如果可用)。它旨在使用静态.yml文件的默认后端,但它也应该与其他I18n后端一起使用。