Перенаправление на ту же страницу в новом домене после изменения локали в Rails 3

Приложение с использованием Rails 3.2.8 с нижними драгоценными камнями

gem 'friendly_id', '~> 4.0'
gem 'route_translator'

В/config/initializers/i18n.rb

TLD_LOCALES = {
  "com"  => :en,
  "jobs" => :en,
  "net"  => :en,
  "in"   => :en,
  "de"   => :de,
  "ch"   => :de,
  "at"   => :de,
  "br"   => :pt,
  "ar"   => :es,
  "cl"   => :es,
  "mx"   => :es 
}

В/app/controllers/application_controller.rb используется фильтр перед установкой языка для каждого запроса:

before_filter :set_auto_locale
def set_auto_locale
  I18n.locale = TLD_LOCALES[request.host.split('.').last]
end

В routes.rb

localized do
  match "label_vacancies/:view_job"=>"job_seekers#view_job"
  get "label_aboutus", :to => "home#about_us", :as => "about_us"
end

В то время как пользователь запрашивает изменение языкового стандарта, ниже домены должны загружаться на основе запрошенного пользователем языка.

В инициализаторах

domain_based_on_locale = {
    :en => "xxxxx.com",
    :de => "xxxxx.de",
    :es => "xxxxx.mx",
    :pt => "xxxxx.com.br"   
}

В/app/controllers/application_controller.rb

def set_manual_locale
  if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym)
    cookies['locale'] = { :value => params[:locale], :expires => 1.year.from_now }
    I18n.locale = params[:locale].to_sym
  elsif cookies['locale'] && I18n.available_locales.include?(cookies['locale'].to_sym)
    I18n.locale = cookies['locale'].to_sym
  end
  if domain_based_on_locale[I18n.locale] != request.host
    redirect_to "#{request.protocol}#{domain_based_on_locale[I18n.locale]}#{request.fullpath}", :status => :moved_permanently 
  else
    redirect_to root_path
  end
end

В этом случае пользователь, изменяющий язык в URL-адресах, как показано ниже, имеет проблему перенаправления, поскольку на той же странице есть другой URL-адрес в соответствии с языком.

Aboutus:
http://xxxxxxx.com/about-us  # About us route in English
http://xxxxxxx.de/uber-uns      # About us route in German
http://xxxxxxx.mx/quienes-somos # About us route in Spanish

view Job:
http://xxxxxxx.com/jobs/rp-be-company-representante-de-ventas-22042015
http://xxxxxxx.de/ofertas-de-empleo/rp-be-company-representante-de-ventas-22042015

После изменения языкового языка вручную, как перенаправить на ту же страницу в новом домене. И возможно ли переносить текущую сессию в новый домен. Благодарим за помощь.

Ответы

Ответ 1

Вам нужно перевести каждый сегмент request.fullpath (за исключением последнего, который похож на ресурсный пул). Вы можете сделать это вручную, используя Rails 'I18n:

current_path = request.fullpath.split('/')
slug = current_path.pop
locale_path = current_path.map{|part| translate(part)}.join('/')
redirect_to "#{request.protocol}#{domain}#{locale_path}#{slug}"

Или есть драгоценные камни, которые обрабатывают перевод маршрута:

Что касается сеанса, он не может обмениваться куками между доменами. Если вы создаете субдомены локалей (например, de.xxxxx.com), вы можете делиться файлом cookie со всеми из них. Многие сайты делают это по пути, например. xxxxx.com/de/, что полностью устраняет проблему.

Поддержка полностью разных доменов требует, чтобы вы вручную переносили сеанс. Это можно сделать следующим образом:

  • Сгенерируйте токен переноса xxx123 и сохраните его на стороне сервера с помощью сеанса, который он подключил к
  • Перенаправление на new.domain/path?token=xxx123
  • Используйте токен, чтобы просмотреть сеанс пользователя и установить его в своем браузере.
  • Удалить токен, чтобы предотвратить атаки повтора.

Подумайте о процессе передачи данных - легко ввести проблемы безопасности, когда вы делаете такие вещи. Этот поток SO имеет подход, использующий изображения, загруженные из другого домена.