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 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
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 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)
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 select_language(cls, languages): request = get_request() accept = request.get_header('accept-language', default='') accept = AcceptLanguageType.decode(accept) return accept.select_language(languages)