Peringatan penghentian validasi Rails I18n

387

Saya baru saja memperbarui ke rails 4.0.2 dan saya mendapatkan peringatan ini:

[usang] I18n.enforce_available_locales akan default ke true di masa depan. Jika Anda benar-benar ingin melewati validasi lokal Anda, Anda dapat mengatur I18n.enforce_available_locales = false untuk menghindari pesan ini.

Apakah ada masalah keamanan dalam pengaturannya ke false?

Mauricio Moraes
sumber
Ternyata ini terjadi juga pada Rails 4.0.1aplikasi.
lucke84
2
Saya memiliki hal yang sama di Rails 3.2.16. Menurut jawaban Simone Carletti di bawah ini, ada di Rails 4 (> = 4.0.2) dan Rails 3.2 (> = 3.2.14).
Mark Berry

Jawaban:

615

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::Applicationtubuh

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_localekonfigurasi atau pengaturan i18n lainnya, pastikan untuk melakukannya setelah pengaturan config.i18n.enforce_available_localespengaturan.
  • Jika Anda menggunakan permata pihak ketiga yang menyertakan fitur I18n, mengatur variabel melalui configobjek Aplikasi , mungkin tidak berpengaruh. Dalam hal ini, atur langsung ke I18nmenggunakan 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_localesbenar kita akan memunculkan pengecualian I18n :: InvalidLocale jika lokal yang disahkan tidak tersedia.

Standarnya diatur ke nilyang akan menampilkan kesalahan penghentian.

Jika diatur ke falsekami 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/localesfolder), jika tidak lokal akan default ke config.i18n.default_localekonfigurasi (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

  1. Jika Anda menetapkan config.i18n.default_localekonfigurasi atau menggunakan salah satu metode yang disebutkan sebelumnya ( default_locale=, locale=, translate, dll), pastikan untuk melakukannya setelah pengaturan config.i18n.enforce_available_localespengaturan. Jika tidak, peringatan penghentian akan terus muncul. (Terima kasih Fábio Batista ).

  2. 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.i18nitu application.rbberfungsi dengan baik.

    Jika di aplikasi Anda tidak, ada cara mudah untuk men-debug pelakunya. Temukan permata i18n di sistem Anda, buka i18n.rbfile 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)>'",
Simone Carletti
sumber
20
Jika Anda mengatur config.i18n.default_localekonfigurasi, pastikan Anda melakukannya setelah pengaturan pengaturan baru config.i18n.enforce_available_locales. Jika tidak, peringatan penghentian akan terus muncul.
Fábio Batista
3
Bagi saya, berfungsi hanya jika saya atur I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = truetidak berfungsi.
Pioz
1
@Pioz Mungkin disebabkan oleh permata yang bergantung pada aplikasi Anda. Saya memperbarui posting untuk menjelaskan alasannya.
Simone Carletti
@SimoneCarletti panggilan langsung I18n.config.enforce_available_localestidak boleh I18n.config.i18n.enforce_available_locales, saya sudah mengedit jawaban Anda. Terima kasih untuk memperbaikinya.
Fabio
1
Harus disebutkan bahwa seseorang harus mengatur I18n.config.available_locales = [:your_locale, :en]misalnya, jika tidak, Anda tidak akan dapat memulai server rel Anda.
Tamer Shlash
45

Hanya untuk kelengkapan, perhatikan bahwa Anda juga dapat menyingkirkan peringatan dengan mengatur I18n.enforce_available_localeske true(atau false) di config/application.rb:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end
mhartl
sumber
9
Bukankah lebih rapi untuk dilakukan config.i18n.enforce_available_locales = true?
Mischa
2
Saya menggunakan 3.2.16, saya menetapkan ke I18n.enforce_available_locales = false, tetapi saya masih memiliki pesan ...
CLod
3
@Mischa itu tidak berhasil untuk saya, jawaban di atas tidak.
Mike Atlas
1
@Mischa sayangnya tidak, harus melalui I18n.configini untuk memiliki efek
dolzenko
3
config.i18n.enforce_available_locales = truedi config / application.rb menghilangkan peringatan penghentian bagi saya di Rails 4.0.2, tetapi hanya jika saya meletakkannya di atas config.i18nbaris lain .
balexand
15

I18n.config.enforce_available_locales = true bekerja untuk saya di Rails 3.2.16 (saya taruh di config / application.rb)

SpeedyWizard
sumber
0

Jika Anda ingin peduli tentang lokal, tulis ke appilcation.rbfile.

config.i18n.enforce_available_locales = true

Anda dapat menulis false jika validasi lokal dan tidak peduli tentang itu.

Foram Thakral
sumber