I18n सत्यापन पदावनति चेतावनी रेल


387

मैंने अभी 4.0.2 पर रेल अपडेट की है और मुझे यह चेतावनी मिल रही है:

[पदावनत] I18n.enforce_available_locales भविष्य में सत्य करने के लिए डिफ़ॉल्ट होगा। यदि आप वास्तव में अपने लोकेल के सत्यापन को छोड़ना चाहते हैं तो आप इस संदेश से बचने के लिए I18n.enforce_available_locales = false सेट कर सकते हैं।

क्या इसे गलत पर सेट करने में कोई सुरक्षा समस्या है?


जाहिर है यह Rails 4.0.1अनुप्रयोगों के लिए भी होता है ।
lucke84

2
मैं रेल 3.2.16 पर समान है। नीचे सिमोन कारलेटी के उत्तर के अनुसार, यह रेल 4 (> = 4.0.2) और रेल 3.2 (> = 3.2.1%) में है।
मार्क बेरी

जवाबों:


615

महत्वपूर्ण : सुनिश्चित करें कि आपका ऐप I18n 0.6.8 का उपयोग नहीं कर रहा है, इसमें एक बग है जो कॉन्फ़िगरेशन को सही तरीके से सेट करने से रोकता है


संक्षिप्त जवाब

चेतावनी को चुप करने के लिए application.rb फ़ाइल को संपादित करें और Rails::Applicationशरीर के अंदर निम्न पंक्ति शामिल करें

config.i18n.enforce_available_locales = true

संभावित मूल्य हैं:

  • असत्य : अगर तुम
    • स्थान सत्यापन को छोड़ना चाहते हैं
    • स्थानों की परवाह मत करो
  • सच : अगर तुम
    • यदि कोई अमान्य लोकेल पास हो (या)
    • नए रेल व्यवहार (या) के लिए डिफ़ॉल्ट करना चाहते हैं
    • स्थानीय सत्यापन के बारे में परवाह है

ध्यान दें:

  • पुराने डिफ़ॉल्ट व्यवहार से मेल खाती है 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

लंबा जवाब

अब पदावनति चेतावनी रेल 4 (> = 4.0.2) और रेल 3.2 (> = 3.2.14) दोनों में प्रदर्शित की जाती है। इसका कारण इस वचन में बताया गया है ।

उपलब्ध स्थानों को लागू करें

कब I18n.config.enforce_available_locales सच है हम एक I18n उठाएंगे: अमान्य लॉकेल अपवाद यदि पारित लोकेल अनुपलब्ध है।

डिफ़ॉल्ट सेट किया गया है, nilजिसमें एक अपचयन त्रुटि दिखाई देगी।

यदि falseहम उपलब्ध स्थानों को पूरी तरह से (पुराने व्यवहार) लागू करना छोड़ देंगे।

इसे निम्नलिखित विधियों में लागू किया गया है:

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

इस परिवर्तन से पहले, यदि आपने एक असमर्थित लोकल पास किया है, तो रेल चुपचाप उस पर स्विच कर देगा यदि लोकेल वैध है (यानी यदि /config/localesफ़ोल्डर में एक संबंधित लोकेल फ़ाइल है ), अन्यथा लोकेल config.i18n.default_localeकॉन्फ़िगरेशन के लिए डिफ़ॉल्ट होगा (जो कि चूक के लिए: en )।

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सेटिंग। अन्यथा, पदावनति चेतावनी पॉप अप होती रहेगी। (धन्यवाद फैबियो बतिस्ता )।

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

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

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

    I18n.config.enforce_available_locales = true

    के बजाय

    config.i18n.enforce_available_locales = true

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

    यदि आपके ऐप में ऐसा नहीं है, तो अपराधी को डीबग करने का एक आसान तरीका है। अपने सिस्टम में i18n रत्न का पता लगाएँ, i18n.rbफ़ाइल खोलें और enforce_available_locales!कथन को शामिल करने के लिए विधि को संपादित करें puts caller.inspect

    यह जब भी बुलाया स्टैकट्रेस मुद्रित करने के लिए विधि का कारण होगा। आप यह निर्धारित करने में सक्षम होंगे कि कौन सा मणि इसे स्टैकट्रेस (मेरे मामले में यह प्रामाणिक था) का निरीक्षण करके बुला रहा है।

    ["/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। अन्यथा, अपग्रेडेशन चेतावनी पॉपिंग पर रहेगी।
फैबियो बतिस्ता

3
मेरे लिए, मैं सेट होने पर ही काम करता हूँ I18n.enforce_available_locales = trueconfig.i18n.enforce_available_locales = trueकाम नहीं करता।
पियोज

1
@Pioz यह आपके द्वारा निर्भर किए गए रत्नों के कारण हो सकता है। मैंने यह बताने के लिए पोस्ट को अपडेट किया कि क्यों।
सिमोन कार्लेटी

@SimoneCarletti प्रत्यक्ष कॉल I18n.config.enforce_available_localesनहीं होना चाहिए I18n.config.i18n.enforce_available_locales, मैंने आपका उत्तर संपादित कर दिया है। तय करने के लिए Thanx।
फैबियो

1
यह उल्लेख किया जाना चाहिए कि किसी को I18n.config.available_locales = [:your_locale, :en]उदाहरण के लिए सेट करना होगा, अन्यथा आप अपने रेल सर्वर को शुरू नहीं कर पाएंगे।
ताम्र शालाश

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?
मिशा

2
मैं 3.2.16 को हूं, मैंने I18n.enforce_available_locales = false पर सेट किया है, लेकिन मेरे पास अभी भी संदेश है ...
CLOD

3
@ मिशा ने मेरे लिए काम नहीं किया, हालांकि इसका जवाब ऊपर है।
माइक एटलस

1
@ मिस्सा दुख की बात नहीं है, I18n.configइस के लिए एक प्रभाव के माध्यम से जाना था
dolzenko

3
config.i18n.enforce_available_locales = truein config / application.rb ने रेल 4.0.2 में मेरे लिए पदावनति की चेतावनी को समाप्त कर दिया, लेकिन केवल तभी जब मैंने इसे अन्य config.i18nपंक्तियों के ऊपर रखा ।
19

15

I18n.config.enforce_available_locales = true मेरे लिए रेल 3.2.16 में काम किया (मैंने इसे config / application.rb में डाला)


10

इस तरह से प्रतीत नहीं होता है - कि i18n के काम करने के तरीके का पिछला व्यवहार होगा - नया व्यवहार (सच्चा) जब आप एक लोकेल के लिए पूछेंगे, जो कार्यान्वित / उपलब्ध नहीं है।

इस चेतावनी को जोड़ने वाली प्रतिबद्धता देखें: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c


0

यदि आप appilcation.rbफ़ाइल में लिखे गए स्थानों की परवाह करना चाहते हैं ।

config.i18n.enforce_available_locales = true

यदि आप लोकेल वैलिडेशन लिखते हैं और आप इसकी परवाह नहीं करते हैं तो आप गलत लिख सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.