Cách chính xác để đặt ngôn ngữ của Python trên Windows là gì?


80

Tôi đang cố gắng sắp xếp danh sách các chuỗi theo cách nhận biết ngôn ngữ. Tôi đã sử dụng thư viện Babel cho các tác vụ khác liên quan đến i18n, nhưng nó không hỗ trợ sắp xếp. localeMô-đun của Python cung cấp một strcollhàm, nhưng yêu cầu ngôn ngữ của quy trình phải được đặt thành ngôn ngữ mà tôi muốn làm việc. Hơi đau, nhưng tôi có thể sống với nó.

Vấn đề là dường như tôi không thể thực sự đặt ngôn ngữ. Các tài liệu hướng dẫn cho các localemô-đun cho ví dụ này:

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

Khi tôi chạy nó, tôi nhận được điều này:

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

Tôi đang làm gì sai?

Câu trả lời:


109

Có vẻ như bạn đang sử dụng Windows. Các chuỗi ngôn ngữ khác nhau ở đó. Hãy xem tài liệu chính xác hơn:

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

Trên Windows, tôi nghĩ nó sẽ giống như:

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

MSDN có một danh sách các chuỗi ngôn ngữ và các chuỗi quốc gia / khu vực


5
FWIW, tôi đã có vấn đề dưới Ubuntu 13.04, Linux 3.8.0-19với trăn 2.7.4khi cố gắng thiết lập miền địa phương để fr_FR. Đặt nó để fr_FR.UTF-8làm việc cho tôi.
Zoneur

Đối với Python 3.6.3 trong Conda 4.4.11, Windows 7, các chuỗi ngôn ngữ dường như giống với hệ điều hành khác.
srodriguex


2
Các tài liệu được liên kết dường như quá gần đây cho WServer2018R2 mà tôi phải sử dụng 'eng_usa'( 'en_US'không hoạt động)
Boop

17

Đây là cách chính xác duy nhất để sử dụng nó, cung cấp một ví dụ cho ngôn ngữ Đức:

import locale

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

1
Đây là câu trả lời duy nhất thực sự trả lời câu hỏi.
Tầm quan

điều này đã giúp tôi, nhưng tôi phải thay đổi Germanthành Portuguese_Brazil.1252. Bạn có biết một tài liệu liệt kê những giá trị này không?
Henrique Brisola

15

Bạn không nên chuyển một ngôn ngữ rõ ràng cho setlocale, điều đó là sai. Hãy để nó tìm ra từ môi trường. Bạn phải chuyển cho nó một chuỗi rỗng

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

10
Tôi không đề cập đến vấn đề này trong câu hỏi vì nó không liên quan trực tiếp, nhưng mã tôi đang viết vào thời điểm đó được thiết kế để sử dụng trên máy chủ web. Nói cách khác, ngôn ngữ có thể thay đổi theo từng yêu cầu và không nhất thiết phải giống với ngôn ngữ của môi trường.
DNS

2
DNS: Bạn đã đọc tài liệu về ngôn ngữ chưa? Nó ngụ ý rằng nó có thể nguy hiểm khi gọi setlocale "nhiều" và nó không an toàn cho chuỗi. Vì vậy, có lẽ cái gì đó khác ngoài setlocale là giải pháp. Gettext có thể tải các danh mục khác nhau và chuyển đổi trong thời gian chạy chẳng hạn; nhưng tôi không biết bạn đang sử dụng ngôn ngữ để làm gì.
u0b34a0f6ae 10/09/09

Trừ khi người dùng của bạn không ở trên máy cục bộ của bạn
Gabriel

8

Ubuntu

Trên Ubuntu, bạn có thể gặp sự cố này vì bạn chưa cài đặt cục bộ đó trên hệ thống của mình.

Từ shell thử a:

$> locale -a

và kiểm tra xem bạn có tìm thấy ngôn ngữ mình quan tâm hay không. Nếu không, bạn phải cài đặt nó:

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

trong đó XXX là ngôn ngữ của bạn (trong trường hợp của tôi là "xxx = it", ngôn ngữ tiếng Ý) Sau đó, hãy chạy dpkg-reconfigure:

$> sudo dpkg-reconfigure locales

Sau đó, hãy thử lại trong trình bao python của bạn:

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

(cái này dành cho ngôn ngữ Ý, đó là thứ tôi cần)


13
Câu hỏi này hỏi cụ thể về Windows
Christoph

7

Tôi biết điều này đã được hỏi nhiều năm trước, nhưng tôi nghĩ rằng tôi sẽ thử thêm những gì tôi đã tìm ra, bằng cách sử dụng Python 3.6 trên Windows:

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

Tôi đã thử một số và đó dường như cũng là một cách để tìm hiểu, những gì có sẵn trên Windows.

Điều cần biết: Điều này vì một số lý do không tương thích với strptime () ở phiên bản ổn định hiện tại của Python

Và sau đó bạn chỉ cần đặt ngôn ngữ:

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)


4

Từ tài liệu 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.
    """"

Trong Linux (đặc biệt là Ubuntu), bạn có thể sử dụng

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

hoặc là

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

Bạn sẽ gặp lỗi tương tự nếu ngôn ngữ không được cài đặt trên hệ thống. Vì vậy, hãy đảm bảo rằng bạn đã cài đặt ngôn ngữ trên hệ thống của mình:

$ locale -a # to list the currently installed locales
$ (sudo) locale-gen de_DE.UTF-8 # to install new locale
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.