我想为我的项目进行国际化。我按照官方文档中描述的方式进行了描述,但本地化仍无效。以下是我尝试获取用户区域设置的方法:
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
没有attr“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
尝试从全局环境中获取本地,但是如果它无法从config中设置它的设置值。
我无法理解为什么Pyramid不能直接从请求的字段“Accept-Language”获取语言环境?
而且,如何正确确定区域设置?
答案 0 :(得分:14)
Pyramid没有规定如何协商语言环境。在“Accept-Language”标题上添加站点语言可能会导致问题,因为大多数用户不知道如何设置首选的浏览器语言。确保您的用户可以轻松切换语言,并使用Cookie存储该偏好以供将来访问。
您需要设置_LOCALE_
key on the request(例如,通过事件处理程序),或者提供您自己的custom locale negotiator。
以下是使用NewRequest
event和accept_language
header的示例,webob Accept
class是{{3}}的一个实例:
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')
答案 1 :(得分:2)
请注意request._LOCALE_
仅适用,因为默认情况下,语言环境协商员是default_locale_negotiator
。如果您有非常复杂的检查,例如,如果cookie不存在,则必须从DB中获取用户,NewRequest处理程序确实会为不需要任何翻译的请求提供开销。对于他们,您还可以使用自定义区域设置协商器,例如:
def my_locale_negotiator(request):
if not hasattr(request, '_LOCALE_'):
request._LOCALE_ = request.accept_language.best_match(
('en', 'fr', 'de'), 'en')
return request._LOCALE_
from pyramid.config import Configurator
config = Configurator()
config.set_locale_negotiator(my_locale_negotiator)
答案 2 :(得分:0)
从金字塔1.5开始,您可以使用这些请求属性来访问当前区域设置:
request.localizer
Localizer
request.locale
与request.localizer.locale_name