Skip to content

Instantly share code, notes, and snippets.

@Marahin
Created July 31, 2015 21:12
Show Gist options
  • Save Marahin/45e2d2a7e12459a1e411 to your computer and use it in GitHub Desktop.
Save Marahin/45e2d2a7e12459a1e411 to your computer and use it in GitHub Desktop.
I use a button to change the I18n.locale, which also sets the locale in session[:locale]. Everything works fine, every view is translated, flash messages as well, devise views, etc.
The problem I stepped upon, is that the Post model validation errors, after changing the locale with the button, are still sent in the old language (everything else, flash messages, devise views, and other views are properly translated). Refreshing the site doesn't fix it.
E.g.
Model validations:
validates_length_of :description, :minimum => 5, :maximum => 500, :too_long => I18n.t('posts.too_long'), :too_short => I18n.t('posts.too_short')
Reproducing the error:
post = Post.new(post_params)
post.user_id = current_user.id
if post.save
render :json => { :status => 0, :messages => ["OK"] }
else
render :json => { :status => 1, :messages => post.errors.messages[:description] }
end
If the post doesn't save, the error is rendered in the old language.
Locale fragments:
en.yml
posts:
too_short: "The message you're trying to send is too short."
too_long: "The message you're trying to send is too long."
pl.yml
posts:
too_short: "Wiadomość którą próbujesz wysłać jest za krótka."
too_long: "Wiadomość którą próbujesz wysłać jest za długa."
POST action which is being pointed by a button, to change the locale:
def change_locale
if session[:locale] == 'pl'
I18n.locale = :en
session[:locale] = 'en'
else
I18n.locale = :pl
session[:locale] = 'pl'
end
end
And the application_controller action that keeps track of the locale: (used with a before_action filter)
def set_locale
if session[:locale] == 'pl'
I18n.locale = :pl
elsif session[:locale] == 'en'
I18n.locale = :en
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment