मैं PHP में एक उपयोगकर्ता के लोकेल को स्वचालित रूप से कैसे सेट कर सकता हूं?


Answers

यह जितना आसान होना चाहिए (मेरी विनम्र राय में) सबसे पहले आपको $_SERVER['HTTP_ACCEPT_LANGUAGE'] से स्थानीय लोगों को निकालना होगा और उन्हें अपने q मानों से सॉर्ट करना होगा। बाद में आपको दिए गए स्थानों में से प्रत्येक के लिए उपयुक्त सिस्टम लोकेल को पुनः प्राप्त करना होगा, जो * निकस मशीन पर कोई समस्या नहीं होनी चाहिए (आपको केवल सही वर्णसेट के साथ सामना करना पड़ सकता है) परन्तु विंडोज़ पर आपको स्थानीय लोगों में अनुवाद करना होगा विंडोज स्थानीय, जैसे German_Germany होगा (यदि आप उदाहरण के लिए अपने ऐप में यूटीएफ -8 का उपयोग कर रहे हैं तो फिर आपको वर्णसेट के मुद्दों से निपटना होगा) मुझे लगता है कि आपको इस समस्या के लिए एक लुकअप तालिका का निर्माण करना होगा - और बहुत सारे स्थान हैं ;-)

जब तक आप setlocale() का उपयोग करते हुए मैच नहीं पाते हैं, तब तक आप एक लोकेल को दूसरे (बाद में q मानों के साथ क्रमबद्ध करने के बाद) की कोशिश करते हैं setlocale() यदि दिए गए स्थान सेट नहीं किया जा सकता है तो फ़ंक्शन false लौटाएगा)।

लेकिन फिर इनसे निपटने के लिए एक आखिरी बाधा होगी:

लोकेल की जानकारी प्रति प्रक्रिया बनाए नहीं है, प्रति धागा नहीं। यदि आप PHP पर एक multithreaded सर्वर API पर आईआईएस या अपाचे जैसे विंडोज पर चल रहे हैं, तो आपको स्क्रिप्ट चल रही है जबकि स्थानीय स्तरीय सेटिंग्स के अचानक परिवर्तन का अनुभव हो सकता है, हालांकि स्क्रिप्ट में कभी भी सेटलोकेल () ही नहीं कहा जाता है यह उसी प्रक्रिया के विभिन्न थ्रेड्स में चलने वाली अन्य स्क्रिप्ट के कारण होता है, एक ही समय में सेट्लोकेल () का उपयोग कर प्रोसेसवाइड लोकेल बदल रहा है।

(देखें: http://de2.php.net/manual/en/function.setlocale.php )

इसका अर्थ है कि आपको एक स्क्रिप्ट निष्पादन के दौरान अचानक लोकेल परिवर्तन का अनुभव हो सकता है क्योंकि दूसरे उपयोगकर्ता द्वारा सेट किए गए किसी अन्य उपयोगकर्ता ने सिर्फ अपने वेबपृष्ठ को दबा दिया है

इसलिए Zend_Locale का उल्लेख PHP फ़ंक्शन setlocale() पर निर्भर नहीं है (यह केवल सिस्टम लोकेल जानकारी को पुनर्प्राप्त करने के लिए उपयोग किया जाता है) परन्तु इसके बजाय यूनिकोड सीएलडीआर प्रोजेक्ट द्वारा प्रदान किए गए डेटा के आधार पर एक सिस्टम का उपयोग करता है। यह उन सभी setlocale() मुद्दों से घटक को स्वतंत्र बनाता है लेकिन यह कुछ अन्य कमियां भी पेश करता है जैसे लोकेल-जागरूक स्ट्रिंग संचालन (उदाहरण के लिए क्रमबद्ध) के लिए समर्थन की कमी।

Question

क्या उपयोगकर्ता के HTTP_ACCEPT_LANGUAGE को पार्स करने और PHP में लोकेल सेट करने का एक आसान तरीका है?

मुझे पता है कि ज़ेंड फ़्रेमवर्क में ऐसा करने का एक तरीका है, लेकिन मैं उस कार्यप्रणाली का एक बिट का उपयोग करने के लिए पूरे ढांचे को स्थापित नहीं करना चाहता था

PEAR I18Nv2 पैकेज बीटा में है और इसे लगभग तीन वर्षों तक नहीं बदला गया है, इसलिए मैं इसका उपयोग न करें यदि संभव हो तो

यह भी अच्छा होगा यदि यह पता लगा सकता है कि सर्वर विंडोज पर चल रहा है या नहीं, क्योंकि विंडोज़ की लोकेल स्ट्रिंग दुनिया के बाकी हिस्सों से अलग है ... (जर्मन "डीयू" या "डी" के बजाय "डीयू" है। )




इसमें http_negotiate_language , लेकिन यह http-extension पर निर्भर करता है। वैकल्पिक रूप से, उपयोगकर्ता के कार्यान्वयन के लिए मैन्युअल पृष्ठ पर टिप्पणियां देखें।