Question

I currently have routing that requires the locale (i.e. /en, /fr, etc.). At some point I have used all of the statements below in routes.rb:

scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do

scope "/:locale", defaults: { :locale => "en" } do

scope "/:locale" do

I know that if I do the following if the route does not include the locale that it will point to the English version of the website. However it does not set the locale like I want once the page is displayed. If I go to the French version by clicking my locale logic the first link will display the French version of the page with /fr in the link. However if I click another link on the French page the locale goes back to English with the locale excluded from the link.

scope "(/:locale)", defaults: { :locale => "en" } do

Here is the code for my locale links in my application where a user can click on a flag image or text to change the locale:

<%= link_to_unless_current image_tag("english.jpg", alt: "#{t :english}"), locale: "en" %> <%= link_to_unless_current "#{t :english}", locale: "en" %>
<%= link_to_unless_current image_tag("french.jpg", alt: "#{t :french}"), locale: "fr" %> <%= link_to_unless_current "#{t :french}", locale: "fr" %>

What I would like to do is to prevent a 500 system error if by chance someone has an link saved before the website was localized. For example if they have http://mywebsite.com/video it would display the English version of the website and set the locale to "en".

Here is the code I have in application_controller.rb.

  before_filter :set_locale

  def default_url_options(options={}) 
    { :locale => I18n.locale }
  end

  private
    def set_locale
      I18n.locale = (params[:locale] if params[:locale].present?) || cookies[:locale] || 'en'
      cookies[:locale] = I18n.locale if cookies[:locale] != I18n.locale.to_s
    end

I'm not finding anything on this particular issue other than to use the routing-filter gem. I was using the gem but until there is a production version of the gem for Rails 4 I have no option but to figure this routing issue out.

Any help would be appreciated.

Was it helpful?

Solution

i find your question rather confusing... so my answer will refer to some parts of you code. maybe that gives you enough context to fix your problems.

  1. do not use 3 routes for locale

one route is enough, please read the guides for internationlization.

i think that you will have to go with the optional approach as you want to support legacy urls:

scope "(/:locale)" {}

  1. use the config.default_locale option

in the configuration you can configure fallbacks for localization.

  1. don't mix default_url_options and cookies

if you are using cookies to keep track of your locale, you can can skip the default_url_options, you will have to keep the unlocalized versions anyways for backward compatibility.

if you MUST have urls like domain.com/en/something do it the other way around. avoid using cookies, use the URL everywhere and redirect people coming in from a legacy url.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top