Rails I18n คำเตือนการยกเลิกการตรวจสอบความถูกต้อง


387

ฉันเพิ่งอัพเดตเป็น Rails 4.0.2 และฉันได้รับคำเตือนนี้:

[เลิกใช้แล้ว] I18n.enforce_available_locales จะเริ่มต้นเป็นจริงในอนาคต หากคุณต้องการข้ามการตรวจสอบสถานที่ของคุณจริงๆคุณสามารถตั้งค่า I18n.enforce_available_locales = false เพื่อหลีกเลี่ยงข้อความนี้

มีปัญหาด้านความปลอดภัยในการตั้งค่าเป็นเท็จหรือไม่?


เห็นได้ชัดว่าสิ่งนี้เกิดขึ้นกับRails 4.0.1แอปพลิเคชันด้วย
lucke84

2
ฉันมีเหมือนกันบน Rails 3.2.16 ตามคำตอบของ Simone Carletti ด้านล่างมันอยู่ใน Rails 4 (> = 4.0.2) และ Rails 3.2 (> = 3.2.14)
Mark Berry

คำตอบ:


615

สำคัญ : ให้แน่ใจว่าแอปของคุณไม่ได้ใช้ I18n 0.6.8 ก็มีข้อผิดพลาดที่ป้องกันการกำหนดค่าที่จะตั้งอย่างถูกต้อง


คำตอบสั้น ๆ

เพื่อเงียบคำเตือนแก้ไขไฟล์ application.rb และรวมบรรทัดต่อไปนี้ภายในRails::Applicationร่างกาย

config.i18n.enforce_available_locales = true

ค่าที่เป็นไปได้คือ:

  • false : ถ้าคุณ
    • ต้องการข้ามการตรวจสอบสถานที่
    • ไม่สนใจสถานที่
  • จริง : ถ้าคุณ
    • ต้องการให้แอปพลิเคชันยกข้อผิดพลาดหากมีการส่งผ่านสถานที่ที่ไม่ถูกต้อง (หรือ)
    • ต้องการเริ่มต้นพฤติกรรม Rails ใหม่ (หรือ)
    • ดูแลเกี่ยวกับการตรวจสอบสถานที่

บันทึก:

  • พฤติกรรมเริ่มต้นเก่าสอดคล้องกับการไม่ได้falsetrue
  • หากคุณกำลังตั้งค่าการconfig.i18n.default_localeกำหนดค่าหรือการตั้งค่า i18n อื่น ๆ ตรวจสอบให้แน่ใจว่าได้ทำหลังจากตั้งconfig.i18n.enforce_available_localesค่า
  • หากคุณใช้อัญมณีบุคคลที่สามที่มีคุณสมบัติ I18n การตั้งค่าตัวแปรผ่านแอปพลิเคชันconfigวัตถุอาจไม่มีผลกระทบ ในกรณีนี้ตั้งโดยตรงกับการใช้ I18nI18n.config.enforce_available_locales

    คำเตือน

ตัวอย่าง

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

คำตอบที่ยาว

คำเตือนการเลิกใช้งานจะปรากฏขึ้นใน Rails 4 (> = 4.0.2) และ Rails 3.2 (> = 3.2.14) เหตุผลอธิบายไว้ในการกระทำนี้

บังคับใช้สถานที่ที่มีอยู่

เมื่อI18n.config.enforce_available_localesใดที่เป็นจริงเราจะเพิ่มข้อยกเว้น I18n :: InvalidLocale หากสถานที่ที่ผ่านไม่พร้อมใช้งาน

ค่าเริ่มต้นถูกตั้งค่าnilที่จะแสดงข้อผิดพลาดการคัดค้าน

หากตั้งค่าเป็นfalseเราจะข้ามการบังคับใช้สถานที่ที่มีอยู่ทั้งหมด (พฤติกรรมเก่า)

สิ่งนี้ได้ถูกนำไปใช้ในวิธีการต่อไปนี้:

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

