From 1cb40d13f9a249ce26f1460e411384db53fda7c0 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Thu, 3 Sep 2026 01:01:44 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B(backend)=20allow=20all=20ASCII=20c?= =?UTF-8?q?haracters=20in=20the=20user=20sub=20field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The user `sub` field was rejecting some ASCII characters that are actually valid according to the OIDC spec. Loosen the validation to accept the full ASCII range, so the field is compliant with the RFC and works with any spec-compliant identity provider. Closes #1609. --- CHANGELOG.md | 1 + .../0023_alter_user_sub_ascii_validator.py | 30 ++ src/backend/core/models.py | 11 +- .../tests/authentication/test_backends.py | 43 ++ src/backend/core/tests/test_models_users.py | 48 +++ src/backend/core/validators.py | 9 + .../locale/de_DE/LC_MESSAGES/django.po | 341 ++++++++------- .../locale/en_US/LC_MESSAGES/django.po | 343 ++++++++------- .../locale/es_ES/LC_MESSAGES/django.po | 399 ++++++++++-------- .../locale/fr_FR/LC_MESSAGES/django.po | 343 ++++++++------- .../locale/nl_NL/LC_MESSAGES/django.po | 343 ++++++++------- 11 files changed, 1089 insertions(+), 822 deletions(-) create mode 100644 src/backend/core/migrations/0023_alter_user_sub_ascii_validator.py create mode 100644 src/backend/core/validators.py diff --git a/CHANGELOG.md b/CHANGELOG.md index dd784adf..871350c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to ### Fixed +- 🐛(backend) allow ASCII characters in user sub field - 🐛(frontend) keep the sending resolution picked while the camera is off #1667 ## [1.30.0] - 2026-09-01 diff --git a/src/backend/core/migrations/0023_alter_user_sub_ascii_validator.py b/src/backend/core/migrations/0023_alter_user_sub_ascii_validator.py new file mode 100644 index 00000000..78fb1881 --- /dev/null +++ b/src/backend/core/migrations/0023_alter_user_sub_ascii_validator.py @@ -0,0 +1,30 @@ +# Generated by Django 5.2 - allow any ASCII "sub" claim (OIDC Core 1.0 §2, RFC 7519 §4.1.2) + +from django.db import migrations, models + +import core.validators + + +class Migration(migrations.Migration): + dependencies = [ + ("core", "0022_user_default_room_access_level_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="user", + name="sub", + field=models.CharField( + blank=True, + help_text=( + "Optional for pending users; required upon account activation. " + "255 characters or fewer. ASCII characters only." + ), + max_length=255, + null=True, + unique=True, + validators=[core.validators.sub_validator], + verbose_name="sub", + ), + ), + ] diff --git a/src/backend/core/models.py b/src/backend/core/models.py index e8fbb316..be1a6da0 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -27,6 +27,7 @@ from timezone_field import TimeZoneField from . import fields, utils from .recording.enums import FileExtension +from .validators import sub_validator logger = getLogger(__name__) @@ -145,19 +146,11 @@ class BaseModel(models.Model): class User(AbstractBaseUser, BaseModel, auth_models.PermissionsMixin): """User model to work with OIDC only authentication.""" - sub_validator = validators.RegexValidator( - regex=r"^[\w.@+-]+\Z", - message=_( - "Enter a valid sub. This value may contain only letters, " - "numbers, and @/./+/-/_ characters." - ), - ) - sub = models.CharField( _("sub"), help_text=_( "Optional for pending users; required upon account activation. " - "255 characters or fewer. Letters, numbers, and @/./+/-/_ characters only." + "255 characters or fewer. ASCII characters only." ), max_length=255, unique=True, diff --git a/src/backend/core/tests/authentication/test_backends.py b/src/backend/core/tests/authentication/test_backends.py index 2f707120..1b8076e6 100644 --- a/src/backend/core/tests/authentication/test_backends.py +++ b/src/backend/core/tests/authentication/test_backends.py @@ -40,6 +40,49 @@ def test_authentication_getter_existing_user(monkeypatch): assert user == db_user +def test_authentication_getter_new_user_auth0_pipe_sub(monkeypatch): + """ + A first login with an Auth0-style sub containing a pipe ("provider|user-id") + should create the user instead of raising a ValidationError. + Regression test for https://github.com/suitenumerique/meet/issues/[XXX]. + """ + klass = OIDCAuthenticationBackend() + + def get_userinfo_mocked(*args): + return {"sub": "auth0|644c0bc8f1874ef6d339fb34", "email": "john@example.com"} + + monkeypatch.setattr(OIDCAuthenticationBackend, "get_userinfo", get_userinfo_mocked) + + user = klass.get_or_create_user( + access_token="test-token", id_token=None, payload=None + ) + + assert user.sub == "auth0|644c0bc8f1874ef6d339fb34" + assert user.email == "john@example.com" + assert models.User.objects.count() == 1 + + +def test_authentication_getter_existing_user_auth0_pipe_sub(monkeypatch): + """ + A returning user with an Auth0-style pipe sub should be matched by sub, + not duplicated or rejected. + """ + klass = OIDCAuthenticationBackend() + db_user = UserFactory(sub="auth0|644c0bc8f1874ef6d339fb34") + + def get_userinfo_mocked(*args): + return {"sub": db_user.sub} + + monkeypatch.setattr(OIDCAuthenticationBackend, "get_userinfo", get_userinfo_mocked) + + user = klass.get_or_create_user( + access_token="test-token", id_token=None, payload=None + ) + + assert user == db_user + assert models.User.objects.count() == 1 + + def test_authentication_getter_new_user_no_email(monkeypatch): """ If no user matches, a user should be created. diff --git a/src/backend/core/tests/test_models_users.py b/src/backend/core/tests/test_models_users.py index a230a9fd..ce508cb6 100644 --- a/src/backend/core/tests/test_models_users.py +++ b/src/backend/core/tests/test_models_users.py @@ -26,6 +26,54 @@ def test_models_users_id_unique(): factories.UserFactory(id=user.id) +@pytest.mark.parametrize( + "sub,is_valid", + [ + # cases from suitenumerique/docs PR #1295 (same validator) + ("valid_sub.@+-:=/", True), + ("invalid süb", False), + (12345, True), + # Auth0 emits "provider|user-id" subject identifiers + ("auth0|644c0bc8f1874ef6d339fb34", True), + ("google-oauth2|103547991597142817347", True), + # Keycloak-style UUID + ("f:550e8400-e29b-41d4-a716-446655440000:jdoe", True), + # base64/URN-style identifiers + ("dGVzdC1zdWItdmFsdWU=", True), + ("urn:example:user/42", True), + # legacy format still accepted + ("user@example.com", True), + # non-ASCII values are rejected + ("émilie", False), + ], +) +def test_models_users_sub_validator(sub, is_valid): + """ + The "sub" field should accept any ASCII string as required by + OpenID Connect Core 1.0 §2 and RFC 7519 §4.1.2, and reject non-ASCII values. + """ + user = factories.UserFactory() + user.sub = sub + if is_valid: + user.full_clean() + else: + with pytest.raises( + ValidationError, + match="Enter a valid sub. This value should be ASCII only.", + ): + user.full_clean() + + +def test_models_users_sub_max_length(): + """The "sub" field should enforce the 255 ASCII characters limit of OIDC Core 1.0 §2.""" + user = factories.UserFactory(sub="a" * 255) + assert user.sub == "a" * 255 + + user.sub = "a" * 256 + with pytest.raises(ValidationError, match="at most 255 characters"): + user.full_clean() + + def test_models_users_send_mail_main_existing(): """The "email_user' method should send mail to the user's email address.""" user = factories.UserFactory() diff --git a/src/backend/core/validators.py b/src/backend/core/validators.py new file mode 100644 index 00000000..4b6c7a0b --- /dev/null +++ b/src/backend/core/validators.py @@ -0,0 +1,9 @@ +"""Custom validators for the core app.""" + +from django.core.exceptions import ValidationError + + +def sub_validator(value): + """Validate that the sub is ASCII only.""" + if not value.isascii(): + raise ValidationError("Enter a valid sub. This value should be ASCII only.") diff --git a/src/backend/locale/de_DE/LC_MESSAGES/django.po b/src/backend/locale/de_DE/LC_MESSAGES/django.po index 616bc4af..0b6b95c9 100644 --- a/src/backend/locale/de_DE/LC_MESSAGES/django.po +++ b/src/backend/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-02 10:47+0000\n" +"POT-Creation-Date: 2026-09-02 22:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,11 +51,11 @@ msgstr "" msgid "File preview" msgstr "" -#: core/admin.py:300 core/admin.py:443 +#: core/admin.py:300 core/admin.py:450 msgid "No owner" msgstr "Kein Eigentümer" -#: core/admin.py:303 core/admin.py:446 +#: core/admin.py:303 core/admin.py:453 msgid "Multiple owners" msgstr "Mehrere Eigentümer" @@ -98,11 +98,11 @@ msgstr "%(count)s Aufnahme(n) erfolgreich als ‚Fehler beim Stoppen‘ markiert msgid "Skipped %(count)s recording(s) with an ineligible status." msgstr "%(count)s abgelaufene Aufnahme(n) übersprungen." -#: core/admin.py:510 +#: core/admin.py:517 msgid "No scopes" msgstr "Keine Scopes" -#: core/admin.py:512 +#: core/admin.py:519 msgid "Scopes" msgstr "Scopes" @@ -110,185 +110,197 @@ msgstr "Scopes" msgid "Creator is me" msgstr "Ersteller bin ich" -#: core/api/serializers.py:89 +#: core/api/serializers.py:108 msgid "You must be administrator or owner of a room to add accesses to it." msgstr "" "Sie müssen Administrator oder Eigentümer eines Raums sein, um Zugriffe " "hinzuzufügen." -#: core/api/serializers.py:534 +#: core/api/serializers.py:560 msgid "This file extension is not allowed." msgstr "Diese Dateiendung ist nicht erlaubt." -#: core/api/viewsets.py:1222 +#: core/api/viewsets.py:1268 msgid "You have reached the maximum number of files for this type." msgstr "Sie haben die maximale Anzahl an Dateien dieses Typs erreicht." -#: core/models.py:37 +#: core/models.py:38 msgid "Member" msgstr "Mitglied" -#: core/models.py:38 +#: core/models.py:39 msgid "Administrator" msgstr "Administrator" -#: core/models.py:39 +#: core/models.py:40 msgid "Owner" msgstr "Eigentümer" -#: core/models.py:55 +#: core/models.py:56 msgid "Initiated" msgstr "Gestartet" -#: core/models.py:56 +#: core/models.py:57 msgid "Active" msgstr "Aktiv" -#: core/models.py:57 +#: core/models.py:58 msgid "Stopped" msgstr "Beendet" -#: core/models.py:58 +#: core/models.py:59 msgid "Saved" msgstr "Gespeichert" -#: core/models.py:59 +#: core/models.py:60 msgid "Aborted" msgstr "Abgebrochen" -#: core/models.py:60 +#: core/models.py:61 msgid "Failed to Start" msgstr "Start fehlgeschlagen" -#: core/models.py:61 +#: core/models.py:62 msgid "Failed to Stop" msgstr "Stopp fehlgeschlagen" -#: core/models.py:62 +#: core/models.py:63 msgid "Notification succeeded" msgstr "Benachrichtigung erfolgreich" -#: core/models.py:65 +#: core/models.py:66 msgid "External process successful" msgstr "Externer Prozess erfolgreich" -#: core/models.py:67 +#: core/models.py:68 msgid "External process failed" msgstr "Externer Prozess fehlgeschlagen" -#: core/models.py:96 +#: core/models.py:97 msgid "SCREEN_RECORDING" msgstr "BILDSCHIRMAUFZEICHNUNG" -#: core/models.py:97 +#: core/models.py:98 msgid "TRANSCRIPT" msgstr "TRANSKRIPT" -#: core/models.py:103 +#: core/models.py:104 msgid "Public Access" msgstr "Öffentlicher Zugriff" -#: core/models.py:104 +#: core/models.py:105 msgid "Trusted Access" msgstr "Vertrauenswürdiger Zugriff" -#: core/models.py:105 +#: core/models.py:106 msgid "Restricted Access" msgstr "Eingeschränkter Zugriff" -#: core/models.py:117 +#: core/models.py:118 msgid "id" msgstr "ID" -#: core/models.py:118 +#: core/models.py:119 msgid "primary key for the record as UUID" msgstr "Primärschlüssel des Eintrags als UUID" -#: core/models.py:124 +#: core/models.py:125 msgid "created on" msgstr "erstellt am" -#: core/models.py:125 +#: core/models.py:126 msgid "date and time at which a record was created" msgstr "Datum und Uhrzeit der Erstellung eines Eintrags" -#: core/models.py:130 +#: core/models.py:131 msgid "updated on" msgstr "aktualisiert am" -#: core/models.py:131 +#: core/models.py:132 msgid "date and time at which a record was last updated" msgstr "Datum und Uhrzeit der letzten Aktualisierung eines Eintrags" -#: core/models.py:151 -msgid "" -"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/" -"_ characters." -msgstr "" -"Geben Sie einen gültigen Sub ein. Dieser Wert darf nur Buchstaben, Zahlen " -"und die Zeichen @/./+/-/_ enthalten." - -#: core/models.py:157 +#: core/models.py:150 msgid "sub" msgstr "Sub" -#: core/models.py:159 +#: core/models.py:152 msgid "" "Optional for pending users; required upon account activation. 255 characters " -"or fewer. Letters, numbers, and @/./+/-/_ characters only." +"or fewer. ASCII characters only." msgstr "" "Optional für ausstehende Benutzer; erforderlich nach Kontoaktivierung. " -"Maximal 255 Zeichen. Nur Buchstaben, Zahlen und @/./+/-/_ Zeichen erlaubt." +"Maximal 255 Zeichen. Nur ASCII-Zeichen erlaubt." -#: core/models.py:168 +#: core/models.py:161 msgid "identity email address" msgstr "Identitäts-E-Mail-Adresse" -#: core/models.py:173 +#: core/models.py:166 msgid "admin email address" msgstr "Administrator-E-Mail-Adresse" -#: core/models.py:175 +#: core/models.py:168 msgid "full name" msgstr "Vollständiger Name" -#: core/models.py:177 +#: core/models.py:170 msgid "short name" msgstr "Kurzname" -#: core/models.py:183 +#: core/models.py:176 msgid "language" msgstr "Sprache" -#: core/models.py:184 +#: core/models.py:177 msgid "The language in which the user wants to see the interface." msgstr "Die Sprache, in der der Benutzer die Oberfläche sehen möchte." -#: core/models.py:190 +#: core/models.py:183 msgid "The timezone in which the user wants to see times." msgstr "Die Zeitzone, in der der Benutzer die Zeiten sehen möchte." -#: core/models.py:193 +#: core/models.py:190 +msgid "default room access level" +msgstr "" + +#: core/models.py:192 +msgid "" +"Access level applied by default to new rooms created by this user. When " +"empty, the instance default is used." +msgstr "" + +#: core/models.py:199 +#, fuzzy +#| msgid "Visio room configuration" +msgid "default room configuration" +msgstr "Visio-Raumkonfiguration" + +#: core/models.py:201 +msgid "Configurations applied by default to new rooms created by this user." +msgstr "" + +#: core/models.py:205 msgid "device" msgstr "Gerät" -#: core/models.py:195 +#: core/models.py:207 msgid "Whether the user is a device or a real user." msgstr "Ob es sich um ein Gerät oder einen echten Benutzer handelt." -#: core/models.py:198 +#: core/models.py:210 msgid "staff status" msgstr "Mitarbeiterstatus" -#: core/models.py:200 +#: core/models.py:212 msgid "Whether the user can log into this admin site." msgstr "Ob der Benutzer sich bei dieser Admin-Seite anmelden kann." -#: core/models.py:203 +#: core/models.py:215 msgid "active" msgstr "aktiv" -#: core/models.py:206 +#: core/models.py:218 msgid "" "Whether this user should be treated as active. Unselect this instead of " "deleting accounts." @@ -296,66 +308,66 @@ msgstr "" "Ob dieser Benutzer als aktiv behandelt werden soll. Deaktivieren Sie dies " "anstelle des Löschens des Kontos." -#: core/models.py:219 +#: core/models.py:231 msgid "user" msgstr "Benutzer" -#: core/models.py:220 +#: core/models.py:232 msgid "users" msgstr "Benutzer" -#: core/models.py:286 +#: core/models.py:298 msgid "Resource" msgstr "Ressource" -#: core/models.py:287 +#: core/models.py:299 msgid "Resources" msgstr "Ressourcen" -#: core/models.py:345 +#: core/models.py:357 msgid "Resource access" msgstr "Ressourcenzugriff" -#: core/models.py:346 +#: core/models.py:358 msgid "Resource accesses" msgstr "Ressourcenzugriffe" -#: core/models.py:352 +#: core/models.py:364 msgid "Resource access with this User and Resource already exists." msgstr "" "Ein Ressourcenzugriff mit diesem Benutzer und dieser Ressource existiert " "bereits." -#: core/models.py:409 +#: core/models.py:421 msgid "Visio room configuration" msgstr "Visio-Raumkonfiguration" -#: core/models.py:410 +#: core/models.py:422 msgid "Values for Visio parameters to configure the room." msgstr "Werte für Visio-Parameter zur Konfiguration des Raums." -#: core/models.py:417 +#: core/models.py:429 msgid "Room PIN code" msgstr "PIN-Code für den Raum" -#: core/models.py:418 +#: core/models.py:430 msgid "Unique n-digit code that identifies this room in telephony mode." msgstr "" "Eindeutiger n-stelliger Code, der diesen Raum im Telephonmodus identifiziert." -#: core/models.py:424 core/models.py:578 +#: core/models.py:436 core/models.py:597 msgid "Room" msgstr "Raum" -#: core/models.py:425 +#: core/models.py:437 msgid "Rooms" msgstr "Räume" -#: core/models.py:589 +#: core/models.py:608 msgid "Worker ID" msgstr "Worker-ID" -#: core/models.py:591 +#: core/models.py:610 msgid "" "Enter an identifier for the worker recording.This ID is retained even when " "the worker stops, allowing for easy tracking." @@ -364,153 +376,153 @@ msgstr "" "erhalten, auch wenn der Worker stoppt, was ein einfaches Nachverfolgen " "ermöglicht." -#: core/models.py:599 +#: core/models.py:618 msgid "Recording mode" msgstr "Aufzeichnungsmodus" -#: core/models.py:600 +#: core/models.py:619 msgid "Defines the mode of recording being called." msgstr "Definiert den aufgerufenen Aufzeichnungsmodus." -#: core/models.py:605 core/models.py:606 +#: core/models.py:624 core/models.py:625 msgid "Recording options" msgstr "Aufnahmeoptionen" -#: core/models.py:613 +#: core/models.py:632 msgid "External Process ID" msgstr "External Process ID" -#: core/models.py:614 +#: core/models.py:633 msgid "ID of the external process associated with the recording." msgstr "ID des externen Prozesses, der mit der Aufzeichnung verknüpft ist" -#: core/models.py:620 +#: core/models.py:639 msgid "Recording" msgstr "Aufzeichnung" -#: core/models.py:621 +#: core/models.py:640 msgid "Recordings" msgstr "Aufzeichnungen" -#: core/models.py:731 +#: core/models.py:750 msgid "Recording/user relation" msgstr "Beziehung Aufzeichnung/Benutzer" -#: core/models.py:732 +#: core/models.py:751 msgid "Recording/user relations" msgstr "Beziehungen Aufzeichnung/Benutzer" -#: core/models.py:738 +#: core/models.py:757 msgid "This user is already in this recording." msgstr "Dieser Benutzer ist bereits Teil dieser Aufzeichnung." -#: core/models.py:744 +#: core/models.py:763 msgid "This team is already in this recording." msgstr "Dieses Team ist bereits Teil dieser Aufzeichnung." -#: core/models.py:750 +#: core/models.py:769 msgid "Either user or team must be set, not both." msgstr "Entweder Benutzer oder Team muss festgelegt werden, nicht beides." -#: core/models.py:767 +#: core/models.py:786 msgid "Create rooms" msgstr "Räume erstellen" -#: core/models.py:768 +#: core/models.py:787 msgid "List rooms" msgstr "Räume auflisten" -#: core/models.py:769 +#: core/models.py:788 msgid "Retrieve room details" msgstr "Raumdetails abrufen" -#: core/models.py:770 +#: core/models.py:789 msgid "Update rooms" msgstr "Räume aktualisieren" -#: core/models.py:771 +#: core/models.py:790 msgid "Delete rooms" msgstr "Räume löschen" -#: core/models.py:784 +#: core/models.py:803 msgid "Application name" msgstr "Anwendungsname" -#: core/models.py:785 +#: core/models.py:804 msgid "Descriptive name for this application." msgstr "Beschreibender Name für diese Anwendung." -#: core/models.py:795 +#: core/models.py:814 msgid "Hashed on Save. Copy it now if this is a new secret." msgstr "" "Beim Speichern gehasht. Jetzt kopieren, wenn dies ein neues Geheimnis ist." -#: core/models.py:806 +#: core/models.py:825 msgid "Application" msgstr "Anwendung" -#: core/models.py:807 +#: core/models.py:826 msgid "Applications" msgstr "Anwendungen" -#: core/models.py:830 +#: core/models.py:849 msgid "Enter a valid domain" msgstr "Geben Sie eine gültige Domain ein" -#: core/models.py:833 +#: core/models.py:852 msgid "Domain" msgstr "Domain" -#: core/models.py:834 +#: core/models.py:853 msgid "Email domain this application can act on behalf of." msgstr "E-Mail-Domain, im Namen der diese Anwendung handeln kann." -#: core/models.py:846 +#: core/models.py:865 msgid "Application domain" msgstr "Anwendungsdomain" -#: core/models.py:847 +#: core/models.py:866 msgid "Application domains" msgstr "Anwendungsdomains" -#: core/models.py:865 +#: core/models.py:884 msgid "Pending" msgstr "Ausstehend" -#: core/models.py:866 +#: core/models.py:885 msgid "Analyzing" msgstr "" -#: core/models.py:873 +#: core/models.py:892 msgid "Ready" msgstr "Bereit" -#: core/models.py:879 +#: core/models.py:898 msgid "Background image" msgstr "Hintergrundbild" -#: core/models.py:891 +#: core/models.py:910 msgid "title" msgstr "Titel" -#: core/models.py:915 +#: core/models.py:934 msgid "Malware detection info when the analysis status is unsafe." msgstr "" "Informationen zur Malware-Erkennung, wenn der Analyse-Status unsicher ist." -#: core/models.py:920 +#: core/models.py:939 msgid "File" msgstr "Datei" -#: core/models.py:921 +#: core/models.py:940 msgid "Files" msgstr "Dateien" -#: core/models.py:1041 +#: core/models.py:1060 msgid "This file is already hard deleted." msgstr "Diese Datei wurde bereits endgültig gelöscht." -#: core/models.py:1051 +#: core/models.py:1070 #, fuzzy #| msgid "To hard delete a file, it must first be soft deleted." msgid "To hard delete a file, it must first be soft deleted." @@ -518,15 +530,15 @@ msgstr "" "Um eine Datei endgültig zu löschen, muss sie zuvor weich gelöscht worden " "sein." -#: core/recording/event/notification.py:123 +#: core/recording/event/notification.py:124 msgid "Your recording is ready" msgstr "Ihre Aufzeichnung ist bereit" -#: core/recording/event/notification.py:194 +#: core/recording/event/notification.py:195 msgid "Transcription" msgstr "Transkription" -#: core/recording/event/notification.py:204 +#: core/recording/event/notification.py:206 #, python-brace-format msgid "Meeting \"{room}\" on {room_recording_date} at {room_recording_time}" msgstr "" @@ -537,25 +549,25 @@ msgstr "" msgid "Video call in progress: {sender.email} is waiting for you to connect" msgstr "Videoanruf läuft: {sender.email} wartet auf Ihre Teilnahme" -#: core/templates/mail/html/invitation.html:159 -#: core/templates/mail/html/screen_recording.html:159 -#: core/templates/mail/text/invitation.txt:3 -#: core/templates/mail/text/screen_recording.txt:3 +#: core/templates/mail/html/invitation.html:151 +#: core/templates/mail/html/screen_recording.html:151 +#: core/templates/mail/text/invitation.txt:4 +#: core/templates/mail/text/screen_recording.txt:4 msgid "Logo email" msgstr "Logo-E-Mail" -#: core/templates/mail/html/invitation.html:189 -#: core/templates/mail/text/invitation.txt:5 +#: core/templates/mail/html/invitation.html:181 +#: core/templates/mail/text/invitation.txt:6 msgid "invites you to join an ongoing video call" msgstr "lädt Sie zu einem laufenden Videoanruf ein" -#: core/templates/mail/html/invitation.html:200 -#: core/templates/mail/text/invitation.txt:7 +#: core/templates/mail/html/invitation.html:192 +#: core/templates/mail/text/invitation.txt:8 msgid "JOIN THE CALL" msgstr "AM ANRUF TEILNEHMEN" -#: core/templates/mail/html/invitation.html:227 -#: core/templates/mail/text/invitation.txt:13 +#: core/templates/mail/html/invitation.html:219 +#: core/templates/mail/text/invitation.txt:14 msgid "" "If you can't click the button, copy and paste the URL into your browser to " "join the call." @@ -563,41 +575,47 @@ msgstr "" "Wenn Sie den Button nicht anklicken können, kopieren Sie die URL und fügen " "Sie sie in Ihren Browser ein, um am Anruf teilzunehmen." -#: core/templates/mail/html/invitation.html:235 -#: core/templates/mail/text/invitation.txt:15 +#: core/templates/mail/html/invitation.html:227 +#: core/templates/mail/text/invitation.txt:16 msgid "Tips for a better experience:" msgstr "Tipps für ein besseres Erlebnis:" -#: core/templates/mail/html/invitation.html:237 -#: core/templates/mail/text/invitation.txt:17 +#: core/templates/mail/html/invitation.html:229 +#: core/templates/mail/text/invitation.txt:18 msgid "Use Chrome or Firefox for better call quality" msgstr "Verwenden Sie Chrome oder Firefox für eine bessere Anrufqualität" -#: core/templates/mail/html/invitation.html:238 -#: core/templates/mail/text/invitation.txt:18 +#: core/templates/mail/html/invitation.html:230 +#: core/templates/mail/text/invitation.txt:19 msgid "Test your microphone and camera before joining" msgstr "Testen Sie Ihr Mikrofon und Ihre Kamera vor dem Beitritt" -#: core/templates/mail/html/invitation.html:239 -#: core/templates/mail/text/invitation.txt:19 +#: core/templates/mail/html/invitation.html:231 +#: core/templates/mail/text/invitation.txt:20 msgid "Make sure you have a stable internet connection" msgstr "Stellen Sie sicher, dass Sie eine stabile Internetverbindung haben" -#: core/templates/mail/html/invitation.html:248 -#: core/templates/mail/html/screen_recording.html:245 -#: core/templates/mail/text/invitation.txt:21 -#: core/templates/mail/text/screen_recording.txt:23 +#: core/templates/mail/html/invitation.html:240 +#: core/templates/mail/html/screen_recording.html:237 +#: core/templates/mail/text/invitation.txt:22 +#: core/templates/mail/text/screen_recording.txt:24 #, python-format msgid " Thank you for using %(brandname)s. " msgstr " Vielen Dank für die Nutzung von %(brandname)s. " -#: core/templates/mail/html/screen_recording.html:188 -#: core/templates/mail/text/screen_recording.txt:6 +#: core/templates/mail/html/invitation.html:271 +#, python-format +msgid "" +"This mail has been sent to %(email)s by %(name)s" +msgstr "" + +#: core/templates/mail/html/screen_recording.html:180 +#: core/templates/mail/text/screen_recording.txt:7 msgid "Your recording is ready!" msgstr "Ihre Aufzeichnung ist fertig!" -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid "" " Your recording of \"%(room_name)s\" on %(recording_date)s at " @@ -606,14 +624,14 @@ msgstr "" " Ihre Aufzeichnung von \"%(room_name)s\" am %(recording_date)s um " "%(recording_time)s steht nun zum Herunterladen bereit. " -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid " The recording will expire in %(days)s days. " msgstr " Die Aufzeichnung wird in %(days)s Tagen ablaufen. " -#: core/templates/mail/html/screen_recording.html:200 -#: core/templates/mail/text/screen_recording.txt:9 +#: core/templates/mail/html/screen_recording.html:192 +#: core/templates/mail/text/screen_recording.txt:10 msgid "" " Sharing the recording via link is not yet available. Only organizers can " "download it. " @@ -621,33 +639,33 @@ msgstr "" " Die Freigabe der Aufzeichnung per Link ist noch nicht verfügbar. Nur " "Organisatoren können sie herunterladen. " -#: core/templates/mail/html/screen_recording.html:206 -#: core/templates/mail/text/screen_recording.txt:11 +#: core/templates/mail/html/screen_recording.html:198 +#: core/templates/mail/text/screen_recording.txt:12 msgid "To keep this recording permanently:" msgstr "So speichern Sie diese Aufzeichnung dauerhaft:" -#: core/templates/mail/html/screen_recording.html:208 +#: core/templates/mail/html/screen_recording.html:200 #, python-format msgid "Click the \"Open\" link below " msgstr "Klicken Sie auf den Link „Öffnen\" unten " -#: core/templates/mail/html/screen_recording.html:209 -#: core/templates/mail/text/screen_recording.txt:14 +#: core/templates/mail/html/screen_recording.html:201 +#: core/templates/mail/text/screen_recording.txt:15 msgid "Use the \"Download\" button in the interface " msgstr "Verwenden Sie den Button „Herunterladen“ in der Oberfläche " -#: core/templates/mail/html/screen_recording.html:210 -#: core/templates/mail/text/screen_recording.txt:15 +#: core/templates/mail/html/screen_recording.html:202 +#: core/templates/mail/text/screen_recording.txt:16 msgid "Save the file to your preferred location" msgstr "Speichern Sie die Datei an einem gewünschten Ort" -#: core/templates/mail/html/screen_recording.html:221 -#: core/templates/mail/text/screen_recording.txt:17 +#: core/templates/mail/html/screen_recording.html:213 +#: core/templates/mail/text/screen_recording.txt:18 msgid "Open" msgstr "Öffnen" -#: core/templates/mail/html/screen_recording.html:230 -#: core/templates/mail/text/screen_recording.txt:19 +#: core/templates/mail/html/screen_recording.html:222 +#: core/templates/mail/text/screen_recording.txt:20 #, python-format msgid "" " If you have any questions or need assistance, please contact our support " @@ -656,28 +674,33 @@ msgstr "" " Wenn Sie Fragen haben oder Unterstützung benötigen, wenden Sie sich bitte " "an unser Support-Team unter %(support_email)s. " -#: core/templates/mail/text/screen_recording.txt:13 +#: core/templates/mail/text/invitation.txt:24 +#, python-format +msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" +msgstr "" + +#: core/templates/mail/text/screen_recording.txt:14 #, fuzzy, python-format #| msgid "Click the \"Open\" link below " msgid "Click the \"Open [%(link)s]\" link below " msgstr "Klicken Sie auf den Link „Öffnen\" unten " -#: meet/settings.py:228 +#: meet/settings.py:238 msgid "English" msgstr "Englisch" -#: meet/settings.py:229 +#: meet/settings.py:239 msgid "French" msgstr "Französisch" -#: meet/settings.py:230 +#: meet/settings.py:240 msgid "Dutch" msgstr "Niederländisch" -#: meet/settings.py:231 +#: meet/settings.py:241 msgid "German" msgstr "Deutsch" -#: meet/settings.py:233 +#: meet/settings.py:242 msgid "Spanish" msgstr "Spanisch" diff --git a/src/backend/locale/en_US/LC_MESSAGES/django.po b/src/backend/locale/en_US/LC_MESSAGES/django.po index feefdb28..82c67654 100644 --- a/src/backend/locale/en_US/LC_MESSAGES/django.po +++ b/src/backend/locale/en_US/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-02 10:47+0000\n" +"POT-Creation-Date: 2026-09-02 22:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,11 +51,11 @@ msgstr "" msgid "File preview" msgstr "" -#: core/admin.py:300 core/admin.py:443 +#: core/admin.py:300 core/admin.py:450 msgid "No owner" msgstr "No owner" -#: core/admin.py:303 core/admin.py:446 +#: core/admin.py:303 core/admin.py:453 msgid "Multiple owners" msgstr "Multiple owners" @@ -98,11 +98,11 @@ msgstr "%(count)s recording(s) successfully marked as 'Failed to Stop'." msgid "Skipped %(count)s recording(s) with an ineligible status." msgstr "Skipped %(count)s expired recording(s)." -#: core/admin.py:510 +#: core/admin.py:517 msgid "No scopes" msgstr "No scopes" -#: core/admin.py:512 +#: core/admin.py:519 msgid "Scopes" msgstr "Scopes" @@ -110,183 +110,195 @@ msgstr "Scopes" msgid "Creator is me" msgstr "Creator is me" -#: core/api/serializers.py:89 +#: core/api/serializers.py:108 msgid "You must be administrator or owner of a room to add accesses to it." msgstr "You must be administrator or owner of a room to add accesses to it." -#: core/api/serializers.py:534 +#: core/api/serializers.py:560 msgid "This file extension is not allowed." msgstr "This file extension is not allowed." -#: core/api/viewsets.py:1222 +#: core/api/viewsets.py:1268 msgid "You have reached the maximum number of files for this type." msgstr "You have reached the maximum number of files for this type." -#: core/models.py:37 +#: core/models.py:38 msgid "Member" msgstr "Member" -#: core/models.py:38 +#: core/models.py:39 msgid "Administrator" msgstr "Administrator" -#: core/models.py:39 +#: core/models.py:40 msgid "Owner" msgstr "Owner" -#: core/models.py:55 +#: core/models.py:56 msgid "Initiated" msgstr "Initiated" -#: core/models.py:56 +#: core/models.py:57 msgid "Active" msgstr "Active" -#: core/models.py:57 +#: core/models.py:58 msgid "Stopped" msgstr "Stopped" -#: core/models.py:58 +#: core/models.py:59 msgid "Saved" msgstr "Saved" -#: core/models.py:59 +#: core/models.py:60 msgid "Aborted" msgstr "Aborted" -#: core/models.py:60 +#: core/models.py:61 msgid "Failed to Start" msgstr "Failed to Start" -#: core/models.py:61 +#: core/models.py:62 msgid "Failed to Stop" msgstr "Failed to Stop" -#: core/models.py:62 +#: core/models.py:63 msgid "Notification succeeded" msgstr "Notification succeeded" -#: core/models.py:65 +#: core/models.py:66 msgid "External process successful" msgstr "External process successful" -#: core/models.py:67 +#: core/models.py:68 msgid "External process failed" msgstr "External process failed" -#: core/models.py:96 +#: core/models.py:97 msgid "SCREEN_RECORDING" msgstr "SCREEN_RECORDING" -#: core/models.py:97 +#: core/models.py:98 msgid "TRANSCRIPT" msgstr "TRANSCRIPT" -#: core/models.py:103 +#: core/models.py:104 msgid "Public Access" msgstr "Public Access" -#: core/models.py:104 +#: core/models.py:105 msgid "Trusted Access" msgstr "Trusted Access" -#: core/models.py:105 +#: core/models.py:106 msgid "Restricted Access" msgstr "Restricted Access" -#: core/models.py:117 +#: core/models.py:118 msgid "id" msgstr "id" -#: core/models.py:118 +#: core/models.py:119 msgid "primary key for the record as UUID" msgstr "primary key for the record as UUID" -#: core/models.py:124 +#: core/models.py:125 msgid "created on" msgstr "created on" -#: core/models.py:125 +#: core/models.py:126 msgid "date and time at which a record was created" msgstr "date and time at which a record was created" -#: core/models.py:130 +#: core/models.py:131 msgid "updated on" msgstr "updated on" -#: core/models.py:131 +#: core/models.py:132 msgid "date and time at which a record was last updated" msgstr "date and time at which a record was last updated" -#: core/models.py:151 -msgid "" -"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/" -"_ characters." -msgstr "" -"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/" -"_ characters." - -#: core/models.py:157 +#: core/models.py:150 msgid "sub" msgstr "sub" -#: core/models.py:159 +#: core/models.py:152 msgid "" "Optional for pending users; required upon account activation. 255 characters " -"or fewer. Letters, numbers, and @/./+/-/_ characters only." +"or fewer. ASCII characters only." msgstr "" -"Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_ " -"characters only." +"Optional for pending users; required upon account activation. 255 characters " +"or fewer. ASCII characters only." -#: core/models.py:168 +#: core/models.py:161 msgid "identity email address" msgstr "identity email address" -#: core/models.py:173 +#: core/models.py:166 msgid "admin email address" msgstr "admin email address" -#: core/models.py:175 +#: core/models.py:168 msgid "full name" msgstr "full name" -#: core/models.py:177 +#: core/models.py:170 msgid "short name" msgstr "short name" -#: core/models.py:183 +#: core/models.py:176 msgid "language" msgstr "language" -#: core/models.py:184 +#: core/models.py:177 msgid "The language in which the user wants to see the interface." msgstr "The language in which the user wants to see the interface." -#: core/models.py:190 +#: core/models.py:183 msgid "The timezone in which the user wants to see times." msgstr "The timezone in which the user wants to see times." -#: core/models.py:193 +#: core/models.py:190 +msgid "default room access level" +msgstr "" + +#: core/models.py:192 +msgid "" +"Access level applied by default to new rooms created by this user. When " +"empty, the instance default is used." +msgstr "" + +#: core/models.py:199 +#, fuzzy +#| msgid "Visio room configuration" +msgid "default room configuration" +msgstr "Visio room configuration" + +#: core/models.py:201 +msgid "Configurations applied by default to new rooms created by this user." +msgstr "" + +#: core/models.py:205 msgid "device" msgstr "device" -#: core/models.py:195 +#: core/models.py:207 msgid "Whether the user is a device or a real user." msgstr "Whether the user is a device or a real user." -#: core/models.py:198 +#: core/models.py:210 msgid "staff status" msgstr "staff status" -#: core/models.py:200 +#: core/models.py:212 msgid "Whether the user can log into this admin site." msgstr "Whether the user can log into this admin site." -#: core/models.py:203 +#: core/models.py:215 msgid "active" msgstr "active" -#: core/models.py:206 +#: core/models.py:218 msgid "" "Whether this user should be treated as active. Unselect this instead of " "deleting accounts." @@ -294,63 +306,63 @@ msgstr "" "Whether this user should be treated as active. Unselect this instead of " "deleting accounts." -#: core/models.py:219 +#: core/models.py:231 msgid "user" msgstr "user" -#: core/models.py:220 +#: core/models.py:232 msgid "users" msgstr "users" -#: core/models.py:286 +#: core/models.py:298 msgid "Resource" msgstr "Resource" -#: core/models.py:287 +#: core/models.py:299 msgid "Resources" msgstr "Resources" -#: core/models.py:345 +#: core/models.py:357 msgid "Resource access" msgstr "Resource access" -#: core/models.py:346 +#: core/models.py:358 msgid "Resource accesses" msgstr "Resource accesses" -#: core/models.py:352 +#: core/models.py:364 msgid "Resource access with this User and Resource already exists." msgstr "Resource access with this User and Resource already exists." -#: core/models.py:409 +#: core/models.py:421 msgid "Visio room configuration" msgstr "Visio room configuration" -#: core/models.py:410 +#: core/models.py:422 msgid "Values for Visio parameters to configure the room." msgstr "Values for Visio parameters to configure the room." -#: core/models.py:417 +#: core/models.py:429 msgid "Room PIN code" msgstr "Room PIN code" -#: core/models.py:418 +#: core/models.py:430 msgid "Unique n-digit code that identifies this room in telephony mode." msgstr "Unique n-digit code that identifies this room in telephony mode." -#: core/models.py:424 core/models.py:578 +#: core/models.py:436 core/models.py:597 msgid "Room" msgstr "Room" -#: core/models.py:425 +#: core/models.py:437 msgid "Rooms" msgstr "Rooms" -#: core/models.py:589 +#: core/models.py:608 msgid "Worker ID" msgstr "Worker ID" -#: core/models.py:591 +#: core/models.py:610 msgid "" "Enter an identifier for the worker recording.This ID is retained even when " "the worker stops, allowing for easy tracking." @@ -358,171 +370,171 @@ msgstr "" "Enter an identifier for the worker recording.This ID is retained even when " "the worker stops, allowing for easy tracking." -#: core/models.py:599 +#: core/models.py:618 msgid "Recording mode" msgstr "Recording mode" -#: core/models.py:600 +#: core/models.py:619 msgid "Defines the mode of recording being called." msgstr "Defines the mode of recording being called." -#: core/models.py:605 core/models.py:606 +#: core/models.py:624 core/models.py:625 msgid "Recording options" msgstr "Recording options" -#: core/models.py:613 +#: core/models.py:632 msgid "External Process ID" msgstr "External Process ID" -#: core/models.py:614 +#: core/models.py:633 msgid "ID of the external process associated with the recording." msgstr "ID of the external process associated with the recording." -#: core/models.py:620 +#: core/models.py:639 msgid "Recording" msgstr "Recording" -#: core/models.py:621 +#: core/models.py:640 msgid "Recordings" msgstr "Recordings" -#: core/models.py:731 +#: core/models.py:750 msgid "Recording/user relation" msgstr "Recording/user relation" -#: core/models.py:732 +#: core/models.py:751 msgid "Recording/user relations" msgstr "Recording/user relations" -#: core/models.py:738 +#: core/models.py:757 msgid "This user is already in this recording." msgstr "This user is already in this recording." -#: core/models.py:744 +#: core/models.py:763 msgid "This team is already in this recording." msgstr "This team is already in this recording." -#: core/models.py:750 +#: core/models.py:769 msgid "Either user or team must be set, not both." msgstr "Either user or team must be set, not both." -#: core/models.py:767 +#: core/models.py:786 #, fuzzy #| msgid "created on" msgid "Create rooms" msgstr "Create rooms" -#: core/models.py:768 +#: core/models.py:787 msgid "List rooms" msgstr "List rooms" -#: core/models.py:769 +#: core/models.py:788 msgid "Retrieve room details" msgstr "Retrieve room details" -#: core/models.py:770 +#: core/models.py:789 #, fuzzy #| msgid "updated on" msgid "Update rooms" msgstr "Update rooms" -#: core/models.py:771 +#: core/models.py:790 msgid "Delete rooms" msgstr "Delete rooms" -#: core/models.py:784 +#: core/models.py:803 msgid "Application name" msgstr "Application name" -#: core/models.py:785 +#: core/models.py:804 msgid "Descriptive name for this application." msgstr "Descriptive name for this application." -#: core/models.py:795 +#: core/models.py:814 msgid "Hashed on Save. Copy it now if this is a new secret." msgstr "Hashed on Save. Copy it now if this is a new secret." -#: core/models.py:806 +#: core/models.py:825 msgid "Application" msgstr "Application" -#: core/models.py:807 +#: core/models.py:826 msgid "Applications" msgstr "Applications" -#: core/models.py:830 +#: core/models.py:849 msgid "Enter a valid domain" msgstr "Enter a valid domain" -#: core/models.py:833 +#: core/models.py:852 msgid "Domain" msgstr "Domain" -#: core/models.py:834 +#: core/models.py:853 msgid "Email domain this application can act on behalf of." msgstr "Email domain this application can act on behalf of." -#: core/models.py:846 +#: core/models.py:865 msgid "Application domain" msgstr "Application domain" -#: core/models.py:847 +#: core/models.py:866 msgid "Application domains" msgstr "Application domains" -#: core/models.py:865 +#: core/models.py:884 #, fuzzy #| msgid "Recording" msgid "Pending" msgstr "Pending" -#: core/models.py:866 +#: core/models.py:885 msgid "Analyzing" msgstr "" -#: core/models.py:873 +#: core/models.py:892 msgid "Ready" msgstr "Ready" -#: core/models.py:879 +#: core/models.py:898 msgid "Background image" msgstr "Background image" -#: core/models.py:891 +#: core/models.py:910 msgid "title" msgstr "title" -#: core/models.py:915 +#: core/models.py:934 msgid "Malware detection info when the analysis status is unsafe." msgstr "Malware detection info when the analysis status is unsafe." -#: core/models.py:920 +#: core/models.py:939 msgid "File" msgstr "File" -#: core/models.py:921 +#: core/models.py:940 msgid "Files" msgstr "Files" -#: core/models.py:1041 +#: core/models.py:1060 #, fuzzy #| msgid "This user is already in this recording." msgid "This file is already hard deleted." msgstr "This file is already hard deleted." -#: core/models.py:1051 +#: core/models.py:1070 msgid "To hard delete a file, it must first be soft deleted." msgstr "To hard delete a file, it must first be soft deleted." -#: core/recording/event/notification.py:123 +#: core/recording/event/notification.py:124 msgid "Your recording is ready" msgstr "Your recording is ready" -#: core/recording/event/notification.py:194 +#: core/recording/event/notification.py:195 msgid "Transcription" msgstr "Transcription" -#: core/recording/event/notification.py:204 +#: core/recording/event/notification.py:206 #, python-brace-format msgid "Meeting \"{room}\" on {room_recording_date} at {room_recording_time}" msgstr "Meeting \"{room}\" on {room_recording_date} at {room_recording_time}" @@ -532,25 +544,25 @@ msgstr "Meeting \"{room}\" on {room_recording_date} at {room_recording_time}" msgid "Video call in progress: {sender.email} is waiting for you to connect" msgstr "Video call in progress: {sender.email} is waiting for you to connect" -#: core/templates/mail/html/invitation.html:159 -#: core/templates/mail/html/screen_recording.html:159 -#: core/templates/mail/text/invitation.txt:3 -#: core/templates/mail/text/screen_recording.txt:3 +#: core/templates/mail/html/invitation.html:151 +#: core/templates/mail/html/screen_recording.html:151 +#: core/templates/mail/text/invitation.txt:4 +#: core/templates/mail/text/screen_recording.txt:4 msgid "Logo email" msgstr "Logo email" -#: core/templates/mail/html/invitation.html:189 -#: core/templates/mail/text/invitation.txt:5 +#: core/templates/mail/html/invitation.html:181 +#: core/templates/mail/text/invitation.txt:6 msgid "invites you to join an ongoing video call" msgstr "invites you to join an ongoing video call" -#: core/templates/mail/html/invitation.html:200 -#: core/templates/mail/text/invitation.txt:7 +#: core/templates/mail/html/invitation.html:192 +#: core/templates/mail/text/invitation.txt:8 msgid "JOIN THE CALL" msgstr "JOIN THE CALL" -#: core/templates/mail/html/invitation.html:227 -#: core/templates/mail/text/invitation.txt:13 +#: core/templates/mail/html/invitation.html:219 +#: core/templates/mail/text/invitation.txt:14 msgid "" "If you can't click the button, copy and paste the URL into your browser to " "join the call." @@ -558,41 +570,47 @@ msgstr "" "If you can't click the button, copy and paste the URL into your browser to " "join the call." -#: core/templates/mail/html/invitation.html:235 -#: core/templates/mail/text/invitation.txt:15 +#: core/templates/mail/html/invitation.html:227 +#: core/templates/mail/text/invitation.txt:16 msgid "Tips for a better experience:" msgstr "Tips for a better experience:" -#: core/templates/mail/html/invitation.html:237 -#: core/templates/mail/text/invitation.txt:17 +#: core/templates/mail/html/invitation.html:229 +#: core/templates/mail/text/invitation.txt:18 msgid "Use Chrome or Firefox for better call quality" msgstr "Use Chrome or Firefox for better call quality" -#: core/templates/mail/html/invitation.html:238 -#: core/templates/mail/text/invitation.txt:18 +#: core/templates/mail/html/invitation.html:230 +#: core/templates/mail/text/invitation.txt:19 msgid "Test your microphone and camera before joining" msgstr "Test your microphone and camera before joining" -#: core/templates/mail/html/invitation.html:239 -#: core/templates/mail/text/invitation.txt:19 +#: core/templates/mail/html/invitation.html:231 +#: core/templates/mail/text/invitation.txt:20 msgid "Make sure you have a stable internet connection" msgstr "Make sure you have a stable internet connection" -#: core/templates/mail/html/invitation.html:248 -#: core/templates/mail/html/screen_recording.html:245 -#: core/templates/mail/text/invitation.txt:21 -#: core/templates/mail/text/screen_recording.txt:23 +#: core/templates/mail/html/invitation.html:240 +#: core/templates/mail/html/screen_recording.html:237 +#: core/templates/mail/text/invitation.txt:22 +#: core/templates/mail/text/screen_recording.txt:24 #, python-format msgid " Thank you for using %(brandname)s. " msgstr " Thank you for using %(brandname)s. " -#: core/templates/mail/html/screen_recording.html:188 -#: core/templates/mail/text/screen_recording.txt:6 +#: core/templates/mail/html/invitation.html:271 +#, python-format +msgid "" +"This mail has been sent to %(email)s by %(name)s" +msgstr "" + +#: core/templates/mail/html/screen_recording.html:180 +#: core/templates/mail/text/screen_recording.txt:7 msgid "Your recording is ready!" msgstr "Your recording is ready!" -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid "" " Your recording of \"%(room_name)s\" on %(recording_date)s at " @@ -601,14 +619,14 @@ msgstr "" " Your recording of \"%(room_name)s\" on %(recording_date)s at " "%(recording_time)s is now ready to download. " -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid " The recording will expire in %(days)s days. " msgstr " The recording will expire in %(days)s days. " -#: core/templates/mail/html/screen_recording.html:200 -#: core/templates/mail/text/screen_recording.txt:9 +#: core/templates/mail/html/screen_recording.html:192 +#: core/templates/mail/text/screen_recording.txt:10 msgid "" " Sharing the recording via link is not yet available. Only organizers can " "download it. " @@ -616,33 +634,33 @@ msgstr "" " Sharing the recording via link is not yet available. Only organizers can " "download it. " -#: core/templates/mail/html/screen_recording.html:206 -#: core/templates/mail/text/screen_recording.txt:11 +#: core/templates/mail/html/screen_recording.html:198 +#: core/templates/mail/text/screen_recording.txt:12 msgid "To keep this recording permanently:" msgstr "To keep this recording permanently:" -#: core/templates/mail/html/screen_recording.html:208 +#: core/templates/mail/html/screen_recording.html:200 #, python-format msgid "Click the \"Open\" link below " msgstr "Click the \"Open\" link below " -#: core/templates/mail/html/screen_recording.html:209 -#: core/templates/mail/text/screen_recording.txt:14 +#: core/templates/mail/html/screen_recording.html:201 +#: core/templates/mail/text/screen_recording.txt:15 msgid "Use the \"Download\" button in the interface " msgstr "Use the \"Download\" button in the interface " -#: core/templates/mail/html/screen_recording.html:210 -#: core/templates/mail/text/screen_recording.txt:15 +#: core/templates/mail/html/screen_recording.html:202 +#: core/templates/mail/text/screen_recording.txt:16 msgid "Save the file to your preferred location" msgstr "Save the file to your preferred location" -#: core/templates/mail/html/screen_recording.html:221 -#: core/templates/mail/text/screen_recording.txt:17 +#: core/templates/mail/html/screen_recording.html:213 +#: core/templates/mail/text/screen_recording.txt:18 msgid "Open" msgstr "Open" -#: core/templates/mail/html/screen_recording.html:230 -#: core/templates/mail/text/screen_recording.txt:19 +#: core/templates/mail/html/screen_recording.html:222 +#: core/templates/mail/text/screen_recording.txt:20 #, python-format msgid "" " If you have any questions or need assistance, please contact our support " @@ -651,28 +669,33 @@ msgstr "" " If you have any questions or need assistance, please contact our support " "team at %(support_email)s. " -#: core/templates/mail/text/screen_recording.txt:13 +#: core/templates/mail/text/invitation.txt:24 +#, python-format +msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" +msgstr "" + +#: core/templates/mail/text/screen_recording.txt:14 #, fuzzy, python-format #| msgid "Click the \"Open\" link below " msgid "Click the \"Open [%(link)s]\" link below " msgstr "Click the \"Open\" link below " -#: meet/settings.py:228 +#: meet/settings.py:238 msgid "English" msgstr "English" -#: meet/settings.py:229 +#: meet/settings.py:239 msgid "French" msgstr "French" -#: meet/settings.py:230 +#: meet/settings.py:240 msgid "Dutch" msgstr "Dutch" -#: meet/settings.py:231 +#: meet/settings.py:241 msgid "German" msgstr "German" -#: meet/settings.py:233 +#: meet/settings.py:242 msgid "Spanish" msgstr "Spanish" diff --git a/src/backend/locale/es_ES/LC_MESSAGES/django.po b/src/backend/locale/es_ES/LC_MESSAGES/django.po index 2af11c94..98120fb4 100644 --- a/src/backend/locale/es_ES/LC_MESSAGES/django.po +++ b/src/backend/locale/es_ES/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-02 10:47+0000\n" +"POT-Creation-Date: 2026-09-02 22:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,20 +41,20 @@ msgstr "Eliminar Salas" msgid "Derived info" msgstr "" -#: core/admin.py:237 # 'Marcas de tiempo' is a bad translation for spanish +#: core/admin.py:237 msgid "Timestamps" -msgstr "" +msgstr "" #: core/admin.py:240 msgid "File preview" msgstr "Vista previa" -#: core/admin.py:300 core/admin.py:443 +#: core/admin.py:300 core/admin.py:450 msgid "No owner" msgstr "Sin propietario" -#: core/admin.py:303 core/admin.py:446 +#: core/admin.py:303 core/admin.py:453 msgid "Multiple owners" msgstr "Varios propietarios" @@ -89,18 +89,19 @@ msgstr "Marcar las grabaciones seleccionadas como «Error al detener»" #: core/admin.py:386 #, python-format msgid "%(count)s recording(s) successfully marked as 'Failed to Stop'." -msgstr "%(count)s grabación(es) marcada(s) correctamente como «Error al detener»." +msgstr "" +"%(count)s grabación(es) marcada(s) correctamente como «Error al detener»." #: core/admin.py:394 #, python-format msgid "Skipped %(count)s recording(s) with an ineligible status." msgstr "Se han omitido %(count)s grabación(es) con un estado no elegible." -#: core/admin.py:510 +#: core/admin.py:517 msgid "No scopes" msgstr "" -#: core/admin.py:512 +#: core/admin.py:519 msgid "Scopes" msgstr "Ámbitos" @@ -108,545 +109,595 @@ msgstr "Ámbitos" msgid "Creator is me" msgstr "Yo soy el creador" -#: core/api/serializers.py:89 +#: core/api/serializers.py:108 msgid "You must be administrator or owner of a room to add accesses to it." -msgstr "Debes ser administrador o propietario de una reunión para añadirle accesos." +msgstr "" +"Debes ser administrador o propietario de una reunión para añadirle accesos." -#: core/api/serializers.py:534 +#: core/api/serializers.py:560 msgid "This file extension is not allowed." msgstr "Esta extensión de archivo no está permitida." -#: core/api/viewsets.py:1222 +#: core/api/viewsets.py:1268 msgid "You have reached the maximum number of files for this type." msgstr "Has alcanzado el número máximo de archivos de este tipo." -#: core/models.py:37 +#: core/models.py:38 msgid "Member" msgstr "Miembro" -#: core/models.py:38 +#: core/models.py:39 msgid "Administrator" msgstr "Administrador" -#: core/models.py:39 +#: core/models.py:40 msgid "Owner" msgstr "Propietario" -#: core/models.py:55 # To check here and following lines for gender agreement (Masculine/Feminine) +#: core/models.py:56 msgid "Initiated" msgstr "Iniciada" -#: core/models.py:56 +#: core/models.py:57 msgid "Active" msgstr "Activa" -#: core/models.py:57 +#: core/models.py:58 msgid "Stopped" msgstr "Detenida" -#: core/models.py:58 +#: core/models.py:59 msgid "Saved" msgstr "Guardada" -#: core/models.py:59 +#: core/models.py:60 msgid "Aborted" msgstr "Cancelada" -#: core/models.py:60 +#: core/models.py:61 msgid "Failed to Start" msgstr "Error al iniciar" -#: core/models.py:61 +#: core/models.py:62 msgid "Failed to Stop" msgstr "Error al detener" -#: core/models.py:62 +#: core/models.py:63 msgid "Notification succeeded" msgstr "Notificado correctamente" -#: core/models.py:65 +#: core/models.py:66 msgid "External process successful" msgstr "Proceso externo finalizado correctamente" -#: core/models.py:67 +#: core/models.py:68 msgid "External process failed" msgstr "Error en el Proceso externo" -#: core/models.py:96 +#: core/models.py:97 msgid "SCREEN_RECORDING" msgstr "GRABACIÓN_DE_PANTALLA" -#: core/models.py:97 +#: core/models.py:98 msgid "TRANSCRIPT" msgstr "TRANSCRIPCIÓN" -#: core/models.py:103 +#: core/models.py:104 msgid "Public Access" msgstr "Acceso público" -#: core/models.py:104 +#: core/models.py:105 msgid "Trusted Access" msgstr "Acceso usuarios autorizados" -#: core/models.py:105 +#: core/models.py:106 msgid "Restricted Access" msgstr "Acceso restringido" -#: core/models.py:117 +#: core/models.py:118 msgid "id" msgstr "id" -#: core/models.py:118 +#: core/models.py:119 msgid "primary key for the record as UUID" msgstr "clave primaria del registro en forma de UUID" -#: core/models.py:124 +#: core/models.py:125 msgid "created on" msgstr "creado el" -#: core/models.py:125 +#: core/models.py:126 msgid "date and time at which a record was created" msgstr "fecha y hora en que se creó un registro" -#: core/models.py:130 +#: core/models.py:131 msgid "updated on" msgstr "actualizado el" -#: core/models.py:131 +#: core/models.py:132 msgid "date and time at which a record was last updated" msgstr "fecha y hora de la última actualización de un registro" -#: core/models.py:151 -msgid "" -"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/" -"_ characters." -msgstr "Introduce un sub válido. Este valor solo puede contener letras, números y los caracteres @/./+/-/_." - -#: core/models.py:157 +#: core/models.py:150 msgid "sub" msgstr "sub" -#: core/models.py:159 +#: core/models.py:152 msgid "" "Optional for pending users; required upon account activation. 255 characters " -"or fewer. Letters, numbers, and @/./+/-/_ characters only." -msgstr "Opcional para los usuarios pendientes; obligatorio al activar la cuenta. 255 caracteres como máximo. Solo letras, números y los caracteres @/./+/-/_." +"or fewer. ASCII characters only." +msgstr "" +"Opcional para los usuarios pendientes; obligatorio al activar la cuenta. " +"255 caracteres como máximo. Solo caracteres ASCII." -#: core/models.py:168 +#: core/models.py:161 msgid "identity email address" msgstr "dirección de correo electrónico" -#: core/models.py:173 +#: core/models.py:166 msgid "admin email address" msgstr "dirección de correo electrónico de administrador" -#: core/models.py:175 +#: core/models.py:168 msgid "full name" msgstr "nombre completo" -#: core/models.py:177 +#: core/models.py:170 msgid "short name" msgstr "nombre corto" -#: core/models.py:183 +#: core/models.py:176 msgid "language" msgstr "idioma" -#: core/models.py:184 +#: core/models.py:177 msgid "The language in which the user wants to see the interface." msgstr "El idioma preferido de interfaz." -#: core/models.py:190 +#: core/models.py:183 msgid "The timezone in which the user wants to see times." msgstr "La zona horaria en la que el usuario quiere ver las horas." -#: core/models.py:193 +#: core/models.py:190 +msgid "default room access level" +msgstr "" + +#: core/models.py:192 +msgid "" +"Access level applied by default to new rooms created by this user. When " +"empty, the instance default is used." +msgstr "" + +#: core/models.py:199 +#, fuzzy +#| msgid "Visio room configuration" +msgid "default room configuration" +msgstr "Configuración de la videoconferencia" + +#: core/models.py:201 +msgid "Configurations applied by default to new rooms created by this user." +msgstr "" + +#: core/models.py:205 msgid "device" msgstr "dispositivo" -#: core/models.py:195 +#: core/models.py:207 msgid "Whether the user is a device or a real user." msgstr "Si el usuario es un dispositivo o un usuario real." -#: core/models.py:198 +#: core/models.py:210 msgid "staff status" msgstr "estado del personal" -#: core/models.py:200 +#: core/models.py:212 msgid "Whether the user can log into this admin site." msgstr "Si el usuario puede acceder a este sitio de administración." -#: core/models.py:203 +#: core/models.py:215 msgid "active" msgstr "activo" -#: core/models.py:206 +#: core/models.py:218 msgid "" "Whether this user should be treated as active. Unselect this instead of " "deleting accounts." -msgstr "Si este usuario debe considerarse activo. Desmarca esta opción en lugar de eliminar cuentas." +msgstr "" +"Si este usuario debe considerarse activo. Desmarca esta opción en lugar de " +"eliminar cuentas." -#: core/models.py:219 +#: core/models.py:231 msgid "user" msgstr "usuario" -#: core/models.py:220 +#: core/models.py:232 msgid "users" msgstr "usuarios" -#: core/models.py:286 +#: core/models.py:298 msgid "Resource" msgstr "Recurso" -#: core/models.py:287 +#: core/models.py:299 msgid "Resources" msgstr "Recursos" -#: core/models.py:345 +#: core/models.py:357 msgid "Resource access" msgstr "Acceso a recursos" -#: core/models.py:346 +#: core/models.py:358 msgid "Resource accesses" msgstr "Accesos a recursos" -#: core/models.py:352 +#: core/models.py:364 msgid "Resource access with this User and Resource already exists." msgstr "Ya existe un acceso al recurso con este usuario y este recurso." -#: core/models.py:409 +#: core/models.py:421 msgid "Visio room configuration" msgstr "Configuración de la videoconferencia" -#: core/models.py:410 +#: core/models.py:422 msgid "Values for Visio parameters to configure the room." -msgstr "Valores de los parámetros de videoconferencia para configurar la reunión." +msgstr "" +"Valores de los parámetros de videoconferencia para configurar la reunión." -#: core/models.py:417 +#: core/models.py:429 msgid "Room PIN code" msgstr "Código PIN de la reunión" -#: core/models.py:418 +#: core/models.py:430 msgid "Unique n-digit code that identifies this room in telephony mode." -msgstr "Código único de n dígitos que identifica esta reunión en modo telefónico." +msgstr "" +"Código único de n dígitos que identifica esta reunión en modo telefónico." -#: core/models.py:424 core/models.py:578 +#: core/models.py:436 core/models.py:597 msgid "Room" msgstr "Reunión" -#: core/models.py:425 +#: core/models.py:437 msgid "Rooms" msgstr "Reuniones" -#: core/models.py:589 +#: core/models.py:608 msgid "Worker ID" msgstr "ID del worker" -#: core/models.py:591 +#: core/models.py:610 msgid "" "Enter an identifier for the worker recording.This ID is retained even when " "the worker stops, allowing for easy tracking." -msgstr "Introduce un identificador para la grabación del worker. Este identificador se conserva incluso cuando el worker se detiene, lo que permite un seguimiento sencillo." +msgstr "" +"Introduce un identificador para la grabación del worker. Este identificador " +"se conserva incluso cuando el worker se detiene, lo que permite un " +"seguimiento sencillo." -#: core/models.py:599 +#: core/models.py:618 msgid "Recording mode" msgstr "Modo de grabación" -#: core/models.py:600 +#: core/models.py:619 msgid "Defines the mode of recording being called." msgstr "Define el modo de grabación a utilizar." -#: core/models.py:605 core/models.py:606 +#: core/models.py:624 core/models.py:625 msgid "Recording options" msgstr "Opciones de grabación" -#: core/models.py:613 +#: core/models.py:632 msgid "External Process ID" msgstr "ID del proceso externo" -#: core/models.py:614 +#: core/models.py:633 msgid "ID of the external process associated with the recording." msgstr "ID del proceso externo asociado a la grabación." -#: core/models.py:620 +#: core/models.py:639 msgid "Recording" msgstr "Grabación" -#: core/models.py:621 +#: core/models.py:640 msgid "Recordings" msgstr "Grabaciones" -#: core/models.py:731 +#: core/models.py:750 msgid "Recording/user relation" msgstr "Relación grabación/usuario" -#: core/models.py:732 +#: core/models.py:751 msgid "Recording/user relations" msgstr "Relaciones grabación/usuario" -#: core/models.py:738 +#: core/models.py:757 msgid "This user is already in this recording." msgstr "Este usuario ya está en esta grabación." -#: core/models.py:744 +#: core/models.py:763 msgid "This team is already in this recording." msgstr "Este equipo ya está en esta grabación." -#: core/models.py:750 +#: core/models.py:769 msgid "Either user or team must be set, not both." msgstr "Debe definirse el usuario o el equipo, pero no ambos." -#: core/models.py:767 +#: core/models.py:786 msgid "Create rooms" msgstr "Crear reunión" -#: core/models.py:768 +#: core/models.py:787 msgid "List rooms" msgstr "Listar reuniones" -#: core/models.py:769 +#: core/models.py:788 msgid "Retrieve room details" msgstr "Ver los detalles de una reunión" -#: core/models.py:770 +#: core/models.py:789 msgid "Update rooms" msgstr "Actualizar las reuniones" -#: core/models.py:771 +#: core/models.py:790 msgid "Delete rooms" msgstr "Eliminar las reuniones" -#: core/models.py:784 +#: core/models.py:803 msgid "Application name" msgstr "Nombre de la aplicación" -#: core/models.py:785 +#: core/models.py:804 msgid "Descriptive name for this application." msgstr "Nombre descriptivo de esta aplicación." -#: core/models.py:795 +#: core/models.py:814 msgid "Hashed on Save. Copy it now if this is a new secret." msgstr "Se cifra al guardar. Cópialo ahora si se trata de un secreto nuevo." -#: core/models.py:806 +#: core/models.py:825 msgid "Application" msgstr "Aplicación" -#: core/models.py:807 +#: core/models.py:826 msgid "Applications" msgstr "Aplicaciones" -#: core/models.py:830 +#: core/models.py:849 msgid "Enter a valid domain" msgstr "Introduce un dominio válido" -#: core/models.py:833 +#: core/models.py:852 msgid "Domain" msgstr "Dominio" -#: core/models.py:834 +#: core/models.py:853 msgid "Email domain this application can act on behalf of." -msgstr "Dominio de correo electrónico en cuyo nombre puede actuar esta aplicación." +msgstr "" +"Dominio de correo electrónico en cuyo nombre puede actuar esta aplicación." -#: core/models.py:846 +#: core/models.py:865 msgid "Application domain" msgstr "Dominio de aplicación" -#: core/models.py:847 +#: core/models.py:866 msgid "Application domains" msgstr "Dominios de aplicación" -#: core/models.py:865 +#: core/models.py:884 msgid "Pending" msgstr "Pendiente" -#: core/models.py:866 +#: core/models.py:885 msgid "Analyzing" msgstr "Analizando" -#: core/models.py:873 +#: core/models.py:892 msgid "Ready" msgstr "Listo" -#: core/models.py:879 +#: core/models.py:898 msgid "Background image" msgstr "Imagen de fondo" -#: core/models.py:891 +#: core/models.py:910 msgid "title" msgstr "título" -#: core/models.py:915 +#: core/models.py:934 msgid "Malware detection info when the analysis status is unsafe." -msgstr "Información sobre la detección de malware cuando el estado del análisis no es seguro." +msgstr "" +"Información sobre la detección de malware cuando el estado del análisis no " +"es seguro." -#: core/models.py:920 +#: core/models.py:939 msgid "File" msgstr "Archivo" -#: core/models.py:921 +#: core/models.py:940 msgid "Files" msgstr "Archivos" -#: core/models.py:1041 +#: core/models.py:1060 msgid "This file is already hard deleted." msgstr "Este archivo ya se ha eliminado definitivamente." -#: core/models.py:1051 +#: core/models.py:1070 msgid "To hard delete a file, it must first be soft deleted." -msgstr "Para eliminar definitivamente un archivo, primero debe haberse marcado como eliminado." +msgstr "" +"Para eliminar definitivamente un archivo, primero debe haberse marcado como " +"eliminado." -#: core/recording/event/notification.py:123 +#: core/recording/event/notification.py:124 msgid "Your recording is ready" msgstr "Tu grabación está lista" -#: core/recording/event/notification.py:194 +#: core/recording/event/notification.py:195 msgid "Transcription" msgstr "Transcripción" -#: core/recording/event/notification.py:204 +#: core/recording/event/notification.py:206 #, python-brace-format msgid "Meeting \"{room}\" on {room_recording_date} at {room_recording_time}" -msgstr "Reunión \"{room}\" del {room_recording_date} a las {room_recording_time}" +msgstr "" +"Reunión \"{room}\" del {room_recording_date} a las {room_recording_time}" #: core/services/invitation.py:44 #, python-brace-format msgid "Video call in progress: {sender.email} is waiting for you to connect" msgstr "Videollamada en curso: {sender.email} está esperando a que te conectes" -#: core/templates/mail/html/invitation.html:159 -#: core/templates/mail/html/screen_recording.html:159 -#: core/templates/mail/text/invitation.txt:3 -#: core/templates/mail/text/screen_recording.txt:3 +#: core/templates/mail/html/invitation.html:151 +#: core/templates/mail/html/screen_recording.html:151 +#: core/templates/mail/text/invitation.txt:4 +#: core/templates/mail/text/screen_recording.txt:4 msgid "Logo email" msgstr "Logotipo del correo" -#: core/templates/mail/html/invitation.html:189 -#: core/templates/mail/text/invitation.txt:5 +#: core/templates/mail/html/invitation.html:181 +#: core/templates/mail/text/invitation.txt:6 msgid "invites you to join an ongoing video call" msgstr "te invita a unirte a una videollamada en curso" -#: core/templates/mail/html/invitation.html:200 -#: core/templates/mail/text/invitation.txt:7 +#: core/templates/mail/html/invitation.html:192 +#: core/templates/mail/text/invitation.txt:8 msgid "JOIN THE CALL" msgstr "UNIRSE A LA LLAMADA" -#: core/templates/mail/html/invitation.html:227 -#: core/templates/mail/text/invitation.txt:13 +#: core/templates/mail/html/invitation.html:219 +#: core/templates/mail/text/invitation.txt:14 msgid "" "If you can't click the button, copy and paste the URL into your browser to " "join the call." -msgstr "Si no puedes hacer clic en el botón, copia y pega la URL en tu navegador para unirte a la llamada." +msgstr "" +"Si no puedes hacer clic en el botón, copia y pega la URL en tu navegador " +"para unirte a la llamada." -#: core/templates/mail/html/invitation.html:235 -#: core/templates/mail/text/invitation.txt:15 +#: core/templates/mail/html/invitation.html:227 +#: core/templates/mail/text/invitation.txt:16 msgid "Tips for a better experience:" msgstr "Consejos para una mejor experiencia:" -#: core/templates/mail/html/invitation.html:237 -#: core/templates/mail/text/invitation.txt:17 +#: core/templates/mail/html/invitation.html:229 +#: core/templates/mail/text/invitation.txt:18 msgid "Use Chrome or Firefox for better call quality" msgstr "Usa Chrome o Firefox para una mejor calidad de llamada" -#: core/templates/mail/html/invitation.html:238 -#: core/templates/mail/text/invitation.txt:18 +#: core/templates/mail/html/invitation.html:230 +#: core/templates/mail/text/invitation.txt:19 msgid "Test your microphone and camera before joining" msgstr "Prueba tu micrófono y tu cámara antes de unirte" -#: core/templates/mail/html/invitation.html:239 -#: core/templates/mail/text/invitation.txt:19 +#: core/templates/mail/html/invitation.html:231 +#: core/templates/mail/text/invitation.txt:20 msgid "Make sure you have a stable internet connection" msgstr "Asegúrate de tener una conexión a internet estable" -#: core/templates/mail/html/invitation.html:248 -#: core/templates/mail/html/screen_recording.html:245 -#: core/templates/mail/text/invitation.txt:21 -#: core/templates/mail/text/screen_recording.txt:23 +#: core/templates/mail/html/invitation.html:240 +#: core/templates/mail/html/screen_recording.html:237 +#: core/templates/mail/text/invitation.txt:22 +#: core/templates/mail/text/screen_recording.txt:24 #, python-format msgid " Thank you for using %(brandname)s. " msgstr " Gracias por usar %(brandname)s. " -#: core/templates/mail/html/screen_recording.html:188 -#: core/templates/mail/text/screen_recording.txt:6 +#: core/templates/mail/html/invitation.html:271 +#, python-format +msgid "" +"This mail has been sent to %(email)s by %(name)s" +msgstr "" + +#: core/templates/mail/html/screen_recording.html:180 +#: core/templates/mail/text/screen_recording.txt:7 msgid "Your recording is ready!" msgstr "¡Tu grabación está lista!" -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid "" " Your recording of \"%(room_name)s\" on %(recording_date)s at " "%(recording_time)s is now ready to download. " -msgstr " Tu grabación de \"%(room_name)s\" del %(recording_date)s a las %(recording_time)s ya está lista para descargar. " +msgstr "" +" Tu grabación de \"%(room_name)s\" del %(recording_date)s a las " +"%(recording_time)s ya está lista para descargar. " -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid " The recording will expire in %(days)s days. " msgstr " La grabación caducará dentro de %(days)s días. " -#: core/templates/mail/html/screen_recording.html:200 -#: core/templates/mail/text/screen_recording.txt:9 +#: core/templates/mail/html/screen_recording.html:192 +#: core/templates/mail/text/screen_recording.txt:10 msgid "" " Sharing the recording via link is not yet available. Only organizers can " "download it. " -msgstr " Compartir la grabación mediante un enlace todavía no está disponible. Solo los organizadores pueden descargarla. " +msgstr "" +" Compartir la grabación mediante un enlace todavía no está disponible. Solo " +"los organizadores pueden descargarla. " -#: core/templates/mail/html/screen_recording.html:206 -#: core/templates/mail/text/screen_recording.txt:11 +#: core/templates/mail/html/screen_recording.html:198 +#: core/templates/mail/text/screen_recording.txt:12 msgid "To keep this recording permanently:" msgstr "Para conservar esta grabación de forma permanente:" -#: core/templates/mail/html/screen_recording.html:208 +#: core/templates/mail/html/screen_recording.html:200 #, python-format msgid "Click the \"Open\" link below " -msgstr "Haz clic en el enlace \"Abrir\" que aparece abajo " +msgstr "" +"Haz clic en el enlace \"Abrir\" que aparece abajo " -#: core/templates/mail/html/screen_recording.html:209 -#: core/templates/mail/text/screen_recording.txt:14 +#: core/templates/mail/html/screen_recording.html:201 +#: core/templates/mail/text/screen_recording.txt:15 msgid "Use the \"Download\" button in the interface " msgstr "Usa el botón \"Descargar\" de la interfaz " -#: core/templates/mail/html/screen_recording.html:210 -#: core/templates/mail/text/screen_recording.txt:15 +#: core/templates/mail/html/screen_recording.html:202 +#: core/templates/mail/text/screen_recording.txt:16 msgid "Save the file to your preferred location" msgstr "Guarda el archivo en la ubicación que prefieras" -#: core/templates/mail/html/screen_recording.html:221 -#: core/templates/mail/text/screen_recording.txt:17 +#: core/templates/mail/html/screen_recording.html:213 +#: core/templates/mail/text/screen_recording.txt:18 msgid "Open" msgstr "Abrir" -#: core/templates/mail/html/screen_recording.html:230 -#: core/templates/mail/text/screen_recording.txt:19 +#: core/templates/mail/html/screen_recording.html:222 +#: core/templates/mail/text/screen_recording.txt:20 #, python-format msgid "" " If you have any questions or need assistance, please contact our support " "team at %(support_email)s. " -msgstr " Si tienes alguna pregunta o necesitas ayuda, ponte en contacto con nuestro equipo de soporte en %(support_email)s. " +msgstr "" +" Si tienes alguna pregunta o necesitas ayuda, ponte en contacto con nuestro " +"equipo de soporte en %(support_email)s. " -#: core/templates/mail/text/screen_recording.txt:13 +#: core/templates/mail/text/invitation.txt:24 +#, python-format +msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" +msgstr "" + +#: core/templates/mail/text/screen_recording.txt:14 #, python-format msgid "Click the \"Open [%(link)s]\" link below " msgstr "Haz clic en el enlace \"Abrir [%(link)s]\" que aparece abajo " -#: meet/settings.py:228 +#: meet/settings.py:238 msgid "English" msgstr "Inglés" -#: meet/settings.py:229 +#: meet/settings.py:239 msgid "French" msgstr "Francés" -#: meet/settings.py:230 +#: meet/settings.py:240 msgid "Dutch" msgstr "Neerlandés" -#: meet/settings.py:231 +#: meet/settings.py:241 msgid "German" msgstr "Alemán" -#: meet/settings.py:233 +#: meet/settings.py:242 msgid "Spanish" msgstr "Español" diff --git a/src/backend/locale/fr_FR/LC_MESSAGES/django.po b/src/backend/locale/fr_FR/LC_MESSAGES/django.po index 5a9b5d67..a60844b2 100644 --- a/src/backend/locale/fr_FR/LC_MESSAGES/django.po +++ b/src/backend/locale/fr_FR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-02 10:47+0000\n" +"POT-Creation-Date: 2026-09-02 22:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: antoine.lebaud@mail.numerique.gouv.fr\n" "Language-Team: LANGUAGE \n" @@ -51,11 +51,11 @@ msgstr "" msgid "File preview" msgstr "" -#: core/admin.py:300 core/admin.py:443 +#: core/admin.py:300 core/admin.py:450 msgid "No owner" msgstr "Pas de propriétaire" -#: core/admin.py:303 core/admin.py:446 +#: core/admin.py:303 core/admin.py:453 msgid "Multiple owners" msgstr "Plusieurs propriétaires" @@ -99,11 +99,11 @@ msgstr "" msgid "Skipped %(count)s recording(s) with an ineligible status." msgstr "%(count)s enregistrement(s) avec un statut inéligible ignoré(s)." -#: core/admin.py:510 +#: core/admin.py:517 msgid "No scopes" msgstr "Aucun scopes" -#: core/admin.py:512 +#: core/admin.py:519 msgid "Scopes" msgstr "Scopes" @@ -111,187 +111,199 @@ msgstr "Scopes" msgid "Creator is me" msgstr "Je suis le créateur" -#: core/api/serializers.py:89 +#: core/api/serializers.py:108 msgid "You must be administrator or owner of a room to add accesses to it." msgstr "" "Vous devez être administrateur ou propriétaire d'une salle pour y ajouter " "des accès." -#: core/api/serializers.py:534 +#: core/api/serializers.py:560 msgid "This file extension is not allowed." msgstr "Cette extension n'est pas autorisée" -#: core/api/viewsets.py:1222 +#: core/api/viewsets.py:1268 msgid "You have reached the maximum number of files for this type." msgstr "Vous avez atteint le nombre maximum de fichiers de ce type" -#: core/models.py:37 +#: core/models.py:38 msgid "Member" msgstr "Membre" -#: core/models.py:38 +#: core/models.py:39 msgid "Administrator" msgstr "Administrateur" -#: core/models.py:39 +#: core/models.py:40 msgid "Owner" msgstr "Propriétaire" -#: core/models.py:55 +#: core/models.py:56 msgid "Initiated" msgstr "Initié" -#: core/models.py:56 +#: core/models.py:57 msgid "Active" msgstr "Actif" -#: core/models.py:57 +#: core/models.py:58 msgid "Stopped" msgstr "Arrêté" -#: core/models.py:58 +#: core/models.py:59 msgid "Saved" msgstr "Enregistré" -#: core/models.py:59 +#: core/models.py:60 msgid "Aborted" msgstr "Abandonné" -#: core/models.py:60 +#: core/models.py:61 msgid "Failed to Start" msgstr "Échec au démarrage" -#: core/models.py:61 +#: core/models.py:62 msgid "Failed to Stop" msgstr "Échec à l'arrêt" -#: core/models.py:62 +#: core/models.py:63 msgid "Notification succeeded" msgstr "Notification réussie" -#: core/models.py:65 +#: core/models.py:66 msgid "External process successful" msgstr "Traitement externe : succès" -#: core/models.py:67 +#: core/models.py:68 msgid "External process failed" msgstr "Traitement externe : erreur" -#: core/models.py:96 +#: core/models.py:97 msgid "SCREEN_RECORDING" msgstr "ENREGISTREMENT_ÉCRAN" -#: core/models.py:97 +#: core/models.py:98 msgid "TRANSCRIPT" msgstr "TRANSCRIPTION" -#: core/models.py:103 +#: core/models.py:104 msgid "Public Access" msgstr "Accès public" -#: core/models.py:104 +#: core/models.py:105 msgid "Trusted Access" msgstr "Accès de confiance" -#: core/models.py:105 +#: core/models.py:106 msgid "Restricted Access" msgstr "Accès restreint" -#: core/models.py:117 +#: core/models.py:118 msgid "id" msgstr "id" -#: core/models.py:118 +#: core/models.py:119 msgid "primary key for the record as UUID" msgstr "clé primaire pour l'enregistrement sous forme d'UUID" -#: core/models.py:124 +#: core/models.py:125 msgid "created on" msgstr "créé le" -#: core/models.py:125 +#: core/models.py:126 msgid "date and time at which a record was created" msgstr "date et heure auxquelles un enregistrement a été créé" -#: core/models.py:130 +#: core/models.py:131 msgid "updated on" msgstr "mis à jour le" -#: core/models.py:131 +#: core/models.py:132 msgid "date and time at which a record was last updated" msgstr "" "date et heure auxquelles un enregistrement a été mis à jour pour la dernière " "fois" -#: core/models.py:151 -msgid "" -"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/" -"_ characters." -msgstr "" -"Entrez un sub valide. Cette valeur ne peut contenir que des lettres, des " -"chiffres et les caractères @/./+/-/_." - -#: core/models.py:157 +#: core/models.py:150 msgid "sub" msgstr "sub" -#: core/models.py:159 +#: core/models.py:152 msgid "" "Optional for pending users; required upon account activation. 255 characters " -"or fewer. Letters, numbers, and @/./+/-/_ characters only." +"or fewer. ASCII characters only." msgstr "" -"Optionnel pour les utilisateurs en attente ; requis lors de l'activation du " -"compte. 255 caractères maximum. Lettres, chiffres et @/./+/-/_ uniquement." +"Facultatif pour les utilisateurs en attente ; obligatoire lors de l’activation " +"du compte. 255 caractères maximum. Caractères ASCII uniquement." -#: core/models.py:168 +#: core/models.py:161 msgid "identity email address" msgstr "adresse e-mail d'identité" -#: core/models.py:173 +#: core/models.py:166 msgid "admin email address" msgstr "adresse e-mail d'administrateur" -#: core/models.py:175 +#: core/models.py:168 msgid "full name" msgstr "nom complet" -#: core/models.py:177 +#: core/models.py:170 msgid "short name" msgstr "nom court" -#: core/models.py:183 +#: core/models.py:176 msgid "language" msgstr "langue" -#: core/models.py:184 +#: core/models.py:177 msgid "The language in which the user wants to see the interface." msgstr "La langue dans laquelle l'utilisateur souhaite voir l'interface." -#: core/models.py:190 +#: core/models.py:183 msgid "The timezone in which the user wants to see times." msgstr "Le fuseau horaire dans lequel l'utilisateur souhaite voir les heures." -#: core/models.py:193 +#: core/models.py:190 +msgid "default room access level" +msgstr "" + +#: core/models.py:192 +msgid "" +"Access level applied by default to new rooms created by this user. When " +"empty, the instance default is used." +msgstr "" + +#: core/models.py:199 +#, fuzzy +#| msgid "Visio room configuration" +msgid "default room configuration" +msgstr "Configuration de la salle de visioconférence" + +#: core/models.py:201 +msgid "Configurations applied by default to new rooms created by this user." +msgstr "" + +#: core/models.py:205 msgid "device" msgstr "appareil" -#: core/models.py:195 +#: core/models.py:207 msgid "Whether the user is a device or a real user." msgstr "Si l'utilisateur est un appareil ou un utilisateur réel." -#: core/models.py:198 +#: core/models.py:210 msgid "staff status" msgstr "statut du personnel" -#: core/models.py:200 +#: core/models.py:212 msgid "Whether the user can log into this admin site." msgstr "Si l'utilisateur peut se connecter à ce site d'administration." -#: core/models.py:203 +#: core/models.py:215 msgid "active" msgstr "actif" -#: core/models.py:206 +#: core/models.py:218 msgid "" "Whether this user should be treated as active. Unselect this instead of " "deleting accounts." @@ -299,65 +311,65 @@ msgstr "" "Si cet utilisateur doit être traité comme actif. Désélectionnez cette option " "au lieu de supprimer des comptes." -#: core/models.py:219 +#: core/models.py:231 msgid "user" msgstr "utilisateur" -#: core/models.py:220 +#: core/models.py:232 msgid "users" msgstr "utilisateurs" -#: core/models.py:286 +#: core/models.py:298 msgid "Resource" msgstr "Ressource" -#: core/models.py:287 +#: core/models.py:299 msgid "Resources" msgstr "Ressources" -#: core/models.py:345 +#: core/models.py:357 msgid "Resource access" msgstr "Accès aux ressources" -#: core/models.py:346 +#: core/models.py:358 msgid "Resource accesses" msgstr "Accès aux ressources" -#: core/models.py:352 +#: core/models.py:364 msgid "Resource access with this User and Resource already exists." msgstr "" "L'accès à la ressource avec cet utilisateur et cette ressource existe déjà." -#: core/models.py:409 +#: core/models.py:421 msgid "Visio room configuration" msgstr "Configuration de la salle de visioconférence" -#: core/models.py:410 +#: core/models.py:422 msgid "Values for Visio parameters to configure the room." msgstr "Valeurs des paramètres de visioconférence pour configurer la salle." -#: core/models.py:417 +#: core/models.py:429 msgid "Room PIN code" msgstr "Code PIN de la salle" -#: core/models.py:418 +#: core/models.py:430 msgid "Unique n-digit code that identifies this room in telephony mode." msgstr "" "Code unique à n chiffres qui identifie cette salle en mode téléphonique." -#: core/models.py:424 core/models.py:578 +#: core/models.py:436 core/models.py:597 msgid "Room" msgstr "Salle" -#: core/models.py:425 +#: core/models.py:437 msgid "Rooms" msgstr "Salles" -#: core/models.py:589 +#: core/models.py:608 msgid "Worker ID" msgstr "ID du Worker" -#: core/models.py:591 +#: core/models.py:610 msgid "" "Enter an identifier for the worker recording.This ID is retained even when " "the worker stops, allowing for easy tracking." @@ -365,170 +377,170 @@ msgstr "" "Entrez un identifiant pour l'enregistrement du Worker. Cet identifiant est " "conservé même lorsque le Worker s'arrête, permettant un suivi facile." -#: core/models.py:599 +#: core/models.py:618 msgid "Recording mode" msgstr "Mode d'enregistrement" -#: core/models.py:600 +#: core/models.py:619 msgid "Defines the mode of recording being called." msgstr "Définit le mode d'enregistrement appelé." -#: core/models.py:605 core/models.py:606 +#: core/models.py:624 core/models.py:625 msgid "Recording options" msgstr "Options d'enregistrement" -#: core/models.py:613 +#: core/models.py:632 msgid "External Process ID" msgstr "ID Traitement externe" -#: core/models.py:614 +#: core/models.py:633 msgid "ID of the external process associated with the recording." msgstr "ID du traitement externe associé avec l'enregistrement." -#: core/models.py:620 +#: core/models.py:639 msgid "Recording" msgstr "Enregistrement" -#: core/models.py:621 +#: core/models.py:640 msgid "Recordings" msgstr "Enregistrements" -#: core/models.py:731 +#: core/models.py:750 msgid "Recording/user relation" msgstr "Relation enregistrement/utilisateur" -#: core/models.py:732 +#: core/models.py:751 msgid "Recording/user relations" msgstr "Relations enregistrement/utilisateur" -#: core/models.py:738 +#: core/models.py:757 msgid "This user is already in this recording." msgstr "Cet utilisateur est déjà dans cet enregistrement." -#: core/models.py:744 +#: core/models.py:763 msgid "This team is already in this recording." msgstr "Cette équipe est déjà dans cet enregistrement." -#: core/models.py:750 +#: core/models.py:769 msgid "Either user or team must be set, not both." msgstr "Soit l'utilisateur, soit l'équipe doit être défini, pas les deux." -#: core/models.py:767 +#: core/models.py:786 msgid "Create rooms" msgstr "Créer des salles" -#: core/models.py:768 +#: core/models.py:787 msgid "List rooms" msgstr "Lister les salles" -#: core/models.py:769 +#: core/models.py:788 msgid "Retrieve room details" msgstr "Afficher les détails d’une salle" -#: core/models.py:770 +#: core/models.py:789 msgid "Update rooms" msgstr "Mettre à jour les salles" -#: core/models.py:771 +#: core/models.py:790 msgid "Delete rooms" msgstr "Supprimer les salles" -#: core/models.py:784 +#: core/models.py:803 msgid "Application name" msgstr "Nom de l’application" -#: core/models.py:785 +#: core/models.py:804 msgid "Descriptive name for this application." msgstr "Nom descriptif de cette application." -#: core/models.py:795 +#: core/models.py:814 msgid "Hashed on Save. Copy it now if this is a new secret." msgstr "" "Haché lors de l’enregistrement. Copiez-le maintenant s’il s’agit d’un " "nouveau secret." -#: core/models.py:806 +#: core/models.py:825 msgid "Application" msgstr "Application" -#: core/models.py:807 +#: core/models.py:826 msgid "Applications" msgstr "Applications" -#: core/models.py:830 +#: core/models.py:849 msgid "Enter a valid domain" msgstr "Saisissez un domaine valide" -#: core/models.py:833 +#: core/models.py:852 msgid "Domain" msgstr "Domaine" -#: core/models.py:834 +#: core/models.py:853 msgid "Email domain this application can act on behalf of." msgstr "Domaine de messagerie au nom duquel cette application peut agir." -#: core/models.py:846 +#: core/models.py:865 msgid "Application domain" msgstr "Domaine d’application" -#: core/models.py:847 +#: core/models.py:866 msgid "Application domains" msgstr "Domaines d’application" -#: core/models.py:865 +#: core/models.py:884 msgid "Pending" msgstr "En attente" -#: core/models.py:866 +#: core/models.py:885 msgid "Analyzing" msgstr "" -#: core/models.py:873 +#: core/models.py:892 msgid "Ready" msgstr "Prêt" -#: core/models.py:879 +#: core/models.py:898 msgid "Background image" msgstr "Image de fond" -#: core/models.py:891 +#: core/models.py:910 msgid "title" msgstr "Titre" -#: core/models.py:915 +#: core/models.py:934 msgid "Malware detection info when the analysis status is unsafe." msgstr "" "Information concernant la détection de Malware cand le statut n'est pas sain" -#: core/models.py:920 +#: core/models.py:939 msgid "File" msgstr "Fichier" -#: core/models.py:921 +#: core/models.py:940 msgid "Files" msgstr "Fichiers" -#: core/models.py:1041 +#: core/models.py:1060 #, fuzzy #| msgid "This user is already in this recording." msgid "This file is already hard deleted." msgstr "Ce fichier a été supprimé." -#: core/models.py:1051 +#: core/models.py:1070 msgid "To hard delete a file, it must first be soft deleted." msgstr "" "Pour supprimer définitivement un fichier il doit d'abord avoir été marqué " "comme supprimé (soft delete)" -#: core/recording/event/notification.py:123 +#: core/recording/event/notification.py:124 msgid "Your recording is ready" msgstr "Votre enregistrement est prêt" -#: core/recording/event/notification.py:194 +#: core/recording/event/notification.py:195 msgid "Transcription" msgstr "Transcription" -#: core/recording/event/notification.py:204 +#: core/recording/event/notification.py:206 #, python-brace-format msgid "Meeting \"{room}\" on {room_recording_date} at {room_recording_time}" msgstr "Réunion \"{room}\" du {room_recording_date} à {room_recording_time}" @@ -538,25 +550,25 @@ msgstr "Réunion \"{room}\" du {room_recording_date} à {room_recording_time}" msgid "Video call in progress: {sender.email} is waiting for you to connect" msgstr "Appel vidéo en cours : {sender.email} attend que vous vous connectiez" -#: core/templates/mail/html/invitation.html:159 -#: core/templates/mail/html/screen_recording.html:159 -#: core/templates/mail/text/invitation.txt:3 -#: core/templates/mail/text/screen_recording.txt:3 +#: core/templates/mail/html/invitation.html:151 +#: core/templates/mail/html/screen_recording.html:151 +#: core/templates/mail/text/invitation.txt:4 +#: core/templates/mail/text/screen_recording.txt:4 msgid "Logo email" msgstr "Logo email" -#: core/templates/mail/html/invitation.html:189 -#: core/templates/mail/text/invitation.txt:5 +#: core/templates/mail/html/invitation.html:181 +#: core/templates/mail/text/invitation.txt:6 msgid "invites you to join an ongoing video call" msgstr "vous invite à rejoindre un appel vidéo en cours" -#: core/templates/mail/html/invitation.html:200 -#: core/templates/mail/text/invitation.txt:7 +#: core/templates/mail/html/invitation.html:192 +#: core/templates/mail/text/invitation.txt:8 msgid "JOIN THE CALL" msgstr "REJOINDRE L'APPEL" -#: core/templates/mail/html/invitation.html:227 -#: core/templates/mail/text/invitation.txt:13 +#: core/templates/mail/html/invitation.html:219 +#: core/templates/mail/text/invitation.txt:14 msgid "" "If you can't click the button, copy and paste the URL into your browser to " "join the call." @@ -564,41 +576,47 @@ msgstr "" "Si vous ne pouvez pas cliquer sur le bouton, copiez et collez l'URL dans " "votre navigateur pour rejoindre l'appel." -#: core/templates/mail/html/invitation.html:235 -#: core/templates/mail/text/invitation.txt:15 +#: core/templates/mail/html/invitation.html:227 +#: core/templates/mail/text/invitation.txt:16 msgid "Tips for a better experience:" msgstr "Conseils pour une meilleure expérience :" -#: core/templates/mail/html/invitation.html:237 -#: core/templates/mail/text/invitation.txt:17 +#: core/templates/mail/html/invitation.html:229 +#: core/templates/mail/text/invitation.txt:18 msgid "Use Chrome or Firefox for better call quality" msgstr "Utilisez Chrome ou Firefox pour une meilleure qualité d'appel" -#: core/templates/mail/html/invitation.html:238 -#: core/templates/mail/text/invitation.txt:18 +#: core/templates/mail/html/invitation.html:230 +#: core/templates/mail/text/invitation.txt:19 msgid "Test your microphone and camera before joining" msgstr "Testez votre microphone et votre caméra avant de rejoindre" -#: core/templates/mail/html/invitation.html:239 -#: core/templates/mail/text/invitation.txt:19 +#: core/templates/mail/html/invitation.html:231 +#: core/templates/mail/text/invitation.txt:20 msgid "Make sure you have a stable internet connection" msgstr "Assurez-vous d'avoir une connexion Internet stable" -#: core/templates/mail/html/invitation.html:248 -#: core/templates/mail/html/screen_recording.html:245 -#: core/templates/mail/text/invitation.txt:21 -#: core/templates/mail/text/screen_recording.txt:23 +#: core/templates/mail/html/invitation.html:240 +#: core/templates/mail/html/screen_recording.html:237 +#: core/templates/mail/text/invitation.txt:22 +#: core/templates/mail/text/screen_recording.txt:24 #, python-format msgid " Thank you for using %(brandname)s. " msgstr " Merci d'utiliser %(brandname)s. " -#: core/templates/mail/html/screen_recording.html:188 -#: core/templates/mail/text/screen_recording.txt:6 +#: core/templates/mail/html/invitation.html:271 +#, python-format +msgid "" +"This mail has been sent to %(email)s by %(name)s" +msgstr "" + +#: core/templates/mail/html/screen_recording.html:180 +#: core/templates/mail/text/screen_recording.txt:7 msgid "Your recording is ready!" msgstr "Votre enregistrement est prêt !" -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid "" " Your recording of \"%(room_name)s\" on %(recording_date)s at " @@ -607,14 +625,14 @@ msgstr "" " Votre enregistrement de \"%(room_name)s\" du %(recording_date)s à " "%(recording_time)s est maintenant prêt à être téléchargé. " -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid " The recording will expire in %(days)s days. " msgstr " L'enregistrement expirera dans %(days)s jours. " -#: core/templates/mail/html/screen_recording.html:200 -#: core/templates/mail/text/screen_recording.txt:9 +#: core/templates/mail/html/screen_recording.html:192 +#: core/templates/mail/text/screen_recording.txt:10 msgid "" " Sharing the recording via link is not yet available. Only organizers can " "download it. " @@ -622,33 +640,33 @@ msgstr "" "Le partage de l'enregistrement via lien n'est pas encore disponible. Seuls " "les organisateurs peuvent le télécharger." -#: core/templates/mail/html/screen_recording.html:206 -#: core/templates/mail/text/screen_recording.txt:11 +#: core/templates/mail/html/screen_recording.html:198 +#: core/templates/mail/text/screen_recording.txt:12 msgid "To keep this recording permanently:" msgstr "Pour conserver cet enregistrement de façon permanente :" -#: core/templates/mail/html/screen_recording.html:208 +#: core/templates/mail/html/screen_recording.html:200 #, python-format msgid "Click the \"Open\" link below " msgstr "Cliquez sur le lien \"Ouvrir\" ci-dessous " -#: core/templates/mail/html/screen_recording.html:209 -#: core/templates/mail/text/screen_recording.txt:14 +#: core/templates/mail/html/screen_recording.html:201 +#: core/templates/mail/text/screen_recording.txt:15 msgid "Use the \"Download\" button in the interface " msgstr "Utilisez le bouton \"Télécharger\" dans l'interface " -#: core/templates/mail/html/screen_recording.html:210 -#: core/templates/mail/text/screen_recording.txt:15 +#: core/templates/mail/html/screen_recording.html:202 +#: core/templates/mail/text/screen_recording.txt:16 msgid "Save the file to your preferred location" msgstr "Enregistrez le fichier à l'emplacement de votre choix" -#: core/templates/mail/html/screen_recording.html:221 -#: core/templates/mail/text/screen_recording.txt:17 +#: core/templates/mail/html/screen_recording.html:213 +#: core/templates/mail/text/screen_recording.txt:18 msgid "Open" msgstr "Ouvrir" -#: core/templates/mail/html/screen_recording.html:230 -#: core/templates/mail/text/screen_recording.txt:19 +#: core/templates/mail/html/screen_recording.html:222 +#: core/templates/mail/text/screen_recording.txt:20 #, python-format msgid "" " If you have any questions or need assistance, please contact our support " @@ -657,28 +675,33 @@ msgstr "" " Si vous avez des questions ou besoin d'assistance, veuillez contacter notre " "équipe d'assistance à %(support_email)s. " -#: core/templates/mail/text/screen_recording.txt:13 +#: core/templates/mail/text/invitation.txt:24 +#, python-format +msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" +msgstr "" + +#: core/templates/mail/text/screen_recording.txt:14 #, fuzzy, python-format #| msgid "Click the \"Open\" link below " msgid "Click the \"Open [%(link)s]\" link below " msgstr "Cliquez sur le lien \"Ouvrir\" ci-dessous " -#: meet/settings.py:228 +#: meet/settings.py:238 msgid "English" msgstr "Anglais" -#: meet/settings.py:229 +#: meet/settings.py:239 msgid "French" msgstr "Français" -#: meet/settings.py:230 +#: meet/settings.py:240 msgid "Dutch" msgstr "Néerlandais" -#: meet/settings.py:231 +#: meet/settings.py:241 msgid "German" msgstr "Allemand" -#: meet/settings.py:233 +#: meet/settings.py:242 msgid "Spanish" msgstr "Espagnol" diff --git a/src/backend/locale/nl_NL/LC_MESSAGES/django.po b/src/backend/locale/nl_NL/LC_MESSAGES/django.po index 8acbab67..157c906e 100644 --- a/src/backend/locale/nl_NL/LC_MESSAGES/django.po +++ b/src/backend/locale/nl_NL/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-02 10:47+0000\n" +"POT-Creation-Date: 2026-09-02 22:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,11 +51,11 @@ msgstr "" msgid "File preview" msgstr "" -#: core/admin.py:300 core/admin.py:443 +#: core/admin.py:300 core/admin.py:450 msgid "No owner" msgstr "Geen eigenaar" -#: core/admin.py:303 core/admin.py:446 +#: core/admin.py:303 core/admin.py:453 msgid "Multiple owners" msgstr "Meerdere eigenaren" @@ -98,11 +98,11 @@ msgstr "%(count)s opname(s) succesvol gemarkeerd als 'Mislukt bij stoppen'." msgid "Skipped %(count)s recording(s) with an ineligible status." msgstr "%(count)s opname(s) met een niet-toegestane status overgeslagen." -#: core/admin.py:510 +#: core/admin.py:517 msgid "No scopes" msgstr "Geen scopes" -#: core/admin.py:512 +#: core/admin.py:519 msgid "Scopes" msgstr "Scopes" @@ -110,184 +110,196 @@ msgstr "Scopes" msgid "Creator is me" msgstr "Maker ben ik" -#: core/api/serializers.py:89 +#: core/api/serializers.py:108 msgid "You must be administrator or owner of a room to add accesses to it." msgstr "" "Je moet beheerder of eigenaar van een ruimte zijn om toegang toe te voegen." -#: core/api/serializers.py:534 +#: core/api/serializers.py:560 msgid "This file extension is not allowed." msgstr "Deze bestandsextensie is niet toegestaan." -#: core/api/viewsets.py:1222 +#: core/api/viewsets.py:1268 msgid "You have reached the maximum number of files for this type." msgstr "Het maximale aantal bestanden voor dit type is bereikt." -#: core/models.py:37 +#: core/models.py:38 msgid "Member" msgstr "Lid" -#: core/models.py:38 +#: core/models.py:39 msgid "Administrator" msgstr "Beheerder" -#: core/models.py:39 +#: core/models.py:40 msgid "Owner" msgstr "Eigenaar" -#: core/models.py:55 +#: core/models.py:56 msgid "Initiated" msgstr "Gestart" -#: core/models.py:56 +#: core/models.py:57 msgid "Active" msgstr "Actief" -#: core/models.py:57 +#: core/models.py:58 msgid "Stopped" msgstr "Gestopt" -#: core/models.py:58 +#: core/models.py:59 msgid "Saved" msgstr "Opgeslagen" -#: core/models.py:59 +#: core/models.py:60 msgid "Aborted" msgstr "Afgebroken" -#: core/models.py:60 +#: core/models.py:61 msgid "Failed to Start" msgstr "Starten mislukt" -#: core/models.py:61 +#: core/models.py:62 msgid "Failed to Stop" msgstr "Stoppen mislukt" -#: core/models.py:62 +#: core/models.py:63 msgid "Notification succeeded" msgstr "Notificatie geslaagd" -#: core/models.py:65 +#: core/models.py:66 msgid "External process successful" msgstr "Externe procedure succesvol" -#: core/models.py:67 +#: core/models.py:68 msgid "External process failed" msgstr "Het externe proces is mislukt." -#: core/models.py:96 +#: core/models.py:97 msgid "SCREEN_RECORDING" msgstr "SCHERM_OPNAME" -#: core/models.py:97 +#: core/models.py:98 msgid "TRANSCRIPT" msgstr "TRANSCRIPT" -#: core/models.py:103 +#: core/models.py:104 msgid "Public Access" msgstr "Openbare toegang" -#: core/models.py:104 +#: core/models.py:105 msgid "Trusted Access" msgstr "Vertrouwde toegang" -#: core/models.py:105 +#: core/models.py:106 msgid "Restricted Access" msgstr "Beperkte toegang" -#: core/models.py:117 +#: core/models.py:118 msgid "id" msgstr "id" -#: core/models.py:118 +#: core/models.py:119 msgid "primary key for the record as UUID" msgstr "primaire sleutel voor het record als UUID" -#: core/models.py:124 +#: core/models.py:125 msgid "created on" msgstr "aangemaakt op" -#: core/models.py:125 +#: core/models.py:126 msgid "date and time at which a record was created" msgstr "datum en tijd waarop een record werd aangemaakt" -#: core/models.py:130 +#: core/models.py:131 msgid "updated on" msgstr "bijgewerkt op" -#: core/models.py:131 +#: core/models.py:132 msgid "date and time at which a record was last updated" msgstr "datum en tijd waarop een record voor het laatst werd bijgewerkt" -#: core/models.py:151 -msgid "" -"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/" -"_ characters." -msgstr "" -"Voer een geldige sub in. Deze waarde mag alleen letters, cijfers en @/./+/-/" -"_ tekens bevatten." - -#: core/models.py:157 +#: core/models.py:150 msgid "sub" msgstr "sub" -#: core/models.py:159 +#: core/models.py:152 msgid "" "Optional for pending users; required upon account activation. 255 characters " -"or fewer. Letters, numbers, and @/./+/-/_ characters only." +"or fewer. ASCII characters only." msgstr "" -"Optioneel voor gebruikers in afwachting; vereist bij accountactivering. " -"Maximum 255 tekens. Alleen letters, cijfers en @/./+/-/_ toegestaan." +"Optioneel voor gebruikers in afwachting; verplicht bij het activeren van het " +"account. Maximaal 255 tekens. Alleen ASCII-tekens." -#: core/models.py:168 +#: core/models.py:161 msgid "identity email address" msgstr "identiteit e-mailadres" -#: core/models.py:173 +#: core/models.py:166 msgid "admin email address" msgstr "beheerder e-mailadres" -#: core/models.py:175 +#: core/models.py:168 msgid "full name" msgstr "volledige naam" -#: core/models.py:177 +#: core/models.py:170 msgid "short name" msgstr "korte naam" -#: core/models.py:183 +#: core/models.py:176 msgid "language" msgstr "taal" -#: core/models.py:184 +#: core/models.py:177 msgid "The language in which the user wants to see the interface." msgstr "De taal waarin de gebruiker de interface wil zien." -#: core/models.py:190 +#: core/models.py:183 msgid "The timezone in which the user wants to see times." msgstr "De tijdzone waarin de gebruiker tijden wil zien." -#: core/models.py:193 +#: core/models.py:190 +msgid "default room access level" +msgstr "" + +#: core/models.py:192 +msgid "" +"Access level applied by default to new rooms created by this user. When " +"empty, the instance default is used." +msgstr "" + +#: core/models.py:199 +#, fuzzy +#| msgid "Visio room configuration" +msgid "default room configuration" +msgstr "Visio-ruimteconfiguratie" + +#: core/models.py:201 +msgid "Configurations applied by default to new rooms created by this user." +msgstr "" + +#: core/models.py:205 msgid "device" msgstr "apparaat" -#: core/models.py:195 +#: core/models.py:207 msgid "Whether the user is a device or a real user." msgstr "Of de gebruiker een apparaat is of een echte gebruiker." -#: core/models.py:198 +#: core/models.py:210 msgid "staff status" msgstr "personeelsstatus" -#: core/models.py:200 +#: core/models.py:212 msgid "Whether the user can log into this admin site." msgstr "Of de gebruiker kan inloggen op deze beheersite." -#: core/models.py:203 +#: core/models.py:215 msgid "active" msgstr "actief" -#: core/models.py:206 +#: core/models.py:218 msgid "" "Whether this user should be treated as active. Unselect this instead of " "deleting accounts." @@ -295,64 +307,64 @@ msgstr "" "Of deze gebruiker als actief moet worden behandeld. Deselecteer dit in " "plaats van accounts te verwijderen." -#: core/models.py:219 +#: core/models.py:231 msgid "user" msgstr "gebruiker" -#: core/models.py:220 +#: core/models.py:232 msgid "users" msgstr "gebruikers" -#: core/models.py:286 +#: core/models.py:298 msgid "Resource" msgstr "Bron" -#: core/models.py:287 +#: core/models.py:299 msgid "Resources" msgstr "Bronnen" -#: core/models.py:345 +#: core/models.py:357 msgid "Resource access" msgstr "Brontoegang" -#: core/models.py:346 +#: core/models.py:358 msgid "Resource accesses" msgstr "Brontoegangsrechten" -#: core/models.py:352 +#: core/models.py:364 msgid "Resource access with this User and Resource already exists." msgstr "Brontoegang met deze gebruiker en bron bestaat al." -#: core/models.py:409 +#: core/models.py:421 msgid "Visio room configuration" msgstr "Visio-ruimteconfiguratie" -#: core/models.py:410 +#: core/models.py:422 msgid "Values for Visio parameters to configure the room." msgstr "Waarden voor Visio-parameters om de ruimte te configureren." -#: core/models.py:417 +#: core/models.py:429 msgid "Room PIN code" msgstr "Pincode van de kamer" -#: core/models.py:418 +#: core/models.py:430 msgid "Unique n-digit code that identifies this room in telephony mode." msgstr "" "Unieke n-cijferige code die deze kamer identificeert in telefonie-modus." -#: core/models.py:424 core/models.py:578 +#: core/models.py:436 core/models.py:597 msgid "Room" msgstr "Ruimte" -#: core/models.py:425 +#: core/models.py:437 msgid "Rooms" msgstr "Ruimtes" -#: core/models.py:589 +#: core/models.py:608 msgid "Worker ID" msgstr "Worker ID" -#: core/models.py:591 +#: core/models.py:610 msgid "" "Enter an identifier for the worker recording.This ID is retained even when " "the worker stops, allowing for easy tracking." @@ -360,152 +372,152 @@ msgstr "" "Voer een identificatie in voor de worker-opname. Deze ID blijft behouden, " "zelfs wanneer de worker stopt, waardoor eenvoudige tracking mogelijk is." -#: core/models.py:599 +#: core/models.py:618 msgid "Recording mode" msgstr "Opnamemodus" -#: core/models.py:600 +#: core/models.py:619 msgid "Defines the mode of recording being called." msgstr "Definieert de modus van opname die wordt aangeroepen." -#: core/models.py:605 core/models.py:606 +#: core/models.py:624 core/models.py:625 msgid "Recording options" msgstr "Opnameopties" -#: core/models.py:613 +#: core/models.py:632 msgid "External Process ID" msgstr "Externe proces-ID" -#: core/models.py:614 +#: core/models.py:633 msgid "ID of the external process associated with the recording." msgstr "ID van het externe proces dat aan de opname is gekoppeld." -#: core/models.py:620 +#: core/models.py:639 msgid "Recording" msgstr "Opname" -#: core/models.py:621 +#: core/models.py:640 msgid "Recordings" msgstr "Opnames" -#: core/models.py:731 +#: core/models.py:750 msgid "Recording/user relation" msgstr "Opname/gebruiker-relatie" -#: core/models.py:732 +#: core/models.py:751 msgid "Recording/user relations" msgstr "Opname/gebruiker-relaties" -#: core/models.py:738 +#: core/models.py:757 msgid "This user is already in this recording." msgstr "Deze gebruiker is al in deze opname." -#: core/models.py:744 +#: core/models.py:763 msgid "This team is already in this recording." msgstr "Dit team is al in deze opname." -#: core/models.py:750 +#: core/models.py:769 msgid "Either user or team must be set, not both." msgstr "Ofwel gebruiker of team moet worden ingesteld, niet beide." -#: core/models.py:767 +#: core/models.py:786 msgid "Create rooms" msgstr "Ruimtes aanmaken" -#: core/models.py:768 +#: core/models.py:787 msgid "List rooms" msgstr "Ruimtes weergeven" -#: core/models.py:769 +#: core/models.py:788 msgid "Retrieve room details" msgstr "Details van een ruimte ophalen" -#: core/models.py:770 +#: core/models.py:789 msgid "Update rooms" msgstr "Ruimtes bijwerken" -#: core/models.py:771 +#: core/models.py:790 msgid "Delete rooms" msgstr "Ruimtes verwijderen" -#: core/models.py:784 +#: core/models.py:803 msgid "Application name" msgstr "Naam van de applicatie" -#: core/models.py:785 +#: core/models.py:804 msgid "Descriptive name for this application." msgstr "Beschrijvende naam voor deze applicatie." -#: core/models.py:795 +#: core/models.py:814 msgid "Hashed on Save. Copy it now if this is a new secret." msgstr "" "Wordt gehasht bij het opslaan. Kopieer het nu als dit een nieuw geheim is." -#: core/models.py:806 +#: core/models.py:825 msgid "Application" msgstr "Applicatie" -#: core/models.py:807 +#: core/models.py:826 msgid "Applications" msgstr "Applicaties" -#: core/models.py:830 +#: core/models.py:849 msgid "Enter a valid domain" msgstr "Voer een geldig domein in" -#: core/models.py:833 +#: core/models.py:852 msgid "Domain" msgstr "Domein" -#: core/models.py:834 +#: core/models.py:853 msgid "Email domain this application can act on behalf of." msgstr "E-maildomein namens welke deze applicatie kan handelen." -#: core/models.py:846 +#: core/models.py:865 msgid "Application domain" msgstr "Applicatiedomein" -#: core/models.py:847 +#: core/models.py:866 msgid "Application domains" msgstr "Applicatiedomeinen" -#: core/models.py:865 +#: core/models.py:884 msgid "Pending" msgstr "In afwachting" -#: core/models.py:866 +#: core/models.py:885 msgid "Analyzing" msgstr "" -#: core/models.py:873 +#: core/models.py:892 msgid "Ready" msgstr "Klaar" -#: core/models.py:879 +#: core/models.py:898 msgid "Background image" msgstr "Achtergrondafbeelding" -#: core/models.py:891 +#: core/models.py:910 msgid "title" msgstr "Titel" -#: core/models.py:915 +#: core/models.py:934 msgid "Malware detection info when the analysis status is unsafe." msgstr "Informatie over malwaredetectie wanneer de analysestatus onveilig is." -#: core/models.py:920 +#: core/models.py:939 msgid "File" msgstr "Bestand" -#: core/models.py:921 +#: core/models.py:940 msgid "Files" msgstr "Bestanden" -#: core/models.py:1041 +#: core/models.py:1060 msgid "This file is already hard deleted." msgstr "Dit bestand is al definitief verwijderd." -#: core/models.py:1051 +#: core/models.py:1070 #, fuzzy #| msgid "To hard delete a file, it must first be soft deleted." msgid "To hard delete a file, it must first be soft deleted." @@ -513,15 +525,15 @@ msgstr "" "Om een bestand definitief te verwijderen, moet het eerst zacht verwijderd " "zijn." -#: core/recording/event/notification.py:123 +#: core/recording/event/notification.py:124 msgid "Your recording is ready" msgstr "Je opname is klaar" -#: core/recording/event/notification.py:194 +#: core/recording/event/notification.py:195 msgid "Transcription" msgstr "Transcriptie" -#: core/recording/event/notification.py:204 +#: core/recording/event/notification.py:206 #, python-brace-format msgid "Meeting \"{room}\" on {room_recording_date} at {room_recording_time}" msgstr "" @@ -532,25 +544,25 @@ msgstr "" msgid "Video call in progress: {sender.email} is waiting for you to connect" msgstr "Video-oproep bezig: {sender.email} wacht op je verbinding" -#: core/templates/mail/html/invitation.html:159 -#: core/templates/mail/html/screen_recording.html:159 -#: core/templates/mail/text/invitation.txt:3 -#: core/templates/mail/text/screen_recording.txt:3 +#: core/templates/mail/html/invitation.html:151 +#: core/templates/mail/html/screen_recording.html:151 +#: core/templates/mail/text/invitation.txt:4 +#: core/templates/mail/text/screen_recording.txt:4 msgid "Logo email" msgstr "Logo e-mail" -#: core/templates/mail/html/invitation.html:189 -#: core/templates/mail/text/invitation.txt:5 +#: core/templates/mail/html/invitation.html:181 +#: core/templates/mail/text/invitation.txt:6 msgid "invites you to join an ongoing video call" msgstr "nodigt je uit om deel te nemen aan een lopende video-oproep" -#: core/templates/mail/html/invitation.html:200 -#: core/templates/mail/text/invitation.txt:7 +#: core/templates/mail/html/invitation.html:192 +#: core/templates/mail/text/invitation.txt:8 msgid "JOIN THE CALL" msgstr "NEEM DEEL AAN DE OPROEP" -#: core/templates/mail/html/invitation.html:227 -#: core/templates/mail/text/invitation.txt:13 +#: core/templates/mail/html/invitation.html:219 +#: core/templates/mail/text/invitation.txt:14 msgid "" "If you can't click the button, copy and paste the URL into your browser to " "join the call." @@ -558,41 +570,47 @@ msgstr "" "Als je niet op de knop kunt klikken, kopieer en plak dan de URL in je " "browser om deel te nemen aan de oproep." -#: core/templates/mail/html/invitation.html:235 -#: core/templates/mail/text/invitation.txt:15 +#: core/templates/mail/html/invitation.html:227 +#: core/templates/mail/text/invitation.txt:16 msgid "Tips for a better experience:" msgstr "Tips voor een betere ervaring:" -#: core/templates/mail/html/invitation.html:237 -#: core/templates/mail/text/invitation.txt:17 +#: core/templates/mail/html/invitation.html:229 +#: core/templates/mail/text/invitation.txt:18 msgid "Use Chrome or Firefox for better call quality" msgstr "Gebruik Chrome of Firefox voor betere gesprekskwaliteit" -#: core/templates/mail/html/invitation.html:238 -#: core/templates/mail/text/invitation.txt:18 +#: core/templates/mail/html/invitation.html:230 +#: core/templates/mail/text/invitation.txt:19 msgid "Test your microphone and camera before joining" msgstr "Test je microfoon en camera voordat je deelneemt" -#: core/templates/mail/html/invitation.html:239 -#: core/templates/mail/text/invitation.txt:19 +#: core/templates/mail/html/invitation.html:231 +#: core/templates/mail/text/invitation.txt:20 msgid "Make sure you have a stable internet connection" msgstr "Zorg ervoor dat je een stabiele internetverbinding hebt" -#: core/templates/mail/html/invitation.html:248 -#: core/templates/mail/html/screen_recording.html:245 -#: core/templates/mail/text/invitation.txt:21 -#: core/templates/mail/text/screen_recording.txt:23 +#: core/templates/mail/html/invitation.html:240 +#: core/templates/mail/html/screen_recording.html:237 +#: core/templates/mail/text/invitation.txt:22 +#: core/templates/mail/text/screen_recording.txt:24 #, python-format msgid " Thank you for using %(brandname)s. " msgstr " Bedankt voor het gebruik van %(brandname)s. " -#: core/templates/mail/html/screen_recording.html:188 -#: core/templates/mail/text/screen_recording.txt:6 +#: core/templates/mail/html/invitation.html:271 +#, python-format +msgid "" +"This mail has been sent to %(email)s by %(name)s" +msgstr "" + +#: core/templates/mail/html/screen_recording.html:180 +#: core/templates/mail/text/screen_recording.txt:7 msgid "Your recording is ready!" msgstr "Je opname is klaar!" -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid "" " Your recording of \"%(room_name)s\" on %(recording_date)s at " @@ -601,14 +619,14 @@ msgstr "" " Je opname van \"%(room_name)s\" op %(recording_date)s om %(recording_time)s " "is nu klaar om te downloaden. " -#: core/templates/mail/html/screen_recording.html:195 -#: core/templates/mail/text/screen_recording.txt:8 +#: core/templates/mail/html/screen_recording.html:187 +#: core/templates/mail/text/screen_recording.txt:9 #, python-format msgid " The recording will expire in %(days)s days. " msgstr " De opname verloopt over %(days)s dagen. " -#: core/templates/mail/html/screen_recording.html:200 -#: core/templates/mail/text/screen_recording.txt:9 +#: core/templates/mail/html/screen_recording.html:192 +#: core/templates/mail/text/screen_recording.txt:10 msgid "" " Sharing the recording via link is not yet available. Only organizers can " "download it. " @@ -616,33 +634,33 @@ msgstr "" "Het delen van de opname via een link is nog niet beschikbaar. Alleen " "organisatoren kunnen deze downloaden." -#: core/templates/mail/html/screen_recording.html:206 -#: core/templates/mail/text/screen_recording.txt:11 +#: core/templates/mail/html/screen_recording.html:198 +#: core/templates/mail/text/screen_recording.txt:12 msgid "To keep this recording permanently:" msgstr "Om deze opname permanent te bewaren:" -#: core/templates/mail/html/screen_recording.html:208 +#: core/templates/mail/html/screen_recording.html:200 #, python-format msgid "Click the \"Open\" link below " msgstr "Klik op de \"Openen\"-link hieronder " -#: core/templates/mail/html/screen_recording.html:209 -#: core/templates/mail/text/screen_recording.txt:14 +#: core/templates/mail/html/screen_recording.html:201 +#: core/templates/mail/text/screen_recording.txt:15 msgid "Use the \"Download\" button in the interface " msgstr "Gebruik de \"Download\"-knop in de interface " -#: core/templates/mail/html/screen_recording.html:210 -#: core/templates/mail/text/screen_recording.txt:15 +#: core/templates/mail/html/screen_recording.html:202 +#: core/templates/mail/text/screen_recording.txt:16 msgid "Save the file to your preferred location" msgstr "Sla het bestand op naar je gewenste locatie" -#: core/templates/mail/html/screen_recording.html:221 -#: core/templates/mail/text/screen_recording.txt:17 +#: core/templates/mail/html/screen_recording.html:213 +#: core/templates/mail/text/screen_recording.txt:18 msgid "Open" msgstr "Openen" -#: core/templates/mail/html/screen_recording.html:230 -#: core/templates/mail/text/screen_recording.txt:19 +#: core/templates/mail/html/screen_recording.html:222 +#: core/templates/mail/text/screen_recording.txt:20 #, python-format msgid "" " If you have any questions or need assistance, please contact our support " @@ -651,28 +669,33 @@ msgstr "" " Als je vragen hebt of hulp nodig hebt, neem dan contact op met ons support " "team via %(support_email)s. " -#: core/templates/mail/text/screen_recording.txt:13 +#: core/templates/mail/text/invitation.txt:24 +#, python-format +msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" +msgstr "" + +#: core/templates/mail/text/screen_recording.txt:14 #, fuzzy, python-format #| msgid "Click the \"Open\" link below " msgid "Click the \"Open [%(link)s]\" link below " msgstr "Klik op de \"Openen\"-link hieronder " -#: meet/settings.py:228 +#: meet/settings.py:238 msgid "English" msgstr "Engels" -#: meet/settings.py:229 +#: meet/settings.py:239 msgid "French" msgstr "Frans" -#: meet/settings.py:230 +#: meet/settings.py:240 msgid "Dutch" msgstr "Nederlands" -#: meet/settings.py:231 +#: meet/settings.py:241 msgid "German" msgstr "Duits" -#: meet/settings.py:233 +#: meet/settings.py:242 msgid "Spanish" msgstr "Spaans"