4

我想根据用户语言偏好对字符串列表进行排序。我有一个多语言 Python webapp,以这种方式对字符串进行排序的正确方法是什么?

我知道我可以设置语言环境,如下所示:

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

但这应该在应用程序启动时完成(并且文档说它不是线程安全的!),根据当前用户(请求)设置在每个线程中设置它是个好主意吗?

我想要带有附加参数的函数 locale.strcoll(...) 之类的东西 - 用于排序的语言。

4

4 回答 4

4

我会推荐pyICU ——IBM 丰富的开源ICU国际化库的 Python 绑定。您制作一个 Collat​​or 对象,例如:

    collator = PyICU.Collator.createInstance(PyICU.Locale.getFrance())

然后您可以按照法语规则对 utf-8 编码字符串列表进行排序,例如使用thelist.sort(cmp=collator.compare).

我遇到的唯一问题是,我没有找到好的打包、立即可用的 PyICU plus ICU for MacOSX 版本——我最终从源代码构建和安装:ICU 自己的源代码,3.6,来自这里——有 Windows 的二进制文件和几个那里有 Unix 版本,但不适用于 Mac;PyICU 0.8.1 从这里开始

除去这些构建/安装问题,以及 Python 绑定的文档很少,如果你做大量与 i18n 相关的工作,ICU 真的是天赐之物,而且 PyICU 是一组非常有用的绑定!

于 2009-10-06T17:50:30.547 回答
1

您将希望您的 pyICU 下可能有最新的 ICU,以获取最佳和最新的数据。

于 2009-10-08T19:18:36.560 回答
0

鉴于文档警告,如果您尝试在不同的线程中设置不同的语言环境,您似乎只能靠自己了。

如果您可以将您的问题拆分为每个区域设置一个线程,您是否最好使用 Python 2.6 的多处理将其拆分为每个区域设置的一个子进程?

似乎解决这个问题的一切都必须是一个 hack,您甚至可以考虑使用sort (1)针对不同语言使用不同 LC_ALL 调用的命令行程序。

于 2009-10-06T15:57:48.630 回答
0

另一种可能的解决方案是使用具有良好语言环境支持的 SQL 服务器(不幸的是,sqlite 不是一个选项)。然后我可以将所有数据放入临时内存表并使用 ORDER BY 选择它们。IMO 它应该是比 kaizer.se 的回答所建议的尝试将区域设置分配给多个进程更好的解决方案。

于 2009-10-09T08:29:49.313 回答