ก่อนการเปลี่ยนแปลงนี้หากคุณผ่านสถานที่ที่ไม่รองรับ Rails จะสลับไปที่สถานที่นั้นหากว่าสถานที่นั้นถูกต้อง (เช่นถ้ามีไฟล์สถานที่เกิดเหตุที่สอดคล้องกันใน/config/localesโฟลเดอร์) มิฉะนั้นสถานที่จะเริ่มต้นกับการconfig.i18n.default_localeกำหนดค่า )

อัญมณี I18n เวอร์ชั่นใหม่บังคับให้นักพัฒนาต้องตระหนักถึงการจัดการสถานที่มากขึ้น

ในอนาคตพฤติกรรมจะเปลี่ยนไปและหากสถานที่ไม่ถูกต้องแอป Rails จะทำให้เกิดข้อผิดพลาด

ในการเตรียมการเปลี่ยนแปลงดังกล่าว (ซึ่งอาจทำให้แอพพลิเคชั่นหลายตัวที่จนถึงทุกวันนี้ต้องพึ่งพาค่าเริ่มต้นที่เงียบ) คำเตือนจะบังคับให้คุณประกาศการตรวจสอบความถูกต้องที่คุณต้องการอย่างชัดเจนในช่วงระยะเวลาการเปลี่ยนแปลงปัจจุบัน

หากต้องการคืนค่าลักษณะการทำงานก่อนหน้านี้เพียงตั้งค่าการกำหนดค่าต่อไปนี้เป็น false

config.i18n.enforce_available_locales = false

มิฉะนั้นให้ตั้งค่าเป็นจริงเพื่อให้ตรงกับค่าเริ่มต้นของ Rails ใหม่หรือหากคุณต้องการเข้มงวดมากขึ้นในการตรวจสอบความถูกต้องของโดเมนและหลีกเลี่ยงการสลับไปใช้ค่าเริ่มต้นในกรณีของสถานที่ที่ไม่ถูกต้อง

config.i18n.enforce_available_locales = true

ข้อแม้

  1. หากคุณกำลังตั้งค่าconfig.i18n.default_localeการกำหนดค่าหรือใช้ใด ๆ ของวิธีการที่กล่าวถึงก่อนหน้า ( default_locale=, locale=, translateฯลฯ ) ให้แน่ใจว่าจะทำมันได้หลังจากการตั้งค่าconfig.i18n.enforce_available_localesการตั้งค่า มิฉะนั้นคำเตือนการคัดค้านจะยังคงปรากฏขึ้นเรื่อย ๆ (ขอบคุณFábio Batista )

  2. หากคุณใช้อัญมณีบุคคลที่สามที่มีคุณสมบัติ I18n การตั้งค่าตัวแปรผ่านอาจไม่มีผล ในความเป็นจริงปัญหานี้เหมือนกันตามที่อธิบายไว้ในจุดก่อนหน้านี้เพียงเล็กน้อยยากที่จะแก้ปัญหา

    ปัญหานี้เป็นเรื่องของความสำคัญ เมื่อคุณตั้งค่าคอนฟิกในแอพ Rails ของคุณค่าจะไม่ถูกกำหนดให้กับอัญมณี I18n ทันที Rails จัดเก็บการกำหนดค่าแต่ละรายการในวัตถุภายในโหลดการอ้างอิง (Railties และอัญมณีบุคคลที่สาม) จากนั้นผ่านการกำหนดค่าไปยังคลาสเป้าหมาย หากคุณใช้ gem (หรือปลั๊กอิน Rails) ที่เรียกใช้วิธีการใด ๆ ของ I18n ก่อนที่การกำหนดค่าจะถูกกำหนดให้กับ I18n คุณจะได้รับคำเตือน

    ในกรณีนี้คุณต้องข้าม Rails stack และตั้งค่าไปที่พลอย I18n ทันทีโดยโทร

    I18n.config.enforce_available_locales = true

    แทน

    config.i18n.enforce_available_locales = true

    ปัญหานี้พิสูจน์ได้ง่าย ลองสร้างแอพ Rails ใหม่ที่ว่างเปล่าแล้วคุณจะเห็นการตั้งค่าconfig.i18nในการapplication.rbทำงานได้ดี

    หากในแอปของคุณไม่เป็นเช่นนั้นมีวิธีที่ง่ายในการแก้ไขข้อผิดพลาด ค้นหาอัญมณี i18n ในระบบของคุณเปิดi18n.rbไฟล์และแก้ไขวิธีการที่จะรวมคำสั่งenforce_available_locales!puts caller.inspect

    นี่จะทำให้วิธีการพิมพ์ stacktrace ทุกครั้งที่เรียกใช้ คุณจะสามารถกำหนดได้ว่าอัญมณีตัวใดที่เรียกมันโดยการตรวจสอบ stacktrace (ในกรณีของฉันคือ 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)>'",

