Rails I18n doğrulama kullanımdan kaldırma uyarısı


387

Az önce 4.0.2 raylarına güncelledim ve şu uyarıyı alıyorum:

[kullanımdan kaldırıldı] I18n.enforce_available_locales gelecekte varsayılan olarak doğru olacaktır. Yerel ayarınızın doğrulanmasını gerçekten atlamak istiyorsanız, bu iletiden kaçınmak için I18n.enforce_available_locales = false olarak ayarlayabilirsiniz.

Yanlış seçeneğine ayarlamak için herhangi bir güvenlik sorunu var mı?


Görünüşe göre bu Rails 4.0.1uygulamalar için de geçerlidir.
lucke84

2
Aynısı Rails 3.2.16'da da var. Aşağıdaki Simone Carletti'nin cevabına göre, Rails 4 (> = 4.0.2) ve Rails 3.2 (> = 3.2.14).
Mark Berry

Yanıtlar:


615

Önemli : Uygulamanızın I18n 0.6.8 kullanmadığından emin olun , yapılandırmanın doğru şekilde ayarlanmasını engelleyen bir hata var .


Kısa cevap

Uyarıyı susturmak için application.rb dosyasını düzenleyin ve Rails::Applicationgövdeye aşağıdaki satırı ekleyin

config.i18n.enforce_available_locales = true

Olası değerler:

  • yanlış : eğer sen
    • yerel doğrulamayı atlamak istemek
    • yerliler umrumda değil
  • true : eğer sen
    • geçersiz bir yerel ayar iletilirse (veya) uygulamanın hata bildirmesini isteyin
    • varsayılan olarak yeni Rails davranışlarını (veya)
    • yerel ayarların doğrulanması

Not:

  • Eski varsayılan davranış karşılık gelir false, değil true.
  • Eğer ayarlıyorsanız config.i18n.default_localeyapılandırma ya da diğer i18n ayarlarını ayarladıktan sonra bunu yapmak için emin olun config.i18n.enforce_available_localesayarı.
  • I18n özelliklerini içeren üçüncü taraf mücevherleri kullanmanız durumunda, değişkeni Application confignesnesi aracılığıyla ayarlamanın bir etkisi olmayabilir. Bu durumda, doğrudan I18nkullanmaya ayarlayın I18n.config.enforce_available_locales.

    Uyarılar

Misal

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

Uzun cevap

Kullanımdan kaldırma uyarısı artık hem Ray 4'te (> = 4.0.2) hem de Ray 3.2'de (> = 3.2.14) görüntülenmektedir. Nedeni bu taahhütte açıklanmıştır .

Kullanılabilir yerel ayarları zorunlu kıl

Ne zaman I18n.config.enforce_available_localesdoğrudur geçirilen yerel kullanılamaz eğer bir I18n :: InvalidLocale istisna yükseltmek gerekir.

Varsayılan, nilkullanımdan kaldırılma hatasını görüntüleyecek şekilde ayarlanmıştır .

Olarak ayarlanırsa, falsekullanılabilir yerel ayarların uygulanmasını (eski davranış) atlayacağız.

Bu, aşağıdaki yöntemlerle uygulanmıştır:

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n.translate
  • I18n.localize
  • I18n.transliterate

Bu değişiklikten önce, desteklenmeyen bir yerel ayarı geçtiyseniz, yerel ayar geçerliyse (yani /config/localesklasörde karşılık gelen bir yerel ayar dosyası varsa) Rails sessizce bu konuma geçer , aksi takdirde yerel ayar varsayılan olarak config.i18n.default_localeyapılandırmaya (varsayılan olarak: en ).

I18n gem'in yeni versiyonu, geliştiricileri yerel yönetimden biraz daha bilinçli olmaya zorluyor.

Gelecekte, davranış değişecek ve bir yerel ayar geçersizse, Rails uygulaması bir hata oluşturacaktır.

Bu tür bir değişikliğin hazırlanmasında (bugüne kadar sessiz varsayılanlara dayanan birkaç uygulamayı potansiyel olarak kırabilir), uyarı, geçerli geçiş döneminde hangi doğrulamayı yapmak istediğinizi açıkça beyan etmeye zorlar.

Önceki davranışı geri yüklemek için aşağıdaki yapılandırmayı false

config.i18n.enforce_available_locales = false

aksi takdirde, yeni Rails varsayılanlarıyla eşleşecek şekilde veya alan adı doğrulamasında daha katı olmak ve geçersiz yerel ayar durumunda varsayılana geçmekten kaçınmak için true olarak ayarlayın.

config.i18n.enforce_available_locales = true

