Rails 4多域应用程序,为每个域i18n语言环境设置区域设置

时间:2014-04-22 06:23:33

标签: ruby-on-rails ruby-on-rails-4 rails-i18n

在Rails 4多域应用程序中,我需要为每个域提供一组4种语言的语言环境文件(总共3个域)。

域之间的一些翻译重叠,但其中一些是非常具体的,所以我在想一个有点像这样的结构:

config/locales/en.yml ..fr.yml ..de.yml ..it.yml  #is picked up by all domains
config/locales/domain1/en.yml ..fr.yml ..de.yml ..it.yml  #is picked up by domain 1
config/locales/domain2/en.yml ..fr.yml ..de.yml ..it.yml  #is picked up by domain 2
config/locales/domain3/en.yml ..fr.yml ..de.yml ..it.yml  #is picked up by domain 3

这是否可以在Rails 4中使用?如果是这样的话,最好的方法是什么呢?

2 个答案:

答案 0 :(得分:1)

请尝试使用i18n-active_recordlocales我们可以将其存储在database

在这个gem中他们使用的translation模型没有任何关系,在您的情况下,您可以创建relationdomain之间的关系,然后您可以使用{{1}存储所有区域设置基于获取区域设置时,您可以覆盖默认的gem方法。

==>您的密钥应包含使用域名以查找域名,或者您可以使用其他方式获取域名,例如domainthread,您可以保存您的价值。

#my guess key应该是login-label-test.com   domain = Domain.where(:name => namespace.split(" - ")。last).first

在宝石内部,他们发现env只是覆盖该方法,请尝试一下。

我不确定请尝试一次

首先将您的translation文件迁移到locale

db

我试图在gem中覆盖一个方法:

require 'yaml'

namespace :locale do
 desc "Copy translations from yml yo db. Non-overwriting."
  task :yml_to_db, [:environment, :locale,:domain] => :environment do |t, args|
    info = YAML::load(IO.read("#{Rails.root}/config/locales/#{args[:locale]}-#{args[:domain]}.yml"))
    domain = Domain.where(:name => args[:domain]).first
    info["#{args[:locale]}"].each do |key, value|
    translation = domain.translations.where(:key => key)
    domain.translations.create!(:key => key, :value => value, :locale => args[:locale]) if translation.blank?
   end
  end
 end

请尝试这样。

答案 1 :(得分:0)

config/application中你会有:

some_domain = Rails.root.basename.to_s # this will give us "myapp.com" if the app is in "/var/www/myapp.com"
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', some_domain, '*.{rb,yml}').to_s]

这将只加载所需的文件,而应该用后面的数据覆盖任何重复的密钥,但我还没有测试过这一点。