Multi-langue et redirect

Par TransientDev, il y a 9 ans


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

5 réponses

TransientDev, il y a 9 ans

Personne? :(

Huggy, il y a 9 ans

C'est du chinois ?

TransientDev, il y a 9 ans

@Huggy: Je ne suis pas sur de comprendre ta question

Huggy, il y a 9 ans

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

TransientDev, il y a 9 ans

Oh je vois ^^. Je ne voyais pas les choses comme ça, c'est une bonne idée, merci pour ton conseil :)