Ответ 1
ОК, мне удалось решить эту проблему:
В Rails по умолчанию (по крайней мере, пока нет) это невозможно. Вместо использования пространств имен и значений по умолчанию мне нужно было установить фильтр маршрутизации Sven Fuchs.
Как только плагин установлен, я добавил следующий файл в каталог lib:
require 'routing_filter/base'
module RoutingFilter
class Locale < Base
# remove the locale from the beginning of the path, pass the path
# to the given block and set it to the resulting params hash
def around_recognize(path, env, &block)
locale = nil
path.sub! %r(^/([a-zA-Z]{2})(?=/|$)) do locale = $1; '' end
returning yield do |params|
params[:locale] = locale || 'en'
end
end
def around_generate(*args, &block)
locale = args.extract_options!.delete(:locale) || 'en'
returning yield do |result|
if locale != 'en'
result.sub!(%r(^(http.?://[^/]*)?(.*))){ "#{$1}/#{locale}#{$2}" }
end
end
end
end
end
Я добавил эту строку в route.rb:
map.filter 'locale'
Это в основном заполняет до и после крючка, генерируемого плагином, который обматывает маршрутизацию рельсов.
Когда URL-адрес распознается и до того, как Rails получит что-нибудь с ним, вызывается метод around_recognize. Это извлечет двухбуквенный код, представляющий языковой стандарт, и передаст его в params, по умолчанию "en", если не указана локаль.
Аналогично, когда генерируется url, параметр locale будет помещен в URL с левой стороны.
Это дает мне следующие URL-адреса и отображения:
/ => :locale => 'en'
/en => :locale => 'en'
/fr => :locale => 'fr'
Все существующие помощники URL работают по-прежнему, с той лишь разницей, что, если локаль не указана, она сохраняется:
home_path => /
home_path(:locale => 'en') => /
home_path(:locale => 'fr') => /fr