4

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

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

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

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

任何想法,对于每个请求,我如何首先在我的用户特定的 yaml 文件中查找,如果翻译没有被覆盖,则回退到默认的 yaml 文件?

4

3 回答 3

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

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

en:
  customer: Customer
  subdomain_overrides:
    subdomain_1:
      customer: Buyer
于 2013-05-14T18:24:10.657 回答
2

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

https://github.com/ElMassimo/i18n_multitenant

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

于 2017-01-26T14:49:57.570 回答
0

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

于 2014-08-21T06:49:31.640 回答