我想为我的项目进行国际化。我遵循了官方文档中的描述,但本地化仍然不起作用。这是我尝试获取用户语言环境的方法:
def get_locale_name(request):
""" Return the :term:`locale name` associated with the current
request (possibly cached)."""
locale_name = getattr(request, 'locale_name', None)
if locale_name is None:
locale_name = negotiate_locale_name(request)
request.locale_name = locale_name
return locale_name
但是
request
没有属性“local_name”,但它有“Accept-Language”,因此当函数 get_local_name
在请求中找不到“local_name”时,它会调用另一个函数:def negotiate_locale_name(request):
""" Negotiate and return the :term:`locale name` associated with
the current request (never cached)."""
try:
registry = request.registry
except AttributeError:
registry = get_current_registry()
negotiator = registry.queryUtility(ILocaleNegotiator,
default=default_locale_negotiator)
locale_name = negotiator(request)
if locale_name is None:
settings = registry.settings or {}
locale_name = settings.get('default_locale_name', 'en')
return locale_name
我怎么能看到
negotiator
尝试从全局环境获取本地,但如果它不能这样做,它从配置中设置的值。而且我不明白为什么 Pyramid 不直接从请求的字段“接受语言”中获取语言环境?
而且,如何正确确定语言环境?
最佳答案
Pyramid 并没有规定应该如何协商语言环境。将站点语言基于“接受语言”标题可能会导致问题,因为大多数用户不知道如何设置他们的首选浏览器语言。确保您的用户可以轻松切换语言并使用 cookie 来存储该偏好以供将来访问。
您要么需要设置 _LOCALE_
key on the request (例如,通过事件处理程序),要么提供您自己的 custom locale negotiator 。
这是一个使用 NewRequest
event 和 accept_language
header 的示例,它是 webob Accept
class 的一个实例:
from pyramid.events import NewRequest
from pyramid.events import subscriber
@subscriber(NewRequest)
def setAcceptedLanguagesLocale(event):
if not event.request.accept_language:
return
accepted = event.request.accept_language
event.request._LOCALE_ = accepted.best_match(('en', 'fr', 'de'), 'en')
关于python - 确定 Pyramid 中的用户语言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11274420/