17

मैं सिर्फ सिफारिश रेल तरीका है अपने नियंत्रकरेल में लोकेल सेटिंग वैश्विक के रूप में क्यों कार्य करती है (जब पतली का उपयोग करते हैं)?

before_filter :set_locale 

def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
end 

स्थान विश्व स्तर पर सेट में स्थान निर्धारित करने के लिए है कि एहसास हुआ। उपर्युक्त कोड काम करता है, लेकिन मुझे आश्चर्य है कि default_locale वास्तव में डिफ़ॉल्ट है यदि आपको इसे स्पष्ट रूप से टाइप करना है?

def set_locale 
    locale = params[:locale] if params[:locale] 
end 

और होने I18n.default_locale अन्यथा डिफ़ॉल्ट रूप से इस्तेमाल किया:

मैं क्या उम्मीद थी अनुरोध के अनुसार एक स्थान के लिए की तरह है और कुछ कर (जैसे हम अनुरोध के अनुसार सत्र है) है। यह आदर्श पथ में वैकल्पिक स्थान से मेल होगा:

# config/routes.rb 
scope "(:locale)", :locale => /en|nl/ do 
    resources :books 
end 

यदि किसी कारण से मैं कुछ कार्रवाई में स्थानीय सेटिंग को छोड़ अभी के लिए यह स्थान पिछले अनुरोध जो किसी अन्य उपयोगकर्ता से हो सकता है में सेट का उपयोग करता है!

और क्या कोई संभावित दौड़ स्थिति नहीं है क्योंकि एक अनुरोध वैश्विक I18n.locale बदल सकता है जबकि एक अन्य अनुरोध (पहले स्थान पर एक और लोकेल सेट कर रहा है) प्रतिपादन के बीच में है?


अद्यतन: कुछ विवरण मैं अब के लिए मिल गया है, I18n documentstion से:

वर्तमान स्थान सेट छद्म विश्व स्तर पर, Thread.current हैश में यानी डीईएफ़ स्थान में = (लोकेल)

अब मैं समझना चाहता हूं कि प्रत्येक अनुरोध एक अलग धागा है या नहीं।


अद्यतन 2: विवरण के लिए मेरा उत्तर देखें।

उत्तर

12

तो अब अंतिम जवाब। टीएल; डीआर जब आप थ्रेड और प्यूमा जैसे थ्रेडेड वेब सर्वर का उपयोग करते हैं तो लोकेल केवल वैश्विक के रूप में कार्य करता है।

मैं उल्लेख किया है, I18n.locale=

थ्रेड में वर्तमान स्थान सेट छद्म विश्व स्तर पर है, यानी।वर्तमान हैश

तो यह प्रति-अनुरोध माना जाता है, और यह वेब्रिक और यूनिकॉर्न में इस तरह से काम करता है।

लेकिन यदि आप थिन या प्यूमा जैसे थ्रेडेड वेब सर्वर का उपयोग करते हैं, तो ऐसा लगता है कि धागा लंबा रहता है, और भविष्य को भविष्य के अनुरोधों के लिए संरक्षित किया जाता है, जब तक कि यह स्पष्ट रूप से परिवर्तित न हो जाए।

आप वैश्विक राज्य की जरूरत है, तो आप शायद Thread.current के लिए पहुँच गए हैं: मैं कहाँ सीखा यह नया स्टीव Klabnik के मणि request_store से है।

<...>

ताकि लोगों को पतला या प्यूमा की तरह उन फैंसी पिरोया वेब सर्वर का उपयोग कर रहे हैं। लेकिन अगर आप थ्रेड.current का उपयोग करते हैं, और आप उन सर्वरों में से एक का उपयोग करते हैं, तो देखो! मूल्य आपके अपेक्षा से अधिक लंबे समय तक टिक सकते हैं, और इससे बग का कारण बन सकता है।

+0

मुझे एक ही समस्या है, लेकिन मैं यूनिकॉर्न का उपयोग कर रहा हूं! कुछ पता है इसे कैसे हल करना है? धन्यवाद –

+0

मुझे लगता है कि जब आप "I18n.set_locale" कहते हैं, तो आप वास्तव में "I18n.locale =" सही कहेंगे? http://www.rubydoc.info/github/svenfuchs/i18n/I18n/Config:locale= – lulalala

+0

आप सही हैं, सुधार के लिए धन्यवाद। – khustochka

2

ऊपर से अनुशंसित कोड वैश्विक स्तर पर लोकेल सेट नहीं करता है, यह अनुरोध द्वारा इसे सेट करता है।

before_filter :set_locale 

def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
end 

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

def set_locale 
    I18n.locale = @user.locale || session[:locale] || params[:locale] || :en 
end 

दूसरे शब्दों में आप एक पृष्ठ पर स्थानीय सेट के लिए जर्मन घर नियंत्रक में मान लीजिए और डैशबोर्ड नियंत्रक आप डिफ़ॉल्ट भाषा (अंग्रेजी) देखेंगे मिल गया है। चूंकि परिवर्तन वैश्विक नहीं है। यही कारण है कि कोड बेस नियंत्रक में रखा गया है। उम्मीद है कि यह समझ में आता है।

+1

'I18n' एक वैश्विक मॉड्यूल है, और' I18n.locale = 'इसकी स्थिति बदलता है। मैं मानता हूं कि सामान्य रूप से अपेक्षित रूप से 'pre_filter' के माध्यम से प्रत्येक अनुरोध के लिए लोकेल को स्पष्ट रूप से सेट करने का अनुशंसित तरीका। फिर भी मुझे आश्चर्य है कि क्या रेल अनुरोधों को अलग-अलग धागे में एक साथ चलाया जा सकता है - यदि हां, तो मुझे यह संभव है कि अनुरोध 1 सेट 'I18n.locale' सेट करें, फिर 2 अलग-अलग' I18n.locale' सेट करें, फिर अनुरोध 1 का उपयोग करके प्रतिपादन शुरू होता है नया (गलत) लोकेल। क्षमा करें अगर मुझे आपका उत्तर गलत मिल रहा है। – khustochka

संबंधित मुद्दे