OK、私はこの問題を解決することができました:
デフォルトでは、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
この行をroutes.rbに追加しました:
map.filter 'locale'
これは基本的に、レール ルーティングをラップする、プラグインによって生成された before および after フックを埋めます。
URL が認識されると、Rails がそれを処理する前に、 around_recognize メソッドが呼び出されます。これにより、ロケールを表す 2 文字のコードが抽出され、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