我使用标准的 Rails 机制对我的应用程序进行了国际化和本地化。一切都存储在 en、fr、de.yml 文件中。
我的应用程序是基于子域的多租户。
我想让我的用户覆盖应用程序中的某些翻译(例如,将“员工”更改为“关联”,因为它与他们自己的术语相匹配)。
我试图根据每个请求更改我的 yml 文件的加载路径,但无济于事。
任何想法,对于每个请求,我如何首先在我的用户特定的 yaml 文件中查找,如果翻译没有被覆盖,则回退到默认的 yaml 文件?
我使用标准的 Rails 机制对我的应用程序进行了国际化和本地化。一切都存储在 en、fr、de.yml 文件中。
我的应用程序是基于子域的多租户。
我想让我的用户覆盖应用程序中的某些翻译(例如,将“员工”更改为“关联”,因为它与他们自己的术语相匹配)。
我试图根据每个请求更改我的 yml 文件的加载路径,但无济于事。
任何想法,对于每个请求,我如何首先在我的用户特定的 yaml 文件中查找,如果翻译没有被覆盖,则回退到默认的 yaml 文件?
假设您将子域存储在控制器过滤器的实例变量中,您可以覆盖翻译助手以首先使用特定于子域的范围进行查找,然后回退到指定或默认范围。像这样的东西:
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
如果您想允许租户使用特定语言但回退到默认语言,我编写了一个微型库来完成工作:
https://github.com/ElMassimo/i18n_multitenant
它负责配置I18n
回退到基本语言环境,允许您使用租户特定的翻译(如果可用)。它旨在与静态.yml
文件的默认后端一起使用,但它也应与其他I18n
后端一起使用。
我最近创建I18n_global_scope
了完全符合您描述的 gem,请查看源代码https://github.com/mobilityhouse/i18n_global_scope并让我知道您的反馈。