Penting : Pastikan aplikasi Anda tidak menggunakan I18n 0.6.8, ia memiliki bug yang mencegah konfigurasi diatur dengan benar .
Jawaban singkat
Untuk membungkam peringatan, edit file application.rb dan sertakan baris berikut di dalam Rails::Application
tubuh
config.i18n.enforce_available_locales = true
Nilai yang mungkin adalah:
- false : jika kamu
- ingin melewati validasi lokal
- tidak peduli dengan lokal
- benar : jika Anda
- ingin aplikasi memunculkan kesalahan jika lokal yang tidak valid diteruskan (atau)
- ingin default ke perilaku Rails baru (atau)
- peduli tentang validasi lokal
catatan:
- Perilaku default lama sesuai dengan
false
, bukan true
.
- Jika Anda mengatur
config.i18n.default_locale
konfigurasi atau pengaturan i18n lainnya, pastikan untuk melakukannya setelah pengaturan config.i18n.enforce_available_locales
pengaturan.
- Jika Anda menggunakan permata pihak ketiga yang menyertakan fitur I18n, mengatur variabel melalui
config
objek Aplikasi , mungkin tidak berpengaruh. Dalam hal ini, atur langsung ke I18n
menggunakan I18n.config.enforce_available_locales
.
Peringatan
Contoh
require File.expand_path('../boot', __FILE__)
# ...
module YouApplication
class Application < Rails::Application
# ...
config.i18n.enforce_available_locales = true
# or if one of your gem compete for pre-loading, use
I18n.config.enforce_available_locales = true
# ...
end
end
Jawaban panjang
Peringatan penghentian sekarang ditampilkan di Rails 4 (> = 4.0.2) dan Rails 3.2 (> = 3.2.14). Alasannya dijelaskan dalam komit ini .
Menegakkan lokal yang tersedia
Kapan I18n.config.enforce_available_locales
benar kita akan memunculkan pengecualian I18n :: InvalidLocale jika lokal yang disahkan tidak tersedia.
Standarnya diatur ke nil
yang akan menampilkan kesalahan penghentian.
Jika diatur ke false
kami akan melompati penegakan lokal yang tersedia sekaligus (perilaku lama).
Ini telah diterapkan dalam metode berikut:
- I18n.config.default_locale =
- I18n.config.locale =
- I18n.translate
- I18n.lokalisasi
- I18n.transliterate
Sebelum perubahan ini, jika Anda melewati lokal yang tidak didukung, Rails akan secara diam-diam beralih ke itu jika lokal itu valid (yaitu jika ada file lokal yang sesuai dalam /config/locales
folder), jika tidak lokal akan default ke config.i18n.default_locale
konfigurasi (yang default ke: en ).
Versi baru permata I18n, memaksa pengembang untuk menjadi sedikit lebih sadar akan manajemen lokal.
Di masa depan, perilaku akan berubah dan jika lokal tidak valid, aplikasi Rails akan memunculkan kesalahan.
Dalam persiapan perubahan semacam itu (yang berpotensi memecah beberapa aplikasi yang hingga hari ini mengandalkan default diam), peringatan tersebut memaksa Anda untuk secara eksplisit menyatakan validasi mana yang ingin Anda lakukan, selama periode transisi saat ini.
Untuk mengembalikan perilaku sebelumnya, cukup atur konfigurasi berikut ke false
config.i18n.enforce_available_locales = false
jika tidak, setel ke true agar cocok dengan standar Rails baru atau jika Anda ingin lebih kaku pada validasi domain dan hindari beralih ke default jika ada lokal yang tidak valid.
config.i18n.enforce_available_locales = true
Peringatan
Jika Anda menetapkan config.i18n.default_locale
konfigurasi atau menggunakan salah satu metode yang disebutkan sebelumnya ( default_locale=
, locale=
, translate
, dll), pastikan untuk melakukannya setelah pengaturan config.i18n.enforce_available_locales
pengaturan. Jika tidak, peringatan penghentian akan terus muncul. (Terima kasih Fábio Batista ).
Jika Anda menggunakan permata pihak ketiga yang menyertakan fitur I18n, pengaturan variabel melalui mungkin tidak berpengaruh. Faktanya, masalahnya sama seperti yang dijelaskan pada poin sebelumnya, hanya sedikit lebih sulit untuk di-debug.
Masalah ini adalah masalah yang diutamakan. Ketika Anda mengatur konfigurasi di aplikasi Rails Anda, nilainya tidak langsung ditetapkan ke permata I18n. Rails menyimpan setiap konfigurasi dalam objek internal, memuat dependensi (Railties dan permata pihak ketiga) dan kemudian melewati konfigurasi ke kelas target. Jika Anda menggunakan permata (atau plugin Rails) yang memanggil salah satu metode I18n sebelum konfigurasi ditugaskan ke I18n, maka Anda akan mendapatkan peringatan.
Dalam hal ini, Anda perlu melewati tumpukan Rails dan mengatur konfigurasi segera ke permata I18n dengan memanggil
I18n.config.enforce_available_locales = true
dari pada
config.i18n.enforce_available_locales = true
Masalahnya mudah dibuktikan. Cobalah untuk membuat aplikasi Rails kosong baru dan Anda akan melihat pengaturan config.i18n
itu application.rb
berfungsi dengan baik.
Jika di aplikasi Anda tidak, ada cara mudah untuk men-debug pelakunya. Temukan permata i18n di sistem Anda, buka i18n.rb
file dan edit metode enforce_available_locales!
untuk memasukkan pernyataan puts caller.inspect
.
Ini akan menyebabkan metode untuk mencetak stacktrace setiap kali dipanggil. Anda akan dapat menentukan permata mana yang memanggilnya dengan memeriksa stacktrace (dalam kasus saya itu Authlogic).
["/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/i18n-0.6.9/lib/i18n.rb:150:in `translate'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in `translate'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in `translate'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:in `validates_format_of_email_field_options'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in `block in included'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `class_eval'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `included'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `include'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `block in acts_as_authentic'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `each'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `acts_as_authentic'",
"/Users/weppos/Projects/application/app/models/user.rb:8:in `<class:User>'",
"/Users/weppos/Projects/application/app/models/user.rb:1:in `<top (required)>'",
Rails 4.0.1
aplikasi.