Ich habe gerade festgestellt, dass die empfohlene Rails Weg, um locale in Ihrem Controller festlegen
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
setzt das Gebietsschema global. Der obige Code funktioniert, aber ich frage mich, ob default_locale
wirklich standardmäßig, wenn man es explizit eingeben muss?
Was ich erwarten würde, ist ein Gebietsschema pro Anfrage (wie wir Sitzung pro Anfrage haben) und etwas wie zu tun:
def set_locale
locale = params[:locale] if params[:locale]
end
Und mit I18n.default_locale
sonst standardmäßig verwendet. Dies würde idealerweise mit dem optionalen Gebietsschema in path übereinstimmen:
# config/routes.rb
scope "(:locale)", :locale => /en|nl/ do
resources :books
end
Wenn ich jetzt aus irgendeinem Grund die Gebietsschemaeinstellung in einer Aktion überspringe, wird das Gebietsschema der vorherigen Anfrage verwendet, die von einem anderen Benutzer stammen könnte!
Und besteht nicht die Gefahr von Wettlaufsituationen, da eine Anfrage die globalen I18n.locale
während eine andere Anfrage (die zuvor ein anderes Gebietsschema festgelegt hat) mitten im Rendering ist?
UPDATE: Einige Details, die ich gefunden habe, aus der I18n-Dokumentation:
Setzt das aktuelle Gebietsschema pseudo-global, d.h. im Thread.current-Hash def locale=(Gebietsschema)
Jetzt möchte ich wissen, ob jede Anfrage ein eigener Thread ist.
UPDATE 2: Siehe meine Antwort zur Erklärung.