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 |