Rails 4 engine to translate routes using locale files and subdomains.
Ruby HTML JavaScript CSS
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
app/helpers
bin
lib
spec
.gitignore
.rspec
.ruby-version
CHANGELOG.md
Gemfile
Gemfile.lock
MIT-LICENSE
README.md
Rakefile
route_localize.gemspec

README.md

Route Localize

Rails engine to translate routes using locale files and subdomains.

Only works with Rails 4.0. Check out route_translator for Rails 4.2 and Rails 5 compatibility.

Install

In your Rails application's Gemfile add:

# Rails 4.0 engine to translate the routes
gem "route_localize"

Install the gem by running:

$ bundle

Scopes

Route Localize adds two scopes you can use in your routes:

  • localize: if your locale is the first parameter in the path. For example http://example.com/en/foo.
  • localize_subdomain: if your locale is your subdomain. For example http://en.example.com/foo.

Usage

In your config/routes.rb, add one of the scopes around your routes. For example:

scope localize: [:en, :fr] do
  get 'trees/new', to: 'trees#new'
end
root 'pages#index'

Then, create a config/locales/routes.yml with translations for each part of your routes under the routes key. For example:

fr:
  routes:
    trees: arbres
    new: nouveau

With this example you would have the following routes defined:

        Prefix Verb URI Pattern               Controller#Action
  trees_new_en GET /trees/new(.:format)      trees#new {:subdomain=>:en}
  trees_new_fr GET /arbres/nouveau(.:format) trees#new {:subdomain=>:fr}

You also get the trees_new_path and trees_new_url helpers that will call trees_new_en or trees_new_fr depending on the current locale.

Language switcher

If you want to be able to switch to the current page in another language add the following inside your app/helpers/application_helper.rb:

module ApplicationHelper
  include RouteLocalizeHelper
end

You can then use the locale_switch_url or locale_switch_subdomain_url helpers in your views like so:

<%= link_to "Version française", locale_switch_url("fr") %>
<%= link_to "English version", locale_switch_url("en") %>

Change the parameters in your switcher

If some of your params are different depending on the language, you can override the switcher's params by creating a route_localize_options method that takes the locale as a parameter.

For example if you would like to switch from http://en.example.org/products/keyboard to http://fr.example.org/produits/clavier, where keyboard and clavier are the :id parameter in your routes.

In this case you might already have something like this in controller:

class ProductsController < ApplicationController
  def show
    if I18n.locale == :fr
      @tree = Product.find_by_name_fr(params[:id])
    else
      @tree = Product.find_by_name_en(params[:id])
    end
  end
end

In this case you would need to add the route_localize_path_options method that returns a hash of params to change depending on the locale. Here, :id needs to be different because we are looking at two different database fields.

  helper_method :route_localize_path_options
  def route_localize_path_options(locale)
    {
      id: (locale == "fr" ? @tree.name_fr : @tree.name_en)
    }
  end

Translate a single path

Because Rails' url_for cannot find the translation url automatically, prefer to use the _path and _url helpers instead.

If you can't, one way around is to use RouteLocalize.translate_path.

For example :

RouteLocalize.translate_path(url_for(controller: 'trees', action: 'index'),
                             I18n.locale)

If you are using subdomains you should add the by_subdomain: true option to translate_path.

Development

You may help by submitting issues, creating pull requests, talking about the gem or by saying thanks.

Other gems to translate Rails routes

The following gems could also be a good match for your project:

Route Localize is different from these solutions because it:

  • can add a constraint to the subdomain instead of relying on the locale beeing in the url (en/… fr/)
  • plays well with gems that introduce extra locales, routes you don't want to translate, or reload routes before i18n is loaded (activeadmin for example)
  • includes a language switcher helper that returns the correct url in every other language

License

By Sunny Ripert, Licensed under the MIT.