#
# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
__docformat__ = 'restructuredtext'
# import standard library
# import interfaces
from pyams_i18n.interfaces import II18n, INegotiator
from zope.traversing.interfaces import ITraversable
# import packages
from pyams_utils.adapter import adapter_config, ContextAdapter
from pyams_utils.registry import query_utility
from pyams_utils.request import check_request
from pyramid.exceptions import NotFound
from zope.interface import Interface
[docs]@adapter_config(name='i18n', context=Interface, provides=ITraversable)
class I18nAttributeTraverser(ContextAdapter):
"""++i18n++attr:lang namespace traverser"""
[docs] def traverse(self, name, furtherpath=None):
try:
attr, lang = name.split(':')
return getattr(self.context, attr, {}).get(lang)
except AttributeError:
raise NotFound
[docs]@adapter_config(context=Interface, provides=II18n)
class I18nAttributeAdapter(ContextAdapter):
"""I18n attribute adapter"""
[docs] def get_attribute(self, attribute, lang=None, request=None, default=None):
result = getattr(self.context, attribute)
if not isinstance(result, dict):
return default
if lang is None:
if request is None:
request = check_request()
lang = request.params.get('lang') or request.locale_name
return result.get(lang, default)
[docs] def query_attribute(self, attribute, lang=None, request=None):
result = getattr(self.context, attribute)
if not isinstance(result, dict):
return result
if lang is None:
if request is None:
request = check_request()
lang = request.params.get('lang') or request.locale_name
value = result.get(lang)
if not value:
negotiator = query_utility(INegotiator)
if (negotiator is not None) and (negotiator.server_language != lang):
value = result.get(negotiator.server_language)
return value