我想根据用户语言首选项对字符串列表进行排序。我有一个多语言的Python webapp,以这种方式对字符串进行排序的正确方法是什么?
我知道我可以设置语言环境,如下所示:
import locale
locale.setlocale(locale.LC_ALL, '')
但这应该在应用程序启动时完成(并且doc说它不是线程安全的!),根据当前用户(请求)设置在每个线程中设置它是否是个好主意?
我想像函数locale.strcoll(...)这样的东西,附加参数 - 用于排序的语言。
答案 0 :(得分:4)
我建议pyICU - IBM丰富的开源ICU国际化库的Python绑定。你制作一个Collator对象,例如用:
collator = PyICU.Collator.createInstance(PyICU.Locale.getFrance())
然后你可以排序,例如法语规则的utf-8编码字符串列表,例如使用thelist.sort(cmp=collator.compare)
。
我遇到的唯一问题是我发现没有好的打包,可立即使用的PyICU版本以及MacOSX的ICU - 我最终从源代码构建和安装:ICU自己的来源,3.6,来自here - 有Windows的二进制文件和几个Unix版本,但不适用于Mac;来自here的PyICU 0.8.1。
这些构建/安装问题的网络,以及Python绑定的文档有点少,如果你做了大量与i18n相关的工作,ICU真的是天赐之物,而PyICU是一个非常有用的绑定集合!
答案 1 :(得分:1)
您需要在pyICU下使用最新的ICU来获取最佳和最新的数据。
答案 2 :(得分:0)
鉴于文档警告,如果您尝试在不同的线程中不同地设置区域设置,那么您似乎是独立的。
如果您可以将问题拆分为每个区域设置一个线程,那么您是否可以使用Python 2.6的多处理将其拆分为每个区域设置一个子进程?
似乎解决这个问题的一切都必须是黑客攻击,你甚至可以考虑使用针对不同语言使用不同LC_ALL调用的命令行程序sort (1)
。
答案 3 :(得分:0)
另一种可能的解决方案是使用具有良好语言环境支持的SQL服务器(遗憾的是,sqlite不是一个选项)。然后我可以将所有数据放到临时内存表中并使用ORDER BY选择它们。 IMO它应该是比尝试将语言环境设置分配给多个进程更好的解决方案,如kaizer.se的回答所推荐。