def get_locale(config: SDConfig) -> str: """ Return the best supported locale for a request. Get the locale as follows, by order of precedence: - l request argument or session['locale'] - browser suggested locale, from the Accept-Languages header - config.DEFAULT_LOCALE """ # Default to any locale set in the session. locale = session.get("locale") # A valid locale specified in request.args takes precedence. if request.args.get("l"): negotiated = negotiate_locale([request.args["l"]], LOCALES.keys()) if negotiated: locale = negotiated # If the locale is not in the session or request.args, negotiate # the best supported option from the browser's accepted languages. if not locale: locale = negotiate_locale(get_accepted_languages(), LOCALES.keys()) # Finally, fall back to the default locale if necessary. return locale or config.DEFAULT_LOCALE
def get_locale(config: SDConfig) -> str: """ Return the best supported locale for a request. Get the locale as follows, by order of precedence: - l request argument or session['locale'] - browser suggested locale, from the Accept-Languages header - config.DEFAULT_LOCALE - config.FALLBACK_LOCALE """ preferences = [] if session.get("locale"): preferences.append(session.get("locale")) if request.args.get("l"): preferences.insert(0, request.args.get("l")) if not preferences: preferences.extend(get_accepted_languages()) preferences.append(config.DEFAULT_LOCALE) preferences.append(FALLBACK_LOCALE) negotiated = negotiate_locale(preferences, LOCALES.keys()) if not negotiated: raise ValueError("No usable locale") return negotiated
def get_locale(): if current_user is not None and not current_user.is_anonymous: return current_user.lang preferred = [ x.replace('-', '_') for x in request.accept_languages.values() ] return negotiate_locale(preferred, Config.LANGUAGES.keys())
def gettext_from_dict(catalog, locale, default_locale): """Get translation string from a dictionary.""" # First try with negotiate_locale. Negotiate locale will not properly # negotiate e.g "en" when the available locales are "en_GB" and "da", even # though "en_GB" could be used. selected = negotiate_locale([str(locale)], catalog.keys()) if selected: return catalog[selected] # In situations where negotiate locale doesn't work, we check if the # language itself might be found. # Extract language keys only. catalog_langs = { Locale.parse(l).language: l for (l, msg) in catalog.items() } if isinstance(locale, str): locale = Locale.parse(locale) if locale.language in catalog_langs: # If primary language match, use that catalog_key = catalog_langs[locale.language] return catalog[catalog_key] # If not, use default locale (must be defined it is defined) # "en" is set as fallback lng. return catalog.get(str(default_locale), "en")
def get_current_locale(): if hasattr(ask_request, 'locale'): #preferred = [x.replace('-', '_') for x in ask_request.locale.values()] preferred = [ ask_request.locale.replace('-', '_')] else: preferred = [app.config['BABEL_DEFAULT_LOCALE']] language = negotiate_locale(preferred, app.config['BABEL_ASK_LOCALES']) app.logger.debug("Selected language={}".format(language)) app.logger.debug(app.config['BABEL_TRANSLATION_DIRECTORIES']) return language
def test_negotiate_locale(): assert core.negotiate_locale(["de_DE", "en_US"], ["de_DE", "de_AT"]) == "de_DE" assert core.negotiate_locale(["de_DE", "en_US"], ["en", "de"]) == "de" assert core.negotiate_locale(["de_DE", "en_US"], ["de_de", "de_at"]) == "de_DE" assert core.negotiate_locale(["de_DE", "en_US"], ["de_de", "de_at"]) == "de_DE" assert core.negotiate_locale(["ja", "en_US"], ["ja_JP", "en_US"]) == "ja_JP" assert core.negotiate_locale(["no", "sv"], ["nb_NO", "sv_SE"]) == "nb_NO"
def get_locale(): translations = set( [str(locale) for locale in self.babel.list_translations()]) translations.add(BABEL_DEFAULT_LOCALE) logger.debug('Available translations: %s', translations) logger.debug('accept_languages: %s', request.accept_languages) preferred = [ locale.replace('-', '_') for locale in request.accept_languages.values() ] best_match = negotiate_locale(preferred, translations) logger.debug('Best locale match: %s', best_match) return best_match
def get_locale(config): """ Get the locale as follows, by order of precedence: - l request argument or session['locale'] - browser suggested locale, from the Accept-Languages header - config.DEFAULT_LOCALE - 'en_US' """ locale = None accept_languages = [] for l in request.accept_languages.values(): if '-' in l: sep = '-' else: sep = '_' try: accept_languages.append(str(core.Locale.parse(l, sep))) except: pass if 'l' in request.args: if len(request.args['l']) == 0: if 'locale' in session: del session['locale'] locale = core.negotiate_locale(accept_languages, LOCALES) else: locale = core.negotiate_locale([request.args['l']], LOCALES) session['locale'] = locale else: if 'locale' in session: locale = session['locale'] else: locale = core.negotiate_locale(accept_languages, LOCALES) if locale: return locale else: return getattr(config, 'DEFAULT_LOCALE', 'en_US')
def get_locale(): """ Get the locale as follows, by order of precedence: - l request argument or session['locale'] - browser suggested locale, from the Accept-Languages header - config.DEFAULT_LOCALE - 'en_US' """ locale = None accept_languages = [] for l in request.accept_languages.values(): if '-' in l: sep = '-' else: sep = '_' try: accept_languages.append(str(core.Locale.parse(l, sep))) except: pass if 'l' in request.args: if len(request.args['l']) == 0: if 'locale' in session: del session['locale'] locale = core.negotiate_locale(accept_languages, LOCALES) else: locale = core.negotiate_locale([request.args['l']], LOCALES) session['locale'] = locale else: if 'locale' in session: locale = session['locale'] else: locale = core.negotiate_locale(accept_languages, LOCALES) if locale: return locale else: return getattr(config, 'DEFAULT_LOCALE', 'en_US')
def test_negotiate_locale(): assert (core.negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) == 'de_DE') assert core.negotiate_locale(['de_DE', 'en_US'], ['en', 'de']) == 'de' assert (core.negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) == 'de_DE') assert (core.negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) == 'de_DE') assert (core.negotiate_locale(['ja', 'en_US'], ['ja_JP', 'en_US']) == 'ja_JP') assert core.negotiate_locale(['no', 'sv'], ['nb_NO', 'sv_SE']) == 'nb_NO'
def localized_page(self): """The current localized page This is the flatpage of the first available locale from :py:func:`~sipa.babel.locale_preferences`, or :py:attr:`default_page`. :returns: The localized page :rtype: Whatever has been added, hopefully :py:class:`Page` """ available_locales = list(self.localized_pages.keys()) user_locale = str(get_user_locale_setting()) if user_locale is None: preferred_locales = [] else: preferred_locales = [user_locale] preferred_locales.extend(request.accept_languages.values()) negotiated_locale = negotiate_locale( preferred_locales, available_locales, sep='-') if negotiated_locale is not None: return self.localized_pages[negotiated_locale] return self.default_page
def main(args): try: domain, source_file = args except: raise ScriptError('Usage: %s DOMAIN POFILE' % os.path.basename(sys.argv[0])) domains = _get_domains() locales = _get_locales(domain) if not domains: raise ScriptError('No trac/locale/*.pot files.') if domain not in domains: raise ScriptError('Domain parameter should be one of %s.' % ', '.join(domains)) if not locales: raise ScriptError('No trac/locale/*/LC_MESSAGES/*.po files.') source = _open_pofile(source_file) preferred_locales = [ value.split(None, 1)[0] for value in (source.locale and str(source.locale), source.language_team) if value ] locale = negotiate_locale(preferred_locales, locales) if not locale or locale == 'en_US': sys.stderr.write('No available *.po file for %s.\n' % ', '.join(preferred_locales)) return 1 target_file = os.path.join('trac', 'locale', locale, 'LC_MESSAGES', domain + '.po') target = _open_pofile(target_file) pot = _open_pofile(os.path.join('trac', 'locale', domain + '.pot')) n = 0 for source_msg in source: msgid = source_msg.id if msgid == '': continue if not _has_msgstr(source_msg): continue if msgid in target: target_msg = target[msgid] elif msgid in pot: target_msg = pot[msgid] else: continue if target_msg.string == source_msg.string: continue if not _has_msgstr(source_msg): continue if _has_msgstr(target_msg) and not _is_fuzzy(target_msg): continue if msgid not in target: target_msg = target_msg.clone() target[msgid] = target_msg target_msg.string = source_msg.string target_msg.flags = source_msg.flags n += 1 if n > 0: with open(target_file, 'w') as f: write_po(f, target) del f print('Merged %d messages from %s and updated %s' % (n, source_file, target_file)) else: print('Merged no messages from %s' % source_file)
def get_locale(): preferred = map(lambda x: x.replace('-', '_'), request.accept_languages.values()) return negotiate_locale(preferred, AVAILABLE_LOCALES)
def main(): """Merge translated strings from another PO file. $ src=../trac-1.2-stable/trac/locale/de/LC_MESSAGES $ PYTHONPATH=. contrib/%(prog)s messages $src/messages.po [locale] """ domains = _get_domains() if not domains: raise ScriptError('No trac/locale/*.pot files.') parser = argparse.ArgumentParser(usage=main.__doc__) parser.add_argument('domain', choices=domains, help="Name of catalog to merge") parser.add_argument('pofile', help="Path of the catalog to merge from") parser.add_argument('locale', help="Locale of the catalog to merge from", nargs='?', default=None) args = parser.parse_args() domain, source_file, locale = args.domain, args.pofile, args.locale locales = _get_locales(domain) if not locales: raise ScriptError('No trac/locale/*/LC_MESSAGES/*.po files.') pot = _open_pofile(os.path.join('trac', 'locale', domain + '.pot')) source = _open_pofile(source_file) if locale: preferred_locales = [locale] else: preferred_locales = [ value.split(None, 1)[0] for value in (source.locale and str(source.locale), source.language_team) if value ] locale = negotiate_locale(preferred_locales, locales) if not locale or locale == 'en_US': raise ScriptError('No available *.po file for %s.\n' % ', '.join(preferred_locales)) target_file = os.path.join('trac', 'locale', locale, 'LC_MESSAGES', domain + '.po') target = _open_pofile(target_file) pot = _open_pofile(os.path.join('trac', 'locale', domain + '.pot')) n = 0 for source_msg in source: msgid = source_msg.id if msgid == '': continue if not _has_msgstr(source_msg): continue if msgid in target: target_msg = target[msgid] elif msgid in pot: target_msg = pot[msgid] else: continue if target_msg.string == source_msg.string: continue if not _has_msgstr(source_msg): continue if _has_msgstr(target_msg) and not _is_fuzzy(target_msg): continue if msgid not in target: target_msg = target_msg.clone() target[msgid] = target_msg target_msg.string = source_msg.string target_msg.flags = source_msg.flags n += 1 if n > 0: target.msgid_bugs_address = pot.msgid_bugs_address target.revision_date = datetime.utcnow() target.locale = locale target.language_team = '%s <%s>' % (locale, pot.msgid_bugs_address) target.fuzzy = False # clear fuzzy flag of the header with open(target_file, 'w') as f: write_po(f, target) del f print('Merged %d messages from %s and updated %s' % (n, source_file, target_file)) else: print('Merged no messages from %s' % source_file)