Ho appena realizzato che il modo Rails consigliato per impostare locale nel controllorePerché le impostazioni locali in Rails agiscono come globali (quando si utilizza Thin)?
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
imposta il locale a livello globale. Il codice sopra funziona, ma mi chiedo se il valore predefinito sia default_locale
se è necessario digitarlo in modo esplicito?
Quello che mi aspetto è quello di avere un locale per richiesta (come abbiamo sessione per ogni richiesta) e di fare qualcosa di simile:
def set_locale
locale = params[:locale] if params[:locale]
end
E avendo I18n.default_locale
utilizzato di default altrimenti. Ciò corrisponde idealmente il locale opzionale nel percorso:
# config/routes.rb
scope "(:locale)", :locale => /en|nl/ do
resources :books
end
Per ora se per qualche motivo mi salta impostazioni locali in qualche azione che utilizza l'impostazione internazionale impostato nella precedente richiesta che potrebbe provenire da un altro utente!
E non c'è una potenziale condizione di competizione in quanto una richiesta può cambiare il I18n.locale
globale mentre un'altra richiesta (che ha impostato un'altra località prima) è nel mezzo del rendering?
UPDATE: Alcuni dettagli ho trovato per ora, dall'aria documentstion I18n:
Imposta locale corrente pseudo-globalmente, cioè nella hash Thread.current def locale = (locale)
Ora voglio capire se ogni richiesta è una discussione separata.
UPDATE 2: vedi la mia risposta per la spiegazione.
Sto avendo lo stesso identico problema, ma sto usando Unicorn! Qualche idea su come risolvere questo? grazie –
Penso che quando dici "I18n.set_locale", in realtà intendi "I18n.locale =" giusto? http://www.rubydoc.info/github/svenfuchs/i18n/I18n/Config:locale= – lulalala
Hai ragione, grazie per la correzione. – khustochka