我试图以感知区域的方式对string列表进行sorting。 我已经使用Babel库来处理其他i18n相关任务,但不支持sorting。 Python的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
我究竟做错了什么?
看来你正在使用Windows。 区域设置字符串在那里不同。 更精确地看看文档:
locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform
在Windows上,我认为它会是这样的:
locale.setlocale(locale.LC_ALL, 'deu_deu')
MSDN有一个语言字符串和国家/地区字符串的列表
在Ubuntu上,你可能有这个问题,因为你的系统没有安装本地的。
从shell尝试一下:
$> locale -a
并检查是否找到您感兴趣的语言环境,否则您必须安装它:
$> sudo apt-get install language-pack-XXX
其中XXX是你的语言(在我的情况下“xxx = it”,意大利语区域)然后运行dpkg-reconfigure
:
$> sudo dpkg-reconfigure locales
之后,在你的python shell中再次尝试:
>>> import locale >>> locale.setlocale(locale.LC_ALL,'it_IT.UTF-8')
(这是意大利语区域,这是我所需要的)
你不应该传递一个明确的locale来setlocale,这是错误的。 让它从环境中找出来。 你必须传递一个空字符串
import locale locale.setlocale(locale.LC_ALL, '')
从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. """"
在Linux(特别是Ubuntu)下,你可以使用
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
这是在Windows上执行此操作的唯一方法(德语语言环境的示例):
import locale locale.setlocale(category=locale.LC_ALL, locale="German") # Not locale="de_DE"