src/pyams_i18n/attr.py
changeset 9 017ad36cc2ba
parent 2 a44a73ee12f9
child 80 e431dcf09302
equal deleted inserted replaced
8:44a92dc178ce 9:017ad36cc2ba
    14 
    14 
    15 
    15 
    16 # import standard library
    16 # import standard library
    17 
    17 
    18 # import interfaces
    18 # import interfaces
       
    19 from pyams_i18n.interfaces import II18n, INegotiator
    19 from zope.traversing.interfaces import ITraversable
    20 from zope.traversing.interfaces import ITraversable
    20 
    21 
    21 # import packages
    22 # import packages
    22 from pyams_utils.adapter import ContextAdapter, adapter_config
    23 from pyams_utils.adapter import adapter_config, ContextAdapter
       
    24 from pyams_utils.registry import query_utility
       
    25 from pyams_utils.request import check_request
    23 from pyramid.exceptions import NotFound
    26 from pyramid.exceptions import NotFound
    24 from zope.interface import Interface
    27 from zope.interface import Interface
    25 
    28 
    26 
    29 
    27 @adapter_config(name='i18n', context=Interface, provides=ITraversable)
    30 @adapter_config(name='i18n', context=Interface, provides=ITraversable)
    32         try:
    35         try:
    33             attr, lang = name.split(':')
    36             attr, lang = name.split(':')
    34             return getattr(self.context, attr, {}).get(lang)
    37             return getattr(self.context, attr, {}).get(lang)
    35         except AttributeError:
    38         except AttributeError:
    36             raise NotFound
    39             raise NotFound
       
    40 
       
    41 
       
    42 @adapter_config(context=Interface, provides=II18n)
       
    43 class I18nAttributeAdapter(ContextAdapter):
       
    44     """I18n attribute adapter"""
       
    45 
       
    46     def get_attribute(self, attribute, lang=None, request=None, default=None):
       
    47         result = getattr(self.context, attribute)
       
    48         if not isinstance(result, dict):
       
    49             return default
       
    50         if lang is None:
       
    51             if request is None:
       
    52                 request = check_request()
       
    53             lang = request.locale_name
       
    54         return result.get(lang, default)
       
    55 
       
    56     def query_attribute(self, attribute, lang=None, request=None):
       
    57         result = getattr(self.context, attribute)
       
    58         if not isinstance(result, dict):
       
    59             return result
       
    60         if lang is None:
       
    61             if request is None:
       
    62                 request = check_request()
       
    63             lang = request.locale_name
       
    64         value = result.get(lang)
       
    65         if not value:
       
    66             negotiator = query_utility(INegotiator)
       
    67             if (negotiator is not None) and (negotiator.server_language != lang):
       
    68                 value = result.get(negotiator.server_language)
       
    69         return value