Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4多域应用程序,为每个域i18n语言环境设置语言环境_Ruby On Rails_Ruby On Rails 4_Rails I18n - Fatal编程技术网

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

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

在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中可能吗?如果是这样,那么进行此设置的最佳方式是什么?

配置/应用程序中,您将有:

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文件中,以便于访问和编辑。所以这不是我想采取的方法。