Rails язык постоянный? Локаль всегда перенаправляется на default_locale - PullRequest
1 голос
/ 22 февраля 2020

Я недавно начал работать с Rails и I18n.

Кажется, что в моем приложении, когда я отправляю запрос Http для перемещения из одной конечной точки в другую, выбранный параметр I18n не является постоянным.

Т.е.

Я попадаю на домашнюю страницу http://localhost: 4000

Я перенаправлен по умолчанию язык http://localhost: 4000 / ru

Я нажимаю кнопку «Español» для переключения языковых предпочтений

I получил на http://localhost: 4000 / ES

Текст на странице на испанском sh

(Так далеко ведет себя как ожидалось)

Я нажимаю кнопку, чтобы перейти на другую страницу приложения, т. е. "видео"

Меня перенаправили на http://localhost: 4000 / ru / video

Текст на странице написан на английском языке sh

Как видно, языковые предпочтения исчезли, и теперь меня перенаправили обратно к стандартному «en». Моя Rails версия 5.1. Вот мой route.rb

Rails.application.routes.draw do
  scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
    root 'pages#home'
    get 'accommodation' => 'pages#accommodation'
    get 'afterparty' => 'pages#afterparty'
    post 'afterparty' => 'pages#create_afterparty'
    get 'afterparty/index' => 'pages#afterparty_index'
    get 'registry' => 'pages#registry'
    get 'rsvp' => 'pages#rsvp'
    post 'rsvp' => 'pages#create'
    get 'rsvp/index' => 'pages#rsvp_index'
    get 'video' => 'pages#video'
  end
  match '*path', to: redirect("/#{I18n.locale}/%{path}"), :via => [:get, :post]
  match '', to: redirect("/#{I18n.locale}"), :via => [:get, :post]
end

Вот мой application_controller.rb:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :set_locale

  private

  def set_locale
    I18n.locale = params[:locale] if params[:locale].present?
  end

  def default_url_options(options = {})
    {locale: I18n.locale}
  end

end

Вот мой locale.rb, определенный в каталоге инициализаторов:

# Where the I18n library should search for translation files
I18n.load_path += Dir[Rails.root.join('lib', 'locale', '*.{rb,yml}')]

# Permitted locales available for the application
I18n.available_locales = [:en, :es]

# Set default locale to something other than :en
# I18n.default_locale = :es

Вот выдержка из приложения. html, которая показывает назначение параметра локали:

            <%= t('.language') %>
            <%= link_to_unless_current "English", locale: "en" %> |
            <%= link_to_unless_current "Español", locale: "es" %>

Вот выдержка из приложения. html, который иллюстрирует 2 из тегов привязки, которые перенаправляют вас на разные страницы:

            <a class="names" href='/'><h4>Christina & Alex</h4></a>
            <a class="section" href='/video'>VIDEO</a>

Я попытался несколько вещей безуспешно. Пожалуйста, помогите уточнить, где я не прав. Спасибо.

1 Ответ

0 голосов
/ 10 марта 2020

Похоже, что ссылки и кнопки в вашем приложении не содержат в себе локали из default_url_options.

Например, ваша ссылка:

<a class="section" href='/video'>VIDEO</a>

Не использует локаль param.

Если вы использовали помощников рельсов, то это будет:

<%= link_to 'VIDEO', video_path, class: 'section' %>

Поскольку помощники *_path и *_url объединят default_url_options и окончательный HTML будет выглядеть так:

<a class="section" href='/video?locale=es'>VIDEO</a>

Конечно, вы также можете добавить параметр locale самостоятельно.

...