Ruby on rails Rails 4多域应用程序,为每个域i18n语言环境设置语言环境
在Rails 4多域应用程序中,我需要一组用于每个域的4种语言的语言环境文件(总共3个域) 有些翻译在域之间重叠,但有些翻译非常具体,因此我考虑的结构有点像这样:Ruby on rails Rails 4多域应用程序,为每个域i18n语言环境设置语言环境,ruby-on-rails,ruby-on-rails-4,rails-i18n,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 confi
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中可能吗?如果是这样,那么进行此设置的最佳方式是什么?在
配置/应用程序中,您将有:
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]
这将仅加载所需的文件,并应使用更晚的数据覆盖任何重复的密钥,但我尚未测试该位。请尝试使用i18n-active\u record
。因为所有区域设置
我们都可以将其存储在数据库中
在这个gem中,他们使用的是没有关系的翻译
模型,在您的情况下,您可以在关系
和域
之间创建关系,然后您可以存储所有基于域
的区域设置。在获取区域设置时,您可以覆盖默认的gem方法
==>您的密钥应该包含使用域名来查找域,或者您可以使用其他方式获取域名,如线程
或环境
您可以保存您的值
#我的猜测键应该是login-label-test.com
domain=domain.where(:name=>namespace.split(“-”).last)。first
在gem中,无论他们在哪里找到翻译
只要覆盖该方法,请尝试
我不确定,请像那样试一下
首先将locale
文件迁移到db
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
我尝试在gem中覆盖一种方法:
require 'active_record'
module I18n
module Backend
class ActiveRecord
class Translation < ::ActiveRecord::Base
belongs_to :domain
TRUTHY_CHAR = "\001"
FALSY_CHAR = "\002"
self.table_name = 'translations'
serialize :value
serialize :interpolations, Array
def lookup(keys, *separator)
# in your keys should contain use domain name for find the domain or you can use some other way to get the domain name like in thread or env you can save your value.
column_name = connection.quote_column_name('key')
keys = Array(keys).map! { |key| key.to_s }
unless separator.empty?
warn "[DEPRECATION] Giving a separator to Translation.lookup is deprecated. " <<
"You can change the internal separator by overwriting FLATTEN_SEPARATOR."
end
namespace = "#{keys.last}#{I18n::Backend::Flatten::FLATTEN_SEPARATOR}%"
# my guess key should be login-label-test.com
domain = Domain.where(:name => namespace.split("-").last).first
where("#{column_name} IN (?) OR #{column_name} LIKE ?", keys, namespace).where(:id => domain.id)
end
end
end
end
需要“活动记录”
模块I18n
模块后端
类活动记录
类转换<::ActiveRecord::Base
属于:域
TRUTHY_CHAR=“\001”
FALSY_CHAR=“\002”
self.table_name='translations'
序列化:值
序列化:插值、数组
def查找(键,*分隔符)
#在您的密钥中应该包含使用域名来查找域,或者您可以使用其他方式来获取域名,如在thread或env中,您可以保存您的值。
column\u name=connection.quote\u column\u name('key'))
keys=数组(keys).map!{| key | key.to_}
除非是空的?
警告“[DEPRECATION]不推荐为Translation.lookup提供分隔符。”命名空间.split(“-”).last。首先
其中((?)中的(#{column_name}或类似于(#{column_name}),键,命名空间)。其中(:id=>domain.id)
结束
结束
结束
结束
请这样尝试。Basename将只返回Rails应用程序名而不是域名。域名将通过请求返回。domain
但在初始化时,应用程序.rb中当然不可用。我需要采取不同的方法,由于域始终只有在发出请求时才可用。。。这是一个鸡蛋问题也请注意:这是一个多域应用程序,提供3个不同的域名。那么你有一个应用程序为3个域运行一次?您可能需要考虑部署到不同的路径,以便可以预先编译这样的事情。这就是我对这三个问题所做的:是的,这可能是一种方法,但我发现它太复杂了。我希望将我的翻译保存在.yml文件中,以便于访问和编辑。所以这不是我想采取的方法。