Exemple #1
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)
Exemple #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)
 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
Exemple #4
0
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
 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
 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)
 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)
Exemple #8
0
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)
Exemple #9
0
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)
Exemple #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
    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
Exemple #12
0
 def select_language(cls, languages):
     request = get_request()
     accept = request.get_header('accept-language', default='')
     accept = AcceptLanguageType.decode(accept)
     return accept.select_language(languages)