สำคัญ : ให้แน่ใจว่าแอปของคุณไม่ได้ใช้ I18n 0.6.8 ก็มีข้อผิดพลาดที่ป้องกันการกำหนดค่าที่จะตั้งอย่างถูกต้อง
คำตอบสั้น ๆ
เพื่อเงียบคำเตือนแก้ไขไฟล์ application.rb และรวมบรรทัดต่อไปนี้ภายในRails::Application
ร่างกาย
config.i18n.enforce_available_locales = true
ค่าที่เป็นไปได้คือ:
- false : ถ้าคุณ
- ต้องการข้ามการตรวจสอบสถานที่
- ไม่สนใจสถานที่
- จริง : ถ้าคุณ
- ต้องการให้แอปพลิเคชันยกข้อผิดพลาดหากมีการส่งผ่านสถานที่ที่ไม่ถูกต้อง (หรือ)
- ต้องการเริ่มต้นพฤติกรรม Rails ใหม่ (หรือ)
- ดูแลเกี่ยวกับการตรวจสอบสถานที่
บันทึก:
- พฤติกรรมเริ่มต้นเก่าสอดคล้องกับการไม่ได้
false
true
- หากคุณกำลังตั้งค่าการ
config.i18n.default_locale
กำหนดค่าหรือการตั้งค่า i18n อื่น ๆ ตรวจสอบให้แน่ใจว่าได้ทำหลังจากตั้งconfig.i18n.enforce_available_locales
ค่า
- หากคุณใช้อัญมณีบุคคลที่สามที่มีคุณสมบัติ I18n การตั้งค่าตัวแปรผ่านแอปพลิเคชัน
config
วัตถุอาจไม่มีผลกระทบ ในกรณีนี้ตั้งโดยตรงกับการใช้
I18n
I18n.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
ข้อแม้
หากคุณกำลังตั้งค่าconfig.i18n.default_locale
การกำหนดค่าหรือใช้ใด ๆ ของวิธีการที่กล่าวถึงก่อนหน้า ( default_locale=
, locale=
, translate
ฯลฯ ) ให้แน่ใจว่าจะทำมันได้หลังจากการตั้งค่าconfig.i18n.enforce_available_locales
การตั้งค่า มิฉะนั้นคำเตือนการคัดค้านจะยังคงปรากฏขึ้นเรื่อย ๆ (ขอบคุณFábio Batista )
หากคุณใช้อัญมณีบุคคลที่สามที่มีคุณสมบัติ 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)>'",
Rails 4.0.1
แอปพลิเคชันด้วย