OK, udało mi się rozwiązać ten problem:
Nie ma możliwości zrobienia tego w Rails domyślnie (przynajmniej jeszcze nie). Zamiast używać przestrzeni nazw i wartości domyślnych, potrzebowałem zainstalować Sven Fuchs' routing filter.
Po zainstalowaniu wtyczki, dodałem następujący plik do mojego lib katalogu:
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
Dodałem tę linię do routes.rb:
map.filter 'locale'
To w zasadzie wypełnia przed i po hakowaniu, generowanym przez wtyczkę, owijającym routing szyn.
Po rozpoznaniu adresu URL i wywołaniu przez Railsy cokolwiek z nim, wywoływana jest metoda around_recognize. Spowoduje to wyodrębnienie dwuliterowego kodu reprezentującego ustawienia narodowe i przekazanie go w parametrach, domyślnie "en", jeśli nie określono żadnych ustawień narodowych.
Podobnie, po wygenerowaniu adresu URL parametr ustawień narodowych zostanie przesunięty w adres URL po lewej stronie.
To daje mi następujące adresy URL i mapowania:
/ => :locale => 'en'
/en => :locale => 'en'
/fr => :locale => 'fr'
Wszystkie istniejące pomocnicy URL działa tak jak poprzednio, z tą tylko różnicą, że o ile nie zostanie określone ustawienia narodowe, jest zachowana:
home_path =>/
home_path(:locale => 'en') =>/
home_path(:locale => 'fr') => /fr
W przykładzie tylko odnośnik 1 kontroler, ale biorę go chcesz utworzyć tę trasę dla każdego kontroler? –