Перенаправление на ту же страницу в новом домене после изменения локали в 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 имеет подход, использующий изображения, загруженные из другого домена.