Uyarı

  1. Eğer ayarlıyorsanız config.i18n.default_localeyapılandırma veya yukarıda açıklanan yöntemlerden (herhangi birini kullanarak default_locale=, locale=, translate, vb), ayarladıktan sonra bunu yapmak için emin olun config.i18n.enforce_available_localesayarı. Aksi takdirde, kullanımdan kaldırma uyarısı açılır. (Teşekkürler Fábio Batista ).

  2. I18n özellikleri içeren üçüncü taraf değerli taşlar kullanıyorsanız, değişkenin ayarlanması etkili olmayabilir. Aslında, sorun önceki noktada anlatılanla aynıdır, hata ayıklamak biraz daha zordur.

    Bu konu bir öncelik meselesidir. Rails uygulamanızda yapılandırmayı ayarladığınızda, değer hemen I18n gemine atanmaz. Rails her yapılandırmayı bir iç nesnede saklar, bağımlılıkları yükler (Railties ve üçüncü taraf taşlar) ve ardından yapılandırmayı hedef sınıflara geçirir. Yapılandırma I18n'ye atanmadan önce I18n yöntemlerinden herhangi birini çağıran bir mücevher (veya Rails eklentisi) kullanırsanız, uyarıyı alırsınız.

    Bu durumda, Rails yığınını atlamanız ve yapılandırmayı hemen arayarak I18n gemine ayarlamanız gerekir.

    I18n.config.enforce_available_locales = true

    onun yerine

    config.i18n.enforce_available_locales = true

    Sorunu kanıtlamak kolaydır. Yeni bir boş Raylar uygulamasını oluşturmak için deneyin ve bu ayarı göreceksiniz config.i18niçinde application.rbçalışmalar cezası.

    Uygulamanızda değilse, suçlu hata ayıklamak için kolay bir yol var. Sisteminizde i18n gem'ini bulun, i18n.rbdosyayı açın ve enforce_available_locales!deyimi eklemek için yöntemi düzenleyin puts caller.inspect.

    Bu, yöntemin her çağrıldığında yığın izini yazdırmasına neden olur. Yığını takip ederek (benim durumumda Authlogic idi) inceleyerek hangi gemin çağırdığını belirleyebileceksiniz.

    ["/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)>'",
    

20
Eğer ayarlıyorsanız config.i18n.default_localeyapılandırma, bunu emin olun sonra yeni ayar config.i18n.enforce_available_localesayar. Aksi takdirde, kullanımdan kaldırma uyarısı patlamaya devam eder.
Fábio Batista

3
Benim için sadece ayarladığımda çalışır I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = trueçalışmıyor.
Pioz

1
@Pioz Uygulamanızın bağlı olduğu taşlar neden olabilir. Nedenini açıklamak için yayını güncelledim.
Simone Carletti

@SimoneCarletti direkt arama olmalıdır I18n.config.enforce_available_localesdeğil I18n.config.i18n.enforce_available_locales, ben cevap kaydetmiştiniz. Düzeltme için teşekkürler.
Fabio

1
Birinin I18n.config.available_locales = [:your_locale, :en]örneğin ayarlaması gerektiği belirtilmelidir , aksi takdirde raylar sunucunuzu başlatamazsınız.
Tamer Shlash

45

Sadece eksiksiz olmak için, aşağıdakilerden I18n.enforce_available_localesbirini true(veya false) ayarlayarak da uyarıdan kurtulabileceğinizi unutmayın config/application.rb:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end

9
Bunu yapmak daha düzenli olmaz mıydı config.i18n.enforce_available_locales = true?
Mischa

2
3.2.16'dayım, I18n.enforce_available_locales = false olarak ayarladım, ancak yine de mesajım var ...
CLod

3
@Mischa benim için çalışmadı, yukarıdaki cevap olsa da.
Mike Atlas

1
@Mischa ne yazık ki değil, bunun I18n.configbir etkisi olması için geçmek zorunda
dolzenko

3
config.i18n.enforce_available_locales = trueconfig / application.rb dosyasında, Rails 4.0.2'de benim için kullanımdan kaldırma uyarısı kaldırıldı, ancak yalnızca diğer config.i18nsatırların üstüne koyduysam .
balexand

15

I18n.config.enforce_available_locales = true benim için Rails 3.2.16'da çalıştı (config / application.rb dosyasına koydum)



0

Yerel ayarlarla ilgilenmek istiyorsanız appilcation.rbdosyaya yazın.

config.i18n.enforce_available_locales = true

Yerel ayar doğrulaması durumunda false yazabilirsiniz ve bununla ilgilenmeyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.