コード例 #1
0
ファイル: Localizer.py プロジェクト: esosaja/erp5
    def translationContext(self, lang):
        """Context manager to temporarily change the current language.
      """

        class ForcedLanguage:
            __allow_access_to_unprotected_subobjects__ = 1

            def __init__(self, lang):
                self.lang = lang

            def select_language(self, available_languages):
                return self.lang

            def set(self, lang, priority):
                if lang != self.lang:
                    LOG("Localizer", PROBLEM, "Cannot change language inside a translationContext", error=1)

        MARKER = []
        from patches import get_request  # late import, as this is patched by

        # unit tests
        request = get_request()  # Localizer always use this request internally
        old_accept_language = request.get("AcceptLanguage", MARKER)
        request.set("AcceptLanguage", ForcedLanguage(lang))
        try:
            assert self.get_selected_language() == lang
            yield
        finally:
            request.other.pop("AcceptLanguage")
            if old_accept_language is not MARKER:
                request.set("AcceptLanguage", old_accept_language)
コード例 #2
0
    def translationContext(self, lang):
        """Context manager to temporarily change the current language.
      """
        class ForcedLanguage:
            __allow_access_to_unprotected_subobjects__ = 1

            def __init__(self, lang):
                self.lang = lang

            def select_language(self, available_languages):
                return self.lang

            def set(self, lang, priority):
                if lang != self.lang:
                    LOG('Localizer',
                        PROBLEM,
                        'Cannot change language inside a translationContext',
                        error=1)

        MARKER = []
        from patches import get_request  # late import, as this is patched by
        # unit tests
        request = get_request()  # Localizer always use this request internally
        old_accept_language = request.get('AcceptLanguage', MARKER)
        request.set('AcceptLanguage', ForcedLanguage(lang))
        try:
            assert self.get_selected_language() == lang
            yield
        finally:
            request.other.pop('AcceptLanguage')
            if old_accept_language is not MARKER:
                request.set('AcceptLanguage', old_accept_language)
コード例 #3
0
 def getLocalAttribute(self, id, lang=None):
     """Returns a local property"""
     if id not in self._local_properties:
         return ""
     # No language, look for the first non-empty available version or def.
     if lang is None:
         request = get_request()
         i18n = get_i18n_context()
         if i18n is None:  # didn't traverse any portal yet, e.g. zmi root
             lang = "en"
         else:
             neg = NyNegotiator(request=request, cookie_id=i18n["cookie_id"])
             # need to negotiate lang based on available langs for this prop.
             lang = neg.getLanguage(self._local_properties[id].keys(), fallback=False)
         if lang is None:
             # eg: we ask default (en), id has only 'de', lang is then None
             # because fallback=False (or else it would have been `de`)
             lang = i18n["default_language"]
     if lang not in self._local_properties[id]:
         return ""
     value = self._local_properties[id][lang]
     if isinstance(value, tuple):  # (value, timestamp)
         return value[0]
     else:
         return value
コード例 #4
0
ファイル: utils.py プロジェクト: eaudeweb/naaya
def lang_negotiator(available_languages):
    """
    Receives two ordered lists, the list of user preferred languages
    and the list of available languages. Returns the first user pref.
    language that is available, if none is available returns None.
    """
    request = get_request()
    if request is None:
        return None

    try:
        return request['EDW_SelectedLanguage'][tuple(available_languages)]
    except KeyError:
        pass

    try:
        accept = request['AcceptLanguage']
    except KeyError:
        if request.get('EDW_SelectedLanguage', None) is None:
            request['EDW_SelectedLanguage']= {}
        request['EDW_SelectedLanguage'][tuple(available_languages)] = None
        return None
    else:
        lang = accept.select_language(available_languages)

    # XXX Here we should set the Vary header, but, which value should it have??
##    response = request.RESPONSE
##    response.setHeader('Vary', 'accept-language')
##    response.setHeader('Vary', '*')

    if request.get('EDW_SelectedLanguage', None) is None:
        request['EDW_SelectedLanguage']= {}
    request['EDW_SelectedLanguage'][tuple(available_languages)] = lang
    return lang
コード例 #5
0
 def getLocalAttribute(self, id, lang=None):
     """Returns a local property"""
     if id not in self._local_properties:
         return ''
     # No language, look for the first non-empty available version or def.
     if lang is None:
         request = get_request()
         i18n = get_i18n_context()
         if i18n is None: # didn't traverse any portal yet, e.g. zmi root
             lang = 'en'
         else:
             neg = NyNegotiator(request=request, cookie_id=i18n['cookie_id'])
             # need to negotiate lang based on available langs for this prop.
             lang = neg.getLanguage(self._local_properties[id].keys(),
                                    fallback=False)
         if lang is None:
             # eg: we ask default (en), id has only 'de', lang is then None
             # because fallback=False (or else it would have been `de`)
             lang = i18n['default_language']
     if lang not in self._local_properties[id]:
         return ''
     value = self._local_properties[id][lang]
     if isinstance(value, tuple): # (value, timestamp)
         return value[0]
     else:
         return value
