Source code for pyams_i18n.attr

#
# 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