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

चेतावनी

  1. यदि आप config.i18n.default_locale कॉन्फ़िगरेशन सेट कर रहे हैं या पहले उल्लिखित विधियों में से किसी एक का उपयोग कर रहे हैं ( default_locale= , locale= , translate , आदि), config.i18n.enforce_available_locales सेटिंग सेट करने के बाद इसे करना सुनिश्चित करें। अन्यथा, बहिष्करण चेतावनी पॉप-अप जारी रहेगी। (धन्यवाद Fábio Batista )।

  2. यदि आप तृतीय पक्ष रत्नों का उपयोग करते हैं जिनमें I18n सुविधाएं शामिल हैं, तो वेरिएबल को सेट करने से प्रभाव नहीं पड़ सकता है। असल में, यह मुद्दा पिछले बिंदु में वर्णित जैसा ही है, डीबग करने के लिए थोड़ा मुश्किल है।

    यह मुद्दा प्राथमिकता का विषय है। जब आप अपने रेल ऐप में कॉन्फ़िगरेशन सेट करते हैं, तो मूल्य तुरंत I18n मणि को असाइन नहीं किया जाता है। रेल प्रत्येक कॉन्फ़िगरेशन को आंतरिक ऑब्जेक्ट में संग्रहीत करता है, निर्भरता (रेलटी और तृतीय पक्ष रत्न) लोड करता है और फिर यह लक्ष्य कक्षाओं में कॉन्फ़िगरेशन पास करता है। यदि आप एक मणि (या रेल प्लगइन) का उपयोग करते हैं जो I18n को कॉन्फ़िगर करने से पहले I18n विधियों में से किसी एक को कॉल करता है, तो आपको चेतावनी मिल जाएगी।

    इस मामले में, आपको रेल स्टैक को छोड़ना होगा और कॉन्फ़िगरेशन को तुरंत I18n मणि पर कॉल करके सेट करना होगा

    I18n.config.enforce_available_locales = true
    

    के बजाय

    config.i18n.enforce_available_locales = true
    

    मुद्दा साबित करना आसान है। एक नया खाली रेल ऐप उत्पन्न करने का प्रयास करें और आप देखेंगे कि application.rb में config.i18n सेटिंग ठीक काम करती है।

    यदि आपके ऐप में यह नहीं है, तो अपराधी को डीबग करने का एक आसान तरीका है। अपने सिस्टम में i18n मणि का पता लगाएं, i18n.rb फ़ाइल खोलें और method enforce_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)>'",
    






rails-i18n