locale.getlocale () проблемы на OSX - PullRequest
       19

locale.getlocale () проблемы на OSX

1 голос
/ 27 октября 2009

Мне нужно, чтобы языковой стандарт системы выполнял несколько задач, в конечном итоге я хочу перевести свое приложение с помощью gettext. Я собираюсь распространять его как на Linux, так и на OSX, но я столкнулся с проблемами на OSX Snow Leopard:

$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'sv_SE.UTF-8'
>>> locale.getlocale()
('sv_SE', 'UTF8')

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'C'
>>> locale.getlocale()
(None, None)

Обе системы используют шведские языки. В Linux переменная среды LANG уже установлена ​​на «sv_SE.UTF-8». Если я передам эту переменную python в OSX (вместо LANG="sv_SE.UTF-8" python), локаль будет обнаружена хорошо. Но разве locale.getlocale() не может быть в состоянии выбрать любой язык операционной системы? Я не хочу заставлять пользователей устанавливать LANG, LC_ALL или любую переменную окружения вообще.

Вывод команды locale:

$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

Ответы [ 5 ]

3 голосов
/ 11 января 2012

Якобы ужасный взлом, но я вставил это:

import platform

# ...

# XXX horrendous OS X invalid locale hack
if platform.system() == 'Darwin':
    import locale
    if locale.getlocale()[0] is None:
        locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

в начале программы mine . После этого я мог запускать свою программу, используя неизмененную оболочку, на всех соответствующих мне ОС (в любом случае моя программа определяет язык, который будет использоваться в дальнейшем при обработке).

3 голосов
/ 27 октября 2009

Нечетно на OSX (Smow Leopard 10.6.1) Я получаю

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.  
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, '')
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

Edit:

Я только что нашел это в списке рассылки apple python

В основном это зависит от того, что установлено в вашей среде во время выполнения (один из LANG, LANGUAGE, LC_ALL). В моей оболочке LANG = en_GB.UTF-8

2 голосов
/ 27 октября 2009

Похоже, вы можете изменить локаль, изменив переменную окружения LC_ALL.

$ export LC_ALL=C
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'C'
>>> locale.getlocale()
(None, None)    

$ export LC_ALL=en_GB.UTF-8
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')
1 голос
/ 01 марта 2016

Старый вопрос, но это может помочь другим: это ошибка Python, которая по состоянию на март 2016 года все еще не устранена в Python 2 или 3: https://bugs.python.org/issue18378.

Суть в том, что Python предполагает GNU-подобные локали и ограничивает (POSIXly правильные) расхождения, как в средах BSD (как и в OS X). И локаль UTF8 существует в BSD, а не в Linux, поэтому проблема.

Что касается решений или отладки: локальные переменные среды могут быть установлены Terminal.app (см. Предпочтения - Профили - Дополнительно - Международный; аналогично для iTerm или чего-либо другого). Таким образом, можно найти переменные окружения локали, установленные в окне терминала, но найти переменные, НЕ установленные при запуске упакованного приложения.

В некоторых случаях (например, Sphinx в python 2.7 и 3.5 умирает в OS X из-за «ValueError: неизвестная локаль: UTF-8»), отключение флажка предпочтения для установки переменных среды локали является решением.

Но это может вызвать проблемы в других программах: если переменные локали не установлены, bash 4.3 (из MacPorts) будет выдавать сообщение при каждом запросе с предупреждением «предупреждение: setlocale: LC_CTYPE: не может изменить локаль (): такого файла или каталога нет "...

Таким образом, учитывая, что ошибка в Python, обходной путь, вероятно, должен быть сделан в программе на python (как в ответе @Jacob Oscarson) или в вызове python (путем установки в качестве значения локали vars некоторого адекватного значения).

1 голос
/ 31 июля 2013

С здесь : попробуйте добавить или отредактировать файл ~/.profile или ~/.bash_profile, чтобы он правильно экспортировал настройки локали при запуске нового сеанса.

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8
...