Allow locale to be set through the front-end

* Store the last used locale in the session
* Allow home page to be identified in helpers even when containing
  parameters
* Create initializer to explicitly set the available locales, the
  default and the load_path
This commit is contained in:
Fernando Seror
2015-08-03 23:39:42 -05:00
parent 1ffcd35ed5
commit a89d621d1d
5 changed files with 63 additions and 2 deletions

View File

@@ -4,7 +4,21 @@ class ApplicationController < ActionController::Base
self.responder = ApplicationResponder
respond_to :html
before_action :set_locale
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
private
def set_locale
if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym)
session[:locale] = params[:locale]
end
session[:locale] ||= I18n.default_locale
I18n.locale = session[:locale]
end
end

View File

@@ -10,10 +10,16 @@ module ApplicationHelper
end
def home_page?
request.fullpath == '/'
# Using path because fullpath yields false negatives since it contains
# parameters too
request.path == '/'
end
def header_css
home_page? ? '' : 'results'
end
def available_locales_to_switch
I18n.available_locales - [I18n.locale]
end
end

View File

@@ -4,6 +4,14 @@
<div class="small-12 column">
<div class="right">
<a href="#"><%= t("layouts.header.external_link_transparency") %></a> | <a href="#"><%= t("layouts.header.external_link_opendata") %></a>
|
<span id="locale-switcher">
[
<% available_locales_to_switch.each do |locale| %>
<%= link_to(locale, params.merge(locale: locale), id: "locale-link-#{locale}") %>
<% end %>
]
</span>
</div>
</div>
</div>
@@ -42,4 +50,4 @@
</div>
</div>
<% end %>
</header>
</header>

View File

@@ -0,0 +1,6 @@
I18n.available_locales = [:en, :es]
I18n.default_locale = :es
# Add the new directories to the locales load path
I18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]

View File

@@ -0,0 +1,27 @@
require 'rails_helper'
feature 'Localization' do
scenario 'Wrong locale' do
visit root_path(locale: :es)
visit root_path(locale: :klingon)
expect(page).to have_text('Estamos abriendo Madrid')
end
scenario 'Changing locale' do
visit root_path(locale: :es)
locale_switcher = find('#locale-switcher')
expect(page).to have_text('Estamos abriendo Madrid')
expect(locale_switcher).to have_text('en')
expect(locale_switcher).to_not have_text('es')
find('#locale-link-en').click
locale_switcher = find('#locale-switcher')
expect(page).to have_text('We are opening Madrid')
expect(locale_switcher).to have_text('es')
expect(locale_switcher).to_not have_text('en')
end
end