OK, je l'ai réussi à régler ce problème:
Il n'y a pas moyen de le faire dans Rails par défaut (au moins, pas encore). Au lieu d'utiliser les espaces de noms et les valeurs par défaut, j'avais besoin d'installer Sven Fuchs' routing filter.
Une fois le plugin installé, j'ai ajouté le fichier suivant dans mon répertoire 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
J'ai ajouté cette ligne à routes.rb:
map.filter 'locale'
Cela remplit essentiellement un avant et après le crochet, généré par le plugin, qui enveloppe le cheminement des rails.
Lorsqu'une URL est reconnue et avant que Rails ne puisse faire quoi que ce soit, la méthode around_recognize est appelée. Cela va extraire un code à deux lettres représentant les paramètres régionaux, et le transmettre dans les paramètres, par défaut à 'en' si aucun paramètre régional n'est spécifié.
De même, quand une URL est générée, le paramètre locale sera poussé dans l'URL sur le côté gauche.
Cela me donne les urls et les correspondances suivantes:
/ => :locale => 'en'
/en => :locale => 'en'
/fr => :locale => 'fr'
Tous les assistants d'URL existants fonctionnent comme avant, avec la seule différence étant que si les paramètres régionaux est spécifié, il est conservé:
home_path =>/
home_path(:locale => 'en') =>/
home_path(:locale => 'fr') => /fr
Dans votre exemple, vous faites référence à seulement 1 contrôleur, mais je suppose que vous voulez créer cet itinéraire pour chaque manette? –