diff --git a/.github/workflows/crowdin_download.yml b/.github/workflows/crowdin_download.yml new file mode 100644 index 00000000..6d9355cb --- /dev/null +++ b/.github/workflows/crowdin_download.yml @@ -0,0 +1,76 @@ +name: Download translations from Crowdin + +on: + workflow_dispatch: + push: + branches: + - 'release/**' + +jobs: + install-front: + uses: ./.github/workflows/front-dependencies-installation.yml + with: + node_version: '20.x' + + synchronize-with-crowdin: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Create empty source files + run: | + touch src/backend/locale/django.pot + mkdir -p src/frontend/packages/i18n/locales/impress/ + touch src/frontend/packages/i18n/locales/impress/translations-crowdin.json + # crowdin workflow + - name: crowdin action + uses: crowdin/github-action@v2 + with: + config: crowdin/config.yml + upload_sources: false + upload_translations: false + download_translations: true + create_pull_request: false + push_translations: false + push_sources: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # A numeric ID, found at https://crowdin.com/project//tools/api + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + + # Visit https://crowdin.com/settings#api-key to create this token + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + + CROWDIN_BASE_PATH: "../src/" + # frontend i18n + - name: Restore the frontend cache + uses: actions/cache@v4 + with: + path: "src/frontend/**/node_modules" + key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + fail-on-cache-miss: true + - name: generate translations files + working-directory: src/frontend + run: yarn i18n:deploy + # Create a new PR + - name: Create a new Pull Request with new translated strings + uses: peter-evans/create-pull-request@v7 + with: + commit-message: | + 🌐(i18n) update translated strings + + Update translated files with new translations + title: 🌐(i18n) update translated strings + body: | + ## Purpose + + update translated strings + + ## Proposal + + - [x] update translated strings + branch: i18n/update-translations + labels: i18n diff --git a/.github/workflows/crowdin_upload.yml b/.github/workflows/crowdin_upload.yml new file mode 100644 index 00000000..e35731f2 --- /dev/null +++ b/.github/workflows/crowdin_upload.yml @@ -0,0 +1,67 @@ +name: Update crowdin sources + +on: + workflow_dispatch: + push: + branches: + - main + +jobs: + install-front: + uses: ./.github/workflows/front-dependencies-installation.yml + with: + node_version: '20.x' + + synchronize-with-crowdin: + needs: install-front + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + # Backend i18n + - name: Install Python + uses: actions/setup-python@v3 + with: + python-version: "3.12.6" + - name: Upgrade pip and setuptools + run: pip install --upgrade pip setuptools + - name: Install development dependencies + run: pip install --user . + working-directory: src/backend + - name: Install gettext + run: | + sudo apt-get update + sudo apt-get install -y gettext pandoc + - name: generate pot files + working-directory: src/backend + run: | + DJANGO_CONFIGURATION=Build python manage.py makemessages -a --keep-pot + # frontend i18n + - name: Restore the frontend cache + uses: actions/cache@v4 + with: + path: "src/frontend/**/node_modules" + key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + fail-on-cache-miss: true + - name: generate source translation file + working-directory: src/frontend + run: yarn i18n:extract + # crowdin workflow + - name: crowdin action + uses: crowdin/github-action@v2 + with: + config: crowdin/config.yml + upload_sources: true + upload_translations: false + download_translations: false + create_pull_request: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # A numeric ID, found at https://crowdin.com/project//tools/api + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + + # Visit https://crowdin.com/settings#api-key to create this token + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + + CROWDIN_BASE_PATH: "../src/" diff --git a/.github/workflows/front-dependencies-installation.yml b/.github/workflows/front-dependencies-installation.yml new file mode 100644 index 00000000..33bb3c43 --- /dev/null +++ b/.github/workflows/front-dependencies-installation.yml @@ -0,0 +1,36 @@ +name: Install frontend installation reusable workflow + +on: + workflow_call: + inputs: + node_version: + required: false + default: '20.x' + type: string + +jobs: + front-dependencies-installation: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Restore the frontend cache + uses: actions/cache@v4 + id: front-node_modules + with: + path: "src/frontend/**/node_modules" + key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + - name: Setup Node.js + if: steps.front-node_modules.outputs.cache-hit != 'true' + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.node_version }} + - name: Install dependencies + if: steps.front-node_modules.outputs.cache-hit != 'true' + run: cd src/frontend/ && yarn install --frozen-lockfile + - name: Cache install frontend + if: steps.front-node_modules.outputs.cache-hit != 'true' + uses: actions/cache@v4 + with: + path: "src/frontend/**/node_modules" + key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} diff --git a/.github/workflows/impress-frontend.yml b/.github/workflows/impress-frontend.yml index 8bc32e68..ae07bf2b 100644 --- a/.github/workflows/impress-frontend.yml +++ b/.github/workflows/impress-frontend.yml @@ -9,39 +9,15 @@ on: - "*" jobs: + install-front: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "20.x" - - - name: Restore the frontend cache - uses: actions/cache@v4 - id: front-node_modules - with: - path: "src/frontend/**/node_modules" - key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} - - - name: Install dependencies - if: steps.front-node_modules.outputs.cache-hit != 'true' - run: cd src/frontend/ && yarn install --frozen-lockfile - - - name: Cache install frontend - if: steps.front-node_modules.outputs.cache-hit != 'true' - uses: actions/cache@v4 - with: - path: "src/frontend/**/node_modules" - key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + uses: ./.github/workflows/front-dependencies-installation.yml + with: + node_version: '20.x' test-front: - runs-on: ubuntu-latest needs: install-front + runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 @@ -53,10 +29,10 @@ jobs: - name: Restore the frontend cache uses: actions/cache@v4 - id: front-node_modules with: path: "src/frontend/**/node_modules" key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + fail-on-cache-miss: true - name: Test App run: cd src/frontend/ && yarn test @@ -68,29 +44,39 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20.x" - name: Restore the frontend cache uses: actions/cache@v4 - id: front-node_modules with: path: "src/frontend/**/node_modules" key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + fail-on-cache-miss: true - name: Check linting run: cd src/frontend/ && yarn lint test-e2e-chromium: runs-on: ubuntu-latest + needs: install-front timeout-minutes: 20 steps: - name: Checkout repository uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20.x" + - name: Restore the frontend cache uses: actions/cache@v4 - id: front-node_modules with: path: "src/frontend/**/node_modules" key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + fail-on-cache-miss: true - name: Set e2e env variables run: cat env.d/development/common.e2e.dist >> env.d/development/common.dist @@ -141,12 +127,8 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Restore the frontend cache - uses: actions/cache@v4 - id: front-node_modules - with: - path: "src/frontend/**/node_modules" - key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} + - name: Install frontend dependencies + uses: ./.github/workflows/front-dependencies-installation.yml - name: Set e2e env variables run: cat env.d/development/common.e2e.dist >> env.d/development/common.dist diff --git a/.gitignore b/.gitignore index 074d320c..aa557381 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ MANIFEST .next/ # Translations # Translations +*.mo *.pot # Environments diff --git a/CHANGELOG.md b/CHANGELOG.md index cd95e5ee..5a8ae7b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to ## [Unreleased] +## Added + +- github actions to managed Crowdin workflow + ## [2.0.1] - 2025-01-17 ## Fixed @@ -16,7 +20,6 @@ and this project adheres to -🐛(frontend) share modal is shown when you don't have the abilities #557 -🐛(frontend) title copy break app #564 - ## [2.0.0] - 2025-01-13 ## Added diff --git a/Dockerfile b/Dockerfile index f6378f9e..941f0747 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,7 +51,7 @@ COPY ./src/backend /app/ WORKDIR /app # collectstatic -RUN DJANGO_CONFIGURATION=Build DJANGO_JWT_PRIVATE_SIGNING_KEY=Dummy \ +RUN DJANGO_CONFIGURATION=Build \ python manage.py collectstatic --noinput # Replace duplicated file by a symlink to decrease the overall size of the @@ -92,6 +92,11 @@ COPY ./src/backend /app/ WORKDIR /app +# Generate compiled translation messages +RUN DJANGO_CONFIGURATION=Build \ + python manage.py compilemessages + + # We wrap commands run in this container by the following entrypoint that # creates a user on-the-fly with the container user ID (see USER) and root group # ID. diff --git a/crowdin/config.yml b/crowdin/config.yml index 4f167ff6..724e321b 100644 --- a/crowdin/config.yml +++ b/crowdin/config.yml @@ -1,7 +1,7 @@ # # Your crowdin's credentials # -api_token_env: CROWDIN_API_TOKEN +api_token_env: CROWDIN_PERSONAL_TOKEN project_id_env: CROWDIN_PROJECT_ID base_path_env: CROWDIN_BASE_PATH @@ -15,11 +15,11 @@ preserve_hierarchy: true # Files configuration # files: [ - { - source : "/backend/locale/django.pot", - dest: "/backend-impress.pot", - translation : "/backend/locale/%locale_with_underscore%/LC_MESSAGES/django.po" - }, + { + source : "/backend/locale/django.pot", + dest: "/backend-impress.pot", + translation : "/backend/locale/%locale_with_underscore%/LC_MESSAGES/django.po" + }, { source: "/frontend/packages/i18n/locales/impress/translations-crowdin.json", dest: "/frontend-impress.json", diff --git a/env.d/development/crowdin.dist b/env.d/development/crowdin.dist index 1218e3b7..6c6a9d8a 100644 --- a/env.d/development/crowdin.dist +++ b/env.d/development/crowdin.dist @@ -1,3 +1,3 @@ -CROWDIN_API_TOKEN=Your-Api-Token +CROWDIN_PERSONAL_TOKEN=Your-Personal-Token CROWDIN_PROJECT_ID=Your-Project-Id CROWDIN_BASE_PATH=/app/src diff --git a/src/backend/locale/de_DE/LC_MESSAGES/django.mo b/src/backend/locale/de_DE/LC_MESSAGES/django.mo deleted file mode 100644 index 302b9f1a..00000000 Binary files a/src/backend/locale/de_DE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/src/backend/locale/de_DE/LC_MESSAGES/django.po b/src/backend/locale/de_DE/LC_MESSAGES/django.po index 0b324084..a9db616c 100644 --- a/src/backend/locale/de_DE/LC_MESSAGES/django.po +++ b/src/backend/locale/de_DE/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: lasuite-people\n" +"Project-Id-Version: lasuite-docs\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-17 15:50+0000\n" -"PO-Revision-Date: 2025-01-14 15:14\n" +"POT-Creation-Date: 2025-01-15 21:00+0000\n" +"PO-Revision-Date: 2025-01-16 19:53\n" "Last-Translator: \n" "Language-Team: German\n" "Language: de_DE\n" @@ -11,384 +11,342 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Crowdin-Project: lasuite-people\n" -"X-Crowdin-Project-ID: 637934\n" +"X-Crowdin-Project: lasuite-docs\n" +"X-Crowdin-Project-ID: 754523\n" "X-Crowdin-Language: de\n" "X-Crowdin-File: backend-impress.pot\n" -"X-Crowdin-File-ID: 8\n" +"X-Crowdin-File-ID: 18\n" -#: core/admin.py:33 +#: build/lib/core/admin.py:33 core/admin.py:33 msgid "Personal info" msgstr "Persönliche Daten" -#: core/admin.py:46 +#: build/lib/core/admin.py:46 core/admin.py:46 msgid "Permissions" msgstr "Berechtigungen" -#: core/admin.py:58 +#: build/lib/core/admin.py:58 core/admin.py:58 msgid "Important dates" msgstr "Wichtige Daten" -#: core/api/filters.py:16 +#: build/lib/core/api/filters.py:16 core/api/filters.py:16 msgid "Creator is me" msgstr "Ersteller bin ich" -#: core/api/filters.py:19 +#: build/lib/core/api/filters.py:19 core/api/filters.py:19 msgid "Favorite" msgstr "Favorit" -#: core/api/filters.py:22 +#: build/lib/core/api/filters.py:22 core/api/filters.py:22 msgid "Title" msgstr "Titel" -#: core/api/serializers.py:307 +#: build/lib/core/api/serializers.py:317 core/api/serializers.py:317 msgid "A new document was created on your behalf!" msgstr "Ein neues Dokument wurde in Ihrem Namen erstellt!" -#: core/api/serializers.py:311 +#: build/lib/core/api/serializers.py:321 core/api/serializers.py:321 msgid "You have been granted ownership of a new document:" msgstr "Sie sind Besitzer eines neuen Dokuments:" -#: core/api/serializers.py:414 +#: build/lib/core/api/serializers.py:422 core/api/serializers.py:422 msgid "Body" msgstr "Inhalt" -#: core/api/serializers.py:417 +#: build/lib/core/api/serializers.py:425 core/api/serializers.py:425 msgid "Body type" msgstr "Typ" -#: core/api/serializers.py:423 +#: build/lib/core/api/serializers.py:431 core/api/serializers.py:431 msgid "Format" -msgstr "Format" +msgstr "" -#: core/authentication/backends.py:57 +#: build/lib/core/authentication/backends.py:61 +#: core/authentication/backends.py:61 msgid "Invalid response format or token verification failed" msgstr "Ungültiges Antwortformat oder Token-Verifizierung fehlgeschlagen" -#: core/authentication/backends.py:81 -msgid "User info contained no recognizable user identification" -msgstr "Benutzerinfo enthielt keine erkennbare Benutzeridentifikation" - -#: core/authentication/backends.py:88 +#: build/lib/core/authentication/backends.py:108 +#: core/authentication/backends.py:108 msgid "User account is disabled" msgstr "Benutzerkonto ist deaktiviert" -#: core/models.py:62 core/models.py:69 +#: build/lib/core/models.py:63 build/lib/core/models.py:70 core/models.py:63 +#: core/models.py:70 msgid "Reader" msgstr "Lesen" -#: core/models.py:63 core/models.py:70 +#: build/lib/core/models.py:64 build/lib/core/models.py:71 core/models.py:64 +#: core/models.py:71 msgid "Editor" msgstr "Bearbeiten" -#: core/models.py:71 +#: build/lib/core/models.py:72 core/models.py:72 msgid "Administrator" -msgstr "Administrator" +msgstr "" -#: core/models.py:72 +#: build/lib/core/models.py:73 core/models.py:73 msgid "Owner" msgstr "Besitzer" -#: core/models.py:83 +#: build/lib/core/models.py:84 core/models.py:84 msgid "Restricted" msgstr "Beschränkt" -#: core/models.py:87 +#: build/lib/core/models.py:88 core/models.py:88 msgid "Authenticated" msgstr "Authentifiziert" -#: core/models.py:89 +#: build/lib/core/models.py:90 core/models.py:90 msgid "Public" msgstr "Öffentlich" -#: core/models.py:101 +#: build/lib/core/models.py:112 core/models.py:112 msgid "id" msgstr "" -#: core/models.py:102 +#: build/lib/core/models.py:113 core/models.py:113 msgid "primary key for the record as UUID" msgstr "" -#: core/models.py:108 +#: build/lib/core/models.py:119 core/models.py:119 msgid "created on" msgstr "Erstellt" -#: core/models.py:109 +#: build/lib/core/models.py:120 core/models.py:120 msgid "date and time at which a record was created" msgstr "Datum und Uhrzeit, an dem ein Datensatz erstellt wurde" -#: core/models.py:114 +#: build/lib/core/models.py:125 core/models.py:125 msgid "updated on" msgstr "Aktualisiert" -#: core/models.py:115 +#: build/lib/core/models.py:126 core/models.py:126 msgid "date and time at which a record was last updated" msgstr "Datum und Uhrzeit, an dem zuletzt aktualisiert wurde" -#: core/models.py:135 +#: build/lib/core/models.py:162 core/models.py:162 +msgid "We couldn't find a user with this sub but the email is already associated with a registered user." +msgstr "" + +#: build/lib/core/models.py:175 core/models.py:175 msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters." msgstr "Geben Sie eine gültige Unterseite ein. Dieser Wert darf nur Buchstaben, Zahlen und die @/./+/-/_/: Zeichen enthalten." -#: core/models.py:141 +#: build/lib/core/models.py:181 core/models.py:181 msgid "sub" msgstr "unter" -#: core/models.py:143 +#: build/lib/core/models.py:183 core/models.py:183 msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only." msgstr "Erforderlich. 255 Zeichen oder weniger. Buchstaben, Zahlen und die Zeichen @/./+/-/_/:" -#: core/models.py:152 +#: build/lib/core/models.py:192 core/models.py:192 msgid "full name" msgstr "Name" -#: core/models.py:153 +#: build/lib/core/models.py:193 core/models.py:193 msgid "short name" msgstr "Kurzbezeichnung" -#: core/models.py:155 +#: build/lib/core/models.py:195 core/models.py:195 msgid "identity email address" msgstr "Identitäts-E-Mail-Adresse" -#: core/models.py:160 +#: build/lib/core/models.py:200 core/models.py:200 msgid "admin email address" msgstr "Admin E-Mail-Adresse" -#: core/models.py:167 +#: build/lib/core/models.py:207 core/models.py:207 msgid "language" msgstr "Sprache" -#: core/models.py:168 +#: build/lib/core/models.py:208 core/models.py:208 msgid "The language in which the user wants to see the interface." msgstr "Die Sprache, in der der Benutzer die Benutzeroberfläche sehen möchte." -#: core/models.py:174 +#: build/lib/core/models.py:214 core/models.py:214 msgid "The timezone in which the user wants to see times." msgstr "Die Zeitzone, in der der Nutzer Zeiten sehen möchte." -#: core/models.py:177 +#: build/lib/core/models.py:217 core/models.py:217 msgid "device" msgstr "Gerät" -#: core/models.py:179 +#: build/lib/core/models.py:219 core/models.py:219 msgid "Whether the user is a device or a real user." msgstr "Ob der Benutzer ein Gerät oder ein echter Benutzer ist." -#: core/models.py:182 +#: build/lib/core/models.py:222 core/models.py:222 msgid "staff status" msgstr "Status des Teammitgliedes" -#: core/models.py:184 +#: build/lib/core/models.py:224 core/models.py:224 msgid "Whether the user can log into this admin site." msgstr "Gibt an, ob der Benutzer sich in diese Admin-Seite einloggen kann." -#: core/models.py:187 +#: build/lib/core/models.py:227 core/models.py:227 msgid "active" msgstr "aktiviert" -#: core/models.py:190 +#: build/lib/core/models.py:230 core/models.py:230 msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts." msgstr "Ob dieser Benutzer als aktiviert behandelt werden soll. Deaktivieren Sie diese Option, anstatt Konten zu löschen." -#: core/models.py:202 +#: build/lib/core/models.py:242 core/models.py:242 msgid "user" msgstr "Benutzer" -#: core/models.py:203 +#: build/lib/core/models.py:243 core/models.py:243 msgid "users" msgstr "Benutzer" -#: core/models.py:342 core/models.py:718 +#: build/lib/core/models.py:382 build/lib/core/models.py:758 core/models.py:382 +#: core/models.py:758 msgid "title" msgstr "Titel" -#: core/models.py:364 +#: build/lib/core/models.py:404 core/models.py:404 msgid "Document" msgstr "Dokument" -#: core/models.py:365 +#: build/lib/core/models.py:405 core/models.py:405 msgid "Documents" msgstr "Dokumente" -#: core/models.py:368 +#: build/lib/core/models.py:408 core/models.py:408 msgid "Untitled Document" msgstr "Unbenanntes Dokument" -#: core/models.py:593 +#: build/lib/core/models.py:633 core/models.py:633 #, python-brace-format msgid "{name} shared a document with you!" msgstr "{name} hat ein Dokument mit Ihnen geteilt!" -#: core/models.py:597 +#: build/lib/core/models.py:637 core/models.py:637 #, python-brace-format msgid "{name} invited you with the role \"{role}\" on the following document:" msgstr "{name} hat Sie mit der Rolle \"{role}\" zu folgendem Dokument eingeladen:" -#: core/models.py:600 +#: build/lib/core/models.py:640 core/models.py:640 #, python-brace-format msgid "{name} shared a document with you: {title}" msgstr "{name} hat ein Dokument mit Ihnen geteilt: {title}" -#: core/models.py:623 +#: build/lib/core/models.py:663 core/models.py:663 msgid "Document/user link trace" msgstr "Dokument/Benutzer Linkverfolgung" -#: core/models.py:624 +#: build/lib/core/models.py:664 core/models.py:664 msgid "Document/user link traces" msgstr "Dokument/Benutzer Linkverfolgung" -#: core/models.py:630 +#: build/lib/core/models.py:670 core/models.py:670 msgid "A link trace already exists for this document/user." msgstr "" -#: core/models.py:653 +#: build/lib/core/models.py:693 core/models.py:693 msgid "Document favorite" msgstr "Dokumentenfavorit" -#: core/models.py:654 +#: build/lib/core/models.py:694 core/models.py:694 msgid "Document favorites" msgstr "Dokumentfavoriten" -#: core/models.py:660 +#: build/lib/core/models.py:700 core/models.py:700 msgid "This document is already targeted by a favorite relation instance for the same user." msgstr "Dieses Dokument ist bereits durch den gleichen Benutzer favorisiert worden." -#: core/models.py:682 +#: build/lib/core/models.py:722 core/models.py:722 msgid "Document/user relation" msgstr "Dokument/Benutzerbeziehung" -#: core/models.py:683 +#: build/lib/core/models.py:723 core/models.py:723 msgid "Document/user relations" msgstr "Dokument/Benutzerbeziehungen" -#: core/models.py:689 +#: build/lib/core/models.py:729 core/models.py:729 msgid "This user is already in this document." msgstr "Dieser Benutzer befindet sich bereits in diesem Dokument." -#: core/models.py:695 +#: build/lib/core/models.py:735 core/models.py:735 msgid "This team is already in this document." msgstr "Dieses Team befindet sich bereits in diesem Dokument." -#: core/models.py:701 core/models.py:890 +#: build/lib/core/models.py:741 build/lib/core/models.py:930 core/models.py:741 +#: core/models.py:930 msgid "Either user or team must be set, not both." msgstr "Benutzer oder Team müssen gesetzt werden, nicht beides." -#: core/models.py:719 +#: build/lib/core/models.py:759 core/models.py:759 msgid "description" msgstr "Beschreibung" -#: core/models.py:720 +#: build/lib/core/models.py:760 core/models.py:760 msgid "code" msgstr "Code" -#: core/models.py:721 +#: build/lib/core/models.py:761 core/models.py:761 msgid "css" msgstr "CSS" -#: core/models.py:723 +#: build/lib/core/models.py:763 core/models.py:763 msgid "public" msgstr "öffentlich" -#: core/models.py:725 +#: build/lib/core/models.py:765 core/models.py:765 msgid "Whether this template is public for anyone to use." msgstr "Ob diese Vorlage für jedermann öffentlich ist." -#: core/models.py:731 +#: build/lib/core/models.py:771 core/models.py:771 msgid "Template" msgstr "Vorlage" -#: core/models.py:732 +#: build/lib/core/models.py:772 core/models.py:772 msgid "Templates" msgstr "Vorlagen" -#: core/models.py:871 +#: build/lib/core/models.py:911 core/models.py:911 msgid "Template/user relation" msgstr "Vorlage/Benutzer-Beziehung" -#: core/models.py:872 +#: build/lib/core/models.py:912 core/models.py:912 msgid "Template/user relations" msgstr "Vorlage/Benutzerbeziehungen" -#: core/models.py:878 +#: build/lib/core/models.py:918 core/models.py:918 msgid "This user is already in this template." msgstr "Dieser Benutzer ist bereits in dieser Vorlage." -#: core/models.py:884 +#: build/lib/core/models.py:924 core/models.py:924 msgid "This team is already in this template." msgstr "Dieses Team ist bereits in diesem Template." -#: core/models.py:907 +#: build/lib/core/models.py:947 core/models.py:947 msgid "email address" msgstr "E-Mail-Adresse" -#: core/models.py:926 +#: build/lib/core/models.py:966 core/models.py:966 msgid "Document invitation" msgstr "Einladung zum Dokument" -#: core/models.py:927 +#: build/lib/core/models.py:967 core/models.py:967 msgid "Document invitations" msgstr "Dokumenteinladungen" -#: core/models.py:944 +#: build/lib/core/models.py:987 core/models.py:987 msgid "This email is already associated to a registered user." msgstr "Diese E-Mail ist bereits einem registrierten Benutzer zugeordnet." -#: core/templates/mail/html/hello.html:159 core/templates/mail/text/hello.txt:3 -msgid "Company logo" -msgstr "Unternehmens-Logo" - -#: core/templates/mail/html/hello.html:188 core/templates/mail/text/hello.txt:5 -#, python-format -msgid "Hello %(name)s" -msgstr "Guten Tag %(name)s!" - -#: core/templates/mail/html/hello.html:188 core/templates/mail/text/hello.txt:5 -msgid "Hello" -msgstr "Hallo" - -#: core/templates/mail/html/hello.html:189 core/templates/mail/text/hello.txt:6 -msgid "Thank you very much for your visit!" -msgstr "Vielen Dank für Ihren Besuch!" - -#: core/templates/mail/html/hello.html:221 -#, python-format -msgid "This mail has been sent to %(email)s by %(name)s" -msgstr "Diese E-Mail wurde an %(email)s von %(name)s gesendet" - -#: core/templates/mail/html/invitation.html:162 -#: core/templates/mail/text/invitation.txt:3 -msgid "Logo email" -msgstr "Logo-E-Mail" - -#: core/templates/mail/html/invitation.html:209 -#: core/templates/mail/text/invitation.txt:10 -msgid "Open" -msgstr "Öffnen" - -#: core/templates/mail/html/invitation.html:226 -#: core/templates/mail/text/invitation.txt:14 -msgid " Docs, your new essential tool for organizing, sharing and collaborating on your documents as a team. " -msgstr " Docs, Ihr neues unentbehrliches Werkzeug für die Organisation, den Austausch und die Zusammenarbeit in Ihren Dokumenten als Team. " - -#: core/templates/mail/html/invitation.html:233 -#: core/templates/mail/text/invitation.txt:16 -#, python-format -msgid " Brought to you by %(brandname)s " -msgstr " Erstellt von %(brandname)s " - -#: core/templates/mail/text/hello.txt:8 -#, python-format -msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" -msgstr "Diese E-Mail wurde an %(email)s von %(name)s [%(href)s ] gesendet" - -#: impress/settings.py:236 +#: build/lib/impress/settings.py:236 impress/settings.py:236 msgid "English" msgstr "Englisch" -#: impress/settings.py:237 +#: build/lib/impress/settings.py:237 impress/settings.py:237 msgid "French" msgstr "Französisch" -#: impress/settings.py:238 +#: build/lib/impress/settings.py:238 impress/settings.py:238 msgid "German" msgstr "Deutsch" diff --git a/src/backend/locale/en_US/LC_MESSAGES/django.mo b/src/backend/locale/en_US/LC_MESSAGES/django.mo deleted file mode 100644 index 446a85cf..00000000 Binary files a/src/backend/locale/en_US/LC_MESSAGES/django.mo and /dev/null differ diff --git a/src/backend/locale/fr_FR/LC_MESSAGES/django.mo b/src/backend/locale/fr_FR/LC_MESSAGES/django.mo deleted file mode 100644 index dc598e85..00000000 Binary files a/src/backend/locale/fr_FR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/src/backend/locale/fr_FR/LC_MESSAGES/django.po b/src/backend/locale/fr_FR/LC_MESSAGES/django.po index 8e860803..27272fd9 100644 --- a/src/backend/locale/fr_FR/LC_MESSAGES/django.po +++ b/src/backend/locale/fr_FR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: lasuite-people\n" +"Project-Id-Version: lasuite-docs\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-17 15:50+0000\n" -"PO-Revision-Date: 2024-12-17 15:53\n" +"POT-Creation-Date: 2025-01-15 21:00+0000\n" +"PO-Revision-Date: 2025-01-16 19:53\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -11,384 +11,342 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Crowdin-Project: lasuite-people\n" -"X-Crowdin-Project-ID: 637934\n" +"X-Crowdin-Project: lasuite-docs\n" +"X-Crowdin-Project-ID: 754523\n" "X-Crowdin-Language: fr\n" "X-Crowdin-File: backend-impress.pot\n" -"X-Crowdin-File-ID: 8\n" +"X-Crowdin-File-ID: 18\n" -#: core/admin.py:33 +#: build/lib/core/admin.py:33 core/admin.py:33 msgid "Personal info" msgstr "Infos Personnelles" -#: core/admin.py:46 +#: build/lib/core/admin.py:46 core/admin.py:46 msgid "Permissions" -msgstr "Permissions" +msgstr "" -#: core/admin.py:58 +#: build/lib/core/admin.py:58 core/admin.py:58 msgid "Important dates" msgstr "Dates importantes" -#: core/api/filters.py:16 +#: build/lib/core/api/filters.py:16 core/api/filters.py:16 msgid "Creator is me" msgstr "" -#: core/api/filters.py:19 +#: build/lib/core/api/filters.py:19 core/api/filters.py:19 msgid "Favorite" msgstr "" -#: core/api/filters.py:22 +#: build/lib/core/api/filters.py:22 core/api/filters.py:22 msgid "Title" msgstr "" -#: core/api/serializers.py:307 +#: build/lib/core/api/serializers.py:317 core/api/serializers.py:317 msgid "A new document was created on your behalf!" msgstr "Un nouveau document a été créé pour vous !" -#: core/api/serializers.py:311 +#: build/lib/core/api/serializers.py:321 core/api/serializers.py:321 msgid "You have been granted ownership of a new document:" msgstr "Vous avez été déclaré propriétaire d'un nouveau document :" -#: core/api/serializers.py:414 +#: build/lib/core/api/serializers.py:422 core/api/serializers.py:422 msgid "Body" msgstr "" -#: core/api/serializers.py:417 +#: build/lib/core/api/serializers.py:425 core/api/serializers.py:425 msgid "Body type" msgstr "" -#: core/api/serializers.py:423 +#: build/lib/core/api/serializers.py:431 core/api/serializers.py:431 msgid "Format" msgstr "" -#: core/authentication/backends.py:57 +#: build/lib/core/authentication/backends.py:61 +#: core/authentication/backends.py:61 msgid "Invalid response format or token verification failed" msgstr "" -#: core/authentication/backends.py:81 -msgid "User info contained no recognizable user identification" -msgstr "" - -#: core/authentication/backends.py:88 +#: build/lib/core/authentication/backends.py:108 +#: core/authentication/backends.py:108 msgid "User account is disabled" msgstr "" -#: core/models.py:62 core/models.py:69 +#: build/lib/core/models.py:63 build/lib/core/models.py:70 core/models.py:63 +#: core/models.py:70 msgid "Reader" msgstr "Lecteur" -#: core/models.py:63 core/models.py:70 +#: build/lib/core/models.py:64 build/lib/core/models.py:71 core/models.py:64 +#: core/models.py:71 msgid "Editor" msgstr "Éditeur" -#: core/models.py:71 +#: build/lib/core/models.py:72 core/models.py:72 msgid "Administrator" msgstr "Administrateur" -#: core/models.py:72 +#: build/lib/core/models.py:73 core/models.py:73 msgid "Owner" msgstr "Propriétaire" -#: core/models.py:83 +#: build/lib/core/models.py:84 core/models.py:84 msgid "Restricted" msgstr "Restreint" -#: core/models.py:87 +#: build/lib/core/models.py:88 core/models.py:88 msgid "Authenticated" msgstr "Authentifié" -#: core/models.py:89 +#: build/lib/core/models.py:90 core/models.py:90 msgid "Public" -msgstr "Public" +msgstr "" -#: core/models.py:101 +#: build/lib/core/models.py:112 core/models.py:112 msgid "id" msgstr "" -#: core/models.py:102 +#: build/lib/core/models.py:113 core/models.py:113 msgid "primary key for the record as UUID" msgstr "" -#: core/models.py:108 +#: build/lib/core/models.py:119 core/models.py:119 msgid "created on" msgstr "" -#: core/models.py:109 +#: build/lib/core/models.py:120 core/models.py:120 msgid "date and time at which a record was created" msgstr "" -#: core/models.py:114 +#: build/lib/core/models.py:125 core/models.py:125 msgid "updated on" msgstr "" -#: core/models.py:115 +#: build/lib/core/models.py:126 core/models.py:126 msgid "date and time at which a record was last updated" msgstr "" -#: core/models.py:135 +#: build/lib/core/models.py:162 core/models.py:162 +msgid "We couldn't find a user with this sub but the email is already associated with a registered user." +msgstr "" + +#: build/lib/core/models.py:175 core/models.py:175 msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters." msgstr "" -#: core/models.py:141 +#: build/lib/core/models.py:181 core/models.py:181 msgid "sub" msgstr "" -#: core/models.py:143 +#: build/lib/core/models.py:183 core/models.py:183 msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only." msgstr "" -#: core/models.py:152 +#: build/lib/core/models.py:192 core/models.py:192 msgid "full name" msgstr "" -#: core/models.py:153 +#: build/lib/core/models.py:193 core/models.py:193 msgid "short name" msgstr "" -#: core/models.py:155 +#: build/lib/core/models.py:195 core/models.py:195 msgid "identity email address" msgstr "" -#: core/models.py:160 +#: build/lib/core/models.py:200 core/models.py:200 msgid "admin email address" msgstr "" -#: core/models.py:167 +#: build/lib/core/models.py:207 core/models.py:207 msgid "language" msgstr "" -#: core/models.py:168 +#: build/lib/core/models.py:208 core/models.py:208 msgid "The language in which the user wants to see the interface." msgstr "" -#: core/models.py:174 +#: build/lib/core/models.py:214 core/models.py:214 msgid "The timezone in which the user wants to see times." msgstr "" -#: core/models.py:177 +#: build/lib/core/models.py:217 core/models.py:217 msgid "device" msgstr "" -#: core/models.py:179 +#: build/lib/core/models.py:219 core/models.py:219 msgid "Whether the user is a device or a real user." msgstr "" -#: core/models.py:182 +#: build/lib/core/models.py:222 core/models.py:222 msgid "staff status" msgstr "" -#: core/models.py:184 +#: build/lib/core/models.py:224 core/models.py:224 msgid "Whether the user can log into this admin site." msgstr "" -#: core/models.py:187 +#: build/lib/core/models.py:227 core/models.py:227 msgid "active" msgstr "" -#: core/models.py:190 +#: build/lib/core/models.py:230 core/models.py:230 msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts." msgstr "" -#: core/models.py:202 +#: build/lib/core/models.py:242 core/models.py:242 msgid "user" msgstr "" -#: core/models.py:203 +#: build/lib/core/models.py:243 core/models.py:243 msgid "users" msgstr "" -#: core/models.py:342 core/models.py:718 +#: build/lib/core/models.py:382 build/lib/core/models.py:758 core/models.py:382 +#: core/models.py:758 msgid "title" msgstr "" -#: core/models.py:364 +#: build/lib/core/models.py:404 core/models.py:404 msgid "Document" msgstr "" -#: core/models.py:365 +#: build/lib/core/models.py:405 core/models.py:405 msgid "Documents" msgstr "" -#: core/models.py:368 +#: build/lib/core/models.py:408 core/models.py:408 msgid "Untitled Document" msgstr "" -#: core/models.py:593 +#: build/lib/core/models.py:633 core/models.py:633 #, python-brace-format msgid "{name} shared a document with you!" msgstr "{name} a partagé un document avec vous!" -#: core/models.py:597 +#: build/lib/core/models.py:637 core/models.py:637 #, python-brace-format msgid "{name} invited you with the role \"{role}\" on the following document:" msgstr "{name} vous a invité avec le rôle \"{role}\" sur le document suivant:" -#: core/models.py:600 +#: build/lib/core/models.py:640 core/models.py:640 #, python-brace-format msgid "{name} shared a document with you: {title}" msgstr "{name} a partagé un document avec vous: {title}" -#: core/models.py:623 +#: build/lib/core/models.py:663 core/models.py:663 msgid "Document/user link trace" msgstr "" -#: core/models.py:624 +#: build/lib/core/models.py:664 core/models.py:664 msgid "Document/user link traces" msgstr "" -#: core/models.py:630 +#: build/lib/core/models.py:670 core/models.py:670 msgid "A link trace already exists for this document/user." msgstr "" -#: core/models.py:653 +#: build/lib/core/models.py:693 core/models.py:693 msgid "Document favorite" msgstr "" -#: core/models.py:654 +#: build/lib/core/models.py:694 core/models.py:694 msgid "Document favorites" msgstr "" -#: core/models.py:660 +#: build/lib/core/models.py:700 core/models.py:700 msgid "This document is already targeted by a favorite relation instance for the same user." msgstr "" -#: core/models.py:682 +#: build/lib/core/models.py:722 core/models.py:722 msgid "Document/user relation" msgstr "" -#: core/models.py:683 +#: build/lib/core/models.py:723 core/models.py:723 msgid "Document/user relations" msgstr "" -#: core/models.py:689 +#: build/lib/core/models.py:729 core/models.py:729 msgid "This user is already in this document." msgstr "" -#: core/models.py:695 +#: build/lib/core/models.py:735 core/models.py:735 msgid "This team is already in this document." msgstr "" -#: core/models.py:701 core/models.py:890 +#: build/lib/core/models.py:741 build/lib/core/models.py:930 core/models.py:741 +#: core/models.py:930 msgid "Either user or team must be set, not both." msgstr "" -#: core/models.py:719 +#: build/lib/core/models.py:759 core/models.py:759 msgid "description" msgstr "" -#: core/models.py:720 +#: build/lib/core/models.py:760 core/models.py:760 msgid "code" msgstr "" -#: core/models.py:721 +#: build/lib/core/models.py:761 core/models.py:761 msgid "css" msgstr "" -#: core/models.py:723 +#: build/lib/core/models.py:763 core/models.py:763 msgid "public" msgstr "" -#: core/models.py:725 +#: build/lib/core/models.py:765 core/models.py:765 msgid "Whether this template is public for anyone to use." msgstr "" -#: core/models.py:731 +#: build/lib/core/models.py:771 core/models.py:771 msgid "Template" msgstr "" -#: core/models.py:732 +#: build/lib/core/models.py:772 core/models.py:772 msgid "Templates" msgstr "" -#: core/models.py:871 +#: build/lib/core/models.py:911 core/models.py:911 msgid "Template/user relation" msgstr "" -#: core/models.py:872 +#: build/lib/core/models.py:912 core/models.py:912 msgid "Template/user relations" msgstr "" -#: core/models.py:878 +#: build/lib/core/models.py:918 core/models.py:918 msgid "This user is already in this template." msgstr "" -#: core/models.py:884 +#: build/lib/core/models.py:924 core/models.py:924 msgid "This team is already in this template." msgstr "" -#: core/models.py:907 +#: build/lib/core/models.py:947 core/models.py:947 msgid "email address" msgstr "" -#: core/models.py:926 +#: build/lib/core/models.py:966 core/models.py:966 msgid "Document invitation" msgstr "" -#: core/models.py:927 +#: build/lib/core/models.py:967 core/models.py:967 msgid "Document invitations" msgstr "" -#: core/models.py:944 +#: build/lib/core/models.py:987 core/models.py:987 msgid "This email is already associated to a registered user." msgstr "" -#: core/templates/mail/html/hello.html:159 core/templates/mail/text/hello.txt:3 -msgid "Company logo" -msgstr "" - -#: core/templates/mail/html/hello.html:188 core/templates/mail/text/hello.txt:5 -#, python-format -msgid "Hello %(name)s" -msgstr "" - -#: core/templates/mail/html/hello.html:188 core/templates/mail/text/hello.txt:5 -msgid "Hello" -msgstr "" - -#: core/templates/mail/html/hello.html:189 core/templates/mail/text/hello.txt:6 -msgid "Thank you very much for your visit!" -msgstr "" - -#: core/templates/mail/html/hello.html:221 -#, python-format -msgid "This mail has been sent to %(email)s by %(name)s" -msgstr "" - -#: core/templates/mail/html/invitation.html:162 -#: core/templates/mail/text/invitation.txt:3 -msgid "Logo email" -msgstr "" - -#: core/templates/mail/html/invitation.html:209 -#: core/templates/mail/text/invitation.txt:10 -msgid "Open" -msgstr "Ouvrir" - -#: core/templates/mail/html/invitation.html:226 -#: core/templates/mail/text/invitation.txt:14 -msgid " Docs, your new essential tool for organizing, sharing and collaborating on your documents as a team. " -msgstr " Docs, votre nouvel outil incontournable pour organiser, partager et collaborer sur vos documents en équipe. " - -#: core/templates/mail/html/invitation.html:233 -#: core/templates/mail/text/invitation.txt:16 -#, python-format -msgid " Brought to you by %(brandname)s " -msgstr " Proposé par %(brandname)s " - -#: core/templates/mail/text/hello.txt:8 -#, python-format -msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" -msgstr "" - -#: impress/settings.py:236 +#: build/lib/impress/settings.py:236 impress/settings.py:236 msgid "English" msgstr "" -#: impress/settings.py:237 +#: build/lib/impress/settings.py:237 impress/settings.py:237 msgid "French" msgstr "" -#: impress/settings.py:238 +#: build/lib/impress/settings.py:238 impress/settings.py:238 msgid "German" msgstr "" diff --git a/src/backend/locale/nl_NL/LC_MESSAGES/django.po b/src/backend/locale/nl_NL/LC_MESSAGES/django.po new file mode 100644 index 00000000..f979f7bb --- /dev/null +++ b/src/backend/locale/nl_NL/LC_MESSAGES/django.po @@ -0,0 +1,352 @@ +msgid "" +msgstr "" +"Project-Id-Version: lasuite-docs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-15 21:00+0000\n" +"PO-Revision-Date: 2025-01-16 19:53\n" +"Last-Translator: \n" +"Language-Team: Dutch\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: lasuite-docs\n" +"X-Crowdin-Project-ID: 754523\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: backend-impress.pot\n" +"X-Crowdin-File-ID: 18\n" + +#: build/lib/core/admin.py:33 core/admin.py:33 +msgid "Personal info" +msgstr "" + +#: build/lib/core/admin.py:46 core/admin.py:46 +msgid "Permissions" +msgstr "" + +#: build/lib/core/admin.py:58 core/admin.py:58 +msgid "Important dates" +msgstr "" + +#: build/lib/core/api/filters.py:16 core/api/filters.py:16 +msgid "Creator is me" +msgstr "" + +#: build/lib/core/api/filters.py:19 core/api/filters.py:19 +msgid "Favorite" +msgstr "" + +#: build/lib/core/api/filters.py:22 core/api/filters.py:22 +msgid "Title" +msgstr "" + +#: build/lib/core/api/serializers.py:317 core/api/serializers.py:317 +msgid "A new document was created on your behalf!" +msgstr "" + +#: build/lib/core/api/serializers.py:321 core/api/serializers.py:321 +msgid "You have been granted ownership of a new document:" +msgstr "" + +#: build/lib/core/api/serializers.py:422 core/api/serializers.py:422 +msgid "Body" +msgstr "" + +#: build/lib/core/api/serializers.py:425 core/api/serializers.py:425 +msgid "Body type" +msgstr "" + +#: build/lib/core/api/serializers.py:431 core/api/serializers.py:431 +msgid "Format" +msgstr "" + +#: build/lib/core/authentication/backends.py:61 +#: core/authentication/backends.py:61 +msgid "Invalid response format or token verification failed" +msgstr "" + +#: build/lib/core/authentication/backends.py:108 +#: core/authentication/backends.py:108 +msgid "User account is disabled" +msgstr "" + +#: build/lib/core/models.py:63 build/lib/core/models.py:70 core/models.py:63 +#: core/models.py:70 +msgid "Reader" +msgstr "" + +#: build/lib/core/models.py:64 build/lib/core/models.py:71 core/models.py:64 +#: core/models.py:71 +msgid "Editor" +msgstr "" + +#: build/lib/core/models.py:72 core/models.py:72 +msgid "Administrator" +msgstr "" + +#: build/lib/core/models.py:73 core/models.py:73 +msgid "Owner" +msgstr "" + +#: build/lib/core/models.py:84 core/models.py:84 +msgid "Restricted" +msgstr "" + +#: build/lib/core/models.py:88 core/models.py:88 +msgid "Authenticated" +msgstr "" + +#: build/lib/core/models.py:90 core/models.py:90 +msgid "Public" +msgstr "" + +#: build/lib/core/models.py:112 core/models.py:112 +msgid "id" +msgstr "" + +#: build/lib/core/models.py:113 core/models.py:113 +msgid "primary key for the record as UUID" +msgstr "" + +#: build/lib/core/models.py:119 core/models.py:119 +msgid "created on" +msgstr "" + +#: build/lib/core/models.py:120 core/models.py:120 +msgid "date and time at which a record was created" +msgstr "" + +#: build/lib/core/models.py:125 core/models.py:125 +msgid "updated on" +msgstr "" + +#: build/lib/core/models.py:126 core/models.py:126 +msgid "date and time at which a record was last updated" +msgstr "" + +#: build/lib/core/models.py:162 core/models.py:162 +msgid "We couldn't find a user with this sub but the email is already associated with a registered user." +msgstr "" + +#: build/lib/core/models.py:175 core/models.py:175 +msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters." +msgstr "" + +#: build/lib/core/models.py:181 core/models.py:181 +msgid "sub" +msgstr "" + +#: build/lib/core/models.py:183 core/models.py:183 +msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only." +msgstr "" + +#: build/lib/core/models.py:192 core/models.py:192 +msgid "full name" +msgstr "" + +#: build/lib/core/models.py:193 core/models.py:193 +msgid "short name" +msgstr "" + +#: build/lib/core/models.py:195 core/models.py:195 +msgid "identity email address" +msgstr "" + +#: build/lib/core/models.py:200 core/models.py:200 +msgid "admin email address" +msgstr "" + +#: build/lib/core/models.py:207 core/models.py:207 +msgid "language" +msgstr "" + +#: build/lib/core/models.py:208 core/models.py:208 +msgid "The language in which the user wants to see the interface." +msgstr "" + +#: build/lib/core/models.py:214 core/models.py:214 +msgid "The timezone in which the user wants to see times." +msgstr "" + +#: build/lib/core/models.py:217 core/models.py:217 +msgid "device" +msgstr "" + +#: build/lib/core/models.py:219 core/models.py:219 +msgid "Whether the user is a device or a real user." +msgstr "" + +#: build/lib/core/models.py:222 core/models.py:222 +msgid "staff status" +msgstr "" + +#: build/lib/core/models.py:224 core/models.py:224 +msgid "Whether the user can log into this admin site." +msgstr "" + +#: build/lib/core/models.py:227 core/models.py:227 +msgid "active" +msgstr "" + +#: build/lib/core/models.py:230 core/models.py:230 +msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts." +msgstr "" + +#: build/lib/core/models.py:242 core/models.py:242 +msgid "user" +msgstr "" + +#: build/lib/core/models.py:243 core/models.py:243 +msgid "users" +msgstr "" + +#: build/lib/core/models.py:382 build/lib/core/models.py:758 core/models.py:382 +#: core/models.py:758 +msgid "title" +msgstr "" + +#: build/lib/core/models.py:404 core/models.py:404 +msgid "Document" +msgstr "" + +#: build/lib/core/models.py:405 core/models.py:405 +msgid "Documents" +msgstr "" + +#: build/lib/core/models.py:408 core/models.py:408 +msgid "Untitled Document" +msgstr "" + +#: build/lib/core/models.py:633 core/models.py:633 +#, python-brace-format +msgid "{name} shared a document with you!" +msgstr "" + +#: build/lib/core/models.py:637 core/models.py:637 +#, python-brace-format +msgid "{name} invited you with the role \"{role}\" on the following document:" +msgstr "" + +#: build/lib/core/models.py:640 core/models.py:640 +#, python-brace-format +msgid "{name} shared a document with you: {title}" +msgstr "" + +#: build/lib/core/models.py:663 core/models.py:663 +msgid "Document/user link trace" +msgstr "" + +#: build/lib/core/models.py:664 core/models.py:664 +msgid "Document/user link traces" +msgstr "" + +#: build/lib/core/models.py:670 core/models.py:670 +msgid "A link trace already exists for this document/user." +msgstr "" + +#: build/lib/core/models.py:693 core/models.py:693 +msgid "Document favorite" +msgstr "" + +#: build/lib/core/models.py:694 core/models.py:694 +msgid "Document favorites" +msgstr "" + +#: build/lib/core/models.py:700 core/models.py:700 +msgid "This document is already targeted by a favorite relation instance for the same user." +msgstr "" + +#: build/lib/core/models.py:722 core/models.py:722 +msgid "Document/user relation" +msgstr "" + +#: build/lib/core/models.py:723 core/models.py:723 +msgid "Document/user relations" +msgstr "" + +#: build/lib/core/models.py:729 core/models.py:729 +msgid "This user is already in this document." +msgstr "" + +#: build/lib/core/models.py:735 core/models.py:735 +msgid "This team is already in this document." +msgstr "" + +#: build/lib/core/models.py:741 build/lib/core/models.py:930 core/models.py:741 +#: core/models.py:930 +msgid "Either user or team must be set, not both." +msgstr "" + +#: build/lib/core/models.py:759 core/models.py:759 +msgid "description" +msgstr "" + +#: build/lib/core/models.py:760 core/models.py:760 +msgid "code" +msgstr "" + +#: build/lib/core/models.py:761 core/models.py:761 +msgid "css" +msgstr "" + +#: build/lib/core/models.py:763 core/models.py:763 +msgid "public" +msgstr "" + +#: build/lib/core/models.py:765 core/models.py:765 +msgid "Whether this template is public for anyone to use." +msgstr "" + +#: build/lib/core/models.py:771 core/models.py:771 +msgid "Template" +msgstr "" + +#: build/lib/core/models.py:772 core/models.py:772 +msgid "Templates" +msgstr "" + +#: build/lib/core/models.py:911 core/models.py:911 +msgid "Template/user relation" +msgstr "" + +#: build/lib/core/models.py:912 core/models.py:912 +msgid "Template/user relations" +msgstr "" + +#: build/lib/core/models.py:918 core/models.py:918 +msgid "This user is already in this template." +msgstr "" + +#: build/lib/core/models.py:924 core/models.py:924 +msgid "This team is already in this template." +msgstr "" + +#: build/lib/core/models.py:947 core/models.py:947 +msgid "email address" +msgstr "" + +#: build/lib/core/models.py:966 core/models.py:966 +msgid "Document invitation" +msgstr "" + +#: build/lib/core/models.py:967 core/models.py:967 +msgid "Document invitations" +msgstr "" + +#: build/lib/core/models.py:987 core/models.py:987 +msgid "This email is already associated to a registered user." +msgstr "" + +#: build/lib/impress/settings.py:236 impress/settings.py:236 +msgid "English" +msgstr "" + +#: build/lib/impress/settings.py:237 impress/settings.py:237 +msgid "French" +msgstr "" + +#: build/lib/impress/settings.py:238 impress/settings.py:238 +msgid "German" +msgstr "" +