コード例 #6
0
 def __init__(self, cookie_id='LOCALIZER_LANGUAGE',
              policy=('path', 'url', 'cookie', 'browser'),
              request=None):
     """
         * `cookie_id` is a key looked up in cookies/querystrings
         * `policy` can be 'browser', 'url', 'path', 'cookie',
         or any combination as a list of priorities
     """
     self.cookie_id = cookie_id
     self.request = request
     if not isinstance(self.request, Request):
         self.request = get_request()
     self.set_policy(policy)
コード例 #7
0
 def __init__(self,
              cookie_id='LOCALIZER_LANGUAGE',
              policy=('path', 'url', 'cookie', 'browser'),
              request=None):
     """
         * `cookie_id` is a key looked up in cookies/querystrings
         * `policy` can be 'browser', 'url', 'path', 'cookie',
         or any combination as a list of priorities
     """
     self.cookie_id = cookie_id
     self.request = request
     if not isinstance(self.request, Request):
         self.request = get_request()
     self.set_policy(policy)
コード例 #8
0
ファイル: utils.py プロジェクト: zamananjum0/erp5
def lang_negotiator(available_languages):
    """Receives two ordered lists, the list of user preferred languages and
    the list of available languages. Returns the first user pref.  language
    that is available, if none is available returns None.
    """
    request = get_request()
    if request is None:
        return None

    try:
        accept = request['AcceptLanguage']
    except KeyError:
        return None

    return accept.select_language(available_languages)
コード例 #9
0
ファイル: utils.py プロジェクト: MarkTang/erp5
def lang_negotiator(available_languages):
    """Receives two ordered lists, the list of user preferred languages and
    the list of available languages. Returns the first user pref.  language
    that is available, if none is available returns None.
    """
    request = get_request()
    if request is None:
        return None

    try:
        accept = request['AcceptLanguage']
    except KeyError:
        return None

    return accept.select_language(available_languages)
コード例 #10
0
    def getLocalAttribute(self, id, lang=None, langFallback=False):
        """Returns a local property
        Note that langFallback is fallback to the bitter end - it will both try
        to find a non default language present and yet other languages
        if the one it found had empty values."""
        if id not in self._local_properties:
            return ''
        # No language, look for the first non-empty available version or def.
        if lang is None:
            request = get_request()
            i18n = get_i18n_context()
            if i18n is None:  # didn't traverse any portal yet, e.g. zmi root
                lang = 'en'
            else:
                neg = NyNegotiator()
                # need to negotiate lang based on available langs for this prop.
                lang = neg.getLanguage(self._local_properties[id].keys(),
                                       request,
                                       fallback=langFallback)
            if lang is None:
                # eg: we ask default (en), id has only 'de', lang is then None
                # because fallback=False (or else it would have been `de`)
                if i18n['default_language'] in self._local_properties[id]:
                    lang = i18n['default_language']
                else:
                    lang = 'en'

        if lang not in self._local_properties[id]:
            return ''

        value = self._getValue(id, lang)
        # perhaps we found a non default language but the values there are empty
        # TODO: do we really want such aggressive behaviour?
        # what if the client wants empty value for some languages?
        if langFallback and not value:
            for ln in self._local_properties[id]:
                value = self._getValue(id, ln)
                if value:
                    break
        return value
コード例 #11
0
    def getLocalAttribute(self, id, lang=None, langFallback=False):
        """Returns a local property
        Note that langFallback is fallback to the bitter end - it will both try
        to find a non default language present and yet other languages
        if the one it found had empty values."""
        if id not in self._local_properties:
            return ''
        # No language, look for the first non-empty available version or def.
        if lang is None:
            request = get_request()
            i18n = get_i18n_context()
            if i18n is None: # didn't traverse any portal yet, e.g. zmi root
                lang = 'en'
            else:
                neg = NyNegotiator()
                # need to negotiate lang based on available langs for this prop.
                lang = neg.getLanguage(self._local_properties[id].keys(),
                                       request, fallback=langFallback)
            if lang is None:
                # eg: we ask default (en), id has only 'de', lang is then None
                # because fallback=False (or else it would have been `de`)
                if i18n['default_language'] in self._local_properties[id]:
                    lang = i18n['default_language']
                else:
                    lang = 'en'

        if lang not in self._local_properties[id]:
            return ''

        value = self._getValue(id, lang)
        # perhaps we found a non default language but the values there are empty
        # TODO: do we really want such aggressive behaviour?
        # what if the client wants empty value for some languages?
        if langFallback and not value:
            for ln in self._local_properties[id]:
                value = self._getValue(id, ln)
                if value:
                    break
        return value
コード例 #12
0
ファイル: utils.py プロジェクト: eaudeweb/naaya
 def select_language(cls, languages):
     request = get_request()
     accept = request.get_header('accept-language', default='')
     accept = AcceptLanguageType.decode(accept)
     return accept.select_language(languages)