def login_status(): refresh() if current_user.is_anonymous: resp = { 'logged_in': False, 'user': None, 'user_info': None, 'language': get_locale().language } else: resp = { 'logged_in': True, 'user': { 'id': current_user.id, 'email': current_user.email, 'roles': [{ 'id': x.name, 'label': x.description } for x in current_user.roles] }, 'user_info': session.get('user_info', None).to_dict() if session.get( 'user_info', None) else None, 'language': get_locale().language } return jsonify(resp)
def state(): """ State view. :return: json with serialized information about the current user """ refresh() if current_user.is_anonymous: resp = { 'loggedIn': False, 'user': None, 'userInfo': None, 'language': get_locale().language } else: ui = session.get('user_info', None) if ui and not isinstance(ui, dict): ui = ui.to_dict() resp = { 'loggedIn': True, 'user': { 'id': current_user.id, 'email': current_user.email, 'roles': [{ 'id': x.name, 'label': x.description } for x in current_user.roles] }, 'userInfo': humps.camelize(ui) if ui else {}, 'language': get_locale().language } prepare_state_view_data.send(current_user, state=resp) return jsonify(resp)
def test_set_locale(app): """Test get translations for language with existing/missing *.mo files.""" Babel(app) with app.test_request_context(): with set_locale("en"): assert str(get_locale()) == "en" with set_locale("da"): assert str(get_locale()) == "da"
def test_locale_selector(app): """Test locale selector.""" app.config['I18N_LANGUAGES'] = [('da', 'Danish')] InvenioI18N(app) with app.test_request_context(headers=[('Accept-Language', 'da')]): assert str(get_locale()) == 'da' assert format_number(10.1) == '10,1' assert gettext('Translate') == u'Oversætte' with app.test_request_context(headers=[('Accept-Language', 'en')]): assert str(get_locale()) == 'en' assert format_number(10.1) == '10.1' assert gettext('Translate') == 'Translate'
def test_locale_selector(app): """Test locale selector.""" app.config["I18N_LANGUAGES"] = [("da", "Danish")] InvenioI18N(app) with app.test_request_context(headers=[("Accept-Language", "da")]): assert str(get_locale()) == "da" assert format_number(10.1) == "10,1" assert gettext("Translate") == u"Oversætte" with app.test_request_context(headers=[("Accept-Language", "en")]): assert str(get_locale()) == "en" assert format_number(10.1) == "10.1" assert gettext("Translate") == "Translate"
def test_locale_selector(app): """Test locale selector.""" app.config['I18N_LANGUAGES'] = ['da'] InvenioI18N(app) with app.test_request_context(headers=[('Accept-Language', 'da')]): assert str(get_locale()) == 'da' assert format_number(10.1) == '10,1' assert gettext('Translate') == u'Oversætte' with app.test_request_context(headers=[('Accept-Language', 'en')]): assert str(get_locale()) == 'en' assert format_number(10.1) == '10.1' assert gettext('Translate') == 'Translate'
def test_set_locale(app): """Test get translations for language with existing/missing *.mo files.""" # Wokring outside request context try: with set_locale('en'): assert False except RuntimeError: pass with app.test_request_context(): with set_locale('en'): assert get_locale() == 'en' with set_locale('da'): assert get_locale() == 'da'
def guide(): """TUGraz_Repository_Guide.""" locale = get_locale() return redirect( url_for('static', filename=f'documents/TUGraz_Repository_Guide_01_{locale}.pdf', _external=True))
def get_translations(self): """Returns the correct gettext translations that should be used for this request. This will never fail and return a dummy translation object if used outside of the request or if a translation cannot be found. """ locale = get_locale() cache = self.get_translations_cache() translations = cache.get(str(locale)) if translations is None: # load flaskbb translations translations = babel.support.Translations.load( dirname=self.flaskbb_translations, locales=locale, domain="messages") # If no compiled translations are found, return the # NullTranslations object. if not isinstance(translations, babel.support.Translations): return translations # now load and add the plugin translations for plugin in self.plugin_translations: plugin_translation = babel.support.Translations.load( dirname=plugin, locales=locale, domain="messages") translations.add(plugin_translation) cache[str(locale)] = translations return translations
def test_locale_selector(app): """Test locale selector.""" app.config.update( I18N_LANGUAGES=[("da", "Danish")], I18N_TRANSLATIONS_PATHS=[join(dirname(__file__), "translations")], ) i18n = InvenioI18N(app) with app.test_request_context(headers=[("Accept-Language", "da")]): assert str(get_locale()) == "da" assert format_number(10.1) == "10,1" assert gettext("Translate") == "Oversætte" with app.test_request_context(headers=[("Accept-Language", "en")]): assert str(get_locale()) == "en" assert format_number(10.1) == "10.1" assert gettext("Translate") == "From test catalog"
def build(self, results, criteria): tree = Tree() for value, count in results: if value or self.missing_label: value, label = self.decode(value, default_value=value, default_label=value) remove_url = criteria.build_remove_filter_url(self, value) add_url = None if remove_url else criteria.build_add_filter_url(self, value) if remove_url or add_url: # Only items with an URL get displayed. if value: path = value.split(sep=self.path_separator) else: path = [value] # Build the tree path. Part of the path may or may not already # exist as the facet values are not ordered. node = tree # Start at tree root. for component in path: node = node['children'][component] # Add data at the leaf. node['node'] = { 'label': label, 'count': count, 'count_formatted': format_number(count, locale=get_locale()), 'remove_url': remove_url, 'add_url': add_url, } return self.sort_tree(tree)
def test_locale_selector(app): """Test locale selector.""" app.config.update( I18N_LANGUAGES=[('da', 'Danish')], I18N_TRANSLATIONS_PATHS=[join(dirname(__file__), 'translations')], ) i18n = InvenioI18N(app) with app.test_request_context(headers=[('Accept-Language', 'da')]): assert str(get_locale()) == 'da' assert format_number(10.1) == '10,1' assert gettext('Translate') == u'Oversætte' with app.test_request_context(headers=[('Accept-Language', 'en')]): assert str(get_locale()) == 'en' assert format_number(10.1) == '10.1' assert gettext('Translate') == 'From test catalog'
def get_translations(self): ''' Override to merge wtforms translations with flask-admin ''' ctx = _request_ctx_stack.top if ctx is None: return NullTranslations() locale = get_locale() cache = self.get_translations_cache(ctx) translations = cache.get(str(locale)) if translations is None: dirname = self.get_translations_path(ctx) translations = support.Translations.load(dirname, locale, domain=self.domain) # start of overridden section - merging wtforms translations wtf_translations = support.Translations.load(messages_path(), locale, domain='wtforms') translations.merge(wtf_translations) cache[str(locale)] = translations return translations
def filter_language_name(lang_code): """Convert language code into display name in current locale. Installed on application as ``language_name``. """ return current_app.extensions['babel'].load_locale( lang_code).get_display_name(get_locale().language)
def __getattribute__(self, item): """Get translated value automatically.""" try: language = str(get_locale()) return self.get_translation(item, language) except AttributeError: return super().__getattribute__(item)
def entry(): ''' Home page needing autentication. 1. a guest user (from login page or home button) or anonymous user (home) 2. authenticated user When not autenticated, should show a login page first! ''' if current_user.has_role("guest"): # print("Authenticated guest user at entry") logger.info(f'-> routes.entry/guest') logout_user() if current_user.is_authenticated: # Home page for logged in user logger.info(f'-> routes.entry/user') return redirect(url_for('start_logged')) logger.info(f'-> routes.entry/-') lang = get_locale().language demo_site = f"{app.config['DEMO_URL']}" logger.debug(f'-> routes.entry auth={current_user.is_authenticated} demo={demo_site}') # If not logged in, a login page is shown here first return render_template('/index_entry.html', demo_site=demo_site, lang=lang)
def build(self, results, criteria, active_only=False): items = [] for value, count in results: if value or self.missing_label: value, label = self.decode(value, default_value=value, default_label=value) remove_url = criteria.build_remove_filter_url(self, value) if remove_url or active_only: add_url = None else: add_url = criteria.build_add_filter_url(self, value) if remove_url or add_url: # Only items with an URL get displayed. items.append({ 'label': label, 'count': count, 'count_formatted': format_number(count, locale=get_locale()), 'remove_url': remove_url, 'add_url': add_url, }) return self.sort_items(items)
def item_view(item_id): """View a full bibliographic record.""" start_time = time.process_time() if current_app.config['KERKO_USE_TRANSLATIONS']: babel_domain.as_default() item, fellback = run_query_unique_with_fallback(['id', 'alternateId'], item_id) if not item: return abort(404) item_url = url_for('.item_view', item_id=item['id'], _external=True) if fellback: return redirect(item_url, 301) build_creators_display(item) build_item_facet_results(item) build_relations( item, get_search_return_fields(page_len=None, exclude=['coins']), sort=current_app.config['KERKO_RELATIONS_SORT'] ) return render_template( current_app.config['KERKO_TEMPLATE_ITEM'], item=item, title=item.get('data', {}).get('title', ''), item_url=item_url, time=time.process_time() - start_time, locale=get_locale(), )
def get_translations(self): """Returns the correct gettext translations that should be used for this request. This will never fail and return a dummy translation object if used outside of the request or if a translation cannot be found. """ locale = get_locale() cache = self.get_translations_cache() translations = cache.get(str(locale)) if translations is None: # load flaskbb translations translations = babel.support.Translations.load( dirname=self.flaskbb_translations, locales=locale, domain="messages" ) # If no compiled translations are found, return the # NullTranslations object. if not isinstance(translations, babel.support.Translations): return translations # now load and add the plugin translations for plugin in self.plugin_translations: plugin_translation = babel.support.Translations.load( dirname=plugin, locales=locale, domain="messages" ) translations.add(plugin_translation) cache[str(locale)] = translations return translations
def __setattr__(self, key, value): """Save translated value automatically.""" if key in self.translatable_columns: try: language = str(get_locale()) self.set_translation(key, language, value) except AttributeError: return super().__setattr__(key, value)
def help_search(): """Search help guide.""" # Default to rendering english page if locale page not found. locale = get_locale() return render_template([ f"invenio_app_rdm/help/search.{locale}.html", "invenio_app_rdm/help/search.en.html", ])
def guide(): """TUGraz_Repository_Guide.""" locale = get_locale() return redirect( url_for( "static", filename=f"documents/TUGraz_Repository_Guide_02_{locale}.pdf", _external=True, ))
def terms(): """Terms_And_Conditions.""" locale = get_locale() return redirect( url_for( 'static', filename= f'documents/TUGraz_Repository_Terms_And_Conditions_{locale}.pdf', _external=True))
def get_set_lang(): refresh() current_locale = get_locale() resp = jsonify({ 'language': current_locale.language, 'variant': current_locale.variant, }) resp.set_cookie('language', current_locale.language) return resp
def render_error(error): # If a HTTPException, pull the `code` attribute; default to 500. error_code = getattr(error, 'code', 500) babel_domain.as_default() context = { 'locale': get_locale(), } return render_template(f'kerkoapp/{error_code}.html.jinja2', **context), error_code
def gdpr(): """General_Data_Protection_Rights.""" locale = get_locale() return redirect( url_for( 'static', filename= f'documents/TUGraz_Repository_General_Data_Protection_Rights_{locale}.pdf', _external=True))
def get_language_aware_title(extra_data, fallback_language="en"): lang = get_locale() title = extra_data["title"] local_title = title.get(lang) fallback_title = title.get(fallback_language) if local_title: return local_title if fallback_title: return fallback_title return list(title.values())[0]
def register_context_processors(): lang = get_locale().language rtl = lang in ("ar", "az", "fa", "he", "ur") return dict( lang=lang, rtl=rtl, _trans=gettext, _ntrans=ngettext, settings_profile=current_settings_profile, settings=current_settings, )
def set_request_presets(): """ Sets preset values for variables like deployment and event globally so they can be reused by other components for restricting filter results by deployment and/or event, for instance. """ session.permanent = True hostname = urlparse(request.url).hostname g.deployment = get_deployment(hostname) g.event = get_event() g.locale = get_locale() current_user.event = g.event
def set_label(self, label: str, value: str, language: str = None): """Save label translation in database. :param label: Label name ('attribute' field in table) :param value: Translated label text. :param language: Language of translation """ if language is None: language = str(get_locale()) translation = self.model(attribute=label, language=language, value=value) self.db.session.add(translation) self.db.session.commit()
def test_timezone_selector(app): """Test format_datetime.""" app.config["I18N_LANGUAGES"] = [("da", "Danish")] InvenioI18N(app) with app.test_request_context(): assert format_datetime(datetime(1987, 3, 5, 17, 12)) == "Mar 5, 1987, 5:12:00 PM" assert ( format_datetime(datetime(1987, 3, 5, 17, 12), "full") == "Thursday, March 5, 1987 at 5:12:00 PM GMT+00:00" ) assert format_datetime(datetime(1987, 3, 5, 17, 12), "short") == "3/5/87, 5:12 PM" assert format_datetime(datetime(1987, 3, 5, 17, 12), "dd mm yyy") == "05 12 1987" assert format_datetime(datetime(1987, 3, 5, 17, 12), "dd mm yyyy") == "05 12 1987" with app.test_request_context(headers=[("Accept-Language", "da")]): assert str(get_locale()) == "da" assert format_datetime(datetime(1987, 3, 5, 17, 12)) == "05/03/1987 17.12.00"
def get_translations(self): """Returns the correct gettext translations that should be used for this request. This will never fail and return a dummy translation object if used outside of the request or if a translation cannot be found. """ locale = get_locale() cache = self.get_translations_cache() translations = cache.get(str(locale)) if translations is None: # load flaskbb translations translations = babel.support.Translations.load( dirname=self.flaskbb_translations, locales=locale, domain="messages" ) # If no compiled translations are found, return the # NullTranslations object. if not isinstance(translations, babel.support.Translations): return translations # Plugin translations are at the moment not supported under # Python 3. There is currently a bug in Babel where it is # not possible to merge two message catalogs. # https://github.com/mitsuhiko/babel/pull/92 # So instead of adding/merging them, we are just skipping them # Better then no python3 support though.. if not PY2: return translations # now load and add the plugin translations for plugin in self.plugin_translations: plugin_translation = babel.support.Translations.load( dirname=plugin, locales=locale, domain="messages" ) translations.add(plugin_translation) cache[str(locale)] = translations return translations
def test_timezone_selector(app): """Test format_datetime.""" app.config['I18N_LANGUAGES'] = ['da'] InvenioI18N(app) with app.test_request_context(): assert format_datetime(datetime(1987, 3, 5, 17, 12)) == \ 'Mar 5, 1987, 5:12:00 PM' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'full') == \ 'Thursday, March 5, 1987 at 5:12:00 PM GMT+00:00' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'short') == \ '3/5/87, 5:12 PM' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'dd mm yyy') == \ '05 12 1987' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'dd mm yyyy') \ == '05 12 1987' with app.test_request_context(headers=[('Accept-Language', 'da')]): assert str(get_locale()) == 'da' assert format_datetime(datetime(1987, 3, 5, 17, 12)) == \ '05/03/1987 17.12.00'
def test_timezone_selector(app): """Test format_datetime.""" app.config['I18N_LANGUAGES'] = [('da', 'Danish')] InvenioI18N(app) with app.test_request_context(): assert format_datetime(datetime(1987, 3, 5, 17, 12)) == \ 'Mar 5, 1987, 5:12:00 PM' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'full') == \ 'Thursday, March 5, 1987 at 5:12:00 PM GMT+00:00' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'short') == \ '3/5/87, 5:12 PM' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'dd mm yyy') == \ '05 12 1987' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'dd mm yyyy') \ == '05 12 1987' with app.test_request_context(headers=[('Accept-Language', 'da')]): assert str(get_locale()) == 'da' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'short') == \ '05/03/1987 17.12'
def get_translations(self): """Return the correct gettext translations for a request. This will never fail and return a dummy translation object if used outside of the request or if a translation cannot be found. """ ctx = _request_ctx_stack.top if ctx is None: return NullTranslations() locale = get_locale() cache = self.get_translations_cache(ctx) translations = cache.get(str(locale)) if translations is None: translations = self._get_translation_for_locale(locale) cache[str(locale)] = translations return translations
def build_pager(sections, criteria, page_kwargs=None): """ Build pager links for use in a search view. :param dict page_kwargs: A dict keyed by page number, where each value is a dict of extra params to pass along when building that page's URL. """ pager = {} if sections: for section, pages in sections.items(): pager[section] = [{ 'page_num': p, 'page_num_formatted': format_number(p, locale=get_locale()), 'url': criteria.build_url(page_num=p, page_len=criteria.page_len, **page_kwargs.get(p) if page_kwargs else {}) } for p in pages] return pager
def test_timezone_selector(app): """Test format_datetime.""" app.config['I18N_LANGUAGES'] = [('da', 'Danish')] InvenioI18N(app) with app.test_request_context(): assert format_datetime(datetime(1987, 3, 5, 17, 12)) == \ 'Mar 5, 1987, 5:12:00 PM' # Adds the new date format due to a library update 2 assert format_datetime(datetime(1987, 3, 5, 17, 12), 'full') in [ 'Thursday, March 5, 1987 at 5:12:00 PM GMT+00:00', 'Thursday, March 5, 1987 at 5:12:00 PM Coordinated Universal Time'] assert format_datetime(datetime(1987, 3, 5, 17, 12), 'short') == \ '3/5/87, 5:12 PM' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'dd mm yyy') == \ '05 12 1987' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'dd mm yyyy') \ == '05 12 1987' with app.test_request_context(headers=[('Accept-Language', 'da')]): assert str(get_locale()) == 'da' assert format_datetime(datetime(1987, 3, 5, 17, 12), 'short') == \ '05.03.1987 17.12'
def filter_language_name(lang_code): """Convert language code into display name in current locale.""" return current_app.extensions["babel"].load_locale(lang_code).get_display_name(get_locale().language)
def page(): return get_locale().language
def index(): return get_locale().language
def locale(self) -> Locale: locale = get_locale() if locale is None: return self._locale return locale