Bonjour,
J'essai de mettre en place un système de multilangue sur une application rails.
Pour la partie changement de locale et récupération du bon contenu, tout va bien. Là ou je bloque c'est la redirection.
Après quelques recherches sur google j'en suis arrivé à ceci:
#routes.rb
scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
root to: 'pages#index', as: "index"
get '/services' => 'pages#services', as: :services
end
match '/:locale/:path', :via => [:get], to: redirect("/#{I18n.locale}/%{path}/")
match '/:path',:via => [:get], to: redirect("/#{I18n.locale}/%{path}/"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.locale}/" }
match '/',:via => [:get], to: redirect("/#{I18n.locale}/")
#appication_controller.rb
before_action :set_locale
def set_locale
if params[:locale].present? && I18n.available_locales.include?(params[:locale].downcase.to_sym)
I18n.locale = params[:locale] #if params[:locale].present?
else
begin
country_code = request.location.country_code
if country_code
country_code = country_code.downcase.to_sym
if [:ca,:ht,:be,:fr,:mc,:ch,:bj,:bf,:bi,:cm,:cf,:td,:km,:cd,:dj,:ga,:gn,:mg,:ml,:ne,:rw,:sn,:sc,:tg].include?(country_code)
l = :fr
elsif [:br,:mz,:ao,:pt,:gw,:tl,:cq,:mo,:cv,:st].include?(country_code)
l = :pt
else
l = :en
end
else
l = I18n.default_locale # use default locale if cannot retrieve this info
end
rescue
l = I18n.default_locale
end
I18n.locale = l
end
end
Si je vais sur /en/ le contenu est bien en anglais, pareil pour /fr/ et /pt/. Par contre si je vais sur / :
De plus j'ai remarqué un autre problème. Les images (par exemple /logos/img.svg) sont affectées par cette redirection. Et donc plein de requetes sont effectuée sur/en/img/.
Pour ce qui est des images, je comprends d'où viens le problème. Pour la redirection, un peu moins.
Si quelqu'un peut m'éclaire là dessus, je dis pas non.
Merci de m'avoir lu.
Cordialement,
TD
C'était pas une question, juste une boutade sur Ror (trop abscons pour moi)
mais à mon avis il ne faut pas passer par le pays pour définir la langue (50% de Belges n'apprécient pas)
il faut examiner le paramètre Accept-Language dans la request
exemple: Accept-Language fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
et choisir dans l'ordre la langue qui mappe le mieux avec celles gérées par le site
Oh je vois ^^. Je ne voyais pas les choses comme ça, c'est une bonne idée, merci pour ton conseil :)