-
Notifications
You must be signed in to change notification settings - Fork 2
Locale Handling
If you want to translate your pages into another language, generate a new translation migration:
# translate your pages into french
rails g qbrick:translations:add frOr
# translate your pages into swiss german
rails g qbrick:translations:add de-CHThis creates a new migration file inside db/migrate of your app. Run the migration as you normally do:
rake db:migrateFinally, add the new translation locale to your available_locales inside your apps application.rb:
config.available_locales = [:en, :fr]Or
config.available_locales = [:en, 'de-CH']Add scope around routes:
scope "(:locale)", locale: /de|en|fr/ do
root 'qbrick/pages#show'
endSet the locale in the ApplicationController in a before_action and set default url options:
before_action :set_locale
def set_locale
if I18n.locale_available? params[:locale]
I18n.locale = params[:locale]
else
I18n.locale = I18n.default_locale
end
end
def default_url_options(options = {})
{ locale: I18n.locale }
endAdd method to ApplicationHelper which redirects to homepage when current page is not translated. Make sure to have the homepage translated in every available language.
def localized_url(url, target_locale)
page = Qbrick::Page.find_by_url("#{I18n.locale}/#{url}")
I18n.with_locale target_locale do
translated_url = page.try :url
if translated_url.present?
"/#{translated_url}"
else
root_path(locale: target_locale)
end
end
end
def language_link(url, locale)
localized_url(params[:url], locale)
endAdd language switch to navigation:
SimpleNavigation::Configuration.run do |navigation|
I18n.available_locales.each do |locale|
primary.item locale, locale.to_s.upcase, language_link(params[:url], locale), highlights_on: Proc.new { I18n.locale == locale }
end
endMake sure to render only pages which are translated and published by using published and translated scope, so pages
without translation and which are not published will not be displayed in the navigation.
Here is an example of a possible navigation:
SimpleNavigation::Configuration.run do |navigation|
navigation.items do |primary|
primary.dom_class = 'right'
primary.selected_class = 'active'
Qbrick::Page.find_by(slug_de: 'meta-navigation').children.published.translated.each do |page|
primary.item page.id, page.title, page.link, class: 'contact icon'
end
primary.item '', 'Sprache', '#', class: 'language icon has-dropdown'do |language|
I18n.available_locales.each do |locale|
language.dom_class = 'dropdown'
language.item locale, language_text(locale), language_link(params[:url], locale), highlights_on: Proc.new { I18n.locale == locale }, class: "icon lang-#{locale}"
end
end
end
end