src/pyams_utils/i18n.py
branchdev-tf
changeset 408 cf2304af0fab
parent 367 2c95d34496f5
equal deleted inserted replaced
407:0037199881fb 408:cf2304af0fab
     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)