Как найти все доступные локали в Python - PullRequest
0 голосов
/ 15 ноября 2018

Как мне (в системе GNU / Linux) найти все доступные локали для использования с модулем locale?

Единственное, что я нахожу рядом с модулем - это словарь locale_alias с псевдонимами для локалей. Иногда упоминается, где искать, какие у вас локали, но не все псевдонимы. На моей системе эта программа

#! /usr/bin/python3
import locale
for k, v in sorted(locale.locale_alias.items()):
    if k.startswith('fr_') or v.startswith('fr_'):
        print('{:20}{}'.format(k, v))

печать

c-french            fr_CA.ISO8859-1
fr                  fr_FR.ISO8859-1
fr_be               fr_BE.ISO8859-1
fr_ca               fr_CA.ISO8859-1
fr_ch               fr_CH.ISO8859-1
fr_fr               fr_FR.ISO8859-1
fr_lu               fr_LU.ISO8859-1
français            fr_FR.ISO8859-1
fre_fr              fr_FR.ISO8859-1
french              fr_FR.ISO8859-1
french.iso88591     fr_CH.ISO8859-1
french_france       fr_FR.ISO8859-1

игнорирует все локали utf-8, например 'fr_FR.utf8', которые действительно могут использоваться в качестве аргумента для locale.setlocale. Из оболочки locale -a | grep "^fr_.*utf8" дает

fr_BE.utf8
fr_CA.utf8
fr_CH.utf8
fr_FR.utf8
fr_LU.utf8

показывает множество вариантов. (Конечно, можно запустить эту команду оболочки из Python, но я бы подумал, что есть способ сделать это напрямую из Python.)

1 Ответ

0 голосов
/ 20 февраля 2019

Кажется, что нет хорошего способа сделать это напрямую из Python, поэтому я отвечу, как запустить эту команду оболочки из Python.

#! /usr/bin/python3
import subprocess

def find_locales():
    out = subprocess.run(['locale', '-a'], stdout=subprocess.PIPE).stdout
    try:
        # Even though I use utf8 on my system output from "locale -a"
        # included "bokmål" in Latin-1. Then this won't work, but the
        # exception will.
        res = out.decode('utf-8')
    except:
        res = out.decode('latin-1')
    return res.rstrip('\n').splitlines()

if __name__ == "__main__":
    for loc in find_locales():
        print(loc)

Обратите внимание, что subprocess.run является новым в Python 3.5. Для более ранних версий Python см. Этот вопрос об альтернативных способах запуска команд оболочки.

...