ruby on rails - रेल I18n सत्यापन बहिष्करण चेतावनी
ruby-on-rails ruby-on-rails-4 (3)
मैंने अभी रेल 4.0.2 में अपडेट किया है और मुझे यह चेतावनी मिल रही है:
[बहिष्कृत] I18n.enforce_available_locales भविष्य में सत्य के लिए डिफ़ॉल्ट होगा। यदि आप वास्तव में अपने लोकेल के सत्यापन को छोड़ना चाहते हैं तो आप इस संदेश से बचने के लिए I18n.enforce_available_locales = false सेट कर सकते हैं।
क्या इसे गलत में स्थापित करने में कोई सुरक्षा समस्या है?
ऐसा प्रतीत नहीं होता है - यह i18n काम करने के तरीके का पिछला व्यवहार होगा - जब आप लोकेल को लागू / उपलब्ध नहीं करते हैं तो नया व्यवहार (सत्य) एक त्रुटि उठाएगा।
इस चेतावनी को जोड़ने वाले प्रतिबद्धता को देखें: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
बस पूर्णता के लिए, ध्यान दें कि आप config/application.rb
में I18n.enforce_available_locales
को true
(या false
) पर सेट करके चेतावनी से छुटकारा पा सकते हैं:
require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
class Application < Rails::Application
.
.
.
I18n.enforce_available_locales = true
.
.
.
end
end
महत्वपूर्ण : सुनिश्चित करें कि आपका ऐप I18n 0.6.8 का उपयोग नहीं कर रहा है, इसमें एक बग है जो कॉन्फ़िगरेशन को सही तरीके से सेट करने से रोकती है ।
संक्षिप्त जवाब
चेतावनी को चुप करने के लिए application.rb फ़ाइल को संपादित करें और Rails::Application
निकाय के अंदर निम्न पंक्ति शामिल करें
config.i18n.enforce_available_locales = true
संभावित मूल्य हैं:
- झूठा : अगर आप
- लोकेल सत्यापन को छोड़ना चाहते हैं
- स्थानीय लोगों की परवाह नहीं है
- सच : अगर आप
- अगर अमान्य लोकेल पास हो जाता है तो एप्लिकेशन को त्रुटि उठाना चाहिए (या)
- नए रेल व्यवहार (या) के लिए डिफ़ॉल्ट करना चाहते हैं
- लोकेल सत्यापन के बारे में परवाह है
ध्यान दें:
- पुराना डिफ़ॉल्ट व्यवहार
false
मेल खाता है,true
नहींtrue
। - यदि आप
config.i18n.default_locale
कॉन्फ़िगरेशन या अन्य i18n सेटिंग्स सेट कर रहे हैं, तोconfig.i18n.enforce_available_locales
सेटिंग सेट करने के बाद इसे करना सुनिश्चित करें। - यदि आप तृतीय पक्ष रत्नों का उपयोग करते हैं जिनमें I18n सुविधाएं शामिल हैं, तो अनुप्रयोग
config
ऑब्जेक्ट के माध्यम से चर सेट करना, इसका कोई प्रभाव नहीं हो सकता है। इस मामले में,I18n.config.enforce_available_locales
का उपयोग करके इसे सीधेI18n
सेट करें।चेतावनियां
उदाहरण
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
लंबा जवाब
बहिष्करण चेतावनी अब रेल 4 (> = 4.0.2) और रेल 3.2 (> = 3.2.14) दोनों में प्रदर्शित होती है। इस प्रतिबद्धता में कारण बताया गया है।
उपलब्ध लोकल लागू करें
जब
I18n.config.enforce_available_locales
सत्य है तो हम पास किए गए लोकेल अनुपलब्ध होने पर I18n :: अवैध लॉक अपवाद उठाएंगे।डिफॉल्ट को
nil
सेट किया गया है जो एक बहिष्करण त्रुटि प्रदर्शित करेगा।यदि
false
सेट किया गयाfalse
तो हम उपलब्ध लोकेशंस को पूरी तरह से लागू कर देंगे (पुराने व्यवहार)।इसे निम्नलिखित विधियों में लागू किया गया है:
- I18n.config.default_locale =
- I18n.config.locale =
- I18n.translate
- I18n.localize
- I18n.transliterate
इस परिवर्तन से पहले, यदि आपने असमर्थित लोकेल पास किया है, तो रेल लोग चुपचाप स्विच कर देंगे यदि लोकेल वैध है (यानी यदि /config/locales
फ़ोल्डर में कोई संबंधित लोकेल फ़ाइल है), अन्यथा लोकेल config.i18n.default_locale
डिफ़ॉल्ट होगा config.i18n.default_locale
विन्यास (जो डिफ़ॉल्ट रूप से: एन)।
I18n मणि का नया संस्करण, डेवलपर्स को स्थानीय प्रबंधन के बारे में थोड़ा और जागरूक होने के लिए मजबूर करता है।
भविष्य में, व्यवहार बदल जाएगा और यदि कोई लोकेल अमान्य है, तो रेल ऐप एक त्रुटि उठाएगा।
इस तरह के परिवर्तन की तैयारी में (जो संभावित रूप से कई अनुप्रयोगों को तोड़ सकता है कि जब तक कि मौन चूक पर निर्भर न हो), चेतावनी आपको वर्तमान संक्रमण अवधि के दौरान स्पष्ट रूप से घोषित करने के लिए मजबूर कर रही है कि आप कौन सा सत्यापन करना चाहते हैं।
पिछले व्यवहार को पुनर्स्थापित करने के लिए, बस निम्न कॉन्फ़िगरेशन को false
सेट करें
config.i18n.enforce_available_locales = false
अन्यथा, नए रेल डिफ़ॉल्ट से मेल खाने के लिए इसे सही पर सेट करें या यदि आप डोमेन सत्यापन पर अधिक कठोर होना चाहते हैं और अमान्य लोकेल के मामले में डिफ़ॉल्ट पर स्विचिंग से बचें।
config.i18n.enforce_available_locales = true
चेतावनी
यदि आप
config.i18n.default_locale
कॉन्फ़िगरेशन सेट कर रहे हैं या पहले उल्लिखित विधियों में से किसी एक का उपयोग कर रहे हैं (default_locale=
,locale=
,translate
, आदि),config.i18n.enforce_available_locales
सेटिंग सेट करने के बाद इसे करना सुनिश्चित करें। अन्यथा, बहिष्करण चेतावनी पॉप-अप जारी रहेगी। (धन्यवाद Fábio Batista )।यदि आप तृतीय पक्ष रत्नों का उपयोग करते हैं जिनमें I18n सुविधाएं शामिल हैं, तो वेरिएबल को सेट करने से प्रभाव नहीं पड़ सकता है। असल में, यह मुद्दा पिछले बिंदु में वर्णित जैसा ही है, डीबग करने के लिए थोड़ा मुश्किल है।
यह मुद्दा प्राथमिकता का विषय है। जब आप अपने रेल ऐप में कॉन्फ़िगरेशन सेट करते हैं, तो मूल्य तुरंत I18n मणि को असाइन नहीं किया जाता है। रेल प्रत्येक कॉन्फ़िगरेशन को आंतरिक ऑब्जेक्ट में संग्रहीत करता है, निर्भरता (रेलटी और तृतीय पक्ष रत्न) लोड करता है और फिर यह लक्ष्य कक्षाओं में कॉन्फ़िगरेशन पास करता है। यदि आप एक मणि (या रेल प्लगइन) का उपयोग करते हैं जो I18n को कॉन्फ़िगर करने से पहले I18n विधियों में से किसी एक को कॉल करता है, तो आपको चेतावनी मिल जाएगी।
इस मामले में, आपको रेल स्टैक को छोड़ना होगा और कॉन्फ़िगरेशन को तुरंत I18n मणि पर कॉल करके सेट करना होगा
I18n.config.enforce_available_locales = true
के बजाय
config.i18n.enforce_available_locales = true
मुद्दा साबित करना आसान है। एक नया खाली रेल ऐप उत्पन्न करने का प्रयास करें और आप देखेंगे कि
application.rb
मेंconfig.i18n
सेटिंग ठीक काम करती है।यदि आपके ऐप में यह नहीं है, तो अपराधी को डीबग करने का एक आसान तरीका है। अपने सिस्टम में i18n मणि का पता लगाएं,
i18n.rb
फ़ाइल खोलें और methodenforce_available_locales!
विधि को संपादित करेंenforce_available_locales!
कथन शामिल करने के लिएputs caller.inspect
।इससे जब भी बुलाया जाता है तो यह स्टैकट्रैक प्रिंट करने का तरीका बन जाएगा। आप यह निर्धारित करने में सक्षम होंगे कि कौन सा मणि स्टैकट्रैस का निरीक्षण करके इसे कॉल कर रहा है (मेरे मामले में यह एथलॉगिक था)।
["/Users/weppos/.rvm/gems/[email protected]/gems/i18n-0.6.9/lib/i18n.rb:150:in `translate'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in `translate'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in `translate'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:in `validates_format_of_email_field_options'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in `block in included'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `class_eval'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `included'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `include'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `block in acts_as_authentic'", "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `each'", "/Users/weppos/.rvm/gems/[email protected]/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)>'",