20
หากคุณกำลังตั้งค่าconfig.i18n.default_localeการกำหนดค่าให้แน่ใจว่าคุณทำมันได้หลังจากการตั้งค่าใหม่config.i18n.enforce_available_localesการตั้งค่า มิฉะนั้นคำเตือนการคัดค้านจะยังคงปรากฏขึ้น
Fábio Batista

3
I18n.enforce_available_locales = trueสำหรับผมจะทำงานเฉพาะถ้าผมชุด config.i18n.enforce_available_locales = trueไม่ทำงาน
Pioz

1
@Pioz อาจเกิดจากอัญมณีที่แอปพลิเคชันของคุณขึ้นอยู่กับ ฉันอัปเดตโพสต์เพื่ออธิบายว่าทำไม
Simone Carletti

@SimoneCarletti โทรโดยตรงควรจะเป็นI18n.config.enforce_available_localesไม่ได้I18n.config.i18n.enforce_available_localesผมได้แก้ไขคำตอบของคุณ ขอบคุณสำหรับการแก้ไข
Fabio

1
มันควรจะกล่าวว่าต้องมีการตั้งค่าI18n.config.available_locales = [:your_locale, :en]เป็นอย่างอื่นไม่เช่นนั้นคุณจะไม่สามารถเริ่มใช้งานเซิร์ฟเวอร์ของคุณได้
Tamer Shlash

45

เพื่อความสมบูรณ์โปรดทราบว่าคุณสามารถกำจัดคำเตือนโดยการตั้งค่าI18n.enforce_available_localesเป็นtrue(หรือfalse) ในconfig/application.rb:

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

9
มันจะดีกว่าconfig.i18n.enforce_available_locales = trueไหมถ้าจะทำ
Mischa

2
ฉันใช้ 3.2.16 ฉันตั้งค่าเป็น I18n.enforce_available_locales = false แต่ฉันยังมีข้อความ ...
CLod

3
@Mischa ที่ไม่ได้ผลสำหรับฉัน
Mike Atlas

1
@Mischa เศร้าไม่ได้ต้องผ่านI18n.configเพื่อให้มีผล
dolzenko

3
config.i18n.enforce_available_locales = trueใน config / application.rb กำจัดคำเตือนการเลิกใช้งานสำหรับฉันใน Rails 4.0.2 แต่ถ้าฉันวางไว้เหนือconfig.i18nบรรทัดอื่น
balexand


10

ดูเหมือนจะไม่เป็นเช่นนั้น - นั่นเป็นพฤติกรรมก่อนหน้านี้ของวิธีการทำงานของ i18n พฤติกรรมใหม่ (จริง) จะเพิ่มข้อผิดพลาดเมื่อคุณขอสถานที่ที่ไม่ได้ใช้งาน / พร้อมใช้งาน

ดูการกระทำที่เพิ่มคำเตือนนี้: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c


0

ถ้าคุณต้องการที่จะดูแลเกี่ยวกับสถานที่เขียนลงในappilcation.rbไฟล์

config.i18n.enforce_available_locales = true

คุณสามารถเขียนเท็จหากการตรวจสอบสถานที่และไม่สนใจว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.