前面已经基本展示了Pyramid项目国际化的过程,下面再来看看一些零零碎碎的特殊情况处理。
四、使用Localizer
尽管Pyramid在模版处理中会自动进行语言版本的切换,有的时候,我们还是希望能够手工处理的语言转换。这种时候,我们就需要用pyramid.i18n.get_localizer来得到一个Localizer。该方法得到一个系统默认的或Locale协商程序返回的Localizer。得到Localizer之后,我们就可以调用其方法进行一些特别处理了。
1. 手工语言版本切换
ts = TranslationString('Add ${number}', mapping={'number':1}, domain='MyProject')
localizer = get_localizer(request)
translated = localizer.translate(ts)
这里得到的translated就是按照request中的locale信息进行切换之后的内容。
2. 复数切换
localizer.pluralize(singular, plural, n, domain=None, mapping=None)
根据n的值是单、复数显示singular或plural。
注,个人感觉Pyramid中复数的实现有点问题,也可能文档写的不够详细,以后再看看代码实现吧。
五、locale相关的一些配置
1. 默认locale配置
Pyramid配置文件(ini)中提供了一默认locale配置default_locale_name,开发者可以变更该值来指定默认语言环境。
2. 支持语言列表
Pyramid不提供自动地支持语言列表生成,但开发者可以在配置文件中地[app:main]节中定义类似配置:
available_languages = fr de en ru
然后在程序中读取出来即可。这样可以避免系统将一些翻译还不完整地语言版本也显示出来。
3. 读取得Locale名字
可以通过以下几种方式读取locale名字:
* pyramid.i18n.get_locale_name(request),第一次读取locale后,其结果会缓存在request中,供后续使用。可以用下面的方法每次都重新读取。
* pyramid.i18n.negotiate_locale_name(request)。
* 也可以通过pyramid.i18n.get_localizer(request).locale_name得到locale名。
六、Locale协商
Locale协商是指对一次请求应该采用那种locale进行处理地过程。Locale协商程序接收request参数,并返回合适的locale名字。该程序在get_localizer、get_locale_name、negotiate_locale_name等地方被调用。
1. 默认的Locale协商程序
大多数程序没有特殊需要时都可以用默认的Locale协商程序来确定locale,无需更多编程。
默认的Locale协商程序通过以下顺序来判断locale:
* 查看request的_LOCALE_属性(可能在视图或事件处理中指定)
* 查看request.params['_LOCALE_']
* 查看request.cookies['_LOCALE_']
* 在request中找不到,取出定义在ini中的默认locale名字
* 如果还是找不到,直接用en
2. 自定义Locale协商程序
我们可以自定义这个Locale协商程序,如下:
def my_locale_negotiator(request):
locale_name = request.params.get('my_locale')
return locale_name
上例就是定义了一个简单的协商程序,它至查看request.params中的my_locale,如果找不到,则采用默认的locale(ini)。
通过set_locale_negotiator()可以将这个协商程序配置进应用,如:
from pyramid.config import Configurator
config = Configurator()
config.set_locale_negotiator(my_locale_negotiator)
七、日期和货币的格式化
Pyramid默认不带日期、货币等的格式化,不过既然已经安装了Babel,就可以利用现成的Babel来做这方面的事情。如:
1. 日期的本地格式化
>>> Locale('en', 'US').periods['am']
u'AM'
>>> Locale('de', 'DE').days['format']['wide'][3]
u'Donnerstag'
2. 货币的本地格式化
>>> Locale('en').currencies['COP']
u'Colombian Peso'
>>> Locale('de', 'DE').currencies['COP']
u'Kolumbianischer Peso'
>>> Locale('en', 'US').currency_symbols['USD']
u'$'
>>> Locale('es', 'CO').currency_symbols['USD']
u'US$'
更多的Babel方法操作查看Babel文档。
八、Chameleon模版支持
一旦在模版渲染的时候传入的参数中使用了翻译字串,系统会自动根据request中的locale设置进行语言切换。
九、打包
在目前这种配置下,将整个项目打包发布是不会将mo文件打到发行包中的。如果需要,则需要在setup.py中的setup函数中再加一个参数:
package_data={'myproject': ['locale/*/LC_MESSAGES/*.mo']},
No comments:
Post a Comment