# HG changeset patch # User Thierry Florac # Date 1550835138 -3600 # Node ID fecadd248cdb243ec9a694a33598b0035ca1065d # Parent e2aceb25e9a5ef1a242adfc21394b13a8cce9307 Added "++lang++" namespace traverser diff -r e2aceb25e9a5 -r fecadd248cdb src/pyams_i18n/negotiator.py --- a/src/pyams_i18n/negotiator.py Fri Dec 28 10:59:43 2018 +0100 +++ b/src/pyams_i18n/negotiator.py Fri Feb 22 12:32:18 2019 +0100 @@ -12,21 +12,19 @@ __docformat__ = 'restructuredtext' - -# import standard library - -# import interfaces -from pyams_i18n.interfaces import INegotiator, LANGUAGE_CACHE_KEY -from zope.i18n.interfaces import INegotiator as IZopeNegotiator - -# import packages -from pyams_utils.i18n import get_browser_language -from pyams_utils.registry import query_utility, utility_config, get_global_registry from persistent import Persistent from zope.container.contained import Contained +from zope.i18n.interfaces import INegotiator as IZopeNegotiator from zope.i18n.locales import locales -from zope.interface import implementer +from zope.interface import Interface, implementer from zope.schema.fieldproperty import FieldProperty +from zope.traversing.interfaces import ITraversable + +from pyams_i18n.interfaces import INegotiator, LANGUAGE_CACHE_KEY +from pyams_skin.layer import IPyAMSUserLayer +from pyams_utils.adapter import ContextRequestAdapter, adapter_config +from pyams_utils.i18n import get_browser_language +from pyams_utils.registry import get_global_registry, query_utility, utility_config @implementer(INegotiator) @@ -40,6 +38,11 @@ def get_language(self, request): """See :intf:`INegotiator`""" + + # lang parameter, if defined, is of higher priority + if 'lang' in request.params: + return request.params['lang'] + policies = self.policy.split(' --> ') for policy in policies: @@ -84,8 +87,25 @@ pass +@adapter_config(name='lang', context=(Interface, IPyAMSUserLayer), provides=ITraversable) +class LangNamespaceTraverser(ContextRequestAdapter): + """++lang++ namespace traverser + + This traverser is mainly used for backward compatibility with previous Zope 3 websites. + """ + + def traverse(self, name, furtherpath=None): + if name != '*': + self.request.GET['lang'] = name + return self.context + + def locale_negotiator(request): - """Negotiate language based on server, browser and user settings""" + """Negotiate language based on server, browser, request and user settings + + Locale is extracted from request's "lang" parameter, from browser settings or from + negotiator utility + """ negotiator = query_utility(INegotiator) if negotiator is not None: locale_name = negotiator.get_language(request) @@ -101,7 +121,7 @@ def get_locale(request): - """Get zope.i18n locale attribute""" + """Get zope.i18n "locale" attribute""" return locales.getLocale(request.locale_name)