विंडोज पर पायथन के लोकेल को सेट करने का सही तरीका क्या है?


80

मैं स्थानीय-जागरूक तरीके से तार की एक सूची को सॉर्ट करने का प्रयास कर रहा हूं। मैंने अन्य i18n-संबंधी कार्यों के लिए बैबेल लाइब्रेरी का उपयोग किया है, लेकिन यह सॉर्टिंग का समर्थन नहीं करता है। पायथन का localeमॉड्यूल एक strcollफ़ंक्शन प्रदान करता है , लेकिन उस प्रक्रिया के स्थान की आवश्यकता होती है जिसे मैं काम करना चाहता हूं। एक दर्द की तरह, लेकिन मैं इसके साथ रह सकता हूं।

समस्या यह है कि मैं वास्तव में स्थान निर्धारित नहीं कर सकता। प्रलेखन के लिए localeमॉड्यूल इस उदाहरण देता है:

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')

जब मैं उसे चलाता हूं, तो मुझे यह मिलता है:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\Lib\locale.py", line 494, in setlocale
locale.Error: unsupported locale setting

मैं क्या गलत कर रहा हूं?

जवाबों:


109

ऐसा लगता है कि आप विंडोज का उपयोग कर रहे हैं। वहां के लोकल स्ट्रिंग्स अलग हैं। डॉक्टर पर अधिक सटीक नज़र डालें:

locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform

विंडोज पर, मुझे लगता है कि यह कुछ इस तरह होगा:

locale.setlocale(locale.LC_ALL, 'deu_deu')

MSDN के पास भाषा के तार और देश / क्षेत्र के तार की एक सूची है


5
FWIW, मैं के तहत समस्या थी Ubuntu 13.04, Linux 3.8.0-19अजगर के साथ 2.7.4जब स्थानीय सेट करने की कोशिश कर रहा fr_FR। इसे fr_FR.UTF-8मेरे लिए काम करने के लिए सेट करना ।
जोन

कॉनडा 4.4.11, विंडोज 7 में पायथन 3.6.3 के लिए, स्थानीय तार अन्य ओएस के समान ही प्रतीत होते हैं।
srodriguex


2
लिंक किए गए डॉक्स WServer2018R2 के लिए बहुत हाल के हैं, मुझे इसका उपयोग करना था 'eng_usa'('en_US' था काम नहीं किया)
Boop

17

यह इसका उपयोग करने का एकमात्र सही तरीका है, जो जर्मन लोकेल के लिए एक उदाहरण प्रदान करता है:

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German"  # Note: do not use "de_DE" as it doesn't work)

1
यह एकमात्र उत्तर है जो वास्तव में प्रश्न का उत्तर देता है।
महत्त्व

यह मेरे में मदद मिली है, लेकिन मैं बदलना पड़ा Germanकरने के लिए Portuguese_Brazil.1252। क्या आप इन मूल्यों को सूचीबद्ध करने वाले एक दस्तावेज़ को जानते हैं?
हेनरिक ब्रिसोला

15

आपको सेटेलोकेल के लिए एक स्पष्ट स्थान पास नहीं करना चाहिए , यह गलत है। इसे पर्यावरण से पता लगाने दें। आपको इसे एक खाली स्ट्रिंग पास करना होगा

import locale
locale.setlocale(locale.LC_ALL, '')

10
मैंने इस प्रश्न में इसका उल्लेख नहीं किया क्योंकि यह सीधे संबंधित नहीं था, लेकिन उस समय मैं जो कोड लिख रहा था, वह वेब सर्वर पर उपयोग के लिए डिज़ाइन किया गया था। दूसरे शब्दों में, प्रत्येक अनुरोध के साथ स्थान बदल सकता है, और यह आवश्यक नहीं है कि पर्यावरण के स्थान के समान ही हो।
DNS

2
DNS: क्या आपने डॉक्स को लोकेल के लिए पढ़ा है? इसका तात्पर्य यह है कि सेटलोकाले को "बहुत" कहना खतरनाक हो सकता है, और यह थ्रेड सुरक्षित नहीं है। तो शायद सेटलोकाले के अलावा कुछ और उपाय है। गेटटेक्स्ट विभिन्न कैटलॉग को लोड कर सकता है और उदाहरण के लिए रनटाइम पर स्विच कर सकता है; लेकिन मैं नहीं जानता कि आप किस लोकेल के लिए उपयोग कर रहे हैं।
u0b34a0f6ae 15

जब तक आपका उपयोगकर्ता आपके स्थानीय मशीन पर नहीं है
गेब्रियल

8

उबंटू

उबंटू पर आपको यह समस्या हो सकती है क्योंकि आपके पास आपके सिस्टम पर वह लोकल इंस्टाल नहीं है।

शेल से प्रयास करें:

$> locale -a

और जाँच करें कि क्या आप उस लोकेल को ढूंढते हैं जिसे आप में रुचि रखते हैं। अन्यथा आपको इसे स्थापित करना होगा:

$> sudo apt-get install language-pack-XXX

जहाँ XXX आपकी भाषा है (मेरे मामले में "xxx = it", इटैलियन लोकेल) तो a चलाएं dpkg-reconfigure: a

$> sudo dpkg-reconfigure locales

उसके बाद अपने अजगर के खोल में फिर से कोशिश करें:

>>> import locale
>>> locale.setlocale(locale.LC_ALL,'it_IT.UTF-8')

(यह इतालवी लोकेल के लिए है, जो मुझे चाहिए था)


13
यह प्रश्न विशेष रूप से विंडोज
क्रिस्टोफ

7

मुझे पता है कि यह सालों पहले पूछा गया है, लेकिन मुझे लगा कि मैं विंडोज पर पायथन 3.6 का उपयोग करके मुझे जो कुछ भी मिला है उसे जोड़ने की कोशिश करूंगा:

import locale
for x in locale.windows_locale.values():
    print(x.replace('_','-'))

मैंने कुछ कोशिश की और यह भी पता लगाने का एक तरीका प्रतीत होता है कि विंडोज पर क्या उपलब्ध है।

यह जानना अच्छा है: यह किसी कारण से पायथन के वर्तमान स्थिर संस्करण पर स्ट्रैप्टम () के अनुकूल नहीं है

और फिर आप बस स्थान निर्धारित करते हैं:

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)


4

Locale.setlocale डॉक्स से:

locale.setlocale(category, locale=None):
    """
    Set the locale for the given category.  The locale can be
    a string, an iterable of two strings (language code and encoding),
    or None.
    """"

लिनक्स (विशेषकर उबंटू) के तहत आप या तो उपयोग कर सकते हैं

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')

या

locale.setlocale(locale.LC_ALL, ('de', 'utf-8'))

यदि सिस्टम पर लोकेल स्थापित नहीं है, तो आपको वही त्रुटि मिलेगी । इसलिए, सुनिश्चित करें कि आपके पास आपके सिस्टम पर स्थापित लोकेल है:

$ locale -a # to list the currently installed locales
$ (sudo) locale-gen de_DE.UTF-8 # to install new locale
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.