2008-11-28 13 views
8

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

मैं जानता हूँ कि Zend फ्रेमवर्क यह करने के लिए एक विधि है, लेकिन मैं नहीं बल्कि स्थापित पूरे ढांचे बस का उपयोग नहीं होता है कि कार्यक्षमता में से एक बिट।

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

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

उत्तर

2

अच्छा समाधान on its way है।

इसके बिना आपको उस शीर्षलेख को पार्स करने की आवश्यकता होगी। यह अर्धविराम से अलग लोकेशंस और विशेषताओं की अल्पविराम से अलग सूची है।

यह इस तरह देख सकते हैं:

en_US, en;q=0.8, fr_CA;q=0.2, *;q=0.1 

और तब तक setlocale() यह स्वीकार करता है प्रत्येक स्थान की कोशिश करो। तैयार रहें कि उनमें से कोई भी मेल नहीं खा सकता है।

उस पर आधार मत कुछ भी बहुत महत्वपूर्ण या उपयोगकर्ताओं के लिए यह ओवरराइड करने की अनुमति, कुछ उपयोगकर्ताओं को गलत तरह से कॉन्फ़िगर ब्राउज़रों हो सकता है क्योंकि।


विंडोज लोकेल के लिए, शायद आपको आईएसओ 639-1 नामों को आईएसओ 639-2/3 में परिवर्तित करने की आवश्यकता है?

5

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

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

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

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

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

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

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

2

मैं जानता हूँ कि Zend फ्रेमवर्क एक विधि यह करने के लिए है, लेकिन मैं नहीं बल्कि स्थापित नहीं पूरे ढांचे बस का उपयोग करने के चाहते हैं कि कार्यक्षमता के एक बिट।

ज़ेंड के बारे में अच्छी खबर यह है कि आपको इसे इंस्टॉल करने की आवश्यकता नहीं है। यह एक समेकित युग्मित ढांचा है और आप किसी भी अन्य घटकों का उपयोग किए बिना ज़ेंड_लोकेल का उपयोग कर सकते हैं। शायद आप इसे Zend_Translate से जोड़ना चाहते हैं।

Check it out

1

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

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