8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
10 # FOR A PARTICULAR PURPOSE. |
10 # FOR A PARTICULAR PURPOSE. |
11 # |
11 # |
12 |
12 |
13 """I18n module used to get browser language from request""" |
13 """PyAMS_utils.i18n module |
14 |
14 |
15 __docformat__ = 'restructuredtext' |
15 This module is used to get browser language from request |
|
16 """ |
16 |
17 |
17 import locale |
18 import locale |
18 |
19 |
19 |
20 |
|
21 __docformat__ = 'restructuredtext' |
|
22 |
|
23 |
20 def normalize_lang(lang): |
24 def normalize_lang(lang): |
21 """Normalize input languages string""" |
25 """Normalize input languages string |
22 lang = lang.strip().lower() |
26 |
23 lang = lang.replace('_', '-') |
27 >>> from pyams_utils.i18n import normalize_lang |
24 lang = lang.replace(' ', '') |
28 >>> lang = 'fr,en-US ; q=0.9, en-GB ; q=0.8, en ; q=0.7' |
25 return lang |
29 >>> normalize_lang(lang) |
|
30 'fr,en-us;q=0.9,en-gb;q=0.8,en;q=0.7' |
|
31 """ |
|
32 return lang.strip() \ |
|
33 .lower() \ |
|
34 .replace('_', '-') \ |
|
35 .replace(' ', '') |
26 |
36 |
27 |
37 |
28 def get_browser_language(request): |
38 def get_browser_language(request): |
29 """Custom locale negotiator |
39 """Custom locale negotiator |
30 |
40 |
31 Copied from zope.publisher code |
41 Copied from zope.publisher code |
|
42 |
|
43 >>> from pyramid.testing import DummyRequest |
|
44 >>> from pyams_utils.i18n import get_browser_language |
|
45 |
|
46 >>> request = DummyRequest() |
|
47 >>> request.headers['Accept-Language'] = 'fr, en-US ; q=0.9, en-GB ; q=0.8, en ; q=0.7' |
|
48 >>> get_browser_language(request) |
|
49 'fr' |
32 """ |
50 """ |
33 accept_langs = request.headers.get('Accept-Language', '').split(',') |
51 accept_langs = request.headers.get('Accept-Language', '').split(',') |
34 |
52 |
35 # Normalize lang strings |
53 # Normalize lang strings |
36 accept_langs = [normalize_lang(l) for l in accept_langs] |
54 accept_langs = [normalize_lang(l) for l in accept_langs] |
73 |
91 |
74 return [lang for _, lang in accepts][0] if accepts else None |
92 return [lang for _, lang in accepts][0] if accepts else None |
75 |
93 |
76 |
94 |
77 def set_locales(config): |
95 def set_locales(config): |
78 """Define locale environment variables""" |
96 """Define locale environment variables |
|
97 |
|
98 :param config: Pyramid's settings object |
|
99 """ |
79 for attr in ('LC_CTYPE', 'LC_COLLATE', 'LC_TIME', 'LC_MONETARY', 'LC_NUMERIC', 'LC_ALL'): |
100 for attr in ('LC_CTYPE', 'LC_COLLATE', 'LC_TIME', 'LC_MONETARY', 'LC_NUMERIC', 'LC_ALL'): |
80 value = config.get('pyams.locale.{0}'.format(attr.lower())) |
101 value = config.get('pyams.locale.{0}'.format(attr.lower())) |
81 if value: |
102 if value: |
82 locale.setlocale(getattr(locale, attr), value) |
103 locale.setlocale(getattr(locale, attr), value) |