在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中使用?如果是这样的话,最好的方法是什么呢?
答案 0 :(得分:1)
请尝试使用i18n-active_record
。locales
我们可以将其存储在database
。
在这个gem中他们使用的translation
模型没有任何关系,在您的情况下,您可以创建relation
和domain
之间的关系,然后您可以使用{{1}存储所有区域设置基于获取区域设置时,您可以覆盖默认的gem方法。
==>您的密钥应包含使用域名以查找域名,或者您可以使用其他方式获取域名,例如domain
或thread
,您可以保存您的价值。
#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]
这将只加载所需的文件,而应该用后面的数据覆盖任何重复的密钥,但我还没有测试过这一点。