diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 50eb362cd2e9c0e79882d923b3386fd680b5338c..fe7a89aa0ed37c4d3b6bf684618a0f2f1c5ac001 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -9,12 +9,106 @@ and this project adheres to `Semantic Versioning`_. Unreleased ---------- +`3.0`_ - 2022-05-11 +------------------- + +Added +~~~~~ + +* GraphQL schema for Rooms +* Provide API endpoint for system status. +* [Dev] UpdateIndicator Vue Component to display the status of interactive pages +* [Dev] DeleteDialog Vue Component to unify item deletion in the new frontend + + +Changed +~~~~~~~ + +* Show message on successful logout to inform users properly. +* Phone number country now has to be configured in config file insted of frontend. + +Fixed +~~~~~ + +* GraphQL endpoints for groups, persons, and notifications didn't expose all necessary fields. +* Loading indicator in toolbar was not shown at the complete loading progress. +* 404 page was sometimes shown while the page was still loading. +* Setting of page height in the iframe was not working correctly. +* App switched to offline state when the user was logged out/in. +* The `Stop Impersonation` button is not shown due to an oversee when changing the type of the whoAmI query to an object of UserType +* Offline fallback page for legacy pages was misleading sometimes. +* Route changes in the Legacy-Component iframe didn't trigger a scroll to the top +* Query strings did not get passed when navigating legacy pages inside of the SPA. +* Retry button on error 500 page did not trigger a reload of the page. +* When the Celery worker wasn't able to execute all tasks in time, notifications were sent multiple times. +* Changing the maintenance mode state spawned another SPA instance in the iframe +* Phone numbers couldn't be in regional format. +* System status view wasn't accessible through new frontend if a check failed. +* Progress page didn't show error message on failure. +* Dynamic routes were not removed/hidden when the respective object registering it was deleted. +* Django messages were not displayed in Vue frontend. +* Links to data check objects did not work properly. +* Backend cleanup task for Celery wasn't working. +* URLs in invitation email were broken. +* Invitation view didn't work. +* Invitation emails were using wrong styling. +* GraphQL queries and mutations did not log exceptions. + +`3.0b3`_ - 2023-03-19 +--------------------- + +Fixed +~~~~~ + +* Some GraphQL queries could return more data than permitted in related fields. + +`3.0b2`_ - 2023-03-09 +--------------------- + +Changed +~~~~~~~ + +* Change default network policy of the Apollo client to `cache-and-network`. + +Fixed +~~~~~ + +* In case the status code of a response was not in the range between 200 and 299 + but still indicates that the response should be delivered, e. g. in the case + of a redirected request, the service worker served the offline fallback page. +* In some cases, the resize listener for the IFrame in the `LegacyBaseTemplate` + did not trigger. +* [Dev] Allow apps to declare URLs in the non-legacy namespace again + +`3.0b1`_ - 2023-02-27 +--------------------- + +Added +~~~~~ + +* Support for two factor authentication via email codes and Webauthn. + +`3.0b0`_ - 2023-02-15 +--------------------- + +This release starts a new era of the AlekSIS® framework, by introducing a +dynamic frontend app written in Vue.js which communicates with the backend +through GraphQL. Support for legacy views (Django templates and +Materialize) was removed; while there is backwards compatibility for now, +this is only used by official apps until their views are fully migrated. + +AlekSIS and its new frontend require Node.js version 18 or higher to run the +Vite bundler. On Debian, this means that Debian 12 (bookworm) is needed, or +Node.js must be installed from a third-party repository. + Removed ~~~~~~~ * Official support for views rendered server-side in Django is removed. The `LegacyBaseTemplate` provided for backwards compatibility must not be used by apps declaring a dependency on AlekSIS >= 3.0. +* Support for deploying AlekSIS in sub-URLs +* Support for production deployments without HTTPS Deprecated ~~~~~~~~~~ @@ -26,17 +120,17 @@ Added ~~~~~ * Notification drawer in top nav bar -* GraphQL queries and mutations for core data management -* [Dev] Introduce new mechanism to register classes over all apps. -* Data template for `room` model used for haystack search indexing moved to core. -* Support for two factor authentication via email codes and Webauthn. +* GraphQL queries for base system and some core data management +* [Dev] New mechanism to register classes over all apps (RegistryObject) +* Model for rooms Changed ~~~~~~~ * Show languages in local language -* Rewrite of frontend using Vuetify - * The runuwsgi dev server now starts a Vite dev server with HMR in the +* Rewrite of frontend (base template) using Vuetify + * Frontend bundling migrated from Webpack to Vite (cf. installation docs) + * [Dev] The runuwsgi dev server now starts a Vite dev server with HMR in the background * OIDC scope "profile" now exposes the avatar instead of the official photo * Based on Django 4.0 @@ -55,26 +149,23 @@ Changed Fixed ~~~~~ -* The error page displayed when an ObjectOverview component is not able to get the required data was incomplete. -* In some cases, the IFrame for legacy pages was not properly sized for its content. -* When accessing the person overview page without a person ID, the avatar image was not displayed properly. * The system tried to send notifications for done background tasks - in addition to tasks started in the foreground. -* 2FA via messages or phone calls didn't work. + in addition to tasks started in the foreground +* 2FA via messages or phone calls didn't work after a faulty dependency + update * [Dev] Site reference on extensible models can no longer cause name clashes - because of its related name. + because of its related name Removed ~~~~~~~ -* Support for materialize-based frontend views (deprecated in 2.11) -* Legacy support for person iCal feed URLs. -* Django debug toolbar +* iCal feed URLs for birthdays (will be reintroduced later) +* [Dev] Django debug toolbar * It caused major performance issues and is not useful with the new frontend anymore -`2.12.3` - 2023-03-07 ---------------------- +`2.12.3`_ - 2023-03-07 +---------------------- Fixed ~~~~~ @@ -1048,3 +1139,8 @@ Fixed .. _2.12.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.1 .. _2.12.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.2 .. _2.12.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.3 +.. _3.0b0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b0 +.. _3.0b1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b1 +.. _3.0b2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b2 +.. _3.0b3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b3 +.. _3.0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0 diff --git a/Dockerfile b/Dockerfile index 44159bb3fd185d4eb11224e48139319c9468b019..2134ae81150a13dbab8282149a04df0fb8d20235 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM debian:bookworm-slim AS core # Build arguments ARG EXTRAS="ldap,s3,sentry" -ARG APP_VERSION="==2.10.1.dev0+20220801181456.7ba74939" +ARG APP_VERSION="==3.0b0" # Configure Python to be nice inside Docker and pip to stfu ENV PYTHONUNBUFFERED 1 @@ -64,6 +64,7 @@ RUN set -e; \ ${ALEKSIS_static__root} \ ${ALEKSIS_media__root} \ ${ALEKSIS_backup__location}; \ + dpkg-divert --rename --add /usr/lib/$(py3versions -d)/EXTERNALLY-MANAGED; \ eatmydata pip install AlekSIS-Core\[$EXTRAS\]$APP_VERSION # Define entrypoint, volumes and uWSGI running on port 8000 diff --git a/README.rst b/README.rst index 1a233ce7ae9e1b24e3cb0eaf088c17f41ef29a61..8c24dd27c0c4d0fb6fe9510d3ccb75447bfdd369 100644 --- a/README.rst +++ b/README.rst @@ -68,7 +68,7 @@ Licence Copyright © 2019, 2020, 2021, 2022, 2023 Dominik George <dominik.george@teckids.org> Copyright © 2019, 2020, 2021, 2022 Tom Teichler <tom.teichler@teckids.org> Copyright © 2019 mirabilos <thorsten.glaser@teckids.org> - Copyright © 2021, 2022 magicfelix <felix@felix-zauberer.de> + Copyright © 2021, 2022, 2023 magicfelix <felix@felix-zauberer.de> Copyright © 2021 Lloyd Meins <meinsll@katharineum.de> Copyright © 2022 Benedict Suska <benedict.suska@teckids.org> Copyright © 2022 Lukas Weichelt <lukas.weichelt@teckids.org> diff --git a/aleksis/core/apps.py b/aleksis/core/apps.py index 9b0518472c6309d33305188659de22700497aee5..e5e2d4008c132c24341d26f6532c254167b13741 100644 --- a/aleksis/core/apps.py +++ b/aleksis/core/apps.py @@ -3,6 +3,7 @@ from typing import Any, Optional import django.apps from django.apps import apps from django.conf import settings +from django.contrib import messages from django.http import HttpRequest from django.utils.module_loading import autodiscover_modules from django.utils.translation import gettext as _ @@ -43,7 +44,7 @@ class CoreConfig(AppConfig): ([2019, 2020, 2021, 2022, 2023], "Dominik George", "dominik.george@teckids.org"), ([2019, 2020, 2021, 2022], "Tom Teichler", "tom.teichler@teckids.org"), ([2019], "mirabilos", "thorsten.glaser@teckids.org"), - ([2021, 2022], "magicfelix", "felix@felix-zauberer.de"), + ([2021, 2022, 2023], "magicfelix", "felix@felix-zauberer.de"), ([2021], "Lloyd Meins", "meinsll@katharineum.de"), ([2022], "Benedict Suska", "benedict.suska@teckids.org"), ([2022], "Lukas Weichelt", "lukas.weichelt@teckids.org"), @@ -144,6 +145,11 @@ class CoreConfig(AppConfig): # Save the associated person to pick up defaults user.person.save() + def user_logged_out( + self, sender: type, request: Optional[HttpRequest], user: "User", **kwargs + ) -> None: + messages.success(request, _("You have been logged out successfully.")) + @classmethod def get_all_scopes(cls) -> dict[str, str]: scopes = { diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py index 92c120886e4a530cc566b8489cb09d3e38f5ba2e..efd6e34edae2dd9f6e01e02cc9c8c9a669ce7cd0 100644 --- a/aleksis/core/forms.py +++ b/aleksis/core/forms.py @@ -19,6 +19,7 @@ from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget, from dynamic_preferences.forms import PreferenceForm from guardian.shortcuts import assign_perm from invitations.forms import InviteForm +from maintenance_mode.core import get_maintenance_mode from material import Fieldset, Layout, Row from .mixins import ExtensibleForm, SchoolTermRelatedExtensibleForm @@ -860,3 +861,11 @@ class OAuthApplicationForm(forms.ModelForm): "redirect_uris", "skip_authorization", ) + + +class MaintenanceModeForm(forms.Form): + maintenance_mode = forms.BooleanField( + required=False, + initial=not get_maintenance_mode(), + widget=forms.HiddenInput, + ) diff --git a/aleksis/core/frontend/app/apollo.js b/aleksis/core/frontend/app/apollo.js index c14ba118d0c4d14558f23a747a98b207067ff7b2..267997b9f93ba8d992a90093a93e650f32995811 100644 --- a/aleksis/core/frontend/app/apollo.js +++ b/aleksis/core/frontend/app/apollo.js @@ -70,7 +70,7 @@ const apolloOpts = { } // Add a snackbar on all errors returned by the GraphQL endpoint // If App is offline, don't add snackbar since only the ping query is active - if (!vm.$root.offline) { + if (!vm.$root.offline && !vm.$root.invalidation) { vm.$root.snackbarItems.push({ id: crypto.randomUUID(), timeout: 5000, @@ -79,7 +79,7 @@ const apolloOpts = { }); } } - if (networkError) { + if (networkError && !vm.$root.invalidation) { // Set app offline globally on network errors // This will cause the offline logic to kick in, starting a ping check or // similar recovery strategies depending on the app/navigator state @@ -90,6 +90,7 @@ const apolloOpts = { vm.$root.offline = true; } }, + fetchPolicy: "cache-and-network", }, }, }; diff --git a/aleksis/core/frontend/app/dateTimeFormats.js b/aleksis/core/frontend/app/dateTimeFormats.js index a835b238ccb56b0cdfc465f3b7ea2341e45322f8..6a980fc8dab2fea0b74fec8ef042de413db35bee 100644 --- a/aleksis/core/frontend/app/dateTimeFormats.js +++ b/aleksis/core/frontend/app/dateTimeFormats.js @@ -19,6 +19,13 @@ const dateTimeFormats = { minute: "numeric", second: "numeric", }, + longNumeric: { + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + }, }, de: { short: { @@ -39,6 +46,13 @@ const dateTimeFormats = { minute: "numeric", second: "numeric", }, + longNumeric: { + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + }, }, }; diff --git a/aleksis/core/frontend/components/LegacyBaseTemplate.vue b/aleksis/core/frontend/components/LegacyBaseTemplate.vue index 324882b44c5efc85e4bef9c9fcce026cf1728320..790fc10c592bac5acc1e3bbadabcae63e065804f 100644 --- a/aleksis/core/frontend/components/LegacyBaseTemplate.vue +++ b/aleksis/core/frontend/components/LegacyBaseTemplate.vue @@ -59,13 +59,14 @@ export default { const location = this.$refs.contentIFrame.contentWindow.location; const url = new URL(location); const path = url.pathname.replace(/^\/django/, ""); + const pathWithQueryString = path + encodeURI(url.search); const routePath = path.charAt(path.length - 1) === "/" && this.$route.path.charAt(path.length - 1) !== "/" ? this.$route.path + "/" : this.$route.path; if (path !== routePath) { - this.$router.push(path); + this.$router.push(pathWithQueryString); } // Show loader if iframe starts to change its content, even if the $route stays the same @@ -77,13 +78,24 @@ export default { const title = this.$refs.contentIFrame.contentWindow.document.title; this.$root.$setPageTitle(title); - // Adapt height of IFrame according to the height of its contents once and listen to resize events - this.iFrameHeight = - this.$refs.contentIFrame.contentDocument.body.scrollHeight; - this.$refs.contentIFrame.contentWindow.onresize = () => { + // Adapt height of IFrame according to the height of its contents once and observe height changes + if ( + this.$refs.contentIFrame.contentDocument && + this.$refs.contentIFrame.contentDocument.body + ) { this.iFrameHeight = this.$refs.contentIFrame.contentDocument.body.scrollHeight; - }; + new ResizeObserver(() => { + if ( + this.$refs.contentIFrame && + this.$refs.contentIFrame.contentDocument && + this.$refs.contentIFrame.contentDocument.body + ) { + this.iFrameHeight = + this.$refs.contentIFrame.contentDocument.body.scrollHeight; + } + }).observe(this.$refs.contentIFrame.contentDocument.body); + } this.$root.contentLoading = false; }, @@ -92,6 +104,10 @@ export default { $route() { // Show loading animation once route changes this.$root.contentLoading = true; + + // Scroll to top only when route changes to not affect form submits etc. + // A small duration to avoid flashing of the UI + this.$vuetify.goTo(0, { duration: 10 }); }, }, name: "LegacyBaseTemplate", diff --git a/aleksis/core/frontend/components/app/App.vue b/aleksis/core/frontend/components/app/App.vue index e11725a36e9dc33310750397a68305b3af05c566..b6919fbe8353c305cc88141e0bbcdd095bd4231c 100644 --- a/aleksis/core/frontend/components/app/App.vue +++ b/aleksis/core/frontend/components/app/App.vue @@ -45,7 +45,10 @@ > <v-icon>mdi-update</v-icon> </v-btn> - <div v-if="whoAmI && whoAmI.isAuthenticated" class="d-flex"> + <div + v-if="whoAmI && whoAmI.isAuthenticated && whoAmI.person" + class="d-flex" + > <notification-list v-if="!whoAmI.person.isDummy" /> <account-menu :account-menu="accountMenu" @@ -97,6 +100,7 @@ checkPermission($route.meta.permission) || $route.name === 'dashboard' " + @mounted="routeComponentMounted" /> <error-page v-else-if=" @@ -226,6 +230,7 @@ import useRegisterSWMixin from "../../mixins/useRegisterSW"; import offlineMixin from "../../mixins/offline"; import menusMixin from "../../mixins/menus"; import routesMixin from "../../mixins/routes"; +import error404Mixin from "../../mixins/error404"; export default { data() { @@ -250,7 +255,13 @@ export default { }, messages: { query: gqlMessages, - pollInterval: 1000, + }, + }, + methods: { + routeComponentMounted() { + if (!this.$root.isLegacyBaseTemplate) { + this.$root.contentLoading = false; + } }, }, watch: { @@ -272,10 +283,8 @@ export default { }, $route: { handler(newRoute) { - if (newRoute.matched.length == 0) { - this.error404 = true; - } else { - this.error404 = false; + if (this.$apollo.queries.messages) { + this.$apollo.queries.messages.refetch(); } }, immediate: true, @@ -291,7 +300,13 @@ export default { SideNav, SnackbarItem, }, - mixins: [useRegisterSWMixin, offlineMixin, menusMixin, routesMixin], + mixins: [ + useRegisterSWMixin, + offlineMixin, + menusMixin, + routesMixin, + error404Mixin, + ], }; </script> diff --git a/aleksis/core/frontend/components/app/whoAmI.graphql b/aleksis/core/frontend/components/app/whoAmI.graphql index 12235e0ed7c320f46f0442c23e4a75dbba44c6cd..0b2877bd2cf15b5134c8e70978fb6b2218414e3a 100644 --- a/aleksis/core/frontend/components/app/whoAmI.graphql +++ b/aleksis/core/frontend/components/app/whoAmI.graphql @@ -3,6 +3,7 @@ query ($permissions: [String]!) { username isAuthenticated isAnonymous + isImpersonate person { photo { url @@ -10,7 +11,6 @@ query ($permissions: [String]!) { fullName avatarUrl isDummy - isImpersonate } permissions: globalPermissionsByName(permissions: $permissions) { name diff --git a/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplication.vue b/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplication.vue new file mode 100644 index 0000000000000000000000000000000000000000..73d581937e36ff8f42133c25b73a967bff2ef503 --- /dev/null +++ b/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplication.vue @@ -0,0 +1,82 @@ +<template> + <v-expansion-panel> + <v-expansion-panel-header v-slot="{ open }"> + <div class="d-flex justify-start align-center"> + <v-avatar + x-large + v-if="accessToken.application.icon.absoluteUrl" + class="mr-4" + > + <img + :src="accessToken.application.icon.absoluteUrl" + :alt="accessToken.application.name" + /> + </v-avatar> + <v-avatar x-large v-else class="mr-4" color="secondary"> + <v-icon color="white">mdi-apps</v-icon> + </v-avatar> + <div class="subtitle-1 font-weight-medium"> + {{ accessToken.application.name }} + </div> + </div> + </v-expansion-panel-header> + <v-expansion-panel-content> + <v-list dense class="pa-0"> + <v-list-item> + <v-list-item-content class="body-2"> + {{ + $t("oauth.authorized_application.access_since", { + date: $d(new Date(accessToken.created), "longNumeric"), + }) + }} + · + {{ + $t("oauth.authorized_application.valid_until", { + date: $d(new Date(accessToken.expires), "longNumeric"), + }) + }} + </v-list-item-content> + <v-list-item-action> + <v-btn color="primary" @click="deleteItem(accessToken)"> + {{ $t("oauth.authorized_application.revoke") }} + </v-btn> + </v-list-item-action> + </v-list-item> + <v-list-item v-if="accessToken.scopes && accessToken.scopes.length > 0"> + <div class="pr-4"> + <v-list-item-content class="body-2"> + {{ $t("oauth.authorized_application.has_access_to") }} + </v-list-item-content> + </div> + <v-list dense class="pa-0 flex-grow-1"> + <div v-for="(scope, idx) in accessToken.scopes" :key="scope.name"> + <v-list-item> + <v-list-item-content class="body-2"> + {{ scope.description }} + </v-list-item-content> + </v-list-item> + <v-divider v-if="idx < accessToken.scopes.length - 1" /> + </div> + </v-list> + </v-list-item> + </v-list> + </v-expansion-panel-content> + </v-expansion-panel> +</template> + +<script> +export default { + name: "AuthorizedApplication", + props: { + accessToken: { + type: Object, + required: true, + }, + }, + methods: { + deleteItem(item) { + this.$emit("delete-item", item); + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplications.vue b/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplications.vue new file mode 100644 index 0000000000000000000000000000000000000000..bbf35c8e7f3c2f9e71479c03feb86799b3328d7f --- /dev/null +++ b/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplications.vue @@ -0,0 +1,70 @@ +<template> + <div> + <h1 class="mb-4">{{ $t("oauth.authorized_application.title") }}</h1> + <div v-if="$apollo.queries.accessTokens.loading"> + <v-skeleton-loader type="card"></v-skeleton-loader> + </div> + <div v-else-if="accessTokens"> + <v-card class="mb-4"> + <v-card-title> + {{ $t("oauth.authorized_application.subtitle") }} + </v-card-title> + <v-card-text> + {{ $t("oauth.authorized_application.description") }} + </v-card-text> + <v-expansion-panels flat> + <authorized-application + v-for="(accessToken, index) in accessTokens" + :key="accessToken.id" + :access-token="accessToken" + @delete-item="openDeleteDialog" + /> + </v-expansion-panels> + </v-card> + </div> + <delete-dialog + :item="deleteItem" + :gql-mutation="require('./revokeOauthToken.graphql')" + :gql-query="require('./accessTokens.graphql')" + v-model="deleteDialog" + > + <template #title> + {{ $t("oauth.authorized_application.revoke_question") }} + </template> + <template #body> + <span v-if="deleteItem">{{ deleteItem.application.name }}</span> + </template> + <template #deleteContent> + {{ $t("oauth.authorized_application.revoke") }} + </template> + </delete-dialog> + </div> +</template> + +<script> +import gqlAccessTokens from "./accessTokens.graphql"; +import AuthorizedApplication from "./AuthorizedApplication.vue"; +import DeleteDialog from "../generic/dialogs/DeleteDialog.vue"; + +export default { + name: "AuthorizedApplications", + components: { DeleteDialog, AuthorizedApplication }, + data() { + return { + deleteDialog: false, + deleteItem: null, + }; + }, + methods: { + openDeleteDialog(item) { + this.deleteItem = item; + this.deleteDialog = true; + }, + }, + apollo: { + accessTokens: { + query: gqlAccessTokens, + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/authorized_oauth_applications/accessTokens.graphql b/aleksis/core/frontend/components/authorized_oauth_applications/accessTokens.graphql new file mode 100644 index 0000000000000000000000000000000000000000..68ab08b05d479b8149b3772406a81dd0673c3169 --- /dev/null +++ b/aleksis/core/frontend/components/authorized_oauth_applications/accessTokens.graphql @@ -0,0 +1,19 @@ +{ + accessTokens: oauthAccessTokens { + id + created + updated + expires + scopes { + name + description + } + application { + id + name + icon { + absoluteUrl + } + } + } +} diff --git a/aleksis/core/frontend/components/authorized_oauth_applications/revokeOauthToken.graphql b/aleksis/core/frontend/components/authorized_oauth_applications/revokeOauthToken.graphql new file mode 100644 index 0000000000000000000000000000000000000000..6b2f8adbde00d9e0e4f3419673324f8962266683 --- /dev/null +++ b/aleksis/core/frontend/components/authorized_oauth_applications/revokeOauthToken.graphql @@ -0,0 +1,5 @@ +mutation ($id: ID!) { + revokeOauthToken(id: $id) { + ok + } +} diff --git a/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue b/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue index 5564ae8aa508268fc5ad1145bc14581fd3de08f9..954f745e411f2b5075549227a7cc5d3f16689948 100644 --- a/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue +++ b/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue @@ -33,7 +33,7 @@ </message-box> </div> <message-box - v-if="progress.state === 'ERROR'" + v-if="progress.state === 'FAILURE'" dense type="error" transition="slide-x-transition" @@ -60,13 +60,13 @@ <v-card-actions v-if=" progress && - (progress.state === 'ERROR' || progress.state === 'SUCCESS') + (progress.state === 'FAILURE' || progress.state === 'SUCCESS') " > <back-button :href="progress.meta.backUrl" text /> <v-spacer /> <v-btn - v-if="progress.meta.additionalButton" + v-if="progress.meta.additionalButton && progress.state === 'SUCCESS'" :href="progress.meta.additionalButton.url" text color="primary" @@ -108,7 +108,7 @@ export default { }, watch: { state(newState) { - if (newState === "SUCCESS" || newState === "ERROR") { + if (newState === "SUCCESS" || newState === "FAILURE") { this.$apollo.queries.celeryProgressByTaskId.stopPolling(); this.$apollo.mutate({ mutation: gqlCeleryProgressFetched, diff --git a/aleksis/core/frontend/components/generic/UpdateIndicator.vue b/aleksis/core/frontend/components/generic/UpdateIndicator.vue new file mode 100644 index 0000000000000000000000000000000000000000..16d5558bf3f75cf99d789f501b8e856038ccc528 --- /dev/null +++ b/aleksis/core/frontend/components/generic/UpdateIndicator.vue @@ -0,0 +1,85 @@ +<template> + <v-tooltip bottom> + <template #activator="{ on, attrs }"> + <v-btn + right + icon + v-bind="attrs" + v-on="on" + @click="handleClick" + :loading="status === $options.UPDATING" + > + <v-icon v-if="status !== $options.UPDATING" :color="color"> + {{ icon }} + </v-icon> + </v-btn> + </template> + <span>{{ text }}</span> + </v-tooltip> +</template> + +<script> +export default { + ERROR: "ERROR", // Something went wrong + SAVED: "SAVED", // Everything alright + UPDATING: "UPDATING", // We are sending something to the server + CHANGES: "CHANGES", // the user changed something, but it has not been saved yet + name: "UpdateIndicator", + emits: ["manual-update"], + props: { + status: { + type: String, + required: true, + }, + }, + computed: { + text() { + switch (this.status) { + case this.$options.SAVED: + return this.$t("status.saved"); + case this.$options.UPDATING: + return this.$t("status.updating"); + case this.$options.CHANGES: + return this.$t("status.changes"); + default: + return this.$t("status.error"); + } + }, + color() { + switch (this.status) { + case this.$options.SAVED: + return "success"; + case this.$options.CHANGES: + return "secondary"; + case this.$options.UPDATING: + return "secondary"; + default: + return "error"; + } + }, + icon() { + switch (this.status) { + case this.$options.SAVED: + return "$success"; + case this.$options.CHANGES: + return "mdi-dots-horizontal"; + default: + return "$warning"; + } + }, + isAbleToClick() { + return ( + this.status === this.$options.CHANGES || + this.status === this.$options.ERROR + ); + }, + }, + methods: { + handleClick() { + if (this.isAbleToClick) { + this.$emit("manual-update"); + } + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/generic/dialogs/DeleteDialog.vue b/aleksis/core/frontend/components/generic/dialogs/DeleteDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..a56e3960cd1ae29e60f966a44ae69adeb0332949 --- /dev/null +++ b/aleksis/core/frontend/components/generic/dialogs/DeleteDialog.vue @@ -0,0 +1,136 @@ +<template> + <ApolloMutation + v-if="dialogOpen" + :mutation="gqlMutation" + :variables="{ id: item.id }" + :update="update" + @done="close(true)" + > + <template #default="{ mutate, loading, error }"> + <v-dialog v-model="dialogOpen" max-width="500px"> + <v-card> + <v-card-title class="text-h5"> + <slot name="title"> + {{ $t("actions.confirm_deletion") }} + </slot> + </v-card-title> + <v-card-text> + <slot name="body"> + <p class="text-body-1">{{ nameOfObject }}</p> + </slot> + </v-card-text> + <v-card-actions> + <v-spacer></v-spacer> + <v-btn text @click="close(false)" :disabled="loading"> + <slot name="cancelContent"> + {{ $t("actions.cancel") }} + </slot> + </v-btn> + <v-btn + color="error" + text + @click="mutate" + :loading="loading" + :disabled="loading" + > + <slot name="deleteContent"> + {{ $t("actions.delete") }} + </slot> + </v-btn> + </v-card-actions> + </v-card> + </v-dialog> + <v-snackbar :value="error !== null"> + {{ error }} + + <template #action="{ attrs }"> + <v-btn color="primary" text v-bind="attrs" @click="error = null" icon> + <v-icon>$close</v-icon> + </v-btn> + </template> + </v-snackbar> + </template> + </ApolloMutation> +</template> + +<script> +export default { + name: "DeleteDialog", + computed: { + nameOfObject() { + return this.itemAttribute in this.item || {} + ? this.item[this.itemAttribute] + : this.item.toString(); + }, + dialogOpen: { + get() { + return this.value; + }, + + set(val) { + this.$emit("input", val); + }, + }, + }, + methods: { + update(store) { + if (!this.gqlQuery) { + // There is no GraphQL query to update + return; + } + + // Read the data from cache for query + const storedData = store.readQuery({ query: this.gqlQuery }); + + if (!storedData) { + // There are no data in the cache yet + return; + } + + const storedDataKey = Object.keys(storedData)[0]; + + // Remove item from stored data + const index = storedData[storedDataKey].findIndex( + (m) => m.id === this.item.id + ); + storedData[storedDataKey].splice(index, 1); + + // Write data back to the cache + store.writeQuery({ query: this.gqlQuery, data: storedData }); + }, + close(success) { + this.$emit("input", false); + if (success) { + this.$emit("success"); + } else { + this.$emit("cancel"); + } + }, + }, + props: { + value: { + type: Boolean, + required: true, + }, + item: { + type: Object, + required: false, + default: () => ({}), + }, + itemAttribute: { + type: String, + required: false, + default: "name", + }, + gqlMutation: { + type: Object, + required: true, + }, + gqlQuery: { + type: Object, + required: false, + default: null, + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/index.js b/aleksis/core/frontend/index.js index 25df11b343a0708bbb6a1a378cfa1b17ab154749..f59aa8578b59addcb420d6165c6ef1672c669c30 100644 --- a/aleksis/core/frontend/index.js +++ b/aleksis/core/frontend/index.js @@ -65,11 +65,25 @@ const app = new Vue({ render: (h) => h(App), data: () => ({ showCacheAlert: false, - contentLoading: false, + contentLoading: true, offline: false, backgroundActive: true, + invalidation: false, snackbarItems: [], }), + computed: { + matchedComponents() { + if (this.$route.matched.length > 0) { + return this.$route.matched.map( + (route) => route.components.default.name + ); + } + return []; + }, + isLegacyBaseTemplate() { + return this.matchedComponents.includes("LegacyBaseTemplate"); + }, + }, router, i18n, }); diff --git a/aleksis/core/frontend/messages/de.json b/aleksis/core/frontend/messages/de.json index aa1318fe1b0a7062b68b7267305860bf918f7ee8..3fb6c19b89ea2dcdfd80a00c88496c4fabb89271 100644 --- a/aleksis/core/frontend/messages/de.json +++ b/aleksis/core/frontend/messages/de.json @@ -73,9 +73,14 @@ }, "actions": { "back": "Zurück", + "cancel": "Abbrechen", "close": "Schließen", + "confirm_deletion": "Sind Sie sicher, dass sie dieses Objekt löschen wollen?", + "delete": "Löschen", "edit": "Bearbeiten", - "search": "Suchen" + "save": "Speichern", + "search": "Suchen", + "stop_editing": "Bearbeiten beenden" }, "administration": { "backend_admin": { @@ -99,9 +104,9 @@ "imprint": "Impressum", "logo": "Logo", "no_permission": "Sie haben nicht die nötigen Berechtigungen, um diese Seite aufzurufen. Bitte loggen Sie sich mit einem anderen Account ein.", - "no_permission_message_long": "Sie haben nicht die nötigen Berechtigungen, um diese Seite aufzurufen. Bitte loggen Sie sich mit einem anderen Account ein.", + "no_permission_message_long": "Sie haben keine Berichtigung, diese Seite zu sehen. Bitte melden Sie sich mit einem anderen Konto an.", "no_permission_message_short": "Keine Berechtigung", - "no_permission_redirect_text": "Zum Login gehen", + "no_permission_redirect_text": "Zur Anmeldung gehen", "person_is_dummy": "Ihr Administratorenkonto ist mit keiner Person verknüpft. Deshalb wurde Ihr Konto mit einer Dummyperson verknüpft.", "privacy_policy": "Datenschutzerklärung", "user_not_linked_to_person": "Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das bedeutet, dass Sie keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie sich an die Verwaltenden von AlekSIS an Ihrer Schule." @@ -173,6 +178,17 @@ "title": "OAuth-Anwendung", "title_plural": "OAuth-Anwendungen" }, + "authorized_application": { + "access_since": "Zugriff seit {date}", + "description": "Die folgenden Drittanbieter-Anwendungen haben Zugriff auf Ihr Konto. Sie können den Zugriff für diejenigen, die Sie nicht mehr brauchen oder denen Sie nicht mehr vertrauen, jederzeit widerrufen.", + "has_access_to": "Hat Zugriff auf:", + "menu_title": "Drittanbieter-Anwendungen", + "revoke": "Zugriff widerrufen", + "revoke_question": "Sind Sie sicher, dass Sie den Zugriff für folgende Anwendung widerrufen wollen?", + "subtitle": "Drittanbieter-Anwendungen mit Zugriff auf Ihr Konto", + "title": "Drittanbieter-Anwendungen", + "valid_until": "Gültig bis {date}" + }, "authorized_token": { "menu_title": "Autorisierte Anwendungen" } @@ -225,5 +241,11 @@ "dismiss": "Verwerfen", "new_version_available": "Es ist eine neue Version der App verfügbar", "update": "Aktualisieren" + }, + "status": { + "changes": "Sie haben nicht gespeicherte Änderungen.", + "error": "Beim Speichern der letzten Änderungen ist ein Fehler aufgetreten.", + "saved": "Alle Änderungen sind gespeichert.", + "updating": "Änderungen werden synchronisiert." } } diff --git a/aleksis/core/frontend/messages/en.json b/aleksis/core/frontend/messages/en.json index 3adabc47bc60d1bfca2dfd74b0c4b31591c2ea88..8be55bd566f50295291d61b392fdfc23a63ba2e8 100644 --- a/aleksis/core/frontend/messages/en.json +++ b/aleksis/core/frontend/messages/en.json @@ -1,7 +1,6 @@ { "about": { "about_aleksis": "About AlekSIS®", - "page_title": "About AlekSIS®", "about_aleksis_1": "This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and can be used by anyone.", "about_aleksis_2": "AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.", "free_open_source_licence": "Free/Open Source Licence", @@ -15,10 +14,11 @@ "more_information_eupl": "More information about the EUPL", "open_source": "Open Source", "other_licence": "Other Licence", + "page_title": "About AlekSIS®", "proprietary": "Proprietary", + "show_copyright": "Show copyright", "source_code": "Source Code", - "website_of_aleksis": "Website of AlekSIS", - "show_copyright": "Show copyright" + "website_of_aleksis": "Website of AlekSIS" }, "accounts": { "change_password": { @@ -45,37 +45,42 @@ "menu_title": "Third-party Accounts" }, "two_factor": { + "add_authentication_method": "Add Authentication Method", + "backup_codes_count": "You have no backup codes remaining.|You have only one backup code remaining.|You have {counter} backup codes remaining.", + "backup_codes_description": "If you can't use any of your devices, you can access your account using backup codes.", + "backup_codes_title": "Backup Codes", + "disable_button": "Disable Two-Factor Authentication", + "disable_description": "However we strongly discourage you to do so, you can also disable two-factor authentication for your account.", + "disable_title": "Disable Two-Factor Authentication", + "enable_button": "Enable Two-Factor Authentication", + "enable_description": "Two-factor authentication is not enabled for your account. Enable two-factor authentication for enhanced account security.", + "enable_title": "Two-Factor Authentication Currently Disabled", "menu_title": "2FA", - "title": "Two-Factor Authentication", - "primary_device_title": "Primary Authentication Device", - "primary_device_description": "While logging in, AlekSIS will ask you to confirm the login with the following device. If this device is not available, you can use a backup device.", - "other_devices_title": "Other Authentication Devices", - "other_devices_description": "If your primary authentication device is not available during logging in, you can use one of these devices:", "methods": { - "generator": "You generate one-time codes using a code generator.", + "call": "We will call you at your mobile phone and tell you a one-time code.", "email": "We will send you one-time codes to your e-mail address.", + "generator": "You generate one-time codes using a code generator.", "sms": "We will send you one-time codes to your mobile phone number.", - "call": "We will call you at your mobile phone and tell you a one-time code.", "webauthn": "You use a security key (either as external device or integrated in your personal device).", "yubikey": "You use a Yubikey to generate one-time codes." }, - "add_authentication_method": "Add Authentication Method", - "backup_codes_title": "Backup Codes", - "backup_codes_description": "If you can't use any of your devices, you can access your account using backup codes.", - "backup_codes_count": "You have no backup codes remaining.|You have only one backup code remaining.|You have {counter} backup codes remaining.", - "disable_title": "Disable Two-Factor Authentication", - "disable_description": "However we strongly discourage you to do so, you can also disable two-factor authentication for your account.", - "disable_button": "Disable Two-Factor Authentication", - "enable_title": "Two-Factor Authentication Currently Disabled", - "enable_description": "Two-factor authentication is not enabled for your account. Enable two-factor authentication for enhanced account security.", - "enable_button": "Enable Two-Factor Authentication" + "other_devices_description": "If your primary authentication device is not available during logging in, you can use one of these devices:", + "other_devices_title": "Other Authentication Devices", + "primary_device_description": "While logging in, AlekSIS will ask you to confirm the login with the following device. If this device is not available, you can use a backup device.", + "primary_device_title": "Primary Authentication Device", + "title": "Two-Factor Authentication" } }, "actions": { "back": "Back", - "search": "Search", + "cancel": "Cancel", + "close": "Close", + "confirm_deletion": "Are you sure you want to delete this item?", + "delete": "Delete", "edit": "Edit", - "close": "Close" + "save": "Save", + "search": "Search", + "stop_editing": "Stop editing" }, "administration": { "backend_admin": { @@ -97,13 +102,14 @@ "base": { "about_aleksis": "About AlekSIS® — The Free School Information System", "imprint": "Imprint", - "person_is_dummy": "Your administrator account is not linked to any person. Therefore, a dummy person has been linked to your account.", - "privacy_policy": "Privacy Policy", - "user_not_linked_to_person": "Your user account is not linked to a person. This means you cannot access any school-related information. Please contact the managers of AlekSIS at your school.", + "logo": "Logo", + "no_permission": "", "no_permission_message_long": "You have no permission to view this page. Please login with an other account.", "no_permission_message_short": "No permission", "no_permission_redirect_text": "Go to login", - "logo": "Logo" + "person_is_dummy": "Your administrator account is not linked to any person. Therefore, a dummy person has been linked to your account.", + "privacy_policy": "Privacy Policy", + "user_not_linked_to_person": "Your user account is not linked to a person. This means you cannot access any school-related information. Please contact the managers of AlekSIS at your school." }, "celery_progress": { "error_message": "The operation couldn't be finished successfully.", @@ -111,11 +117,6 @@ "running_tasks": "1 running task | {number} running tasks", "success_message": "The operation has been finished successfully." }, - "download_pdf": { - "title": "Downloading PDF file ...", - "download": "Download", - "notice": "If the download does not start automatically, please click the button below." - }, "dashboard": { "dashboard_widget": { "menu_title": "Dashboard Widgets", @@ -127,6 +128,14 @@ "data_check": { "menu_title": "Data Checks" }, + "download_pdf": { + "download": "Download", + "notice": "If the download does not start automatically, please click the button below.", + "title": "Downloading PDF file ..." + }, + "graphql": { + "snackbar_error_message": "There was an error retrieving the page data. Please try again." + }, "group": { "additional_field": { "menu_title": "Additional Fields", @@ -140,9 +149,9 @@ }, "groups_and_child_groups": "Groups and Child Groups", "menu_title": "Groups", + "ownership": "Group ownership", "title": "Group", - "title_plural": "Groups", - "ownership": "Group ownership" + "title_plural": "Groups" }, "ical_feed": { "menu_title": "Calendar Feeds" @@ -150,6 +159,13 @@ "legacy": { "unworthy": "The life-form who created this view did not bow to the powers of the almighty Aleksolotl." }, + "network_errors": { + "back_to_start": "Back to home page", + "error_404": "404", + "offline_notification": "You are offline. Some features may not work and some data may not be up to date.", + "page_not_found": "The requested page or resource could not be found.", + "snackbar_error_message": "A network error occurred. Please try again." + }, "notifications": { "mark_as_read": "Mark as read", "more_information": "More information", @@ -162,8 +178,19 @@ "title": "OAuth Application", "title_plural": "OAuth Applications" }, + "authorized_application": { + "access_since": "Access since {date}", + "description": "The following third-party applications have access to your account. You can revoke access at any time for those you don't need or trust anymore.", + "has_access_to": "Has access to:", + "menu_title": "Third-party Applications", + "revoke": "Revoke Access", + "revoke_question": "Are you sure you want to revoke access for this application?", + "subtitle": "Third-party Applications With Access to Your Account", + "title": "Third-party Applications", + "valid_until": "Valid until {date}" + }, "authorized_token": { - "menu_title": "Authorized Applications" + "menu_title": "" } }, "people": "People", @@ -174,32 +201,32 @@ }, "person": { "account_menu_title": "Account", - "avatar": "Avatar", "additional_image": "Additional Image", - "no_additional_image": "The person didn't upload an additional Image", - "logged_in_as": "Logged in as", - "menu_title": "Persons", - "page_title": "Person", - "title": "Person", - "title_plural": "Persons", - "mobile": "mobile phone", - "home": "home phone", - "details": "Contact details", + "avatar": "Avatar", "children": "Children", - "guardians": "Guardians / Parents", - "no_persons": "No Persons", "delete": "Delete", + "details": "Contact details", + "guardians": "Guardians / Parents", + "home": "home phone", "impersonation": { "impersonate": "Impersonate", - "stop": "Stop Impersonation", - "impersonating": "Impersonating" + "impersonating": "Impersonating", + "stop": "Stop Impersonation" }, - "invite": "Invite" + "invite": "Invite", + "logged_in_as": "Logged in as", + "menu_title": "Persons", + "mobile": "mobile phone", + "no_additional_image": "The person didn't upload an additional Image", + "no_persons": "No Persons", + "page_title": "Person", + "title": "Person", + "title_plural": "Persons" }, "preferences": { "person": { - "menu_title": "Preferences", - "change_preferences": "Preferences" + "change_preferences": "Preferences", + "menu_title": "Preferences" }, "site": { "menu_title": "Configuration" @@ -210,19 +237,15 @@ "title": "School Term", "title_plural": "School Terms" }, - "network_errors": { - "error_404": "404", - "page_not_found": "The requested page or resource could not be found.", - "back_to_start": "Back to home page", - "snackbar_error_message": "A network error occurred. Please try again.", - "offline_notification": "You are offline. Some features may not work and some data may not be up to date." - }, "service_worker": { + "dismiss": "Dismiss", "new_version_available": "A new version of the app is available", - "update": "Update", - "dismiss": "Dismiss" + "update": "Update" }, - "graphql": { - "snackbar_error_message": "There was an error retrieving the page data. Please try again." + "status": { + "changes": "You have unsaved changes.", + "error": "There has been an error while saving the latest changes.", + "saved": "All changes are saved.", + "updating": "Changes are being synced." } } diff --git a/aleksis/core/frontend/mixins/aleksis.js b/aleksis/core/frontend/mixins/aleksis.js index 036e2eac71db6304bba88e2a01c3cfbe33edca51..59204a7f689d6280941ea5f72f2e8e8d591c59b9 100644 --- a/aleksis/core/frontend/mixins/aleksis.js +++ b/aleksis/core/frontend/mixins/aleksis.js @@ -20,7 +20,7 @@ const aleksisMixin = { }, }, mounted() { - this.$root.contentLoading = false; + this.$emit("mounted"); }, beforeDestroy() { // Unregister all safely added event listeners as to not leak them diff --git a/aleksis/core/frontend/mixins/error404.js b/aleksis/core/frontend/mixins/error404.js new file mode 100644 index 0000000000000000000000000000000000000000..343c2a4341a62447053ec505323c21be99f82066 --- /dev/null +++ b/aleksis/core/frontend/mixins/error404.js @@ -0,0 +1,26 @@ +/** + * Vue mixin containing code setting error 404 status. + * + * Only used by main App component, but factored out for readability. + */ + +const error404Mixin = { + methods: { + set404() { + if (this.$route.matched.length === 0) { + this.error404 = true; + this.$root.contentLoading = false; + } else { + this.error404 = false; + } + }, + }, + mounted() { + this.$router.onReady(this.set404); + this.$router.afterEach((to, from) => { + this.set404(); + }); + }, +}; + +export default error404Mixin; diff --git a/aleksis/core/frontend/mixins/menus.js b/aleksis/core/frontend/mixins/menus.js index ee07678848c93436fc15f4f015b056f7a7728aa1..9ba58bcaa84e72917e3057614fca6058df39af3a 100644 --- a/aleksis/core/frontend/mixins/menus.js +++ b/aleksis/core/frontend/mixins/menus.js @@ -55,7 +55,8 @@ const menusMixin = { : true) && (route.meta.validators ? this.checkValidators(route.meta.validators) - : true) + : true) && + !route.meta.hide ) { let menuItem = { ...route.meta, @@ -83,7 +84,8 @@ const menusMixin = { : true) && (route.meta.validators ? this.checkValidators(route.meta.validators) - : true) + : true) && + !route.meta.hide ) { let menuItem = { ...route.meta, diff --git a/aleksis/core/frontend/mixins/routes.js b/aleksis/core/frontend/mixins/routes.js index 813edd5777e9868680d5a5d9e8e495d70ef35790..9adbdafc7426fcc19174f91266b978471f3a38e9 100644 --- a/aleksis/core/frontend/mixins/routes.js +++ b/aleksis/core/frontend/mixins/routes.js @@ -14,7 +14,7 @@ const routesMixin = { apollo: { dynamicRoutes: { query: gqlDynamicRoutes, - pollInterval: 60000, + pollInterval: 10000, }, }, watch: { @@ -38,6 +38,8 @@ const routesMixin = { menuPermission: route.menuPermission, permission: route.routePermission, newTab: route.menuNewTab, + dynamic: true, + hide: false, }, }; @@ -49,6 +51,17 @@ const routesMixin = { } } + for (const route of this.$router + .getRoutes() + .filter((r) => r.meta.dynamic && !r.meta.hide)) { + if ( + !(newDynamicRoutes.map((r) => r.routeName).indexOf(route.name) > -1) + ) { + let hiddenRoute = { ...route, meta: { ...route.meta, hide: true } }; + this.$router.addRoute(hiddenRoute); + } + } + this.getPermissionNames(); this.buildMenus(); }, diff --git a/aleksis/core/frontend/plugins/aleksis.js b/aleksis/core/frontend/plugins/aleksis.js index 8c221c6d62953206b501aa7c7d949e808d2e63cd..c35b9127f78f6c26c3e5c052cc5732322f509090 100644 --- a/aleksis/core/frontend/plugins/aleksis.js +++ b/aleksis/core/frontend/plugins/aleksis.js @@ -123,15 +123,19 @@ AleksisVue.install = function (Vue) { Vue.prototype.$invalidateState = function () { console.info("Invalidating application state"); + this.invalidation = true; + this.$apollo .getClient() .resetStore() .then( - function () { + () => { console.info("GraphQL cache cleared"); + this.invalidation = false; }, - function (error) { + (error) => { console.error("Could not clear GraphQL cache:", error); + this.invalidation = false; } ); }; @@ -156,6 +160,12 @@ AleksisVue.install = function (Vue) { // eslint-disable-next-line no-unused-vars this.$router.afterEach((to, from) => { + if (vm.isLegacyBaseTemplate) { + // Skip resetting loading state for legacy pages + // as they are probably not finished with loading yet + // LegacyBaseTemplate will reset the loading state later + return; + } vm.contentLoading = false; }); diff --git a/aleksis/core/frontend/routes.js b/aleksis/core/frontend/routes.js index 215f4d1485644883eef42f14216735547abb041a..aa84f36c4aa9f634f081edb9338f8f264dc9c2fe 100644 --- a/aleksis/core/frontend/routes.js +++ b/aleksis/core/frontend/routes.js @@ -920,14 +920,14 @@ const routes = [ }, { path: "/oauth/authorized_tokens/", - component: () => import("./components/LegacyBaseTemplate.vue"), - props: { - byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, - }, + component: () => + import( + "./components/authorized_oauth_applications/AuthorizedApplications.vue" + ), name: "core.oauth.authorizedTokens", meta: { inAccountMenu: true, - titleKey: "oauth.authorized_token.menu_title", + titleKey: "oauth.authorized_application.menu_title", icon: "mdi-gesture-tap-hold", permission: "core.manage_authorized_tokens_rule", }, @@ -1055,6 +1055,14 @@ const routes = [ titleKey: "about.page_title", }, }, + { + path: "/invitations/accept-invite/:code", + component: () => import("./components/LegacyBaseTemplate.vue"), + props: { + byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, + }, + name: "invitations.accept_invite", + }, ]; // This imports all known AlekSIS app entrypoints diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po index fb1798fff0394bf91072242e77249e8c1ec34ba4..7c475008f800e2ab26d51154f5050eb6a6e1dc32 100644 --- a/aleksis/core/locale/ar/LC_MESSAGES/django.po +++ b/aleksis/core/locale/ar/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-27 13:23+0100\n" +"POT-Creation-Date: 2023-05-09 18:40+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -18,28 +18,32 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: aleksis/core/apps.py:155 +#: aleksis/core/apps.py:151 +msgid "You have been logged out successfully." +msgstr "" + +#: aleksis/core/apps.py:161 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:156 +#: aleksis/core/apps.py:162 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:157 +#: aleksis/core/apps.py:163 msgid "Full home postal address" msgstr "" -#: aleksis/core/apps.py:158 +#: aleksis/core/apps.py:164 msgid "Email address" msgstr "" -#: aleksis/core/apps.py:159 +#: aleksis/core/apps.py:165 msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 -#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:166 aleksis/core/forms.py:221 +#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 msgid "Groups" msgstr "" @@ -98,172 +102,172 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +#: aleksis/core/filters.py:113 aleksis/core/models.py:721 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +#: aleksis/core/filters.py:135 aleksis/core/models.py:494 msgid "Group" msgstr "" -#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +#: aleksis/core/forms.py:51 aleksis/core/forms.py:582 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +#: aleksis/core/forms.py:56 aleksis/core/tables.py:47 msgid "Address" msgstr "" -#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +#: aleksis/core/forms.py:57 aleksis/core/forms.py:591 msgid "Contact data" msgstr "" -#: aleksis/core/forms.py:58 +#: aleksis/core/forms.py:59 msgid "Advanced personal data" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "New user" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "Create a new account" msgstr "" -#: aleksis/core/forms.py:132 +#: aleksis/core/forms.py:133 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:136 +#: aleksis/core/forms.py:137 msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +#: aleksis/core/forms.py:154 aleksis/core/models.py:142 msgid "School term" msgstr "" -#: aleksis/core/forms.py:154 +#: aleksis/core/forms.py:155 msgid "Common data" msgstr "" -#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:208 +#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" -#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +#: aleksis/core/forms.py:157 aleksis/core/forms.py:593 msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:157 aleksis/core/models.py:217 -#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +#: aleksis/core/forms.py:158 aleksis/core/models.py:218 +#: aleksis/core/models.py:547 aleksis/core/tables.py:46 msgid "Photo" msgstr "" -#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:84 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:85 msgid "Date" msgstr "" -#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:92 +#: aleksis/core/forms.py:201 aleksis/core/forms.py:204 +#: aleksis/core/models.py:93 msgid "Time" msgstr "" -#: aleksis/core/forms.py:233 +#: aleksis/core/forms.py:234 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:236 +#: aleksis/core/forms.py:237 msgid "Who should see the announcement?" msgstr "" -#: aleksis/core/forms.py:237 +#: aleksis/core/forms.py:238 msgid "Write your announcement:" msgstr "" -#: aleksis/core/forms.py:276 +#: aleksis/core/forms.py:277 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:280 +#: aleksis/core/forms.py:281 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:289 +#: aleksis/core/forms.py:290 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:398 +#: aleksis/core/forms.py:399 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:399 +#: aleksis/core/forms.py:400 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "First name" msgstr "" -#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +#: aleksis/core/forms.py:420 aleksis/core/models.py:194 msgid "Last name" msgstr "" -#: aleksis/core/forms.py:428 +#: aleksis/core/forms.py:429 msgid "A person is using this e-mail address" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:457 msgid "Who should get the permission?" msgstr "" -#: aleksis/core/forms.py:457 +#: aleksis/core/forms.py:458 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:483 +#: aleksis/core/forms.py:484 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:486 +#: aleksis/core/forms.py:487 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:494 +#: aleksis/core/forms.py:495 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:499 +#: aleksis/core/forms.py:500 msgid "You must grant the permission to all objects or to specific objects." msgstr "" -#: aleksis/core/forms.py:586 +#: aleksis/core/forms.py:587 msgid "Address data" msgstr "" -#: aleksis/core/forms.py:598 +#: aleksis/core/forms.py:599 msgid "Account data" msgstr "" -#: aleksis/core/forms.py:605 +#: aleksis/core/forms.py:606 msgid "Password" msgstr "" -#: aleksis/core/forms.py:608 +#: aleksis/core/forms.py:609 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:761 +#: aleksis/core/forms.py:762 msgid "The selected action does not exist." msgstr "" -#: aleksis/core/forms.py:772 +#: aleksis/core/forms.py:773 msgid "You do not have permission to run {} on all selected objects." msgstr "" -#: aleksis/core/forms.py:828 +#: aleksis/core/forms.py:829 msgid "No valid selection." msgstr "" @@ -291,658 +295,658 @@ msgstr "" msgid "Linked school term" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:83 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:83 +#: aleksis/core/models.py:84 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:85 +#: aleksis/core/models.py:86 msgid "Date and time" msgstr "" -#: aleksis/core/models.py:86 +#: aleksis/core/models.py:87 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:87 aleksis/core/models.py:210 +#: aleksis/core/models.py:88 aleksis/core/models.py:211 msgid "E-mail address" msgstr "" -#: aleksis/core/models.py:88 +#: aleksis/core/models.py:89 msgid "Integer" msgstr "" -#: aleksis/core/models.py:89 +#: aleksis/core/models.py:90 msgid "IP address" msgstr "" -#: aleksis/core/models.py:90 +#: aleksis/core/models.py:91 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:91 +#: aleksis/core/models.py:92 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:93 +#: aleksis/core/models.py:94 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +#: aleksis/core/models.py:106 aleksis/core/models.py:1078 msgid "Name" msgstr "" -#: aleksis/core/models.py:107 +#: aleksis/core/models.py:108 msgid "Start date" msgstr "" -#: aleksis/core/models.py:108 +#: aleksis/core/models.py:109 msgid "End date" msgstr "" -#: aleksis/core/models.py:127 +#: aleksis/core/models.py:128 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:134 +#: aleksis/core/models.py:135 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:142 +#: aleksis/core/models.py:143 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 msgid "School terms" msgstr "" -#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +#: aleksis/core/models.py:164 aleksis/core/models.py:1027 msgid "Person" msgstr "" -#: aleksis/core/models.py:166 +#: aleksis/core/models.py:167 msgid "Can view address" msgstr "" -#: aleksis/core/models.py:167 +#: aleksis/core/models.py:168 msgid "Can view contact details" msgstr "" -#: aleksis/core/models.py:168 +#: aleksis/core/models.py:169 msgid "Can view photo" msgstr "" -#: aleksis/core/models.py:169 +#: aleksis/core/models.py:170 msgid "Can view avatar image" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:171 msgid "Can view persons groups" msgstr "" -#: aleksis/core/models.py:171 +#: aleksis/core/models.py:172 msgid "Can view personal details" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "female" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "male" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "other" msgstr "" -#: aleksis/core/models.py:189 aleksis/core/models.py:1353 +#: aleksis/core/models.py:190 aleksis/core/models.py:1382 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:195 +#: aleksis/core/models.py:196 msgid "Additional name(s)" msgstr "" -#: aleksis/core/models.py:199 aleksis/core/models.py:511 -#: aleksis/core/models.py:1439 +#: aleksis/core/models.py:200 aleksis/core/models.py:512 +#: aleksis/core/models.py:1468 msgid "Short name" msgstr "" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:203 msgid "Street" msgstr "" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:204 msgid "Street number" msgstr "" -#: aleksis/core/models.py:204 +#: aleksis/core/models.py:205 msgid "Postal code" msgstr "" -#: aleksis/core/models.py:205 +#: aleksis/core/models.py:206 msgid "Place" msgstr "" -#: aleksis/core/models.py:207 +#: aleksis/core/models.py:208 msgid "Home phone" msgstr "" -#: aleksis/core/models.py:208 +#: aleksis/core/models.py:209 msgid "Mobile phone" msgstr "" -#: aleksis/core/models.py:212 +#: aleksis/core/models.py:213 msgid "Date of birth" msgstr "" -#: aleksis/core/models.py:213 +#: aleksis/core/models.py:214 msgid "Place of birth" msgstr "" -#: aleksis/core/models.py:214 +#: aleksis/core/models.py:215 msgid "Sex" msgstr "" -#: aleksis/core/models.py:221 aleksis/core/models.py:550 +#: aleksis/core/models.py:222 aleksis/core/models.py:551 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:226 aleksis/core/models.py:554 +#: aleksis/core/models.py:227 aleksis/core/models.py:555 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:229 aleksis/core/models.py:557 +#: aleksis/core/models.py:230 aleksis/core/models.py:558 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:234 +#: aleksis/core/models.py:235 msgid "Guardians / Parents" msgstr "" -#: aleksis/core/models.py:241 +#: aleksis/core/models.py:242 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:244 aleksis/core/models.py:724 -#: aleksis/core/models.py:748 aleksis/core/models.py:843 -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:245 aleksis/core/models.py:725 +#: aleksis/core/models.py:749 aleksis/core/models.py:844 +#: aleksis/core/models.py:1113 msgid "Description" msgstr "" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:465 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:466 +#: aleksis/core/models.py:467 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:468 +#: aleksis/core/models.py:469 msgid "Required" msgstr "" -#: aleksis/core/models.py:469 +#: aleksis/core/models.py:470 msgid "Help text / description" msgstr "" -#: aleksis/core/models.py:475 +#: aleksis/core/models.py:476 msgid "Addtitional field for groups" msgstr "" -#: aleksis/core/models.py:476 +#: aleksis/core/models.py:477 msgid "Addtitional fields for groups" msgstr "" -#: aleksis/core/models.py:496 +#: aleksis/core/models.py:497 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:497 +#: aleksis/core/models.py:498 msgid "Can view statistics about group." msgstr "" -#: aleksis/core/models.py:509 aleksis/core/models.py:1440 +#: aleksis/core/models.py:510 aleksis/core/models.py:1469 msgid "Long name" msgstr "" -#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "" -#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:537 +#: aleksis/core/models.py:538 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:542 +#: aleksis/core/models.py:543 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 msgid "Additional fields" msgstr "" -#: aleksis/core/models.py:723 aleksis/core/models.py:747 -#: aleksis/core/models.py:842 aleksis/core/models.py:1270 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:843 aleksis/core/models.py:1299 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "" -#: aleksis/core/models.py:726 +#: aleksis/core/models.py:727 msgid "Application" msgstr "" -#: aleksis/core/models.py:732 +#: aleksis/core/models.py:733 msgid "Activity" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:734 msgid "Activities" msgstr "" -#: aleksis/core/models.py:739 +#: aleksis/core/models.py:740 msgid "Sender" msgstr "" -#: aleksis/core/models.py:744 +#: aleksis/core/models.py:745 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +#: aleksis/core/models.py:750 aleksis/core/models.py:1079 msgid "Link" msgstr "" -#: aleksis/core/models.py:752 aleksis/core/models.py:1079 -#: aleksis/core/models.py:1400 +#: aleksis/core/models.py:753 aleksis/core/models.py:1080 +#: aleksis/core/models.py:1429 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "" -#: aleksis/core/models.py:755 +#: aleksis/core/models.py:756 msgid "Send notification at" msgstr "" -#: aleksis/core/models.py:757 +#: aleksis/core/models.py:758 msgid "Read" msgstr "" -#: aleksis/core/models.py:758 +#: aleksis/core/models.py:759 msgid "Sent" msgstr "" -#: aleksis/core/models.py:775 +#: aleksis/core/models.py:776 msgid "Notification" msgstr "" -#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +#: aleksis/core/models.py:777 aleksis/core/preferences.py:29 msgid "Notifications" msgstr "" -#: aleksis/core/models.py:844 +#: aleksis/core/models.py:845 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:847 +#: aleksis/core/models.py:848 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:850 +#: aleksis/core/models.py:851 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:875 +#: aleksis/core/models.py:876 msgid "Announcement" msgstr "" -#: aleksis/core/models.py:876 +#: aleksis/core/models.py:877 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 msgid "Announcements" msgstr "" -#: aleksis/core/models.py:913 +#: aleksis/core/models.py:914 msgid "Announcement recipient" msgstr "" -#: aleksis/core/models.py:914 +#: aleksis/core/models.py:915 msgid "Announcement recipients" msgstr "" -#: aleksis/core/models.py:934 +#: aleksis/core/models.py:935 msgid "Widget Title" msgstr "" -#: aleksis/core/models.py:935 +#: aleksis/core/models.py:936 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:936 +#: aleksis/core/models.py:937 msgid "Widget is broken" msgstr "" -#: aleksis/core/models.py:939 +#: aleksis/core/models.py:940 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:940 +#: aleksis/core/models.py:941 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:945 +#: aleksis/core/models.py:946 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:946 +#: aleksis/core/models.py:947 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:952 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:952 +#: aleksis/core/models.py:953 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:958 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:959 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:989 +#: aleksis/core/models.py:990 msgid "Can edit default dashboard" msgstr "" -#: aleksis/core/models.py:990 +#: aleksis/core/models.py:991 msgid "Dashboard Widget" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:992 msgid "Dashboard Widgets" msgstr "" -#: aleksis/core/models.py:997 +#: aleksis/core/models.py:998 msgid "URL" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:999 msgid "Icon URL" msgstr "" -#: aleksis/core/models.py:1004 +#: aleksis/core/models.py:1005 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:1005 +#: aleksis/core/models.py:1006 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1012 msgid "Content" msgstr "" -#: aleksis/core/models.py:1017 +#: aleksis/core/models.py:1018 msgid "Static content widget" msgstr "" -#: aleksis/core/models.py:1018 +#: aleksis/core/models.py:1019 msgid "Static content widgets" msgstr "" -#: aleksis/core/models.py:1023 +#: aleksis/core/models.py:1024 msgid "Dashboard widget" msgstr "" -#: aleksis/core/models.py:1028 +#: aleksis/core/models.py:1029 msgid "Order" msgstr "" -#: aleksis/core/models.py:1029 +#: aleksis/core/models.py:1030 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:1044 +#: aleksis/core/models.py:1045 msgid "Dashboard widget order" msgstr "" -#: aleksis/core/models.py:1045 +#: aleksis/core/models.py:1046 msgid "Dashboard widget orders" msgstr "" -#: aleksis/core/models.py:1051 +#: aleksis/core/models.py:1052 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1064 +#: aleksis/core/models.py:1065 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1065 +#: aleksis/core/models.py:1066 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1076 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1085 +#: aleksis/core/models.py:1086 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1086 +#: aleksis/core/models.py:1087 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1111 +#: aleksis/core/models.py:1112 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50 +#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "" -#: aleksis/core/models.py:1119 +#: aleksis/core/models.py:1120 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 msgid "Group types" msgstr "" -#: aleksis/core/models.py:1132 +#: aleksis/core/models.py:1133 msgid "Can view system status" msgstr "" -#: aleksis/core/models.py:1133 +#: aleksis/core/models.py:1134 msgid "Can manage data" msgstr "" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1135 msgid "Can impersonate" msgstr "" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1136 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1136 +#: aleksis/core/models.py:1137 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1138 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1139 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1139 +#: aleksis/core/models.py:1140 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1140 +#: aleksis/core/models.py:1141 msgid "Can invite persons" msgstr "" -#: aleksis/core/models.py:1176 +#: aleksis/core/models.py:1177 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1185 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1186 msgid "Notification sent" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1199 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1199 +#: aleksis/core/models.py:1200 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1202 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1202 +#: aleksis/core/models.py:1203 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1209 +#: aleksis/core/models.py:1210 msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1241 +#: aleksis/core/models.py:1270 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1245 +#: aleksis/core/models.py:1274 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1248 +#: aleksis/core/models.py:1277 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1251 +#: aleksis/core/models.py:1280 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1258 +#: aleksis/core/models.py:1287 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1259 +#: aleksis/core/models.py:1288 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1264 +#: aleksis/core/models.py:1293 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1267 +#: aleksis/core/models.py:1296 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1271 +#: aleksis/core/models.py:1300 msgid "Back URL" msgstr "" -#: aleksis/core/models.py:1272 +#: aleksis/core/models.py:1301 msgid "Progress title" msgstr "" -#: aleksis/core/models.py:1273 +#: aleksis/core/models.py:1302 msgid "Error message" msgstr "" -#: aleksis/core/models.py:1274 +#: aleksis/core/models.py:1303 msgid "Success message" msgstr "" -#: aleksis/core/models.py:1275 +#: aleksis/core/models.py:1304 msgid "Redirect on success URL" msgstr "" -#: aleksis/core/models.py:1277 +#: aleksis/core/models.py:1306 msgid "Additional button title" msgstr "" -#: aleksis/core/models.py:1279 +#: aleksis/core/models.py:1308 msgid "Additional button URL" msgstr "" -#: aleksis/core/models.py:1281 +#: aleksis/core/models.py:1310 msgid "Additional button icon" msgstr "" -#: aleksis/core/models.py:1283 +#: aleksis/core/models.py:1312 msgid "Result fetched" msgstr "" -#: aleksis/core/models.py:1308 +#: aleksis/core/models.py:1337 msgid "Background task completed successfully" msgstr "" -#: aleksis/core/models.py:1309 +#: aleksis/core/models.py:1338 msgid "The background task '{}' has been completed successfully." msgstr "" -#: aleksis/core/models.py:1315 +#: aleksis/core/models.py:1344 msgid "Background task failed" msgstr "" -#: aleksis/core/models.py:1316 +#: aleksis/core/models.py:1345 msgid "The background task '{}' has failed." msgstr "" -#: aleksis/core/models.py:1325 +#: aleksis/core/models.py:1354 msgid "Background task" msgstr "" -#: aleksis/core/models.py:1339 +#: aleksis/core/models.py:1368 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1340 +#: aleksis/core/models.py:1369 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1356 +#: aleksis/core/models.py:1385 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1394 +#: aleksis/core/models.py:1423 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1404 +#: aleksis/core/models.py:1433 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" -#: aleksis/core/models.py:1449 +#: aleksis/core/models.py:1478 msgid "Can view room timetable" msgstr "" -#: aleksis/core/models.py:1451 +#: aleksis/core/models.py:1480 msgid "Room" msgstr "" -#: aleksis/core/models.py:1452 +#: aleksis/core/models.py:1481 msgid "Rooms" msgstr "" @@ -1154,15 +1158,15 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:549 +#: aleksis/core/settings.py:551 msgid "English" msgstr "" -#: aleksis/core/settings.py:550 +#: aleksis/core/settings.py:552 msgid "German" msgstr "" -#: aleksis/core/settings.py:551 +#: aleksis/core/settings.py:553 msgid "Ukrainian" msgstr "" @@ -1174,14 +1178,14 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:27 aleksis/core/tables.py:148 -#: aleksis/core/tables.py:192 +#: aleksis/core/tables.py:185 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" #: aleksis/core/tables.py:115 aleksis/core/tables.py:116 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146 -#: aleksis/core/tables.py:190 +#: aleksis/core/tables.py:183 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 @@ -1230,7 +1234,7 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/500.html:21 +#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22 msgid "Retry" msgstr "" @@ -1544,62 +1548,62 @@ msgstr "" msgid "Edit default dashboard" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 +#: aleksis/core/templates/core/data_check/list.html:11 msgid "Data checks" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:15 +#: aleksis/core/templates/core/data_check/list.html:16 msgid "Check data again" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:22 +#: aleksis/core/templates/core/data_check/list.html:23 msgid "The system detected some problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:23 +#: aleksis/core/templates/core/data_check/list.html:24 msgid "" "Please go through all data and check whether some extra action is\n" " needed." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:31 +#: aleksis/core/templates/core/data_check/list.html:32 msgid "Everything is fine." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:32 +#: aleksis/core/templates/core/data_check/list.html:33 msgid "The system hasn't detected any problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:40 +#: aleksis/core/templates/core/data_check/list.html:41 msgid "Detected problems" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:45 +#: aleksis/core/templates/core/data_check/list.html:46 msgid "Affected object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:46 +#: aleksis/core/templates/core/data_check/list.html:47 msgid "Detected problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:47 +#: aleksis/core/templates/core/data_check/list.html:48 msgid "Show details" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:48 +#: aleksis/core/templates/core/data_check/list.html:49 msgid "Options to solve the problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:63 +#: aleksis/core/templates/core/data_check/list.html:65 msgid "Show object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:86 +#: aleksis/core/templates/core/data_check/list.html:89 msgid "Registered checks" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:90 +#: aleksis/core/templates/core/data_check/list.html:93 msgid "" "\n" " The system will check for the following problems:\n" @@ -1821,83 +1825,83 @@ msgstr "" msgid "System checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:22 +#: aleksis/core/templates/core/pages/system_status.html:26 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:24 +#: aleksis/core/templates/core/pages/system_status.html:28 msgid "" "\n" -" Only admin and visitors from internal IPs can access the site.\n" -" " +" Only admin and visitors from internal IPs can access the site.\n" +" " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:36 +#: aleksis/core/templates/core/pages/system_status.html:39 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:37 +#: aleksis/core/templates/core/pages/system_status.html:40 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:51 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:49 +#: aleksis/core/templates/core/pages/system_status.html:53 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:60 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:58 +#: aleksis/core/templates/core/pages/system_status.html:62 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:71 +#: aleksis/core/templates/core/pages/system_status.html:75 msgid "System health checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:81 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:78 -#: aleksis/core/templates/core/pages/system_status.html:119 +#: aleksis/core/templates/core/pages/system_status.html:82 +#: aleksis/core/templates/core/pages/system_status.html:123 msgid "Status" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:79 +#: aleksis/core/templates/core/pages/system_status.html:83 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:100 +#: aleksis/core/templates/core/pages/system_status.html:104 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:111 +#: aleksis/core/templates/core/pages/system_status.html:115 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/core/pages/system_status.html:120 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:117 +#: aleksis/core/templates/core/pages/system_status.html:121 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:118 +#: aleksis/core/templates/core/pages/system_status.html:122 msgid "Date done" msgstr "" @@ -2121,11 +2125,11 @@ msgstr "" msgid "Generate invitation code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:29 +#: aleksis/core/templates/invitations/forms/_invite.html:30 msgid "Generate code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:33 +#: aleksis/core/templates/invitations/forms/_invite.html:34 msgid "Invitations" msgstr "" @@ -2141,7 +2145,6 @@ msgstr "" #: aleksis/core/templates/oauth2_provider/application/create.html:14 #: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 #: aleksis/core/templates/two_factor/_wizard_actions.html:6 msgid "Cancel" msgstr "" @@ -2215,43 +2218,19 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 -msgid "Revoke access" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Are you sure to revoke the access for this application?" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 -msgid "Revoke" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 -msgid "No authorized applications." -msgstr "" - #: aleksis/core/templates/offline.html:5 msgid "Network error" msgstr "" #: aleksis/core/templates/offline.html:10 -msgid "Page not available offline." +msgid "No connection to server." msgstr "" #: aleksis/core/templates/offline.html:14 msgid "" "\n" -" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" -" administrators:\n" +" This page is not available without a connection to the server. Please check your internet connection and try again.\n" +" If you are connected and the error persists, please contact the system administrators:\n" " " msgstr "" @@ -2369,6 +2348,8 @@ msgstr "" #: aleksis/core/templates/templated_email/base.email:5 #: aleksis/core/templates/templated_email/base.email:16 +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 msgid "Hello" msgstr "" @@ -2436,6 +2417,23 @@ msgstr "" msgid "Count of objects with new problems" msgstr "" +#: aleksis/core/templates/templated_email/invitation.email:4 +#, python-format +msgid "Invitation to register on %(site)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 +#, python-format +msgid "Hello %(person)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:9 +#: aleksis/core/templates/templated_email/invitation.email:18 +#, python-format +msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:" +msgstr "" + #: aleksis/core/templates/templated_email/notification.email:4 msgid "New notification for" msgstr "" @@ -2815,148 +2813,156 @@ msgstr "" msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:280 +#: aleksis/core/views.py:285 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:292 +#: aleksis/core/views.py:297 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:396 +#: aleksis/core/views.py:401 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:415 aleksis/core/views.py:425 +#: aleksis/core/views.py:420 aleksis/core/views.py:430 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:475 +#: aleksis/core/views.py:480 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:558 +#: aleksis/core/views.py:528 +msgid "Maintenance mode was turned on successfully." +msgstr "" + +#: aleksis/core/views.py:530 +msgid "Maintenance mode was turned off successfully." +msgstr "" + +#: aleksis/core/views.py:588 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:574 +#: aleksis/core/views.py:604 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:643 +#: aleksis/core/views.py:673 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:662 +#: aleksis/core/views.py:692 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:686 +#: aleksis/core/views.py:716 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:700 +#: aleksis/core/views.py:730 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:732 +#: aleksis/core/views.py:762 msgid "The additional field has been saved." msgstr "" -#: aleksis/core/views.py:767 +#: aleksis/core/views.py:797 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:792 +#: aleksis/core/views.py:822 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:823 +#: aleksis/core/views.py:853 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:858 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:859 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:860 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:861 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:878 +#: aleksis/core/views.py:908 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:918 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:921 +#: aleksis/core/views.py:951 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:951 +#: aleksis/core/views.py:981 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:961 +#: aleksis/core/views.py:991 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1033 +#: aleksis/core/views.py:1063 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1035 +#: aleksis/core/views.py:1065 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1106 +#: aleksis/core/views.py:1136 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1203 +#: aleksis/core/views.py:1233 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1213 +#: aleksis/core/views.py:1243 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1223 +#: aleksis/core/views.py:1253 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1233 +#: aleksis/core/views.py:1263 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1243 +#: aleksis/core/views.py:1273 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1352 +#: aleksis/core/views.py:1382 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1359 +#: aleksis/core/views.py:1389 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1435 +#: aleksis/core/views.py:1465 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1446 +#: aleksis/core/views.py:1476 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po index d5da39be87e2e7b0525ff3adfd98c109acb8efc6..549daede5b7b831b5f13648b3caa45f69e391e1b 100644 --- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po +++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-27 13:23+0100\n" -"PO-Revision-Date: 2023-02-27 12:57+0000\n" +"POT-Creation-Date: 2023-05-09 18:40+0200\n" +"PO-Revision-Date: 2023-05-09 18:45+0200\n" "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core/de/>\n" "Language: de_DE\n" @@ -18,28 +18,32 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.12.1\n" -#: aleksis/core/apps.py:155 +#: aleksis/core/apps.py:151 +msgid "You have been logged out successfully." +msgstr "Sie wurden erfolgreich abgemeldet." + +#: aleksis/core/apps.py:161 msgid "OpenID Connect scope" msgstr "OpenID-Connect-Scope" -#: aleksis/core/apps.py:156 +#: aleksis/core/apps.py:162 msgid "Given name, family name, link to profile and picture if existing." msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden." -#: aleksis/core/apps.py:157 +#: aleksis/core/apps.py:163 msgid "Full home postal address" msgstr "Vollständige Postanschrift" -#: aleksis/core/apps.py:158 +#: aleksis/core/apps.py:164 msgid "Email address" msgstr "E-Mail-Adresse" -#: aleksis/core/apps.py:159 +#: aleksis/core/apps.py:165 msgid "Home and mobile phone" msgstr "Festnetz- und Mobilfunknummer" -#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 -#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:166 aleksis/core/forms.py:221 +#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 msgid "Groups" msgstr "Gruppen" @@ -98,172 +102,187 @@ msgstr "Berechtigung" msgid "Content type" msgstr "Inhaltstyp" -#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +#: aleksis/core/filters.py:113 aleksis/core/models.py:721 msgid "User" msgstr "Benutzer" -#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +#: aleksis/core/filters.py:135 aleksis/core/models.py:494 msgid "Group" msgstr "Gruppe" -#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +#: aleksis/core/forms.py:51 aleksis/core/forms.py:582 msgid "Base data" msgstr "Basisdaten" -#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +#: aleksis/core/forms.py:56 aleksis/core/tables.py:47 msgid "Address" msgstr "Adresse" -#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +#: aleksis/core/forms.py:57 aleksis/core/forms.py:591 msgid "Contact data" msgstr "Kontaktdaten" -#: aleksis/core/forms.py:58 +#: aleksis/core/forms.py:59 msgid "Advanced personal data" msgstr "Zusätzliche persönliche Daten" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "New user" msgstr "Neuer Benutzer" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "Create a new account" msgstr "Neues Benutzerkonto erstellen" -#: aleksis/core/forms.py:132 +#: aleksis/core/forms.py:133 msgid "You cannot set a new username when also selecting an existing user." -msgstr "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen existierenden Benutzer auswählen." +msgstr "" +"Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen " +"existierenden Benutzer auswählen." -#: aleksis/core/forms.py:136 +#: aleksis/core/forms.py:137 msgid "This username is already in use." msgstr "Dieser Benutzername wird bereits genutzt." -#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +#: aleksis/core/forms.py:154 aleksis/core/models.py:142 msgid "School term" msgstr "Schuljahr" -#: aleksis/core/forms.py:154 +#: aleksis/core/forms.py:155 msgid "Common data" msgstr "Allgemeine Daten" -#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:208 +#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "Personen" -#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +#: aleksis/core/forms.py:157 aleksis/core/forms.py:593 msgid "Additional data" msgstr "Zusätzliche Daten" -#: aleksis/core/forms.py:157 aleksis/core/models.py:217 -#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +#: aleksis/core/forms.py:158 aleksis/core/models.py:218 +#: aleksis/core/models.py:547 aleksis/core/tables.py:46 msgid "Photo" msgstr "Foto" -#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:84 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:85 msgid "Date" msgstr "Datum" -#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:92 +#: aleksis/core/forms.py:201 aleksis/core/forms.py:204 +#: aleksis/core/models.py:93 msgid "Time" msgstr "Zeit" -#: aleksis/core/forms.py:233 +#: aleksis/core/forms.py:234 msgid "From when until when should the announcement be displayed?" msgstr "Von wann bis wann soll die Ankündigung angezeigt werden?" -#: aleksis/core/forms.py:236 +#: aleksis/core/forms.py:237 msgid "Who should see the announcement?" msgstr "Wer soll die Ankündigung sehen?" -#: aleksis/core/forms.py:237 +#: aleksis/core/forms.py:238 msgid "Write your announcement:" msgstr "Schreiben Sie ihre Ankündigung:" -#: aleksis/core/forms.py:276 -msgid "You are not allowed to create announcements which are only valid in the past." -msgstr "Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit gültig sind." +#: aleksis/core/forms.py:277 +msgid "" +"You are not allowed to create announcements which are only valid in the past." +msgstr "" +"Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit " +"gültig sind." -#: aleksis/core/forms.py:280 +#: aleksis/core/forms.py:281 msgid "The from date and time must be earlier then the until date and time." -msgstr "Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit sein." +msgstr "" +"Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit " +"sein." -#: aleksis/core/forms.py:289 +#: aleksis/core/forms.py:290 msgid "You need at least one recipient." msgstr "Sie benötigen mindestens einen Empfänger." -#: aleksis/core/forms.py:398 +#: aleksis/core/forms.py:399 msgid "Invitation code" msgstr "Einladungscode" -#: aleksis/core/forms.py:399 +#: aleksis/core/forms.py:400 msgid "Please enter your invitation code." msgstr "Bitte geben Sie Ihren Einladungscode ein." -#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "First name" msgstr "Vorname" -#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +#: aleksis/core/forms.py:420 aleksis/core/models.py:194 msgid "Last name" msgstr "Nachname" -#: aleksis/core/forms.py:428 +#: aleksis/core/forms.py:429 msgid "A person is using this e-mail address" msgstr "Eine Person nutzt diese E-Mail-Adresse" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:457 msgid "Who should get the permission?" msgstr "Wer soll die Berechtigung erhalten?" -#: aleksis/core/forms.py:457 +#: aleksis/core/forms.py:458 msgid "On what?" msgstr "Auf was?" -#: aleksis/core/forms.py:483 +#: aleksis/core/forms.py:484 msgid "Select objects which the permission should be granted for:" -msgstr "Wählen Sie die Objekte aus, für welche die Berechtigung vergeben werden soll:" +msgstr "" +"Wählen Sie die Objekte aus, für welche die Berechtigung vergeben werden soll:" -#: aleksis/core/forms.py:486 +#: aleksis/core/forms.py:487 msgid "Grant the permission for all objects" msgstr "Vergebe die Berechtigung für alle Objekte" -#: aleksis/core/forms.py:494 -msgid "You must select at least one group or person which should get the permission." -msgstr "Sie müssen mindestens eine Gruppe oder Person auswählen, welche die Berechtigung erhalten soll." +#: aleksis/core/forms.py:495 +msgid "" +"You must select at least one group or person which should get the permission." +msgstr "" +"Sie müssen mindestens eine Gruppe oder Person auswählen, welche die " +"Berechtigung erhalten soll." -#: aleksis/core/forms.py:499 +#: aleksis/core/forms.py:500 msgid "You must grant the permission to all objects or to specific objects." -msgstr "Sie müssen die Berechtigung auf alle Objekte oder für spezifische Objekte vergeben." +msgstr "" +"Sie müssen die Berechtigung auf alle Objekte oder für spezifische Objekte " +"vergeben." -#: aleksis/core/forms.py:586 +#: aleksis/core/forms.py:587 msgid "Address data" msgstr "Adressdaten" -#: aleksis/core/forms.py:598 +#: aleksis/core/forms.py:599 msgid "Account data" msgstr "Kontodaten" -#: aleksis/core/forms.py:605 +#: aleksis/core/forms.py:606 msgid "Password" msgstr "Passwort" -#: aleksis/core/forms.py:608 +#: aleksis/core/forms.py:609 msgid "Password (again)" msgstr "Passwort wiederholen" -#: aleksis/core/forms.py:761 +#: aleksis/core/forms.py:762 msgid "The selected action does not exist." msgstr "Die ausgewählte Aktion existiert nicht." -#: aleksis/core/forms.py:772 +#: aleksis/core/forms.py:773 msgid "You do not have permission to run {} on all selected objects." -msgstr "Sie haben nicht die Berechtigung, {} auf alle ausgewählten Objekte auszuführen." +msgstr "" +"Sie haben nicht die Berechtigung, {} auf alle ausgewählten Objekte " +"auszuführen." -#: aleksis/core/forms.py:828 +#: aleksis/core/forms.py:829 msgid "No valid selection." msgstr "Keine gültige Auswahl." @@ -291,658 +310,667 @@ msgstr "Kein Backupergebnis gefunden!" msgid "Linked school term" msgstr "Zugeordnetes Schuljahr" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:83 msgid "Boolean (Yes/No)" msgstr "Boolean (Ja/Nein)" -#: aleksis/core/models.py:83 +#: aleksis/core/models.py:84 msgid "Text (one line)" msgstr "Text (eine Zeile)" -#: aleksis/core/models.py:85 +#: aleksis/core/models.py:86 msgid "Date and time" msgstr "Datum und Uhrzeit" -#: aleksis/core/models.py:86 +#: aleksis/core/models.py:87 msgid "Decimal number" msgstr "Dezimalzahl" -#: aleksis/core/models.py:87 aleksis/core/models.py:210 +#: aleksis/core/models.py:88 aleksis/core/models.py:211 msgid "E-mail address" msgstr "E-Mail-Adresse" -#: aleksis/core/models.py:88 +#: aleksis/core/models.py:89 msgid "Integer" msgstr "Ganze Zahl" -#: aleksis/core/models.py:89 +#: aleksis/core/models.py:90 msgid "IP address" msgstr "IP-Adresse" -#: aleksis/core/models.py:90 +#: aleksis/core/models.py:91 msgid "Boolean or empty (Yes/No/Neither)" msgstr "Boolean oder leer (Ja/Nein/weder)" -#: aleksis/core/models.py:91 +#: aleksis/core/models.py:92 msgid "Text (multi-line)" msgstr "Text (mehrzeilig)" -#: aleksis/core/models.py:93 +#: aleksis/core/models.py:94 msgid "URL / Link" msgstr "URL / Link" -#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +#: aleksis/core/models.py:106 aleksis/core/models.py:1078 msgid "Name" msgstr "Name" -#: aleksis/core/models.py:107 +#: aleksis/core/models.py:108 msgid "Start date" msgstr "Startdatum" -#: aleksis/core/models.py:108 +#: aleksis/core/models.py:109 msgid "End date" msgstr "Enddatum" -#: aleksis/core/models.py:127 +#: aleksis/core/models.py:128 msgid "The start date must be earlier than the end date." msgstr "Das Startdatum muss vor dem Enddatum liegen." -#: aleksis/core/models.py:134 +#: aleksis/core/models.py:135 msgid "There is already a school term for this time or a part of this time." -msgstr "Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum." +msgstr "" +"Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum." -#: aleksis/core/models.py:142 +#: aleksis/core/models.py:143 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 msgid "School terms" msgstr "Schuljahre" -#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +#: aleksis/core/models.py:164 aleksis/core/models.py:1027 msgid "Person" msgstr "Person" -#: aleksis/core/models.py:166 +#: aleksis/core/models.py:167 msgid "Can view address" msgstr "Kann Adresse sehen" -#: aleksis/core/models.py:167 +#: aleksis/core/models.py:168 msgid "Can view contact details" msgstr "Kann Kontaktdetails sehen" -#: aleksis/core/models.py:168 +#: aleksis/core/models.py:169 msgid "Can view photo" msgstr "Kann Foto sehen" -#: aleksis/core/models.py:169 +#: aleksis/core/models.py:170 msgid "Can view avatar image" msgstr "Kann Avatar-Bild sehen" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:171 msgid "Can view persons groups" msgstr "Kann Gruppen einer Person sehen" -#: aleksis/core/models.py:171 +#: aleksis/core/models.py:172 msgid "Can view personal details" msgstr "Kann persönliche Daten sehen" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "female" msgstr "weiblich" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "male" msgstr "männlich" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "other" msgstr "andere" -#: aleksis/core/models.py:189 aleksis/core/models.py:1353 +#: aleksis/core/models.py:190 aleksis/core/models.py:1382 msgid "Linked user" msgstr "Verknüpfter Benutzer" -#: aleksis/core/models.py:195 +#: aleksis/core/models.py:196 msgid "Additional name(s)" msgstr "Zusätzliche Namen" -#: aleksis/core/models.py:199 aleksis/core/models.py:511 -#: aleksis/core/models.py:1439 +#: aleksis/core/models.py:200 aleksis/core/models.py:512 +#: aleksis/core/models.py:1468 msgid "Short name" msgstr "Kurzname" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:203 msgid "Street" msgstr "Straße" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:204 msgid "Street number" msgstr "Hausnummer" -#: aleksis/core/models.py:204 +#: aleksis/core/models.py:205 msgid "Postal code" msgstr "Postleitzahl" -#: aleksis/core/models.py:205 +#: aleksis/core/models.py:206 msgid "Place" msgstr "Ort" -#: aleksis/core/models.py:207 +#: aleksis/core/models.py:208 msgid "Home phone" msgstr "Festnetz" -#: aleksis/core/models.py:208 +#: aleksis/core/models.py:209 msgid "Mobile phone" msgstr "Handy" -#: aleksis/core/models.py:212 +#: aleksis/core/models.py:213 msgid "Date of birth" msgstr "Geburtsdatum" -#: aleksis/core/models.py:213 +#: aleksis/core/models.py:214 msgid "Place of birth" msgstr "Geburtsort" -#: aleksis/core/models.py:214 +#: aleksis/core/models.py:215 msgid "Sex" msgstr "Geschlecht" -#: aleksis/core/models.py:221 aleksis/core/models.py:550 -msgid "This is an official photo, used for official documents and for internal use cases." -msgstr "Dies ist ein offizielles Foto, genutzt für offizielle Dokumente und interne Zwecke." +#: aleksis/core/models.py:222 aleksis/core/models.py:551 +msgid "" +"This is an official photo, used for official documents and for internal use " +"cases." +msgstr "" +"Dies ist ein offizielles Foto, genutzt für offizielle Dokumente und interne " +"Zwecke." -#: aleksis/core/models.py:226 aleksis/core/models.py:554 +#: aleksis/core/models.py:227 aleksis/core/models.py:555 msgid "Display picture / Avatar" msgstr "Bild/Avatar anzeigen" -#: aleksis/core/models.py:229 aleksis/core/models.py:557 +#: aleksis/core/models.py:230 aleksis/core/models.py:558 msgid "This is a picture or an avatar for public display." msgstr "Dies ist ein Bild oder ein Avatar für die öffentliche Darstellung." -#: aleksis/core/models.py:234 +#: aleksis/core/models.py:235 msgid "Guardians / Parents" msgstr "Erziehungsberechtigte / Eltern" -#: aleksis/core/models.py:241 +#: aleksis/core/models.py:242 msgid "Primary group" msgstr "Primärgruppe" -#: aleksis/core/models.py:244 aleksis/core/models.py:724 -#: aleksis/core/models.py:748 aleksis/core/models.py:843 -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:245 aleksis/core/models.py:725 +#: aleksis/core/models.py:749 aleksis/core/models.py:844 +#: aleksis/core/models.py:1113 msgid "Description" msgstr "Beschreibung" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:465 msgid "Title of field" msgstr "Feldtitel" -#: aleksis/core/models.py:466 +#: aleksis/core/models.py:467 msgid "Type of field" msgstr "Feldtyp" -#: aleksis/core/models.py:468 +#: aleksis/core/models.py:469 msgid "Required" msgstr "Pflichtfeld" -#: aleksis/core/models.py:469 +#: aleksis/core/models.py:470 msgid "Help text / description" msgstr "Hilfetext/Beschreibung" -#: aleksis/core/models.py:475 +#: aleksis/core/models.py:476 msgid "Addtitional field for groups" msgstr "Zusätzliche Felder für Gruppen" -#: aleksis/core/models.py:476 +#: aleksis/core/models.py:477 msgid "Addtitional fields for groups" msgstr "Zusätzliche Felder für Gruppen" -#: aleksis/core/models.py:496 +#: aleksis/core/models.py:497 msgid "Can assign child groups to groups" msgstr "Kann Kindgruppen zu Gruppen zuordnen" -#: aleksis/core/models.py:497 +#: aleksis/core/models.py:498 msgid "Can view statistics about group." msgstr "Kann Statistiken über Gruppen sehen." -#: aleksis/core/models.py:509 aleksis/core/models.py:1440 +#: aleksis/core/models.py:510 aleksis/core/models.py:1469 msgid "Long name" msgstr "Langname" -#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "Mitglieder" -#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "Leiter/-innen" -#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "Übergeordnete Gruppen" -#: aleksis/core/models.py:537 +#: aleksis/core/models.py:538 msgid "Type of group" msgstr "Gruppentyp" -#: aleksis/core/models.py:542 +#: aleksis/core/models.py:543 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 msgid "Additional fields" msgstr "Zusätzliche Felder" -#: aleksis/core/models.py:723 aleksis/core/models.py:747 -#: aleksis/core/models.py:842 aleksis/core/models.py:1270 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:843 aleksis/core/models.py:1299 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "Titel" -#: aleksis/core/models.py:726 +#: aleksis/core/models.py:727 msgid "Application" msgstr "Anwendung" -#: aleksis/core/models.py:732 +#: aleksis/core/models.py:733 msgid "Activity" msgstr "Aktivität" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:734 msgid "Activities" msgstr "Aktivitäten" -#: aleksis/core/models.py:739 +#: aleksis/core/models.py:740 msgid "Sender" msgstr "Absender" -#: aleksis/core/models.py:744 +#: aleksis/core/models.py:745 msgid "Recipient" msgstr "Empfänger" -#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +#: aleksis/core/models.py:750 aleksis/core/models.py:1079 msgid "Link" msgstr "Link" -#: aleksis/core/models.py:752 aleksis/core/models.py:1079 -#: aleksis/core/models.py:1400 +#: aleksis/core/models.py:753 aleksis/core/models.py:1080 +#: aleksis/core/models.py:1429 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "Symbol" -#: aleksis/core/models.py:755 +#: aleksis/core/models.py:756 msgid "Send notification at" msgstr "Benachrichtigung schicken am" -#: aleksis/core/models.py:757 +#: aleksis/core/models.py:758 msgid "Read" msgstr "Gelesen" -#: aleksis/core/models.py:758 +#: aleksis/core/models.py:759 msgid "Sent" msgstr "Versandt" -#: aleksis/core/models.py:775 +#: aleksis/core/models.py:776 msgid "Notification" msgstr "Benachrichtigung" -#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +#: aleksis/core/models.py:777 aleksis/core/preferences.py:29 msgid "Notifications" msgstr "Benachrichtigungen" -#: aleksis/core/models.py:844 +#: aleksis/core/models.py:845 msgid "Link to detailed view" msgstr "Link zur detaillierten Ansicht" -#: aleksis/core/models.py:847 +#: aleksis/core/models.py:848 msgid "Date and time from when to show" msgstr "Datum und Uhrzeit des Anzeigestarts" -#: aleksis/core/models.py:850 +#: aleksis/core/models.py:851 msgid "Date and time until when to show" msgstr "Anzeigezeitraum" -#: aleksis/core/models.py:875 +#: aleksis/core/models.py:876 msgid "Announcement" msgstr "Ankündigung" -#: aleksis/core/models.py:876 +#: aleksis/core/models.py:877 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 msgid "Announcements" msgstr "Ankündigungen" -#: aleksis/core/models.py:913 +#: aleksis/core/models.py:914 msgid "Announcement recipient" msgstr "Empfänger der Ankündigung" -#: aleksis/core/models.py:914 +#: aleksis/core/models.py:915 msgid "Announcement recipients" msgstr "Empfänger der Ankündigung" -#: aleksis/core/models.py:934 +#: aleksis/core/models.py:935 msgid "Widget Title" msgstr "Widget-Titel" -#: aleksis/core/models.py:935 +#: aleksis/core/models.py:936 msgid "Activate Widget" msgstr "Widget aktivieren" -#: aleksis/core/models.py:936 +#: aleksis/core/models.py:937 msgid "Widget is broken" msgstr "Widget ist kaputt" -#: aleksis/core/models.py:939 +#: aleksis/core/models.py:940 msgid "Size on mobile devices" msgstr "Größe auf Mobilgeräten" -#: aleksis/core/models.py:940 +#: aleksis/core/models.py:941 msgid "<= 600 px, 12 columns" msgstr "<= 600 px, 12 Spalten" -#: aleksis/core/models.py:945 +#: aleksis/core/models.py:946 msgid "Size on tablet devices" msgstr "Größe auf Tablets" -#: aleksis/core/models.py:946 +#: aleksis/core/models.py:947 msgid "> 600 px, 12 columns" msgstr "> 600px, 12 Spalten" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:952 msgid "Size on desktop devices" msgstr "Größe auf Desktopgeräten" -#: aleksis/core/models.py:952 +#: aleksis/core/models.py:953 msgid "> 992 px, 12 columns" msgstr "> 992 px, 12 Spalten" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:958 msgid "Size on large desktop devices" msgstr "Größe auf großen Desktopgeräten" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:959 msgid "> 1200 px>, 12 columns" msgstr "> 1200 px, 12 Spalten" -#: aleksis/core/models.py:989 +#: aleksis/core/models.py:990 msgid "Can edit default dashboard" msgstr "Kann Standarddashboard bearbeiten" -#: aleksis/core/models.py:990 +#: aleksis/core/models.py:991 msgid "Dashboard Widget" msgstr "Dashboard-Widget" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:992 msgid "Dashboard Widgets" msgstr "Dashboard-Widgets" -#: aleksis/core/models.py:997 +#: aleksis/core/models.py:998 msgid "URL" msgstr "URL" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:999 msgid "Icon URL" msgstr "Symbol-URL" -#: aleksis/core/models.py:1004 +#: aleksis/core/models.py:1005 msgid "External link widget" msgstr "Externer-Link-Widget" -#: aleksis/core/models.py:1005 +#: aleksis/core/models.py:1006 msgid "External link widgets" msgstr "Externer-Link-Widgets" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1012 msgid "Content" msgstr "Inhalt" -#: aleksis/core/models.py:1017 +#: aleksis/core/models.py:1018 msgid "Static content widget" msgstr "Statischer-Inhalt-Widget" -#: aleksis/core/models.py:1018 +#: aleksis/core/models.py:1019 msgid "Static content widgets" msgstr "Statischer-Inhalt-Widgets" -#: aleksis/core/models.py:1023 +#: aleksis/core/models.py:1024 msgid "Dashboard widget" msgstr "Dashboard-Widget" -#: aleksis/core/models.py:1028 +#: aleksis/core/models.py:1029 msgid "Order" msgstr "Reihenfolge" -#: aleksis/core/models.py:1029 +#: aleksis/core/models.py:1030 msgid "Part of the default dashboard" msgstr "Teil des Standarddashboards" -#: aleksis/core/models.py:1044 +#: aleksis/core/models.py:1045 msgid "Dashboard widget order" msgstr "Reihenfolge der Dashboard-Widgets" -#: aleksis/core/models.py:1045 +#: aleksis/core/models.py:1046 msgid "Dashboard widget orders" msgstr "Reihenfolgen der Dashboard-Widgets" -#: aleksis/core/models.py:1051 +#: aleksis/core/models.py:1052 msgid "Menu ID" msgstr "Menü-ID" -#: aleksis/core/models.py:1064 +#: aleksis/core/models.py:1065 msgid "Custom menu" msgstr "Benutzerdefiniertes Menü" -#: aleksis/core/models.py:1065 +#: aleksis/core/models.py:1066 msgid "Custom menus" msgstr "Benutzerdefinierte Menüs" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1076 msgid "Menu" msgstr "Menü" -#: aleksis/core/models.py:1085 +#: aleksis/core/models.py:1086 msgid "Custom menu item" msgstr "Benutzerdefiniertes Menüelement" -#: aleksis/core/models.py:1086 +#: aleksis/core/models.py:1087 msgid "Custom menu items" msgstr "Benutzerdefinierte Menüelemente" -#: aleksis/core/models.py:1111 +#: aleksis/core/models.py:1112 msgid "Title of type" msgstr "Titel des Typs" -#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50 +#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "Gruppentyp" -#: aleksis/core/models.py:1119 +#: aleksis/core/models.py:1120 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 msgid "Group types" msgstr "Gruppentypen" -#: aleksis/core/models.py:1132 +#: aleksis/core/models.py:1133 msgid "Can view system status" msgstr "Kann Systemstatus sehen" -#: aleksis/core/models.py:1133 +#: aleksis/core/models.py:1134 msgid "Can manage data" msgstr "Kann Daten verwalten" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1135 msgid "Can impersonate" msgstr "Kann sich verkleiden" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1136 msgid "Can use search" msgstr "Kann Suche benutzen" -#: aleksis/core/models.py:1136 +#: aleksis/core/models.py:1137 msgid "Can change site preferences" msgstr "Kann Konfiguration ändern" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1138 msgid "Can change person preferences" msgstr "Kann Einstellungen einer Person verändern" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1139 msgid "Can change group preferences" msgstr "Kann Einstellungen einer Gruppe verändern" -#: aleksis/core/models.py:1139 +#: aleksis/core/models.py:1140 msgid "Can test PDF generation" msgstr "Kann die PDF-Generierung testen" -#: aleksis/core/models.py:1140 +#: aleksis/core/models.py:1141 msgid "Can invite persons" msgstr "Kann Personen einladen" -#: aleksis/core/models.py:1176 +#: aleksis/core/models.py:1177 msgid "Related data check task" msgstr "Zugehörige Datenprüfungsaufgabe" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1185 msgid "Issue solved" msgstr "Problem gelöst" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1186 msgid "Notification sent" msgstr "Benachrichtigung gesendet" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1199 msgid "Data check result" msgstr "Datenprüfungsergebnis" -#: aleksis/core/models.py:1199 +#: aleksis/core/models.py:1200 msgid "Data check results" msgstr "Datenprüfungsergebnisse" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1202 msgid "Can run data checks" msgstr "Kann Datenprüfungen ausführen" -#: aleksis/core/models.py:1202 +#: aleksis/core/models.py:1203 msgid "Can solve data check problems" msgstr "Kann Datenprüfungsprobleme lösen" -#: aleksis/core/models.py:1209 +#: aleksis/core/models.py:1210 msgid "E-Mail address" msgstr "E-Mail-Adresse" -#: aleksis/core/models.py:1241 +#: aleksis/core/models.py:1270 msgid "Owner" msgstr "Leiter" -#: aleksis/core/models.py:1245 +#: aleksis/core/models.py:1274 msgid "File expires at" msgstr "Datei abgelaufen am" -#: aleksis/core/models.py:1248 +#: aleksis/core/models.py:1277 msgid "Generated HTML file" msgstr "Generierte HTML-Datei" -#: aleksis/core/models.py:1251 +#: aleksis/core/models.py:1280 msgid "Generated PDF file" msgstr "Generierte PDF-Datei" -#: aleksis/core/models.py:1258 +#: aleksis/core/models.py:1287 msgid "PDF file" msgstr "PDF-Datei" -#: aleksis/core/models.py:1259 +#: aleksis/core/models.py:1288 msgid "PDF files" msgstr "PDF-Dateien" -#: aleksis/core/models.py:1264 +#: aleksis/core/models.py:1293 msgid "Task result" msgstr "Task-Ergebnis" -#: aleksis/core/models.py:1267 +#: aleksis/core/models.py:1296 msgid "Task user" msgstr "Task-Benutzer" -#: aleksis/core/models.py:1271 +#: aleksis/core/models.py:1300 msgid "Back URL" msgstr "Zurück-URL" -#: aleksis/core/models.py:1272 +#: aleksis/core/models.py:1301 msgid "Progress title" msgstr "Fortschritt-Titel" -#: aleksis/core/models.py:1273 +#: aleksis/core/models.py:1302 msgid "Error message" msgstr "Fehlernachricht" -#: aleksis/core/models.py:1274 +#: aleksis/core/models.py:1303 msgid "Success message" msgstr "Erfolgsnachricht" -#: aleksis/core/models.py:1275 +#: aleksis/core/models.py:1304 msgid "Redirect on success URL" msgstr "URL, auf die bei Erfolg weitergeleitet wird" -#: aleksis/core/models.py:1277 +#: aleksis/core/models.py:1306 msgid "Additional button title" msgstr "Titel des zusätzlichen Buttons" -#: aleksis/core/models.py:1279 +#: aleksis/core/models.py:1308 msgid "Additional button URL" msgstr "URL des zusätzlichen Buttons" -#: aleksis/core/models.py:1281 +#: aleksis/core/models.py:1310 msgid "Additional button icon" msgstr "Symbol des zusätzlichen Buttons" -#: aleksis/core/models.py:1283 +#: aleksis/core/models.py:1312 msgid "Result fetched" msgstr "Ergebnis abgerufen" -#: aleksis/core/models.py:1308 +#: aleksis/core/models.py:1337 msgid "Background task completed successfully" msgstr "Hintergrundaufgabe erfolgreich fertiggestellt" -#: aleksis/core/models.py:1309 +#: aleksis/core/models.py:1338 msgid "The background task '{}' has been completed successfully." msgstr "Die Hintergrundaufgabe '{}' wurde erfolgreich fertiggestellt." -#: aleksis/core/models.py:1315 +#: aleksis/core/models.py:1344 msgid "Background task failed" msgstr "Hintergrundaufgabe fehlgeschlagen" -#: aleksis/core/models.py:1316 +#: aleksis/core/models.py:1345 msgid "The background task '{}' has failed." msgstr "Die Hintergrundaufgabe '{}' ist fehlgeschlagen." -#: aleksis/core/models.py:1325 +#: aleksis/core/models.py:1354 msgid "Background task" msgstr "Hintergrundaufgabe" -#: aleksis/core/models.py:1339 +#: aleksis/core/models.py:1368 msgid "Task user assignment" msgstr "Task-Benutzer-Zuordnung" -#: aleksis/core/models.py:1340 +#: aleksis/core/models.py:1369 msgid "Task user assignments" msgstr "Task-Benutzer-Zuordnungen" -#: aleksis/core/models.py:1356 +#: aleksis/core/models.py:1385 msgid "Additional attributes" msgstr "Zusätzliche Attribute" -#: aleksis/core/models.py:1394 +#: aleksis/core/models.py:1423 msgid "Allowed scopes that clients can request" msgstr "Erlaubte Scopes, die ein Client anfordern kann" -#: aleksis/core/models.py:1404 -msgid "This image will be shown as icon in the authorization flow. It should be squared." -msgstr "Dieses Bild wird im Autorisierungs-Vorgang als Symbol angezeigt werden. Es sollte rechteckig sein." +#: aleksis/core/models.py:1433 +msgid "" +"This image will be shown as icon in the authorization flow. It should be " +"squared." +msgstr "" +"Dieses Bild wird im Autorisierungs-Vorgang als Symbol angezeigt werden. Es " +"sollte rechteckig sein." -#: aleksis/core/models.py:1449 +#: aleksis/core/models.py:1478 msgid "Can view room timetable" msgstr "Kann Raum-Stundenplan sehen" -#: aleksis/core/models.py:1451 +#: aleksis/core/models.py:1480 msgid "Room" msgstr "Raum" -#: aleksis/core/models.py:1452 +#: aleksis/core/models.py:1481 msgid "Rooms" msgstr "Räume" @@ -1055,8 +1083,11 @@ msgid "Automatically create new persons for new users" msgstr "Erstelle automatisch neue Personen für neue Benutzer" #: aleksis/core/preferences.py:256 -msgid "Automatically link existing persons to new users by their e-mail address" -msgstr "Verknüpfe existierende Personen automatisch mit neuen Personen anhand ihrer E-Mail-Adresse" +msgid "" +"Automatically link existing persons to new users by their e-mail address" +msgstr "" +"Verknüpfe existierende Personen automatisch mit neuen Personen anhand ihrer " +"E-Mail-Adresse" #: aleksis/core/preferences.py:267 msgid "Display name of the school" @@ -1064,7 +1095,8 @@ msgstr "Sichtbarer Name der Schule" #: aleksis/core/preferences.py:278 msgid "Official name of the school, e.g. as given by supervisory authority" -msgstr "Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist" +msgstr "" +"Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist" #: aleksis/core/preferences.py:286 msgid "Allow users to change their passwords" @@ -1123,8 +1155,11 @@ msgid "Fields on person model which are editable by themselves." msgstr "Felder des Personen-Models welche von ihnen selbst editierbar sind." #: aleksis/core/preferences.py:424 -msgid "Editable fields on person model which should trigger a notification on change" -msgstr "Editierbare Felder des Personen-Models welche eine Benachrichtigung für Änderungen auslösen soll" +msgid "" +"Editable fields on person model which should trigger a notification on change" +msgstr "" +"Editierbare Felder des Personen-Models welche eine Benachrichtigung für " +"Änderungen auslösen soll" #: aleksis/core/preferences.py:438 msgid "Contact for notification if a person changes their data" @@ -1148,21 +1183,23 @@ msgstr "Automatisch das Dashboard und seine Widgets aktualisieren" #: aleksis/core/preferences.py:480 msgid "Automatically update the dashboard and its widgets sitewide" -msgstr "Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen Seite)" +msgstr "" +"Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen " +"Seite)" #: aleksis/core/preferences.py:490 msgid "Country for phone number parsing" msgstr "Land für das Einlesen von Telefonnummern" -#: aleksis/core/settings.py:549 +#: aleksis/core/settings.py:551 msgid "English" msgstr "Englisch" -#: aleksis/core/settings.py:550 +#: aleksis/core/settings.py:552 msgid "German" msgstr "Deutsch" -#: aleksis/core/settings.py:551 +#: aleksis/core/settings.py:553 msgid "Ukrainian" msgstr "Ukrainisch" @@ -1174,14 +1211,14 @@ msgid "Edit" msgstr "Bearbeiten" #: aleksis/core/tables.py:27 aleksis/core/tables.py:148 -#: aleksis/core/tables.py:192 +#: aleksis/core/tables.py:185 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "Aktionen" #: aleksis/core/tables.py:115 aleksis/core/tables.py:116 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146 -#: aleksis/core/tables.py:190 +#: aleksis/core/tables.py:183 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 @@ -1205,12 +1242,14 @@ msgstr "" #: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16 msgid "" "\n" -" If you think this is an error in AlekSIS, please contact your site\n" +" If you think this is an error in AlekSIS, please contact your " +"site\n" " administrators:\n" " " msgstr "" "\n" -" Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n" +" Wenn Sie der Meinung sind, dass es sich um einen Fehler in " +"AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n" " Systemadministratoren:\n" " " @@ -1222,7 +1261,8 @@ msgid "" " " msgstr "" "\n" -" Wenn Sie über einen Link auf einer externen Seite hierher gelangt sind,\n" +" Wenn Sie über einen Link auf einer externen Seite hierher " +"gelangt sind,\n" " ist es möglich, dass dieser veraltet war.\n" " " @@ -1237,16 +1277,18 @@ msgstr "" #: aleksis/core/templates/500.html:13 msgid "" "\n" -" Your site administrators will automatically be notified about this\n" +" Your site administrators will automatically be notified about " +"this\n" " error. You can also contact them directly:\n" " " msgstr "" "\n" -" Ihre Administratoren werden automatisch über diesen Fehler informiert.\n" +" Ihre Administratoren werden automatisch über diesen Fehler " +"informiert.\n" " Sie können diese auch direkt kontaktieren:\n" " " -#: aleksis/core/templates/500.html:21 +#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22 msgid "Retry" msgstr "Wiederholen" @@ -1288,13 +1330,21 @@ msgstr "Bestätigen" #: aleksis/core/templates/account/email_confirm.html:12 #, python-format -msgid "Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail address for user %(user_display)s." -msgstr "Bitte bestätigen Sie, dass <a href=\"mailto:%(email)s\">%(email)s</a> eine E-Mail-Adresse für den Benutzer %(user_display)s ist." +msgid "" +"Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail " +"address for user %(user_display)s." +msgstr "" +"Bitte bestätigen Sie, dass <a href=\"mailto:%(email)s\">%(email)s</a> eine E-" +"Mail-Adresse für den Benutzer %(user_display)s ist." #: aleksis/core/templates/account/email_confirm.html:25 #, python-format -msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." -msgstr "Dieser E-Mail-Bestätigungslink ist abgelaufen oder nicht gültig. Bitte <a href=\"%(email_url)s\">fragen Sie eine neue E-Mail-Bestätigung an</a>." +msgid "" +"This e-mail confirmation link expired or is invalid. Please <a " +"href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." +msgstr "" +"Dieser E-Mail-Bestätigungslink ist abgelaufen oder nicht gültig. Bitte <a " +"href=\"%(email_url)s\">fragen Sie eine neue E-Mail-Bestätigung an</a>." #: aleksis/core/templates/account/password_change.html:5 #: aleksis/core/templates/account/password_change.html:6 @@ -1309,7 +1359,9 @@ msgstr "Passwort ändern" #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot your current password? Click here to reset it:" -msgstr "Haben Sie Ihr aktuelles Passwort vergessen? Klicken Sie hier, um es zurückzusetzen:" +msgstr "" +"Haben Sie Ihr aktuelles Passwort vergessen? Klicken Sie hier, um es " +"zurückzusetzen:" #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot Password?" @@ -1328,11 +1380,13 @@ msgstr "Passwortänderung deaktiviert." msgid "" "\n" " Users are not allowed to edit their own passwords. If you think\n" -" this is an error please contact one of your site administrators.\n" +" this is an error please contact one of your site " +"administrators.\n" " " msgstr "" "\n" -" Benutzer dürfen ihre eigenen Passwörter nicht ändern. Wenn Sie denken, \n" +" Benutzer dürfen ihre eigenen Passwörter nicht ändern. Wenn Sie " +"denken, \n" "dass dies ein Fehler ist, kontaktieren Sie bitte einen der Administratoren:\n" " " @@ -1347,8 +1401,12 @@ msgid "Reset password" msgstr "Passwort zurücksetzen" #: aleksis/core/templates/account/password_reset.html:17 -msgid "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." -msgstr "Passwort vergessen? Geben Sie Ihre E-Mail-Adresse hier ein und wir werden Ihnen eine E-Mail zum Zurücksetzen des Passwortes schicken." +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll send you " +"an e-mail allowing you to reset it." +msgstr "" +"Passwort vergessen? Geben Sie Ihre E-Mail-Adresse hier ein und wir werden " +"Ihnen eine E-Mail zum Zurücksetzen des Passwortes schicken." #: aleksis/core/templates/account/password_reset.html:30 msgid "" @@ -1371,7 +1429,8 @@ msgid "" " " msgstr "" "\n" -" Wir haben Ihnen eine E-Mail gesendet. Bitte kontaktieren Sie einen der Administratoren,\n" +" Wir haben Ihnen eine E-Mail gesendet. Bitte kontaktieren Sie " +"einen der Administratoren,\n" "wenn Sie diese nicht innerhalb weniger Minuten erhalten.\n" " " @@ -1383,12 +1442,16 @@ msgstr "Ungültiges Token" #, python-format msgid "" "\n" -" The password reset link was invalid, possibly because it has already been used. Please request a <a href=\"%(passwd_reset_url)s\"\n" +" The password reset link was invalid, possibly because it has " +"already been used. Please request a <a href=\"%(passwd_reset_url)s\"\n" " class=\"blue-text text-lighten-2\">new password reset</a>.\n" " " msgstr "" "\n" -" Der Link zum Zurücksetzen des Passwortes war falsch, wahrscheinlich, weil er bereits benutzt wurde. Bitte starten Sie eine neue Anfrage <a href=\"%(passwd_reset_url)s\" class=\"blue-text text-lighten-2\">zum Zurücksetzen des Passwortes</a>.\n" +" Der Link zum Zurücksetzen des Passwortes war falsch, " +"wahrscheinlich, weil er bereits benutzt wurde. Bitte starten Sie eine neue " +"Anfrage <a href=\"%(passwd_reset_url)s\" class=\"blue-text text-" +"lighten-2\">zum Zurücksetzen des Passwortes</a>.\n" " " #: aleksis/core/templates/account/password_reset_from_key.html:25 @@ -1437,8 +1500,11 @@ msgstr "Registrierung" #: aleksis/core/templates/account/signup.html:12 #, python-format -msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." -msgstr "Haben Sie bereits ein Konto? Dann <a href=\"%(login_url)s\">melden Sie sich bitte an</a>." +msgid "" +"Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." +msgstr "" +"Haben Sie bereits ein Konto? Dann <a href=\"%(login_url)s\">melden Sie sich " +"bitte an</a>." #: aleksis/core/templates/account/signup.html:22 #: aleksis/core/templates/socialaccount/signup.html:23 @@ -1462,7 +1528,8 @@ msgid "" " " msgstr "" "\n" -" Die Registrierung ist aktuell geschlossen. Wenn Sie denken, dass dies ein Fehler ist,\n" +" Die Registrierung ist aktuell geschlossen. Wenn Sie denken, dass " +"dies ein Fehler ist,\n" " kontaktieren Sie bitte einen Ihrer Systemadministratoren.\n" " " @@ -1482,13 +1549,17 @@ msgstr "Verifizieren Sie Ihre E-Mail!" #: aleksis/core/templates/account/verification_sent.html:16 msgid "" "\n" -" This part of the site requires us to verify that you are who you claim to be.\n" -" For this purpose, we require that you verify ownership of your e-mail address.\n" +" This part of the site requires us to verify that you are who you " +"claim to be.\n" +" For this purpose, we require that you verify ownership of your e-" +"mail address.\n" " " msgstr "" "\n" -" Dieser Teil der Anwendung setzt voraus, dass wir verifizieren, dass Sie die Person sind, die sie vorgeben, zu sein.\n" -"Zu diesem Zweck setzen wir voraus, dass Sie die Inhaberschaft Ihrer E-Mail-Adresse bestätigen.\n" +" Dieser Teil der Anwendung setzt voraus, dass wir verifizieren, " +"dass Sie die Person sind, die sie vorgeben, zu sein.\n" +"Zu diesem Zweck setzen wir voraus, dass Sie die Inhaberschaft Ihrer E-Mail-" +"Adresse bestätigen.\n" " " #: aleksis/core/templates/account/verification_sent.html:22 @@ -1502,7 +1573,8 @@ msgstr "" "\n" " Wir haben Ihnen eine E-Mail zur Verifizierung geschickt.\n" "Bitte klicken Sie auf den Link in dieser E-Mail.\n" -"Bitte kontaktieren Sie uns, wenn Sie diese nicht binnen weniger Minuten erhalten.\n" +"Bitte kontaktieren Sie uns, wenn Sie diese nicht binnen weniger Minuten " +"erhalten.\n" " " #: aleksis/core/templates/core/additional_field/edit.html:6 @@ -1571,7 +1643,8 @@ msgid "" " " msgstr "" "\n" -" Es ist ein Problem dabei aufgetreten, das Widget \"%(title)s\" zu laden.\n" +" Es ist ein Problem dabei aufgetreten, das Widget \"%(title)s\" " +"zu laden.\n" "Sie brauchen nichts weiter machen.\n" " " @@ -1601,20 +1674,20 @@ msgstr "%(name)s erstellen" msgid "Edit default dashboard" msgstr "Standard-Dashboard bearbeiten" -#: aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 +#: aleksis/core/templates/core/data_check/list.html:11 msgid "Data checks" msgstr "Datenprüfungen" -#: aleksis/core/templates/core/data_check/list.html:15 +#: aleksis/core/templates/core/data_check/list.html:16 msgid "Check data again" msgstr "Daten erneut prüfen" -#: aleksis/core/templates/core/data_check/list.html:22 +#: aleksis/core/templates/core/data_check/list.html:23 msgid "The system detected some problems with your data." msgstr "Das System hat einige Problemen mit Ihren Daten gefunden." -#: aleksis/core/templates/core/data_check/list.html:23 +#: aleksis/core/templates/core/data_check/list.html:24 msgid "" "Please go through all data and check whether some extra action is\n" " needed." @@ -1622,43 +1695,43 @@ msgstr "" "Bitte gehen Sie alle Daten durch und prüfen Sie, ob weitere Aktionen\n" "notwendig sind." -#: aleksis/core/templates/core/data_check/list.html:31 +#: aleksis/core/templates/core/data_check/list.html:32 msgid "Everything is fine." msgstr "Alles ist gut." -#: aleksis/core/templates/core/data_check/list.html:32 +#: aleksis/core/templates/core/data_check/list.html:33 msgid "The system hasn't detected any problems with your data." msgstr "Das System hat keine Probleme mit Ihren Daten entdeckt." -#: aleksis/core/templates/core/data_check/list.html:40 +#: aleksis/core/templates/core/data_check/list.html:41 msgid "Detected problems" msgstr "Gefundene Probleme" -#: aleksis/core/templates/core/data_check/list.html:45 +#: aleksis/core/templates/core/data_check/list.html:46 msgid "Affected object" msgstr "Betroffenes Objekt" -#: aleksis/core/templates/core/data_check/list.html:46 +#: aleksis/core/templates/core/data_check/list.html:47 msgid "Detected problem" msgstr "Entdecktes Problem" -#: aleksis/core/templates/core/data_check/list.html:47 +#: aleksis/core/templates/core/data_check/list.html:48 msgid "Show details" msgstr "Details anzeigen" -#: aleksis/core/templates/core/data_check/list.html:48 +#: aleksis/core/templates/core/data_check/list.html:49 msgid "Options to solve the problem" msgstr "Optionen, das Problem zu lösen" -#: aleksis/core/templates/core/data_check/list.html:63 +#: aleksis/core/templates/core/data_check/list.html:65 msgid "Show object" msgstr "Objekt anzeigen" -#: aleksis/core/templates/core/data_check/list.html:86 +#: aleksis/core/templates/core/data_check/list.html:89 msgid "Registered checks" msgstr "Registrierte Prüfungen" -#: aleksis/core/templates/core/data_check/list.html:90 +#: aleksis/core/templates/core/data_check/list.html:93 msgid "" "\n" " The system will check for the following problems:\n" @@ -1677,29 +1750,42 @@ msgstr "Dashboard bearbeiten" #: aleksis/core/templates/core/edit_dashboard.html:24 msgid "" "\n" -" On this page you can arrange your personal dashboard. You can drag any items from \"Available widgets\" to \"Your\n" -" Dashboard\" or change the order by moving the widgets. After you have finished, please don't forget to click on\n" +" On this page you can arrange your personal dashboard. You can drag " +"any items from \"Available widgets\" to \"Your\n" +" Dashboard\" or change the order by moving the widgets. After you " +"have finished, please don't forget to click on\n" " \"Save\".\n" " " msgstr "" "\n" -" Auf dieser Seite können Sie Ihr persönliches Dashboard zusammenstallen. Sie können beliebige Elemente von den \"Verfügbaren Widgets\" \n" -"in \"Ihr Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets bewegen. Wenn Sie fertig sind, vergessen Sie bitte nicht, \n" +" Auf dieser Seite können Sie Ihr persönliches Dashboard " +"zusammenstallen. Sie können beliebige Elemente von den \"Verfügbaren " +"Widgets\" \n" +"in \"Ihr Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die " +"Widgets bewegen. Wenn Sie fertig sind, vergessen Sie bitte nicht, \n" "auf \"Speichern\" zu drücken.\n" " " #: aleksis/core/templates/core/edit_dashboard.html:30 msgid "" "\n" -" On this page you can arrange the default dashboard which is shown when a user doesn't arrange his own\n" -" dashboard. You can drag any items from \"Available widgets\" to \"Default Dashboard\" or change the order\n" -" by moving the widgets. After you have finished, please don't forget to click on \"Save\".\n" +" On this page you can arrange the default dashboard which is shown " +"when a user doesn't arrange his own\n" +" dashboard. You can drag any items from \"Available widgets\" to " +"\"Default Dashboard\" or change the order\n" +" by moving the widgets. After you have finished, please don't " +"forget to click on \"Save\".\n" " " msgstr "" "\n" -" Auf dieser Seite können Sie Ihr das Standard-Dashboard zusammenstallen, welches angezeigt wird, wenn ein Benutzer kein eigenes definiert. \n" -"Sie können beliebige Elemente von den \"Verfügbaren Widgets\" in \"Standard-Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets bewegen. \n" -"Wenn Sie fertig sind, vergessen Sie bitte nicht, auf \"Speichern\" zu drücken.\n" +" Auf dieser Seite können Sie Ihr das Standard-Dashboard " +"zusammenstallen, welches angezeigt wird, wenn ein Benutzer kein eigenes " +"definiert. \n" +"Sie können beliebige Elemente von den \"Verfügbaren Widgets\" in \"Standard-" +"Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets " +"bewegen. \n" +"Wenn Sie fertig sind, vergessen Sie bitte nicht, auf \"Speichern\" zu " +"drücken.\n" " " #: aleksis/core/templates/core/edit_dashboard.html:48 @@ -1722,12 +1808,15 @@ msgstr "Kindgruppen zu Gruppen zuordnen" #: aleksis/core/templates/core/group/child_groups.html:18 msgid "" "\n" -" You can use this to assign child groups to groups. Please use the filters below to select groups you want to\n" +" You can use this to assign child groups to groups. Please use the " +"filters below to select groups you want to\n" " change and click \"Next\".\n" " " msgstr "" "\n" -" Sie können diese Seite verwenden, um Kindgruppen zu Gruppen zuzuordnen. Bitte nutzen Sie die folgenden Filter, um die Gruppen auszuwählen, die Sie \n" +" Sie können diese Seite verwenden, um Kindgruppen zu Gruppen " +"zuzuordnen. Bitte nutzen Sie die folgenden Filter, um die Gruppen " +"auszuwählen, die Sie \n" " ändern möchten und klicken auf \"Weiter\".\n" " " @@ -1768,14 +1857,18 @@ msgstr "Bitte seien Sie vorsichtig!" #: aleksis/core/templates/core/group/child_groups.html:79 msgid "" "\n" -" If you click \"Back\" or \"Next\" the current group assignments are not saved.\n" -" If you click \"Save\", you will overwrite all existing child group relations for this group with what you\n" +" If you click \"Back\" or \"Next\" the current group assignments " +"are not saved.\n" +" If you click \"Save\", you will overwrite all existing child " +"group relations for this group with what you\n" " selected on this page.\n" " " msgstr "" "\n" -" Wenn Sie auf \"Zurück\" oder \"Weiter\" klicken, werden die aktuellen Gruppenzuordnungen nicht gespeichert.\n" -"Wenn Sie auf \"Speichern\" klicken, werden alle existierenden Zuordnungen von Kindgruppen für diese Gruppe\n" +" Wenn Sie auf \"Zurück\" oder \"Weiter\" klicken, werden die " +"aktuellen Gruppenzuordnungen nicht gespeichert.\n" +"Wenn Sie auf \"Speichern\" klicken, werden alle existierenden Zuordnungen " +"von Kindgruppen für diese Gruppe\n" "mit dem überschrieben, was Sie auf dieser Seite ausgewählt haben.\n" " " @@ -1873,13 +1966,16 @@ msgstr "Startseite" #: aleksis/core/templates/core/index.html:34 msgid "" "\n" -" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" +" You didn't customise your dashboard so that you see the system " +"default. Please click on \"Edit dashboard\" to\n" " customise your personal dashboard.\n" " " msgstr "" "\n" -" Sie haben Ihr Dashboard nicht angepasst, sodass Sie das Standard-Dashboard sehen.\n" -"Bitte klicken Sie auf \"Dashboard bearbeiten\", um Ihr persönliches Dashboard anzupassen.\n" +" Sie haben Ihr Dashboard nicht angepasst, sodass Sie das Standard-" +"Dashboard sehen.\n" +"Bitte klicken Sie auf \"Dashboard bearbeiten\", um Ihr persönliches " +"Dashboard anzupassen.\n" " " #: aleksis/core/templates/core/index.html:44 @@ -1915,92 +2011,98 @@ msgstr "Systemstatus" msgid "System checks" msgstr "Systemprüfungen" -#: aleksis/core/templates/core/pages/system_status.html:22 +#: aleksis/core/templates/core/pages/system_status.html:26 msgid "Maintenance mode enabled" msgstr "Wartungsmodus aktiviert" -#: aleksis/core/templates/core/pages/system_status.html:24 +#: aleksis/core/templates/core/pages/system_status.html:28 msgid "" "\n" -" Only admin and visitors from internal IPs can access the site.\n" -" " +" Only admin and visitors from internal IPs can access the " +"site.\n" +" " msgstr "" "\n" -" Nur Administratoren und Besucher von internen IP-Adressen können die Seite aufrufen.\n" -" " +" Nur Administratoren und Besucher von internen IP-Adressen " +"können die Seite aufrufen.\n" +" " -#: aleksis/core/templates/core/pages/system_status.html:36 +#: aleksis/core/templates/core/pages/system_status.html:39 msgid "Maintenance mode disabled" msgstr "Wartungsmodus deaktiviert" -#: aleksis/core/templates/core/pages/system_status.html:37 +#: aleksis/core/templates/core/pages/system_status.html:40 msgid "Everyone can access the site." msgstr "Jeder kann die Seite aufrufen." -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:51 msgid "Debug mode enabled" msgstr "Debug-Modus aktiviert" -#: aleksis/core/templates/core/pages/system_status.html:49 +#: aleksis/core/templates/core/pages/system_status.html:53 msgid "" "\n" -" The web server throws back debug information on errors. Do not use in production!\n" +" The web server throws back debug information on errors. Do " +"not use in production!\n" " " msgstr "" "\n" -" Der Server gibt Debug-Informationen bei Fehlern zurück. Nicht im Produktivbetrieb nutzen!\n" +" Der Server gibt Debug-Informationen bei Fehlern zurück. " +"Nicht im Produktivbetrieb nutzen!\n" " " -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:60 msgid "Debug mode disabled" msgstr "Debug-Modus deaktivert" -#: aleksis/core/templates/core/pages/system_status.html:58 +#: aleksis/core/templates/core/pages/system_status.html:62 msgid "" "\n" -" Debug mode is disabled. Default error pages are displayed on errors.\n" +" Debug mode is disabled. Default error pages are displayed on " +"errors.\n" " " msgstr "" "\n" -" Debug-Modus ist deaktiviert. Standard-Fehlerseiten werden bei Fehlern angezeigt.\n" +" Debug-Modus ist deaktiviert. Standard-Fehlerseiten werden " +"bei Fehlern angezeigt.\n" " " -#: aleksis/core/templates/core/pages/system_status.html:71 +#: aleksis/core/templates/core/pages/system_status.html:75 msgid "System health checks" msgstr "Systemprüfungen" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:81 msgid "Service" msgstr "Dienst" -#: aleksis/core/templates/core/pages/system_status.html:78 -#: aleksis/core/templates/core/pages/system_status.html:119 +#: aleksis/core/templates/core/pages/system_status.html:82 +#: aleksis/core/templates/core/pages/system_status.html:123 msgid "Status" msgstr "Status" -#: aleksis/core/templates/core/pages/system_status.html:79 +#: aleksis/core/templates/core/pages/system_status.html:83 msgid "Time taken" msgstr "Dauer" -#: aleksis/core/templates/core/pages/system_status.html:100 +#: aleksis/core/templates/core/pages/system_status.html:104 msgid "seconds" msgstr "Sekunden" -#: aleksis/core/templates/core/pages/system_status.html:111 +#: aleksis/core/templates/core/pages/system_status.html:115 msgid "Celery task results" msgstr "Celery Task-Ergebnisse" -#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/core/pages/system_status.html:120 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "Task" -#: aleksis/core/templates/core/pages/system_status.html:117 +#: aleksis/core/templates/core/pages/system_status.html:121 msgid "ID" msgstr "ID" -#: aleksis/core/templates/core/pages/system_status.html:118 +#: aleksis/core/templates/core/pages/system_status.html:122 msgid "Date done" msgstr "Erledigungszeitpunkt" @@ -2012,11 +2114,13 @@ msgstr "PDF-Generierung testen" #: aleksis/core/templates/core/pages/test_pdf.html:14 msgid "" "\n" -" This simple view can be used to ensure the correct function of the built-in PDF generation system.\n" +" This simple view can be used to ensure the correct function of the " +"built-in PDF generation system.\n" " " msgstr "" "\n" -" Diese einfache Seite kann genutzt werden, um die korrekte Funktionalität des eingebauten PDF-Generierungssystem zu testen.\n" +" Diese einfache Seite kann genutzt werden, um die korrekte " +"Funktionalität des eingebauten PDF-Generierungssystem zu testen.\n" " " #: aleksis/core/templates/core/partials/announcements.html:8 @@ -2074,11 +2178,13 @@ msgstr "Unbekannt" #: aleksis/core/templates/core/partials/splash_screen.html:11 msgid "" "\n" -" This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n" +" This webbrowser doesn't support JavaScript, or its execution is " +"blocked. Please use another browser to continue.\n" " " msgstr "" "\n" -" Dieser Webbrowser unterstützt kein JavaScript oder die Ausführung wurde blockiert. Bitte nutzen Sie einen anderen Browser, um fortzufahren.\n" +" Dieser Webbrowser unterstützt kein JavaScript oder die Ausführung " +"wurde blockiert. Bitte nutzen Sie einen anderen Browser, um fortzufahren.\n" " " #: aleksis/core/templates/core/partials/splash_screen.html:17 @@ -2088,7 +2194,8 @@ msgid "" " " msgstr "" "\n" -" Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später erneut.\n" +" Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später " +"erneut.\n" " " #: aleksis/core/templates/core/perms/assign.html:12 @@ -2201,8 +2308,12 @@ msgid "The invite feature is disabled." msgstr "Die Einladungsfunktion ist deaktiviert." #: aleksis/core/templates/invitations/disabled.html:15 -msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " -msgstr "Um sie zu aktivieren, nutzen Sie die Checkbox im Abschnitt \"Authentifikation\" der " +msgid "" +"To enable it, switch on the corresponding checkbox in the authentication " +"section of the " +msgstr "" +"Um sie zu aktivieren, nutzen Sie die Checkbox im Abschnitt " +"\"Authentifikation\" der " #: aleksis/core/templates/invitations/disabled.html:16 msgid "site preferences page" @@ -2246,11 +2357,11 @@ msgstr "Mit E-Mail-Adresse einladen" msgid "Generate invitation code" msgstr "Einladungscode generieren" -#: aleksis/core/templates/invitations/forms/_invite.html:29 +#: aleksis/core/templates/invitations/forms/_invite.html:30 msgid "Generate code" msgstr "Code generieren" -#: aleksis/core/templates/invitations/forms/_invite.html:33 +#: aleksis/core/templates/invitations/forms/_invite.html:34 msgid "Invitations" msgstr "Einladungen" @@ -2266,7 +2377,6 @@ msgstr "OAuth2-Anwendung registrieren" #: aleksis/core/templates/oauth2_provider/application/create.html:14 #: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 #: aleksis/core/templates/two_factor/_wizard_actions.html:6 msgid "Cancel" msgstr "Abbrechen" @@ -2340,49 +2450,28 @@ msgstr "Erlauben" msgid "Disallow" msgstr "Verbieten" -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 -msgid "Revoke access" -msgstr "Zugriff zurückziehen" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Are you sure to revoke the access for this application?" -msgstr "Sind Sie sicher, dass Sie den Zugriff für diese Anwendung zurückziehen möchten?" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 -msgid "Revoke" -msgstr "Zurückziehen" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "Autorisierte Anwendungen" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 -msgid "No authorized applications." -msgstr "Keine autorisierten Anwendungen." - #: aleksis/core/templates/offline.html:5 msgid "Network error" msgstr "Netzwerkfehler" #: aleksis/core/templates/offline.html:10 -msgid "Page not available offline." -msgstr "Seite nicht offline verfügbar." +msgid "No connection to server." +msgstr "Keine Verbindung zum Server." #: aleksis/core/templates/offline.html:14 msgid "" "\n" -" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" -" administrators:\n" +" This page is not available without a connection to the server. Please " +"check your internet connection and try again.\n" +" If you are connected and the error persists, please contact the system " +"administrators:\n" " " msgstr "" "\n" -" Diese Seite ist offline nicht verfügbar. Da Sie vermutliche keine Internetverbindung haben, prüfen Sie, ob Ihr WLAN oder mobile Daten angeschaltet sind, \n" -" und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie verbunden sind, kontaktieren Sie bitte die \n" -" Systemadministratoren:\n" +" Diese Seite ist ohne eine Verbindung zum Server nicht verfügbar. Bitte " +"prüfen Sie Ihre Internetverbindung und probieren Sie es erneut.\n" +" Wenn Sie verbunden sind und der Fehler weiterhin auftritt, " +"kontaktieren Sie bitte die Systemadministratoren:\n" " " #: aleksis/core/templates/search/search.html:8 @@ -2417,12 +2506,14 @@ msgstr "Anmeldung über Drittanbieter-Konto fehlgeschlagen." #: aleksis/core/templates/socialaccount/authentication_error.html:15 msgid "" "\n" -" An error occurred while attempting to login via your third-party account.\n" +" An error occurred while attempting to login via your third-party " +"account.\n" " Please contact one of your site administrators.\n" " " msgstr "" "\n" -" Beim dem Versuch, die Anmeldung über Ihr Drittanbieter-Konto durchzuführen, ist ein Fehler aufgetreten.\n" +" Beim dem Versuch, die Anmeldung über Ihr Drittanbieter-Konto " +"durchzuführen, ist ein Fehler aufgetreten.\n" " Kontaktieren Sie bitte einen Ihrer Systemadministratoren:\n" " " @@ -2437,7 +2528,8 @@ msgstr "Löschen" #: aleksis/core/templates/socialaccount/connections.html:34 msgid "You currently have no third-party accounts connected to this account." -msgstr "Sie haben aktuell keine Drittanbieter-Konten mit Ihrem Konto verbunden." +msgstr "" +"Sie haben aktuell keine Drittanbieter-Konten mit Ihrem Konto verbunden." #: aleksis/core/templates/socialaccount/connections.html:37 msgid "Add a Third-party Account" @@ -2446,12 +2538,15 @@ msgstr "Ein Drittanbieter-Konto hinzufügen" #: aleksis/core/templates/socialaccount/login.html:12 #, python-format msgid "You are about to connect a new third party account from %(provider)s." -msgstr "Sie sind dabei, ein neues Drittanbieterkonto von %(provider)s zu verbinden." +msgstr "" +"Sie sind dabei, ein neues Drittanbieterkonto von %(provider)s zu verbinden." #: aleksis/core/templates/socialaccount/login.html:23 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." -msgstr "Sie sind dabei, sich mit einem Drittanbieterkonto von %(provider)s anzumelden." +msgstr "" +"Sie sind dabei, sich mit einem Drittanbieterkonto von %(provider)s " +"anzumelden." #: aleksis/core/templates/socialaccount/login.html:28 msgid "Continue" @@ -2467,11 +2562,15 @@ msgstr "Login abgebrochen" #, python-format msgid "" "\n" -" You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s\">sign in</a>.\n" +" You decided to cancel logging in to our site using one of your " +"existing accounts. If this was a mistake, please proceed to <a " +"href=\"%(login_url)s\">sign in</a>.\n" " " msgstr "" "\n" -" Sie haben sich entschieden, die Anmeldung mit einem Ihrer bestehenden Konten bei uns abzubrechen. Wenn dies ein Fehler war, <a href=\"%(login_url)s\">fahren Sie bitte mit dem Login fort</a>.\n" +" Sie haben sich entschieden, die Anmeldung mit einem Ihrer " +"bestehenden Konten bei uns abzubrechen. Wenn dies ein Fehler war, <a " +"href=\"%(login_url)s\">fahren Sie bitte mit dem Login fort</a>.\n" " " #: aleksis/core/templates/socialaccount/signup.html:12 @@ -2480,7 +2579,8 @@ msgid "" "You are about to use your %(provider_name)s account to login to\n" " %(site_name)s. As a final step, please complete the following form:" msgstr "" -"Sie sind dabei, Ihr %(provider_name)s-Konto zur Anmeldung bei %(site_name)s zu nutzen. \n" +"Sie sind dabei, Ihr %(provider_name)s-Konto zur Anmeldung bei %(site_name)s " +"zu nutzen. \n" "Als ein letzter Schritt vervollständigen Sie bitte das folgende Formular:" #: aleksis/core/templates/socialaccount/snippets/provider_list.html:12 @@ -2517,6 +2617,8 @@ msgstr "" #: aleksis/core/templates/templated_email/base.email:5 #: aleksis/core/templates/templated_email/base.email:16 +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 msgid "Hello" msgstr "Hallo" @@ -2528,7 +2630,8 @@ msgstr "Celery-Task %(task_name)s fehlgeschlagen!" #: aleksis/core/templates/templated_email/celery_failure.email:7 #, python-format msgid "the celery task %(task_name)s failed with following information:" -msgstr "der Celery-Task %(task_name)s ist mit folgenden Informationen fehlgeschlagen:" +msgstr "" +"der Celery-Task %(task_name)s ist mit folgenden Informationen fehlgeschlagen:" #: aleksis/core/templates/templated_email/celery_failure.email:10 #: aleksis/core/templates/templated_email/celery_failure.email:29 @@ -2558,7 +2661,8 @@ msgid "" " " msgstr "" "\n" -" der Celery-Task %(task_name)s ist mit folgenden Informationen fehlgeschlagen:\n" +" der Celery-Task %(task_name)s ist mit folgenden Informationen " +"fehlgeschlagen:\n" " " #: aleksis/core/templates/templated_email/data_checks.email:3 @@ -2568,21 +2672,25 @@ msgstr "Das System hat einige neue Probleme mit Ihren Daten entdeckt." #: aleksis/core/templates/templated_email/data_checks.email:6 msgid "" "the system detected some new problems with your data.\n" -"Please take some time to inspect them and solve the issues or mark them as ignored." +"Please take some time to inspect them and solve the issues or mark them as " +"ignored." msgstr "" "das System hat einige neue Probleme mit Ihren Daten entdeckt.\n" -"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder als ignoriert zu markieren." +"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder " +"als ignoriert zu markieren." #: aleksis/core/templates/templated_email/data_checks.email:15 msgid "" "\n" " the system detected some new problems with your data.\n" -" Please take some time to inspect them and solve the issues or mark them as ignored.\n" +" Please take some time to inspect them and solve the issues or mark them " +"as ignored.\n" " " msgstr "" "\n" " das System hat einige neue Probleme mit Ihren Daten entdeckt.\n" -"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder als ignoriert zu markieren.\n" +"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder " +"als ignoriert zu markieren.\n" " " #: aleksis/core/templates/templated_email/data_checks.email:23 @@ -2593,6 +2701,27 @@ msgstr "Problembeschreibung" msgid "Count of objects with new problems" msgstr "Anzahl der Objekte mit neuen Problemen" +#: aleksis/core/templates/templated_email/invitation.email:4 +#, python-format +msgid "Invitation to register on %(site)s" +msgstr "Einladung zur Registrierung auf %(site)s" + +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 +#, python-format +msgid "Hello %(person)s" +msgstr "Hallo %(person)s" + +#: aleksis/core/templates/templated_email/invitation.email:9 +#: aleksis/core/templates/templated_email/invitation.email:18 +#, python-format +msgid "" +"you have been invited to register on %(site)s. If you would like to accept " +"this invitation, please click on the following link:" +msgstr "" +"Sie wurden eingeladen, sich auf %(site)s zu registrieren. Wenn Sie diese " +"Einladung annehmen möchten, klicken Sie bitte auf folgenden Link:" + #: aleksis/core/templates/templated_email/notification.email:4 msgid "New notification for" msgstr "Neue Benachrichtigung für" @@ -2665,16 +2794,21 @@ msgid "" "\n" " Backup tokens can be used when your primary and backup\n" " phone numbers aren't available. The backup tokens below can be used\n" -" for login verification. If you've used up all your backup tokens, you\n" -" can generate a new set of backup tokens. Only the backup tokens shown\n" +" for login verification. If you've used up all your backup tokens, " +"you\n" +" can generate a new set of backup tokens. Only the backup tokens " +"shown\n" " below will be valid.\n" " " msgstr "" "\n" " Backup-Token können genutzt werden, wenn Ihre primären und Backup-\n" -" Telefonnummern nicht verfügbar sind. Die Backup-Tokens unten können für\n" -" die Anmeldungsverifizierung genutzt werden. Wenn Sie alle Backup-Tokens genutzt haben,\n" -" müssen Sie neue generieren. Nur gültige Backup-Tokens werden angezeigt.\n" +" Telefonnummern nicht verfügbar sind. Die Backup-Tokens unten können " +"für\n" +" die Anmeldungsverifizierung genutzt werden. Wenn Sie alle Backup-" +"Tokens genutzt haben,\n" +" müssen Sie neue generieren. Nur gültige Backup-Tokens werden " +"angezeigt.\n" " " #: aleksis/core/templates/two_factor/core/backup_tokens.html:33 @@ -2724,7 +2858,9 @@ msgstr "" #: aleksis/core/templates/two_factor/core/login.html:51 msgid "Please login with your account to use the external application." -msgstr "Bitte melden Sie sich mit Ihrem Konto an, um die externe Anwendung zu benutzen." +msgstr "" +"Bitte melden Sie sich mit Ihrem Konto an, um die externe Anwendung zu " +"benutzen." #: aleksis/core/templates/two_factor/core/login.html:58 msgid "Please login to see this page." @@ -2733,7 +2869,8 @@ msgstr "Bitte melden Sie sich an, um diese Seite zu sehen." #: aleksis/core/templates/two_factor/core/login.html:69 msgid "" "\n" -" We are calling your phone right now, please enter the\n" +" We are calling your phone right now, please enter " +"the\n" " digits you hear.\n" " " msgstr "" @@ -2745,7 +2882,8 @@ msgstr "" #: aleksis/core/templates/two_factor/core/login.html:74 msgid "" "\n" -" We sent you a text message, please enter the code we sent.\n" +" We sent you a text message, please enter the code we " +"sent.\n" " " msgstr "" "\n" @@ -2756,7 +2894,8 @@ msgstr "" #: aleksis/core/templates/two_factor/core/login.html:78 msgid "" "\n" -" We sent you an email, please enter the code we sent.\n" +" We sent you an email, please enter the code we " +"sent.\n" " " msgstr "" "\n" @@ -2767,17 +2906,20 @@ msgstr "" #: aleksis/core/templates/two_factor/core/login.html:82 msgid "" "\n" -" Please use your Webauthn-compatible device to authenticate.\n" +" Please use your Webauthn-compatible device to " +"authenticate.\n" " " msgstr "" "\n" -" Bitte nutzen Sie Ihr Webauthn-kompatibles Gerät, um sich zu authentifizieren.\n" +" Bitte nutzen Sie Ihr Webauthn-kompatibles Gerät, um " +"sich zu authentifizieren.\n" " " #: aleksis/core/templates/two_factor/core/login.html:86 msgid "" "\n" -" Please enter the code generated by your code generator.\n" +" Please enter the code generated by your code " +"generator.\n" " " msgstr "" "\n" @@ -2788,14 +2930,19 @@ msgstr "" #: aleksis/core/templates/two_factor/core/login.html:91 msgid "" "\n" -" Use this form for entering backup tokens for logging in.\n" -" These tokens have been generated for you to print and keep safe. Please\n" -" enter one of these backup tokens to login to your account.\n" +" Use this form for entering backup tokens for logging " +"in.\n" +" These tokens have been generated for you to print and " +"keep safe. Please\n" +" enter one of these backup tokens to login to your " +"account.\n" " " msgstr "" "\n" -" Nutzen Sie dieses Formular um Ihre Backup-Tokens zum Anmelden einzugeben.\n" -" Diese Tokens wurden für Sie generiert, um diese gut aufzubewahren. Bitte\n" +" Nutzen Sie dieses Formular um Ihre Backup-Tokens zum " +"Anmelden einzugeben.\n" +" Diese Tokens wurden für Sie generiert, um diese gut " +"aufzubewahren. Bitte\n" " geben Sie einen dieser Tokens ein, um sich einzuloggen.\n" " " @@ -2826,11 +2973,13 @@ msgstr "Zugriff verwehrt" #: aleksis/core/templates/two_factor/core/otp_required.html:10 msgid "" "The page you requested enforces users to verify using\n" -" two-factor authentication for security reasons. You need to enable this\n" +" two-factor authentication for security reasons. You need to enable " +"this\n" " security feature in order to access this page." msgstr "" "Die von Ihnen gewünschte Seite erfordert aus Sicherheitsgründen\n" -" eine Verifizierung durch Zwei-Faktor-Authentifizierung. Sie müssen diese\n" +" eine Verifizierung durch Zwei-Faktor-Authentifizierung. Sie müssen " +"diese\n" " Sicherheitsfunktion aktivieren, um die Seite aufzurufen." #: aleksis/core/templates/two_factor/core/otp_required.html:16 @@ -2874,7 +3023,8 @@ msgid "" msgstr "" "\n" " Sie sind dabei, Ihre Kontosicherheit auf das\n" -" nächste Level zu erhöhen. Bitte folgen Sie den Schritten im Assistenten, um eine\n" +" nächste Level zu erhöhen. Bitte folgen Sie den Schritten im " +"Assistenten, um eine\n" " Zwei-Faktor-Authentifizierungs-Methode zu Ihrem Konto hinzuzufügen.\n" " " @@ -2885,19 +3035,22 @@ msgid "" " " msgstr "" "\n" -" Bitte wählen Sie aus, welche Authentifikationsmethode Sie nutzen wollen:\n" +" Bitte wählen Sie aus, welche Authentifikationsmethode Sie nutzen " +"wollen:\n" " " #: aleksis/core/templates/two_factor/core/setup.html:27 msgid "" "\n" " To start using a code generator, please use your\n" -" favourite two-factor authentication (TOTP) app to scan the QR code below.\n" +" favourite two-factor authentication (TOTP) app to scan the QR code " +"below.\n" " Then enter the token generated by the app.\n" " " msgstr "" "\n" -" Um mit dem Code-Generator zu starten, benutzen Sie bitte Ihre favorisierte\n" +" Um mit dem Code-Generator zu starten, benutzen Sie bitte Ihre " +"favorisierte\n" "App für Zwei-Faktor-Authentifizierung (TOTP), um diesen QR-Code zu scannen.\n" "Dann geben Sie den in der App angezeigten Code ein:\n" " " @@ -2911,7 +3064,8 @@ msgid "" msgstr "" "\n" " Bitte geben Sie die Telefonnummer des Gerätes an,\n" -" an die die SMS-Nachrichten geschickt werden sollen. Diese Nummer wird im nächsten Schritt überprüft.\n" +" an die die SMS-Nachrichten geschickt werden sollen. Diese Nummer " +"wird im nächsten Schritt überprüft.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:45 @@ -2933,17 +3087,20 @@ msgid "" " " msgstr "" "\n" -" Wir haben Ihnen eine E-Mail geschickt, bitte geben Sie den Code ein, den wir geschickt haben.\n" +" Wir haben Ihnen eine E-Mail geschickt, bitte geben Sie den Code ein, " +"den wir geschickt haben.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:60 msgid "" "\n" -" We are calling your phone right now, please enter the digits you hear.\n" +" We are calling your phone right now, please enter the digits you " +"hear.\n" " " msgstr "" "\n" -" Wir rufen Ihr Telefon jetzt an, bitte geben Sie die Zahlen ein, die Sie hören.\n" +" Wir rufen Ihr Telefon jetzt an, bitte geben Sie die Zahlen ein, " +"die Sie hören.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:66 @@ -2953,23 +3110,30 @@ msgid "" " " msgstr "" "\n" -" Wir haben Ihnen eine SMS geschickt, bitte geben Sie den Code ein, den wir geschickt haben.\n" +" Wir haben Ihnen eine SMS geschickt, bitte geben Sie den Code " +"ein, den wir geschickt haben.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:73 msgid "" "\n" -" We've encountered an issue with the selected authentication method. Please\n" -" go back and verify that you entered your information correctly, try\n" -" again, or use a different authentication method instead. If the issue\n" +" We've encountered an issue with the selected authentication " +"method. Please\n" +" go back and verify that you entered your information correctly, " +"try\n" +" again, or use a different authentication method instead. If the " +"issue\n" " persists, contact the site administrator.\n" " " msgstr "" "\n" -" Mit der ausgewählten Authentifizierungsmethode ist ein Fehler aufgetreten. \n" -"Bitte gehen Sie zurück und überprüfen, dass Sie die Informationen korrekt eingegeben haben, versuchen Sie es erneut,\n" +" Mit der ausgewählten Authentifizierungsmethode ist ein Fehler " +"aufgetreten. \n" +"Bitte gehen Sie zurück und überprüfen, dass Sie die Informationen korrekt " +"eingegeben haben, versuchen Sie es erneut,\n" "oder benutzen Sie stattdessen eine andere Authentifizierungsmethode. \n" -"Wenn der Fehler bestehen bleibt, kontaktieren Sie bitte einen der Administratoren.\n" +"Wenn der Fehler bestehen bleibt, kontaktieren Sie bitte einen der " +"Administratoren.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:83 @@ -2994,11 +3158,13 @@ msgstr "Zwei-Faktor-Authentifizierung erfolgreich aktiviert" #: aleksis/core/templates/two_factor/core/setup_complete.html:13 msgid "" "\n" -" Congratulations, you've successfully enabled two-factor authentication.\n" +" Congratulations, you've successfully enabled two-factor " +"authentication.\n" " " msgstr "" "\n" -" Gratulation, Sie haben die Zwei-Faktor-Authentifizierung erfolgreich aktiviert.\n" +" Gratulation, Sie haben die Zwei-Faktor-Authentifizierung erfolgreich " +"aktiviert.\n" " " #: aleksis/core/templates/two_factor/core/setup_complete.html:22 @@ -3015,14 +3181,17 @@ msgstr "Backup-Codes generieren" msgid "" "\n" " However, it might happen that you don't have access to\n" -" your primary device. To enable account recovery, generate backup codes\n" +" your primary device. To enable account recovery, generate backup " +"codes\n" " or add other authentication methods.\n" " " msgstr "" "\n" -" Es kann passieren, dass Sie keinen Zugriff auf Ihr primäres Gerät haben. \n" +" Es kann passieren, dass Sie keinen Zugriff auf Ihr primäres Gerät " +"haben. \n" "Um die Konto-Wiederherstellung zu aktivieren,\n" -"generieren Sie Backup-Codes oder fügen Sie eine andere Authentifizierungs-Methode hinzu.\n" +"generieren Sie Backup-Codes oder fügen Sie eine andere Authentifizierungs-" +"Methode hinzu.\n" " " #: aleksis/core/templates/two_factor/core/setup_complete.html:48 @@ -3035,8 +3204,12 @@ msgid "Disable Two-Factor Authentication" msgstr "Zwei-Faktor-Authentifizierung deaktiveren" #: aleksis/core/templates/two_factor/profile/disable.html:12 -msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" -msgstr "Sie sind dabei, Zwei-Faktor-Authentifizierung zu deaktivieren. Das verschlechtert Ihre Kontosicherheit. Sind Sie sicher?" +msgid "" +"You are about to disable two-factor authentication. This weakens your " +"account security, are you sure?" +msgstr "" +"Sie sind dabei, Zwei-Faktor-Authentifizierung zu deaktivieren. Das " +"verschlechtert Ihre Kontosicherheit. Sind Sie sicher?" #: aleksis/core/templates/two_factor/profile/disable.html:26 msgid "Disable" @@ -3070,152 +3243,190 @@ msgstr "Es ist ein Fehler beim Generieren der PDF-Datei aufgetreten." msgid "Download PDF" msgstr "PDF herunterladen" -#: aleksis/core/views.py:280 +#: aleksis/core/views.py:285 msgid "The school term has been created." msgstr "Das Schuljahr wurde erstellt." -#: aleksis/core/views.py:292 +#: aleksis/core/views.py:297 msgid "The school term has been saved." msgstr "Das Schuljahr wurde gespeichert." -#: aleksis/core/views.py:396 +#: aleksis/core/views.py:401 msgid "The child groups were successfully saved." msgstr "Die Untergruppen wurden gespeichert." -#: aleksis/core/views.py:415 aleksis/core/views.py:425 +#: aleksis/core/views.py:420 aleksis/core/views.py:430 msgid "The person has been saved." msgstr "Die Person wurde gespeichert." -#: aleksis/core/views.py:475 +#: aleksis/core/views.py:480 msgid "The group has been saved." msgstr "Die Gruppe wurde gespeichert." -#: aleksis/core/views.py:558 +#: aleksis/core/views.py:528 +msgid "Maintenance mode was turned on successfully." +msgstr "Der Wartungsmodus wurde erfolgreich angeschaltet." + +#: aleksis/core/views.py:530 +msgid "Maintenance mode was turned off successfully." +msgstr "Der Wartungsmodus wurde erfolgreich ausgeschaltet." + +#: aleksis/core/views.py:588 msgid "The announcement has been saved." msgstr "Die Ankündigung wurde gespeichert." -#: aleksis/core/views.py:574 +#: aleksis/core/views.py:604 msgid "The announcement has been deleted." msgstr "Ankündigung wurde gelöscht." -#: aleksis/core/views.py:643 +#: aleksis/core/views.py:673 msgid "The requested preference registry does not exist" msgstr "Das angeforderte Einstellungsregister existiert nicht" -#: aleksis/core/views.py:662 +#: aleksis/core/views.py:692 msgid "The preferences have been saved successfully." msgstr "Die Einstellungen wurde gespeichert." -#: aleksis/core/views.py:686 +#: aleksis/core/views.py:716 msgid "The person has been deleted." msgstr "Die Person wurde gelöscht." -#: aleksis/core/views.py:700 +#: aleksis/core/views.py:730 msgid "The group has been deleted." msgstr "Die Gruppe wurde gelöscht." -#: aleksis/core/views.py:732 +#: aleksis/core/views.py:762 msgid "The additional field has been saved." msgstr "Das zusätzliche Feld wurde gespeichert." -#: aleksis/core/views.py:767 +#: aleksis/core/views.py:797 msgid "The additional field has been deleted." msgstr "Das zusätzliche Feld wurde gelöscht." -#: aleksis/core/views.py:792 +#: aleksis/core/views.py:822 msgid "The group type has been saved." msgstr "Der Gruppentyp wurde gespeichert." -#: aleksis/core/views.py:823 +#: aleksis/core/views.py:853 msgid "The group type has been deleted." msgstr "Der Gruppentyp wurde gelöscht." -#: aleksis/core/views.py:858 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "Fortschritt: Datenprüfungen ausführen" -#: aleksis/core/views.py:859 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "Datenprüfungen laufen …" -#: aleksis/core/views.py:860 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt." -#: aleksis/core/views.py:861 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "Es gab ein Problem beim Ausführen der Datenprüfungen." -#: aleksis/core/views.py:878 +#: aleksis/core/views.py:908 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "Die Lösungsoption \"{solve_option_obj.verbose_name}\" " -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:918 msgid "The requested solve option does not exist" msgstr "Die angeforderte Lösungsoption existiert nicht" -#: aleksis/core/views.py:921 +#: aleksis/core/views.py:951 msgid "The dashboard widget has been saved." msgstr "Das Dashboard-Widget wurde gespeichert." -#: aleksis/core/views.py:951 +#: aleksis/core/views.py:981 msgid "The dashboard widget has been created." msgstr "Das Dashboard-Widget wurde erstellt." -#: aleksis/core/views.py:961 +#: aleksis/core/views.py:991 msgid "The dashboard widget has been deleted." msgstr "Das Dashboard-Widget wurde gelöscht." -#: aleksis/core/views.py:1033 +#: aleksis/core/views.py:1063 msgid "Your dashboard configuration has been saved successfully." msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert." -#: aleksis/core/views.py:1035 +#: aleksis/core/views.py:1065 msgid "The configuration of the default dashboard has been saved successfully." -msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert." +msgstr "" +"Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert." -#: aleksis/core/views.py:1106 +#: aleksis/core/views.py:1136 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" -msgstr "Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}" +msgstr "" +"Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}" -#: aleksis/core/views.py:1203 +#: aleksis/core/views.py:1233 msgid "We have successfully assigned the permissions." msgstr "Wir haben die Berechtigungen erfolgreich zugewiesen." -#: aleksis/core/views.py:1213 +#: aleksis/core/views.py:1243 msgid "The global user permission has been deleted." msgstr "Die globale Benutzerberechtigung wurde gelöscht." -#: aleksis/core/views.py:1223 +#: aleksis/core/views.py:1253 msgid "The global group permission has been deleted." msgstr "Die globale Gruppenberechtigung wurde gelöscht." -#: aleksis/core/views.py:1233 +#: aleksis/core/views.py:1263 msgid "The object user permission has been deleted." msgstr "Die Objekt-Benutzerberechtigung wurde gelöscht." -#: aleksis/core/views.py:1243 +#: aleksis/core/views.py:1273 msgid "The object group permission has been deleted." msgstr "Die Objekt-Gruppenberechtigung wurde gelöscht." -#: aleksis/core/views.py:1352 -msgid "The third-party account could not be disconnected because it is the only login method available." -msgstr "Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige verfügbare Anmeldeoption ist." +#: aleksis/core/views.py:1382 +msgid "" +"The third-party account could not be disconnected because it is the only " +"login method available." +msgstr "" +"Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige " +"verfügbare Anmeldeoption ist." -#: aleksis/core/views.py:1359 +#: aleksis/core/views.py:1389 msgid "The third-party account has been successfully disconnected." msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt." -#: aleksis/core/views.py:1435 -msgid "Person was invited successfully and an email with further instructions has been send to them." -msgstr "Die Person wurde erfolgreich eingeladen und eine E-Mail mit weiteren Anweisungen wurde an sie verschickt." +#: aleksis/core/views.py:1465 +msgid "" +"Person was invited successfully and an email with further instructions has " +"been send to them." +msgstr "" +"Die Person wurde erfolgreich eingeladen und eine E-Mail mit weiteren " +"Anweisungen wurde an sie verschickt." -#: aleksis/core/views.py:1446 +#: aleksis/core/views.py:1476 msgid "Person was already invited." msgstr "Person wurde bereits eingeladen." +#~ msgid "Revoke access" +#~ msgstr "Zugriff zurückziehen" + +#~ msgid "Are you sure to revoke the access for this application?" +#~ msgstr "" +#~ "Sind Sie sicher, dass Sie den Zugriff für diese Anwendung zurückziehen " +#~ "möchten?" + +#~ msgid "Revoke" +#~ msgstr "Zurückziehen" + +#~ msgid "Authorized applications" +#~ msgstr "Autorisierte Anwendungen" + +#~ msgid "No authorized applications." +#~ msgstr "Keine autorisierten Anwendungen." + +#~ msgid "Page not available offline." +#~ msgstr "Seite nicht offline verfügbar." + #~ msgid "" #~ "The maintenance mode is currently enabled. Please try again\n" #~ " later." @@ -3225,11 +3436,14 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "" #~ "\n" -#~ " This page is currently unavailable. If this error persists, contact your site administrators:\n" +#~ " This page is currently unavailable. If this error persists, " +#~ "contact your site administrators:\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Diese Seite ist aktuell nicht erreichbar. Wenn dieser Fehler bestehen bleibt, kontaktieren Sie bitte einen Ihrer Systemadministratoren:\n" +#~ " Diese Seite ist aktuell nicht erreichbar. Wenn dieser Fehler " +#~ "bestehen bleibt, kontaktieren Sie bitte einen Ihrer " +#~ "Systemadministratoren:\n" #~ " " #~ msgid "" @@ -3238,7 +3452,8 @@ msgstr "Person wurde bereits eingeladen." #~ " security." #~ msgstr "" #~ "Die Zwei-Faktor-Authentifizierung ist nicht für Ihren Account aktiviert.\n" -#~ " Aktivieren Sie Zwei-Faktor-Authentifizierung für eine verbesserte\n" +#~ " Aktivieren Sie Zwei-Faktor-Authentifizierung für eine " +#~ "verbesserte\n" #~ " Accountsicherheit." #~ msgid "Add Phone Number" @@ -3265,7 +3480,8 @@ msgstr "Person wurde bereits eingeladen." #~ " send backup tokens to the phone numbers listed below." #~ msgstr "" #~ "Wenn Ihre primäre Methode nicht verfügbar ist, sind wir in der Lage,\n" -#~ " Backup-Tokens zu den unten aufgelisteten Telefonnummern zu schicken." +#~ " Backup-Tokens zu den unten aufgelisteten Telefonnummern zu " +#~ "schicken." #~ msgid "Unregister" #~ msgstr "Abmelden" @@ -3306,7 +3522,8 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "" #~ "\n" #~ " Wir raten Ihnen jedoch dringend davon ab.\n" -#~ " Sie können jedoch auch die Zwei-Faktor-Authentifizierung für Ihr Konto deaktivieren.\n" +#~ " Sie können jedoch auch die Zwei-Faktor-Authentifizierung für Ihr " +#~ "Konto deaktivieren.\n" #~ " " #~ msgid "" @@ -3317,8 +3534,10 @@ msgstr "Person wurde bereits eingeladen." #~ " " #~ msgstr "" #~ "\n" -#~ " Die Zwei-Faktor-Authentifizierung ist nicht für Ihren Account aktiviert.\n" -#~ " Aktivieren Sie Zwei-Faktor-Authentifizierung für eine verbesserte\n" +#~ " Die Zwei-Faktor-Authentifizierung ist nicht für Ihren Account " +#~ "aktiviert.\n" +#~ " Aktivieren Sie Zwei-Faktor-Authentifizierung für eine " +#~ "verbesserte\n" #~ " Accountsicherheit.\n" #~ " " @@ -3337,7 +3556,9 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "%(name)s wurde am %(birthday)s geboren" #~ msgid "You must grant the permission to all objects and/or to some objects." -#~ msgstr "Sie müssen die Berechtigung auf alle Objekte und/oder für einige Objekte vergeben." +#~ msgstr "" +#~ "Sie müssen die Berechtigung auf alle Objekte und/oder für einige Objekte " +#~ "vergeben." #~ msgid "Dashboard" #~ msgstr "Dashboard" @@ -3428,8 +3649,14 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "ICal Feeds" #~ msgstr "iCal-Feeds" -#~ msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software." -#~ msgstr "Dies sind URLs für verschiedene Kalender-Feeds im iCal-Format (.ics). Sie können so viele erstellen, wie sie wollen, und in Ihre Kalender-Software importieren." +#~ msgid "" +#~ "These are URLs for different Calendar Feeds in the iCal (.ics) format. " +#~ "You can create as many as you want and import them in your calendar " +#~ "software." +#~ msgstr "" +#~ "Dies sind URLs für verschiedene Kalender-Feeds im iCal-Format (.ics). Sie " +#~ "können so viele erstellen, wie sie wollen, und in Ihre Kalender-Software " +#~ "importieren." #~ msgid "Your iCal URLs" #~ msgstr "Deine iCal-URLs" @@ -3454,24 +3681,30 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "" #~ "\n" -#~ " This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" -#~ " to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" +#~ " This platform is powered by AlekSIS®, a web-based school " +#~ "information system (SIS) which can be used\n" +#~ " to manage and/or publish organisational artifacts of " +#~ "educational institutions. AlekSIS is free software and\n" #~ " can be used by anyone.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Diese Plattform wird mit AlekSIS®, einem webbasierten Schulinformationssystem (SIS), \n" -#~ "welches für die Verwaltung und/oder Veröffentlichung von Bildungseinrichtungen verwendet werden kann.\n" +#~ " Diese Plattform wird mit AlekSIS®, einem webbasierten " +#~ "Schulinformationssystem (SIS), \n" +#~ "welches für die Verwaltung und/oder Veröffentlichung von " +#~ "Bildungseinrichtungen verwendet werden kann.\n" #~ "AlekSIS ist freie Software und kann von jedem benutzt werden.\n" #~ " " #~ msgid "" #~ "\n" -#~ " AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" +#~ " AlekSIS® is a registered trademark of the AlekSIS open " +#~ "source project, represented by Teckids e.V.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " AlekSIS® ist eine eingetragene Wortmarke des Open-Source-Projektes AlekSIS, vertreten durch den Teckids e.V.\n" +#~ " AlekSIS® ist eine eingetragene Wortmarke des Open-Source-" +#~ "Projektes AlekSIS, vertreten durch den Teckids e.V.\n" #~ " " #~ msgid "Website of AlekSIS" @@ -3485,14 +3718,18 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "" #~ "\n" -#~ " The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" -#~ " information from third-party apps, if installed, refer to the respective components below. The\n" +#~ " The core and the official apps of AlekSIS are licenced " +#~ "under the EUPL, version 1.2 or later. For licence\n" +#~ " information from third-party apps, if installed, refer to " +#~ "the respective components below. The\n" #~ " licences are marked like this:\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Der Core und die offiziellen Apps von AlekSIS sind unter der EUPL, Version 1.2 oder später, lizenziert. Für Lizenzinformationen\n" -#~ "zu Apps von Drittanbietern, wenn installiert, siehe direkt bei der jeweiligen App weiter unten auf dieser Seite. Die Lizenzen\n" +#~ " Der Core und die offiziellen Apps von AlekSIS sind unter " +#~ "der EUPL, Version 1.2 oder später, lizenziert. Für Lizenzinformationen\n" +#~ "zu Apps von Drittanbietern, wenn installiert, siehe direkt bei der " +#~ "jeweiligen App weiter unten auf dieser Seite. Die Lizenzen\n" #~ "sind wie folgt markiert:\n" #~ " " @@ -3510,20 +3747,24 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "" #~ "\n" -#~ " Without activated JavaScript the progress status can't be updated.\n" +#~ " Without activated JavaScript the progress status can't be " +#~ "updated.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Ohne aktiviertes JavaScript kann der Fortschritt leider nicht aktualisiert werden.\n" +#~ " Ohne aktiviertes JavaScript kann der Fortschritt leider " +#~ "nicht aktualisiert werden.\n" #~ " " #~ msgid "" #~ "\n" -#~ " Only admin and visitors from internal IPs can access thesite.\n" +#~ " Only admin and visitors from internal IPs can access " +#~ "thesite.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Nur Administratoren und Besucher von internen IP-Adressen können die Seite aufrufen.\n" +#~ " Nur Administratoren und Besucher von internen IP-Adressen " +#~ "können die Seite aufrufen.\n" #~ " " #~ msgid "Language" @@ -3534,12 +3775,14 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "" #~ "\n" -#~ " Your administrator account is not linked to any person. Therefore,\n" +#~ " Your administrator account is not linked to any person. " +#~ "Therefore,\n" #~ " a dummy person has been linked to your account.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Ihr Administratorenkonto ist mit keiner Person verknüpft. Deshalb\n" +#~ " Ihr Administratorenkonto ist mit keiner Person verknüpft. " +#~ "Deshalb\n" #~ " wurde Ihr Konto mit einer Dummyperson verknüpft.\n" #~ " " @@ -3551,8 +3794,10 @@ msgstr "Person wurde bereits eingeladen." #~ " " #~ msgstr "" #~ "\n" -#~ " Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das bedeutet, dass Sie\n" -#~ " keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie sich an\n" +#~ " Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das " +#~ "bedeutet, dass Sie\n" +#~ " keine schulbezogenen Informationen aufrufen können. Bitte wenden " +#~ "Sie sich an\n" #~ " die Verwaltenden von AlekSIS an Ihrer Schule.\n" #~ " " @@ -3575,21 +3820,27 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "Erfolg!" #~ msgid "Please return to your application and enter this code:" -#~ msgstr "Bitte gehen Sie zurück in Ihre Anwendung und geben Sie diesen Code ein:" +#~ msgstr "" +#~ "Bitte gehen Sie zurück in Ihre Anwendung und geben Sie diesen Code ein:" #~ msgid "No internet connection." #~ msgstr "Keine Internetverbindung." #~ msgid "" #~ "\n" -#~ " There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" -#~ " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" +#~ " There was an error accessing this page. You probably don't have an " +#~ "internet connection. Check to see if your WiFi\n" +#~ " or mobile data is turned on and try again. If you think you are " +#~ "connected, please contact the system\n" #~ " administrators:\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Es ist ein Fehler beim Aufrufen der Seite aufgetreten. Eventuell haben Sie keine Internetverbindung. Bitte prüfen Sie, ob WLAN oder mobile Daten aktiv sind, \n" -#~ " und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie mit dem Internet verbunden sind, kontaktieren Sie bitte einen Ihrer \n" +#~ " Es ist ein Fehler beim Aufrufen der Seite aufgetreten. Eventuell " +#~ "haben Sie keine Internetverbindung. Bitte prüfen Sie, ob WLAN oder mobile " +#~ "Daten aktiv sind, \n" +#~ " und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie " +#~ "mit dem Internet verbunden sind, kontaktieren Sie bitte einen Ihrer \n" #~ " Systemadministratoren:\n" #~ " " @@ -3685,7 +3936,8 @@ msgstr "Person wurde bereits eingeladen." #~ " <li>ID des Tasks: %(task_id)s</li>\n" #~ " <li>Aufgetretene Exception: %(exception)s</li>\n" #~ " <li>Argumente, mit denen der Task aufgerufen wurde: %(args)s</li>\n" -#~ " <li>Keyword-Argumente, mit denen der Task aufgerufen wurde: %(kwargs)s</li>\n" +#~ " <li>Keyword-Argumente, mit denen der Task aufgerufen wurde: " +#~ "%(kwargs)s</li>\n" #~ " <li>Stacktrace: %(traceback)s</li>\n" #~ " </ul>\n" #~ " " @@ -3704,8 +3956,12 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "Zustimmungen" #, python-brace-format -#~ msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them." -#~ msgstr "Ich habe die <a href='{privacy_policy}'>Datenschutzerklärung</a> gelesen und stimme ihr zu." +#~ msgid "" +#~ "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree " +#~ "with them." +#~ msgstr "" +#~ "Ich habe die <a href='{privacy_policy}'>Datenschutzerklärung</a> gelesen " +#~ "und stimme ihr zu." #~ msgid "You must type the same password each time." #~ msgstr "Sie müssen zweimal das gleiche Passwort eingeben." @@ -3714,8 +3970,12 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "Verkleidung" #, python-format -#~ msgid "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change your e-mail address</a>" -#~ msgstr "<strong>Hinweis:</strong> Sie können immer noch <a href=\"%(email_url)s\"> Ihre E-Mail-Adresse ändern</a>" +#~ msgid "" +#~ "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change " +#~ "your e-mail address</a>" +#~ msgstr "" +#~ "<strong>Hinweis:</strong> Sie können immer noch <a " +#~ "href=\"%(email_url)s\"> Ihre E-Mail-Adresse ändern</a>" #~ msgid "Impress" #~ msgstr "Impressum" @@ -3737,7 +3997,9 @@ msgstr "Person wurde bereits eingeladen." #, python-format #~ msgid "Are you sure to delete the application %(application_name)s?" -#~ msgstr "Sind Sie sicher, dass Sie die Anwendung %(application_name)s löschen möchten?" +#~ msgstr "" +#~ "Sind Sie sicher, dass Sie die Anwendung %(application_name)s löschen " +#~ "möchten?" #~ msgid "Authorization Grant Type" #~ msgstr "Authorization Grant-Typ" @@ -3762,17 +4024,23 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "" #~ "\n" -#~ " You can use this form to assign user accounts to persons. Use the\n" -#~ " dropdowns to select existing accounts; use the text fields to create new\n" -#~ " accounts on-the-fly. The latter will create a new account with the\n" +#~ " You can use this form to assign user accounts to persons. Use " +#~ "the\n" +#~ " dropdowns to select existing accounts; use the text fields to " +#~ "create new\n" +#~ " accounts on-the-fly. The latter will create a new account with " +#~ "the\n" #~ " entered username and copy all other details from the person.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Sie können dieses Formular nutzen, um Benutzerkonten Personen zuzuweisen. Nutzen Sie das\n" -#~ " Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen Sie das Textfeld, um einen neuen Benutzer zu\n" +#~ " Sie können dieses Formular nutzen, um Benutzerkonten Personen " +#~ "zuzuweisen. Nutzen Sie das\n" +#~ " Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen " +#~ "Sie das Textfeld, um einen neuen Benutzer zu\n" #~ " erstellen. Letzteres erstellt ein neues Benutzerkonto mit dem\n" -#~ " eingegebenen Benutzernamen und kopiert alle anderen Daten der Person.\n" +#~ " eingegebenen Benutzernamen und kopiert alle anderen Daten der " +#~ "Person.\n" #~ " " #~ msgid "Existing account" @@ -3798,7 +4066,8 @@ msgstr "Person wurde bereits eingeladen." #~ "We sent you a text message, please enter the tokens we\n" #~ " sent." #~ msgstr "" -#~ "Wir haben Ihnen eine Textnachricht geschickt. Bitte geben Sie die Tokens ein,\n" +#~ "Wir haben Ihnen eine Textnachricht geschickt. Bitte geben Sie die Tokens " +#~ "ein,\n" #~ " die wir Ihnen geschickt haben." #~ msgid "French" @@ -3807,8 +4076,12 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "Norwegian (bokmÃ¥l)" #~ msgstr "Norwegisch (bokmÃ¥l)" -#~ msgid "The data check has been started. Please note that it may take a while before you are able to fetch the data on this page." -#~ msgstr "Die Datenüberprüfung wurde gestartet. Bitte beachten Sie, dass es eine Weile dauern kann, bevor Sie auf dieser Seite Ergebnisse abrufen können." +#~ msgid "" +#~ "The data check has been started. Please note that it may take a while " +#~ "before you are able to fetch the data on this page." +#~ msgstr "" +#~ "Die Datenüberprüfung wurde gestartet. Bitte beachten Sie, dass es eine " +#~ "Weile dauern kann, bevor Sie auf dieser Seite Ergebnisse abrufen können." #~ msgid "The data check has finished." #~ msgstr "Die Datenüberprüfung wurde beendet." @@ -3862,7 +4135,8 @@ msgstr "Person wurde bereits eingeladen." #~ " " #~ msgstr "" #~ "\n" -#~ " Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n" +#~ " Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS " +#~ "handelt, kontaktieren Sie bitte einen Ihrer\n" #~ " Systemadministratoren:\n" #~ " " @@ -3936,7 +4210,9 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "Markdown-Anleitung (Hilfe)" #~ msgid "You are not allowed to mark notifications from other users as read!" -#~ msgstr "Es ist Ihnen nicht erlaubt, Benachrichtigungen von anderen Benutzern als gelesen zu markieren!" +#~ msgstr "" +#~ "Es ist Ihnen nicht erlaubt, Benachrichtigungen von anderen Benutzern als " +#~ "gelesen zu markieren!" #, fuzzy #~ msgid "School name" diff --git a/aleksis/core/locale/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po index 225b1a398e823d1b3a053bfd39c4ba7130561b07..2b3c3874af650baf3f812cf740ee2a3f1a9af29e 100644 --- a/aleksis/core/locale/fr/LC_MESSAGES/django.po +++ b/aleksis/core/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-27 13:23+0100\n" +"POT-Creation-Date: 2023-05-09 18:40+0200\n" "PO-Revision-Date: 2021-06-16 12:00+0000\n" "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis/fr/>\n" @@ -18,30 +18,34 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.4\n" -#: aleksis/core/apps.py:155 +#: aleksis/core/apps.py:151 +msgid "You have been logged out successfully." +msgstr "" + +#: aleksis/core/apps.py:161 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:156 +#: aleksis/core/apps.py:162 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:157 +#: aleksis/core/apps.py:163 msgid "Full home postal address" msgstr "" -#: aleksis/core/apps.py:158 +#: aleksis/core/apps.py:164 #, fuzzy #| msgid "Contact details" msgid "Email address" msgstr "Détails de contact" -#: aleksis/core/apps.py:159 +#: aleksis/core/apps.py:165 msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 -#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:166 aleksis/core/forms.py:221 +#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 #, fuzzy #| msgid "Group" @@ -104,184 +108,184 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +#: aleksis/core/filters.py:113 aleksis/core/models.py:721 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +#: aleksis/core/filters.py:135 aleksis/core/models.py:494 msgid "Group" msgstr "groupe" -#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +#: aleksis/core/forms.py:51 aleksis/core/forms.py:582 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +#: aleksis/core/forms.py:56 aleksis/core/tables.py:47 msgid "Address" msgstr "" -#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +#: aleksis/core/forms.py:57 aleksis/core/forms.py:591 #, fuzzy #| msgid "Contact details" msgid "Contact data" msgstr "Détails de contact" -#: aleksis/core/forms.py:58 +#: aleksis/core/forms.py:59 #, fuzzy #| msgid "Contact details" msgid "Advanced personal data" msgstr "Détails de contact" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "New user" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "Create a new account" msgstr "" -#: aleksis/core/forms.py:132 +#: aleksis/core/forms.py:133 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:136 +#: aleksis/core/forms.py:137 msgid "This username is already in use." msgstr "Cet nom est deja en utilisation." -#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +#: aleksis/core/forms.py:154 aleksis/core/models.py:142 msgid "School term" msgstr "" -#: aleksis/core/forms.py:154 +#: aleksis/core/forms.py:155 #, fuzzy #| msgid "Contact details" msgid "Common data" msgstr "Détails de contact" -#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:208 +#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 #, fuzzy #| msgid "Person" msgid "Persons" msgstr "Personne" -#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +#: aleksis/core/forms.py:157 aleksis/core/forms.py:593 #, fuzzy #| msgid "Contact details" msgid "Additional data" msgstr "Détails de contact" -#: aleksis/core/forms.py:157 aleksis/core/models.py:217 -#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +#: aleksis/core/forms.py:158 aleksis/core/models.py:218 +#: aleksis/core/models.py:547 aleksis/core/tables.py:46 msgid "Photo" msgstr "" -#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:84 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:85 msgid "Date" msgstr "Date" -#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:92 +#: aleksis/core/forms.py:201 aleksis/core/forms.py:204 +#: aleksis/core/models.py:93 msgid "Time" msgstr "" -#: aleksis/core/forms.py:233 +#: aleksis/core/forms.py:234 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:236 +#: aleksis/core/forms.py:237 msgid "Who should see the announcement?" msgstr "" -#: aleksis/core/forms.py:237 +#: aleksis/core/forms.py:238 msgid "Write your announcement:" msgstr "" -#: aleksis/core/forms.py:276 +#: aleksis/core/forms.py:277 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:280 +#: aleksis/core/forms.py:281 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:289 +#: aleksis/core/forms.py:290 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:398 +#: aleksis/core/forms.py:399 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:399 +#: aleksis/core/forms.py:400 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "First name" msgstr "Prénom" -#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +#: aleksis/core/forms.py:420 aleksis/core/models.py:194 msgid "Last name" msgstr "Nom de famille" -#: aleksis/core/forms.py:428 +#: aleksis/core/forms.py:429 msgid "A person is using this e-mail address" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:457 msgid "Who should get the permission?" msgstr "" -#: aleksis/core/forms.py:457 +#: aleksis/core/forms.py:458 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:483 +#: aleksis/core/forms.py:484 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:486 +#: aleksis/core/forms.py:487 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:494 +#: aleksis/core/forms.py:495 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:499 +#: aleksis/core/forms.py:500 msgid "You must grant the permission to all objects or to specific objects." msgstr "" -#: aleksis/core/forms.py:586 +#: aleksis/core/forms.py:587 msgid "Address data" msgstr "" -#: aleksis/core/forms.py:598 +#: aleksis/core/forms.py:599 #, fuzzy #| msgid "Contact details" msgid "Account data" msgstr "Détails de contact" -#: aleksis/core/forms.py:605 +#: aleksis/core/forms.py:606 msgid "Password" msgstr "" -#: aleksis/core/forms.py:608 +#: aleksis/core/forms.py:609 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:761 +#: aleksis/core/forms.py:762 msgid "The selected action does not exist." msgstr "" -#: aleksis/core/forms.py:772 +#: aleksis/core/forms.py:773 msgid "You do not have permission to run {} on all selected objects." msgstr "" -#: aleksis/core/forms.py:828 +#: aleksis/core/forms.py:829 msgid "No valid selection." msgstr "" @@ -309,494 +313,494 @@ msgstr "" msgid "Linked school term" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:83 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:83 +#: aleksis/core/models.py:84 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:85 +#: aleksis/core/models.py:86 msgid "Date and time" msgstr "" -#: aleksis/core/models.py:86 +#: aleksis/core/models.py:87 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:87 aleksis/core/models.py:210 +#: aleksis/core/models.py:88 aleksis/core/models.py:211 msgid "E-mail address" msgstr "" -#: aleksis/core/models.py:88 +#: aleksis/core/models.py:89 msgid "Integer" msgstr "" -#: aleksis/core/models.py:89 +#: aleksis/core/models.py:90 msgid "IP address" msgstr "" -#: aleksis/core/models.py:90 +#: aleksis/core/models.py:91 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:91 +#: aleksis/core/models.py:92 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:93 +#: aleksis/core/models.py:94 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +#: aleksis/core/models.py:106 aleksis/core/models.py:1078 msgid "Name" msgstr "" -#: aleksis/core/models.py:107 +#: aleksis/core/models.py:108 #, fuzzy #| msgid "Contact details" msgid "Start date" msgstr "Détails de contact" -#: aleksis/core/models.py:108 +#: aleksis/core/models.py:109 msgid "End date" msgstr "" -#: aleksis/core/models.py:127 +#: aleksis/core/models.py:128 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:134 +#: aleksis/core/models.py:135 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:142 +#: aleksis/core/models.py:143 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 msgid "School terms" msgstr "" -#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +#: aleksis/core/models.py:164 aleksis/core/models.py:1027 msgid "Person" msgstr "Personne" -#: aleksis/core/models.py:166 +#: aleksis/core/models.py:167 #, fuzzy #| msgid "Contact details" msgid "Can view address" msgstr "Détails de contact" -#: aleksis/core/models.py:167 +#: aleksis/core/models.py:168 #, fuzzy #| msgid "Contact details" msgid "Can view contact details" msgstr "Détails de contact" -#: aleksis/core/models.py:168 +#: aleksis/core/models.py:169 #, fuzzy #| msgid "Contact details" msgid "Can view photo" msgstr "Détails de contact" -#: aleksis/core/models.py:169 +#: aleksis/core/models.py:170 #, fuzzy #| msgid "Contact details" msgid "Can view avatar image" msgstr "Détails de contact" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:171 #, fuzzy #| msgid "Contact details" msgid "Can view persons groups" msgstr "Détails de contact" -#: aleksis/core/models.py:171 +#: aleksis/core/models.py:172 #, fuzzy #| msgid "Contact details" msgid "Can view personal details" msgstr "Détails de contact" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "female" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "male" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "other" msgstr "" -#: aleksis/core/models.py:189 aleksis/core/models.py:1353 +#: aleksis/core/models.py:190 aleksis/core/models.py:1382 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:195 +#: aleksis/core/models.py:196 msgid "Additional name(s)" msgstr "" -#: aleksis/core/models.py:199 aleksis/core/models.py:511 -#: aleksis/core/models.py:1439 +#: aleksis/core/models.py:200 aleksis/core/models.py:512 +#: aleksis/core/models.py:1468 #, fuzzy #| msgid "First name" msgid "Short name" msgstr "Prénom" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:203 msgid "Street" msgstr "" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:204 msgid "Street number" msgstr "" -#: aleksis/core/models.py:204 +#: aleksis/core/models.py:205 msgid "Postal code" msgstr "" -#: aleksis/core/models.py:205 +#: aleksis/core/models.py:206 msgid "Place" msgstr "" -#: aleksis/core/models.py:207 +#: aleksis/core/models.py:208 msgid "Home phone" msgstr "" -#: aleksis/core/models.py:208 +#: aleksis/core/models.py:209 msgid "Mobile phone" msgstr "" -#: aleksis/core/models.py:212 +#: aleksis/core/models.py:213 msgid "Date of birth" msgstr "Date d'anniversaire" -#: aleksis/core/models.py:213 +#: aleksis/core/models.py:214 #, fuzzy #| msgid "Date of birth" msgid "Place of birth" msgstr "Date d'anniversaire" -#: aleksis/core/models.py:214 +#: aleksis/core/models.py:215 msgid "Sex" msgstr "Sexe" -#: aleksis/core/models.py:221 aleksis/core/models.py:550 +#: aleksis/core/models.py:222 aleksis/core/models.py:551 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:226 aleksis/core/models.py:554 +#: aleksis/core/models.py:227 aleksis/core/models.py:555 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:229 aleksis/core/models.py:557 +#: aleksis/core/models.py:230 aleksis/core/models.py:558 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:234 +#: aleksis/core/models.py:235 msgid "Guardians / Parents" msgstr "" -#: aleksis/core/models.py:241 +#: aleksis/core/models.py:242 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:244 aleksis/core/models.py:724 -#: aleksis/core/models.py:748 aleksis/core/models.py:843 -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:245 aleksis/core/models.py:725 +#: aleksis/core/models.py:749 aleksis/core/models.py:844 +#: aleksis/core/models.py:1113 msgid "Description" msgstr "Description" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:465 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:466 +#: aleksis/core/models.py:467 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:468 +#: aleksis/core/models.py:469 msgid "Required" msgstr "" -#: aleksis/core/models.py:469 +#: aleksis/core/models.py:470 #, fuzzy #| msgid "Description" msgid "Help text / description" msgstr "Description" -#: aleksis/core/models.py:475 +#: aleksis/core/models.py:476 msgid "Addtitional field for groups" msgstr "" -#: aleksis/core/models.py:476 +#: aleksis/core/models.py:477 msgid "Addtitional fields for groups" msgstr "" -#: aleksis/core/models.py:496 +#: aleksis/core/models.py:497 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:497 +#: aleksis/core/models.py:498 #, fuzzy #| msgid "Contact details" msgid "Can view statistics about group." msgstr "Détails de contact" -#: aleksis/core/models.py:509 aleksis/core/models.py:1440 +#: aleksis/core/models.py:510 aleksis/core/models.py:1469 #, fuzzy #| msgid "Last name" msgid "Long name" msgstr "Nom de famille" -#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "Propriétaires" -#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:537 +#: aleksis/core/models.py:538 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:542 +#: aleksis/core/models.py:543 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 msgid "Additional fields" msgstr "" -#: aleksis/core/models.py:723 aleksis/core/models.py:747 -#: aleksis/core/models.py:842 aleksis/core/models.py:1270 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:843 aleksis/core/models.py:1299 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "" -#: aleksis/core/models.py:726 +#: aleksis/core/models.py:727 msgid "Application" msgstr "" -#: aleksis/core/models.py:732 +#: aleksis/core/models.py:733 msgid "Activity" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:734 msgid "Activities" msgstr "" -#: aleksis/core/models.py:739 +#: aleksis/core/models.py:740 msgid "Sender" msgstr "" -#: aleksis/core/models.py:744 +#: aleksis/core/models.py:745 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +#: aleksis/core/models.py:750 aleksis/core/models.py:1079 msgid "Link" msgstr "" -#: aleksis/core/models.py:752 aleksis/core/models.py:1079 -#: aleksis/core/models.py:1400 +#: aleksis/core/models.py:753 aleksis/core/models.py:1080 +#: aleksis/core/models.py:1429 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "" -#: aleksis/core/models.py:755 +#: aleksis/core/models.py:756 msgid "Send notification at" msgstr "" -#: aleksis/core/models.py:757 +#: aleksis/core/models.py:758 msgid "Read" msgstr "" -#: aleksis/core/models.py:758 +#: aleksis/core/models.py:759 msgid "Sent" msgstr "" -#: aleksis/core/models.py:775 +#: aleksis/core/models.py:776 msgid "Notification" msgstr "" -#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +#: aleksis/core/models.py:777 aleksis/core/preferences.py:29 msgid "Notifications" msgstr "" -#: aleksis/core/models.py:844 +#: aleksis/core/models.py:845 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:847 +#: aleksis/core/models.py:848 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:850 +#: aleksis/core/models.py:851 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:875 +#: aleksis/core/models.py:876 msgid "Announcement" msgstr "" -#: aleksis/core/models.py:876 +#: aleksis/core/models.py:877 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 msgid "Announcements" msgstr "" -#: aleksis/core/models.py:913 +#: aleksis/core/models.py:914 msgid "Announcement recipient" msgstr "" -#: aleksis/core/models.py:914 +#: aleksis/core/models.py:915 msgid "Announcement recipients" msgstr "" -#: aleksis/core/models.py:934 +#: aleksis/core/models.py:935 msgid "Widget Title" msgstr "" -#: aleksis/core/models.py:935 +#: aleksis/core/models.py:936 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:936 +#: aleksis/core/models.py:937 msgid "Widget is broken" msgstr "" -#: aleksis/core/models.py:939 +#: aleksis/core/models.py:940 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:940 +#: aleksis/core/models.py:941 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:945 +#: aleksis/core/models.py:946 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:946 +#: aleksis/core/models.py:947 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:952 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:952 +#: aleksis/core/models.py:953 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:958 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:959 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:989 +#: aleksis/core/models.py:990 msgid "Can edit default dashboard" msgstr "" -#: aleksis/core/models.py:990 +#: aleksis/core/models.py:991 msgid "Dashboard Widget" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:992 msgid "Dashboard Widgets" msgstr "" -#: aleksis/core/models.py:997 +#: aleksis/core/models.py:998 msgid "URL" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:999 msgid "Icon URL" msgstr "" -#: aleksis/core/models.py:1004 +#: aleksis/core/models.py:1005 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:1005 +#: aleksis/core/models.py:1006 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1012 msgid "Content" msgstr "" -#: aleksis/core/models.py:1017 +#: aleksis/core/models.py:1018 msgid "Static content widget" msgstr "" -#: aleksis/core/models.py:1018 +#: aleksis/core/models.py:1019 msgid "Static content widgets" msgstr "" -#: aleksis/core/models.py:1023 +#: aleksis/core/models.py:1024 msgid "Dashboard widget" msgstr "" -#: aleksis/core/models.py:1028 +#: aleksis/core/models.py:1029 msgid "Order" msgstr "" -#: aleksis/core/models.py:1029 +#: aleksis/core/models.py:1030 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:1044 +#: aleksis/core/models.py:1045 msgid "Dashboard widget order" msgstr "" -#: aleksis/core/models.py:1045 +#: aleksis/core/models.py:1046 msgid "Dashboard widget orders" msgstr "" -#: aleksis/core/models.py:1051 +#: aleksis/core/models.py:1052 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1064 +#: aleksis/core/models.py:1065 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1065 +#: aleksis/core/models.py:1066 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1076 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1085 +#: aleksis/core/models.py:1086 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1086 +#: aleksis/core/models.py:1087 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1111 +#: aleksis/core/models.py:1112 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50 +#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50 #, fuzzy #| msgid "Group" msgid "Group type" msgstr "Groupe" -#: aleksis/core/models.py:1119 +#: aleksis/core/models.py:1120 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 #, fuzzy @@ -804,211 +808,211 @@ msgstr "Groupe" msgid "Group types" msgstr "Groupe" -#: aleksis/core/models.py:1132 +#: aleksis/core/models.py:1133 #, fuzzy #| msgid "Contact details" msgid "Can view system status" msgstr "Détails de contact" -#: aleksis/core/models.py:1133 +#: aleksis/core/models.py:1134 msgid "Can manage data" msgstr "" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1135 #, fuzzy #| msgid "Contact details" msgid "Can impersonate" msgstr "Détails de contact" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1136 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1136 +#: aleksis/core/models.py:1137 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1138 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1139 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1139 +#: aleksis/core/models.py:1140 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1140 +#: aleksis/core/models.py:1141 #, fuzzy #| msgid "Contact details" msgid "Can invite persons" msgstr "Détails de contact" -#: aleksis/core/models.py:1176 +#: aleksis/core/models.py:1177 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1185 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1186 msgid "Notification sent" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1199 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1199 +#: aleksis/core/models.py:1200 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1202 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1202 +#: aleksis/core/models.py:1203 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1209 +#: aleksis/core/models.py:1210 #, fuzzy #| msgid "Contact details" msgid "E-Mail address" msgstr "Détails de contact" -#: aleksis/core/models.py:1241 +#: aleksis/core/models.py:1270 #, fuzzy #| msgid "Owners" msgid "Owner" msgstr "Propriétaires" -#: aleksis/core/models.py:1245 +#: aleksis/core/models.py:1274 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1248 +#: aleksis/core/models.py:1277 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1251 +#: aleksis/core/models.py:1280 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1258 +#: aleksis/core/models.py:1287 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1259 +#: aleksis/core/models.py:1288 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1264 +#: aleksis/core/models.py:1293 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1267 +#: aleksis/core/models.py:1296 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1271 +#: aleksis/core/models.py:1300 msgid "Back URL" msgstr "" -#: aleksis/core/models.py:1272 +#: aleksis/core/models.py:1301 msgid "Progress title" msgstr "" -#: aleksis/core/models.py:1273 +#: aleksis/core/models.py:1302 msgid "Error message" msgstr "" -#: aleksis/core/models.py:1274 +#: aleksis/core/models.py:1303 msgid "Success message" msgstr "" -#: aleksis/core/models.py:1275 +#: aleksis/core/models.py:1304 msgid "Redirect on success URL" msgstr "" -#: aleksis/core/models.py:1277 +#: aleksis/core/models.py:1306 #, fuzzy #| msgid "Contact details" msgid "Additional button title" msgstr "Détails de contact" -#: aleksis/core/models.py:1279 +#: aleksis/core/models.py:1308 #, fuzzy #| msgid "Contact details" msgid "Additional button URL" msgstr "Détails de contact" -#: aleksis/core/models.py:1281 +#: aleksis/core/models.py:1310 #, fuzzy #| msgid "Contact details" msgid "Additional button icon" msgstr "Détails de contact" -#: aleksis/core/models.py:1283 +#: aleksis/core/models.py:1312 msgid "Result fetched" msgstr "" -#: aleksis/core/models.py:1308 +#: aleksis/core/models.py:1337 msgid "Background task completed successfully" msgstr "" -#: aleksis/core/models.py:1309 +#: aleksis/core/models.py:1338 msgid "The background task '{}' has been completed successfully." msgstr "" -#: aleksis/core/models.py:1315 +#: aleksis/core/models.py:1344 msgid "Background task failed" msgstr "" -#: aleksis/core/models.py:1316 +#: aleksis/core/models.py:1345 msgid "The background task '{}' has failed." msgstr "" -#: aleksis/core/models.py:1325 +#: aleksis/core/models.py:1354 msgid "Background task" msgstr "" -#: aleksis/core/models.py:1339 +#: aleksis/core/models.py:1368 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1340 +#: aleksis/core/models.py:1369 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1356 +#: aleksis/core/models.py:1385 #, fuzzy #| msgid "Contact details" msgid "Additional attributes" msgstr "Détails de contact" -#: aleksis/core/models.py:1394 +#: aleksis/core/models.py:1423 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1404 +#: aleksis/core/models.py:1433 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" -#: aleksis/core/models.py:1449 +#: aleksis/core/models.py:1478 #, fuzzy #| msgid "Contact details" msgid "Can view room timetable" msgstr "Détails de contact" -#: aleksis/core/models.py:1451 +#: aleksis/core/models.py:1480 msgid "Room" msgstr "" -#: aleksis/core/models.py:1452 +#: aleksis/core/models.py:1481 msgid "Rooms" msgstr "" @@ -1230,15 +1234,15 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:549 +#: aleksis/core/settings.py:551 msgid "English" msgstr "" -#: aleksis/core/settings.py:550 +#: aleksis/core/settings.py:552 msgid "German" msgstr "" -#: aleksis/core/settings.py:551 +#: aleksis/core/settings.py:553 msgid "Ukrainian" msgstr "" @@ -1250,14 +1254,14 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:27 aleksis/core/tables.py:148 -#: aleksis/core/tables.py:192 +#: aleksis/core/tables.py:185 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" #: aleksis/core/tables.py:115 aleksis/core/tables.py:116 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146 -#: aleksis/core/tables.py:190 +#: aleksis/core/tables.py:183 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 @@ -1306,7 +1310,7 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/500.html:21 +#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22 msgid "Retry" msgstr "" @@ -1624,64 +1628,64 @@ msgstr "Détails de contact" msgid "Edit default dashboard" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 +#: aleksis/core/templates/core/data_check/list.html:11 msgid "Data checks" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:15 +#: aleksis/core/templates/core/data_check/list.html:16 msgid "Check data again" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:22 +#: aleksis/core/templates/core/data_check/list.html:23 msgid "The system detected some problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:23 +#: aleksis/core/templates/core/data_check/list.html:24 msgid "" "Please go through all data and check whether some extra action is\n" " needed." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:31 +#: aleksis/core/templates/core/data_check/list.html:32 msgid "Everything is fine." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:32 +#: aleksis/core/templates/core/data_check/list.html:33 msgid "The system hasn't detected any problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:40 +#: aleksis/core/templates/core/data_check/list.html:41 msgid "Detected problems" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:45 +#: aleksis/core/templates/core/data_check/list.html:46 msgid "Affected object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:46 +#: aleksis/core/templates/core/data_check/list.html:47 msgid "Detected problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:47 +#: aleksis/core/templates/core/data_check/list.html:48 #, fuzzy #| msgid "Contact details" msgid "Show details" msgstr "Détails de contact" -#: aleksis/core/templates/core/data_check/list.html:48 +#: aleksis/core/templates/core/data_check/list.html:49 msgid "Options to solve the problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:63 +#: aleksis/core/templates/core/data_check/list.html:65 msgid "Show object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:86 +#: aleksis/core/templates/core/data_check/list.html:89 msgid "Registered checks" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:90 +#: aleksis/core/templates/core/data_check/list.html:93 msgid "" "\n" " The system will check for the following problems:\n" @@ -1907,83 +1911,83 @@ msgstr "" msgid "System checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:22 +#: aleksis/core/templates/core/pages/system_status.html:26 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:24 +#: aleksis/core/templates/core/pages/system_status.html:28 msgid "" "\n" -" Only admin and visitors from internal IPs can access the site.\n" -" " +" Only admin and visitors from internal IPs can access the site.\n" +" " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:36 +#: aleksis/core/templates/core/pages/system_status.html:39 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:37 +#: aleksis/core/templates/core/pages/system_status.html:40 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:51 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:49 +#: aleksis/core/templates/core/pages/system_status.html:53 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:60 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:58 +#: aleksis/core/templates/core/pages/system_status.html:62 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:71 +#: aleksis/core/templates/core/pages/system_status.html:75 msgid "System health checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:81 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:78 -#: aleksis/core/templates/core/pages/system_status.html:119 +#: aleksis/core/templates/core/pages/system_status.html:82 +#: aleksis/core/templates/core/pages/system_status.html:123 msgid "Status" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:79 +#: aleksis/core/templates/core/pages/system_status.html:83 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:100 +#: aleksis/core/templates/core/pages/system_status.html:104 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:111 +#: aleksis/core/templates/core/pages/system_status.html:115 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/core/pages/system_status.html:120 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:117 +#: aleksis/core/templates/core/pages/system_status.html:121 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:118 +#: aleksis/core/templates/core/pages/system_status.html:122 #, fuzzy #| msgid "Date" msgid "Date done" @@ -2215,11 +2219,11 @@ msgstr "Détails de contact" msgid "Generate invitation code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:29 +#: aleksis/core/templates/invitations/forms/_invite.html:30 msgid "Generate code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:33 +#: aleksis/core/templates/invitations/forms/_invite.html:34 msgid "Invitations" msgstr "" @@ -2237,7 +2241,6 @@ msgstr "Détails de contact" #: aleksis/core/templates/oauth2_provider/application/create.html:14 #: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 #: aleksis/core/templates/two_factor/_wizard_actions.html:6 msgid "Cancel" msgstr "" @@ -2316,45 +2319,19 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 -msgid "Revoke access" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Are you sure to revoke the access for this application?" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 -msgid "Revoke" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 -#, fuzzy -#| msgid "Contact details" -msgid "No authorized applications." -msgstr "Détails de contact" - #: aleksis/core/templates/offline.html:5 msgid "Network error" msgstr "" #: aleksis/core/templates/offline.html:10 -msgid "Page not available offline." +msgid "No connection to server." msgstr "" #: aleksis/core/templates/offline.html:14 msgid "" "\n" -" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" -" administrators:\n" +" This page is not available without a connection to the server. Please check your internet connection and try again.\n" +" If you are connected and the error persists, please contact the system administrators:\n" " " msgstr "" @@ -2472,6 +2449,8 @@ msgstr "" #: aleksis/core/templates/templated_email/base.email:5 #: aleksis/core/templates/templated_email/base.email:16 +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 msgid "Hello" msgstr "" @@ -2545,6 +2524,23 @@ msgstr "Description" msgid "Count of objects with new problems" msgstr "" +#: aleksis/core/templates/templated_email/invitation.email:4 +#, python-format +msgid "Invitation to register on %(site)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 +#, python-format +msgid "Hello %(person)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:9 +#: aleksis/core/templates/templated_email/invitation.email:18 +#, python-format +msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:" +msgstr "" + #: aleksis/core/templates/templated_email/notification.email:4 msgid "New notification for" msgstr "" @@ -2925,154 +2921,167 @@ msgstr "" msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:280 +#: aleksis/core/views.py:285 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:292 +#: aleksis/core/views.py:297 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:396 +#: aleksis/core/views.py:401 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:415 aleksis/core/views.py:425 +#: aleksis/core/views.py:420 aleksis/core/views.py:430 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:475 +#: aleksis/core/views.py:480 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:558 +#: aleksis/core/views.py:528 +msgid "Maintenance mode was turned on successfully." +msgstr "" + +#: aleksis/core/views.py:530 +msgid "Maintenance mode was turned off successfully." +msgstr "" + +#: aleksis/core/views.py:588 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:574 +#: aleksis/core/views.py:604 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:643 +#: aleksis/core/views.py:673 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:662 +#: aleksis/core/views.py:692 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:686 +#: aleksis/core/views.py:716 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:700 +#: aleksis/core/views.py:730 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:732 +#: aleksis/core/views.py:762 msgid "The additional field has been saved." msgstr "" -#: aleksis/core/views.py:767 +#: aleksis/core/views.py:797 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:792 +#: aleksis/core/views.py:822 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:823 +#: aleksis/core/views.py:853 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:858 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:859 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:860 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:861 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:878 +#: aleksis/core/views.py:908 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:918 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:921 +#: aleksis/core/views.py:951 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:951 +#: aleksis/core/views.py:981 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:961 +#: aleksis/core/views.py:991 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1033 +#: aleksis/core/views.py:1063 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1035 +#: aleksis/core/views.py:1065 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1106 +#: aleksis/core/views.py:1136 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1203 +#: aleksis/core/views.py:1233 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1213 +#: aleksis/core/views.py:1243 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1223 +#: aleksis/core/views.py:1253 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1233 +#: aleksis/core/views.py:1263 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1243 +#: aleksis/core/views.py:1273 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1352 +#: aleksis/core/views.py:1382 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1359 +#: aleksis/core/views.py:1389 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1435 +#: aleksis/core/views.py:1465 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1446 +#: aleksis/core/views.py:1476 #, fuzzy #| msgid "This username is already in use." msgid "Person was already invited." msgstr "Cet nom est deja en utilisation." +#, fuzzy +#~| msgid "Contact details" +#~ msgid "No authorized applications." +#~ msgstr "Détails de contact" + #, fuzzy #~| msgid "Contact details" #~ msgid "Invite person" diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po index eac7e9fda18c24a985b1eabe0c42196bad449502..1b6172ee3bd421884b89c300b56ff44c0edd5683 100644 --- a/aleksis/core/locale/la/LC_MESSAGES/django.po +++ b/aleksis/core/locale/la/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-27 13:23+0100\n" +"POT-Creation-Date: 2023-05-09 18:40+0200\n" "PO-Revision-Date: 2020-12-19 12:57+0000\n" "Last-Translator: Julian <leuckerj@gmail.com>\n" "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis/la/>\n" @@ -18,34 +18,38 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.3.2\n" -#: aleksis/core/apps.py:155 +#: aleksis/core/apps.py:151 +msgid "You have been logged out successfully." +msgstr "" + +#: aleksis/core/apps.py:161 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:156 +#: aleksis/core/apps.py:162 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:157 +#: aleksis/core/apps.py:163 #, fuzzy #| msgid "E-mail address" msgid "Full home postal address" msgstr "Inscriptio electronica" -#: aleksis/core/apps.py:158 +#: aleksis/core/apps.py:164 #, fuzzy #| msgid "E-mail address" msgid "Email address" msgstr "Inscriptio electronica" -#: aleksis/core/apps.py:159 +#: aleksis/core/apps.py:165 #, fuzzy #| msgid "Mobile phone" msgid "Home and mobile phone" msgstr "Numerus telephoni mobilis" -#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 -#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:166 aleksis/core/forms.py:221 +#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 msgid "Groups" msgstr "Greges" @@ -108,188 +112,188 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +#: aleksis/core/filters.py:113 aleksis/core/models.py:721 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +#: aleksis/core/filters.py:135 aleksis/core/models.py:494 msgid "Group" msgstr "Grex" -#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +#: aleksis/core/forms.py:51 aleksis/core/forms.py:582 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +#: aleksis/core/forms.py:56 aleksis/core/tables.py:47 #, fuzzy #| msgid "E-mail address" msgid "Address" msgstr "Inscriptio electronica" -#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +#: aleksis/core/forms.py:57 aleksis/core/forms.py:591 msgid "Contact data" msgstr "" -#: aleksis/core/forms.py:58 +#: aleksis/core/forms.py:59 msgid "Advanced personal data" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "New user" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 #, fuzzy #| msgid "Persons and accounts" msgid "Create a new account" msgstr "Personae et computi" -#: aleksis/core/forms.py:132 +#: aleksis/core/forms.py:133 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:136 +#: aleksis/core/forms.py:137 msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +#: aleksis/core/forms.py:154 aleksis/core/models.py:142 msgid "School term" msgstr "Anus scolae" -#: aleksis/core/forms.py:154 +#: aleksis/core/forms.py:155 #, fuzzy #| msgid "Data management" msgid "Common data" msgstr "Adminstratio datarum" -#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:208 +#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "personae" -#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +#: aleksis/core/forms.py:157 aleksis/core/forms.py:593 #, fuzzy #| msgid "Additional name(s)" msgid "Additional data" msgstr "addita nomines" -#: aleksis/core/forms.py:157 aleksis/core/models.py:217 -#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +#: aleksis/core/forms.py:158 aleksis/core/models.py:218 +#: aleksis/core/models.py:547 aleksis/core/tables.py:46 msgid "Photo" msgstr "Photographia" -#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:84 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:85 msgid "Date" msgstr "dies" -#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:92 +#: aleksis/core/forms.py:201 aleksis/core/forms.py:204 +#: aleksis/core/models.py:93 msgid "Time" msgstr "tempus" -#: aleksis/core/forms.py:233 +#: aleksis/core/forms.py:234 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:236 +#: aleksis/core/forms.py:237 msgid "Who should see the announcement?" msgstr "Quis nuntium videatne?" -#: aleksis/core/forms.py:237 +#: aleksis/core/forms.py:238 msgid "Write your announcement:" msgstr "Scribe nuntium:" -#: aleksis/core/forms.py:276 +#: aleksis/core/forms.py:277 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:280 +#: aleksis/core/forms.py:281 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:289 +#: aleksis/core/forms.py:290 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:398 +#: aleksis/core/forms.py:399 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:399 +#: aleksis/core/forms.py:400 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "First name" msgstr "Primus nomen" -#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +#: aleksis/core/forms.py:420 aleksis/core/models.py:194 msgid "Last name" msgstr "Secondus nomen" -#: aleksis/core/forms.py:428 +#: aleksis/core/forms.py:429 #, fuzzy #| msgid "E-mail address" msgid "A person is using this e-mail address" msgstr "Inscriptio electronica" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:457 #, fuzzy #| msgid "Who should see the announcement?" msgid "Who should get the permission?" msgstr "Quis nuntium videatne?" -#: aleksis/core/forms.py:457 +#: aleksis/core/forms.py:458 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:483 +#: aleksis/core/forms.py:484 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:486 +#: aleksis/core/forms.py:487 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:494 +#: aleksis/core/forms.py:495 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:499 +#: aleksis/core/forms.py:500 msgid "You must grant the permission to all objects or to specific objects." msgstr "" -#: aleksis/core/forms.py:586 +#: aleksis/core/forms.py:587 #, fuzzy #| msgid "E-mail address" msgid "Address data" msgstr "Inscriptio electronica" -#: aleksis/core/forms.py:598 +#: aleksis/core/forms.py:599 #, fuzzy #| msgid "Data management" msgid "Account data" msgstr "Adminstratio datarum" -#: aleksis/core/forms.py:605 +#: aleksis/core/forms.py:606 msgid "Password" msgstr "" -#: aleksis/core/forms.py:608 +#: aleksis/core/forms.py:609 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:761 +#: aleksis/core/forms.py:762 msgid "The selected action does not exist." msgstr "" -#: aleksis/core/forms.py:772 +#: aleksis/core/forms.py:773 msgid "You do not have permission to run {} on all selected objects." msgstr "" -#: aleksis/core/forms.py:828 +#: aleksis/core/forms.py:829 msgid "No valid selection." msgstr "" @@ -321,266 +325,266 @@ msgstr "" msgid "Linked school term" msgstr "Muta anum scolae" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:83 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:83 +#: aleksis/core/models.py:84 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:85 +#: aleksis/core/models.py:86 msgid "Date and time" msgstr "Dies et hora" -#: aleksis/core/models.py:86 +#: aleksis/core/models.py:87 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:87 aleksis/core/models.py:210 +#: aleksis/core/models.py:88 aleksis/core/models.py:211 msgid "E-mail address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:88 +#: aleksis/core/models.py:89 msgid "Integer" msgstr "" -#: aleksis/core/models.py:89 +#: aleksis/core/models.py:90 #, fuzzy #| msgid "E-mail address" msgid "IP address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:90 +#: aleksis/core/models.py:91 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:91 +#: aleksis/core/models.py:92 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:93 +#: aleksis/core/models.py:94 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +#: aleksis/core/models.py:106 aleksis/core/models.py:1078 msgid "Name" msgstr "Nomen" -#: aleksis/core/models.py:107 +#: aleksis/core/models.py:108 msgid "Start date" msgstr "" -#: aleksis/core/models.py:108 +#: aleksis/core/models.py:109 msgid "End date" msgstr "" -#: aleksis/core/models.py:127 +#: aleksis/core/models.py:128 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:134 +#: aleksis/core/models.py:135 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:142 +#: aleksis/core/models.py:143 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 msgid "School terms" msgstr "ani scolae" -#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +#: aleksis/core/models.py:164 aleksis/core/models.py:1027 msgid "Person" msgstr "Persona" -#: aleksis/core/models.py:166 +#: aleksis/core/models.py:167 #, fuzzy #| msgid "E-mail address" msgid "Can view address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:167 +#: aleksis/core/models.py:168 #, fuzzy #| msgid "E-mail address" msgid "Can view contact details" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:168 +#: aleksis/core/models.py:169 #, fuzzy #| msgid "E-mail address" msgid "Can view photo" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:169 +#: aleksis/core/models.py:170 #, fuzzy #| msgid "E-mail address" msgid "Can view avatar image" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:171 #, fuzzy #| msgid "Persons and accounts" msgid "Can view persons groups" msgstr "Personae et computi" -#: aleksis/core/models.py:171 +#: aleksis/core/models.py:172 #, fuzzy #| msgid "Stop impersonation" msgid "Can view personal details" msgstr "Simulandum aliquem finire" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "female" msgstr "femininum" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "male" msgstr "maskulinum" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "other" msgstr "" -#: aleksis/core/models.py:189 aleksis/core/models.py:1353 +#: aleksis/core/models.py:190 aleksis/core/models.py:1382 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:195 +#: aleksis/core/models.py:196 msgid "Additional name(s)" msgstr "addita nomines" -#: aleksis/core/models.py:199 aleksis/core/models.py:511 -#: aleksis/core/models.py:1439 +#: aleksis/core/models.py:200 aleksis/core/models.py:512 +#: aleksis/core/models.py:1468 msgid "Short name" msgstr "Breve nomen" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:203 msgid "Street" msgstr "Via" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:204 msgid "Street number" msgstr "Numerus domini" -#: aleksis/core/models.py:204 +#: aleksis/core/models.py:205 msgid "Postal code" msgstr "Numerus directorius" -#: aleksis/core/models.py:205 +#: aleksis/core/models.py:206 msgid "Place" msgstr "Urbs" -#: aleksis/core/models.py:207 +#: aleksis/core/models.py:208 msgid "Home phone" msgstr "Numerus telephoni domi" -#: aleksis/core/models.py:208 +#: aleksis/core/models.py:209 msgid "Mobile phone" msgstr "Numerus telephoni mobilis" -#: aleksis/core/models.py:212 +#: aleksis/core/models.py:213 msgid "Date of birth" msgstr "Dies natalis" -#: aleksis/core/models.py:213 +#: aleksis/core/models.py:214 #, fuzzy #| msgid "Date of birth" msgid "Place of birth" msgstr "Dies natalis" -#: aleksis/core/models.py:214 +#: aleksis/core/models.py:215 msgid "Sex" msgstr "Genus" -#: aleksis/core/models.py:221 aleksis/core/models.py:550 +#: aleksis/core/models.py:222 aleksis/core/models.py:551 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:226 aleksis/core/models.py:554 +#: aleksis/core/models.py:227 aleksis/core/models.py:555 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:229 aleksis/core/models.py:557 +#: aleksis/core/models.py:230 aleksis/core/models.py:558 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:234 +#: aleksis/core/models.py:235 msgid "Guardians / Parents" msgstr "Parentes" -#: aleksis/core/models.py:241 +#: aleksis/core/models.py:242 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:244 aleksis/core/models.py:724 -#: aleksis/core/models.py:748 aleksis/core/models.py:843 -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:245 aleksis/core/models.py:725 +#: aleksis/core/models.py:749 aleksis/core/models.py:844 +#: aleksis/core/models.py:1113 msgid "Description" msgstr "Descriptio" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:465 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:466 +#: aleksis/core/models.py:467 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:468 +#: aleksis/core/models.py:469 msgid "Required" msgstr "" -#: aleksis/core/models.py:469 +#: aleksis/core/models.py:470 #, fuzzy #| msgid "Site description" msgid "Help text / description" msgstr "Descriptio paginae" -#: aleksis/core/models.py:475 +#: aleksis/core/models.py:476 #, fuzzy #| msgid "Additional name(s)" msgid "Addtitional field for groups" msgstr "addita nomines" -#: aleksis/core/models.py:476 +#: aleksis/core/models.py:477 #, fuzzy #| msgid "Additional name(s)" msgid "Addtitional fields for groups" msgstr "addita nomines" -#: aleksis/core/models.py:496 +#: aleksis/core/models.py:497 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:497 +#: aleksis/core/models.py:498 #, fuzzy #| msgid "Persons and accounts" msgid "Can view statistics about group." msgstr "Personae et computi" -#: aleksis/core/models.py:509 aleksis/core/models.py:1440 +#: aleksis/core/models.py:510 aleksis/core/models.py:1469 #, fuzzy #| msgid "Last name" msgid "Long name" msgstr "Secondus nomen" -#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "" -#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:537 +#: aleksis/core/models.py:538 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:542 +#: aleksis/core/models.py:543 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 #, fuzzy @@ -588,259 +592,259 @@ msgstr "" msgid "Additional fields" msgstr "addita nomines" -#: aleksis/core/models.py:723 aleksis/core/models.py:747 -#: aleksis/core/models.py:842 aleksis/core/models.py:1270 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:843 aleksis/core/models.py:1299 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "Titulus" -#: aleksis/core/models.py:726 +#: aleksis/core/models.py:727 msgid "Application" msgstr "" -#: aleksis/core/models.py:732 +#: aleksis/core/models.py:733 msgid "Activity" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:734 msgid "Activities" msgstr "" -#: aleksis/core/models.py:739 +#: aleksis/core/models.py:740 msgid "Sender" msgstr "Mittens" -#: aleksis/core/models.py:744 +#: aleksis/core/models.py:745 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +#: aleksis/core/models.py:750 aleksis/core/models.py:1079 msgid "Link" msgstr "" -#: aleksis/core/models.py:752 aleksis/core/models.py:1079 -#: aleksis/core/models.py:1400 +#: aleksis/core/models.py:753 aleksis/core/models.py:1080 +#: aleksis/core/models.py:1429 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "Nota" -#: aleksis/core/models.py:755 +#: aleksis/core/models.py:756 #, fuzzy #| msgid "Notification" msgid "Send notification at" msgstr "Nuntius" -#: aleksis/core/models.py:757 +#: aleksis/core/models.py:758 msgid "Read" msgstr "" -#: aleksis/core/models.py:758 +#: aleksis/core/models.py:759 msgid "Sent" msgstr "" -#: aleksis/core/models.py:775 +#: aleksis/core/models.py:776 #, fuzzy #| msgid "Notifications" msgid "Notification" msgstr "Nuntii" -#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +#: aleksis/core/models.py:777 aleksis/core/preferences.py:29 msgid "Notifications" msgstr "Nuntii" -#: aleksis/core/models.py:844 +#: aleksis/core/models.py:845 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:847 +#: aleksis/core/models.py:848 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:850 +#: aleksis/core/models.py:851 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:875 +#: aleksis/core/models.py:876 #, fuzzy #| msgid "Announcements" msgid "Announcement" msgstr "Nuntii" -#: aleksis/core/models.py:876 +#: aleksis/core/models.py:877 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 msgid "Announcements" msgstr "Nuntii" -#: aleksis/core/models.py:913 +#: aleksis/core/models.py:914 #, fuzzy #| msgid "Announcements" msgid "Announcement recipient" msgstr "Nuntii" -#: aleksis/core/models.py:914 +#: aleksis/core/models.py:915 #, fuzzy #| msgid "Announcements" msgid "Announcement recipients" msgstr "Nuntii" -#: aleksis/core/models.py:934 +#: aleksis/core/models.py:935 #, fuzzy #| msgid "Site title" msgid "Widget Title" msgstr "Titulus paginae" -#: aleksis/core/models.py:935 +#: aleksis/core/models.py:936 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:936 +#: aleksis/core/models.py:937 #, fuzzy #| msgid "Site title" msgid "Widget is broken" msgstr "Titulus paginae" -#: aleksis/core/models.py:939 +#: aleksis/core/models.py:940 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:940 +#: aleksis/core/models.py:941 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:945 +#: aleksis/core/models.py:946 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:946 +#: aleksis/core/models.py:947 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:952 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:952 +#: aleksis/core/models.py:953 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:958 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:959 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:989 +#: aleksis/core/models.py:990 #, fuzzy #| msgid "Dashboard" msgid "Can edit default dashboard" msgstr "Forum" -#: aleksis/core/models.py:990 +#: aleksis/core/models.py:991 #, fuzzy #| msgid "Dashboard" msgid "Dashboard Widget" msgstr "Forum" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:992 #, fuzzy #| msgid "Dashboard" msgid "Dashboard Widgets" msgstr "Forum" -#: aleksis/core/models.py:997 +#: aleksis/core/models.py:998 msgid "URL" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:999 #, fuzzy #| msgid "Icon" msgid "Icon URL" msgstr "Nota" -#: aleksis/core/models.py:1004 +#: aleksis/core/models.py:1005 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:1005 +#: aleksis/core/models.py:1006 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1012 msgid "Content" msgstr "" -#: aleksis/core/models.py:1017 +#: aleksis/core/models.py:1018 msgid "Static content widget" msgstr "" -#: aleksis/core/models.py:1018 +#: aleksis/core/models.py:1019 msgid "Static content widgets" msgstr "" -#: aleksis/core/models.py:1023 +#: aleksis/core/models.py:1024 #, fuzzy #| msgid "Dashboard" msgid "Dashboard widget" msgstr "Forum" -#: aleksis/core/models.py:1028 +#: aleksis/core/models.py:1029 msgid "Order" msgstr "" -#: aleksis/core/models.py:1029 +#: aleksis/core/models.py:1030 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:1044 +#: aleksis/core/models.py:1045 #, fuzzy #| msgid "Dashboard" msgid "Dashboard widget order" msgstr "Forum" -#: aleksis/core/models.py:1045 +#: aleksis/core/models.py:1046 #, fuzzy #| msgid "Dashboard" msgid "Dashboard widget orders" msgstr "Forum" -#: aleksis/core/models.py:1051 +#: aleksis/core/models.py:1052 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1064 +#: aleksis/core/models.py:1065 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1065 +#: aleksis/core/models.py:1066 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1076 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1085 +#: aleksis/core/models.py:1086 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1086 +#: aleksis/core/models.py:1087 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1111 +#: aleksis/core/models.py:1112 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50 +#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50 #, fuzzy #| msgid "Group" msgid "Group type" msgstr "Grex" -#: aleksis/core/models.py:1119 +#: aleksis/core/models.py:1120 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 #, fuzzy @@ -848,215 +852,215 @@ msgstr "Grex" msgid "Group types" msgstr "Greges" -#: aleksis/core/models.py:1132 +#: aleksis/core/models.py:1133 #, fuzzy #| msgid "System status" msgid "Can view system status" msgstr "Status systemae" -#: aleksis/core/models.py:1133 +#: aleksis/core/models.py:1134 #, fuzzy #| msgid "Data management" msgid "Can manage data" msgstr "Adminstratio datarum" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1135 #, fuzzy #| msgid "Stop impersonation" msgid "Can impersonate" msgstr "Simulandum aliquem finire" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1136 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1136 +#: aleksis/core/models.py:1137 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1138 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1139 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1139 +#: aleksis/core/models.py:1140 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1140 +#: aleksis/core/models.py:1141 #, fuzzy #| msgid "Stop impersonation" msgid "Can invite persons" msgstr "Simulandum aliquem finire" -#: aleksis/core/models.py:1176 +#: aleksis/core/models.py:1177 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1185 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1186 #, fuzzy #| msgid "Notifications" msgid "Notification sent" msgstr "Nuntii" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1199 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1199 +#: aleksis/core/models.py:1200 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1202 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1202 +#: aleksis/core/models.py:1203 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1209 +#: aleksis/core/models.py:1210 #, fuzzy #| msgid "E-mail address" msgid "E-Mail address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:1241 +#: aleksis/core/models.py:1270 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1245 +#: aleksis/core/models.py:1274 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1248 +#: aleksis/core/models.py:1277 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1251 +#: aleksis/core/models.py:1280 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1258 +#: aleksis/core/models.py:1287 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1259 +#: aleksis/core/models.py:1288 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1264 +#: aleksis/core/models.py:1293 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1267 +#: aleksis/core/models.py:1296 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1271 +#: aleksis/core/models.py:1300 #, fuzzy #| msgid "Icon" msgid "Back URL" msgstr "Nota" -#: aleksis/core/models.py:1272 +#: aleksis/core/models.py:1301 msgid "Progress title" msgstr "" -#: aleksis/core/models.py:1273 +#: aleksis/core/models.py:1302 msgid "Error message" msgstr "" -#: aleksis/core/models.py:1274 +#: aleksis/core/models.py:1303 msgid "Success message" msgstr "" -#: aleksis/core/models.py:1275 +#: aleksis/core/models.py:1304 msgid "Redirect on success URL" msgstr "" -#: aleksis/core/models.py:1277 +#: aleksis/core/models.py:1306 #, fuzzy #| msgid "Additional name(s)" msgid "Additional button title" msgstr "addita nomines" -#: aleksis/core/models.py:1279 +#: aleksis/core/models.py:1308 #, fuzzy #| msgid "Additional name(s)" msgid "Additional button URL" msgstr "addita nomines" -#: aleksis/core/models.py:1281 +#: aleksis/core/models.py:1310 #, fuzzy #| msgid "Additional name(s)" msgid "Additional button icon" msgstr "addita nomines" -#: aleksis/core/models.py:1283 +#: aleksis/core/models.py:1312 msgid "Result fetched" msgstr "" -#: aleksis/core/models.py:1308 +#: aleksis/core/models.py:1337 msgid "Background task completed successfully" msgstr "" -#: aleksis/core/models.py:1309 +#: aleksis/core/models.py:1338 msgid "The background task '{}' has been completed successfully." msgstr "" -#: aleksis/core/models.py:1315 +#: aleksis/core/models.py:1344 msgid "Background task failed" msgstr "" -#: aleksis/core/models.py:1316 +#: aleksis/core/models.py:1345 msgid "The background task '{}' has failed." msgstr "" -#: aleksis/core/models.py:1325 +#: aleksis/core/models.py:1354 msgid "Background task" msgstr "" -#: aleksis/core/models.py:1339 +#: aleksis/core/models.py:1368 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1340 +#: aleksis/core/models.py:1369 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1356 +#: aleksis/core/models.py:1385 #, fuzzy #| msgid "Additional name(s)" msgid "Additional attributes" msgstr "addita nomines" -#: aleksis/core/models.py:1394 +#: aleksis/core/models.py:1423 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1404 +#: aleksis/core/models.py:1433 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" -#: aleksis/core/models.py:1449 +#: aleksis/core/models.py:1478 #, fuzzy #| msgid "E-mail address" msgid "Can view room timetable" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:1451 +#: aleksis/core/models.py:1480 msgid "Room" msgstr "" -#: aleksis/core/models.py:1452 +#: aleksis/core/models.py:1481 msgid "Rooms" msgstr "" @@ -1286,15 +1290,15 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:549 +#: aleksis/core/settings.py:551 msgid "English" msgstr "Britannicus" -#: aleksis/core/settings.py:550 +#: aleksis/core/settings.py:552 msgid "German" msgstr "Germanus" -#: aleksis/core/settings.py:551 +#: aleksis/core/settings.py:553 msgid "Ukrainian" msgstr "" @@ -1306,7 +1310,7 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:27 aleksis/core/tables.py:148 -#: aleksis/core/tables.py:192 +#: aleksis/core/tables.py:185 #: aleksis/core/templates/core/announcement/list.html:22 #, fuzzy #| msgid "Notifications" @@ -1315,7 +1319,7 @@ msgstr "Nuntii" #: aleksis/core/tables.py:115 aleksis/core/tables.py:116 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146 -#: aleksis/core/tables.py:190 +#: aleksis/core/tables.py:183 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 @@ -1364,7 +1368,7 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/500.html:21 +#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22 msgid "Retry" msgstr "" @@ -1704,66 +1708,66 @@ msgstr "Simulandum aliquem finire" msgid "Edit default dashboard" msgstr "Forum" -#: aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 +#: aleksis/core/templates/core/data_check/list.html:11 #, fuzzy #| msgid "System status" msgid "Data checks" msgstr "Status systemae" -#: aleksis/core/templates/core/data_check/list.html:15 +#: aleksis/core/templates/core/data_check/list.html:16 msgid "Check data again" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:22 +#: aleksis/core/templates/core/data_check/list.html:23 msgid "The system detected some problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:23 +#: aleksis/core/templates/core/data_check/list.html:24 msgid "" "Please go through all data and check whether some extra action is\n" " needed." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:31 +#: aleksis/core/templates/core/data_check/list.html:32 msgid "Everything is fine." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:32 +#: aleksis/core/templates/core/data_check/list.html:33 msgid "The system hasn't detected any problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:40 +#: aleksis/core/templates/core/data_check/list.html:41 msgid "Detected problems" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:45 +#: aleksis/core/templates/core/data_check/list.html:46 msgid "Affected object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:46 +#: aleksis/core/templates/core/data_check/list.html:47 msgid "Detected problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:47 +#: aleksis/core/templates/core/data_check/list.html:48 msgid "Show details" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:48 +#: aleksis/core/templates/core/data_check/list.html:49 msgid "Options to solve the problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:63 +#: aleksis/core/templates/core/data_check/list.html:65 msgid "Show object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:86 +#: aleksis/core/templates/core/data_check/list.html:89 #, fuzzy #| msgid "System status" msgid "Registered checks" msgstr "Status systemae" -#: aleksis/core/templates/core/data_check/list.html:90 +#: aleksis/core/templates/core/data_check/list.html:93 msgid "" "\n" " The system will check for the following problems:\n" @@ -1999,87 +2003,87 @@ msgstr "Status systemae" msgid "System checks" msgstr "Status systemae" -#: aleksis/core/templates/core/pages/system_status.html:22 +#: aleksis/core/templates/core/pages/system_status.html:26 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:24 +#: aleksis/core/templates/core/pages/system_status.html:28 msgid "" "\n" -" Only admin and visitors from internal IPs can access the site.\n" -" " +" Only admin and visitors from internal IPs can access the site.\n" +" " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:36 +#: aleksis/core/templates/core/pages/system_status.html:39 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:37 +#: aleksis/core/templates/core/pages/system_status.html:40 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:51 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:49 +#: aleksis/core/templates/core/pages/system_status.html:53 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:60 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:58 +#: aleksis/core/templates/core/pages/system_status.html:62 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:71 +#: aleksis/core/templates/core/pages/system_status.html:75 #, fuzzy #| msgid "System status" msgid "System health checks" msgstr "Status systemae" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:81 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:78 -#: aleksis/core/templates/core/pages/system_status.html:119 +#: aleksis/core/templates/core/pages/system_status.html:82 +#: aleksis/core/templates/core/pages/system_status.html:123 #, fuzzy #| msgid "System status" msgid "Status" msgstr "Status systemae" -#: aleksis/core/templates/core/pages/system_status.html:79 +#: aleksis/core/templates/core/pages/system_status.html:83 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:100 +#: aleksis/core/templates/core/pages/system_status.html:104 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:111 +#: aleksis/core/templates/core/pages/system_status.html:115 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/core/pages/system_status.html:120 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:117 +#: aleksis/core/templates/core/pages/system_status.html:121 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:118 +#: aleksis/core/templates/core/pages/system_status.html:122 #, fuzzy #| msgid "Date" msgid "Date done" @@ -2317,11 +2321,11 @@ msgstr "Inscriptio electronica" msgid "Generate invitation code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:29 +#: aleksis/core/templates/invitations/forms/_invite.html:30 msgid "Generate code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:33 +#: aleksis/core/templates/invitations/forms/_invite.html:34 msgid "Invitations" msgstr "" @@ -2339,7 +2343,6 @@ msgstr "Nuntii" #: aleksis/core/templates/oauth2_provider/application/create.html:14 #: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 #: aleksis/core/templates/two_factor/_wizard_actions.html:6 msgid "Cancel" msgstr "" @@ -2424,47 +2427,19 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 -msgid "Revoke access" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Are you sure to revoke the access for this application?" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 -msgid "Revoke" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -#, fuzzy -#| msgid "Notifications" -msgid "Authorized applications" -msgstr "Nuntii" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 -#, fuzzy -#| msgid "Notifications" -msgid "No authorized applications." -msgstr "Nuntii" - #: aleksis/core/templates/offline.html:5 msgid "Network error" msgstr "" #: aleksis/core/templates/offline.html:10 -msgid "Page not available offline." +msgid "No connection to server." msgstr "" #: aleksis/core/templates/offline.html:14 msgid "" "\n" -" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" -" administrators:\n" +" This page is not available without a connection to the server. Please check your internet connection and try again.\n" +" If you are connected and the error persists, please contact the system administrators:\n" " " msgstr "" @@ -2584,6 +2559,8 @@ msgstr "" #: aleksis/core/templates/templated_email/base.email:5 #: aleksis/core/templates/templated_email/base.email:16 +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 msgid "Hello" msgstr "" @@ -2657,6 +2634,23 @@ msgstr "Descriptio paginae" msgid "Count of objects with new problems" msgstr "" +#: aleksis/core/templates/templated_email/invitation.email:4 +#, python-format +msgid "Invitation to register on %(site)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 +#, python-format +msgid "Hello %(person)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:9 +#: aleksis/core/templates/templated_email/invitation.email:18 +#, python-format +msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:" +msgstr "" + #: aleksis/core/templates/templated_email/notification.email:4 #, fuzzy #| msgid "Notification" @@ -3044,156 +3038,174 @@ msgstr "" msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:280 +#: aleksis/core/views.py:285 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:292 +#: aleksis/core/views.py:297 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:396 +#: aleksis/core/views.py:401 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:415 aleksis/core/views.py:425 +#: aleksis/core/views.py:420 aleksis/core/views.py:430 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:475 +#: aleksis/core/views.py:480 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:558 +#: aleksis/core/views.py:528 +msgid "Maintenance mode was turned on successfully." +msgstr "" + +#: aleksis/core/views.py:530 +msgid "Maintenance mode was turned off successfully." +msgstr "" + +#: aleksis/core/views.py:588 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:574 +#: aleksis/core/views.py:604 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:643 +#: aleksis/core/views.py:673 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:662 +#: aleksis/core/views.py:692 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:686 +#: aleksis/core/views.py:716 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:700 +#: aleksis/core/views.py:730 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:732 +#: aleksis/core/views.py:762 #, fuzzy #| msgid "Additional name(s)" msgid "The additional field has been saved." msgstr "addita nomines" -#: aleksis/core/views.py:767 +#: aleksis/core/views.py:797 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:792 +#: aleksis/core/views.py:822 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:823 +#: aleksis/core/views.py:853 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:858 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:859 +#: aleksis/core/views.py:889 #, fuzzy #| msgid "System status" msgid "Run data checks …" msgstr "Status systemae" -#: aleksis/core/views.py:860 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:861 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:878 +#: aleksis/core/views.py:908 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:918 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:921 +#: aleksis/core/views.py:951 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:951 +#: aleksis/core/views.py:981 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:961 +#: aleksis/core/views.py:991 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1033 +#: aleksis/core/views.py:1063 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1035 +#: aleksis/core/views.py:1065 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1106 +#: aleksis/core/views.py:1136 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1203 +#: aleksis/core/views.py:1233 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1213 +#: aleksis/core/views.py:1243 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1223 +#: aleksis/core/views.py:1253 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1233 +#: aleksis/core/views.py:1263 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1243 +#: aleksis/core/views.py:1273 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1352 +#: aleksis/core/views.py:1382 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1359 +#: aleksis/core/views.py:1389 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1435 +#: aleksis/core/views.py:1465 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1446 +#: aleksis/core/views.py:1476 msgid "Person was already invited." msgstr "" +#, fuzzy +#~| msgid "Notifications" +#~ msgid "Authorized applications" +#~ msgstr "Nuntii" + +#, fuzzy +#~| msgid "Notifications" +#~ msgid "No authorized applications." +#~ msgstr "Nuntii" + #~ msgid "Dashboard" #~ msgstr "Forum" diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po index 7b3dcf5cecf2eb898338532c3ca412d75eda3df5..fb8bc425d974f814c8bf58710d9b1b06d975be5a 100644 --- a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po +++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-27 13:23+0100\n" +"POT-Creation-Date: 2023-05-09 18:40+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,28 +17,32 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: aleksis/core/apps.py:155 +#: aleksis/core/apps.py:151 +msgid "You have been logged out successfully." +msgstr "" + +#: aleksis/core/apps.py:161 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:156 +#: aleksis/core/apps.py:162 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:157 +#: aleksis/core/apps.py:163 msgid "Full home postal address" msgstr "" -#: aleksis/core/apps.py:158 +#: aleksis/core/apps.py:164 msgid "Email address" msgstr "" -#: aleksis/core/apps.py:159 +#: aleksis/core/apps.py:165 msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 -#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:166 aleksis/core/forms.py:221 +#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 msgid "Groups" msgstr "" @@ -97,172 +101,172 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +#: aleksis/core/filters.py:113 aleksis/core/models.py:721 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +#: aleksis/core/filters.py:135 aleksis/core/models.py:494 msgid "Group" msgstr "" -#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +#: aleksis/core/forms.py:51 aleksis/core/forms.py:582 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +#: aleksis/core/forms.py:56 aleksis/core/tables.py:47 msgid "Address" msgstr "" -#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +#: aleksis/core/forms.py:57 aleksis/core/forms.py:591 msgid "Contact data" msgstr "" -#: aleksis/core/forms.py:58 +#: aleksis/core/forms.py:59 msgid "Advanced personal data" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "New user" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "Create a new account" msgstr "" -#: aleksis/core/forms.py:132 +#: aleksis/core/forms.py:133 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:136 +#: aleksis/core/forms.py:137 msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +#: aleksis/core/forms.py:154 aleksis/core/models.py:142 msgid "School term" msgstr "" -#: aleksis/core/forms.py:154 +#: aleksis/core/forms.py:155 msgid "Common data" msgstr "" -#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:208 +#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" -#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +#: aleksis/core/forms.py:157 aleksis/core/forms.py:593 msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:157 aleksis/core/models.py:217 -#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +#: aleksis/core/forms.py:158 aleksis/core/models.py:218 +#: aleksis/core/models.py:547 aleksis/core/tables.py:46 msgid "Photo" msgstr "" -#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:84 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:85 msgid "Date" msgstr "" -#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:92 +#: aleksis/core/forms.py:201 aleksis/core/forms.py:204 +#: aleksis/core/models.py:93 msgid "Time" msgstr "" -#: aleksis/core/forms.py:233 +#: aleksis/core/forms.py:234 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:236 +#: aleksis/core/forms.py:237 msgid "Who should see the announcement?" msgstr "" -#: aleksis/core/forms.py:237 +#: aleksis/core/forms.py:238 msgid "Write your announcement:" msgstr "" -#: aleksis/core/forms.py:276 +#: aleksis/core/forms.py:277 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:280 +#: aleksis/core/forms.py:281 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:289 +#: aleksis/core/forms.py:290 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:398 +#: aleksis/core/forms.py:399 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:399 +#: aleksis/core/forms.py:400 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "First name" msgstr "" -#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +#: aleksis/core/forms.py:420 aleksis/core/models.py:194 msgid "Last name" msgstr "" -#: aleksis/core/forms.py:428 +#: aleksis/core/forms.py:429 msgid "A person is using this e-mail address" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:457 msgid "Who should get the permission?" msgstr "" -#: aleksis/core/forms.py:457 +#: aleksis/core/forms.py:458 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:483 +#: aleksis/core/forms.py:484 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:486 +#: aleksis/core/forms.py:487 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:494 +#: aleksis/core/forms.py:495 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:499 +#: aleksis/core/forms.py:500 msgid "You must grant the permission to all objects or to specific objects." msgstr "" -#: aleksis/core/forms.py:586 +#: aleksis/core/forms.py:587 msgid "Address data" msgstr "" -#: aleksis/core/forms.py:598 +#: aleksis/core/forms.py:599 msgid "Account data" msgstr "" -#: aleksis/core/forms.py:605 +#: aleksis/core/forms.py:606 msgid "Password" msgstr "" -#: aleksis/core/forms.py:608 +#: aleksis/core/forms.py:609 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:761 +#: aleksis/core/forms.py:762 msgid "The selected action does not exist." msgstr "" -#: aleksis/core/forms.py:772 +#: aleksis/core/forms.py:773 msgid "You do not have permission to run {} on all selected objects." msgstr "" -#: aleksis/core/forms.py:828 +#: aleksis/core/forms.py:829 msgid "No valid selection." msgstr "" @@ -290,658 +294,658 @@ msgstr "" msgid "Linked school term" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:83 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:83 +#: aleksis/core/models.py:84 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:85 +#: aleksis/core/models.py:86 msgid "Date and time" msgstr "" -#: aleksis/core/models.py:86 +#: aleksis/core/models.py:87 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:87 aleksis/core/models.py:210 +#: aleksis/core/models.py:88 aleksis/core/models.py:211 msgid "E-mail address" msgstr "" -#: aleksis/core/models.py:88 +#: aleksis/core/models.py:89 msgid "Integer" msgstr "" -#: aleksis/core/models.py:89 +#: aleksis/core/models.py:90 msgid "IP address" msgstr "" -#: aleksis/core/models.py:90 +#: aleksis/core/models.py:91 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:91 +#: aleksis/core/models.py:92 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:93 +#: aleksis/core/models.py:94 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +#: aleksis/core/models.py:106 aleksis/core/models.py:1078 msgid "Name" msgstr "" -#: aleksis/core/models.py:107 +#: aleksis/core/models.py:108 msgid "Start date" msgstr "" -#: aleksis/core/models.py:108 +#: aleksis/core/models.py:109 msgid "End date" msgstr "" -#: aleksis/core/models.py:127 +#: aleksis/core/models.py:128 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:134 +#: aleksis/core/models.py:135 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:142 +#: aleksis/core/models.py:143 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 msgid "School terms" msgstr "" -#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +#: aleksis/core/models.py:164 aleksis/core/models.py:1027 msgid "Person" msgstr "" -#: aleksis/core/models.py:166 +#: aleksis/core/models.py:167 msgid "Can view address" msgstr "" -#: aleksis/core/models.py:167 +#: aleksis/core/models.py:168 msgid "Can view contact details" msgstr "" -#: aleksis/core/models.py:168 +#: aleksis/core/models.py:169 msgid "Can view photo" msgstr "" -#: aleksis/core/models.py:169 +#: aleksis/core/models.py:170 msgid "Can view avatar image" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:171 msgid "Can view persons groups" msgstr "" -#: aleksis/core/models.py:171 +#: aleksis/core/models.py:172 msgid "Can view personal details" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "female" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "male" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "other" msgstr "" -#: aleksis/core/models.py:189 aleksis/core/models.py:1353 +#: aleksis/core/models.py:190 aleksis/core/models.py:1382 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:195 +#: aleksis/core/models.py:196 msgid "Additional name(s)" msgstr "" -#: aleksis/core/models.py:199 aleksis/core/models.py:511 -#: aleksis/core/models.py:1439 +#: aleksis/core/models.py:200 aleksis/core/models.py:512 +#: aleksis/core/models.py:1468 msgid "Short name" msgstr "" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:203 msgid "Street" msgstr "" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:204 msgid "Street number" msgstr "" -#: aleksis/core/models.py:204 +#: aleksis/core/models.py:205 msgid "Postal code" msgstr "" -#: aleksis/core/models.py:205 +#: aleksis/core/models.py:206 msgid "Place" msgstr "" -#: aleksis/core/models.py:207 +#: aleksis/core/models.py:208 msgid "Home phone" msgstr "" -#: aleksis/core/models.py:208 +#: aleksis/core/models.py:209 msgid "Mobile phone" msgstr "" -#: aleksis/core/models.py:212 +#: aleksis/core/models.py:213 msgid "Date of birth" msgstr "" -#: aleksis/core/models.py:213 +#: aleksis/core/models.py:214 msgid "Place of birth" msgstr "" -#: aleksis/core/models.py:214 +#: aleksis/core/models.py:215 msgid "Sex" msgstr "" -#: aleksis/core/models.py:221 aleksis/core/models.py:550 +#: aleksis/core/models.py:222 aleksis/core/models.py:551 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:226 aleksis/core/models.py:554 +#: aleksis/core/models.py:227 aleksis/core/models.py:555 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:229 aleksis/core/models.py:557 +#: aleksis/core/models.py:230 aleksis/core/models.py:558 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:234 +#: aleksis/core/models.py:235 msgid "Guardians / Parents" msgstr "" -#: aleksis/core/models.py:241 +#: aleksis/core/models.py:242 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:244 aleksis/core/models.py:724 -#: aleksis/core/models.py:748 aleksis/core/models.py:843 -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:245 aleksis/core/models.py:725 +#: aleksis/core/models.py:749 aleksis/core/models.py:844 +#: aleksis/core/models.py:1113 msgid "Description" msgstr "" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:465 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:466 +#: aleksis/core/models.py:467 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:468 +#: aleksis/core/models.py:469 msgid "Required" msgstr "" -#: aleksis/core/models.py:469 +#: aleksis/core/models.py:470 msgid "Help text / description" msgstr "" -#: aleksis/core/models.py:475 +#: aleksis/core/models.py:476 msgid "Addtitional field for groups" msgstr "" -#: aleksis/core/models.py:476 +#: aleksis/core/models.py:477 msgid "Addtitional fields for groups" msgstr "" -#: aleksis/core/models.py:496 +#: aleksis/core/models.py:497 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:497 +#: aleksis/core/models.py:498 msgid "Can view statistics about group." msgstr "" -#: aleksis/core/models.py:509 aleksis/core/models.py:1440 +#: aleksis/core/models.py:510 aleksis/core/models.py:1469 msgid "Long name" msgstr "" -#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "" -#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:537 +#: aleksis/core/models.py:538 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:542 +#: aleksis/core/models.py:543 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 msgid "Additional fields" msgstr "" -#: aleksis/core/models.py:723 aleksis/core/models.py:747 -#: aleksis/core/models.py:842 aleksis/core/models.py:1270 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:843 aleksis/core/models.py:1299 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "" -#: aleksis/core/models.py:726 +#: aleksis/core/models.py:727 msgid "Application" msgstr "" -#: aleksis/core/models.py:732 +#: aleksis/core/models.py:733 msgid "Activity" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:734 msgid "Activities" msgstr "" -#: aleksis/core/models.py:739 +#: aleksis/core/models.py:740 msgid "Sender" msgstr "" -#: aleksis/core/models.py:744 +#: aleksis/core/models.py:745 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +#: aleksis/core/models.py:750 aleksis/core/models.py:1079 msgid "Link" msgstr "" -#: aleksis/core/models.py:752 aleksis/core/models.py:1079 -#: aleksis/core/models.py:1400 +#: aleksis/core/models.py:753 aleksis/core/models.py:1080 +#: aleksis/core/models.py:1429 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "" -#: aleksis/core/models.py:755 +#: aleksis/core/models.py:756 msgid "Send notification at" msgstr "" -#: aleksis/core/models.py:757 +#: aleksis/core/models.py:758 msgid "Read" msgstr "" -#: aleksis/core/models.py:758 +#: aleksis/core/models.py:759 msgid "Sent" msgstr "" -#: aleksis/core/models.py:775 +#: aleksis/core/models.py:776 msgid "Notification" msgstr "" -#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +#: aleksis/core/models.py:777 aleksis/core/preferences.py:29 msgid "Notifications" msgstr "" -#: aleksis/core/models.py:844 +#: aleksis/core/models.py:845 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:847 +#: aleksis/core/models.py:848 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:850 +#: aleksis/core/models.py:851 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:875 +#: aleksis/core/models.py:876 msgid "Announcement" msgstr "" -#: aleksis/core/models.py:876 +#: aleksis/core/models.py:877 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 msgid "Announcements" msgstr "" -#: aleksis/core/models.py:913 +#: aleksis/core/models.py:914 msgid "Announcement recipient" msgstr "" -#: aleksis/core/models.py:914 +#: aleksis/core/models.py:915 msgid "Announcement recipients" msgstr "" -#: aleksis/core/models.py:934 +#: aleksis/core/models.py:935 msgid "Widget Title" msgstr "" -#: aleksis/core/models.py:935 +#: aleksis/core/models.py:936 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:936 +#: aleksis/core/models.py:937 msgid "Widget is broken" msgstr "" -#: aleksis/core/models.py:939 +#: aleksis/core/models.py:940 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:940 +#: aleksis/core/models.py:941 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:945 +#: aleksis/core/models.py:946 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:946 +#: aleksis/core/models.py:947 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:952 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:952 +#: aleksis/core/models.py:953 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:958 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:959 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:989 +#: aleksis/core/models.py:990 msgid "Can edit default dashboard" msgstr "" -#: aleksis/core/models.py:990 +#: aleksis/core/models.py:991 msgid "Dashboard Widget" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:992 msgid "Dashboard Widgets" msgstr "" -#: aleksis/core/models.py:997 +#: aleksis/core/models.py:998 msgid "URL" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:999 msgid "Icon URL" msgstr "" -#: aleksis/core/models.py:1004 +#: aleksis/core/models.py:1005 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:1005 +#: aleksis/core/models.py:1006 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1012 msgid "Content" msgstr "" -#: aleksis/core/models.py:1017 +#: aleksis/core/models.py:1018 msgid "Static content widget" msgstr "" -#: aleksis/core/models.py:1018 +#: aleksis/core/models.py:1019 msgid "Static content widgets" msgstr "" -#: aleksis/core/models.py:1023 +#: aleksis/core/models.py:1024 msgid "Dashboard widget" msgstr "" -#: aleksis/core/models.py:1028 +#: aleksis/core/models.py:1029 msgid "Order" msgstr "" -#: aleksis/core/models.py:1029 +#: aleksis/core/models.py:1030 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:1044 +#: aleksis/core/models.py:1045 msgid "Dashboard widget order" msgstr "" -#: aleksis/core/models.py:1045 +#: aleksis/core/models.py:1046 msgid "Dashboard widget orders" msgstr "" -#: aleksis/core/models.py:1051 +#: aleksis/core/models.py:1052 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1064 +#: aleksis/core/models.py:1065 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1065 +#: aleksis/core/models.py:1066 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1076 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1085 +#: aleksis/core/models.py:1086 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1086 +#: aleksis/core/models.py:1087 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1111 +#: aleksis/core/models.py:1112 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50 +#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "" -#: aleksis/core/models.py:1119 +#: aleksis/core/models.py:1120 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 msgid "Group types" msgstr "" -#: aleksis/core/models.py:1132 +#: aleksis/core/models.py:1133 msgid "Can view system status" msgstr "" -#: aleksis/core/models.py:1133 +#: aleksis/core/models.py:1134 msgid "Can manage data" msgstr "" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1135 msgid "Can impersonate" msgstr "" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1136 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1136 +#: aleksis/core/models.py:1137 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1138 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1139 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1139 +#: aleksis/core/models.py:1140 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1140 +#: aleksis/core/models.py:1141 msgid "Can invite persons" msgstr "" -#: aleksis/core/models.py:1176 +#: aleksis/core/models.py:1177 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1185 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1186 msgid "Notification sent" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1199 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1199 +#: aleksis/core/models.py:1200 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1202 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1202 +#: aleksis/core/models.py:1203 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1209 +#: aleksis/core/models.py:1210 msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1241 +#: aleksis/core/models.py:1270 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1245 +#: aleksis/core/models.py:1274 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1248 +#: aleksis/core/models.py:1277 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1251 +#: aleksis/core/models.py:1280 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1258 +#: aleksis/core/models.py:1287 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1259 +#: aleksis/core/models.py:1288 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1264 +#: aleksis/core/models.py:1293 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1267 +#: aleksis/core/models.py:1296 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1271 +#: aleksis/core/models.py:1300 msgid "Back URL" msgstr "" -#: aleksis/core/models.py:1272 +#: aleksis/core/models.py:1301 msgid "Progress title" msgstr "" -#: aleksis/core/models.py:1273 +#: aleksis/core/models.py:1302 msgid "Error message" msgstr "" -#: aleksis/core/models.py:1274 +#: aleksis/core/models.py:1303 msgid "Success message" msgstr "" -#: aleksis/core/models.py:1275 +#: aleksis/core/models.py:1304 msgid "Redirect on success URL" msgstr "" -#: aleksis/core/models.py:1277 +#: aleksis/core/models.py:1306 msgid "Additional button title" msgstr "" -#: aleksis/core/models.py:1279 +#: aleksis/core/models.py:1308 msgid "Additional button URL" msgstr "" -#: aleksis/core/models.py:1281 +#: aleksis/core/models.py:1310 msgid "Additional button icon" msgstr "" -#: aleksis/core/models.py:1283 +#: aleksis/core/models.py:1312 msgid "Result fetched" msgstr "" -#: aleksis/core/models.py:1308 +#: aleksis/core/models.py:1337 msgid "Background task completed successfully" msgstr "" -#: aleksis/core/models.py:1309 +#: aleksis/core/models.py:1338 msgid "The background task '{}' has been completed successfully." msgstr "" -#: aleksis/core/models.py:1315 +#: aleksis/core/models.py:1344 msgid "Background task failed" msgstr "" -#: aleksis/core/models.py:1316 +#: aleksis/core/models.py:1345 msgid "The background task '{}' has failed." msgstr "" -#: aleksis/core/models.py:1325 +#: aleksis/core/models.py:1354 msgid "Background task" msgstr "" -#: aleksis/core/models.py:1339 +#: aleksis/core/models.py:1368 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1340 +#: aleksis/core/models.py:1369 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1356 +#: aleksis/core/models.py:1385 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1394 +#: aleksis/core/models.py:1423 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1404 +#: aleksis/core/models.py:1433 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" -#: aleksis/core/models.py:1449 +#: aleksis/core/models.py:1478 msgid "Can view room timetable" msgstr "" -#: aleksis/core/models.py:1451 +#: aleksis/core/models.py:1480 msgid "Room" msgstr "" -#: aleksis/core/models.py:1452 +#: aleksis/core/models.py:1481 msgid "Rooms" msgstr "" @@ -1153,15 +1157,15 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:549 +#: aleksis/core/settings.py:551 msgid "English" msgstr "" -#: aleksis/core/settings.py:550 +#: aleksis/core/settings.py:552 msgid "German" msgstr "" -#: aleksis/core/settings.py:551 +#: aleksis/core/settings.py:553 msgid "Ukrainian" msgstr "" @@ -1173,14 +1177,14 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:27 aleksis/core/tables.py:148 -#: aleksis/core/tables.py:192 +#: aleksis/core/tables.py:185 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" #: aleksis/core/tables.py:115 aleksis/core/tables.py:116 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146 -#: aleksis/core/tables.py:190 +#: aleksis/core/tables.py:183 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 @@ -1229,7 +1233,7 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/500.html:21 +#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22 msgid "Retry" msgstr "" @@ -1543,62 +1547,62 @@ msgstr "" msgid "Edit default dashboard" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 +#: aleksis/core/templates/core/data_check/list.html:11 msgid "Data checks" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:15 +#: aleksis/core/templates/core/data_check/list.html:16 msgid "Check data again" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:22 +#: aleksis/core/templates/core/data_check/list.html:23 msgid "The system detected some problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:23 +#: aleksis/core/templates/core/data_check/list.html:24 msgid "" "Please go through all data and check whether some extra action is\n" " needed." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:31 +#: aleksis/core/templates/core/data_check/list.html:32 msgid "Everything is fine." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:32 +#: aleksis/core/templates/core/data_check/list.html:33 msgid "The system hasn't detected any problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:40 +#: aleksis/core/templates/core/data_check/list.html:41 msgid "Detected problems" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:45 +#: aleksis/core/templates/core/data_check/list.html:46 msgid "Affected object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:46 +#: aleksis/core/templates/core/data_check/list.html:47 msgid "Detected problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:47 +#: aleksis/core/templates/core/data_check/list.html:48 msgid "Show details" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:48 +#: aleksis/core/templates/core/data_check/list.html:49 msgid "Options to solve the problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:63 +#: aleksis/core/templates/core/data_check/list.html:65 msgid "Show object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:86 +#: aleksis/core/templates/core/data_check/list.html:89 msgid "Registered checks" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:90 +#: aleksis/core/templates/core/data_check/list.html:93 msgid "" "\n" " The system will check for the following problems:\n" @@ -1820,83 +1824,83 @@ msgstr "" msgid "System checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:22 +#: aleksis/core/templates/core/pages/system_status.html:26 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:24 +#: aleksis/core/templates/core/pages/system_status.html:28 msgid "" "\n" -" Only admin and visitors from internal IPs can access the site.\n" -" " +" Only admin and visitors from internal IPs can access the site.\n" +" " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:36 +#: aleksis/core/templates/core/pages/system_status.html:39 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:37 +#: aleksis/core/templates/core/pages/system_status.html:40 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:51 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:49 +#: aleksis/core/templates/core/pages/system_status.html:53 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:60 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:58 +#: aleksis/core/templates/core/pages/system_status.html:62 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:71 +#: aleksis/core/templates/core/pages/system_status.html:75 msgid "System health checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:81 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:78 -#: aleksis/core/templates/core/pages/system_status.html:119 +#: aleksis/core/templates/core/pages/system_status.html:82 +#: aleksis/core/templates/core/pages/system_status.html:123 msgid "Status" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:79 +#: aleksis/core/templates/core/pages/system_status.html:83 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:100 +#: aleksis/core/templates/core/pages/system_status.html:104 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:111 +#: aleksis/core/templates/core/pages/system_status.html:115 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/core/pages/system_status.html:120 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:117 +#: aleksis/core/templates/core/pages/system_status.html:121 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:118 +#: aleksis/core/templates/core/pages/system_status.html:122 msgid "Date done" msgstr "" @@ -2120,11 +2124,11 @@ msgstr "" msgid "Generate invitation code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:29 +#: aleksis/core/templates/invitations/forms/_invite.html:30 msgid "Generate code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:33 +#: aleksis/core/templates/invitations/forms/_invite.html:34 msgid "Invitations" msgstr "" @@ -2140,7 +2144,6 @@ msgstr "" #: aleksis/core/templates/oauth2_provider/application/create.html:14 #: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 #: aleksis/core/templates/two_factor/_wizard_actions.html:6 msgid "Cancel" msgstr "" @@ -2214,43 +2217,19 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 -msgid "Revoke access" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Are you sure to revoke the access for this application?" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 -msgid "Revoke" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 -msgid "No authorized applications." -msgstr "" - #: aleksis/core/templates/offline.html:5 msgid "Network error" msgstr "" #: aleksis/core/templates/offline.html:10 -msgid "Page not available offline." +msgid "No connection to server." msgstr "" #: aleksis/core/templates/offline.html:14 msgid "" "\n" -" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" -" administrators:\n" +" This page is not available without a connection to the server. Please check your internet connection and try again.\n" +" If you are connected and the error persists, please contact the system administrators:\n" " " msgstr "" @@ -2368,6 +2347,8 @@ msgstr "" #: aleksis/core/templates/templated_email/base.email:5 #: aleksis/core/templates/templated_email/base.email:16 +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 msgid "Hello" msgstr "" @@ -2435,6 +2416,23 @@ msgstr "" msgid "Count of objects with new problems" msgstr "" +#: aleksis/core/templates/templated_email/invitation.email:4 +#, python-format +msgid "Invitation to register on %(site)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 +#, python-format +msgid "Hello %(person)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:9 +#: aleksis/core/templates/templated_email/invitation.email:18 +#, python-format +msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:" +msgstr "" + #: aleksis/core/templates/templated_email/notification.email:4 msgid "New notification for" msgstr "" @@ -2814,149 +2812,157 @@ msgstr "" msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:280 +#: aleksis/core/views.py:285 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:292 +#: aleksis/core/views.py:297 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:396 +#: aleksis/core/views.py:401 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:415 aleksis/core/views.py:425 +#: aleksis/core/views.py:420 aleksis/core/views.py:430 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:475 +#: aleksis/core/views.py:480 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:558 +#: aleksis/core/views.py:528 +msgid "Maintenance mode was turned on successfully." +msgstr "" + +#: aleksis/core/views.py:530 +msgid "Maintenance mode was turned off successfully." +msgstr "" + +#: aleksis/core/views.py:588 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:574 +#: aleksis/core/views.py:604 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:643 +#: aleksis/core/views.py:673 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:662 +#: aleksis/core/views.py:692 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:686 +#: aleksis/core/views.py:716 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:700 +#: aleksis/core/views.py:730 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:732 +#: aleksis/core/views.py:762 msgid "The additional field has been saved." msgstr "" -#: aleksis/core/views.py:767 +#: aleksis/core/views.py:797 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:792 +#: aleksis/core/views.py:822 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:823 +#: aleksis/core/views.py:853 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:858 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:859 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:860 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:861 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:878 +#: aleksis/core/views.py:908 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:918 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:921 +#: aleksis/core/views.py:951 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:951 +#: aleksis/core/views.py:981 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:961 +#: aleksis/core/views.py:991 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1033 +#: aleksis/core/views.py:1063 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1035 +#: aleksis/core/views.py:1065 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1106 +#: aleksis/core/views.py:1136 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1203 +#: aleksis/core/views.py:1233 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1213 +#: aleksis/core/views.py:1243 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1223 +#: aleksis/core/views.py:1253 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1233 +#: aleksis/core/views.py:1263 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1243 +#: aleksis/core/views.py:1273 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1352 +#: aleksis/core/views.py:1382 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1359 +#: aleksis/core/views.py:1389 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1435 +#: aleksis/core/views.py:1465 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1446 +#: aleksis/core/views.py:1476 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/ru/LC_MESSAGES/django.po b/aleksis/core/locale/ru/LC_MESSAGES/django.po index bbc0d0554c170e9e0c1954b5076d624da0e2e8e1..ac2e3f0fd5a295ab08281388f545cbe3bfed179b 100644 --- a/aleksis/core/locale/ru/LC_MESSAGES/django.po +++ b/aleksis/core/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-27 13:23+0100\n" +"POT-Creation-Date: 2023-05-09 18:40+0200\n" "PO-Revision-Date: 2023-02-08 22:40+0000\n" "Last-Translator: Serhii Horichenko <m@sgg.im>\n" "Language-Team: Russian <https://translate.edugit.org/projects/aleksis/aleksis-core/ru/>\n" @@ -18,28 +18,34 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" "X-Generator: Weblate 4.12.1\n" -#: aleksis/core/apps.py:155 +#: aleksis/core/apps.py:151 +#, fuzzy +#| msgid "The preferences have been saved successfully." +msgid "You have been logged out successfully." +msgstr "СвойÑтва Ñохранены." + +#: aleksis/core/apps.py:161 msgid "OpenID Connect scope" msgstr "Граница дейÑÑ‚Ð²Ð¸Ñ OpenID Connect" -#: aleksis/core/apps.py:156 +#: aleksis/core/apps.py:162 msgid "Given name, family name, link to profile and picture if existing." msgstr "ИмÑ, фамилиÑ, ÑÑылка на профиль и фото, еÑли еÑть." -#: aleksis/core/apps.py:157 +#: aleksis/core/apps.py:163 msgid "Full home postal address" msgstr "Полный домашний почтовый адреÑ" -#: aleksis/core/apps.py:158 +#: aleksis/core/apps.py:164 msgid "Email address" msgstr "ÐÐ´Ñ€ÐµÑ Ñл.почты" -#: aleksis/core/apps.py:159 +#: aleksis/core/apps.py:165 msgid "Home and mobile phone" msgstr "Домашний и мобильный телефоны" -#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 -#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:166 aleksis/core/forms.py:221 +#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 msgid "Groups" msgstr "Группы" @@ -98,172 +104,172 @@ msgstr "Разрешение" msgid "Content type" msgstr "Тип Ñодержимого" -#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +#: aleksis/core/filters.py:113 aleksis/core/models.py:721 msgid "User" msgstr "Пользователь" -#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +#: aleksis/core/filters.py:135 aleksis/core/models.py:494 msgid "Group" msgstr "Группа" -#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +#: aleksis/core/forms.py:51 aleksis/core/forms.py:582 msgid "Base data" msgstr "ОÑновные данные" -#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +#: aleksis/core/forms.py:56 aleksis/core/tables.py:47 msgid "Address" msgstr "ÐдреÑ" -#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +#: aleksis/core/forms.py:57 aleksis/core/forms.py:591 msgid "Contact data" msgstr "Контактные данные" -#: aleksis/core/forms.py:58 +#: aleksis/core/forms.py:59 msgid "Advanced personal data" msgstr "Дополнительные личные данные" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "New user" msgstr "Ðовый пользователь" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "Create a new account" msgstr "Создать новую учётную запиÑÑŒ" -#: aleksis/core/forms.py:132 +#: aleksis/core/forms.py:133 msgid "You cannot set a new username when also selecting an existing user." msgstr "ПоÑле выбора ÑущеÑтвующего Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñоздать новый логин нельзÑ." -#: aleksis/core/forms.py:136 +#: aleksis/core/forms.py:137 msgid "This username is already in use." msgstr "Ðтот логин уже занÑÑ‚." -#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +#: aleksis/core/forms.py:154 aleksis/core/models.py:142 msgid "School term" msgstr "Учебный год" -#: aleksis/core/forms.py:154 +#: aleksis/core/forms.py:155 msgid "Common data" msgstr "Общие данные" -#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:208 +#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "Люди" -#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +#: aleksis/core/forms.py:157 aleksis/core/forms.py:593 msgid "Additional data" msgstr "Дополнительные данные" -#: aleksis/core/forms.py:157 aleksis/core/models.py:217 -#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +#: aleksis/core/forms.py:158 aleksis/core/models.py:218 +#: aleksis/core/models.py:547 aleksis/core/tables.py:46 msgid "Photo" msgstr "Фото" -#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:84 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:85 msgid "Date" msgstr "Дата" -#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:92 +#: aleksis/core/forms.py:201 aleksis/core/forms.py:204 +#: aleksis/core/models.py:93 msgid "Time" msgstr "ВремÑ" -#: aleksis/core/forms.py:233 +#: aleksis/core/forms.py:234 msgid "From when until when should the announcement be displayed?" msgstr "С какого и по какое Ð²Ñ€ÐµÐ¼Ñ Ñто объÑвление должно отображатьÑÑ?" -#: aleksis/core/forms.py:236 +#: aleksis/core/forms.py:237 msgid "Who should see the announcement?" msgstr "Кто должен видеть Ñто объÑвление?" -#: aleksis/core/forms.py:237 +#: aleksis/core/forms.py:238 msgid "Write your announcement:" msgstr "Ðапишите Ñвое объÑвление:" -#: aleksis/core/forms.py:276 +#: aleksis/core/forms.py:277 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð¾Ð³Ð¾ Вам Ñоздавать не разрешено." -#: aleksis/core/forms.py:280 +#: aleksis/core/forms.py:281 msgid "The from date and time must be earlier then the until date and time." msgstr "Дата и Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° должны быть до даты и времени окончаниÑ." -#: aleksis/core/forms.py:289 +#: aleksis/core/forms.py:290 msgid "You need at least one recipient." msgstr "Ðужен Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один получатель." -#: aleksis/core/forms.py:398 +#: aleksis/core/forms.py:399 msgid "Invitation code" msgstr "Код приглашениÑ" -#: aleksis/core/forms.py:399 +#: aleksis/core/forms.py:400 msgid "Please enter your invitation code." msgstr "Укажите, пожалуйÑта, код приглашениÑ." -#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "First name" msgstr "ИмÑ" -#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +#: aleksis/core/forms.py:420 aleksis/core/models.py:194 msgid "Last name" msgstr "ФамилиÑ" -#: aleksis/core/forms.py:428 +#: aleksis/core/forms.py:429 msgid "A person is using this e-mail address" msgstr "Ðтот Ñл.Ð°Ð´Ñ€ÐµÑ ÐºÐµÐ¼-то иÑпользуетÑÑ" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:457 msgid "Who should get the permission?" msgstr "Кто должен получить такое разрешение?" -#: aleksis/core/forms.py:457 +#: aleksis/core/forms.py:458 msgid "On what?" msgstr "Ð’ Ñлучае чего?" -#: aleksis/core/forms.py:483 +#: aleksis/core/forms.py:484 msgid "Select objects which the permission should be granted for:" msgstr "Отметьте объекты, к которым будет предоÑтавлен доÑтуп:" -#: aleksis/core/forms.py:486 +#: aleksis/core/forms.py:487 msgid "Grant the permission for all objects" msgstr "ПредоÑтавить доÑтуп ко вÑем объектам" -#: aleksis/core/forms.py:494 +#: aleksis/core/forms.py:495 msgid "You must select at least one group or person which should get the permission." msgstr "Вам нужно выбрать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну группу или физлицо, кто получит доÑтуп." -#: aleksis/core/forms.py:499 +#: aleksis/core/forms.py:500 msgid "You must grant the permission to all objects or to specific objects." msgstr "Ð’Ñ‹ должны предоÑтавить доÑтуп ко вÑем или к конкретным объектам." -#: aleksis/core/forms.py:586 +#: aleksis/core/forms.py:587 msgid "Address data" msgstr "ПодробноÑти адреÑа" -#: aleksis/core/forms.py:598 +#: aleksis/core/forms.py:599 msgid "Account data" msgstr "Данные учётной запиÑи" -#: aleksis/core/forms.py:605 +#: aleksis/core/forms.py:606 msgid "Password" msgstr "Пароль" -#: aleksis/core/forms.py:608 +#: aleksis/core/forms.py:609 msgid "Password (again)" msgstr "Пароль (ещё раз)" -#: aleksis/core/forms.py:761 +#: aleksis/core/forms.py:762 msgid "The selected action does not exist." msgstr "Выбранное дейÑтвие не ÑущеÑтвует." -#: aleksis/core/forms.py:772 +#: aleksis/core/forms.py:773 msgid "You do not have permission to run {} on all selected objects." msgstr "У Ð’Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° запуÑк {} на вÑех выбранных объектах." -#: aleksis/core/forms.py:828 +#: aleksis/core/forms.py:829 msgid "No valid selection." msgstr "Ðеправильный выбор." @@ -291,658 +297,658 @@ msgstr "Результат резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ на msgid "Linked school term" msgstr "СвÑзанный учебный год" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:83 msgid "Boolean (Yes/No)" msgstr "Булево (Да/Ðет)" -#: aleksis/core/models.py:83 +#: aleksis/core/models.py:84 msgid "Text (one line)" msgstr "ТекÑÑ‚ (одна Ñтрока)" -#: aleksis/core/models.py:85 +#: aleksis/core/models.py:86 msgid "Date and time" msgstr "Дата и времÑ" -#: aleksis/core/models.py:86 +#: aleksis/core/models.py:87 msgid "Decimal number" msgstr "ДеÑÑтичное чиÑло" -#: aleksis/core/models.py:87 aleksis/core/models.py:210 +#: aleksis/core/models.py:88 aleksis/core/models.py:211 msgid "E-mail address" msgstr "ÐÐ´Ñ€ÐµÑ Ñл.почты" -#: aleksis/core/models.py:88 +#: aleksis/core/models.py:89 msgid "Integer" msgstr "Целое" -#: aleksis/core/models.py:89 +#: aleksis/core/models.py:90 msgid "IP address" msgstr "IP адреÑ" -#: aleksis/core/models.py:90 +#: aleksis/core/models.py:91 msgid "Boolean or empty (Yes/No/Neither)" msgstr "Булево или пуÑтое (Да/Ðет/Ðичего)" -#: aleksis/core/models.py:91 +#: aleksis/core/models.py:92 msgid "Text (multi-line)" msgstr "ТекÑÑ‚ (многоÑтрочный)" -#: aleksis/core/models.py:93 +#: aleksis/core/models.py:94 msgid "URL / Link" msgstr "URL / СÑылка" -#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +#: aleksis/core/models.py:106 aleksis/core/models.py:1078 msgid "Name" msgstr "ИмÑ" -#: aleksis/core/models.py:107 +#: aleksis/core/models.py:108 msgid "Start date" msgstr "Дата начала" -#: aleksis/core/models.py:108 +#: aleksis/core/models.py:109 msgid "End date" msgstr "Дата окончаниÑ" -#: aleksis/core/models.py:127 +#: aleksis/core/models.py:128 msgid "The start date must be earlier than the end date." msgstr "Дата начала должна быть ранее даты окончаниÑ." -#: aleksis/core/models.py:134 +#: aleksis/core/models.py:135 msgid "There is already a school term for this time or a part of this time." msgstr "Ðа Ñто Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ на его чаÑть уже запланирован учебный год." -#: aleksis/core/models.py:142 +#: aleksis/core/models.py:143 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 msgid "School terms" msgstr "Учебный год" -#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +#: aleksis/core/models.py:164 aleksis/core/models.py:1027 msgid "Person" msgstr "Физлицо" -#: aleksis/core/models.py:166 +#: aleksis/core/models.py:167 msgid "Can view address" msgstr "Может видеть адреÑ" -#: aleksis/core/models.py:167 +#: aleksis/core/models.py:168 msgid "Can view contact details" msgstr "Может видеть контактные данные" -#: aleksis/core/models.py:168 +#: aleksis/core/models.py:169 msgid "Can view photo" msgstr "Может видеть фото" -#: aleksis/core/models.py:169 +#: aleksis/core/models.py:170 msgid "Can view avatar image" msgstr "Может видеть аватар" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:171 msgid "Can view persons groups" msgstr "Может видеть группы лиц" -#: aleksis/core/models.py:171 +#: aleksis/core/models.py:172 msgid "Can view personal details" msgstr "Может видеть личные данные" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "female" msgstr "жен" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "male" msgstr "муж" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "other" msgstr "другой" -#: aleksis/core/models.py:189 aleksis/core/models.py:1353 +#: aleksis/core/models.py:190 aleksis/core/models.py:1382 msgid "Linked user" msgstr "СвÑзанный пользователь" -#: aleksis/core/models.py:195 +#: aleksis/core/models.py:196 msgid "Additional name(s)" msgstr "Дополнительные имена" -#: aleksis/core/models.py:199 aleksis/core/models.py:511 -#: aleksis/core/models.py:1439 +#: aleksis/core/models.py:200 aleksis/core/models.py:512 +#: aleksis/core/models.py:1468 msgid "Short name" msgstr "Короткое имÑ" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:203 msgid "Street" msgstr "Улица" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:204 msgid "Street number" msgstr "Ðомер дома" -#: aleksis/core/models.py:204 +#: aleksis/core/models.py:205 msgid "Postal code" msgstr "Почтовый индекÑ" -#: aleksis/core/models.py:205 +#: aleksis/core/models.py:206 msgid "Place" msgstr "Город/меÑто" -#: aleksis/core/models.py:207 +#: aleksis/core/models.py:208 msgid "Home phone" msgstr "Домашний телефон" -#: aleksis/core/models.py:208 +#: aleksis/core/models.py:209 msgid "Mobile phone" msgstr "Мобильный телефон" -#: aleksis/core/models.py:212 +#: aleksis/core/models.py:213 msgid "Date of birth" msgstr "Дата рождениÑ" -#: aleksis/core/models.py:213 +#: aleksis/core/models.py:214 msgid "Place of birth" msgstr "МеÑто рождениÑ" -#: aleksis/core/models.py:214 +#: aleksis/core/models.py:215 msgid "Sex" msgstr "Пол" -#: aleksis/core/models.py:221 aleksis/core/models.py:550 +#: aleksis/core/models.py:222 aleksis/core/models.py:551 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "Ðто официальное фото, которое иÑпользуетÑÑ Ð´Ð»Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² и внутренних нужд." -#: aleksis/core/models.py:226 aleksis/core/models.py:554 +#: aleksis/core/models.py:227 aleksis/core/models.py:555 msgid "Display picture / Avatar" msgstr "Отобразить фото/аватар" -#: aleksis/core/models.py:229 aleksis/core/models.py:557 +#: aleksis/core/models.py:230 aleksis/core/models.py:558 msgid "This is a picture or an avatar for public display." msgstr "Ðто фото или аватар Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ³Ð¾ отображениÑ." -#: aleksis/core/models.py:234 +#: aleksis/core/models.py:235 msgid "Guardians / Parents" msgstr "Опекуны / Родители" -#: aleksis/core/models.py:241 +#: aleksis/core/models.py:242 msgid "Primary group" msgstr "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°" -#: aleksis/core/models.py:244 aleksis/core/models.py:724 -#: aleksis/core/models.py:748 aleksis/core/models.py:843 -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:245 aleksis/core/models.py:725 +#: aleksis/core/models.py:749 aleksis/core/models.py:844 +#: aleksis/core/models.py:1113 msgid "Description" msgstr "ОпиÑание" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:465 msgid "Title of field" msgstr "Ðазвание полÑ" -#: aleksis/core/models.py:466 +#: aleksis/core/models.py:467 msgid "Type of field" msgstr "Тип полÑ" -#: aleksis/core/models.py:468 +#: aleksis/core/models.py:469 msgid "Required" msgstr "Ðеобходимое" -#: aleksis/core/models.py:469 +#: aleksis/core/models.py:470 msgid "Help text / description" msgstr "Ð’Ñпомогательный текÑÑ‚ / опиÑание" -#: aleksis/core/models.py:475 +#: aleksis/core/models.py:476 msgid "Addtitional field for groups" msgstr "Дополнительное поле Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿" -#: aleksis/core/models.py:476 +#: aleksis/core/models.py:477 msgid "Addtitional fields for groups" msgstr "Дополнительные Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿" -#: aleksis/core/models.py:496 +#: aleksis/core/models.py:497 msgid "Can assign child groups to groups" msgstr "Может определÑть дочерние группы в группы" -#: aleksis/core/models.py:497 +#: aleksis/core/models.py:498 msgid "Can view statistics about group." msgstr "Может видеть ÑтатиÑтику группы." -#: aleksis/core/models.py:509 aleksis/core/models.py:1440 +#: aleksis/core/models.py:510 aleksis/core/models.py:1469 msgid "Long name" msgstr "Длинное имÑ" -#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "УчаÑтники" -#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "Владельцы" -#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "РодительÑкие группы" -#: aleksis/core/models.py:537 +#: aleksis/core/models.py:538 msgid "Type of group" msgstr "Тип группы" -#: aleksis/core/models.py:542 +#: aleksis/core/models.py:543 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 msgid "Additional fields" msgstr "Дополнительные полÑ" -#: aleksis/core/models.py:723 aleksis/core/models.py:747 -#: aleksis/core/models.py:842 aleksis/core/models.py:1270 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:843 aleksis/core/models.py:1299 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "Ðазвание" -#: aleksis/core/models.py:726 +#: aleksis/core/models.py:727 msgid "Application" msgstr "Приложение" -#: aleksis/core/models.py:732 +#: aleksis/core/models.py:733 msgid "Activity" msgstr "ÐктивноÑть" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:734 msgid "Activities" msgstr "ÐктивноÑти" -#: aleksis/core/models.py:739 +#: aleksis/core/models.py:740 msgid "Sender" msgstr "Отправитель" -#: aleksis/core/models.py:744 +#: aleksis/core/models.py:745 msgid "Recipient" msgstr "Получатель" -#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +#: aleksis/core/models.py:750 aleksis/core/models.py:1079 msgid "Link" msgstr "СÑылка" -#: aleksis/core/models.py:752 aleksis/core/models.py:1079 -#: aleksis/core/models.py:1400 +#: aleksis/core/models.py:753 aleksis/core/models.py:1080 +#: aleksis/core/models.py:1429 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "Иконка" -#: aleksis/core/models.py:755 +#: aleksis/core/models.py:756 msgid "Send notification at" msgstr "Отправить уведомление в" -#: aleksis/core/models.py:757 +#: aleksis/core/models.py:758 msgid "Read" msgstr "Читать" -#: aleksis/core/models.py:758 +#: aleksis/core/models.py:759 msgid "Sent" msgstr "Отправлено" -#: aleksis/core/models.py:775 +#: aleksis/core/models.py:776 msgid "Notification" msgstr "Уведомление" -#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +#: aleksis/core/models.py:777 aleksis/core/preferences.py:29 msgid "Notifications" msgstr "УведомлениÑ" -#: aleksis/core/models.py:844 +#: aleksis/core/models.py:845 msgid "Link to detailed view" msgstr "СÑылка на подробный обзор" -#: aleksis/core/models.py:847 +#: aleksis/core/models.py:848 msgid "Date and time from when to show" msgstr "Дата и времÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ показывать" -#: aleksis/core/models.py:850 +#: aleksis/core/models.py:851 msgid "Date and time until when to show" msgstr "Дата и времÑ, по какое показывать" -#: aleksis/core/models.py:875 +#: aleksis/core/models.py:876 msgid "Announcement" msgstr "ОбъÑвление" -#: aleksis/core/models.py:876 +#: aleksis/core/models.py:877 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 msgid "Announcements" msgstr "ОбъÑвление" -#: aleksis/core/models.py:913 +#: aleksis/core/models.py:914 msgid "Announcement recipient" msgstr "Получатель объÑвлениÑ" -#: aleksis/core/models.py:914 +#: aleksis/core/models.py:915 msgid "Announcement recipients" msgstr "Получатели объÑвлениÑ" -#: aleksis/core/models.py:934 +#: aleksis/core/models.py:935 msgid "Widget Title" msgstr "Ðазвание виджета" -#: aleksis/core/models.py:935 +#: aleksis/core/models.py:936 msgid "Activate Widget" msgstr "Ðктивировать виджет" -#: aleksis/core/models.py:936 +#: aleksis/core/models.py:937 msgid "Widget is broken" msgstr "Виджет поломалÑÑ" -#: aleksis/core/models.py:939 +#: aleksis/core/models.py:940 msgid "Size on mobile devices" msgstr "Размер на мобильных" -#: aleksis/core/models.py:940 +#: aleksis/core/models.py:941 msgid "<= 600 px, 12 columns" msgstr "<= 600 пикÑ, 12 Ñтолбцов" -#: aleksis/core/models.py:945 +#: aleksis/core/models.py:946 msgid "Size on tablet devices" msgstr "Размер на планшетах" -#: aleksis/core/models.py:946 +#: aleksis/core/models.py:947 msgid "> 600 px, 12 columns" msgstr "> 600 пикÑ, 12 Ñтолбцов" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:952 msgid "Size on desktop devices" msgstr "Размер на ПК" -#: aleksis/core/models.py:952 +#: aleksis/core/models.py:953 msgid "> 992 px, 12 columns" msgstr "> 992 пикÑ, 12 Ñтолбцов" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:958 msgid "Size on large desktop devices" msgstr "Размер Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… Ñкранов" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:959 msgid "> 1200 px>, 12 columns" msgstr "> 1200 пикÑ, 12 Ñтолбцов" -#: aleksis/core/models.py:989 +#: aleksis/core/models.py:990 msgid "Can edit default dashboard" msgstr "Может редактировать типовую/Ñтандартную информпанель" -#: aleksis/core/models.py:990 +#: aleksis/core/models.py:991 msgid "Dashboard Widget" msgstr "Виджет информпанели" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:992 msgid "Dashboard Widgets" msgstr "Виджеты информпанели" -#: aleksis/core/models.py:997 +#: aleksis/core/models.py:998 msgid "URL" msgstr "URL" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:999 msgid "Icon URL" msgstr "Иконка URL" -#: aleksis/core/models.py:1004 +#: aleksis/core/models.py:1005 msgid "External link widget" msgstr "ВнешнÑÑ ÑÑылка на виджет" -#: aleksis/core/models.py:1005 +#: aleksis/core/models.py:1006 msgid "External link widgets" msgstr "Внешние ÑÑылки на виджеты" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1012 msgid "Content" msgstr "Содержимое" -#: aleksis/core/models.py:1017 +#: aleksis/core/models.py:1018 msgid "Static content widget" msgstr "Виджет Ñ Ð¿Ð¾ÑтоÑнным Ñодержимым" -#: aleksis/core/models.py:1018 +#: aleksis/core/models.py:1019 msgid "Static content widgets" msgstr "Виджеты Ñ Ð¿Ð¾ÑтоÑнным Ñодержимым" -#: aleksis/core/models.py:1023 +#: aleksis/core/models.py:1024 msgid "Dashboard widget" msgstr "Виджет информпанели" -#: aleksis/core/models.py:1028 +#: aleksis/core/models.py:1029 msgid "Order" msgstr "ПорÑдок" -#: aleksis/core/models.py:1029 +#: aleksis/core/models.py:1030 msgid "Part of the default dashboard" msgstr "ЧаÑть типовой информпанели" -#: aleksis/core/models.py:1044 +#: aleksis/core/models.py:1045 msgid "Dashboard widget order" msgstr "ПорÑдок виджета на информпанели" -#: aleksis/core/models.py:1045 +#: aleksis/core/models.py:1046 msgid "Dashboard widget orders" msgstr "ПорÑдок виджетов на информпанели" -#: aleksis/core/models.py:1051 +#: aleksis/core/models.py:1052 msgid "Menu ID" msgstr "Меню ID" -#: aleksis/core/models.py:1064 +#: aleksis/core/models.py:1065 msgid "Custom menu" msgstr "ПользовательÑкое меню" -#: aleksis/core/models.py:1065 +#: aleksis/core/models.py:1066 msgid "Custom menus" msgstr "ПользовательÑкие меню" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1076 msgid "Menu" msgstr "Меню" -#: aleksis/core/models.py:1085 +#: aleksis/core/models.py:1086 msgid "Custom menu item" msgstr "Пункт пользовательÑкого меню" -#: aleksis/core/models.py:1086 +#: aleksis/core/models.py:1087 msgid "Custom menu items" msgstr "Пункты пользовательÑкого меню" -#: aleksis/core/models.py:1111 +#: aleksis/core/models.py:1112 msgid "Title of type" msgstr "Ðазвание типа" -#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50 +#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "Тип группы" -#: aleksis/core/models.py:1119 +#: aleksis/core/models.py:1120 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 msgid "Group types" msgstr "Типы групп" -#: aleksis/core/models.py:1132 +#: aleksis/core/models.py:1133 msgid "Can view system status" msgstr "Может проÑматривать ÑоÑтоÑние ÑиÑтемы" -#: aleksis/core/models.py:1133 +#: aleksis/core/models.py:1134 msgid "Can manage data" msgstr "Может управлÑть данными" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1135 msgid "Can impersonate" msgstr "Может маÑкироватьÑÑ" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1136 msgid "Can use search" msgstr "Может иÑпользовать поиÑк" -#: aleksis/core/models.py:1136 +#: aleksis/core/models.py:1137 msgid "Can change site preferences" msgstr "Может менÑть ÑвойÑтва Ñайта" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1138 msgid "Can change person preferences" msgstr "Может менÑть перÑональные ÑвойÑтва" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1139 msgid "Can change group preferences" msgstr "Может менÑть ÑвойÑтва группы" -#: aleksis/core/models.py:1139 +#: aleksis/core/models.py:1140 msgid "Can test PDF generation" msgstr "Может генерировать теÑтовые PDF" -#: aleksis/core/models.py:1140 +#: aleksis/core/models.py:1141 msgid "Can invite persons" msgstr "Может приглашать других" -#: aleksis/core/models.py:1176 +#: aleksis/core/models.py:1177 msgid "Related data check task" msgstr "Задание проверки ÑвÑзанных данных" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1185 msgid "Issue solved" msgstr "Проблема решена" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1186 msgid "Notification sent" msgstr "Уведомление отправлено" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1199 msgid "Data check result" msgstr "Результат проверки данных" -#: aleksis/core/models.py:1199 +#: aleksis/core/models.py:1200 msgid "Data check results" msgstr "Результаты проверки данных" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1202 msgid "Can run data checks" msgstr "Может запуÑкать проверки данных" -#: aleksis/core/models.py:1202 +#: aleksis/core/models.py:1203 msgid "Can solve data check problems" msgstr "Может решать проблемы проверки данных" -#: aleksis/core/models.py:1209 +#: aleksis/core/models.py:1210 msgid "E-Mail address" msgstr "ÐÐ´Ñ€ÐµÑ Ñл.почты" -#: aleksis/core/models.py:1241 +#: aleksis/core/models.py:1270 msgid "Owner" msgstr "Владелец" -#: aleksis/core/models.py:1245 +#: aleksis/core/models.py:1274 msgid "File expires at" msgstr "Файл дейÑтвителен до" -#: aleksis/core/models.py:1248 +#: aleksis/core/models.py:1277 msgid "Generated HTML file" msgstr "Сгенерированный файл HTML" -#: aleksis/core/models.py:1251 +#: aleksis/core/models.py:1280 msgid "Generated PDF file" msgstr "Сгенерированный файл PDF" -#: aleksis/core/models.py:1258 +#: aleksis/core/models.py:1287 msgid "PDF file" msgstr "Файл PDF" -#: aleksis/core/models.py:1259 +#: aleksis/core/models.py:1288 msgid "PDF files" msgstr "Файлы PDF" -#: aleksis/core/models.py:1264 +#: aleksis/core/models.py:1293 msgid "Task result" msgstr "Результат заданиÑ" -#: aleksis/core/models.py:1267 +#: aleksis/core/models.py:1296 msgid "Task user" msgstr "Пользователь заданиÑ" -#: aleksis/core/models.py:1271 +#: aleksis/core/models.py:1300 msgid "Back URL" msgstr "URL Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð°" -#: aleksis/core/models.py:1272 +#: aleksis/core/models.py:1301 msgid "Progress title" msgstr "Ðазвание процеÑÑа" -#: aleksis/core/models.py:1273 +#: aleksis/core/models.py:1302 msgid "Error message" msgstr "Сообщение об ошибке" -#: aleksis/core/models.py:1274 +#: aleksis/core/models.py:1303 msgid "Success message" msgstr "Сообщение об уÑпехе" -#: aleksis/core/models.py:1275 +#: aleksis/core/models.py:1304 msgid "Redirect on success URL" msgstr "URL Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Ñлучае уÑпеха" -#: aleksis/core/models.py:1277 +#: aleksis/core/models.py:1306 msgid "Additional button title" msgstr "Ðазвание дополнительной кнопки" -#: aleksis/core/models.py:1279 +#: aleksis/core/models.py:1308 msgid "Additional button URL" msgstr "URL дополнительной кнопки" -#: aleksis/core/models.py:1281 +#: aleksis/core/models.py:1310 msgid "Additional button icon" msgstr "Иконка дополнительной кнопки" -#: aleksis/core/models.py:1283 +#: aleksis/core/models.py:1312 msgid "Result fetched" msgstr "Полученный результат" -#: aleksis/core/models.py:1308 +#: aleksis/core/models.py:1337 msgid "Background task completed successfully" msgstr "Фоновое задание уÑпешно завершено" -#: aleksis/core/models.py:1309 +#: aleksis/core/models.py:1338 msgid "The background task '{}' has been completed successfully." msgstr "Фоновое задание \"{}\" уÑпешно завершено." -#: aleksis/core/models.py:1315 +#: aleksis/core/models.py:1344 msgid "Background task failed" msgstr "Ошибка фонового заданиÑ" -#: aleksis/core/models.py:1316 +#: aleksis/core/models.py:1345 msgid "The background task '{}' has failed." msgstr "Ошибка фонового Ð·Ð°Ð´Ð°Ð½Ð¸Ñ \"{}\"." -#: aleksis/core/models.py:1325 +#: aleksis/core/models.py:1354 msgid "Background task" msgstr "Фоновое задание" -#: aleksis/core/models.py:1339 +#: aleksis/core/models.py:1368 msgid "Task user assignment" msgstr "Ðазначение Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ" -#: aleksis/core/models.py:1340 +#: aleksis/core/models.py:1369 msgid "Task user assignments" msgstr "ÐÐ°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ заданиÑ" -#: aleksis/core/models.py:1356 +#: aleksis/core/models.py:1385 msgid "Additional attributes" msgstr "Дополнительные атрибуты" -#: aleksis/core/models.py:1394 +#: aleksis/core/models.py:1423 msgid "Allowed scopes that clients can request" msgstr "Разрешённые пределы дейÑтвиÑ, которые могут запрашивать клиенты" -#: aleksis/core/models.py:1404 +#: aleksis/core/models.py:1433 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "Ðто изображение будет иÑпользоватьÑÑ Ð² качеÑтве значка во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ð¸. Должно быть квадратным." -#: aleksis/core/models.py:1449 +#: aleksis/core/models.py:1478 msgid "Can view room timetable" msgstr "Может проÑмативать раÑпиÑание комнаты" -#: aleksis/core/models.py:1451 +#: aleksis/core/models.py:1480 msgid "Room" msgstr "Комната" -#: aleksis/core/models.py:1452 +#: aleksis/core/models.py:1481 msgid "Rooms" msgstr "Комнаты" @@ -1154,15 +1160,15 @@ msgstr "ÐвтоматичеÑки обновлÑть информпанель msgid "Country for phone number parsing" msgstr "Страна Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга номера телефона" -#: aleksis/core/settings.py:549 +#: aleksis/core/settings.py:551 msgid "English" msgstr "ÐнглийÑкий" -#: aleksis/core/settings.py:550 +#: aleksis/core/settings.py:552 msgid "German" msgstr "Ðемецкий" -#: aleksis/core/settings.py:551 +#: aleksis/core/settings.py:553 msgid "Ukrainian" msgstr "УкраинÑкий" @@ -1174,14 +1180,14 @@ msgid "Edit" msgstr "Редактировать" #: aleksis/core/tables.py:27 aleksis/core/tables.py:148 -#: aleksis/core/tables.py:192 +#: aleksis/core/tables.py:185 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "ДейÑтвиÑ" #: aleksis/core/tables.py:115 aleksis/core/tables.py:116 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146 -#: aleksis/core/tables.py:190 +#: aleksis/core/tables.py:183 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 @@ -1246,7 +1252,7 @@ msgstr "" " Ð’Ñ‹ также можете обратитьÑÑ Ðº ним непоÑредÑтвенно:\n" " " -#: aleksis/core/templates/500.html:21 +#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22 msgid "Retry" msgstr "ПопытатьÑÑ ÐµÑ‰Ñ‘" @@ -1602,20 +1608,20 @@ msgstr "Создать %(name)s" msgid "Edit default dashboard" msgstr "Редактировать Ñтандартную информпанель" -#: aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 +#: aleksis/core/templates/core/data_check/list.html:11 msgid "Data checks" msgstr "Проверки данных" -#: aleksis/core/templates/core/data_check/list.html:15 +#: aleksis/core/templates/core/data_check/list.html:16 msgid "Check data again" msgstr "Проверить данные ещё раз" -#: aleksis/core/templates/core/data_check/list.html:22 +#: aleksis/core/templates/core/data_check/list.html:23 msgid "The system detected some problems with your data." msgstr "СиÑтема обнаружила некоторые проблемы Ñ Ð’Ð°ÑˆÐ¸Ð¼Ð¸ данными." -#: aleksis/core/templates/core/data_check/list.html:23 +#: aleksis/core/templates/core/data_check/list.html:24 msgid "" "Please go through all data and check whether some extra action is\n" " needed." @@ -1623,43 +1629,43 @@ msgstr "" "ПожалуйÑта, переÑмотрите внимательно вÑе данные и проверьте не нужно ли\n" " что-то Ñделать." -#: aleksis/core/templates/core/data_check/list.html:31 +#: aleksis/core/templates/core/data_check/list.html:32 msgid "Everything is fine." msgstr "Ð’ÑÑ‘ прекраÑно." -#: aleksis/core/templates/core/data_check/list.html:32 +#: aleksis/core/templates/core/data_check/list.html:33 msgid "The system hasn't detected any problems with your data." msgstr "СиÑтема не обнаружила никаких проблем Ñ Ð’Ð°ÑˆÐ¸Ð¼Ð¸ данными." -#: aleksis/core/templates/core/data_check/list.html:40 +#: aleksis/core/templates/core/data_check/list.html:41 msgid "Detected problems" msgstr "Обнаруженные проблемы" -#: aleksis/core/templates/core/data_check/list.html:45 +#: aleksis/core/templates/core/data_check/list.html:46 msgid "Affected object" msgstr "ЗавиÑимые объекты" -#: aleksis/core/templates/core/data_check/list.html:46 +#: aleksis/core/templates/core/data_check/list.html:47 msgid "Detected problem" msgstr "Обнаружена проблема" -#: aleksis/core/templates/core/data_check/list.html:47 +#: aleksis/core/templates/core/data_check/list.html:48 msgid "Show details" msgstr "Подробнее" -#: aleksis/core/templates/core/data_check/list.html:48 +#: aleksis/core/templates/core/data_check/list.html:49 msgid "Options to solve the problem" msgstr "Варианты Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñ‹" -#: aleksis/core/templates/core/data_check/list.html:63 +#: aleksis/core/templates/core/data_check/list.html:65 msgid "Show object" msgstr "ПоÑмотреть объект" -#: aleksis/core/templates/core/data_check/list.html:86 +#: aleksis/core/templates/core/data_check/list.html:89 msgid "Registered checks" msgstr "ЗарегиÑтрированные проверки" -#: aleksis/core/templates/core/data_check/list.html:90 +#: aleksis/core/templates/core/data_check/list.html:93 msgid "" "\n" " The system will check for the following problems:\n" @@ -1916,33 +1922,38 @@ msgstr "СоÑтоÑние ÑиÑтемы" msgid "System checks" msgstr "СиÑтемные проверки" -#: aleksis/core/templates/core/pages/system_status.html:22 +#: aleksis/core/templates/core/pages/system_status.html:26 msgid "Maintenance mode enabled" msgstr "Включен режим обÑлуживаниÑ" -#: aleksis/core/templates/core/pages/system_status.html:24 +#: aleksis/core/templates/core/pages/system_status.html:28 +#, fuzzy +#| msgid "" +#| "\n" +#| " Only admin and visitors from internal IPs can access the site.\n" +#| " " msgid "" "\n" -" Only admin and visitors from internal IPs can access the site.\n" -" " +" Only admin and visitors from internal IPs can access the site.\n" +" " msgstr "" "\n" " ДоÑтуп к Ñайту имеют только админиÑтратор и пользователи Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸Ð¼Ð¸ IP-адреÑами.\n" " " -#: aleksis/core/templates/core/pages/system_status.html:36 +#: aleksis/core/templates/core/pages/system_status.html:39 msgid "Maintenance mode disabled" msgstr "Режим обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½" -#: aleksis/core/templates/core/pages/system_status.html:37 +#: aleksis/core/templates/core/pages/system_status.html:40 msgid "Everyone can access the site." msgstr "ДоÑтуп к Ñайту еÑть у вÑех." -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:51 msgid "Debug mode enabled" msgstr "Режим отладки включен" -#: aleksis/core/templates/core/pages/system_status.html:49 +#: aleksis/core/templates/core/pages/system_status.html:53 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" @@ -1952,11 +1963,11 @@ msgstr "" " Веб-Ñервер во Ð²Ñ€ÐµÐ¼Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº пишет отладочную информацию. Ðе иÑпользуйте в продакшене!\n" " " -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:60 msgid "Debug mode disabled" msgstr "Режим отладки отключен" -#: aleksis/core/templates/core/pages/system_status.html:58 +#: aleksis/core/templates/core/pages/system_status.html:62 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" @@ -1966,42 +1977,42 @@ msgstr "" " Режим отладки отключен. Ð’ Ñлучае ошибок будут отображатьÑÑ Ñтандартные Ñтраницы об ошибках.\n" " " -#: aleksis/core/templates/core/pages/system_status.html:71 +#: aleksis/core/templates/core/pages/system_status.html:75 msgid "System health checks" msgstr "Проверки работы ÑиÑтемы" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:81 msgid "Service" msgstr "Служба" -#: aleksis/core/templates/core/pages/system_status.html:78 -#: aleksis/core/templates/core/pages/system_status.html:119 +#: aleksis/core/templates/core/pages/system_status.html:82 +#: aleksis/core/templates/core/pages/system_status.html:123 msgid "Status" msgstr "СоÑтоÑние" -#: aleksis/core/templates/core/pages/system_status.html:79 +#: aleksis/core/templates/core/pages/system_status.html:83 msgid "Time taken" msgstr "ПродолжительноÑть" -#: aleksis/core/templates/core/pages/system_status.html:100 +#: aleksis/core/templates/core/pages/system_status.html:104 msgid "seconds" msgstr "Ñек" -#: aleksis/core/templates/core/pages/system_status.html:111 +#: aleksis/core/templates/core/pages/system_status.html:115 msgid "Celery task results" msgstr "Результаты Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Celery" -#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/core/pages/system_status.html:120 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "ЗаданиÑ" -#: aleksis/core/templates/core/pages/system_status.html:117 +#: aleksis/core/templates/core/pages/system_status.html:121 msgid "ID" msgstr "ID" -#: aleksis/core/templates/core/pages/system_status.html:118 +#: aleksis/core/templates/core/pages/system_status.html:122 msgid "Date done" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ" @@ -2250,11 +2261,11 @@ msgstr "Приглашение по Ñл.почте" msgid "Generate invitation code" msgstr "Создать код приглашениÑ" -#: aleksis/core/templates/invitations/forms/_invite.html:29 +#: aleksis/core/templates/invitations/forms/_invite.html:30 msgid "Generate code" msgstr "Генерирование кода" -#: aleksis/core/templates/invitations/forms/_invite.html:33 +#: aleksis/core/templates/invitations/forms/_invite.html:34 msgid "Invitations" msgstr "ПриглашениÑ" @@ -2270,7 +2281,6 @@ msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2" #: aleksis/core/templates/oauth2_provider/application/create.html:14 #: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 #: aleksis/core/templates/two_factor/_wizard_actions.html:6 msgid "Cancel" msgstr "Отменить" @@ -2344,43 +2354,26 @@ msgstr "Разрешить" msgid "Disallow" msgstr "Запретить" -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 -msgid "Revoke access" -msgstr "Отозвать доÑтуп" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Are you sure to revoke the access for this application?" -msgstr "Ви дейÑтвительно хотите отозвать доÑтуп Ð´Ð»Ñ Ñтого приложениÑ?" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 -msgid "Revoke" -msgstr "Отозвать" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "Ðвторизованные приложениÑ" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 -msgid "No authorized applications." -msgstr "Ðвторизованных приложений нет." - #: aleksis/core/templates/offline.html:5 msgid "Network error" msgstr "Ошибка Ñети" #: aleksis/core/templates/offline.html:10 -msgid "Page not available offline." -msgstr "Ð’ автономном режиме Ñтраница не доÑтупна." +msgid "No connection to server." +msgstr "" #: aleksis/core/templates/offline.html:14 +#, fuzzy +#| msgid "" +#| "\n" +#| " This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" +#| " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" +#| " administrators:\n" +#| " " msgid "" "\n" -" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" -" administrators:\n" +" This page is not available without a connection to the server. Please check your internet connection and try again.\n" +" If you are connected and the error persists, please contact the system administrators:\n" " " msgstr "" "\n" @@ -2521,6 +2514,8 @@ msgstr "" #: aleksis/core/templates/templated_email/base.email:5 #: aleksis/core/templates/templated_email/base.email:16 +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 msgid "Hello" msgstr "Привет" @@ -2597,6 +2592,24 @@ msgstr "ОпиÑание проблемы" msgid "Count of objects with new problems" msgstr "КоличеÑтво объектов Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ проблемами" +#: aleksis/core/templates/templated_email/invitation.email:4 +#, python-format +msgid "Invitation to register on %(site)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 +#, fuzzy, python-format +#| msgid "Selected persons" +msgid "Hello %(person)s" +msgstr "Выбранные физлица" + +#: aleksis/core/templates/templated_email/invitation.email:9 +#: aleksis/core/templates/templated_email/invitation.email:18 +#, python-format +msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:" +msgstr "" + #: aleksis/core/templates/templated_email/notification.email:4 msgid "New notification for" msgstr "Ðовое уведомление длÑ" @@ -3138,152 +3151,180 @@ msgstr "Во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° PDF возникла про msgid "Download PDF" msgstr "Скачать PDF" -#: aleksis/core/views.py:280 +#: aleksis/core/views.py:285 msgid "The school term has been created." msgstr "Учебный год Ñоздан." -#: aleksis/core/views.py:292 +#: aleksis/core/views.py:297 msgid "The school term has been saved." msgstr "Учебный год Ñохранён." -#: aleksis/core/views.py:396 +#: aleksis/core/views.py:401 msgid "The child groups were successfully saved." msgstr "Дочерние группы Ñохранены." -#: aleksis/core/views.py:415 aleksis/core/views.py:425 +#: aleksis/core/views.py:420 aleksis/core/views.py:430 msgid "The person has been saved." msgstr "Физлицо Ñохранено." -#: aleksis/core/views.py:475 +#: aleksis/core/views.py:480 msgid "The group has been saved." msgstr "Группа Ñохранена." -#: aleksis/core/views.py:558 +#: aleksis/core/views.py:528 +#, fuzzy +#| msgid "The data checks were run successfully." +msgid "Maintenance mode was turned on successfully." +msgstr "Проверка данных уÑпешно запущена." + +#: aleksis/core/views.py:530 +msgid "Maintenance mode was turned off successfully." +msgstr "" + +#: aleksis/core/views.py:588 msgid "The announcement has been saved." msgstr "ОбъÑвление Ñохранено." -#: aleksis/core/views.py:574 +#: aleksis/core/views.py:604 msgid "The announcement has been deleted." msgstr "ОбъÑвление удалено." -#: aleksis/core/views.py:643 +#: aleksis/core/views.py:673 msgid "The requested preference registry does not exist" msgstr "Журнал Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸ ÑвойÑтвами не ÑущеÑтвует" -#: aleksis/core/views.py:662 +#: aleksis/core/views.py:692 msgid "The preferences have been saved successfully." msgstr "СвойÑтва Ñохранены." -#: aleksis/core/views.py:686 +#: aleksis/core/views.py:716 msgid "The person has been deleted." msgstr "Физлицо удалено." -#: aleksis/core/views.py:700 +#: aleksis/core/views.py:730 msgid "The group has been deleted." msgstr "Группа удалена." -#: aleksis/core/views.py:732 +#: aleksis/core/views.py:762 msgid "The additional field has been saved." msgstr "Дополнительное поле Ñохранено." -#: aleksis/core/views.py:767 +#: aleksis/core/views.py:797 msgid "The additional field has been deleted." msgstr "Дополнительное поле удалено." -#: aleksis/core/views.py:792 +#: aleksis/core/views.py:822 msgid "The group type has been saved." msgstr "Тип группы Ñохранён." -#: aleksis/core/views.py:823 +#: aleksis/core/views.py:853 msgid "The group type has been deleted." msgstr "Тип группы удалён." -#: aleksis/core/views.py:858 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "Ð’ процеÑÑе: ЗапуÑк проверки данных" -#: aleksis/core/views.py:859 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "ЗапуÑкаетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° данных …" -#: aleksis/core/views.py:860 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "Проверка данных уÑпешно запущена." -#: aleksis/core/views.py:861 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "Во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка проверки данных возникла проблема." -#: aleksis/core/views.py:878 +#: aleksis/core/views.py:908 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "Вариант Ñ€ÐµÑˆÐµÐ½Ð¸Ñ \"{solve_option_obj.verbose_name}\" " -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:918 msgid "The requested solve option does not exist" msgstr "Запрошенный вариант Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ðµ ÑущеÑтвует" -#: aleksis/core/views.py:921 +#: aleksis/core/views.py:951 msgid "The dashboard widget has been saved." msgstr "Виджет информпанели Ñохранён." -#: aleksis/core/views.py:951 +#: aleksis/core/views.py:981 msgid "The dashboard widget has been created." msgstr "Виджет информпанели Ñоздан." -#: aleksis/core/views.py:961 +#: aleksis/core/views.py:991 msgid "The dashboard widget has been deleted." msgstr "Виджет информпанели удалён." -#: aleksis/core/views.py:1033 +#: aleksis/core/views.py:1063 msgid "Your dashboard configuration has been saved successfully." msgstr "Ваша ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð¿Ð°Ð½ÐµÐ»Ð¸ Ñохранена." -#: aleksis/core/views.py:1035 +#: aleksis/core/views.py:1065 msgid "The configuration of the default dashboard has been saved successfully." msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð¹/Ñтандартной информпанели." -#: aleksis/core/views.py:1106 +#: aleksis/core/views.py:1136 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "Приглашение уÑпешно Ñоздано. Код приглашениÑ: {code}" -#: aleksis/core/views.py:1203 +#: aleksis/core/views.py:1233 msgid "We have successfully assigned the permissions." msgstr "Мы уÑпешно назначили доÑтупы." -#: aleksis/core/views.py:1213 +#: aleksis/core/views.py:1243 msgid "The global user permission has been deleted." msgstr "Глобальный пользовательÑкий доÑтуп удалён." -#: aleksis/core/views.py:1223 +#: aleksis/core/views.py:1253 msgid "The global group permission has been deleted." msgstr "Глобальный групповой доÑтуп удалён." -#: aleksis/core/views.py:1233 +#: aleksis/core/views.py:1263 msgid "The object user permission has been deleted." msgstr "Объектный пользовательÑкий доÑтуп удалён." -#: aleksis/core/views.py:1243 +#: aleksis/core/views.py:1273 msgid "The object group permission has been deleted." msgstr "Объектный групповой доÑтуп удалён." -#: aleksis/core/views.py:1352 +#: aleksis/core/views.py:1382 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "Учётную запиÑÑŒ третьей Ñтороны Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, Ñ‚.к. Ñто единÑтвенный ÑпоÑоб входа." -#: aleksis/core/views.py:1359 +#: aleksis/core/views.py:1389 msgid "The third-party account has been successfully disconnected." msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ третьей Ñтороны уÑпешно отключена." -#: aleksis/core/views.py:1435 +#: aleksis/core/views.py:1465 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "Владелец указанного Ñл.адреÑа уÑпешно приглашён. ИнÑтрукции о дальнейших дейÑтвиÑÑ… отправлены на Ñл.почту." -#: aleksis/core/views.py:1446 +#: aleksis/core/views.py:1476 msgid "Person was already invited." msgstr "Кто-то уже приглаÑил его/её." +#~ msgid "Revoke access" +#~ msgstr "Отозвать доÑтуп" + +#~ msgid "Are you sure to revoke the access for this application?" +#~ msgstr "Ви дейÑтвительно хотите отозвать доÑтуп Ð´Ð»Ñ Ñтого приложениÑ?" + +#~ msgid "Revoke" +#~ msgstr "Отозвать" + +#~ msgid "Authorized applications" +#~ msgstr "Ðвторизованные приложениÑ" + +#~ msgid "No authorized applications." +#~ msgstr "Ðвторизованных приложений нет." + +#~ msgid "Page not available offline." +#~ msgstr "Ð’ автономном режиме Ñтраница не доÑтупна." + #~ msgid "" #~ "\n" #~ " This page is currently unavailable. If this error persists, contact your site administrators:\n" diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po index 2ceb99c7153d0eb412ca3504ce97224f6b6909fd..1b5c47ccd08980e07aac8228d3be70924eca2ede 100644 --- a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po +++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-27 13:23+0100\n" +"POT-Creation-Date: 2023-05-09 18:40+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,28 +17,32 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: aleksis/core/apps.py:155 +#: aleksis/core/apps.py:151 +msgid "You have been logged out successfully." +msgstr "" + +#: aleksis/core/apps.py:161 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:156 +#: aleksis/core/apps.py:162 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:157 +#: aleksis/core/apps.py:163 msgid "Full home postal address" msgstr "" -#: aleksis/core/apps.py:158 +#: aleksis/core/apps.py:164 msgid "Email address" msgstr "" -#: aleksis/core/apps.py:159 +#: aleksis/core/apps.py:165 msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 -#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:166 aleksis/core/forms.py:221 +#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 msgid "Groups" msgstr "" @@ -97,172 +101,172 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +#: aleksis/core/filters.py:113 aleksis/core/models.py:721 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +#: aleksis/core/filters.py:135 aleksis/core/models.py:494 msgid "Group" msgstr "" -#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +#: aleksis/core/forms.py:51 aleksis/core/forms.py:582 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +#: aleksis/core/forms.py:56 aleksis/core/tables.py:47 msgid "Address" msgstr "" -#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +#: aleksis/core/forms.py:57 aleksis/core/forms.py:591 msgid "Contact data" msgstr "" -#: aleksis/core/forms.py:58 +#: aleksis/core/forms.py:59 msgid "Advanced personal data" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "New user" msgstr "" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "Create a new account" msgstr "" -#: aleksis/core/forms.py:132 +#: aleksis/core/forms.py:133 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:136 +#: aleksis/core/forms.py:137 msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +#: aleksis/core/forms.py:154 aleksis/core/models.py:142 msgid "School term" msgstr "" -#: aleksis/core/forms.py:154 +#: aleksis/core/forms.py:155 msgid "Common data" msgstr "" -#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:208 +#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" -#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +#: aleksis/core/forms.py:157 aleksis/core/forms.py:593 msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:157 aleksis/core/models.py:217 -#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +#: aleksis/core/forms.py:158 aleksis/core/models.py:218 +#: aleksis/core/models.py:547 aleksis/core/tables.py:46 msgid "Photo" msgstr "" -#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:84 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:85 msgid "Date" msgstr "" -#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:92 +#: aleksis/core/forms.py:201 aleksis/core/forms.py:204 +#: aleksis/core/models.py:93 msgid "Time" msgstr "" -#: aleksis/core/forms.py:233 +#: aleksis/core/forms.py:234 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:236 +#: aleksis/core/forms.py:237 msgid "Who should see the announcement?" msgstr "" -#: aleksis/core/forms.py:237 +#: aleksis/core/forms.py:238 msgid "Write your announcement:" msgstr "" -#: aleksis/core/forms.py:276 +#: aleksis/core/forms.py:277 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:280 +#: aleksis/core/forms.py:281 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:289 +#: aleksis/core/forms.py:290 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:398 +#: aleksis/core/forms.py:399 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:399 +#: aleksis/core/forms.py:400 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "First name" msgstr "" -#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +#: aleksis/core/forms.py:420 aleksis/core/models.py:194 msgid "Last name" msgstr "" -#: aleksis/core/forms.py:428 +#: aleksis/core/forms.py:429 msgid "A person is using this e-mail address" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:457 msgid "Who should get the permission?" msgstr "" -#: aleksis/core/forms.py:457 +#: aleksis/core/forms.py:458 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:483 +#: aleksis/core/forms.py:484 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:486 +#: aleksis/core/forms.py:487 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:494 +#: aleksis/core/forms.py:495 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:499 +#: aleksis/core/forms.py:500 msgid "You must grant the permission to all objects or to specific objects." msgstr "" -#: aleksis/core/forms.py:586 +#: aleksis/core/forms.py:587 msgid "Address data" msgstr "" -#: aleksis/core/forms.py:598 +#: aleksis/core/forms.py:599 msgid "Account data" msgstr "" -#: aleksis/core/forms.py:605 +#: aleksis/core/forms.py:606 msgid "Password" msgstr "" -#: aleksis/core/forms.py:608 +#: aleksis/core/forms.py:609 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:761 +#: aleksis/core/forms.py:762 msgid "The selected action does not exist." msgstr "" -#: aleksis/core/forms.py:772 +#: aleksis/core/forms.py:773 msgid "You do not have permission to run {} on all selected objects." msgstr "" -#: aleksis/core/forms.py:828 +#: aleksis/core/forms.py:829 msgid "No valid selection." msgstr "" @@ -290,658 +294,658 @@ msgstr "" msgid "Linked school term" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:83 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:83 +#: aleksis/core/models.py:84 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:85 +#: aleksis/core/models.py:86 msgid "Date and time" msgstr "" -#: aleksis/core/models.py:86 +#: aleksis/core/models.py:87 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:87 aleksis/core/models.py:210 +#: aleksis/core/models.py:88 aleksis/core/models.py:211 msgid "E-mail address" msgstr "" -#: aleksis/core/models.py:88 +#: aleksis/core/models.py:89 msgid "Integer" msgstr "" -#: aleksis/core/models.py:89 +#: aleksis/core/models.py:90 msgid "IP address" msgstr "" -#: aleksis/core/models.py:90 +#: aleksis/core/models.py:91 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:91 +#: aleksis/core/models.py:92 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:93 +#: aleksis/core/models.py:94 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +#: aleksis/core/models.py:106 aleksis/core/models.py:1078 msgid "Name" msgstr "" -#: aleksis/core/models.py:107 +#: aleksis/core/models.py:108 msgid "Start date" msgstr "" -#: aleksis/core/models.py:108 +#: aleksis/core/models.py:109 msgid "End date" msgstr "" -#: aleksis/core/models.py:127 +#: aleksis/core/models.py:128 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:134 +#: aleksis/core/models.py:135 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:142 +#: aleksis/core/models.py:143 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 msgid "School terms" msgstr "" -#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +#: aleksis/core/models.py:164 aleksis/core/models.py:1027 msgid "Person" msgstr "" -#: aleksis/core/models.py:166 +#: aleksis/core/models.py:167 msgid "Can view address" msgstr "" -#: aleksis/core/models.py:167 +#: aleksis/core/models.py:168 msgid "Can view contact details" msgstr "" -#: aleksis/core/models.py:168 +#: aleksis/core/models.py:169 msgid "Can view photo" msgstr "" -#: aleksis/core/models.py:169 +#: aleksis/core/models.py:170 msgid "Can view avatar image" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:171 msgid "Can view persons groups" msgstr "" -#: aleksis/core/models.py:171 +#: aleksis/core/models.py:172 msgid "Can view personal details" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "female" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "male" msgstr "" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "other" msgstr "" -#: aleksis/core/models.py:189 aleksis/core/models.py:1353 +#: aleksis/core/models.py:190 aleksis/core/models.py:1382 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:195 +#: aleksis/core/models.py:196 msgid "Additional name(s)" msgstr "" -#: aleksis/core/models.py:199 aleksis/core/models.py:511 -#: aleksis/core/models.py:1439 +#: aleksis/core/models.py:200 aleksis/core/models.py:512 +#: aleksis/core/models.py:1468 msgid "Short name" msgstr "" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:203 msgid "Street" msgstr "" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:204 msgid "Street number" msgstr "" -#: aleksis/core/models.py:204 +#: aleksis/core/models.py:205 msgid "Postal code" msgstr "" -#: aleksis/core/models.py:205 +#: aleksis/core/models.py:206 msgid "Place" msgstr "" -#: aleksis/core/models.py:207 +#: aleksis/core/models.py:208 msgid "Home phone" msgstr "" -#: aleksis/core/models.py:208 +#: aleksis/core/models.py:209 msgid "Mobile phone" msgstr "" -#: aleksis/core/models.py:212 +#: aleksis/core/models.py:213 msgid "Date of birth" msgstr "" -#: aleksis/core/models.py:213 +#: aleksis/core/models.py:214 msgid "Place of birth" msgstr "" -#: aleksis/core/models.py:214 +#: aleksis/core/models.py:215 msgid "Sex" msgstr "" -#: aleksis/core/models.py:221 aleksis/core/models.py:550 +#: aleksis/core/models.py:222 aleksis/core/models.py:551 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:226 aleksis/core/models.py:554 +#: aleksis/core/models.py:227 aleksis/core/models.py:555 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:229 aleksis/core/models.py:557 +#: aleksis/core/models.py:230 aleksis/core/models.py:558 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:234 +#: aleksis/core/models.py:235 msgid "Guardians / Parents" msgstr "" -#: aleksis/core/models.py:241 +#: aleksis/core/models.py:242 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:244 aleksis/core/models.py:724 -#: aleksis/core/models.py:748 aleksis/core/models.py:843 -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:245 aleksis/core/models.py:725 +#: aleksis/core/models.py:749 aleksis/core/models.py:844 +#: aleksis/core/models.py:1113 msgid "Description" msgstr "" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:465 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:466 +#: aleksis/core/models.py:467 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:468 +#: aleksis/core/models.py:469 msgid "Required" msgstr "" -#: aleksis/core/models.py:469 +#: aleksis/core/models.py:470 msgid "Help text / description" msgstr "" -#: aleksis/core/models.py:475 +#: aleksis/core/models.py:476 msgid "Addtitional field for groups" msgstr "" -#: aleksis/core/models.py:476 +#: aleksis/core/models.py:477 msgid "Addtitional fields for groups" msgstr "" -#: aleksis/core/models.py:496 +#: aleksis/core/models.py:497 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:497 +#: aleksis/core/models.py:498 msgid "Can view statistics about group." msgstr "" -#: aleksis/core/models.py:509 aleksis/core/models.py:1440 +#: aleksis/core/models.py:510 aleksis/core/models.py:1469 msgid "Long name" msgstr "" -#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "" -#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:537 +#: aleksis/core/models.py:538 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:542 +#: aleksis/core/models.py:543 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 msgid "Additional fields" msgstr "" -#: aleksis/core/models.py:723 aleksis/core/models.py:747 -#: aleksis/core/models.py:842 aleksis/core/models.py:1270 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:843 aleksis/core/models.py:1299 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "" -#: aleksis/core/models.py:726 +#: aleksis/core/models.py:727 msgid "Application" msgstr "" -#: aleksis/core/models.py:732 +#: aleksis/core/models.py:733 msgid "Activity" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:734 msgid "Activities" msgstr "" -#: aleksis/core/models.py:739 +#: aleksis/core/models.py:740 msgid "Sender" msgstr "" -#: aleksis/core/models.py:744 +#: aleksis/core/models.py:745 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +#: aleksis/core/models.py:750 aleksis/core/models.py:1079 msgid "Link" msgstr "" -#: aleksis/core/models.py:752 aleksis/core/models.py:1079 -#: aleksis/core/models.py:1400 +#: aleksis/core/models.py:753 aleksis/core/models.py:1080 +#: aleksis/core/models.py:1429 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "" -#: aleksis/core/models.py:755 +#: aleksis/core/models.py:756 msgid "Send notification at" msgstr "" -#: aleksis/core/models.py:757 +#: aleksis/core/models.py:758 msgid "Read" msgstr "" -#: aleksis/core/models.py:758 +#: aleksis/core/models.py:759 msgid "Sent" msgstr "" -#: aleksis/core/models.py:775 +#: aleksis/core/models.py:776 msgid "Notification" msgstr "" -#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +#: aleksis/core/models.py:777 aleksis/core/preferences.py:29 msgid "Notifications" msgstr "" -#: aleksis/core/models.py:844 +#: aleksis/core/models.py:845 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:847 +#: aleksis/core/models.py:848 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:850 +#: aleksis/core/models.py:851 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:875 +#: aleksis/core/models.py:876 msgid "Announcement" msgstr "" -#: aleksis/core/models.py:876 +#: aleksis/core/models.py:877 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 msgid "Announcements" msgstr "" -#: aleksis/core/models.py:913 +#: aleksis/core/models.py:914 msgid "Announcement recipient" msgstr "" -#: aleksis/core/models.py:914 +#: aleksis/core/models.py:915 msgid "Announcement recipients" msgstr "" -#: aleksis/core/models.py:934 +#: aleksis/core/models.py:935 msgid "Widget Title" msgstr "" -#: aleksis/core/models.py:935 +#: aleksis/core/models.py:936 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:936 +#: aleksis/core/models.py:937 msgid "Widget is broken" msgstr "" -#: aleksis/core/models.py:939 +#: aleksis/core/models.py:940 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:940 +#: aleksis/core/models.py:941 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:945 +#: aleksis/core/models.py:946 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:946 +#: aleksis/core/models.py:947 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:952 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:952 +#: aleksis/core/models.py:953 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:958 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:959 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:989 +#: aleksis/core/models.py:990 msgid "Can edit default dashboard" msgstr "" -#: aleksis/core/models.py:990 +#: aleksis/core/models.py:991 msgid "Dashboard Widget" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:992 msgid "Dashboard Widgets" msgstr "" -#: aleksis/core/models.py:997 +#: aleksis/core/models.py:998 msgid "URL" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:999 msgid "Icon URL" msgstr "" -#: aleksis/core/models.py:1004 +#: aleksis/core/models.py:1005 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:1005 +#: aleksis/core/models.py:1006 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1012 msgid "Content" msgstr "" -#: aleksis/core/models.py:1017 +#: aleksis/core/models.py:1018 msgid "Static content widget" msgstr "" -#: aleksis/core/models.py:1018 +#: aleksis/core/models.py:1019 msgid "Static content widgets" msgstr "" -#: aleksis/core/models.py:1023 +#: aleksis/core/models.py:1024 msgid "Dashboard widget" msgstr "" -#: aleksis/core/models.py:1028 +#: aleksis/core/models.py:1029 msgid "Order" msgstr "" -#: aleksis/core/models.py:1029 +#: aleksis/core/models.py:1030 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:1044 +#: aleksis/core/models.py:1045 msgid "Dashboard widget order" msgstr "" -#: aleksis/core/models.py:1045 +#: aleksis/core/models.py:1046 msgid "Dashboard widget orders" msgstr "" -#: aleksis/core/models.py:1051 +#: aleksis/core/models.py:1052 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1064 +#: aleksis/core/models.py:1065 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1065 +#: aleksis/core/models.py:1066 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1076 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1085 +#: aleksis/core/models.py:1086 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1086 +#: aleksis/core/models.py:1087 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1111 +#: aleksis/core/models.py:1112 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50 +#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "" -#: aleksis/core/models.py:1119 +#: aleksis/core/models.py:1120 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 msgid "Group types" msgstr "" -#: aleksis/core/models.py:1132 +#: aleksis/core/models.py:1133 msgid "Can view system status" msgstr "" -#: aleksis/core/models.py:1133 +#: aleksis/core/models.py:1134 msgid "Can manage data" msgstr "" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1135 msgid "Can impersonate" msgstr "" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1136 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1136 +#: aleksis/core/models.py:1137 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1138 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1139 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1139 +#: aleksis/core/models.py:1140 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1140 +#: aleksis/core/models.py:1141 msgid "Can invite persons" msgstr "" -#: aleksis/core/models.py:1176 +#: aleksis/core/models.py:1177 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1185 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1186 msgid "Notification sent" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1199 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1199 +#: aleksis/core/models.py:1200 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1202 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1202 +#: aleksis/core/models.py:1203 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1209 +#: aleksis/core/models.py:1210 msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1241 +#: aleksis/core/models.py:1270 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1245 +#: aleksis/core/models.py:1274 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1248 +#: aleksis/core/models.py:1277 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1251 +#: aleksis/core/models.py:1280 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1258 +#: aleksis/core/models.py:1287 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1259 +#: aleksis/core/models.py:1288 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1264 +#: aleksis/core/models.py:1293 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1267 +#: aleksis/core/models.py:1296 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1271 +#: aleksis/core/models.py:1300 msgid "Back URL" msgstr "" -#: aleksis/core/models.py:1272 +#: aleksis/core/models.py:1301 msgid "Progress title" msgstr "" -#: aleksis/core/models.py:1273 +#: aleksis/core/models.py:1302 msgid "Error message" msgstr "" -#: aleksis/core/models.py:1274 +#: aleksis/core/models.py:1303 msgid "Success message" msgstr "" -#: aleksis/core/models.py:1275 +#: aleksis/core/models.py:1304 msgid "Redirect on success URL" msgstr "" -#: aleksis/core/models.py:1277 +#: aleksis/core/models.py:1306 msgid "Additional button title" msgstr "" -#: aleksis/core/models.py:1279 +#: aleksis/core/models.py:1308 msgid "Additional button URL" msgstr "" -#: aleksis/core/models.py:1281 +#: aleksis/core/models.py:1310 msgid "Additional button icon" msgstr "" -#: aleksis/core/models.py:1283 +#: aleksis/core/models.py:1312 msgid "Result fetched" msgstr "" -#: aleksis/core/models.py:1308 +#: aleksis/core/models.py:1337 msgid "Background task completed successfully" msgstr "" -#: aleksis/core/models.py:1309 +#: aleksis/core/models.py:1338 msgid "The background task '{}' has been completed successfully." msgstr "" -#: aleksis/core/models.py:1315 +#: aleksis/core/models.py:1344 msgid "Background task failed" msgstr "" -#: aleksis/core/models.py:1316 +#: aleksis/core/models.py:1345 msgid "The background task '{}' has failed." msgstr "" -#: aleksis/core/models.py:1325 +#: aleksis/core/models.py:1354 msgid "Background task" msgstr "" -#: aleksis/core/models.py:1339 +#: aleksis/core/models.py:1368 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1340 +#: aleksis/core/models.py:1369 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1356 +#: aleksis/core/models.py:1385 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1394 +#: aleksis/core/models.py:1423 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1404 +#: aleksis/core/models.py:1433 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" -#: aleksis/core/models.py:1449 +#: aleksis/core/models.py:1478 msgid "Can view room timetable" msgstr "" -#: aleksis/core/models.py:1451 +#: aleksis/core/models.py:1480 msgid "Room" msgstr "" -#: aleksis/core/models.py:1452 +#: aleksis/core/models.py:1481 msgid "Rooms" msgstr "" @@ -1153,15 +1157,15 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:549 +#: aleksis/core/settings.py:551 msgid "English" msgstr "" -#: aleksis/core/settings.py:550 +#: aleksis/core/settings.py:552 msgid "German" msgstr "" -#: aleksis/core/settings.py:551 +#: aleksis/core/settings.py:553 msgid "Ukrainian" msgstr "" @@ -1173,14 +1177,14 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:27 aleksis/core/tables.py:148 -#: aleksis/core/tables.py:192 +#: aleksis/core/tables.py:185 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" #: aleksis/core/tables.py:115 aleksis/core/tables.py:116 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146 -#: aleksis/core/tables.py:190 +#: aleksis/core/tables.py:183 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 @@ -1229,7 +1233,7 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/500.html:21 +#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22 msgid "Retry" msgstr "" @@ -1543,62 +1547,62 @@ msgstr "" msgid "Edit default dashboard" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 +#: aleksis/core/templates/core/data_check/list.html:11 msgid "Data checks" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:15 +#: aleksis/core/templates/core/data_check/list.html:16 msgid "Check data again" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:22 +#: aleksis/core/templates/core/data_check/list.html:23 msgid "The system detected some problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:23 +#: aleksis/core/templates/core/data_check/list.html:24 msgid "" "Please go through all data and check whether some extra action is\n" " needed." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:31 +#: aleksis/core/templates/core/data_check/list.html:32 msgid "Everything is fine." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:32 +#: aleksis/core/templates/core/data_check/list.html:33 msgid "The system hasn't detected any problems with your data." msgstr "" -#: aleksis/core/templates/core/data_check/list.html:40 +#: aleksis/core/templates/core/data_check/list.html:41 msgid "Detected problems" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:45 +#: aleksis/core/templates/core/data_check/list.html:46 msgid "Affected object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:46 +#: aleksis/core/templates/core/data_check/list.html:47 msgid "Detected problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:47 +#: aleksis/core/templates/core/data_check/list.html:48 msgid "Show details" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:48 +#: aleksis/core/templates/core/data_check/list.html:49 msgid "Options to solve the problem" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:63 +#: aleksis/core/templates/core/data_check/list.html:65 msgid "Show object" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:86 +#: aleksis/core/templates/core/data_check/list.html:89 msgid "Registered checks" msgstr "" -#: aleksis/core/templates/core/data_check/list.html:90 +#: aleksis/core/templates/core/data_check/list.html:93 msgid "" "\n" " The system will check for the following problems:\n" @@ -1820,83 +1824,83 @@ msgstr "" msgid "System checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:22 +#: aleksis/core/templates/core/pages/system_status.html:26 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:24 +#: aleksis/core/templates/core/pages/system_status.html:28 msgid "" "\n" -" Only admin and visitors from internal IPs can access the site.\n" -" " +" Only admin and visitors from internal IPs can access the site.\n" +" " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:36 +#: aleksis/core/templates/core/pages/system_status.html:39 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:37 +#: aleksis/core/templates/core/pages/system_status.html:40 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:51 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:49 +#: aleksis/core/templates/core/pages/system_status.html:53 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:60 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:58 +#: aleksis/core/templates/core/pages/system_status.html:62 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:71 +#: aleksis/core/templates/core/pages/system_status.html:75 msgid "System health checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:81 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:78 -#: aleksis/core/templates/core/pages/system_status.html:119 +#: aleksis/core/templates/core/pages/system_status.html:82 +#: aleksis/core/templates/core/pages/system_status.html:123 msgid "Status" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:79 +#: aleksis/core/templates/core/pages/system_status.html:83 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:100 +#: aleksis/core/templates/core/pages/system_status.html:104 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:111 +#: aleksis/core/templates/core/pages/system_status.html:115 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/core/pages/system_status.html:120 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:117 +#: aleksis/core/templates/core/pages/system_status.html:121 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:118 +#: aleksis/core/templates/core/pages/system_status.html:122 msgid "Date done" msgstr "" @@ -2120,11 +2124,11 @@ msgstr "" msgid "Generate invitation code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:29 +#: aleksis/core/templates/invitations/forms/_invite.html:30 msgid "Generate code" msgstr "" -#: aleksis/core/templates/invitations/forms/_invite.html:33 +#: aleksis/core/templates/invitations/forms/_invite.html:34 msgid "Invitations" msgstr "" @@ -2140,7 +2144,6 @@ msgstr "" #: aleksis/core/templates/oauth2_provider/application/create.html:14 #: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 #: aleksis/core/templates/two_factor/_wizard_actions.html:6 msgid "Cancel" msgstr "" @@ -2214,43 +2217,19 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 -msgid "Revoke access" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Are you sure to revoke the access for this application?" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 -msgid "Revoke" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 -msgid "No authorized applications." -msgstr "" - #: aleksis/core/templates/offline.html:5 msgid "Network error" msgstr "" #: aleksis/core/templates/offline.html:10 -msgid "Page not available offline." +msgid "No connection to server." msgstr "" #: aleksis/core/templates/offline.html:14 msgid "" "\n" -" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" -" administrators:\n" +" This page is not available without a connection to the server. Please check your internet connection and try again.\n" +" If you are connected and the error persists, please contact the system administrators:\n" " " msgstr "" @@ -2368,6 +2347,8 @@ msgstr "" #: aleksis/core/templates/templated_email/base.email:5 #: aleksis/core/templates/templated_email/base.email:16 +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 msgid "Hello" msgstr "" @@ -2435,6 +2416,23 @@ msgstr "" msgid "Count of objects with new problems" msgstr "" +#: aleksis/core/templates/templated_email/invitation.email:4 +#, python-format +msgid "Invitation to register on %(site)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 +#, python-format +msgid "Hello %(person)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:9 +#: aleksis/core/templates/templated_email/invitation.email:18 +#, python-format +msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:" +msgstr "" + #: aleksis/core/templates/templated_email/notification.email:4 msgid "New notification for" msgstr "" @@ -2814,148 +2812,156 @@ msgstr "" msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:280 +#: aleksis/core/views.py:285 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:292 +#: aleksis/core/views.py:297 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:396 +#: aleksis/core/views.py:401 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:415 aleksis/core/views.py:425 +#: aleksis/core/views.py:420 aleksis/core/views.py:430 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:475 +#: aleksis/core/views.py:480 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:558 +#: aleksis/core/views.py:528 +msgid "Maintenance mode was turned on successfully." +msgstr "" + +#: aleksis/core/views.py:530 +msgid "Maintenance mode was turned off successfully." +msgstr "" + +#: aleksis/core/views.py:588 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:574 +#: aleksis/core/views.py:604 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:643 +#: aleksis/core/views.py:673 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:662 +#: aleksis/core/views.py:692 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:686 +#: aleksis/core/views.py:716 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:700 +#: aleksis/core/views.py:730 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:732 +#: aleksis/core/views.py:762 msgid "The additional field has been saved." msgstr "" -#: aleksis/core/views.py:767 +#: aleksis/core/views.py:797 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:792 +#: aleksis/core/views.py:822 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:823 +#: aleksis/core/views.py:853 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:858 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:859 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:860 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:861 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:878 +#: aleksis/core/views.py:908 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:918 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:921 +#: aleksis/core/views.py:951 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:951 +#: aleksis/core/views.py:981 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:961 +#: aleksis/core/views.py:991 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1033 +#: aleksis/core/views.py:1063 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1035 +#: aleksis/core/views.py:1065 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1106 +#: aleksis/core/views.py:1136 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1203 +#: aleksis/core/views.py:1233 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1213 +#: aleksis/core/views.py:1243 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1223 +#: aleksis/core/views.py:1253 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1233 +#: aleksis/core/views.py:1263 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1243 +#: aleksis/core/views.py:1273 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1352 +#: aleksis/core/views.py:1382 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1359 +#: aleksis/core/views.py:1389 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1435 +#: aleksis/core/views.py:1465 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1446 +#: aleksis/core/views.py:1476 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/uk/LC_MESSAGES/django.po b/aleksis/core/locale/uk/LC_MESSAGES/django.po index 47a3acdd5c56fcab325159574991bae5ef8c6a8a..ee55e2d09212a1cac0e020242e4c95b47d08c531 100644 --- a/aleksis/core/locale/uk/LC_MESSAGES/django.po +++ b/aleksis/core/locale/uk/LC_MESSAGES/django.po @@ -18,28 +18,34 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" "X-Generator: Weblate 4.12.1\n" -#: aleksis/core/apps.py:155 +#: aleksis/core/apps.py:151 +#, fuzzy +#| msgid "The preferences have been saved successfully." +msgid "You have been logged out successfully." +msgstr "ВлаÑтивоÑті збережені." + +#: aleksis/core/apps.py:161 msgid "OpenID Connect scope" msgstr "Межа дії OpenID Connect" -#: aleksis/core/apps.py:156 +#: aleksis/core/apps.py:162 msgid "Given name, family name, link to profile and picture if existing." msgstr "Ім'Ñ, прізвище, поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° профіль та фото, Ñкщо Ñ” в наÑвноÑті." -#: aleksis/core/apps.py:157 +#: aleksis/core/apps.py:163 msgid "Full home postal address" msgstr "Повна Ð´Ð¾Ð¼Ð°ÑˆÐ½Ñ Ð¿Ð¾ÑˆÑ‚Ð¾Ð²Ð° адреÑа" -#: aleksis/core/apps.py:158 +#: aleksis/core/apps.py:164 msgid "Email address" msgstr "Ел.адреÑа" -#: aleksis/core/apps.py:159 +#: aleksis/core/apps.py:165 msgid "Home and mobile phone" msgstr "Домашній та мобільний телефони" -#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 -#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:166 aleksis/core/forms.py:221 +#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 msgid "Groups" msgstr "Групи" @@ -98,172 +104,172 @@ msgstr "Дозвіл" msgid "Content type" msgstr "Тип зміÑту" -#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +#: aleksis/core/filters.py:113 aleksis/core/models.py:721 msgid "User" msgstr "КориÑтувач" -#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +#: aleksis/core/filters.py:135 aleksis/core/models.py:494 msgid "Group" msgstr "Група" -#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +#: aleksis/core/forms.py:51 aleksis/core/forms.py:582 msgid "Base data" msgstr "ОÑновні дані" -#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +#: aleksis/core/forms.py:56 aleksis/core/tables.py:47 msgid "Address" msgstr "ÐдреÑа" -#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +#: aleksis/core/forms.py:57 aleksis/core/forms.py:591 msgid "Contact data" msgstr "Контактні дані" -#: aleksis/core/forms.py:58 +#: aleksis/core/forms.py:59 msgid "Advanced personal data" msgstr "Додаткові оÑобиÑті дані" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "New user" msgstr "Ðовий кориÑтувач" -#: aleksis/core/forms.py:106 +#: aleksis/core/forms.py:107 msgid "Create a new account" msgstr "Створити новий обліковий запиÑ" -#: aleksis/core/forms.py:132 +#: aleksis/core/forms.py:133 msgid "You cannot set a new username when also selecting an existing user." msgstr "Обравши вже Ñ–Ñнуючого кориÑтувача неможливо Ñтворити новий логін." -#: aleksis/core/forms.py:136 +#: aleksis/core/forms.py:137 msgid "This username is already in use." msgstr "Такий логін вже зайнÑтий." -#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +#: aleksis/core/forms.py:154 aleksis/core/models.py:142 msgid "School term" msgstr "Ðавчальний рік" -#: aleksis/core/forms.py:154 +#: aleksis/core/forms.py:155 msgid "Common data" msgstr "Загальні дані" -#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:208 +#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "ОÑоби" -#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +#: aleksis/core/forms.py:157 aleksis/core/forms.py:593 msgid "Additional data" msgstr "Додаткові дані" -#: aleksis/core/forms.py:157 aleksis/core/models.py:217 -#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +#: aleksis/core/forms.py:158 aleksis/core/models.py:218 +#: aleksis/core/models.py:547 aleksis/core/tables.py:46 msgid "Photo" msgstr "Фото" -#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:84 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:85 msgid "Date" msgstr "Дата" -#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:92 +#: aleksis/core/forms.py:201 aleksis/core/forms.py:204 +#: aleksis/core/models.py:93 msgid "Time" msgstr "ЧаÑ" -#: aleksis/core/forms.py:233 +#: aleksis/core/forms.py:234 msgid "From when until when should the announcement be displayed?" msgstr "З Ñкого по Ñкий Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ відображатиÑÑ Ñ†Ðµ оголошеннÑ?" -#: aleksis/core/forms.py:236 +#: aleksis/core/forms.py:237 msgid "Who should see the announcement?" msgstr "Хто повинен бачити це оголошеннÑ?" -#: aleksis/core/forms.py:237 +#: aleksis/core/forms.py:238 msgid "Write your announcement:" msgstr "Складіть Ñвоє оголошенÑ:" -#: aleksis/core/forms.py:276 +#: aleksis/core/forms.py:277 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¼Ð¸Ð½ÑƒÐ»Ð¾Ð³Ð¾ Вам Ñтворювати не дозволено." -#: aleksis/core/forms.py:280 +#: aleksis/core/forms.py:281 msgid "The from date and time must be earlier then the until date and time." msgstr "Дата Ñ– Ñ‡Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ повинні бути раніше за дату Ñ– Ñ‡Ð°Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ." -#: aleksis/core/forms.py:289 +#: aleksis/core/forms.py:290 msgid "You need at least one recipient." msgstr "Вам потрібен принаймні один отримувач." -#: aleksis/core/forms.py:398 +#: aleksis/core/forms.py:399 msgid "Invitation code" msgstr "Код запрошеннÑ" -#: aleksis/core/forms.py:399 +#: aleksis/core/forms.py:400 msgid "Please enter your invitation code." msgstr "Ðапишіть, будь лаÑка, Ñвій код запрошеннÑ." -#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "First name" msgstr "Ім'Ñ" -#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +#: aleksis/core/forms.py:420 aleksis/core/models.py:194 msgid "Last name" msgstr "Прізвище" -#: aleksis/core/forms.py:428 +#: aleksis/core/forms.py:429 msgid "A person is using this e-mail address" msgstr "Цією ел.адреÑою хтоÑÑŒ кориÑтуєтьÑÑ" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:457 msgid "Who should get the permission?" msgstr "Хто повинен отримати такий дозвіл?" -#: aleksis/core/forms.py:457 +#: aleksis/core/forms.py:458 msgid "On what?" msgstr "Ð’ разі чого?" -#: aleksis/core/forms.py:483 +#: aleksis/core/forms.py:484 msgid "Select objects which the permission should be granted for:" msgstr "Оберіть об'єкти, до Ñких буде наданий дозвіл:" -#: aleksis/core/forms.py:486 +#: aleksis/core/forms.py:487 msgid "Grant the permission for all objects" msgstr "Ðадати дозвіл до вÑÑ–Ñ… об'єктів" -#: aleksis/core/forms.py:494 +#: aleksis/core/forms.py:495 msgid "You must select at least one group or person which should get the permission." msgstr "Ви повинні обрати принаймні одну групу або оÑобу, хто буде мати дозвіл." -#: aleksis/core/forms.py:499 +#: aleksis/core/forms.py:500 msgid "You must grant the permission to all objects or to specific objects." msgstr "Ви повинні надати дозвіл до вÑÑ–Ñ… або до конкретних об'єктів." -#: aleksis/core/forms.py:586 +#: aleksis/core/forms.py:587 msgid "Address data" msgstr "Дані адреÑи" -#: aleksis/core/forms.py:598 +#: aleksis/core/forms.py:599 msgid "Account data" msgstr "Дані облікового запиÑу" -#: aleksis/core/forms.py:605 +#: aleksis/core/forms.py:606 msgid "Password" msgstr "Пароль" -#: aleksis/core/forms.py:608 +#: aleksis/core/forms.py:609 msgid "Password (again)" msgstr "Пароль (ще раз)" -#: aleksis/core/forms.py:761 +#: aleksis/core/forms.py:762 msgid "The selected action does not exist." msgstr "Обрана Ð´Ñ–Ñ Ð½Ðµ Ñ–Ñнує." -#: aleksis/core/forms.py:772 +#: aleksis/core/forms.py:773 msgid "You do not have permission to run {} on all selected objects." msgstr "У Ð’Ð°Ñ Ð²Ñ–Ð´Ñутній дозвіл на запуÑк {} на уÑÑ–Ñ… обраних об'єктах." -#: aleksis/core/forms.py:828 +#: aleksis/core/forms.py:829 msgid "No valid selection." msgstr "Ðеправильний вибір." @@ -291,658 +297,658 @@ msgstr "Результат резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ðµ зна msgid "Linked school term" msgstr "Пов'Ñзаний навчальний рік" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:83 msgid "Boolean (Yes/No)" msgstr "Логічне (Так/ÐÑ–)" -#: aleksis/core/models.py:83 +#: aleksis/core/models.py:84 msgid "Text (one line)" msgstr "ТекÑÑ‚ (один Ñ€Ñдок)" -#: aleksis/core/models.py:85 +#: aleksis/core/models.py:86 msgid "Date and time" msgstr "Дата Ñ– чаÑ" -#: aleksis/core/models.py:86 +#: aleksis/core/models.py:87 msgid "Decimal number" msgstr "ДеÑÑтичне чиÑло" -#: aleksis/core/models.py:87 aleksis/core/models.py:210 +#: aleksis/core/models.py:88 aleksis/core/models.py:211 msgid "E-mail address" msgstr "ÐдреÑа ел.пошти" -#: aleksis/core/models.py:88 +#: aleksis/core/models.py:89 msgid "Integer" msgstr "Ціле" -#: aleksis/core/models.py:89 +#: aleksis/core/models.py:90 msgid "IP address" msgstr "IP адреÑа" -#: aleksis/core/models.py:90 +#: aleksis/core/models.py:91 msgid "Boolean or empty (Yes/No/Neither)" msgstr "Логічне або порожнє (Так/ÐÑ–/Ðічого)" -#: aleksis/core/models.py:91 +#: aleksis/core/models.py:92 msgid "Text (multi-line)" msgstr "ТекÑÑ‚ (багаторÑдковий)" -#: aleksis/core/models.py:93 +#: aleksis/core/models.py:94 msgid "URL / Link" msgstr "URL / ПоÑиланнÑ" -#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +#: aleksis/core/models.py:106 aleksis/core/models.py:1078 msgid "Name" msgstr "Повне ім'Ñ" -#: aleksis/core/models.py:107 +#: aleksis/core/models.py:108 msgid "Start date" msgstr "Дата початку" -#: aleksis/core/models.py:108 +#: aleksis/core/models.py:109 msgid "End date" msgstr "Дата закінченнÑ" -#: aleksis/core/models.py:127 +#: aleksis/core/models.py:128 msgid "The start date must be earlier than the end date." msgstr "Початкова дата повинна бути раніше кінцевої." -#: aleksis/core/models.py:134 +#: aleksis/core/models.py:135 msgid "There is already a school term for this time or a part of this time." msgstr "Ðа цей Ñ‡Ð°Ñ Ð°Ð±Ð¾ на чаÑтину цього чаÑу вже припадає навчальний рік." -#: aleksis/core/models.py:142 +#: aleksis/core/models.py:143 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 msgid "School terms" msgstr "Ðавчальний рік" -#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +#: aleksis/core/models.py:164 aleksis/core/models.py:1027 msgid "Person" msgstr "ОÑоба" -#: aleksis/core/models.py:166 +#: aleksis/core/models.py:167 msgid "Can view address" msgstr "Може бачити адреÑу" -#: aleksis/core/models.py:167 +#: aleksis/core/models.py:168 msgid "Can view contact details" msgstr "Може бачити контактні дані" -#: aleksis/core/models.py:168 +#: aleksis/core/models.py:169 msgid "Can view photo" msgstr "Може бачити фото" -#: aleksis/core/models.py:169 +#: aleksis/core/models.py:170 msgid "Can view avatar image" msgstr "Може бачити аватар" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:171 msgid "Can view persons groups" msgstr "Може бачити групи оÑоби" -#: aleksis/core/models.py:171 +#: aleksis/core/models.py:172 msgid "Can view personal details" msgstr "Може бачити оÑобиÑті дані" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "female" msgstr "жін" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "male" msgstr "чол" -#: aleksis/core/models.py:181 +#: aleksis/core/models.py:182 msgid "other" msgstr "інший" -#: aleksis/core/models.py:189 aleksis/core/models.py:1353 +#: aleksis/core/models.py:190 aleksis/core/models.py:1382 msgid "Linked user" msgstr "Пов'Ñзаний кориÑтувач" -#: aleksis/core/models.py:195 +#: aleksis/core/models.py:196 msgid "Additional name(s)" msgstr "Додаткові імена" -#: aleksis/core/models.py:199 aleksis/core/models.py:511 -#: aleksis/core/models.py:1439 +#: aleksis/core/models.py:200 aleksis/core/models.py:512 +#: aleksis/core/models.py:1468 msgid "Short name" msgstr "Коротке ім'Ñ" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:203 msgid "Street" msgstr "ВулицÑ" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:204 msgid "Street number" msgstr "Ðомер будинку" -#: aleksis/core/models.py:204 +#: aleksis/core/models.py:205 msgid "Postal code" msgstr "Поштовий індекÑ" -#: aleksis/core/models.py:205 +#: aleksis/core/models.py:206 msgid "Place" msgstr "МіÑто" -#: aleksis/core/models.py:207 +#: aleksis/core/models.py:208 msgid "Home phone" msgstr "Домашній телефон" -#: aleksis/core/models.py:208 +#: aleksis/core/models.py:209 msgid "Mobile phone" msgstr "Мобільний телефон" -#: aleksis/core/models.py:212 +#: aleksis/core/models.py:213 msgid "Date of birth" msgstr "Дата народженнÑ" -#: aleksis/core/models.py:213 +#: aleksis/core/models.py:214 msgid "Place of birth" msgstr "МіÑце народженнÑ" -#: aleksis/core/models.py:214 +#: aleksis/core/models.py:215 msgid "Sex" msgstr "Стать" -#: aleksis/core/models.py:221 aleksis/core/models.py:550 +#: aleksis/core/models.py:222 aleksis/core/models.py:551 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "Це офіційне фото, Ñке викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² та внутрішніх потреб." -#: aleksis/core/models.py:226 aleksis/core/models.py:554 +#: aleksis/core/models.py:227 aleksis/core/models.py:555 msgid "Display picture / Avatar" msgstr "Відобразити фото/аватар" -#: aleksis/core/models.py:229 aleksis/core/models.py:557 +#: aleksis/core/models.py:230 aleksis/core/models.py:558 msgid "This is a picture or an avatar for public display." msgstr "Це фото або аватар Ð´Ð»Ñ Ð·Ð°Ð³Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ відображеннÑ." -#: aleksis/core/models.py:234 +#: aleksis/core/models.py:235 msgid "Guardians / Parents" msgstr "Опікуни / батьки" -#: aleksis/core/models.py:241 +#: aleksis/core/models.py:242 msgid "Primary group" msgstr "ОÑновна група" -#: aleksis/core/models.py:244 aleksis/core/models.py:724 -#: aleksis/core/models.py:748 aleksis/core/models.py:843 -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:245 aleksis/core/models.py:725 +#: aleksis/core/models.py:749 aleksis/core/models.py:844 +#: aleksis/core/models.py:1113 msgid "Description" msgstr "ОпиÑ" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:465 msgid "Title of field" msgstr "Ðазва полÑ" -#: aleksis/core/models.py:466 +#: aleksis/core/models.py:467 msgid "Type of field" msgstr "Тип полÑ" -#: aleksis/core/models.py:468 +#: aleksis/core/models.py:469 msgid "Required" msgstr "Ðеобхідне" -#: aleksis/core/models.py:469 +#: aleksis/core/models.py:470 msgid "Help text / description" msgstr "Допоміжний текÑÑ‚/опиÑ" -#: aleksis/core/models.py:475 +#: aleksis/core/models.py:476 msgid "Addtitional field for groups" msgstr "Додаткове поле Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿" -#: aleksis/core/models.py:476 +#: aleksis/core/models.py:477 msgid "Addtitional fields for groups" msgstr "Додаткові Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿" -#: aleksis/core/models.py:496 +#: aleksis/core/models.py:497 msgid "Can assign child groups to groups" msgstr "Може призначати підлеглі групи до груп" -#: aleksis/core/models.py:497 +#: aleksis/core/models.py:498 msgid "Can view statistics about group." msgstr "Може бачити ÑтатиÑтику групи." -#: aleksis/core/models.py:509 aleksis/core/models.py:1440 +#: aleksis/core/models.py:510 aleksis/core/models.py:1469 msgid "Long name" msgstr "Довге ім'Ñ" -#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "УчаÑники" -#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "ВлаÑники" -#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "БатьківÑькі групи" -#: aleksis/core/models.py:537 +#: aleksis/core/models.py:538 msgid "Type of group" msgstr "Тип групи" -#: aleksis/core/models.py:542 +#: aleksis/core/models.py:543 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 msgid "Additional fields" msgstr "Додаткові полÑ" -#: aleksis/core/models.py:723 aleksis/core/models.py:747 -#: aleksis/core/models.py:842 aleksis/core/models.py:1270 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:843 aleksis/core/models.py:1299 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "Ðазва" -#: aleksis/core/models.py:726 +#: aleksis/core/models.py:727 msgid "Application" msgstr "Додаток" -#: aleksis/core/models.py:732 +#: aleksis/core/models.py:733 msgid "Activity" msgstr "ÐктивніÑть" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:734 msgid "Activities" msgstr "ÐктивноÑті" -#: aleksis/core/models.py:739 +#: aleksis/core/models.py:740 msgid "Sender" msgstr "Відправник" -#: aleksis/core/models.py:744 +#: aleksis/core/models.py:745 msgid "Recipient" msgstr "Отримувач" -#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +#: aleksis/core/models.py:750 aleksis/core/models.py:1079 msgid "Link" msgstr "ПоÑиланнÑ" -#: aleksis/core/models.py:752 aleksis/core/models.py:1079 -#: aleksis/core/models.py:1400 +#: aleksis/core/models.py:753 aleksis/core/models.py:1080 +#: aleksis/core/models.py:1429 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "Піктограма" -#: aleksis/core/models.py:755 +#: aleksis/core/models.py:756 msgid "Send notification at" msgstr "ÐадіÑлати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¾" -#: aleksis/core/models.py:757 +#: aleksis/core/models.py:758 msgid "Read" msgstr "Читати" -#: aleksis/core/models.py:758 +#: aleksis/core/models.py:759 msgid "Sent" msgstr "ÐадіÑлано" -#: aleksis/core/models.py:775 +#: aleksis/core/models.py:776 msgid "Notification" msgstr "СповіщеннÑ" -#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +#: aleksis/core/models.py:777 aleksis/core/preferences.py:29 msgid "Notifications" msgstr "СповіщеннÑ" -#: aleksis/core/models.py:844 +#: aleksis/core/models.py:845 msgid "Link to detailed view" msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° детальний переглÑд" -#: aleksis/core/models.py:847 +#: aleksis/core/models.py:848 msgid "Date and time from when to show" msgstr "Дата Ñ– чаÑ, з Ñкого показувати" -#: aleksis/core/models.py:850 +#: aleksis/core/models.py:851 msgid "Date and time until when to show" msgstr "Дата Ñ– чаÑ, до Ñкого показувати" -#: aleksis/core/models.py:875 +#: aleksis/core/models.py:876 msgid "Announcement" msgstr "ОголошеннÑ" -#: aleksis/core/models.py:876 +#: aleksis/core/models.py:877 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 msgid "Announcements" msgstr "ОголошеннÑ" -#: aleksis/core/models.py:913 +#: aleksis/core/models.py:914 msgid "Announcement recipient" msgstr "Отримувач оголошеннÑ" -#: aleksis/core/models.py:914 +#: aleksis/core/models.py:915 msgid "Announcement recipients" msgstr "Отримувачі оголошеннÑ" -#: aleksis/core/models.py:934 +#: aleksis/core/models.py:935 msgid "Widget Title" msgstr "Ðазва віджета" -#: aleksis/core/models.py:935 +#: aleksis/core/models.py:936 msgid "Activate Widget" msgstr "Ðктивувати віджет" -#: aleksis/core/models.py:936 +#: aleksis/core/models.py:937 msgid "Widget is broken" msgstr "Віджет зламавÑÑ" -#: aleksis/core/models.py:939 +#: aleksis/core/models.py:940 msgid "Size on mobile devices" msgstr "Розмір на мобільних" -#: aleksis/core/models.py:940 +#: aleksis/core/models.py:941 msgid "<= 600 px, 12 columns" msgstr "<= 600 пікÑ, 12 Ñтовпчиків" -#: aleksis/core/models.py:945 +#: aleksis/core/models.py:946 msgid "Size on tablet devices" msgstr "Розмір на планшетах" -#: aleksis/core/models.py:946 +#: aleksis/core/models.py:947 msgid "> 600 px, 12 columns" msgstr "> 600 пікÑ, 12 Ñтовпчиків" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:952 msgid "Size on desktop devices" msgstr "Розмір на ПК" -#: aleksis/core/models.py:952 +#: aleksis/core/models.py:953 msgid "> 992 px, 12 columns" msgstr "> 992 пікÑ, 12 Ñтовпчиків" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:958 msgid "Size on large desktop devices" msgstr "Розмір на великих екранах" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:959 msgid "> 1200 px>, 12 columns" msgstr "> 1200 пікÑ, 12 Ñтовпчиків" -#: aleksis/core/models.py:989 +#: aleksis/core/models.py:990 msgid "Can edit default dashboard" msgstr "Може редагувати типову/Ñтандартну інформпанель" -#: aleksis/core/models.py:990 +#: aleksis/core/models.py:991 msgid "Dashboard Widget" msgstr "Віджет інформпанелі" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:992 msgid "Dashboard Widgets" msgstr "Віджети інформпанелі" -#: aleksis/core/models.py:997 +#: aleksis/core/models.py:998 msgid "URL" msgstr "URL" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:999 msgid "Icon URL" msgstr "Піктограма URL" -#: aleksis/core/models.py:1004 +#: aleksis/core/models.py:1005 msgid "External link widget" msgstr "Зовнішнє поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° віджет" -#: aleksis/core/models.py:1005 +#: aleksis/core/models.py:1006 msgid "External link widgets" msgstr "Зовнішні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° віджети" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1012 msgid "Content" msgstr "ЗміÑÑ‚" -#: aleksis/core/models.py:1017 +#: aleksis/core/models.py:1018 msgid "Static content widget" msgstr "Віджет з поÑтійним зміÑтом" -#: aleksis/core/models.py:1018 +#: aleksis/core/models.py:1019 msgid "Static content widgets" msgstr "Віджети з поÑтійним зміÑтом" -#: aleksis/core/models.py:1023 +#: aleksis/core/models.py:1024 msgid "Dashboard widget" msgstr "Віджет інформпанелі" -#: aleksis/core/models.py:1028 +#: aleksis/core/models.py:1029 msgid "Order" msgstr "ПорÑдок" -#: aleksis/core/models.py:1029 +#: aleksis/core/models.py:1030 msgid "Part of the default dashboard" msgstr "ЧаÑтина типової інформпанелі" -#: aleksis/core/models.py:1044 +#: aleksis/core/models.py:1045 msgid "Dashboard widget order" msgstr "ПорÑдок віджету на інформпанелі" -#: aleksis/core/models.py:1045 +#: aleksis/core/models.py:1046 msgid "Dashboard widget orders" msgstr "ПорÑдок віджетів на інформпанелі" -#: aleksis/core/models.py:1051 +#: aleksis/core/models.py:1052 msgid "Menu ID" msgstr "Меню ID" -#: aleksis/core/models.py:1064 +#: aleksis/core/models.py:1065 msgid "Custom menu" msgstr "КориÑтувацьке меню" -#: aleksis/core/models.py:1065 +#: aleksis/core/models.py:1066 msgid "Custom menus" msgstr "КориÑтувацькі меню" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1076 msgid "Menu" msgstr "Меню" -#: aleksis/core/models.py:1085 +#: aleksis/core/models.py:1086 msgid "Custom menu item" msgstr "Пункт кориÑтувацького меню" -#: aleksis/core/models.py:1086 +#: aleksis/core/models.py:1087 msgid "Custom menu items" msgstr "Пункти кориÑтувацького меню" -#: aleksis/core/models.py:1111 +#: aleksis/core/models.py:1112 msgid "Title of type" msgstr "Ðазва типу" -#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50 +#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "Тип групи" -#: aleksis/core/models.py:1119 +#: aleksis/core/models.py:1120 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 msgid "Group types" msgstr "Типи груп" -#: aleksis/core/models.py:1132 +#: aleksis/core/models.py:1133 msgid "Can view system status" msgstr "Може переглÑдати Ñтан ÑиÑтеми" -#: aleksis/core/models.py:1133 +#: aleksis/core/models.py:1134 msgid "Can manage data" msgstr "Може керувати даними" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1135 msgid "Can impersonate" msgstr "Може маÑкуватиÑÑ" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1136 msgid "Can use search" msgstr "Може шукати" -#: aleksis/core/models.py:1136 +#: aleksis/core/models.py:1137 msgid "Can change site preferences" msgstr "Може змінювати влаÑтивоÑті Ñайту" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1138 msgid "Can change person preferences" msgstr "Може змінювати влаÑтивоÑті оÑоби" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1139 msgid "Can change group preferences" msgstr "Може змінювати влаÑтивоÑті групи" -#: aleksis/core/models.py:1139 +#: aleksis/core/models.py:1140 msgid "Can test PDF generation" msgstr "Може генерувати теÑтові PDF" -#: aleksis/core/models.py:1140 +#: aleksis/core/models.py:1141 msgid "Can invite persons" msgstr "Може запрошувати оÑіб" -#: aleksis/core/models.py:1176 +#: aleksis/core/models.py:1177 msgid "Related data check task" msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ пов'Ñзаних даних" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1185 msgid "Issue solved" msgstr "Проблема вирішена" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1186 msgid "Notification sent" msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ–Ñлане" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1199 msgid "Data check result" msgstr "Результат перевірки даних" -#: aleksis/core/models.py:1199 +#: aleksis/core/models.py:1200 msgid "Data check results" msgstr "Результати перевірки даних" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1202 msgid "Can run data checks" msgstr "Може запуÑкати перевірки даних" -#: aleksis/core/models.py:1202 +#: aleksis/core/models.py:1203 msgid "Can solve data check problems" msgstr "Може розв'Ñзувати проблеми перевірки даних" -#: aleksis/core/models.py:1209 +#: aleksis/core/models.py:1210 msgid "E-Mail address" msgstr "ÐдреÑа ел.пошти" -#: aleksis/core/models.py:1241 +#: aleksis/core/models.py:1270 msgid "Owner" msgstr "ВлаÑник" -#: aleksis/core/models.py:1245 +#: aleksis/core/models.py:1274 msgid "File expires at" msgstr "Файл дійÑний до" -#: aleksis/core/models.py:1248 +#: aleksis/core/models.py:1277 msgid "Generated HTML file" msgstr "Згенерований файл HTML" -#: aleksis/core/models.py:1251 +#: aleksis/core/models.py:1280 msgid "Generated PDF file" msgstr "Згенерований файл PDF" -#: aleksis/core/models.py:1258 +#: aleksis/core/models.py:1287 msgid "PDF file" msgstr "Файл PDF" -#: aleksis/core/models.py:1259 +#: aleksis/core/models.py:1288 msgid "PDF files" msgstr "Файли PDF" -#: aleksis/core/models.py:1264 +#: aleksis/core/models.py:1293 msgid "Task result" msgstr "Результат завданнÑ" -#: aleksis/core/models.py:1267 +#: aleksis/core/models.py:1296 msgid "Task user" msgstr "КориÑтувач завданнÑ" -#: aleksis/core/models.py:1271 +#: aleksis/core/models.py:1300 msgid "Back URL" msgstr "URL Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ" -#: aleksis/core/models.py:1272 +#: aleksis/core/models.py:1301 msgid "Progress title" msgstr "Ðазва процеÑу" -#: aleksis/core/models.py:1273 +#: aleksis/core/models.py:1302 msgid "Error message" msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку" -#: aleksis/core/models.py:1274 +#: aleksis/core/models.py:1303 msgid "Success message" msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ уÑпіх" -#: aleksis/core/models.py:1275 +#: aleksis/core/models.py:1304 msgid "Redirect on success URL" msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð² разі уÑпіху" -#: aleksis/core/models.py:1277 +#: aleksis/core/models.py:1306 msgid "Additional button title" msgstr "Ðазва додаткової кнопки" -#: aleksis/core/models.py:1279 +#: aleksis/core/models.py:1308 msgid "Additional button URL" msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— кнопки" -#: aleksis/core/models.py:1281 +#: aleksis/core/models.py:1310 msgid "Additional button icon" msgstr "Піктограма додаткової кнопки" -#: aleksis/core/models.py:1283 +#: aleksis/core/models.py:1312 msgid "Result fetched" msgstr "Отриманий результат" -#: aleksis/core/models.py:1308 +#: aleksis/core/models.py:1337 msgid "Background task completed successfully" msgstr "Фонове Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑƒÑпішно завершене" -#: aleksis/core/models.py:1309 +#: aleksis/core/models.py:1338 msgid "The background task '{}' has been completed successfully." msgstr "Фонове Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ '{}' було уÑпішно завершене." -#: aleksis/core/models.py:1315 +#: aleksis/core/models.py:1344 msgid "Background task failed" msgstr "Збій фонового завданнÑ" -#: aleksis/core/models.py:1316 +#: aleksis/core/models.py:1345 msgid "The background task '{}' has failed." msgstr "У фонового Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ '{}' ÑтавÑÑ Ð·Ð±Ñ–Ð¹." -#: aleksis/core/models.py:1325 +#: aleksis/core/models.py:1354 msgid "Background task" msgstr "Фонове завданнÑ" -#: aleksis/core/models.py:1339 +#: aleksis/core/models.py:1368 msgid "Task user assignment" msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача завданнÑ" -#: aleksis/core/models.py:1340 +#: aleksis/core/models.py:1369 msgid "Task user assignments" msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів завданнÑ" -#: aleksis/core/models.py:1356 +#: aleksis/core/models.py:1385 msgid "Additional attributes" msgstr "Додаткові атрибути" -#: aleksis/core/models.py:1394 +#: aleksis/core/models.py:1423 msgid "Allowed scopes that clients can request" msgstr "Дозволені межі дії, Ñкі можуть запитувати клієнти" -#: aleksis/core/models.py:1404 +#: aleksis/core/models.py:1433 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "Це Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ іконкою під Ñ‡Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ—. Воно повинне бути квадратним." -#: aleksis/core/models.py:1449 +#: aleksis/core/models.py:1478 msgid "Can view room timetable" msgstr "Може переглÑдати розклад кімнати" -#: aleksis/core/models.py:1451 +#: aleksis/core/models.py:1480 msgid "Room" msgstr "Кімната" -#: aleksis/core/models.py:1452 +#: aleksis/core/models.py:1481 msgid "Rooms" msgstr "Кімнати" @@ -1154,15 +1160,15 @@ msgstr "Ðвтоматично оновлювати інформпанель Ñ‚ msgid "Country for phone number parsing" msgstr "Країна Ð´Ð»Ñ Ñ€Ð¾Ð·Ð±Ð¾Ñ€Ñƒ номера телефона" -#: aleksis/core/settings.py:549 +#: aleksis/core/settings.py:551 msgid "English" msgstr "ÐнглійÑька" -#: aleksis/core/settings.py:550 +#: aleksis/core/settings.py:552 msgid "German" msgstr "Ðімецька" -#: aleksis/core/settings.py:551 +#: aleksis/core/settings.py:553 msgid "Ukrainian" msgstr "УкраїнÑька" @@ -1174,14 +1180,14 @@ msgid "Edit" msgstr "Редагувати" #: aleksis/core/tables.py:27 aleksis/core/tables.py:148 -#: aleksis/core/tables.py:192 +#: aleksis/core/tables.py:185 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "Дії" #: aleksis/core/tables.py:115 aleksis/core/tables.py:116 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146 -#: aleksis/core/tables.py:190 +#: aleksis/core/tables.py:183 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 @@ -1246,7 +1252,7 @@ msgstr "" " Ви також можете звернутиÑÑ Ð´Ð¾ них безпоÑередньо:\n" " " -#: aleksis/core/templates/500.html:21 +#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22 msgid "Retry" msgstr "Спробувати ще" @@ -1602,20 +1608,20 @@ msgstr "Створити %(name)s" msgid "Edit default dashboard" msgstr "Редагувати типову/Ñтандартну інформпанель" -#: aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 +#: aleksis/core/templates/core/data_check/list.html:11 msgid "Data checks" msgstr "Перевірки даних" -#: aleksis/core/templates/core/data_check/list.html:15 +#: aleksis/core/templates/core/data_check/list.html:16 msgid "Check data again" msgstr "Перевірити дані ще раз" -#: aleksis/core/templates/core/data_check/list.html:22 +#: aleksis/core/templates/core/data_check/list.html:23 msgid "The system detected some problems with your data." msgstr "СиÑтема виÑвила деÑкі проблеми з Вашими даними." -#: aleksis/core/templates/core/data_check/list.html:23 +#: aleksis/core/templates/core/data_check/list.html:24 msgid "" "Please go through all data and check whether some extra action is\n" " needed." @@ -1623,43 +1629,43 @@ msgstr "" "Будь лаÑка, уважно переглÑньте уÑÑ– дані Ñ– перевірте чи не потрібно\n" " щоÑÑŒ зробити." -#: aleksis/core/templates/core/data_check/list.html:31 +#: aleksis/core/templates/core/data_check/list.html:32 msgid "Everything is fine." msgstr "Ð’Ñе чудово." -#: aleksis/core/templates/core/data_check/list.html:32 +#: aleksis/core/templates/core/data_check/list.html:33 msgid "The system hasn't detected any problems with your data." msgstr "СиÑтема не виÑвила жодних проблем з Вашими даними." -#: aleksis/core/templates/core/data_check/list.html:40 +#: aleksis/core/templates/core/data_check/list.html:41 msgid "Detected problems" msgstr "ВиÑвлені проблеми" -#: aleksis/core/templates/core/data_check/list.html:45 +#: aleksis/core/templates/core/data_check/list.html:46 msgid "Affected object" msgstr "Залежні об'єкти" -#: aleksis/core/templates/core/data_check/list.html:46 +#: aleksis/core/templates/core/data_check/list.html:47 msgid "Detected problem" msgstr "ВиÑвлена проблема" -#: aleksis/core/templates/core/data_check/list.html:47 +#: aleksis/core/templates/core/data_check/list.html:48 msgid "Show details" msgstr "Детальніше" -#: aleksis/core/templates/core/data_check/list.html:48 +#: aleksis/core/templates/core/data_check/list.html:49 msgid "Options to solve the problem" msgstr "Варіанти Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸" -#: aleksis/core/templates/core/data_check/list.html:63 +#: aleksis/core/templates/core/data_check/list.html:65 msgid "Show object" msgstr "ПереглÑнути об'єкт" -#: aleksis/core/templates/core/data_check/list.html:86 +#: aleksis/core/templates/core/data_check/list.html:89 msgid "Registered checks" msgstr "ЗареєÑтровані перевірки" -#: aleksis/core/templates/core/data_check/list.html:90 +#: aleksis/core/templates/core/data_check/list.html:93 msgid "" "\n" " The system will check for the following problems:\n" @@ -1916,33 +1922,38 @@ msgstr "Стан ÑиÑтеми" msgid "System checks" msgstr "СиÑтемні перевірки" -#: aleksis/core/templates/core/pages/system_status.html:22 +#: aleksis/core/templates/core/pages/system_status.html:26 msgid "Maintenance mode enabled" msgstr "Ðктивований режим обÑлуговуваннÑ" -#: aleksis/core/templates/core/pages/system_status.html:24 +#: aleksis/core/templates/core/pages/system_status.html:28 +#, fuzzy +#| msgid "" +#| "\n" +#| " Only admin and visitors from internal IPs can access the site.\n" +#| " " msgid "" "\n" -" Only admin and visitors from internal IPs can access the site.\n" -" " +" Only admin and visitors from internal IPs can access the site.\n" +" " msgstr "" "\n" " ДоÑтуп до Ñайту мають лише адмініÑтратор та відвідувачі з внутрішніми IP-адреÑами.\n" " " -#: aleksis/core/templates/core/pages/system_status.html:36 +#: aleksis/core/templates/core/pages/system_status.html:39 msgid "Maintenance mode disabled" msgstr "Режим обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¸Ð¹" -#: aleksis/core/templates/core/pages/system_status.html:37 +#: aleksis/core/templates/core/pages/system_status.html:40 msgid "Everyone can access the site." msgstr "ДоÑтуп до Ñайту мають уÑÑ–." -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:51 msgid "Debug mode enabled" msgstr "Ðктивований режим налагодженнÑ" -#: aleksis/core/templates/core/pages/system_status.html:49 +#: aleksis/core/templates/core/pages/system_status.html:53 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" @@ -1952,11 +1963,11 @@ msgstr "" " Веб-Ñервер кидає під Ñ‡Ð°Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº інформацію щодо налагодженнÑ. Ðе викориÑтовуйте в продакшені!\n" " " -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:60 msgid "Debug mode disabled" msgstr "Режим Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¸Ð¹" -#: aleksis/core/templates/core/pages/system_status.html:58 +#: aleksis/core/templates/core/pages/system_status.html:62 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" @@ -1966,42 +1977,42 @@ msgstr "" " Режим Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¸Ð¹. Ð’ разі збоїв відображатимутьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð²Ñ– Ñторінки помилок.\n" " " -#: aleksis/core/templates/core/pages/system_status.html:71 +#: aleksis/core/templates/core/pages/system_status.html:75 msgid "System health checks" msgstr "Перевірки роботи ÑиÑтеми" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:81 msgid "Service" msgstr "Служба" -#: aleksis/core/templates/core/pages/system_status.html:78 -#: aleksis/core/templates/core/pages/system_status.html:119 +#: aleksis/core/templates/core/pages/system_status.html:82 +#: aleksis/core/templates/core/pages/system_status.html:123 msgid "Status" msgstr "Стан" -#: aleksis/core/templates/core/pages/system_status.html:79 +#: aleksis/core/templates/core/pages/system_status.html:83 msgid "Time taken" msgstr "ТриваліÑть" -#: aleksis/core/templates/core/pages/system_status.html:100 +#: aleksis/core/templates/core/pages/system_status.html:104 msgid "seconds" msgstr "Ñек" -#: aleksis/core/templates/core/pages/system_status.html:111 +#: aleksis/core/templates/core/pages/system_status.html:115 msgid "Celery task results" msgstr "Результати Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Celery" -#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/core/pages/system_status.html:120 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "ЗавданнÑ" -#: aleksis/core/templates/core/pages/system_status.html:117 +#: aleksis/core/templates/core/pages/system_status.html:121 msgid "ID" msgstr "ID" -#: aleksis/core/templates/core/pages/system_status.html:118 +#: aleksis/core/templates/core/pages/system_status.html:122 msgid "Date done" msgstr "Ð§Ð°Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ" @@ -2247,11 +2258,11 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÐµÐ».поштою" msgid "Generate invitation code" msgstr "Створити код запрошеннÑ" -#: aleksis/core/templates/invitations/forms/_invite.html:29 +#: aleksis/core/templates/invitations/forms/_invite.html:30 msgid "Generate code" msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð´Ñƒ" -#: aleksis/core/templates/invitations/forms/_invite.html:33 +#: aleksis/core/templates/invitations/forms/_invite.html:34 msgid "Invitations" msgstr "ЗапрошеннÑ" @@ -2267,7 +2278,6 @@ msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÑƒ OAuth2" #: aleksis/core/templates/oauth2_provider/application/create.html:14 #: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 #: aleksis/core/templates/two_factor/_wizard_actions.html:6 msgid "Cancel" msgstr "СкаÑувати" @@ -2341,43 +2351,26 @@ msgstr "Дозволити" msgid "Disallow" msgstr "Заборонити" -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 -msgid "Revoke access" -msgstr "Відкликати доÑтуп" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 -msgid "Are you sure to revoke the access for this application?" -msgstr "Ви дійÑно хочете відкликати доÑтуп Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ додатку?" - -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 -msgid "Revoke" -msgstr "Відкликати" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "Ðвторизовані додатки" - -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 -msgid "No authorized applications." -msgstr "Ðвторизованих додатків немає." - #: aleksis/core/templates/offline.html:5 msgid "Network error" msgstr "Помилка мережі" #: aleksis/core/templates/offline.html:10 -msgid "Page not available offline." -msgstr "Сторінка в автономному режимі не доÑтупна." +msgid "No connection to server." +msgstr "" #: aleksis/core/templates/offline.html:14 +#, fuzzy +#| msgid "" +#| "\n" +#| " This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" +#| " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" +#| " administrators:\n" +#| " " msgid "" "\n" -" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" -" administrators:\n" +" This page is not available without a connection to the server. Please check your internet connection and try again.\n" +" If you are connected and the error persists, please contact the system administrators:\n" " " msgstr "" "\n" @@ -2518,6 +2511,8 @@ msgstr "" #: aleksis/core/templates/templated_email/base.email:5 #: aleksis/core/templates/templated_email/base.email:16 +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 msgid "Hello" msgstr "Привіт" @@ -2594,6 +2589,24 @@ msgstr "ÐžÐ¿Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸" msgid "Count of objects with new problems" msgstr "КількіÑть об'єктів з новими проблемами" +#: aleksis/core/templates/templated_email/invitation.email:4 +#, python-format +msgid "Invitation to register on %(site)s" +msgstr "" + +#: aleksis/core/templates/templated_email/invitation.email:6 +#: aleksis/core/templates/templated_email/invitation.email:14 +#, fuzzy, python-format +#| msgid "Selected persons" +msgid "Hello %(person)s" +msgstr "Позначені оÑоби" + +#: aleksis/core/templates/templated_email/invitation.email:9 +#: aleksis/core/templates/templated_email/invitation.email:18 +#, python-format +msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:" +msgstr "" + #: aleksis/core/templates/templated_email/notification.email:4 msgid "New notification for" msgstr "Ðове ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ" @@ -3069,152 +3082,180 @@ msgstr "Під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ PDF виникла проб msgid "Download PDF" msgstr "Звантажити PDF" -#: aleksis/core/views.py:280 +#: aleksis/core/views.py:285 msgid "The school term has been created." msgstr "Ðавчальний рік Ñтворений." -#: aleksis/core/views.py:292 +#: aleksis/core/views.py:297 msgid "The school term has been saved." msgstr "Ðавчальний рік збережений." -#: aleksis/core/views.py:396 +#: aleksis/core/views.py:401 msgid "The child groups were successfully saved." msgstr "Підлеглі групи збережені." -#: aleksis/core/views.py:415 aleksis/core/views.py:425 +#: aleksis/core/views.py:420 aleksis/core/views.py:430 msgid "The person has been saved." msgstr "ОÑоба збережена." -#: aleksis/core/views.py:475 +#: aleksis/core/views.py:480 msgid "The group has been saved." msgstr "Група збережена." -#: aleksis/core/views.py:558 +#: aleksis/core/views.py:528 +#, fuzzy +#| msgid "The data checks were run successfully." +msgid "Maintenance mode was turned on successfully." +msgstr "Перевірка даних уÑпішно запущена." + +#: aleksis/core/views.py:530 +msgid "Maintenance mode was turned off successfully." +msgstr "" + +#: aleksis/core/views.py:588 msgid "The announcement has been saved." msgstr "ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ðµ." -#: aleksis/core/views.py:574 +#: aleksis/core/views.py:604 msgid "The announcement has been deleted." msgstr "ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ðµ." -#: aleksis/core/views.py:643 +#: aleksis/core/views.py:673 msgid "The requested preference registry does not exist" msgstr "Журналу із запитаними влаÑтивоÑÑ‚Ñми не Ñ–Ñнує" -#: aleksis/core/views.py:662 +#: aleksis/core/views.py:692 msgid "The preferences have been saved successfully." msgstr "ВлаÑтивоÑті збережені." -#: aleksis/core/views.py:686 +#: aleksis/core/views.py:716 msgid "The person has been deleted." msgstr "ОÑоба видалена." -#: aleksis/core/views.py:700 +#: aleksis/core/views.py:730 msgid "The group has been deleted." msgstr "Група видалена." -#: aleksis/core/views.py:732 +#: aleksis/core/views.py:762 msgid "The additional field has been saved." msgstr "Додаткове поле збережене." -#: aleksis/core/views.py:767 +#: aleksis/core/views.py:797 msgid "The additional field has been deleted." msgstr "Додаткове поле видалене." -#: aleksis/core/views.py:792 +#: aleksis/core/views.py:822 msgid "The group type has been saved." msgstr "Тип групи збережений." -#: aleksis/core/views.py:823 +#: aleksis/core/views.py:853 msgid "The group type has been deleted." msgstr "Тип групи видалений." -#: aleksis/core/views.py:858 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "Перебіг: ЗапуÑк перевірки даних" -#: aleksis/core/views.py:859 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "ЗапуÑкаєтьÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ° даних …" -#: aleksis/core/views.py:860 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "Перевірка даних уÑпішно запущена." -#: aleksis/core/views.py:861 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "Під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку перевірки даних виникла проблема." -#: aleksis/core/views.py:878 +#: aleksis/core/views.py:908 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "Варіант розв'ÑÐ·Ð°Ð½Ð½Ñ \"{solve_option_obj.verbose_name}\" " -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:918 msgid "The requested solve option does not exist" msgstr "Запитаний варіант розв'ÑÐ·Ð°Ð½Ð½Ñ Ð½Ðµ Ñ–Ñнує" -#: aleksis/core/views.py:921 +#: aleksis/core/views.py:951 msgid "The dashboard widget has been saved." msgstr "Віджет інформпанелі збережений." -#: aleksis/core/views.py:951 +#: aleksis/core/views.py:981 msgid "The dashboard widget has been created." msgstr "Віджет інформпанелі Ñтворений." -#: aleksis/core/views.py:961 +#: aleksis/core/views.py:991 msgid "The dashboard widget has been deleted." msgstr "Віджет інформпанелі видалений." -#: aleksis/core/views.py:1033 +#: aleksis/core/views.py:1063 msgid "Your dashboard configuration has been saved successfully." msgstr "Ваша ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð¿Ð°Ð½ÐµÐ»Ñ– збережена." -#: aleksis/core/views.py:1035 +#: aleksis/core/views.py:1065 msgid "The configuration of the default dashboard has been saved successfully." msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ñ—/Ñтандартної інформпанелі збережена." -#: aleksis/core/views.py:1106 +#: aleksis/core/views.py:1136 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно Ñтворене. Код запрошеннÑ: {code}" -#: aleksis/core/views.py:1203 +#: aleksis/core/views.py:1233 msgid "We have successfully assigned the permissions." msgstr "Ми уÑпішно призначили дозволи." -#: aleksis/core/views.py:1213 +#: aleksis/core/views.py:1243 msgid "The global user permission has been deleted." msgstr "Глобальний кориÑтувацький дозвіл видалений." -#: aleksis/core/views.py:1223 +#: aleksis/core/views.py:1253 msgid "The global group permission has been deleted." msgstr "Глобальний груповий дозвіл видалений." -#: aleksis/core/views.py:1233 +#: aleksis/core/views.py:1263 msgid "The object user permission has been deleted." msgstr "Об'єктний кориÑтувацький дозвіл видалений." -#: aleksis/core/views.py:1243 +#: aleksis/core/views.py:1273 msgid "The object group permission has been deleted." msgstr "Об'єктний груповий дозвіл видалений." -#: aleksis/core/views.py:1352 +#: aleksis/core/views.py:1382 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ‚Ñ€ÐµÑ‚ÑŒÐ¾Ñ— Ñторони не можна від'єднати оÑкільки він єдиний ÑпоÑіб Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ." -#: aleksis/core/views.py:1359 +#: aleksis/core/views.py:1389 msgid "The third-party account has been successfully disconnected." msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ‚Ñ€ÐµÑ‚ÑŒÐ¾Ñ— Ñторони уÑпішно від'єднаний." -#: aleksis/core/views.py:1435 +#: aleksis/core/views.py:1465 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "ОÑоба уÑпішно запрошена. ЛиÑÑ‚ з інÑтрукціÑми щодо наÑтупних дій надіÑланий на Ñ—Ñ— ел.пошту." -#: aleksis/core/views.py:1446 +#: aleksis/core/views.py:1476 msgid "Person was already invited." msgstr "ОÑоба вже була запрошена." +#~ msgid "Revoke access" +#~ msgstr "Відкликати доÑтуп" + +#~ msgid "Are you sure to revoke the access for this application?" +#~ msgstr "Ви дійÑно хочете відкликати доÑтуп Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ додатку?" + +#~ msgid "Revoke" +#~ msgstr "Відкликати" + +#~ msgid "Authorized applications" +#~ msgstr "Ðвторизовані додатки" + +#~ msgid "No authorized applications." +#~ msgstr "Ðвторизованих додатків немає." + +#~ msgid "Page not available offline." +#~ msgstr "Сторінка в автономному режимі не доÑтупна." + #~ msgid "" #~ "\n" #~ " This page is currently unavailable. If this error persists, contact your site administrators:\n" diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 1a370c2c68af1569f92a9cc09ada7f8b5f671649..d90790427fb3c22531ec0cda50e9c48eb615e196 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -13,6 +13,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.fields import ArrayField from django.contrib.sites.models import Site +from django.contrib.sites.shortcuts import get_current_site from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator from django.db import models, transaction @@ -769,7 +770,7 @@ class Notification(ExtensibleModel, TimeStampedModel): def send(self, resend: bool = False) -> Optional[AsyncResult]: """Send the notification to the recipient.""" if not self.sent or resend: - return send_notification.delay(self.pk, resend=True) + return send_notification.delay(self.pk, resend=resend) class Meta: verbose_name = _("Notification") @@ -1223,8 +1224,36 @@ class PersonInvitation(AbstractBaseInvitation, PureDjangoModel): instance = cls.objects.create(email=email, inviter=inviter, key=code, **kwargs) return instance + def send_invitation(self, request, **kwargs): + """Send the invitation email to the person.""" + current_site = get_current_site(request) + invite_url = reverse("invitations:accept-invite", args=[self.key]) + invite_url = request.build_absolute_uri(invite_url).replace("/django", "") + context = kwargs + context.update( + { + "invite_url": invite_url, + "site_name": current_site.name, + "email": self.email, + "inviter": self.inviter, + "person": self.person, + }, + ) + + send_email(template_name="invitation", recipient_list=[self.email], context=context) + + self.sent = timezone.now() + self.save() + + signals.invite_url_sent.send( + sender=self.__class__, + instance=self, + invite_url_sent=invite_url, + inviter=self.inviter, + ) + key_expired = Invitation.key_expired - send_invitation = Invitation.send_invitation + send_invitation = send_invitation class PDFFile(ExtensibleModel): diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py index 631a9337654db24782f823dd956c286855ca7792..7d10c2ae5c4a7b2538ad907c227033ea6a0ef0f2 100644 --- a/aleksis/core/preferences.py +++ b/aleksis/core/preferences.py @@ -3,7 +3,6 @@ from django.forms import EmailField, ImageField, URLField from django.forms.widgets import SelectMultiple from django.utils.translation import gettext_lazy as _ -import pycountry from colorfield.widgets import ColorWidget from dynamic_preferences.preferences import Section from dynamic_preferences.types import ( @@ -478,13 +477,3 @@ class AutoUpdatingDashboardSite(BooleanPreference): name = "automatically_update_dashboard_site" default = True verbose_name = _("Automatically update the dashboard and its widgets sitewide") - - -@site_preferences_registry.register -class PhoneNumberCountry(ChoicePreference): - section = internationalisation - name = "phone_number_country" - required = True - default = "GB" - choices = [(x.alpha_2, x.alpha_2) for x in pycountry.countries] - verbose_name = _("Country for phone number parsing") diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py index b95f3bbac10a21aada6afeb25acfab9b01b70ef6..6d77fcd70fb32712c4358a9bcec5a03e306140d5 100644 --- a/aleksis/core/rules.py +++ b/aleksis/core/rules.py @@ -60,49 +60,49 @@ rules.add_perm("core.view_persons_rule", view_persons_predicate) # View person view_person_predicate = has_person & ( - has_global_perm("core.view_person") | has_object_perm("core.view_person") | is_current_person + is_current_person | has_global_perm("core.view_person") | has_object_perm("core.view_person") ) rules.add_perm("core.view_person_rule", view_person_predicate) # View person address view_address_predicate = has_person & ( - has_global_perm("core.view_address") | has_object_perm("core.view_address") | is_current_person + is_current_person | has_global_perm("core.view_address") | has_object_perm("core.view_address") ) rules.add_perm("core.view_address_rule", view_address_predicate) # View person contact details view_contact_details_predicate = has_person & ( - has_global_perm("core.view_contact_details") + is_current_person + | has_global_perm("core.view_contact_details") | has_object_perm("core.view_contact_details") - | is_current_person ) rules.add_perm("core.view_contact_details_rule", view_contact_details_predicate) # View person photo view_photo_predicate = has_person & ( - has_global_perm("core.view_photo") | has_object_perm("core.view_photo") | is_current_person + is_current_person | has_global_perm("core.view_photo") | has_object_perm("core.view_photo") ) rules.add_perm("core.view_photo_rule", view_photo_predicate) # View person avatar image view_avatar_predicate = has_person & ( - has_global_perm("core.view_avatar") | has_object_perm("core.view_avatar") | is_current_person + is_current_person | has_global_perm("core.view_avatar") | has_object_perm("core.view_avatar") ) rules.add_perm("core.view_avatar_rule", view_avatar_predicate) # View persons groups view_groups_predicate = has_person & ( - has_global_perm("core.view_person_groups") + is_current_person + | has_global_perm("core.view_person_groups") | has_object_perm("core.view_person_groups") - | is_current_person ) rules.add_perm("core.view_person_groups_rule", view_groups_predicate) # Edit person edit_person_predicate = has_person & ( - has_global_perm("core.change_person") + is_current_person & is_site_preference_set("account", "editable_fields_person") + | has_global_perm("core.change_person") | has_object_perm("core.change_person") - | is_current_person & is_site_preference_set("account", "editable_fields_person") ) rules.add_perm("core.edit_person_rule", edit_person_predicate) @@ -191,9 +191,9 @@ rules.add_perm( # View person personal details view_personal_details_predicate = has_person & ( - has_global_perm("core.view_personal_details") + is_current_person + | has_global_perm("core.view_personal_details") | has_object_perm("core.view_personal_details") - | is_current_person ) rules.add_perm("core.view_personal_details_rule", view_personal_details_predicate) @@ -206,9 +206,9 @@ rules.add_perm("core.change_site_preferences_rule", change_site_preferences) # Change person preferences change_person_preferences = has_person & ( - has_global_perm("core.change_person_preferences") + is_current_person + | has_global_perm("core.change_person_preferences") | has_object_perm("core.change_person_preferences") - | is_current_person ) rules.add_perm("core.change_person_preferences_rule", change_person_preferences) @@ -251,6 +251,12 @@ view_additional_fields_predicate = has_person & ( ) rules.add_perm("core.view_additionalfields_rule", view_additional_fields_predicate) +# View group type +view_group_type_predicate = has_person & ( + has_global_perm("core.view_grouptype") | has_object_perm("core.view_grouptype") +) +rules.add_perm("core.view_grouptype_rule", view_group_type_predicate) + # Edit group type change_group_type_predicate = has_person & ( has_global_perm("core.change_grouptype") | has_object_perm("core.change_grouptype") diff --git a/aleksis/core/schema/__init__.py b/aleksis/core/schema/__init__.py index deab0e28b5d93e854a020aad687a618817196536..a11fbb427d3c585ec145c83446dbab9cc7b856e4 100644 --- a/aleksis/core/schema/__init__.py +++ b/aleksis/core/schema/__init__.py @@ -9,7 +9,15 @@ from haystack.inputs import AutoQuery from haystack.query import SearchQuerySet from haystack.utils.loading import UnifiedIndex -from ..models import CustomMenu, DynamicRoute, Notification, PDFFile, Person, TaskUserAssignment +from ..models import ( + CustomMenu, + DynamicRoute, + Notification, + OAuthAccessToken, + PDFFile, + Person, + TaskUserAssignment, +) from ..util.apps import AppConfig from ..util.core_helpers import get_allowed_object_ids, get_app_module, get_app_packages, has_person from .celery_progress import CeleryProgressFetchedMutation, CeleryProgressType @@ -19,6 +27,7 @@ from .group import GroupType # noqa from .installed_apps import AppType from .message import MessageType from .notification import MarkNotificationReadMutation, NotificationType +from .oauth import OAuthAccessTokenType, OAuthRevokeTokenMutation from .pdf import PDFFileType from .person import PersonMutation, PersonType from .school_term import SchoolTermType # noqa @@ -59,6 +68,8 @@ class Query(graphene.ObjectType): two_factor = graphene.Field(TwoFactorType) + oauth_access_tokens = graphene.List(OAuthAccessTokenType) + def resolve_ping(root, info, payload) -> str: return payload @@ -139,7 +150,7 @@ class Query(graphene.ObjectType): return None def resolve_messages(root, info, **kwargs): - return get_messages(info) + return get_messages(info.context) def resolve_custom_menu_by_name(root, info, name, **kwargs): return CustomMenu.get_default(name) @@ -157,6 +168,10 @@ class Query(graphene.ObjectType): return None return info.context.user + @staticmethod + def resolve_oauth_access_tokens(root, info, **kwargs): + return OAuthAccessToken.objects.filter(user=info.context.user) + class Mutation(graphene.ObjectType): update_person = PersonMutation.Field() @@ -165,6 +180,8 @@ class Mutation(graphene.ObjectType): celery_progress_fetched = CeleryProgressFetchedMutation.Field() + revoke_oauth_token = OAuthRevokeTokenMutation.Field() + def build_global_schema(): """Build global GraphQL schema from all apps.""" diff --git a/aleksis/core/schema/base.py b/aleksis/core/schema/base.py index e927dadccaaab7b2bf39c2110286970222f70f5b..36d4f0647bd25d56b58e14fc4b737a3893e20372 100644 --- a/aleksis/core/schema/base.py +++ b/aleksis/core/schema/base.py @@ -1,3 +1,6 @@ +from django.core.exceptions import PermissionDenied +from django.db.models import Model + import graphene from graphene_django import DjangoObjectType @@ -24,3 +27,23 @@ class FieldFileType(graphene.ObjectType): def resolve_absolute_url(root, info, **kwargs): return info.context.build_absolute_uri(root.url) if root else "" + + +class DeleteMutation(graphene.Mutation): + """Mutation to delete an object.""" + + klass: Model = None + permission_required: str = "" + ok = graphene.Boolean() + + class Arguments: + id = graphene.ID() # noqa + + @classmethod + def mutate(cls, root, info, **kwargs): + obj = cls.klass.objects.get(pk=kwargs["id"]) + if info.context.user.has_perm(cls.permission_required, obj): + obj.delete() + return cls(ok=True) + else: + raise PermissionDenied() diff --git a/aleksis/core/schema/group.py b/aleksis/core/schema/group.py index 327daff3dd09d54053b683ba4cefb71da8ba6e5b..433eeaa825868ef588047d1af1f72313a0e9ec56 100644 --- a/aleksis/core/schema/group.py +++ b/aleksis/core/schema/group.py @@ -1,8 +1,59 @@ +from django.core.exceptions import PermissionDenied + from graphene_django import DjangoObjectType +from guardian.shortcuts import get_objects_for_user -from ..models import Group +from ..models import Group, Person +from ..util.core_helpers import has_person class GroupType(DjangoObjectType): class Meta: model = Group + fields = [ + "id", + "school_term", + "name", + "short_name", + "members", + "owners", + "parent_groups", + "group_type", + "additional_fields", + "photo", + "avatar", + ] + + @staticmethod + def resolve_parent_groups(root, info, **kwargs): + return get_objects_for_user(info.context.user, "core.view_group", root.parent_groups.all()) + + @staticmethod + def resolve_members(root, info, **kwargs): + persons = get_objects_for_user(info.context.user, "core.view_person", root.members.all()) + if has_person(info.context.user) and [ + m for m in root.members.all() if m.pk == info.context.user.person.pk + ]: + persons = (persons | Person.objects.get(pk=info.context.user.person.pk)).distinct() + return persons + + @staticmethod + def resolve_owners(root, info, **kwargs): + persons = get_objects_for_user(info.context.user, "core.view_person", root.owners.all()) + if has_person(info.context.user) and [ + o for o in root.owners.all() if o.pk == info.context.user.person.pk + ]: + persons = (persons | Person.objects.get(pk=info.context.user.person.pk)).distinct() + return persons + + @staticmethod + def resolve_group_type(root, info, **kwargs): + if info.context.user.has_perm("core.view_grouptype_rule", root.group_type): + return root.group_type + raise PermissionDenied() + + @staticmethod + def resolve_additional_fields(root, info, **kwargs): + return get_objects_for_user( + info.context.user, "core.view_additionalfield", root.additional_fields.all() + ) diff --git a/aleksis/core/schema/notification.py b/aleksis/core/schema/notification.py index 1e10a74e1e4e7b13c56063fb63dd978a8947adf4..c98bb011466001cc848b4cb8efd5ba14dce428cc 100644 --- a/aleksis/core/schema/notification.py +++ b/aleksis/core/schema/notification.py @@ -9,6 +9,26 @@ from ..models import Notification class NotificationType(DjangoObjectType): class Meta: model = Notification + fields = [ + "id", + "sender", + "recipient", + "title", + "description", + "link", + "icon", + "send_at", + "read", + "sent", + "created", + "modified", + ] + + @staticmethod + def resolve_recipient(root, info, **kwargs): + if info.context.user.has_perm("core.view_person_rule", root.recipient): + return root.recipient + raise PermissionDenied() class MarkNotificationReadMutation(graphene.Mutation): diff --git a/aleksis/core/schema/oauth.py b/aleksis/core/schema/oauth.py new file mode 100644 index 0000000000000000000000000000000000000000..c51527d0bb316f2768a844e71697a0eeb8c29100 --- /dev/null +++ b/aleksis/core/schema/oauth.py @@ -0,0 +1,44 @@ +import graphene +from graphene_django import DjangoObjectType + +from aleksis.core.models import OAuthAccessToken, OAuthApplication + +from .base import FieldFileType + + +class OAuthScope(graphene.ObjectType): + name = graphene.String() + description = graphene.String() + + +class OAuthApplicationType(DjangoObjectType): + icon = graphene.Field(FieldFileType) + + class Meta: + model = OAuthApplication + fields = ["id", "name", "icon"] + + +class OAuthAccessTokenType(DjangoObjectType): + scopes = graphene.List(OAuthScope) + + @staticmethod + def resolve_scopes(root: OAuthAccessToken, info, **kwargs): + return [OAuthScope(name=key, description=value) for key, value in root.scopes.items()] + + class Meta: + model = OAuthAccessToken + fields = ["id", "application", "expires", "created", "updated"] + + +class OAuthRevokeTokenMutation(graphene.Mutation): + class Arguments: + id = graphene.ID() # noqa + + ok = graphene.Boolean() + + @staticmethod + def mutate(root, info, id): # noqa + token = OAuthAccessToken.objects.get(id=id, user=info.context.user) + token.delete() + return OAuthRevokeTokenMutation(ok=True) diff --git a/aleksis/core/schema/pdf.py b/aleksis/core/schema/pdf.py index a87eabf7bc60b23c04f8d6a3b334e03e61522a8e..bcb782bc981a4fa5d0250d0646fdcb5107805bc2 100644 --- a/aleksis/core/schema/pdf.py +++ b/aleksis/core/schema/pdf.py @@ -1,3 +1,5 @@ +from django.core.exceptions import PermissionDenied + import graphene from graphene_django import DjangoObjectType @@ -11,3 +13,9 @@ class PDFFileType(DjangoObjectType): class Meta: model = PDFFile exclude = ["html_file"] + + @staticmethod + def resolve_person(root, info, **kwargs): + if info.context.user.has_perm("core.view_person_rule", root.person): + return root.person + raise PermissionDenied() diff --git a/aleksis/core/schema/person.py b/aleksis/core/schema/person.py index 821cade46c4ca76539e284bd1311a6992869e782..6eed201487348034b2d9b1cba616046b1794dbf2 100644 --- a/aleksis/core/schema/person.py +++ b/aleksis/core/schema/person.py @@ -6,10 +6,11 @@ from django.utils import timezone import graphene from graphene_django import DjangoObjectType from graphene_django.forms.mutation import DjangoModelFormMutation +from guardian.shortcuts import get_objects_for_user from ..forms import PersonForm from ..models import DummyPerson, Person -from ..util.core_helpers import get_site_preferences, is_impersonate +from ..util.core_helpers import get_site_preferences, has_person from .base import FieldFileType from .notification import NotificationType @@ -24,6 +25,32 @@ class PersonPreferencesType(graphene.ObjectType): class PersonType(DjangoObjectType): class Meta: model = Person + fields = [ + "id", + "user", + "first_name", + "last_name", + "additional_name", + "short_name", + "street", + "housenumber", + "postal_code", + "place", + "phone_number", + "mobile_number", + "email", + "date_of_birth", + "place_of_birth", + "sex", + "photo", + "avatar", + "guardians", + "primary_group", + "description", + "children", + "owner_of", + "member_of", + ] full_name = graphene.String() username = graphene.String() @@ -38,7 +65,6 @@ class PersonType(DjangoObjectType): unread_notifications_count = graphene.Int() is_dummy = graphene.Boolean() - is_impersonate = graphene.Boolean() preferences = graphene.Field(PersonPreferencesType) can_edit_person = graphene.Boolean() @@ -94,24 +120,29 @@ class PersonType(DjangoObjectType): def resolve_children(root, info, **kwargs): # noqa if info.context.user.has_perm("core.view_personal_details_rule", root): - return root.children.all() + return get_objects_for_user(info.context.user, "core.view_person", root.children.all()) return [] def resolve_guardians(root, info, **kwargs): # noqa if info.context.user.has_perm("core.view_personal_details_rule", root): - return root.guardians.all() + return get_objects_for_user(info.context.user, "core.view_person", root.guardians.all()) return [] def resolve_member_of(root, info, **kwargs): # noqa if info.context.user.has_perm("core.view_person_groups_rule", root): - return root.member_of.all() + return get_objects_for_user(info.context.user, "core.view_group", root.member_of.all()) return [] def resolve_owner_of(root, info, **kwargs): # noqa if info.context.user.has_perm("core.view_person_groups_rule", root): - return root.owner_of.all() + return get_objects_for_user(info.context.user, "core.view_group", root.owner_of.all()) return [] + def resolve_primary_group(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_group_rule", root.primary_group): + return root.primary_group + raise PermissionDenied() + def resolve_username(root, info, **kwargs): # noqa return root.user.username if root.user else None @@ -167,11 +198,12 @@ class PersonType(DjangoObjectType): def resolve_is_dummy(root: Union[Person, DummyPerson], info, **kwargs): return root.is_dummy if hasattr(root, "is_dummy") else False - def resolve_is_impersonate(root: Person, info, **kwargs): - return is_impersonate(info.context) - def resolve_notifications(root: Person, info, **kwargs): - return root.notifications.filter(send_at__lte=timezone.now()).order_by("read", "-created") + if has_person(info.context.user) and info.context.user.person == root: + return root.notifications.filter(send_at__lte=timezone.now()).order_by( + "read", "-created" + ) + raise PermissionDenied() def resolve_can_edit_person(root, info, **kwargs): # noqa return info.context.user.has_perm("core.edit_person_rule", root) diff --git a/aleksis/core/schema/room.py b/aleksis/core/schema/room.py new file mode 100644 index 0000000000000000000000000000000000000000..d4f76700793d2f7eededaac1b0361ebeff1a6a5a --- /dev/null +++ b/aleksis/core/schema/room.py @@ -0,0 +1,9 @@ +from graphene_django import DjangoObjectType + +from ..models import Room + + +class RoomType(DjangoObjectType): + class Meta: + model = Room + fields = ("id", "name", "short_name") diff --git a/aleksis/core/schema/user.py b/aleksis/core/schema/user.py index 1c1ff08ea2c4c77a6ab68af9e389a36db66a764c..7104a64b6acfa4f0891a9371304df9609569723d 100644 --- a/aleksis/core/schema/user.py +++ b/aleksis/core/schema/user.py @@ -12,6 +12,7 @@ class UserType(graphene.ObjectType): is_authenticated = graphene.Boolean(required=True) is_anonymous = graphene.Boolean(required=True) + is_impersonate = graphene.Boolean() person = graphene.Field(PersonType) diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py index c12ae3371376a0836bdd9898753e7f8d28317daa..fbe25a785c289e415445b6cf52bc9ff43bfeb477 100644 --- a/aleksis/core/settings.py +++ b/aleksis/core/settings.py @@ -68,7 +68,8 @@ DJANGO_VITE_DEV_SERVER_PORT = DEV_SERVER_PORT + 1 ALLOWED_HOSTS = _settings.get("http.allowed_hosts", [getfqdn(), "localhost", "127.0.0.1", "[::1]"]) BASE_URL = _settings.get( - "http.base_url", f"http://localhost:{DEV_SERVER_PORT}" if DEBUG else f"//{ALLOWED_HOSTS[0]}" + "http.base_url", + f"http://localhost:{DEV_SERVER_PORT}" if DEBUG else f"https://{ALLOWED_HOSTS[0]}", ) @@ -554,6 +555,8 @@ LANGUAGE_CODE = _settings.get("l10n.lang", "en") TIME_ZONE = _settings.get("l10n.tz", "UTC") USE_TZ = True +PHONENUMBER_DEFAULT_REGION = _settings.get("l10n.phone_number_country", None) + # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.1/howto/static-files/ diff --git a/aleksis/core/tables.py b/aleksis/core/tables.py index c912d13477c607e3374b3c8b4619338a8cb8a6a0..5411cad4747bc8c5de011fcdd2abcde432842236 100644 --- a/aleksis/core/tables.py +++ b/aleksis/core/tables.py @@ -152,13 +152,6 @@ class DashboardWidgetTable(tables.Table): return record._meta.verbose_name -class PersonColumn(tables.Column): - """Returns person object from given id.""" - - def render(self, value): - return Person.objects.get(pk=value) - - class InvitationCodeColumn(tables.Column): """Returns invitation code in a more readable format.""" @@ -170,10 +163,10 @@ class InvitationCodeColumn(tables.Column): class InvitationsTable(tables.Table): """Table to list persons.""" - person_id = PersonColumn() + person = tables.Column() email = tables.EmailColumn() sent = tables.DateColumn() - inviter_id = PersonColumn() + inviter = tables.Column() key = InvitationCodeColumn() accepted = tables.BooleanColumn( yesno="check,cancel", attrs={"span": {"class": "material-icons"}} diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html index d008cd5405f4e5eee73ddf175cab87057e563785..a2ea5c902dba89f34241403e85d0e8af8d8f9a5d 100644 --- a/aleksis/core/templates/500.html +++ b/aleksis/core/templates/500.html @@ -16,7 +16,7 @@ {% endblocktrans %} </p> {% include "core/partials/admins_list.html" %} - <a href="javascript:window.location.reload()" class="btn green waves-effect waves-light"> + <a onClick="window.location.reload();" class="btn secondary waves-effect waves-light"> <i class="material-icons left">refresh</i> {% trans "Retry" %} </a> diff --git a/aleksis/core/templates/core/data_check/list.html b/aleksis/core/templates/core/data_check/list.html index b192dcdc1623a05fa3ad7b3568b4b8bdc3622abf..00b0ceb3a9eefdb473b6fe97a2d2d693aee59b61 100644 --- a/aleksis/core/templates/core/data_check/list.html +++ b/aleksis/core/templates/core/data_check/list.html @@ -2,6 +2,7 @@ {% extends "core/base.html" %} {% load data_helpers %} +{% load html_helpers %} {% load i18n %} {% load render_table from django_tables2 %} @@ -59,9 +60,11 @@ <td>{{ result.related_object }}</td> <td>{{ result.related_check.problem_name }}</td> <td> - <a class="btn-flat waves-effect waves-light" href="{{ result.related_object.get_absolute_url }}"> + {% if result.related_object.get_absolute_url %} + <a class="btn-flat waves-effect waves-light" href="{{ result.related_object.get_absolute_url|remove_prefix:"/django/" }}" target="_blank"> {% trans "Show object" %} </a> + {% endif %} </td> <td> {% for option_name, option in result.related_check.solve_options.items %} diff --git a/aleksis/core/templates/core/pages/system_status.html b/aleksis/core/templates/core/pages/system_status.html index 7f0e7bff0840029b500620662cd4681ac6bddded..00c0010d9f150fbd6e0b6bd3cf7f60684c08b350 100644 --- a/aleksis/core/templates/core/pages/system_status.html +++ b/aleksis/core/templates/core/pages/system_status.html @@ -13,30 +13,34 @@ {# Maintenance mode #} <div class="row"> - {% if maintenance_mode %} - <a class="btn-flat btn-flat-medium right waves-effect waves-red no-padding" - href="{% url 'maintenance_mode_off' %}"> - <i class="material-icons iconify small red-text center" data-icon="mdi:power"></i> - </a> - <div> - <p class="flow-text">{% blocktrans %}Maintenance mode enabled{% endblocktrans %}</p> - <p class="grey-text"> - {% blocktrans %} - Only admin and visitors from internal IPs can access the site. - {% endblocktrans %} - </p> - </div> - <span class="badge badge-danger mdi mdi-power"><a href="{% url 'maintenance_mode_off' %}"></a></span> - {% else %} - <a class="btn-flat btn-flat-medium right waves-effect waves-green no-padding" - href="{% url 'maintenance_mode_on' %}"> - <i class="material-icons iconify small green-text center" data-icon="mdi:power"></i> - </a> - <div> - <p class="flow-text">{% blocktrans %}Maintenance mode disabled{% endblocktrans %}</p> - <p class="grey-text">{% blocktrans %}Everyone can access the site.{% endblocktrans %}</p> - </div> - {% endif %} + <form method="POST"> + {% csrf_token %} + {{ form }} + + {% if maintenance_mode %} + <button class="btn-flat btn-flat-medium right waves-effect waves-red no-padding" + type="submit"> + <i class="material-icons iconify small red-text center" data-icon="mdi:power"></i> + </button> + <div> + <p class="flow-text">{% blocktrans %}Maintenance mode enabled{% endblocktrans %}</p> + <p class="grey-text"> + {% blocktrans %} + Only admin and visitors from internal IPs can access the site. + {% endblocktrans %} + </p> + </div> + {% else %} + <button class="btn-flat btn-flat-medium right waves-effect waves-green no-padding" + type="submit"> + <i class="material-icons iconify small green-text center" data-icon="mdi:power"></i> + </button> + <div> + <p class="flow-text">{% blocktrans %}Maintenance mode disabled{% endblocktrans %}</p> + <p class="grey-text">{% blocktrans %}Everyone can access the site.{% endblocktrans %}</p> + </div> + {% endif %} + </form> </div> {# Debug mode #} diff --git a/aleksis/core/templates/invitations/forms/_invite.html b/aleksis/core/templates/invitations/forms/_invite.html index 297997e0b04f3d99a1e1279c8900d0bcc9c50024..4378ff639af86da13091094d70cf1d4b295085be 100644 --- a/aleksis/core/templates/invitations/forms/_invite.html +++ b/aleksis/core/templates/invitations/forms/_invite.html @@ -19,13 +19,14 @@ {% csrf_token %} {% form form=form %}{% endform %} {% trans "Invite" as caption %} - {% include "core/partials/save_button.html" with caption=caption icon="card_giftcard" %} + {% include "core/partials/save_button.html" with caption=caption icon="mdi:account-multiple-plus" %} </form> </div> <div class="col s6"> <h5>{% trans "Generate invitation code" %}</h5> <a class="btn waves-effect waves-light hundred-percent" href="{% url 'generate_invitation_code' %}"> + <i class="material-icons iconify left" data-icon="mdi:account-multiple-plus"></i> {% trans "Generate code" %} </a> </div> diff --git a/aleksis/core/templates/oauth2_provider/authorized-token-delete.html b/aleksis/core/templates/oauth2_provider/authorized-token-delete.html deleted file mode 100644 index ece2011b6e6170bd8ed845f8464302bb1e6fb8fb..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/oauth2_provider/authorized-token-delete.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends "core/base.html" %} - -{% load i18n %} - -{% block browser_title %}{% trans "Revoke access" %}{% endblock %} -{% block page_title %}{% trans "Revoke access" %}{% endblock %} - -{% block content %} - <div class="alert info"> - <p> - <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i> - {% trans "Are you sure to revoke the access for this application?" %} - </p> - </div> - - <form method="post"> - {% csrf_token %} - <a class="btn waves-effect waves-light red" href="{% url "oauth2_applications" %}"> - <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i> - {% trans "Revoke" %} - </a> - <a class="btn waves-effect waves-light" href="{% url "oauth2_applications" %}"> - <i class="material-icons iconify left" data-icon="mdi:close"></i> - {% trans "Cancel" %} - </a> - </form> -{% endblock %} diff --git a/aleksis/core/templates/oauth2_provider/authorized-tokens.html b/aleksis/core/templates/oauth2_provider/authorized-tokens.html deleted file mode 100644 index dfe058056fb4ffaabd2a44eaac04adaa8aa3ad3b..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/oauth2_provider/authorized-tokens.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends "core/base.html" %} - -{% load i18n %} - -{% block browser_title %}{% blocktrans %}Authorized applications{% endblocktrans %}{% endblock %} -{% block page_title %}{% trans "Authorized applications" %}{% endblock %} - -{% block content %} - {% if authorized_tokens %} - <div class="row"> - {% for authorized_token in authorized_tokens %} - <div class="col s12 m6 l4 xl3"> - <div class="card"> - <div class="card-content"> - <div class="card-title">{{ authorized_token.application }}</div> - {% for scope_name, scope_description in authorized_token.scopes.items %} - <p> - {{ scope_name }}: {{ scope_description }} - </p> - {% endfor %} - </div> - <div class="card-action"> - <a href="{% url 'oauth2_provider:authorized-token-delete' authorized_token.pk %}">{% trans "Revoke access" %}</a> - </div> - </div> - </div> - {% endfor %} - </div> - {% else %} - <div class="alert info"> - <p> - <i class="material-icons iconify left" data-icon="mdi:information-outline"></i> - {% trans "No authorized applications." %} - </p> - </div> - {% endif %} -{% endblock %} diff --git a/aleksis/core/templates/offline.html b/aleksis/core/templates/offline.html index 77537353bc1615426bab6e836519954c4a803da6..8bb50d53c202d2688e8c0da947b080cad1c52f28 100644 --- a/aleksis/core/templates/offline.html +++ b/aleksis/core/templates/offline.html @@ -7,15 +7,18 @@ {% block content %} <h3> <i class="material-icons iconify left medium" style="font-size: 2.92rem;" data-icon="mdi:wifi-strength-alert-outline"></i> - {% blocktrans %}Page not available offline.{% endblocktrans %} + {% blocktrans %}No connection to server.{% endblocktrans %} </h3> <p class="flow-text"> {% blocktrans %} - This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi - or mobile data is turned on and try again. If you think you are connected, please contact the system - administrators: + This page is not available without a connection to the server. Please check your internet connection and try again. + If you are connected and the error persists, please contact the system administrators: {% endblocktrans %} </p> {% include "core/partials/admins_list.html" %} + <a onClick="window.location.reload();" class="btn secondary waves-effect waves-light"> + <i class="material-icons left">refresh</i> + {% trans "Retry" %} + </a> {% endblock %} diff --git a/aleksis/core/templates/templated_email/invitation.email b/aleksis/core/templates/templated_email/invitation.email new file mode 100644 index 0000000000000000000000000000000000000000..3bf0311b61dbadc6eba025a1ae801a95c0d87521 --- /dev/null +++ b/aleksis/core/templates/templated_email/invitation.email @@ -0,0 +1,24 @@ +{% extends "templated_email/base.email" %} +{% load i18n %} + +{% block subject_content %}{% blocktrans with site=site_name %}Invitation to register on {{ site }}{% endblocktrans %}{% endblock %} + +{% block plain_greeting %}{% if person %}{% blocktrans with person=person.addressing_name %}Hello {{ person }}{% endblocktrans %}{% else %}{% trans "Hello" %}{% endif %},{% endblock %} + +{% block plain_content %} +{% blocktrans with site=site_name %}you have been invited to register on {{ site }}. If you would like to accept this invitation, please click on the following link:{% endblocktrans %} + +{{ invite_url }} +{% endblock %} + +{% block html_greeting %}{% if person %}{% blocktrans with person=person.addressing_name %}Hello {{ person }}{% endblocktrans %}{% else %}{% trans "Hello" %}{% endif %},{% endblock %} + +{% block html_content %} + <p> + {% blocktrans with site=site_name %}you have been invited to register on {{ site }}. If you would like to accept this invitation, please click on the following link:{% endblocktrans %} + </p> + + <a href="{{ invite_url}}"> + {{ invite_url }} + </a> +{% endblock %} diff --git a/aleksis/core/templatetags/html_helpers.py b/aleksis/core/templatetags/html_helpers.py index 8ca5be151d2edc39bf6787e9e51eabb3350714a0..98608a084574994400bffe46c50f944b52296e24 100644 --- a/aleksis/core/templatetags/html_helpers.py +++ b/aleksis/core/templatetags/html_helpers.py @@ -1,5 +1,6 @@ import random import string +from urllib.parse import urlparse from django import template from django.shortcuts import reverse @@ -28,6 +29,24 @@ def add_class_to_el(value: str, arg: str) -> str: return str(soup) +@register.filter +def remove_prefix(value: str, prefix: str) -> str: + """Remove prefix of a url. + + :Example: + + .. code-block:: + + {{ object.get_absolute_url|remove_prefix: "/django/" }} + """ + url = urlparse(value) + + if url.path.startswith(prefix): + url = url._replace(path=url.path[len(prefix) :]) + + return url.geturl() + + @register.simple_tag def generate_random_id(prefix: str, length: int = 10) -> str: """Generate a random ID for templates. diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index f5e5899063678abc338ac971d1df3f55db3d0430..9792fcb75cd1e7197cda1f1e6707c3eb42ed1d3e 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -11,7 +11,6 @@ from django.views.i18n import JavaScriptCatalog import calendarweek.django from ckeditor_uploader import views as ckeditor_uploader_views -from graphene_django.views import GraphQLView from health_check.urls import urlpatterns as health_urls from maintenance_mode.decorators import force_maintenance_mode_off from oauth2_provider.views import ConnectDiscoveryInfoView @@ -26,14 +25,23 @@ urlpatterns = [ path("sw.js", views.ServiceWorkerView.as_view(), name="service_worker"), path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")), path("__icons__/", include("dj_iconify.urls")), - path("graphql/", csrf_exempt(GraphQLView.as_view(graphiql=True)), name="graphql"), + path( + "graphql/", + csrf_exempt(views.LoggingGraphQLView.as_view(graphiql=True)), + name="graphql", + ), path("logo", force_maintenance_mode_off(views.LogoView.as_view()), name="logo"), path( ".well-known/openid-configuration/", ConnectDiscoveryInfoView.as_view(), name="oidc_configuration", ), + path("oauth/applications/", views.TemplateView.as_view(template_name="core/vue_index.html")), + path( + "oauth/authorized_tokens/", views.TemplateView.as_view(template_name="core/vue_index.html") + ), path("oauth/", include("oauth2_provider.urls", namespace="oauth2_provider")), + path("system_status/", views.SystemStatusAPIView.as_view(), name="system_status_api"), path( "django/", include( @@ -60,7 +68,6 @@ urlpatterns = [ views.SocialAccountDeleteView.as_view(), name="delete_social_account_by_pk", ), - path("vue_dummy/", views.vue_dummy, name="vue_dummy"), path("offline/", views.OfflineView.as_view(), name="offline"), path( "invitations/send-invite/", views.InvitePerson.as_view(), name="invite_person" diff --git a/aleksis/core/views.py b/aleksis/core/views.py index e9536003df379d5f97d1cf895d27c2a7b1623600..c1de17adafc9bc33205a364b619b4c23c5b1e897 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -16,6 +16,7 @@ from django.http import ( Http404, HttpRequest, HttpResponse, + HttpResponseBadRequest, HttpResponseRedirect, HttpResponseServerError, JsonResponse, @@ -45,6 +46,8 @@ from django_celery_results.models import TaskResult from django_filters.views import FilterView from django_tables2 import RequestConfig, SingleTableMixin, SingleTableView from dynamic_preferences.forms import preference_form_builder +from graphene_django.views import GraphQLView +from graphql import GraphQLError from guardian.shortcuts import GroupObjectPermission, UserObjectPermission, get_objects_for_user from haystack.generic_views import SearchView from haystack.inputs import AutoQuery @@ -52,6 +55,7 @@ from haystack.query import SearchQuerySet from haystack.utils.loading import UnifiedIndex from health_check.views import MainView from invitations.views import SendInvite +from maintenance_mode.core import set_maintenance_mode from oauth2_provider.exceptions import OAuthToolkitError from oauth2_provider.models import get_application_model from oauth2_provider.views import AuthorizationView @@ -85,6 +89,7 @@ from .forms import ( EditGroupTypeForm, GroupPreferenceForm, InvitationCodeForm, + MaintenanceModeForm, OAuthApplicationForm, PersonForm, PersonPreferenceForm, @@ -490,7 +495,6 @@ class SystemStatus(PermissionRequiredMixin, MainView): context = {} def get(self, request, *args, **kwargs): - status_code = 500 if self.errors else 200 task_results = [] if app.control.inspect().registered_tasks(): @@ -502,11 +506,42 @@ class SystemStatus(PermissionRequiredMixin, MainView): context = { "plugins": self.plugins, - "status_code": status_code, "tasks": task_results, "DEBUG": settings.DEBUG, + "form": MaintenanceModeForm(), } - return self.render_to_response(context, status=status_code) + return self.render_to_response(context) + + def post(self, request, *args, **kwargs): + form = MaintenanceModeForm(request.POST) + + if form.is_valid(): + mode = form.cleaned_data.get("maintenance_mode") + else: + return HttpResponseBadRequest() + + if not request.user.is_superuser: + return self.handle_no_permission() + + set_maintenance_mode(mode) + if mode: + messages.success(request, _("Maintenance mode was turned on successfully.")) + else: + messages.success(request, _("Maintenance mode was turned off successfully.")) + + return self.get(request, *args, **kwargs) + + +class SystemStatusAPIView(PermissionRequiredMixin, MainView): + """Provide information about system status as JSON.""" + + permission_required = "core.view_system_status_rule" + + @method_decorator(never_cache) + def get(self, request, *args, **kwargs): + status_code = 500 if self.errors else 200 + + return self.render_to_response_json(self.plugins, status_code) class TestPDFGenerationView(PermissionRequiredMixin, RenderPDFView): @@ -514,11 +549,6 @@ class TestPDFGenerationView(PermissionRequiredMixin, RenderPDFView): permission_required = "core.test_pdf_rule" -def vue_dummy(request: HttpRequest) -> HttpResponse: - # FIXME remove together with URL route and template - return render(request, "core/vue_dummy.html", {}) - - @pwa_cache @permission_required("core.view_announcements_rule") def announcements(request: HttpRequest) -> HttpResponse: @@ -1543,3 +1573,15 @@ class TwoFactorLoginView(two_factor_views.LoginView): other_devices = list(filter(lambda x: not isinstance(x, type(main_device)), other_devices)) return other_devices + + +class LoggingGraphQLView(GraphQLView): + """GraphQL view that raises unknown exceptions instead of blindly catching them.""" + + def execute_graphql_request(self, *args, **kwargs): + result = super().execute_graphql_request(*args, **kwargs) + errors = result.errors or [] + for error in errors: + if not isinstance(error.original_error, GraphQLError): + raise error + return result diff --git a/aleksis/core/vite.config.js b/aleksis/core/vite.config.js index 2b73a5f14dd8096530c7fd64356302cd47943979..287534f096c186bc428de742c4e5ff56b71e8eab 100644 --- a/aleksis/core/vite.config.js +++ b/aleksis/core/vite.config.js @@ -239,7 +239,7 @@ export default defineConfig({ plugins: [ { fetchDidSucceed: async ({ request, response }) => { - if (response.ok) { + if (response.status < 500) { return response; } throw new Error( diff --git a/docs/admin/10_install.rst b/docs/admin/10_install.rst index 322d39023183a171b29f2fffc4a55988441a89c7..03ffc97b1e73b28561f2283338773672e4c41a73 100644 --- a/docs/admin/10_install.rst +++ b/docs/admin/10_install.rst @@ -16,7 +16,7 @@ AlekSIS will need and use the following paths: * `/var/lib/aleksis/media` for file storage (Django media) * `/var/backups/aleksis` for backups of database and media files * `/usr/local/share/aleksis/static` for static files - * `//var/cache/aleksis` for building frontend assets etc. + * `/var/cache/aleksis` for building frontend assets etc. You can change any of the paths as you like. @@ -27,12 +27,13 @@ Prerequisites For an installation on a dedicated server, the following prerequisites are needed: - * Debian 11 + * Debian 12 or newer, or comparable distribution * PostgreSQL * Redis * uWSGI * nginx - * Python 3.9 + * Python 3.9 or newer + * Node.js 18 or newer * Some system dependencies to build Python modules and manage frontend files * System locales for all supported languages * The aforementioned paths @@ -49,6 +50,7 @@ Install some packages from the Debian package system. nginx-full \ python3 \ python3-dev \ + python3-pip \ libpq-dev \ yarnpkg \ python3-virtualenv \ @@ -143,7 +145,7 @@ You only need to install these additional dependencies if installing the meta-pa After that, you can install the aleksis meta-package, or only `aleksis-core`: .. code-block:: shell - pip3 install aleksis + pip3 install --break-system-packages aleksis aleksis-admin vite build aleksis-admin collectstatic aleksis-admin migrate @@ -176,7 +178,7 @@ editor and inserting: master = true enable-threads = true processes = 20 - wsgi-file = /usr/local/lib/python3.9/dist-packages/aleksis/core/wsgi.py + wsgi-file = /usr/local/lib/python3.11/dist-packages/aleksis/core/wsgi.py chdir = /var/lib/aleksis lazy = true lazy-apps = true diff --git a/docs/admin/16_config_options.rst b/docs/admin/16_config_options.rst index 15e474708a76f1261efa820c9129ca204800d4c6..531cb284deb1bd5dc450a514c87484c9d546e0f1 100644 --- a/docs/admin/16_config_options.rst +++ b/docs/admin/16_config_options.rst @@ -15,6 +15,12 @@ Example configuration file:: media = { root = "/srv/www/aleksis/data/media", url = "/media/" } secret_key = "Xoc8eiwah3neehid2Xi3oomoh4laem" + # Localization + [l10n] + lang = "en" + tz = "Europe/Berlin" + phone_number_country = "DE" + # Admin contat, optional [contact] admins = [["AlekSIS - Admins", "root@example.com"]] diff --git a/docs/conf.py b/docs/conf.py index dab0f125dc0ba33126d36fc975a5c5bd4f0b91f8..3287243f133810dce0b9a34d65d4c9fb2913a89f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,7 @@ author = "The AlekSIS Team" # The short X.Y version version = "3.0" # The full version, including alpha/beta/rc tags -release = "3.0.dev3" +release = "3.0.1.dev0" # -- General configuration --------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index 6c6616fda401bcf8dfe63a91f81fd16f1416434c..f5f4f37bd1b7e4dfb02607cb9f3307d5cc942ef6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "AlekSIS-Core" -version = "3.0.dev3" +version = "3.0.1.dev0" packages = [ { include = "aleksis" } ] @@ -40,7 +40,7 @@ keywords = ["SIS", "education", "school", "digitisation", "school apps"] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", - "Framework :: Django :: 4.0", + "Framework :: Django :: 4.1", "Intended Audience :: Developers", "Intended Audience :: Education", "Topic :: Education", @@ -81,7 +81,7 @@ html2text = "^2020.0.0" django-ckeditor = "^6.0.0" calendarweek = "^0.5.0" Celery = {version="^5.2", extras=["django", "redis"]} -django-celery-results = "^2.0.1" +django-celery-results = "^2.5.1" django-celery-beat = "^2.2.0" django-celery-email = "^3.0.0" django-jsonstore = "^0.5.0" @@ -100,13 +100,13 @@ django-favicon-plus-reloaded = "^1.1.5" django-health-check = "^3.12.1" psutil = "^5.7.0" celery-progress = "^0.1.0" -django-cachalot = "^2.3.2" +django-cachalot = "^2.5.3" django-prometheus = "^2.1.0" django-model-utils = "^4.0.0" bs4 = "^0.0.1" django-invitations = "^2.0.0" django-cleavejs = "^0.1.0" -django-allauth = "^0.52.0" +django-allauth = "^0.53.0" django-uwsgi-ng = "^2.0" django-extensions = "^3.1.1" ipython = "^8.0.0" @@ -134,7 +134,7 @@ s3 = ["boto3", "django-storages"] sentry = ["sentry-sdk"] [tool.poetry.dev-dependencies] -aleksis-builddeps = "*" +aleksis-builddeps = {version=">=2023.1.dev0", allow-prereleases=true} uwsgi = "^2.0" [tool.poetry.scripts]