在网页应用中使用Python本地化或等效方法?

9 投票
4 回答
4951 浏览
提问于 2025-04-15 15:00

Python的地区设置功能似乎想要从系统设置中读取地区信息,或者通过调用setlocale来设置地区。但这两种方法对我来说都不太好用,因为我想在一个网页应用中使用,想要的地区设置是用户的地区。

而且在地区文档中有一些警告,让人觉得这个功能有点可怕:

此外,有些实现方式存在问题,频繁更改地区设置可能会导致程序崩溃。这让正确使用地区设置变得有点麻烦。

还有

在某些库的例程中调用setlocale()通常是个坏主意,因为这会影响整个程序。

那么,在网页应用中有没有合理的地区设置替代方案呢?Babel是否合适,还是有其他选择?我希望找到一个可以处理货币、日期和数字格式的工具。

[更新] 为了更清楚,我最感兴趣的是不同地区的日期、数字和货币格式化。

4 个回答

0

Django的国际化框架解决了setlocale()的一些不足之处,因为它根本不使用这个方法。这样一来,每次请求时都会设置地区信息。如果你使用LocaleMiddleware,它可以根据用户的浏览器设置(也就是Accept-Language)来自动调整地区信息。想了解更多,可以查看文档

1

不要使用 setlocale。

看看 django 是怎么做的。他们似乎使用了 gettext 库的类 API,而不是使用 setlocale 函数,我敢打赌这样做是有原因的。

他们手动为每个线程存储一个 翻译,你可以在这里 查看 他们是怎么实现的(gettext 函数和 _active 字典)。

15

locale 对于需要支持多种地区设置的应用来说并不好用——它的设计真的不适合这些应用(基本上任何服务器端的应用,包括网页应用)。如果条件允许的话,PyICU 是一个非常优秀的解决方案——它提供了高质量的国际化和本地化支持,速度快,灵活性强(缺点是,虽然ICU的文档不错,但PyICU的文档就不太好;-)。可惜的是,并不是总能使用自己的扩展... :-(。

特别是,我仍在寻找一个适合App Engine应用的可靠国际化和本地化解决方案——“翻译”本身并不是最主要的问题(你可以直接切换到合适的模板),问题在于还有很多其他本地化的方面(这些方面ICU支持得很好,比如排序规则等等)。我想之前提到的Babel 是一个比较合理的起点。

撰写回答