From 533bd36572dc0e6476425717499f1c2248160ec4 Mon Sep 17 00:00:00 2001 From: Michael Stilkerich Date: Sat, 5 Aug 2023 20:58:34 +0200 Subject: [PATCH 01/11] Fix CPU load of dockerapi container Previously the handle_pubsub_messages() loop was executing every 10ms when there was no message available. Now reading from the redis network socket will block (the coroutine) for up to 30s before it returns when no message is available. Using channel.listen() would be even better, but it lacks the ignore_subscribe_messages option and I could not figure out how to filter the returned messages. --- data/Dockerfiles/dockerapi/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/Dockerfiles/dockerapi/main.py b/data/Dockerfiles/dockerapi/main.py index 59d1a8ad..453a059d 100644 --- a/data/Dockerfiles/dockerapi/main.py +++ b/data/Dockerfiles/dockerapi/main.py @@ -198,8 +198,8 @@ async def handle_pubsub_messages(channel: aioredis.client.PubSub): while True: try: - async with async_timeout.timeout(1): - message = await channel.get_message(ignore_subscribe_messages=True) + async with async_timeout.timeout(60): + message = await channel.get_message(ignore_subscribe_messages=True, timeout=30) if message is not None: # Parse message data_json = json.loads(message['data'].decode('utf-8')) From 930473a980051ef1931ae5c4f57bedb24d56745e Mon Sep 17 00:00:00 2001 From: Michael Stilkerich Date: Sat, 12 Aug 2023 07:20:56 +0200 Subject: [PATCH 02/11] Set asyncio timeout to 0 for yielding --- data/Dockerfiles/dockerapi/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Dockerfiles/dockerapi/main.py b/data/Dockerfiles/dockerapi/main.py index 453a059d..f9f02b63 100644 --- a/data/Dockerfiles/dockerapi/main.py +++ b/data/Dockerfiles/dockerapi/main.py @@ -244,7 +244,7 @@ async def handle_pubsub_messages(channel: aioredis.client.PubSub): else: dockerapi.logger.error("Unknwon PubSub recieved - %s" % json.dumps(data_json)) - await asyncio.sleep(0.01) + await asyncio.sleep(0.0) except asyncio.TimeoutError: pass From 1a2f145b288583fd0e4caf517c4e0c9960b52a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20Fr=C3=B6hle?= Date: Sat, 12 Aug 2023 16:45:09 +0200 Subject: [PATCH 03/11] Update site.conf: server_names_hash_bucket_size 128 --- data/conf/nginx/site.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/conf/nginx/site.conf b/data/conf/nginx/site.conf index 1b46d2b9..fb40de87 100644 --- a/data/conf/nginx/site.conf +++ b/data/conf/nginx/site.conf @@ -1,5 +1,6 @@ proxy_cache_path /tmp levels=1:2 keys_zone=sogo:10m inactive=24h max_size=1g; -server_names_hash_bucket_size 64; +server_names_hash_max_size 512; +server_names_hash_bucket_size 128; map $http_x_forwarded_proto $client_req_scheme { default $scheme; From 095d59c01b8e0e8c52777a978f618ec511e5128a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20Fr=C3=B6hle?= Date: Sat, 12 Aug 2023 16:46:02 +0200 Subject: [PATCH 04/11] Update listen_ssl.template deprecated http2 on listener --- data/conf/nginx/templates/listen_ssl.template | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/conf/nginx/templates/listen_ssl.template b/data/conf/nginx/templates/listen_ssl.template index 93ec80c6..40c402d0 100644 --- a/data/conf/nginx/templates/listen_ssl.template +++ b/data/conf/nginx/templates/listen_ssl.template @@ -1,2 +1,3 @@ -listen ${HTTPS_PORT} ssl http2; -listen [::]:${HTTPS_PORT} ssl http2; +listen ${HTTPS_PORT} ssl; +listen [::]:${HTTPS_PORT} ssl; +http2 on; From 2c52753adb28517d54e579fc1973ccacc5b4d5fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:21:07 +0000 Subject: [PATCH 05/11] Update dependency nextcloud/server to v27.0.2 Signed-off-by: milkmaker --- helper-scripts/nextcloud.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helper-scripts/nextcloud.sh b/helper-scripts/nextcloud.sh index 1b08a554..6d7c7953 100755 --- a/helper-scripts/nextcloud.sh +++ b/helper-scripts/nextcloud.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # renovate: datasource=github-releases depName=nextcloud/server versioning=semver extractVersion=^v(?.*)$ -NEXTCLOUD_VERSION=27.0.1 +NEXTCLOUD_VERSION=27.0.2 echo -ne "Checking prerequisites..." sleep 1 From 30e241babe1c0d28bc27ddb9043b545f2782b36f Mon Sep 17 00:00:00 2001 From: milkmaker Date: Sat, 19 Aug 2023 21:47:23 +0200 Subject: [PATCH 06/11] Translations update from Weblate (#5390) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Web] Updated lang.de-de.json Co-authored-by: Peter Co-authored-by: milkmaker * [Web] Updated lang.es-es.json Co-authored-by: Marco Truffat Co-authored-by: milkmaker * [Web] Updated lang.hu-hu.json [Web] Updated lang.hu-hu.json [Web] Updated lang.hu-hu.json Co-authored-by: 0xAndrewBlack <0xandrewblack@gmail.com> Co-authored-by: Kántor Attila Co-authored-by: Mihály Szilágyi Co-authored-by: milkmaker * [Web] Updated lang.ro-ro.json Co-authored-by: Vlad M Co-authored-by: milkmaker * [Web] Updated lang.ru-ru.json Co-authored-by: Oleksii Kruhlenko Co-authored-by: milkmaker * [Web] Updated lang.gr-gr.json [Web] Added lang.gr-gr.json Co-authored-by: Nik Beaver Co-authored-by: Peter Co-authored-by: milkmaker * [Web] Updated lang.fr-fr.json Co-authored-by: Adrien Kara Co-authored-by: milkmaker * [Web] Updated lang.en-gb.json Co-authored-by: Philipp E Co-authored-by: milkmaker * [Web] Updated lang.ca-es.json Co-authored-by: Marco Truffat Co-authored-by: milkmaker * [Web] Updated lang.it-it.json Co-authored-by: Michele Caputo Co-authored-by: milkmaker * [Web] Updated lang.uk-ua.json Co-authored-by: Oleksii Kruhlenko Co-authored-by: milkmaker * [Web] Updated lang.si-si.json [Web] Updated lang.si-si.json [Web] Updated lang.si-si.json [Web] Added lang.si-si.json Co-authored-by: Peter Co-authored-by: gomiunik Co-authored-by: milkmaker * Add Greek + Slovenian --------- Co-authored-by: Peter Co-authored-by: Marco Truffat Co-authored-by: 0xAndrewBlack <0xandrewblack@gmail.com> Co-authored-by: Kántor Attila Co-authored-by: Mihály Szilágyi Co-authored-by: Vlad M Co-authored-by: Oleksii Kruhlenko Co-authored-by: Nik Beaver Co-authored-by: Adrien Kara Co-authored-by: Philipp E Co-authored-by: Michele Caputo Co-authored-by: gomiunik --- data/web/inc/vars.inc.php | 2 + data/web/lang/lang.ca-es.json | 24 ++- data/web/lang/lang.de-de.json | 6 +- data/web/lang/lang.en-gb.json | 2 +- data/web/lang/lang.es-es.json | 16 +- data/web/lang/lang.fr-fr.json | 3 +- data/web/lang/lang.gr-gr.json | 20 ++ data/web/lang/lang.hu-hu.json | 17 +- data/web/lang/lang.it-it.json | 7 +- data/web/lang/lang.ro-ro.json | 30 ++- data/web/lang/lang.ru-ru.json | 32 ++- data/web/lang/lang.si-si.json | 396 ++++++++++++++++++++++++++++++++++ data/web/lang/lang.uk-ua.json | 105 ++++++++- 13 files changed, 625 insertions(+), 35 deletions(-) create mode 100644 data/web/lang/lang.gr-gr.json create mode 100644 data/web/lang/lang.si-si.json diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php index 5e6d72e7..3f726934 100644 --- a/data/web/inc/vars.inc.php +++ b/data/web/inc/vars.inc.php @@ -90,6 +90,7 @@ $AVAILABLE_LANGUAGES = array( 'es-es' => 'Español (Spanish)', 'fi-fi' => 'Suomi (Finish)', 'fr-fr' => 'Français (French)', + 'gr-gr' => 'Ελληνικά (Greek)', 'hu-hu' => 'Magyar (Hungarian)', 'it-it' => 'Italiano (Italian)', 'ko-kr' => '한국어 (Korean)', @@ -99,6 +100,7 @@ $AVAILABLE_LANGUAGES = array( 'pt-pt' => 'Português (Portuguese)', 'ro-ro' => 'Română (Romanian)', 'ru-ru' => 'Pусский (Russian)', + 'si-si' => 'Slovenščina (Slovenian)', 'sk-sk' => 'Slovenčina (Slovak)', 'sv-se' => 'Svenska (Swedish)', 'tr-tr' => 'Türkçe (Turkish)', diff --git a/data/web/lang/lang.ca-es.json b/data/web/lang/lang.ca-es.json index 26a30afd..877b46cd 100644 --- a/data/web/lang/lang.ca-es.json +++ b/data/web/lang/lang.ca-es.json @@ -3,7 +3,23 @@ "bcc_maps": "BCC maps", "filters": "Filtres", "recipient_maps": "Recipient maps", - "syncjobs": "Feines de sincronització" + "syncjobs": "Feines de sincronització", + "quarantine_category": "Canvia la categoria de les notificacions de quarantena", + "quarantine_notification": "Canvia les notificacions de quarantena", + "sogo_profile_reset": "Restableix el prefil SOGo", + "alias_domains": "Afegir àlies de domini", + "app_passwds": "Gestiona les contrasenyes de les aplicacions", + "domain_desc": "Canvia la descripció del domini", + "eas_reset": "Restableix els dispositius EAS", + "login_as": "Inicia sessió com a usuari de la bústia de correu", + "prohibited": "Prohibit per ACL", + "protocol_access": "Canvia el protocol d'accés", + "quarantine": "Accions de quarantena", + "quarantine_attachments": "Fitxers adjunts en quarantena", + "spam_alias": "Àlies temporals", + "spam_score": "Puntuació de correu brossa", + "tls_policy": "Política TLS", + "unlimited_quota": "Quota ilimitada per bústies de correo" }, "add": { "activate_filter_warn": "All other filters will be deactivated, when active is checked.", @@ -55,7 +71,9 @@ "target_domain": "Domini destí:", "username": "Username", "validate": "Validar", - "validation_success": "Validated successfully" + "validation_success": "Validated successfully", + "app_name": "Nom de l'aplicació", + "app_password": "Afegir contrasenya a l'aplicació" }, "admin": { "access": "Accés", @@ -259,7 +277,7 @@ }, "footer": { "cancel": "Cancel·lar", - "confirm_delete": "Confirma l'esborrat ", + "confirm_delete": "Confirma l'esborrat", "delete_now": "Esborrar ara", "delete_these_items": "Si et plau confirma els canvis al objecte amb id:", "loading": "Si et plau espera ...", diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index d6f79dc5..43d2b6c5 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -343,7 +343,9 @@ "api_read_only": "Schreibgeschützter Zugriff", "api_read_write": "Lese-Schreib-Zugriff", "oauth2_apps": "OAuth2 Apps", - "queue_unban": "entsperren" + "queue_unban": "entsperren", + "allowed_methods": "Access-Control-Allow-Methods", + "allowed_origins": "Access-Control-Allow-Origin" }, "danger": { "access_denied": "Zugriff verweigert oder unvollständige/ungültige Daten", @@ -482,7 +484,7 @@ "info": "_START_ bis _END_ von _TOTAL_ Einträgen", "infoEmpty": "0 bis 0 von 0 Einträgen", "infoFiltered": "(gefiltert von _MAX_ Einträgen)", - "infoPostFix": "", + "infoPostFix": "datatables.infoPostFix", "thousands": ".", "lengthMenu": "_MENU_ Einträge anzeigen", "loadingRecords": "Wird geladen...", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 28ff19b8..a4d06da3 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -484,7 +484,7 @@ "info": "Showing _START_ to _END_ of _TOTAL_ entries", "infoEmpty": "Showing 0 to 0 of 0 entries", "infoFiltered": "(filtered from _MAX_ total entries)", - "infoPostFix": "", + "infoPostFix": "datatables.infoPostFix", "thousands": ",", "lengthMenu": "Show _MENU_ entries", "loadingRecords": "Loading...", diff --git a/data/web/lang/lang.es-es.json b/data/web/lang/lang.es-es.json index e56e6bdd..78580ccc 100644 --- a/data/web/lang/lang.es-es.json +++ b/data/web/lang/lang.es-es.json @@ -20,7 +20,9 @@ "tls_policy": "Póliza de TLS", "unlimited_quota": "Cuota ilimitada para buzones", "app_passwds": "Gestionar las contraseñas de aplicaciones", - "domain_desc": "Cambiar descripción del dominio" + "domain_desc": "Cambiar descripción del dominio", + "protocol_access": "Cambiar protocolo de acceso", + "quarantine_category": "Cambiar categoría de las notificaciones de cuarentena" }, "add": { "activate_filter_warn": "Todos los demás filtros se desactivarán cuando este filtro se active.", @@ -85,7 +87,13 @@ "timeout2": "Tiempo de espera para la conexión al host local", "username": "Usuario", "validate": "Validar", - "validation_success": "Validado exitosamente" + "validation_success": "Validado exitosamente", + "inactive": "Inactivo", + "app_name": "Nombre de la App", + "app_password": "Añadir contraseña para la app", + "public_comment": "Comentarios públicos", + "disable_login": "Desactivar login (el correo entrante seguirá activo)", + "comment_info": "Los comentarios privados no son visibles al usuario, mientras que los comentarios públicos aparecerán sobre la información general del usuario" }, "admin": { "access": "Acceso", @@ -114,7 +122,7 @@ "app_name": "Nombre de la app", "apps_name": "Nombre \"mailcow Apps\"", "arrival_time": "Tiempo de llegada (hora del servidor)", - "ban_list_info": "La lista de IPs bloqueadas sigue a continuación: red (tiempo de prohibición restante) - [acciones].
Las IPs en cola para ser desbloquadas se eliminarán de la lista de bloqueos en unos pocos segundos.
Las etiquetas rojas indican bloqueos permanentes permanentes mediante la inclusión en una lista negra.", + "ban_list_info": "Lista de IPs bloqueadas: red (tiempo de prohibición restante) - [acciones].
Las IPs en cola para ser desbloqueadas se eliminarán de la lista de bloqueos en unos pocos segundos.
Las etiquetas rojas indican bloqueos permanentes mediante la inclusión en la lista negra.", "change_logo": "Cambiar logo", "configuration": "Configuración", "credentials_transport_warning": "Advertencia: al agregar una nueva entrada de ruta de transporte se actualizarán las credenciales para todas las entradas con una columna de \"siguiente destino\" coincidente.", @@ -432,7 +440,7 @@ }, "header": { "administration": "Administración", - "debug": "Información del sistema", + "debug": "Información", "email": "E-Mail", "mailcow_config": "Configuración", "quarantine": "Cuarentena", diff --git a/data/web/lang/lang.fr-fr.json b/data/web/lang/lang.fr-fr.json index 0bc0ba02..48420550 100644 --- a/data/web/lang/lang.fr-fr.json +++ b/data/web/lang/lang.fr-fr.json @@ -1096,7 +1096,8 @@ "weeks": "semaines", "months": "mois", "year": "année", - "years": "années" + "years": "années", + "with_app_password": "avec le mot de passe de l'application" }, "warning": { "cannot_delete_self": "Impossible de supprimer l’utilisateur connecté", diff --git a/data/web/lang/lang.gr-gr.json b/data/web/lang/lang.gr-gr.json new file mode 100644 index 00000000..df9127ae --- /dev/null +++ b/data/web/lang/lang.gr-gr.json @@ -0,0 +1,20 @@ +{ + "user": { + "verify": "Επαλήθευση", + "week": "εβδομάδα", + "weekly": "Εβδομαδιαία", + "weeks": "Εβδομάδες", + "with_app_password": "με κωδικό εφαρμογής", + "year": "χρόνος", + "years": "χρόνια" + }, + "warning": { + "cannot_delete_self": "Αδυναμία διαγραφής συνδεδεμένου χρήστη", + "dovecot_restart_failed": "Απέτυχε η επανεκκίνηση του Dovecot, παρακαλώ ελέγξτε τα αρχεία καταγραφής.", + "no_active_admin": "Αδυναμία απενεργοποίησης του τελευταίου ενεργού διαχειριστή", + "domain_added_sogo_failed": "Προστέθηκε το όνομα χώρου αλλά απέτυχε η επανεκκίνηση του SOGo.", + "hash_not_found": "Η κατακερματισμένη τιμή (hash value) δεν βρέθηκε ή έχει είδη διαγραφεί.", + "ip_invalid": "Παραλείφθηκε μη έγκυρη διεύθυνση IP: %s", + "is_not_primary_alias": "Παραλείφθηκε μη πρωτεύον ψευδώνυμο %s" + } +} diff --git a/data/web/lang/lang.hu-hu.json b/data/web/lang/lang.hu-hu.json index f04cf9c5..327f0752 100644 --- a/data/web/lang/lang.hu-hu.json +++ b/data/web/lang/lang.hu-hu.json @@ -18,7 +18,11 @@ "transport_dest_format": "Szintaxis: pelda.hu, .pelda.hu, *, fiok@pelda.hu (több érték esetén vesszővel elválasztva)", "upload": "Feltöltés", "username": "Felhasználónév", - "verify": "Ellenőrzés" + "verify": "Ellenőrzés", + "activate_api": "API aktiválása", + "activate_send": "Küldés gomb aktiválása", + "add": "Hozzáad", + "active": "Aktív" }, "edit": { "active": "Aktív", @@ -385,9 +389,18 @@ "acl": { "delimiter_action": "Elhatárolás", "alias_domains": "Alias domainek hozzáadása", - "app_passwds": "Alkalmazás jelszavak kezelése" + "app_passwds": "Alkalmazás jelszavak kezelése", + "domain_desc": "Domain leírás módosítása", + "filters": "Szűrők", + "login_as": "Bejelentkezés mint", + "quarantine": "Karantén műveletek", + "bcc_maps": "BCC címek" }, "diagnostics": { "dns_records": "DNS bejegyzések" + }, + "add": { + "username": "Felhasználónév", + "validation_success": "Sikeres ellenőrzés" } } diff --git a/data/web/lang/lang.it-it.json b/data/web/lang/lang.it-it.json index 0d5b3f25..84f6e266 100644 --- a/data/web/lang/lang.it-it.json +++ b/data/web/lang/lang.it-it.json @@ -134,10 +134,10 @@ "admins_ldap": "Amministratori LDAP", "advanced_settings": "Impostazioni avanzate", "api_allow_from": "Allow API access from these IPs/CIDR network notations", - "api_info": "The API is a work in progress. The documentation can be found at /api", + "api_info": "Questa API è in modifica. La documentazione può essere trovata su /api", "api_key": "Chiave API", "api_skip_ip_check": "Salta il controllo dell'IP per l'API", - "app_links": "App links", + "app_links": "Link dell'app", "app_name": "Nome dell'app", "apps_name": "Nome \"mailcow Apps\"", "arrival_time": "Ora di arrivo (ora del server)", @@ -338,7 +338,8 @@ "oauth2_apps": "App OAuth2", "oauth2_add_client": "Aggiungere il client OAuth2", "rsettings_preset_4": "Disattivare Rspamd per un dominio", - "options": "Opzioni" + "options": "Opzioni", + "cors_settings": "Impostazioni CORS" }, "danger": { "access_denied": "Accesso negato o form di login non corretto", diff --git a/data/web/lang/lang.ro-ro.json b/data/web/lang/lang.ro-ro.json index e6315db0..62585058 100644 --- a/data/web/lang/lang.ro-ro.json +++ b/data/web/lang/lang.ro-ro.json @@ -106,7 +106,8 @@ "timeout2": "Timeout pentru conectarea la gazda locală", "username": "Nume de utilizator", "validate": "Validează", - "validation_success": "Validat cu succes" + "validation_success": "Validat cu succes", + "tags": "Etichete" }, "admin": { "access": "Acces", @@ -334,7 +335,15 @@ "username": "Nume de utilizator", "validate_license_now": "Validează GUID cu serverul de licență", "verify": "Verifică", - "yes": "✓" + "yes": "✓", + "cors_settings": "Setări CORS", + "f2b_ban_time_increment": "Timpul de blocare creşte cu fiecare blocare", + "f2b_max_ban_time": "Max. timp de blocare (s)", + "ip_check": "Verificaţie IP", + "ip_check_disabled": "Verificarea IP este dezactivată. Puteţi activa la
Sistem > Configuraţie > Opţiuni > Personalizează", + "ip_check_opt_in": "Alegeţi să folosiţi servicile ipv4.mailcow.email şi ipv6.mailcow.email să rezolvaţi addrese IP externale.", + "options": "Opţiuni", + "queue_unban": "retractează interzicere" }, "danger": { "access_denied": "Accesul a fost respins sau datele formularului sunt invalide", @@ -453,7 +462,16 @@ "username_invalid": "Numele de utilizator %s nu poate fi utilizat", "validity_missing": "Atribuie o perioadă de valabilitate", "value_missing": "Furnizează toate valorile", - "yotp_verification_failed": "Verificarea Yubico OTP a eșuat: %s" + "yotp_verification_failed": "Verificarea Yubico OTP a eșuat: %s", + "cors_invalid_method": "Aveţi specificaţi 'Allow-Method' invalid", + "webauthn_authenticator_failed": "Authentificator selectat nu a fost găsit", + "webauthn_publickey_failed": "Nici-o cheie publică a fost salvată pentru authenticatorul selectat", + "webauthn_username_failed": "Authenticatorul selectat aparţine la alt cont", + "demo_mode_enabled": "Mod de demonstraţie este activ", + "extended_sender_acl_denied": "lipseşte ACL pentru setarea adrese externe", + "template_exists": "Şablon %s deja există", + "template_id_invalid": "Şablon ID %s este invalid", + "template_name_invalid": "Nume de şablon este invalid" }, "debug": { "chart_this_server": "Grafic (acest server)", @@ -641,7 +659,7 @@ "header": { "administration": "Configurație și detalii", "apps": "Aplicații", - "debug": "Informații Sistem", + "debug": "Informaţie", "email": "E-Mail", "mailcow_config": "Configurație", "quarantine": "Carantină", @@ -1187,5 +1205,9 @@ "quota_exceeded_scope": "Cota de spațiu a domeniului depășită: Numai căsuțe poștale nelimitate pot fi create pe acest domeniu.", "session_token": "Token formular invalid: Nepotrivire token", "session_ua": "Token formular invalid: Eroare validare utilizator-agent" + }, + "datatables": { + "expand_all": "Expandează tot", + "decimal": "," } } diff --git a/data/web/lang/lang.ru-ru.json b/data/web/lang/lang.ru-ru.json index bad64184..0783710c 100644 --- a/data/web/lang/lang.ru-ru.json +++ b/data/web/lang/lang.ru-ru.json @@ -338,7 +338,13 @@ "yes": "✓", "queue_unban": "разблокировать", "f2b_ban_time_increment": "Время бана увеличивается с каждым баном", - "f2b_max_ban_time": "Максимальное время блокировки" + "f2b_max_ban_time": "Максимальное время блокировки", + "allowed_origins": "Access-Control-Allow-Origin", + "cors_settings": "Настройки CORS", + "allowed_methods": "Access-Control-Allow-Methods", + "ip_check": "Проверить IP", + "ip_check_disabled": "Проверка IP отключена. Вы можете включить его в разделе
Система > Конфигурация > Параметры > Настроить.", + "ip_check_opt_in": "Согласие на использование сторонних служб ipv4.mailcow.email и ipv6.mailcow.email для разрешения внешних IP-адресов." }, "danger": { "access_denied": "Доступ запрещён, или указаны неверные данные", @@ -457,7 +463,10 @@ "username_invalid": "Имя пользователя %s нельзя использовать", "validity_missing": "Пожалуйста, назначьте срок действия", "value_missing": "Пожалуйста заполните все поля", - "yotp_verification_failed": "Ошибка валидации Yubico OTP: %s" + "yotp_verification_failed": "Ошибка валидации Yubico OTP: %s", + "cors_invalid_method": "Указан недопустимый метод разрешения", + "demo_mode_enabled": "Демонстрационный режим включен", + "cors_invalid_origin": "Указан неверный Allow-Origin" }, "debug": { "chart_this_server": "Диаграмма (текущий сервер)", @@ -542,7 +551,7 @@ "inactive": "Неактивный", "kind": "Тип", "last_modified": "Последние изменения", - "lookup_mx": "Назначение на основе резовинга MX записи по регулярному выражению (.*\\.example\\.com$ для маршрутизации всей почты через этот хост, если MX заканчивающийся на example.com)", + "lookup_mx": "Назначение на основе резолвинга MX записи по регулярному выражению (.*\\.example\\.com$ для маршрутизации всей почты через этот хост, если MX заканчивающийся на example.com)", "mailbox": "Изменение почтового аккаунта", "mailbox_quota_def": "Квота по умолчанию", "mailbox_relayhost_info": "Применяется только к почтовому ящику и личным псевдонимам, вне зависимости от настроек маршрутизации на уровне домена.", @@ -607,7 +616,9 @@ "title": "Изменение объекта", "unchanged_if_empty": "Если без изменений - оставьте пустым", "username": "Имя пользователя", - "validate_save": "Подтвердить и сохранить" + "validate_save": "Подтвердить и сохранить", + "sogo_access_info": "Единый вход из интерфейса почты продолжает работать. Эта настройка не влияет на доступ ко всем другим службам, а также не удаляет или изменяет существующий профиль пользователя SOGo.", + "app_passwd_protocols": "Разрешенные протоколы для пароля приложения" }, "fido2": { "confirm": "Подтвердить", @@ -987,7 +998,8 @@ "verified_fido2_login": "Авторизация FIDO2 пройдена", "verified_totp_login": "Авторизация TOTP пройдена", "verified_webauthn_login": "Авторизация WebAuthn пройдена", - "verified_yotp_login": "Авторизация Yubico OTP пройдена" + "verified_yotp_login": "Авторизация Yubico OTP пройдена", + "cors_headers_edited": "Настройки CORS сохранены" }, "tfa": { "api_register": "%s использует Yubico Cloud API. Пожалуйста, получите ключ API для вашего ключа здесь", @@ -1169,7 +1181,12 @@ "weekly": "Раз в неделю", "weeks": "недели", "year": "год", - "years": "лет" + "years": "лет", + "allowed_protocols": "Разрешенные протоколы", + "apple_connection_profile_with_app_password": "Новый пароль приложения генерируется и добавляется в профиль, поэтому при настройке устройства не требуется вводить пароль. Не предоставляйте доступ к файлу, поскольку он предоставляет полный доступ к вашему почтовому ящику.", + "direct_protocol_access": "Этот пользователь почтового ящика имеет прямой, внешний доступ к следующим протоколам и приложениям. Эта настройка контролируется вашим администратором. Для предоставления доступа к отдельным протоколам и приложениям могут быть созданы пароли приложений.
Кнопка \"Вход в веб-почту\" обеспечивает единый вход в SOGo и всегда доступна.", + "with_app_password": "с паролем приложения", + "change_password_hint_app_passwords": "В вашей учетной записи есть {{number_of_app_passwords}} паролей приложений, которые не будут изменены. Чтобы управлять ими, перейдите на вкладку \"Пароли приложений\"." }, "warning": { "cannot_delete_self": "Вы не можете удалить сами себя", @@ -1183,5 +1200,8 @@ "quota_exceeded_scope": "Квота домена превышена: могут быть созданы только почтовые ящики без лимита.", "session_token": "Неверный токен формы: несоответствие токена", "session_ua": "Неверный токен формы: ошибка проверки User-Agent" + }, + "datatables": { + "infoPostFix": "datatables.infoPostFix" } } diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json new file mode 100644 index 00000000..7c3ddbfd --- /dev/null +++ b/data/web/lang/lang.si-si.json @@ -0,0 +1,396 @@ +{ + "acl": { + "app_passwds": "Upravljaj gesla aplikacij", + "bcc_maps": "Preslikave SKP (BCC)", + "delimiter_action": "Dejanje ločila", + "domain_relayhost": "Spremeni gostitelja relay za domeno", + "eas_reset": "Ponastavi EAS naprave", + "filters": "Filtri", + "login_as": "Prijavi se kot uporabnik poštnega predala", + "mailbox_relayhost": "Spremeni gostitelja relay za poštni predal", + "prohibited": "Prepovedano z ACL", + "protocol_access": "Spremeni dostop do protokola", + "pushover": "Pushover", + "quarantine": "Dejanja karantene", + "quarantine_attachments": "Priponke v karanteno", + "quarantine_notification": "Spremeni obvestila o karanteni", + "ratelimit": "Omejitev pošiljanja", + "recipient_maps": "Preslikave prejemnikov", + "smtp_ip_access": "Spremeni dovoljene gostitelje za SMTP", + "sogo_access": "Dovoli upravljanje SOGo dostopov", + "sogo_profile_reset": "Ponastavi SOGo profil", + "spam_alias": "Začasni aliasi", + "spam_policy": "Blacklist/Whitelist", + "spam_score": "Ocena neželene pošte", + "tls_policy": "Politika TLS", + "unlimited_quota": "Neomejena kvota za poštne predale", + "alias_domains": "Dodaj alias domene", + "domain_desc": "Spremeni opis domene", + "extend_sender_acl": "Dovoli razširitev pošiljateljevega ACL z zunanjimi e-poštnimi naslovi", + "quarantine_category": "Spremeni kategorijo obvestil o karanteni", + "syncjobs": "Opravila sinhronizacije" + }, + "add": { + "active": "Aktivno", + "add": "Dodaj", + "add_domain_only": "Dodaj samo domeno", + "add_domain_restart": "Dodaj domeno in ponovno zaženi SOGo", + "alias_address": "Alias naslov/i", + "alias_domain": "Alias domena", + "alias_domain_info": "Samo veljavne domene (ločene z vejico).", + "app_name": "Ime aplikacije", + "app_password": "Dodaj geslo aplikacije", + "app_passwd_protocols": "Dovoljeni protokoli za geslo aplikacije", + "automap": "Poskusi samodejno preslikati mape (\"Sent items\", \"Sent\" => \"Poslano\" ipd.)", + "backup_mx_options": "Možnosti posredovanja (relay)", + "comment_info": "Zasebni komentarji niso vidni uporabnikom, javni komentarji pa so prikazani kot tooltip, ko se z miško postavimo nad uporabnika v pregledu", + "custom_params": "Parametri po meri", + "custom_params_hint": "Pravilno: --param=xy, napačno: --param xy", + "delete1": "Izbriši na viru, ko je končano", + "delete2": "Izbriši sporočila na cilju, ki niso na viru", + "delete2duplicates": "Izbriši dvojnike na cilju", + "description": "Opis", + "destination": "Cilj", + "domain": "Domena", + "domain_matches_hostname": "Domena %s se ujema z nazivom gostitelja (hostname)", + "domain_quota_m": "Kvota za celotno domeno (MiB)", + "enc_method": "Metoda kriptiranja", + "exclude": "Izključi objekte (regex)", + "full_name": "Polno ime", + "gal": "Globalni seznam stikov (GAL)", + "generate": "generiraj", + "goto_ham": "Prepoznaj kot ham", + "goto_null": "Odstrani e-poštno sporočilo brez obvestila", + "goto_spam": "Prepoznaj kot spam", + "hostname": "Gostitelj", + "inactive": "Neaktivno", + "kind": "Tip", + "mailbox_quota_def": "Privzeta kvota za poštni predal", + "mailbox_username": "Uporabniško ime (levi del e-poštnega naslova)", + "max_aliases": "Največje število dovoljenih aliasov", + "max_mailboxes": "Največje dovoljeno število poštnih predalov", + "mins_interval": "Interval preverjanja (minute)", + "multiple_bookings": "Več rezervacij", + "nexthop": "Naslednji korak", + "password_repeat": "Potrditev gesla (ponovi)", + "port": "Vrata (port)", + "private_comment": "Zasebni komentar", + "public_comment": "Javni komentar", + "quota_mb": "Kvota (MiB)", + "relay_all": "Posreduj vse prejemnike (relay)", + "relay_all_info": "↪ Če izberete da ne posredujete vse prejemnike, morate ustvariti (\"slepi\") poštni predal za vsakega prejemnika, za katerega želite posredovati e-pošto.", + "relay_domain": "Posreduj to domeno (relay)", + "relay_unknown_only": "Posreduj samo neobstoječe poštne predale. V obstoječe poštne predale bo e-pošta dostavljena lokalno.", + "relayhost_wrapped_tls_info": "Prosim ne uporabljajte TLS-wrapped vrata (večinoma uporabljeno na vratih 465).
\nUporabite katera koli non-wrapped vrata in ustvarite STARTTLS. TLS politika za obvezno uporabo TLS se lahko ustvari pod \"Preslikave TLS politik\"", + "select": "Prosim izberite...", + "select_domain": "Prosim najprej izberite domeno", + "sieve_desc": "Kratek opis", + "sieve_type": "Vrsta filtra", + "skipcrossduplicates": "Preskoči podvojena sporočila po mapah (prvi pride, prvi melje)", + "subscribeall": "Prijavi vse mape", + "syncjob": "Dodaj opravilo sinhronizacije", + "tags": "Oznake", + "target_address": "Goto naslov", + "target_address_info": "Polni e-poštni naslov/i (ločeni z vejico).", + "target_domain": "Ciljna domena", + "timeout1": "Časovna omejitev za povezavo do oddaljenega gostitelja", + "username": "Uporabniško ime", + "validate": "Preveri", + "validation_success": "Uspešno preverjeno", + "activate_filter_warn": "Ko je aktivni izbran, bodo vsi ostali filtri deaktivirani.", + "alias_address_info": "Polni email naslov/i oziroma @example.com za zajem vseh sporočil domene (ločeno z vejico), samo domene mailcow.", + "bcc_dest_format": "BCC naslov mora biti en veljaven e-poštni naslov.
Če morate poslati kopijo na več naslov, ustvarite alias in ga uporabite tukaj.", + "disable_login": "Prepovej vpis (vhodna e-pošta je še vedno sprejeta)", + "gal_info": "GAL vsebuje vse objekte domene in ga uporabniki ne morejo urejati. Informacija o zasedenosti v SOGo ni na voljo, če je onemogočena! Ponovno zaženi SOGo za uveljavitev sprememb.", + "mailbox_quota_m": "Najvišja kvota na poštni predal (MiB)", + "password": "Geslo", + "post_domain_add": "SOGo container \"sogo-mailcow\" mora biti ponovno zagnan po dodajanju nove domene!

Dodatno se mora preveriti DNS konfiguracija domene. Ko je DNS konfiguracija domene odobrena, ponovno zaženite \"acme-mailcow\" za samodejno generiranje certifikatov za novo domeno (autoconfig.<domain>, autodiscover.<domain>).
Ta korak je opcijski in se ponovno poskuša vsakih 24 ur.", + "relay_transport_info": "
Info
Definirate lahko preslikave transportov za cilj po meri za to domeno. Če ni nastavljena, se ustvari MX poizvedba.", + "syncjob_hint": "Pozor! Gesla se morajo shraniti v plain-text!", + "timeout2": "Časovna omejitev za povezavo do lokalnega gostitelja" + }, + "admin": { + "access": "Dostop", + "action": "Dejanje", + "activate_api": "Aktiviraj API", + "activate_send": "Aktiviraj gumb \"Pošlji\"", + "active": "Aktivno", + "active_rspamd_settings_map": "Aktivna preslikava nastavitev", + "add": "Dodaj", + "add_domain_admin": "Dodaj skrbnika domene", + "add_forwarding_host": "Dodaj gostitelja za posredovanje", + "add_relayhost": "Dodaj transport odvisen od pošiljatelja", + "add_row": "Dodaj vrstico", + "add_settings_rule": "Dodaj pravilo nastavitev", + "add_transport": "Dodaj transport", + "add_transports_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v plain text.", + "additional_rows": " nove vrstice so bile dodane", + "admin_details": "Uredi podrobnosti skrbnika", + "admin_domains": "Dodeljene domene", + "admins": "Skrbniki", + "admins_ldap": "LDAP skrbniki", + "advanced_settings": "Napredne nastavitve", + "api_info": "API je v razvoju. Dokumentacija je na voljo na naslovu /api", + "api_key": "API ključ", + "api_read_only": "Dostop samo za branje", + "api_read_write": "Dostop za branje in urejanje", + "api_skip_ip_check": "Preskoči preverjanje IP za API", + "app_links": "Povezave aplikacij", + "app_name": "Ime aplikacije", + "arrival_time": "Čas prispetja (strežniški čas)", + "authed_user": "Prij. uporabnik", + "ays": "Ste prepričani, da želite nadaljevati?", + "change_logo": "Zamenjaj logotip", + "configuration": "Konfiguracija", + "convert_html_to_text": "Pretvori HTML v golo besedilo", + "credentials_transport_warning": "Opozorilo: Dodajanje nove preslikave transporta bo posodobilo poverilnice za vse vnose, ki imajo enako vrednost v stolpcu naslednji skok.", + "customer_id": "ID stranke", + "customize": "Prilagodi", + "destination": "Cilj", + "dkim_add_key": "Dodaj ARC/DKIM ključ", + "dkim_domains_selector": "Izbira", + "dkim_domains_wo_keys": "Izberi domene z manjkajočimi ključi", + "dkim_from": "Od", + "dkim_from_title": "Izvorna domena od katere prekopiram podatke", + "dkim_key_missing": "Manjka ključ", + "dkim_key_unused": "Ključ ni v rabi", + "dkim_key_valid": "Veljaven ključ", + "dkim_keys": "ARC/DKIM ključi", + "dkim_overwrite_key": "Prepiši obstoječi DKIM ključ", + "dkim_private_key": "Zasebni ključ", + "dkim_to": "Za", + "domain": "Domena", + "domain_admin": "Skrbnik domene", + "domain_admins": "Skrbniki domene", + "domain_s": "Domena/e", + "duplicate": "Podvoji", + "duplicate_dkim": "Podvoji DKIM zapis", + "edit": "Uredi", + "empty": "Ni rezultatov", + "excludes": "Izključuje te prejemnike", + "f2b_ban_time": "Čas blokade (s)", + "f2b_ban_time_increment": "Čas blokade se poveča z vsako blokado", + "f2b_blacklist": "Mreže/gostitelji na blacklisti", + "f2b_filter": "Regex filtri", + "f2b_max_attempts": "Največ poskusov", + "f2b_max_ban_time": "Maksimalno trajanje blokade (s)", + "f2b_netban_ipv4": "velikost subneta IPv4 za blokiranje (8-32)", + "f2b_netban_ipv6": "Velikost subneta IPv6 za blokiranje (8-128)", + "f2b_parameters": "Fail2ban parametri", + "f2b_regex_info": "Upoštevajo se dnevniki SOGo, Postfix, Dovecot, PHP-FPM.", + "f2b_retry_window": "Upoštevan čas (s) za največ poskusov", + "f2b_whitelist": "Mreže/gostitelji na whitelisti", + "filter_table": "Filtriraj tabelo", + "from": "Od", + "generate": "ustvari", + "guid": "GUID - enolični ID instance", + "guid_and_license": "GUID & licenca", + "hash_remove_info": "Odstranitev hasha za omejitev (če obstaja) bo povsem ponastavilo njen števec.
\n Vsak hash je prikazan z individualno barvo.", + "help_text": "Zamenjaj tekst za pomoč pod masko za prijavo (HTML je dovoljen)", + "host": "Gostitelj", + "html": "HTML", + "import": "Uvozi", + "import_private_key": "Uvozi zasebni ključ", + "in_use_by": "V uporabi", + "inactive": "Neaktivno", + "include_exclude": "Vključi/Izključi", + "include_exclude_info": "Privzeto - če ni izbire - so vključeni vsi poštni predali", + "includes": "Vključi te prejemnike", + "ip_check": "Kontrola IP", + "ip_check_disabled": "Kontrola IP je onemogočena. Lahko jo omogočite pod
Sistem > Konfiguracija > Možnosti > Prilagodi", + "ip_check_opt_in": "Opt-in za uporabo zunanje storitve ipv4.mailcow.email in ipv6.mailcow.email za razreševanje zunanjih IP.", + "is_mx_based": "Glede na MX", + "last_applied": "Nazadnje aplicirano", + "link": "Povezava", + "loading": "Prosim počakajte...", + "login_time": "Čas prijave", + "logo_info": "Vaša slika bo pomanjšana na velikost 40px za zgornjo navigacijo in največjo velikost 250px za začetno stran. Zelo priporočena je uporaba grafike brez izgube kakovosti ob spremembi velikosti.", + "message": "Sporočilo", + "message_size": "Velikost sporočila", + "nexthop": "Naslednji skok", + "no": "✕", + "no_active_bans": "Ni aktivnih blokad", + "no_new_rows": "Ni dodatnih vrstic", + "no_record": "Ni zapisa", + "oauth2_apps": "OAuth2 aplikacije", + "oauth2_add_client": "Dodaj OAuth2 klienta", + "oauth2_client_id": "ID klienta", + "oauth2_client_secret": "Skrivnost (secret)", + "oauth2_redirect_uri": "URI za preusmeritev", + "oauth2_renew_secret": "Generiraj nov client secret", + "oauth2_revoke_tokens": "Zavrni vse tokene klientov", + "optional": "opcijsko", + "options": "Možnosti", + "password": "Geslo", + "password_length": "Dolžina gesla", + "password_policy": "Politika gesel", + "password_policy_chars": "Mora vsebovati vsaj eno črko", + "password_policy_length": "Minimalna dolžina gesla je %d", + "password_policy_lowerupper": "Mora vsebovati male in velike črke", + "password_policy_numbers": "Mora vsebovati vsaj eno številko", + "password_policy_special_chars": "Mora vsebovati posebne znake", + "password_repeat": "Potrditev gesla (ponovite)", + "priority": "Prioriteta", + "private_key": "Zasebni ključ", + "quarantine": "Karantena", + "quarantine_bcc": "Pošlji kopijo vseh obvestil (BCC) temu prejemniku:
Pustite prazno za izklop te funkcije. Nepodpisana, nepreverjena pošta. Uporabljalo naj bi se samo za interno dostavo.", + "quarantine_exclude_domains": "Izključi domene in alias-domene", + "quarantine_max_age": "Maksimalna starost v dnevnih
Vrednost mora biti večja ali enaka 1 dnevu", + "quarantine_max_score": "Opusti obvestilo, če je ocena spama večja od te vrednosti:
Privzeto 9999.0", + "quarantine_max_size": "Največja velikost v MiB (Večji elementi so zavrženi):
0 ne pomeni neomejeno.", + "quarantine_notification_html": "Predloga sporočila za obvestilo:
Pustite prazno za obnovitev privzete predloge.", + "quarantine_notification_sender": "Pošiljatelj obvestila", + "quarantine_notification_subject": "Naslov obvestila", + "quarantine_release_format": "Oblika sproščenih elementov", + "quarantine_release_format_att": "Kot priponka", + "quarantine_release_format_raw": "Nespremenjen original", + "quarantine_retention_size": "Število zadržanj na poštni predal:
0 pomeni neaktivno,", + "quota_notification_sender": "Pošiljatelj obvestila", + "quota_notification_subject": "Predmet obvestila", + "quota_notifications": "Obvestila o omejitvi", + "quota_notifications_info": "Obvestila o omejitvi so poslana uporabnikom enkrat, ko presežejo 80% in enkrat ko presežejo 95% zasedenosti.", + "queue_unban": "odblokiraj", + "r_active": "Aktivne omejitve", + "r_inactive": "Neaktivne omejitve", + "rate_name": "Ime omejitve", + "recipients": "Prejemniki", + "refresh": "Osveži", + "regen_api_key": "Ponovno generiraj API ključ", + "regex_maps": "Regex preslikave", + "relay_from": "\"Od:\" naslov", + "relay_rcpt": "\"Za:\" naslov", + "relay_run": "Izvedi test", + "relayhosts": "Transporti glede na pošiljatelja", + "remove": "Odstrani", + "remove_row": "Odstrani vrstico", + "reset_default": "Ponastavi na privzeto", + "reset_limit": "Odstrani hash", + "routing": "Routing", + "rsetting_add_rule": "Dodaj pravilo", + "rsetting_content": "Vsebina pravila", + "rsetting_desc": "Kratek opis", + "rsetting_no_selection": "Prosim izberite pravilo", + "rsetting_none": "Ni pravil na voljo", + "rsettings_insert_preset": "Vstavi prednastavljen primer \"%s\"", + "rsettings_preset_1": "Onemogoči vse razen DKIM in omejitve za prijavljene uporabnike", + "rsettings_preset_2": "Postmasterji želijo spam", + "rsettings_preset_3": "Dovoli samo specifične pošiljatelje za poštni predal (npr. uporaba samo kot interni poštni predal)", + "rsettings_preset_4": "Onemogoči Rspamd za domeno", + "rspamd_com_settings": "Ime nastavitve bo samodejno generirano. Prosim oglejte si primere nastavitev spodaj. Za več informacij si oglejte dokumentacijo Rspamd", + "rspamd_global_filters": "Globalne preslikave filtrov", + "rspamd_global_filters_agree": "Previden bom!", + "rspamd_global_filters_info": "Globalne preslikave filtrov vsebujejo različne vrste globalnih blacklist in whitelist.", + "add_admin": "Dodaj skrbnika", + "add_relayhost_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v plain text.", + "admin": "Skrbnik", + "api_allow_from": "Dovoli API dostop s teh IP naslovov / CIDR mrežnih zapisov", + "apps_name": "Ime aplikacije v mailcow", + "ban_list_info": "Oglejte si seznam blokiranih IP naslovov spodaj: network (remaining ban time) - [actions].
. IPji v vrsti za odstranitev blokade bodo odstranjeni iz aktivnega seznama blokad v nekaj sekundah.
Rdeče oznake prikazujejo trajne blokade z blacklisto.", + "dkim_key_length": "Dolžina DKIM ključa (v bitih)", + "dkim_to_title": "Ciljne domene bodo prepisane", + "f2b_list_info": "Gostitelj ali omrežje na blacklisti bo vedno prevladal zapis na whitelisti. Apliciranje sprememb seznama traja nekaj sekund.", + "forwarding_hosts": "Gostitelji za posredovanje", + "forwarding_hosts_add_hint": "Lahko vpišete IPv4/IPv6 naslove, mreže v CIDR obliki, imena gostiteljev (kateri se prevedejo v IP naslove) ali imena domen (katera se prevedejo v IP naslove glede na poizvedbo po SPF zapisih, v primeru manjkajočih zapisov pa MX zapisih).", + "forwarding_hosts_hint": "Dohodna sporočila so brezpogojno sprejeta od katerih koli gostiteljev v tem seznamu. Ti gostitelji se ne bodo preverjali po DNSBL seznamih in ne bodo dodani v greyliste. Prejeti spam s teh gostiteljev ni nikoli zavrnjen, opcijsko pa se lahko premakne v mapo neželene pošte. Najpogostejša uporaba za to je navedba poštnih strežnikov, iz katerih ste nastavili pravilo za posredovanje pošte na vaš mailcow strežnik.", + "license_info": "Licenca ni zahtevana, a pomaga pri nadaljnjem razvoju.
Registrirajte svoj GUID tukaj ali Kupite podporo za svojo namestitev Mailcow.", + "lookup_mx": "Cilj je regular expression za ujemanje MX zapisov (.*\\.google\\.com za usmeritev vse pošte na MX, ki se konča z google.com, preko tega skoka)", + "main_name": "Naziv \"mailcow UI\"", + "merged_vars_hint": "Sive vrstice so združene iz vars.(local.)inc.php in jih ni mogoče spremeniti.", + "oauth2_info": "OAuth2 implementacija omogoča grant vrste \"Authorization code\" in izdaja refresh tokene.
\nStrežnik prav tako izda nove refresh tokene, ko je bil refresh token uporabljen

\n• Privzeti obseg je profile. Samo uporabniki poštnih predalov se lahko prijavijo s pomočjo OAuth2. Če parameter obsega ni vnesen, se nastavi na profile.
\n• Parameter state mora biti poslan s strani klienta kot del zahtevka za avtorizacijo .

\nPoti za OAuth2 API:
\n
    \n
  • Endpoint za avtorizacijo: /oauth/authorize
  • \n
  • Endpoint za tokene: /oauth/token
  • \n
  • Stran vira: /oauth/profile
  • \n
\nPonovno generiranje client secret ne bo razveljavilo obstoječih avtorizacijskih kod, ne bodo pa mogle obnoviti svoje tokene.

\nZavrnitev client tokenov bo povzročilo tekojčno prekinitev aktivnih sej. Vsi klienti se bodo morali ponovno prijaviti.", + "quarantine_redirect": "Preusmeri vsa obvestila k temu prejemniku:
Pustite prazno, da onemogočite. Nepodpisana, nepreverjena pošta. Uporabljalo bi se naj samo za interno dostavo.", + "quota_notification_html": "Predloga sporočila za obvestilo:
Pustite prazno za obnovitev privzete predloge.", + "quota_notifications_vars": "{{percent}} pomeni trenutna omejitev uporabnika
{{username}} je ime poštnega predala", + "r_info": "Sivi/onemogočeni elementi v seznamu aktivnih omejitev niso znane kot veljavne omejitve za mailcow in ne morejo biti premaknjene. Neznane omejitve bodo kljub temu nastavljene po vrstnem redu pojavitve.
Nove elemente lahko dodate v inc/vars.local.inc.php da jih lahko vklopite ali izklopite.", + "relayhosts_hint": "Določite transporte glede na pošiljatelja, da jih lahko izberete v konfiguraciji domene.
\nTransportni servis je vedno \"smtp:\" in bo poskušal s TLS ko bo na voljo. Wrapped TLS (SMTPS) ni podprto. Upošteva se uporabnikova politika odhodnega TLS.
\nVpliva na izbrane domene vključno z alias domenami.", + "transport_dest_format": "Regex ali sintaksa: example.org, .example.org, *, box@example.org (več vrednosti ločite z vejico)", + "transport_test_rcpt_info": "• Uporabite null@hosted.mailcow.de za testiranje relaya na drugo destinacijo.", + "rspamd_global_filters_regex": "Njihovi nazivi pojasnijo njihov namen. Vsa vsebina mora imeti veljaven regular expression v obliki \"/pattern/options\" (npr. /.+@domain\\.tld/i).
\nČeprav se v vsaki vrstici regexa izvedejo osnovni pregledi, je lahko funkcionalnost programa Rspamd motena, če sintaksa ni pravilna.
\nRspamd bo poskušal prebrati vsebino preslikave, ko bo spremenjena. Če imate težave, ponovno zaženite Rspamd, da prisilite ponovno nalaganje preslikav.
Elementi z Blackliste so izključeni iz karantene.", + "rspamd_settings_map": "Preslikava nastavitev Rspamd", + "sal_level": "Moo stopnja", + "save": "Shrani spremembe", + "search_domain_da": "Išči domene", + "send": "Pošlji", + "sender": "Pošiljatelj", + "service": "Servis", + "service_id": "ID servisa", + "source": "Vir", + "spamfilter": "Spam filter", + "subject": "Predmet", + "success": "Uspešno", + "sys_mails": "Sistemska pošta", + "text": "Besedilo", + "time": "Čas", + "title": "Naziv", + "title_name": "Naziv spletnega mesta \"mailcow UI\"", + "to_top": "Nazaj na vrh", + "transport_maps": "Preslikave transportov", + "transports_hint": "• Vpis preslikave transporta nadredi preslikavo transporta odvisno od pošiljatelja.
\n• Preferenčno se uporabljajo transporti glede na MX zapise.
\n• Izhodne TLS politike na uporabnika so ignorirane in se lahko vsilijo samo s preslikavami TLS politik.
\n• Transportni servis za definirane transporte je vedno \"smtp:\" in bo posledično poskušal TLS ko bo ponujeno. Wrapped TLS (SMTPS) ni podprto.
\n• Naslovi, ki se ujemajo z \"/localhost$/\" bodo vedno preneseni preko \"local:\", in zato destinacija \"*\" ne bo vplivala na te naslove.
\n• Za določitev poverilnic za naslednji skok (npr. \"[host]:25\"), Postfix vedno preveri \"host\" preden išče \"[host]:25\". Zaradi takšnega obnašanja je nemogoče hkrati uporabiti \"host\" in \"[host]:25\".", + "ui_footer": "Noga (HTML dovoljen)", + "ui_header_announcement": "Obvestila", + "ui_header_announcement_active": "Nastavi obvestilo kot aktivno", + "ui_header_announcement_content": "Besedilo (HTML dovoljen)", + "ui_header_announcement_help": "Obvestilo je vidno za vse prijavljene uporabnike in na vmesniku za prijavo.", + "ui_header_announcement_select": "Izberite vrsto obvestila", + "ui_header_announcement_type": "Vrsta", + "ui_header_announcement_type_danger": "Zelo pomembno", + "ui_header_announcement_type_info": "Info", + "ui_header_announcement_type_warning": "Pomembno", + "ui_texts": "Oznake in besedila UI", + "unban_pending": "unban v postopku", + "unchanged_if_empty": "Če je nespremenjeno, pustite prazno", + "upload": "Naloži", + "username": "Uporabniško ime", + "validate_license_now": "Potrdi GUID z licenčnim strežnikom", + "verify": "Preveri", + "yes": "✓" + }, + "danger": { + "alias_goto_identical": "Alias in goto naslov morata biti identična", + "aliasd_targetd_identical": "Alias domena ne sme biti enaka ciljni domeni: %s", + "bcc_exists": "BCC preslikava obstaja za vrsto %s", + "dkim_domain_or_sel_exists": "DKIM ključ za \"%s\" obstaja in ne bo prepisan.", + "domain_quota_m_in_use": "Kvota domene mora biti večja ali enaka %s MiB", + "extra_acl_invalid_domain": "Zunanji pošiljatelj \"%s\" uporablja neveljavno domeno", + "global_map_write_error": "Ni mogoče zapisati ID globalne preslikave %s: %s", + "img_tmp_missing": "Ni mogoče preveriti slikovne datoteke: začasne datoteke ni mogoče najti", + "invalid_nexthop": "Oblika naslednjega skoka ni veljavna", + "invalid_nexthop_authenticated": "Naslednji skok obstaja z drugačnimi poverilnicami. Prosim najprej posodobite obstoječe poverilnice za ta naslednji skok.", + "demo_mode_enabled": "Demo način je omogočen", + "access_denied": "Dostop zavrnjen ali pa so podatki obrazca napačni", + "alias_domain_invalid": "Alias domena %s ni veljavna", + "alias_empty": "Alias naslov ne sme biti prazen", + "alias_invalid": "Alias naslov %s ni veljaven", + "aliases_in_use": "Max. aliasov mora biti večje ali enako %d", + "app_name_empty": "Naziv aplikacije ne more biti prazno", + "app_passwd_id_invalid": "ID gesla aplikacije %s je neveljaven", + "bcc_empty": "BCC cilj ne more biti prazen", + "bcc_must_be_email": "BCC cilj %s ni veljaven e-poštni naslov", + "comment_too_long": "Komentar je predolg, dovoljeno je največ 100 znakov.", + "defquota_empty": "Privzeta kvota na poštni predal ne more biti 0", + "description_invalid": "Opis resursa za %s ni veljaven", + "dkim_domain_or_sel_invalid": "Domena ali izbirnik DKIM ni veljaven: %s", + "domain_cannot_match_hostname": "Domena se ne more ujemati z imenom gostitelja", + "domain_exists": "Domena %s že obstaja", + "domain_invalid": "Manjka ali napačno ime domene", + "domain_not_empty": "Ne morem odstraniti ne-prazno domeno %s", + "domain_not_found": "Domene %s ni bilo mogoče najti", + "extended_sender_acl_denied": "manjka ACL za določitev naslovov zunanjih pošiljateljev", + "extra_acl_invalid": "Naslov zunanjega pošiljatelja \"%s\" ni veljaven", + "fido2_verification_failed": "Preverjanje FIDO2 ni uspelo: %s", + "file_open_error": "Datoteka ne more biti odprta za urejanje", + "filter_type": "Napačna vrsta filtra", + "from_invalid": "Pošiljatelj ne sme biti prazno", + "global_filter_write_error": "Ni mogoče zapisati datoteke filtra: %s", + "global_map_invalid": "ID globalne preslikave %s ni veljaven", + "goto_empty": "Alias naslov mora vsebovati vsaj en veljaven goto naslov", + "goto_invalid": "Goto naslov %s ni veljaven", + "ham_learn_error": "Napaka pri učenju Ham: %s", + "imagick_exception": "Napaka: Imagick napaka pri branju slike", + "img_invalid": "Ni možno preveriti slikovne datoteke", + "invalid_bcc_map_type": "Neveljavna vrsta preslikave BCC", + "invalid_destination": "Ciljna oblika \"%s\" ni veljavna", + "invalid_filter_type": "Neveljavna vrsta filtra", + "invalid_host": "Naveden je neveljaven gostitelj (host): %s", + "invalid_mime_type": "Neveljaven mime type" + } +} diff --git a/data/web/lang/lang.uk-ua.json b/data/web/lang/lang.uk-ua.json index 0a5c71b8..93545aa3 100644 --- a/data/web/lang/lang.uk-ua.json +++ b/data/web/lang/lang.uk-ua.json @@ -335,7 +335,17 @@ "transport_test_rcpt_info": "• Використовуйте null@hosted.mailcow.de для перевірки пересилання на зовнішній пункт призначення.", "transports_hint": "• Глобальні правила маршрутизації переважають над маршрутами на основі відправника.
\n• Переважно використовувати транспорти на основі резолвінгу MX.
\n• Користувацькі політики TLS для вихідної пошти будуть проігноровані та використовуватимуть політику TLS, налаштовану тут.
\n• Протокол для доставки завжди \"smtp:\" і тому намагатиметься використовувати TLS, якщо наступний хост підтримує його. SMTPS (TLS, найчастіше порту 465) не підтримується.
\n• Адреси відповідні \"/localhost$/\" завжди будуть доставлені \"local:\", отже політика \"*\" не поширюється на них.
\n• Щоб визначити облікові дані для наступного вузла \"[host]:25\", Postfix завжди шукає дані для \"host\" перед тим як шукати \"[host]:25\". Така поведінка унеможливлює використання \"host\" and \"[host]:25\" одночасно.", "ui_header_announcement_help": "Оголошення видно на екрані входу в mailcow UI і всім користувачам, що ввійшли в систему.", - "unchanged_if_empty": "Якщо не змінено, залиште порожнім" + "unchanged_if_empty": "Якщо не змінено, залиште порожнім", + "allowed_methods": "Access-Control-Allow-Methods", + "f2b_max_ban_time": "Максимальний час блокування (с)", + "f2b_ban_time_increment": "Час бану збільшується з кожним баном", + "allowed_origins": "Access-Control-Allow-Origin", + "cors_settings": "Налаштування CORS", + "ip_check": "Перевірка IP", + "ip_check_disabled": "Перевірка IP вимкнена. Ви можете ввімкнути його в меню
Система > Конфігурація > Параметри > Налаштувати", + "ip_check_opt_in": "Згода на використання сторонніх служб ipv4.mailcow.email і ipv6.mailcow.email для визначення зовнішніх IP-адрес.", + "options": "Параметри", + "queue_unban": "розблокувати" }, "danger": { "alias_domain_invalid": "Неприпустимий псевдонім домену: %s", @@ -454,7 +464,17 @@ "tls_policy_map_dest_invalid": "Неприпустиме значення призначення політики", "tls_policy_map_parameter_invalid": "Неприпустиме значення параметра політики", "unlimited_quota_acl": "Необмежена квота заборонена політикою доступу", - "yotp_verification_failed": "Помилка валідації Yubico OTP: %s" + "yotp_verification_failed": "Помилка валідації Yubico OTP: %s", + "cors_invalid_method": "Вказано недійсний Allow-Method", + "webauthn_authenticator_failed": "Обраний автентифікатор не знайдено", + "webauthn_publickey_failed": "Для вибраного автентифікатора не було збережено відкритого ключа", + "webauthn_username_failed": "Обраний автентифікатор належить іншому акаунту", + "cors_invalid_origin": "Вказано недійсний Allow-Origin", + "demo_mode_enabled": "Демонстраційний режим увімкнено", + "extended_sender_acl_denied": "відсутній ACL для встановлення зовнішніх адрес відправників", + "template_exists": "Шаблон %s вже існує", + "template_id_invalid": "Ідентифікатор шаблону %s недійсний", + "template_name_invalid": "Ім'я шаблону невірне" }, "debug": { "chart_this_server": "Діаграма (цей сервер)", @@ -481,7 +501,21 @@ "username": "Ім'я користувача", "external_logs": "Зовнішні журнали", "jvm_memory_solr": "Використання оперативної пам'яті JVM", - "log_info": "

Журнали контейнерів mailcow зберігаються в Redis, і раз на хвилину рядки журналу за межами LOG_LINES (%d) видаляються, щоб зменшити навантаження на сервер.\n
Самі журнали контейнерів не зберігаються після перезавантаження контейнера. Усі контейнери додатково пишуть логи у службу Docker, і, отже, використовують драйвер логування за промовчанням. Журнали контейнерів призначені лише для налагодження дрібних проблем. Для інших завдань, будь ласка, настройте драйвер логування Docker самостійно.

\n

Зовнішні журнали збираються через API програм.

\n

Статичні журнали – це в основному журнали активності, які не записуються в Dockerd, але все одно повинні бути постійними (за винятком журналів API).

" + "log_info": "

Журнали контейнерів mailcow зберігаються в Redis, і раз на хвилину рядки журналу за межами LOG_LINES (%d) видаляються, щоб зменшити навантаження на сервер.\n
Самі журнали контейнерів не зберігаються після перезавантаження контейнера. Усі контейнери додатково пишуть логи у службу Docker, і, отже, використовують драйвер логування за промовчанням. Журнали контейнерів призначені лише для налагодження дрібних проблем. Для інших завдань, будь ласка, настройте драйвер логування Docker самостійно.

\n

Зовнішні журнали збираються через API програм.

\n

Статичні журнали – це в основному журнали активності, які не записуються в Dockerd, але все одно повинні бути постійними (за винятком журналів API).

", + "error_show_ip": "Не вдалося розпізнати публічні IP-адреси", + "no_update_available": "Система працює на останній версії", + "architecture": "Архітектура", + "container_running": "Працює", + "container_disabled": "Контейнер зупинено або вимкнено", + "container_stopped": "Зупинено", + "cores": "Ядра", + "current_time": "Системний час", + "memory": "Пам'ять", + "show_ip": "Показати загальнодоступну IP-адресу", + "timezone": "Часовий пояс", + "update_available": "Доступне оновлення", + "update_failed": "Не вдалося перевірити наявність оновлень", + "wip": "Наразі робота триває" }, "diagnostics": { "cname_from_a": "Значення, отримане із запису A/AAAA. Це підтримується, поки запис вказує на правильний ресурс.", @@ -607,7 +641,8 @@ "sender_acl_info": "Врахуйте, що якщо користувачеві поштового облікового запису А дозволено відправляти від імені користувача Б, то адреса користувача Б не з'явиться автоматично у списку \"Відправник\" при написанні листів у SOGo.
\n Користувач поштового облікового запису Б повинен створити делегування в SOGo, щоб користувач поштового облікового запису А міг вибрати його адресу як відправника. Делегування знаходиться в меню (три крапки) праворуч від імені поштового облікового запису у вікні пошти SOGo. Ця поведінка не відноситься до псевдонімів.", "sogo_visible_info": "Впливає лише на об'єкти, які можуть відображатися в SOGo (персональні або загальні псевдоніми, що вказують щонайменше на один локальний поштовий обліковий запис). Зверніть увагу, що якщо функцію вимкнено, користувач не зможе вибрати адресу псевдоніма як відправника в SOGo.", "target_address": "Власники псевдоніма, (розділені комами)", - "timeout2": "Тайм-аут для підключення до локального хоста" + "timeout2": "Тайм-аут для підключення до локального хоста", + "pushover_sound": "Звук" }, "fido2": { "confirm": "Підтвердити", @@ -648,7 +683,8 @@ "restart_netfilter": "Перезапустити netfilter", "restart_sogo": "Перезапустити SOGo", "user_settings": "Налаштування користувача", - "mailcow_config": "Конфігурація" + "mailcow_config": "Конфігурація", + "mailcow_system": "Система" }, "info": { "no_action": "Дій не передбачено", @@ -831,7 +867,13 @@ "target_address": "Власники псевдоніму", "tls_map_dest_info": "Приклади: example.org, .example.org, [mail.example.org]:25", "tls_map_parameters_info": "Залиште поле порожнім або вкажіть параметри, наприклад: protocols=!SSLv2 ciphers=medium exclude=3DES", - "tls_policy_maps_enforced_tls": "Для вихідних повідомлень від користувачів із включеною примусовою політикою шифрування вихідних з'єднань не описані глобальною політикою, будуть застосовані значення за замовчуванням, зазначені в smtp_tls_mandatory_protocols та smtp_tls_mandatory_ciphers." + "tls_policy_maps_enforced_tls": "Для вихідних повідомлень від користувачів із включеною примусовою політикою шифрування вихідних з'єднань не описані глобальною політикою, будуть застосовані значення за замовчуванням, зазначені в smtp_tls_mandatory_protocols та smtp_tls_mandatory_ciphers.", + "add_template": "Додати шаблон", + "domain_templates": "Шаблони доменів", + "relay_unknown": "Ретрансляція невідомих поштових скриньок", + "mailbox_templates": "Шаблони поштових скриньок", + "templates": "Шаблони", + "template": "Шаблон" }, "oauth2": { "authorize_app": "Авторизація додатка", @@ -896,7 +938,20 @@ "table_size_show_n": "Відображати %s полів" }, "queue": { - "queue_manager": "Черга на відправлення" + "queue_manager": "Черга на відправлення", + "delete": "Видалити все", + "info": "Поштова черга містить усі електронні листи, які очікують на доставку. Якщо електронний лист застряг у черзі на тривалий час, він автоматично видаляється системою.
Повідомлення про помилку відповідного листа містить інформацію про те, чому лист не може бути доставлено.", + "unhold_mail": "Зняти утримування", + "unhold_mail_legend": "Звільняє вибрані листи для доставки. (Потрібне попереднє утримання)", + "flush": "Очистити чергу", + "legend": "Функції дій з поштовими чергами:", + "ays": "Підтвердьте, що ви хочете видалити всі елементи з поточної черги.", + "deliver_mail": "Доставити", + "deliver_mail_legend": "проби повторної доставки вибраних листів.", + "hold_mail": "Утримати", + "hold_mail_legend": "Утримує вибрані листи. (Запобігає подальшим спробам доставки)", + "show_message": "Показати повідомлення", + "unban": "розблокувати чергу" }, "ratelimit": { "disabled": "Вимкнено", @@ -988,7 +1043,12 @@ "settings_map_added": "Правило додано", "tls_policy_map_entry_deleted": "Політику TLS ID %s видалено", "verified_totp_login": "Авторизацію TOTP пройдено", - "domain_add_dkim_available": "Ключ DKIM вже існує" + "domain_add_dkim_available": "Ключ DKIM вже існує", + "template_added": "Додано шаблон %s", + "template_modified": "Зміни до шаблону %s збережено", + "cors_headers_edited": "Налаштування CORS збережено", + "ip_check_opt_in_modified": "Перевірка IP-адреси успішно збережено", + "template_removed": "Шаблону із ID %s видалено" }, "tfa": { "confirm": "Підтвердьте", @@ -1176,7 +1236,8 @@ "tag_help_explain": "Перемістити до підпапки: буде створено нову підпапку в INBOX з ім'ям тега, наприклад: \"INBOX/Facebook\".
\n Додати до теми листа: ім'я тега буде додано до теми листа, наприклад: \"[Facebook] My News\".", "tls_policy_warning": "Попередження: якщо ви увімкнете примусове шифрування пошти, ви можете зіткнутися з втратою листів.
Повідомлення, які не відповідають політиці, будуть відкидатися з повідомленням поштовим сервером про серйозний збій.
Цей параметр застосовується до вашої основної адреси електронної пошти (логіну), усім особистим псевдонімам та псевдонімам доменів. Маються на увазі лише псевдоніми з однією поштовою скринькою, як одержувач.", "year": "рік", - "years": "років" + "years": "років", + "pushover_sound": "Звук" }, "warning": { "domain_added_sogo_failed": "Домен був доданий, але перезавантажити SOGo не вдалося, будь ласка, перевірте журнали сервера.", @@ -1190,5 +1251,31 @@ "hash_not_found": "Хеш не знайдено або вже видалено", "ip_invalid": "Пропущено недійсний IP: %s", "is_not_primary_alias": "Пропущено неосновний псевдонім %s" + }, + "datatables": { + "decimal": ".", + "infoPostFix": "datatables.infoPostFix", + "zeroRecords": "Відповідних записів не знайдено", + "aria": { + "sortAscending": ": активувати для сортування стовпців за зростанням", + "sortDescending": ": активувати для сортування стовпців за спаданням" + }, + "emptyTable": "У таблиці немає даних", + "expand_all": "Розгорнути всі", + "info": "Показано від _START_ до _END_ of _TOTAL_ записів", + "infoEmpty": "Показано від 0 до 0 із 0 записів", + "infoFiltered": "(відфільтровано з _MAX_ всіх записів)", + "thousands": ",", + "lengthMenu": "Показати записи _MENU_", + "loadingRecords": "Завантаження...", + "processing": "Будь ласка, зачекайте...", + "search": "Пошук:", + "paginate": { + "first": "Перший", + "last": "Останній", + "next": "Наступний", + "previous": "Попередній" + }, + "collapse_all": "Згорнути все" } } From 1a207f4d880c8e0669f6148ef038fe24c84950e5 Mon Sep 17 00:00:00 2001 From: Kristian Feldsam Date: Sun, 3 Sep 2023 00:18:11 +0200 Subject: [PATCH 07/11] [Web] translated datatables to CZ and SK Signed-off-by: Kristian Feldsam --- data/web/lang/lang.cs-cz.json | 23 +++++++++++++++++++++++ data/web/lang/lang.sk-sk.json | 24 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/data/web/lang/lang.cs-cz.json b/data/web/lang/lang.cs-cz.json index d4f62495..b709de5e 100644 --- a/data/web/lang/lang.cs-cz.json +++ b/data/web/lang/lang.cs-cz.json @@ -459,6 +459,29 @@ "value_missing": "Prosím, uveďte všechny hodnoty", "yotp_verification_failed": "Yubico OTP ověření selhalo: %s" }, + "datatables": { + "emptyTable": "Tabulka neobsahuje žádná data", + "info": "Zobrazuji _START_ až _END_ z celkem _TOTAL_ záznamů", + "infoEmpty": "Zobrazuji 0 až 0 z 0 záznamů", + "infoFiltered": "(filtrováno z celkem _MAX_ záznamů)", + "loadingRecords": "Načítám...", + "zeroRecords": "Žádné záznamy nebyly nalezeny", + "paginate": { + "first": "První", + "last": "Poslední", + "next": "Další", + "previous": "Předchozí" + }, + "aria": { + "sortAscending": ": aktivujte pro seřazení vzestupně", + "sortDescending": ": aktivujte pro seřazení sestupně" + }, + "lengthMenu": "Zobrazit _MENU_ výsledků", + "processing": "Zpracovávání...", + "search": "Vyhledávání:", + "decimal": ",", + "thousands": " " + }, "debug": { "chart_this_server": "Graf (tento server)", "containers_info": "Informace o kontejnerech", diff --git a/data/web/lang/lang.sk-sk.json b/data/web/lang/lang.sk-sk.json index 29b36c44..276d7b9e 100644 --- a/data/web/lang/lang.sk-sk.json +++ b/data/web/lang/lang.sk-sk.json @@ -456,6 +456,30 @@ "value_missing": "Prosím poskytnite všetky hodnoty", "yotp_verification_failed": "Overenie cez OTP Yubico zlyhalo: %s" }, + "datatables": { + "info": "Záznamy _START_ až _END_ z celkom _TOTAL_", + "infoEmpty": "Záznamy 0 až 0 z celkom 0 ", + "infoFiltered": "(vyfiltrované spomedzi _MAX_ záznamov)", + "infoThousands": " ", + "lengthMenu": "Zobraz _MENU_ záznamov", + "loadingRecords": "Načítavam...", + "processing": "Spracúvam...", + "search": "Hľadať:", + "zeroRecords": "Nenašli sa žiadne vyhovujúce záznamy", + "paginate": { + "first": "Prvá", + "last": "Posledná", + "next": "Nasledujúca", + "previous": "Predchádzajúca" + }, + "aria": { + "sortAscending": ": aktivujte na zoradenie stĺpca vzostupne", + "sortDescending": ": aktivujte na zoradenie stĺpca zostupne" + }, + "emptyTable": "Nie sú k dispozícii žiadne dáta.", + "decimal": ",", + "thousands": " " + }, "debug": { "chart_this_server": "Graf (tento server)", "containers_info": "Informácie o kontajneroch", From 3540075b61606a11c9f2801283ab7280640410dc Mon Sep 17 00:00:00 2001 From: Kristian Feldsam Date: Sun, 3 Sep 2023 18:49:12 +0200 Subject: [PATCH 08/11] [Web] dark mode logo support Signed-off-by: Kristian Feldsam --- data/web/admin.php | 1 + data/web/inc/functions.customize.inc.php | 22 +++++++++---- data/web/inc/header.inc.php | 1 + data/web/inc/triggers.inc.php | 4 +++ data/web/js/build/013-mailcow.js | 9 ++++++ data/web/lang/lang.en-gb.json | 2 ++ data/web/templates/admin/customize/logo.twig | 9 ++++++ .../templates/admin/tab-config-customize.twig | 32 +++++++++++-------- data/web/templates/base.twig | 5 ++- data/web/templates/debug.twig | 3 +- data/web/templates/index.twig | 5 ++- 11 files changed, 69 insertions(+), 24 deletions(-) create mode 100644 data/web/templates/admin/customize/logo.twig diff --git a/data/web/admin.php b/data/web/admin.php index 14cb89f5..ebddb7b9 100644 --- a/data/web/admin.php +++ b/data/web/admin.php @@ -108,6 +108,7 @@ $template_data = [ 'rsettings' => $rsettings, 'rspamd_regex_maps' => $rspamd_regex_maps, 'logo_specs' => customize('get', 'main_logo_specs'), + 'logo_dark_specs' => customize('get', 'main_logo_dark_specs'), 'ip_check' => customize('get', 'ip_check'), 'password_complexity' => password_complexity('get'), 'show_rspamd_global_filters' => @$_SESSION['show_rspamd_global_filters'], diff --git a/data/web/inc/functions.customize.inc.php b/data/web/inc/functions.customize.inc.php index 6025d97d..0da8c356 100644 --- a/data/web/inc/functions.customize.inc.php +++ b/data/web/inc/functions.customize.inc.php @@ -24,9 +24,10 @@ function customize($_action, $_item, $_data = null) { } switch ($_item) { case 'main_logo': - if (in_array($_data['main_logo']['type'], array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/x-png', 'image/png', 'image/svg+xml'))) { + case 'main_logo_dark': + if (in_array($_data[$_item]['type'], array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/x-png', 'image/png', 'image/svg+xml'))) { try { - if (file_exists($_data['main_logo']['tmp_name']) !== true) { + if (file_exists($_data[$_item]['tmp_name']) !== true) { $_SESSION['return'][] = array( 'type' => 'danger', 'log' => array(__FUNCTION__, $_action, $_item, $_data), @@ -34,7 +35,7 @@ function customize($_action, $_item, $_data = null) { ); return false; } - $image = new Imagick($_data['main_logo']['tmp_name']); + $image = new Imagick($_data[$_item]['tmp_name']); if ($image->valid() !== true) { $_SESSION['return'][] = array( 'type' => 'danger', @@ -63,7 +64,7 @@ function customize($_action, $_item, $_data = null) { return false; } try { - $redis->Set('MAIN_LOGO', 'data:' . $_data['main_logo']['type'] . ';base64,' . base64_encode(file_get_contents($_data['main_logo']['tmp_name']))); + $redis->Set(strtoupper($_item), 'data:' . $_data[$_item]['type'] . ';base64,' . base64_encode(file_get_contents($_data[$_item]['tmp_name']))); } catch (RedisException $e) { $_SESSION['return'][] = array( @@ -201,8 +202,9 @@ function customize($_action, $_item, $_data = null) { } switch ($_item) { case 'main_logo': + case 'main_logo_dark': try { - if ($redis->del('MAIN_LOGO')) { + if ($redis->del(strtoupper($_item))) { $_SESSION['return'][] = array( 'type' => 'success', 'log' => array(__FUNCTION__, $_action, $_item, $_data), @@ -239,8 +241,9 @@ function customize($_action, $_item, $_data = null) { return ($app_links) ? $app_links : false; break; case 'main_logo': + case 'main_logo_dark': try { - return $redis->get('MAIN_LOGO'); + return $redis->get(strtoupper($_item)); } catch (RedisException $e) { $_SESSION['return'][] = array( @@ -277,9 +280,14 @@ function customize($_action, $_item, $_data = null) { } break; case 'main_logo_specs': + case 'main_logo_dark_specs': try { $image = new Imagick(); - $img_data = explode('base64,', customize('get', 'main_logo')); + if($_item == 'main_logo_specs') { + $img_data = explode('base64,', customize('get', 'main_logo')); + } else { + $img_data = explode('base64,', customize('get', 'main_logo_dark')); + } if ($img_data[1]) { $image->readImageBlob(base64_decode($img_data[1])); return $image->identifyImage(); diff --git a/data/web/inc/header.inc.php b/data/web/inc/header.inc.php index f62819a2..9afc288d 100644 --- a/data/web/inc/header.inc.php +++ b/data/web/inc/header.inc.php @@ -40,6 +40,7 @@ $globalVariables = [ 'ui_texts' => $UI_TEXTS, 'css_path' => '/cache/'.basename($CSSPath), 'logo' => customize('get', 'main_logo'), + 'logo_dark' => customize('get', 'main_logo_dark'), 'available_languages' => $AVAILABLE_LANGUAGES, 'lang' => $lang, 'skip_sogo' => (getenv('SKIP_SOGO') == 'y'), diff --git a/data/web/inc/triggers.inc.php b/data/web/inc/triggers.inc.php index c40453a2..6922429b 100644 --- a/data/web/inc/triggers.inc.php +++ b/data/web/inc/triggers.inc.php @@ -120,10 +120,14 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admi if (isset($_POST["submit_main_logo"])) { if ($_FILES['main_logo']['error'] == 0) { customize('add', 'main_logo', $_FILES); + } + if ($_FILES['main_logo_dark']['error'] == 0) { + customize('add', 'main_logo_dark', $_FILES); } } if (isset($_POST["reset_main_logo"])) { customize('delete', 'main_logo'); + customize('delete', 'main_logo_dark'); } // Some actions will not be available via API if (isset($_POST["license_validate_now"])) { diff --git a/data/web/js/build/013-mailcow.js b/data/web/js/build/013-mailcow.js index e659915b..4907623c 100644 --- a/data/web/js/build/013-mailcow.js +++ b/data/web/js/build/013-mailcow.js @@ -314,19 +314,28 @@ $(document).ready(function() { $('#dark-mode-toggle').click(toggleDarkMode); if ($('#dark-mode-theme').length) { $('#dark-mode-toggle').prop('checked', true); + $('.main-logo').addClass('d-none'); + $('.main-logo-dark').removeClass('d-none'); if ($('#rspamd_logo').length) $('#rspamd_logo').attr('src', '/img/rspamd_logo_light.png'); if ($('#rspamd_logo_sm').length) $('#rspamd_logo_sm').attr('src', '/img/rspamd_logo_light.png'); + } else { + $('.main-logo').removeClass('d-none'); + $('.main-logo-dark').addClass('d-none'); } function toggleDarkMode(){ if($('#dark-mode-theme').length){ $('#dark-mode-theme').remove(); $('#dark-mode-toggle').prop('checked', false); + $('.main-logo').removeClass('d-none'); + $('.main-logo-dark').addClass('d-none'); if ($('#rspamd_logo').length) $('#rspamd_logo').attr('src', '/img/rspamd_logo_dark.png'); if ($('#rspamd_logo_sm').length) $('#rspamd_logo_sm').attr('src', '/img/rspamd_logo_dark.png'); localStorage.setItem('theme', 'light'); }else{ $('head').append(''); $('#dark-mode-toggle').prop('checked', true); + $('.main-logo').addClass('d-none'); + $('.main-logo-dark').removeClass('d-none'); if ($('#rspamd_logo').length) $('#rspamd_logo').attr('src', '/img/rspamd_logo_light.png'); if ($('#rspamd_logo_sm').length) $('#rspamd_logo_sm').attr('src', '/img/rspamd_logo_light.png'); localStorage.setItem('theme', 'dark'); diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index a4d06da3..344fae6c 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -149,6 +149,8 @@ "ays": "Are you sure you want to proceed?", "ban_list_info": "See a list of banned IPs below: network (remaining ban time) - [actions].
IPs queued to be unbanned will be removed from the active ban list within a few seconds.
Red labels indicate active permanent bans by blacklisting.", "change_logo": "Change logo", + "logo_normal_label": "Normal", + "logo_dark_label": "Inverted for dark mode", "configuration": "Configuration", "convert_html_to_text": "Convert HTML to plain text", "cors_settings": "CORS Settings", diff --git a/data/web/templates/admin/customize/logo.twig b/data/web/templates/admin/customize/logo.twig new file mode 100644 index 00000000..45f6c91e --- /dev/null +++ b/data/web/templates/admin/customize/logo.twig @@ -0,0 +1,9 @@ +
+ mailcow logo +
+ {{ logo_specs.geometry.width }}x{{ logo_specs.geometry.height }} px + {{ logo_specs.mimetype }} + {{ logo_specs.fileSize }} +
+
+ diff --git a/data/web/templates/admin/tab-config-customize.twig b/data/web/templates/admin/tab-config-customize.twig index e458eeb3..a616375c 100644 --- a/data/web/templates/admin/tab-config-customize.twig +++ b/data/web/templates/admin/tab-config-customize.twig @@ -10,22 +10,26 @@ {{ lang.admin.change_logo }}

{{ lang.admin.logo_info }}

-

-
- -

+
+ + +
+
+ + +
+ +
- {% if logo %} -
+ {% if logo or logo_dark %} +
-
- mailcow logo -
- {{ logo_specs.geometry.width }}x{{ logo_specs.geometry.height }} px - {{ logo_specs.mimetype }} - {{ logo_specs.fileSize }} -
-
+ {% if logo %} + {% include 'admin/customize/logo.twig' %} + {% endif %} + {% if logo_dark %} + {% include 'admin/customize/logo.twig' with {'logo': logo_dark, 'logo_specs': logo_dark_specs, 'dark': 1} %} + {% endif %}

diff --git a/data/web/templates/base.twig b/data/web/templates/base.twig index 06c47bd2..0b1c60a2 100644 --- a/data/web/templates/base.twig +++ b/data/web/templates/base.twig @@ -31,7 +31,10 @@ {% block navbar %}