Как избежать добавления локали по умолчанию в сгенерированные URL? - PullRequest
15 голосов
/ 10 марта 2011

Если вы следуете I18N Rails Guide , все сгенерированные ссылки содержат параметр locale (localhost / en / about, localhost / fr / about). Это потому, что мы используем метод default_url_options, чтобы всегда добавлять параметр Locale:

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

Можно ли удалить параметр языкового стандарта из сгенерированного URL-адреса, если языковой стандарт неизвестен или задан по умолчанию?

Что мне нужно:

  • Неизвестный язык: mysite/about
  • Язык: en: mysite/about (а не localhost/en/about)
  • Local fr: mysite/fr/about

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

Я пробовал много вещей, как эта

def default_url_options(options={})
  if I18n.locale == :fr
    { :locale => I18n.locale }
  else
    { :locale => nil }
  end
end

Весь код:

ApplicationController.rb:

before_filter :set_locale
def set_locale
  I18n.locale = params[:locale]
end

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

routes.rb

scope "(:locale)", :locale => /en|fr/ do
  match 'about'   => 'static_pages#about',   :via => :get
  match 'contact' => 'static_pages#contact', :via => :get
  match '/' => 'search#index', :as => :search
end

root :to => 'search#index'

Ответы [ 4 ]

23 голосов
/ 22 марта 2012

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

Я хотел вообще не использовать локаль по умолчанию, то есть

  • mysite.com/en/page должно совпадать с
  • mysite.com/page

И все ссылки при просмотре из локали по умолчанию НЕ должны включать локаль, то есть mysite.com должен иметь ссылки, которые не включают в себя локаль по умолчанию (en).Вместо mysite.com ссылки на

  • mysite.com/en/page он должен ссылаться на
  • mysite.com/page

Я добился этого с помощью следующих правок default_url_options:

def default_url_options(options={})
  { :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) }
end

Вы должны определить config.i18n.default_locale в config / application.rb, чтобы это работало.Вы также можете назначить запасные варианты для неподдерживаемых локалей через config.i18n.fallbacks = [ :en ], где этот массив является упорядоченным по приоритету списком языков для отката.

8 голосов
/ 11 марта 2011

Хорошо, я понимаю намного лучше.Действительно, ты почти сделал это.

Вам просто нужен очень полезный оператор в Ruby: ||

Если существует первое значение, оно используется, в противном случае учитывается второй аргумент.

def set_locale
  I18n.locale = params[:locale] || :en
end
3 голосов
/ 05 мая 2014

Рельсы 4 + https://github.com/svenfuchs/routing-filter

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end

def default_url_options(options = {})
  (I18n.locale.to_sym.eql?(I18n.default_locale.to_sym) ? {} : {locale: I18n.locale}).merge options
end
0 голосов
/ 10 марта 2011

Я знаю, что это не совсем твой вопрос, но ...

Я предпочитаю другой способ интернационализации: Настройка локали из доменного имени

Пример: mysite.com/about, mysite.fr/about

Для меня это лучший способ, но вам нужно купить все домены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...