I18n с friendly-id и globalize3 - избегайте дублирования контента (SEO)
В классическом многоязычном веб-сайте rails 4 я хочу избежать проблемы дублированного контента.
Я использовал friendly-id и globalize3, чтобы сделать сайт многоязычным.
Вот моя конфигурация:
классическая модель страницы:
extend FriendlyId
friendly_id :title, use: [:slugged, :history]
translates :title, :content, :slug
конфигурация первых маршрутов:
scope ":locale", /#{I18n.available_locales.join("|")}/ do
my_routes
end
#rails cast solution
match '*path', to: redirect("/#{I18n.default_locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }, via: :all
match '', to: redirect("/#{I18n.default_locale}"), via: :all
Конфигурация приложения-контроллера первого приложения:
before_action :set_locale
def default_url_options(options = {})
{locale: I18n.locale}
end
private
def set_locale
I18n.locale = params[:locale] if params[:locale].present?
end
Поскольку я хочу, чтобы пользователи получали доступ к сайту без / the-default-locale в конце URL-адреса, я изменяю конфигурацию следующим образом:
Конфигурация маршрутов:
#Here I'm trying to avoid /en/content and /content to avoid duplication
match "/#{I18n.default_locale}/*path", to: redirect("/%{path}"), via: :all
scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
my_routes
end
#removed the rails cast fallback to default locale
Конфигурация контроллера приложения:
before_action :set_locale
def default_url_options(options = {})
{ :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) }
end
private
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
ссылки для переключения между языками:
#here the French language is the default locale
<%= link_to_unless_current t("English"), locale: "en" %>
<%= link_to_unless_current t("French"), locale: nil %>
Вопросы:
1- С понятными идентификаторами и переведенным слагом вы можете перейти на mywebsite.com/mon_contenu и mywebsite/en/my_content. Но если вы уже находитесь на mywebsite.com/mon_contenu и нажимаете на переключатель на английском языке, вы попадете на mywebsite.com/en/mon_contenu с английским контентом, но URL-адрес не переключается на английский слаг.
Это считается дублирующим контентом? И если да, как я могу избежать этого?
2. С globalize, если контент не переведен, он будет отображать контент локали по умолчанию. Таким образом, mywebsite.com/mon_contenu и mywebsite.com/en/my_content могут отображать одно и то же содержимое на одном языке, если перевод не выполнен.
Опять же это рассматривается как дублирование?
Варианты рассматриваются
Использование robot.txt для отключения некоторых маршрутов, например, для индексации только локали по умолчанию?
Использование канонического тега, но я не знаю, как легко настроить его в макете
Как вы справляетесь с такими ситуациями?
Любая помощь / идея / комментарий / совет всегда приветствуется!
Как всегда, спасибо за вашу помощь.
1 ответ
Несколько месяцев спустя я все еще пытаюсь выяснить лучшие варианты.
Вот решение, которое я использую для вопроса 1:
Я установил это в контроллерах (решение от railscasts о friendly_id)
def show
if request.path != page_path(@page)
redirect_to @page, status: :moved_permanently
end
end
Благодаря этому нет причин для нескольких URL-адресов, указывающих на один и тот же контент. Вместо этого пользователь будет правильно перенаправлен на правильный URL. И история слизней все еще полезна.
Я буду обновлять этот пост, если я что-то понял для второго пункта! На самом деле я думаю о чем-то, чтобы проверить, существует ли перевод, и если нет, перенаправить на локаль по умолчанию с уведомлением.