示例#1
0
    def getPreferredLanguages(self):
        """See the IRequestPreferredLanguages interface"""

        codes = IUserPreferredLanguages(self.request).getPreferredLanguages()
        languageset = getUtility(ILanguageSet)
        languages = set()

        for code in codes:
            # We need to ensure that the code received contains only ASCII
            # characters otherwise SQLObject will crash if it receives a query
            # with non printable ASCII characters.
            if isinstance(code, str):
                try:
                    code = code.decode('ASCII')
                except UnicodeDecodeError:
                    # skip language codes that can't be represented in ASCII
                    continue
            else:
                try:
                    code = code.encode('ASCII')
                except UnicodeEncodeError:
                    # skip language codes that can't be represented in ASCII
                    continue
            code = languageset.canonicalise_language_code(code)
            try:
                languages.add(languageset[code])
            except KeyError:
                pass

        languages = [language for language in languages if language.visible]
        return sorted(languages, key=lambda x: x.englishname)
    def getPreferredLanguages(self):
        # If the default locale negotiater can get a value,
        # that means we had a parameter or one of the cookies
        # (because of the subscriber that gets us here).

        negotiated = default_locale_negotiator(self.request)
        if negotiated:
            return [negotiated]

        # Here is where we would check for something during traversal,
        # but we don't actually support that at this time because it
        # relies on implementation details

        # Is there a non-default user preference? Right now we know
        # what a default is due to implementation details above. We also
        # know for sure that we *have* a remote use, otherwise we wouldn't
        # be here
        remote_user = IPrincipal(self.request, None)
        remote_user_langs = IUserPreferredLanguages(remote_user)
        if remote_user_langs is not EnglishUserPreferredLanguagesImpl:
            return remote_user_langs.getPreferredLanguages() # pylint:disable=too-many-function-args

        # Ok, see what the HTTP request can come up with. Note that we're
        # going to the Zope interface so that we don't get into an infinite
        # loop
        browser_request = IBrowserRequest(self.request)
        browser_langs = IModifiableUserPreferredLanguages(browser_request)
        return browser_langs.getPreferredLanguages() # pylint:disable=too-many-function-args
def preferred_language_locale_negotiator(request):
    """
    A pyramid locale negotiator that piggybacks off
    the preferred language support. We return a valid locale
    name consisting of at most language-territory, but at least language.
    A valid locale is one for which we have available locale data,
    not necessarily one for which any translation data is available.
    """
    # pylint:disable=too-many-function-args, assignment-from-no-return

    # This code is similar to that in zope.publisher.http.HTTPRequest.
    # it's point is to find the most specific available locale possible.
    # We differ in that, instead of returning a generic default, we
    # specifically return the english default. We also differ in that we
    # return a locale name instead of a locale object.

    result = EnglishUserPreferredLanguagesImpl.PREFERRED_LANGUAGES[0]

    pref_langs = IUserPreferredLanguages(request, ())
    if pref_langs:
        pref_langs = pref_langs.getPreferredLanguages()

    for lang in pref_langs:
        parts = (lang.split('-') + [None, None])[:3]
        try:
            locales.getLocale(*parts)
            result = lang
            break
        except LoadLocaleError: # pragma: no cover
            continue

    return result
示例#4
0
def adjust_request_interface_for_preferred_languages(event):
    """
    Checks the conditions outlined in this package's documentation and
    adds a marker interface (:class:`.IPreferredLanguagesRequest`) to
    the request if they hold true.

    This is registered as a subscriber for Pyramid's
    :class:`.IContextFound` event by this package's ``configure.zcml``
    """
    request = event.request
    # Does pyramid's default negotiator, which uses explicit settings
    # like a request param or cookie have an answer? If so, we need
    # our custom policy...these override the Accept-Language header
    if default_locale_negotiator(request):
        interface.alsoProvides(request, IPreferredLanguagesRequest)
        return

    # What about the zope/plone cookie?
    if request.cookies.get('I18N_LANGUAGE'):
        # For benefit of the default localization machinery
        # in case it's used, copy
        request._LOCALE_ = request.cookies.get('I18N_LANGUAGE')
        interface.alsoProvides(request, IPreferredLanguagesRequest)
        return

    # Ok, is there an authenticated user with preferred languages?
    # (We leave detecting defaults up to the actual policy)
    remote_user = IPrincipal(request, None)
    if remote_user and not IUnauthenticatedPrincipal.providedBy(remote_user):
        remote_user_langs = IUserPreferredLanguages(remote_user)
        if remote_user_langs and remote_user_langs.getPreferredLanguages():  # pylint:disable=too-many-function-args
            interface.alsoProvides(request, IPreferredLanguagesRequest)
示例#5
0
    def normalize(self, text):
        """Returns a normalized Unicode string."""
        locale = None
        langs = IUserPreferredLanguages(self.context).getPreferredLanguages()
        if langs:
            locale = langs[0]

        util = queryUtility(IURLNormalizer)
        return util.normalize(text, locale=locale)
