Skip to content
A routing-filter additional filter that add locale unless XML or JSON, or root_url with default locale
Find file
Latest commit d66c967 Apr 7, 2014 @ZenCocoon Merge pull request #1 from ZenCocoon/exclude

Routing Filter, Locale Unless API build status

Deprecated with Rails 4+

Since Rails 4+, the router changed and there's more flexible way to do this:

In your congfig/routes.rb:

  • put all in the locale scope (except the root)
  • add route for locale's only path
scope "(:locale)", locale: /([a-zA-Z]{2}[-_])?[a-zA-Z]{2}/ do

get '/en', to: redirect('/')
get '/:locale' => 'home#index', locale: /([a-zA-Z]{2}[-_])?[a-zA-Z]{2}/
root to: 'home#index'

In your app/application_controller.rb

  • Set the locale from the params
  • Add the locale as default URL option
before_filter :set_locale

def default_url_options(options={})
  formats = %w( xml json )
  { locale: formats.include?(params[:format].to_s) ? nil : I18n.locale }


def set_locale
  I18n.locale = params[:locale] || I18n.default_locale

For Rails 3.2 and under

RoutingFilterLocaleUnlessAPI is a extension filter to Sven Fuchs’s routing-filter

RoutingFilterLocaleUnlessAPI filter extracts segments matching /:locale from the beginning of the recognized path and exposes the locale parameter as params[:locale]. When a path is generated the filter adds the segments to the path accordingly if the locale parameter is passed to the url helper.

It will not add the locale parameter as a url fragment if:

  • the format is XML or JSON (or any defined API format)
  • with the root url and default locale


The RDoc provides additional information for contributors and/or extenders.

All of the documentation is open source and a work in progress. If you find it lacking or confusing, you can help improve it by submitting requests and patches to the routing_filter_locale_unless_api issue tracker.


Tested with Ruby 1.8.7, 1.9.2, 1.9.3, Ruby-head, REE and JRuby

actionpack >= 3.0.9
i18n >= 0.5.0
routing-filter >= 0.2.3


in your Gemfile

gem 'routing_filter_locale_unless_api'

then in config/routes.rb

Rails.application.routes.draw do
  filter :locale_unless_api


incoming url: /fr/products
filtered url: /products
params: params[:locale] = 'fr'

products_path(:locale => 'fr')
generated_path: /fr/products

products_path(:locale => 'fr', :format => 'xml')
generated_path: /products.xml

root_path(:locale => 'en')
generated_path: /

root_path(:locale => 'fr')
generated_path: /fr

More example visible in the tests cases


You can customize the API formats with

Rails.application.routes.draw do
  filter :locale_unless_api, :api_formats => %w( xml json xls )

Also see


MIT License. Copyright 2011 Sébastien Grosjean, sponsored by BookingSync, Vacation Rental's Booking Calendar Software

Something went wrong with that request. Please try again.