bien, he logrado solucionar este problema:
no hay manera de hacer esto en Rails por defecto (al menos, no todavía). En lugar de usar espacios de nombres y valores predeterminados, necesitaba instalar Sven Fuchs' routing filter.
Una vez instalado el plugin, que añade el siguiente archivo a mi directorio 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
añadí esta línea para routes.rb:
map.filter 'locale'
Esto básicamente rellena un antes y after hook, generado por el complemento, que envuelve el enrutamiento de los rieles.
Cuando se reconoce una url y antes de que Rails haga algo con ella, se llama al método around_recognize. Esto extraerá un código de dos letras que representa la configuración regional, y lo pasará en los parámetros, por defecto a 'en' si no se especifica la configuración regional.
Del mismo modo, cuando se genera una url, el parámetro de configuración regional se insertará en la URL en el lado izquierdo.
Esto me da las siguientes direcciones y asignaciones:
/ => :locale => 'en'
/en => :locale => 'en'
/fr => :locale => 'fr'
Todos los ayudantes de URL existentes funcionan como antes, con la única diferencia de que a menos que se especifique la configuración regional, se conserva:
home_path =>/
home_path(:locale => 'en') =>/
home_path(:locale => 'fr') => /fr
En su ejemplo sólo de referencia 1 controlador, pero lo tomo desea crear esta ruta para cada ¿controlador? –