示例#6
0
def hour_time_formatter(self, timeobj):
    """uses zope.i18n.locales to determine hour/min format
    """

    #grab locale from request
    languages = IUserPreferredLanguages(self.request)
    langs = languages.getPreferredLanguages()
    if langs:
        parts = (langs[0].split('-') + [None, None])[:3]
    else:
        parts = (None, None, None)
    locale = locales.getLocale(*parts)

    #create formatted hour minute string
    formatter = locale.dates.getFormatter('time', 'short')
    return formatter.format(timeobj)
示例#7
0
def _getLocale(request):
    envadapter = IUserPreferredLanguages(request, None)
    if envadapter is None:
        return None

    langs = envadapter.getPreferredLanguages()
    for httplang in langs:
        parts = (httplang.split('-') + [None, None])[:3]
        try:
            return locales.getLocale(*parts)
        except LoadLocaleError:
            # Just try the next combination
            pass
    else:
        # No combination gave us an existing locale, so use the default,
        # which is guaranteed to exist
        return locales.getLocale(None, None, None)
示例#8
0
 def getLanguage(self):
     """
     Ogone requires en_EN or en_US language id
     We are parsing the request to get the right
     Note: took this code from getpaid.ogone (thanks)
     """
     languages = IUserPreferredLanguages(self.context.REQUEST)
     langs = languages.getPreferredLanguages()
     if langs:
         language = langs[0]
     else:
         plone_props = getToolByName(self.context, 'portal_properties')
         language = plone_props.site_properties.default_language
     language = language.split('-')
     if len(language) == 1:
         language.append(language[0])
     language = language[:2]
     return "_".join(language)
示例#9
0
 def getLanguage(self, langs, env):
     envadapter = IUserPreferredLanguages(env)
     userlangs = envadapter.getPreferredLanguages()
     # Prioritize on the user preferred languages.  Return the
     # first user preferred language that the object has available.
     langs = normalize_langs(langs)
     for lang in userlangs:
         if lang in langs:
             return langs.get(lang)
         # If the user asked for a specific variation, but we don't
         # have it available we may serve the most generic one,
         # according to the spec (eg: user asks for ('en-us',
         # 'de'), but we don't have 'en-us', then 'en' is preferred
         # to 'de').
         parts = lang.split('-')
         if len(parts) > 1 and parts[0] in langs:
             return langs.get(parts[0])
     return None
示例#10
0
 def browser_language(self):
     language = 'en'
     pl = IUserPreferredLanguages(self.request)
     if pl is not None:
         languages = pl.getPreferredLanguages()
         for httplang in languages:
             parts = (httplang.split('-') + [None, None])[:3]
             if parts[0] == parts[1]:
                 # Avoid creating a country code for simple languages codes
                 parts = [parts[0], None, None]
             try:
                 locale = locales.getLocale(*parts)
                 language = locale.getLocaleID().replace('_', '-').lower()
                 break
             except LoadLocaleError:
                 # Just try the next combination
                 pass
     return language
示例#11
0
def getLanguage(self, langs, env):
    envadapter = IUserPreferredLanguages(env)
    userlangs = envadapter.getPreferredLanguages()
    # Always add the template language to the available ones. This allows the
    # template language to be picked without the need for a message catalog
    # for every domain for it to be registered.
    langs = list(langs) + TEMPLATE_LANGUAGE
    # Prioritize on the user preferred languages.  Return the
    # first user preferred language that the object has available.
    langs = normalize_langs(langs)
    for lang in userlangs:
        if lang in langs:
            return langs.get(lang)
        # If the user asked for a specific variation, but we don't
        # have it available we may serve the most generic one,
        # according to the spec (eg: user asks for ('en-us',
        # 'de'), but we don't have 'en-us', then 'en' is preferred
        # to 'de').
        parts = lang.split('-')
        if len(parts) > 1 and parts[0] in langs:
            return langs.get(parts[0])
    return None
示例#12
0
    def setupLocale(self, request):
        # slightly adapted from zope.publisher.http.HTTPRequest.setupLocale
        if getattr(request, 'locale', None) is not None:
            return

        envadapter = IUserPreferredLanguages(request, None)
        if envadapter is None:
            request.locale = locales.getLocale(None, None, None)
            return

        langs = envadapter.getPreferredLanguages()
        for httplang in langs:
            parts = (httplang.split('-') + [None, None])[:3]
            try:
                request.locale = locales.getLocale(*parts)
                return
            except LoadLocaleError:
                # Just try the next combination
                pass
        else:
            # No combination gave us an existing locale, so use the default,
            # which is guaranteed to exist
            request.locale = locales.getLocale(None, None, None)
示例#13
0
 def _langs(self):
     langs = IUserPreferredLanguages(self.request)
     return langs.getPreferredLanguages()
示例#14
0
 def languages(self):
     upl = IUserPreferredLanguages(self.request)
     if ICookieLanguageSelector.providedBy(upl):
         return upl.getLanguageList()
     return None
示例#15
0
 def selected_lang(self):
     upl = IUserPreferredLanguages(self.request)
     return upl.getSelectedLanguage()
 def language(self):
     return IUserPreferredLanguages(self.request).getPreferredLanguages()[0]