diff --git a/.ci/functional-tests.yml b/.ci/functional-tests.yml index 1655fd651..2e839574a 100644 --- a/.ci/functional-tests.yml +++ b/.ci/functional-tests.yml @@ -11,8 +11,12 @@ - export AWS_DEFAULT_REGION=us-east-1 - | aws lambda invoke --function-name launch_app_server --payload '{"launch_template_name": "'"$LAUNCH_TEMPLATE_NAME"'", "instance_name": "'"$INSTANCE_NAME"'", "ci_project_id": "'"$CI_PROJECT_ID"'", "build_job_id": "'"$BUILD_JOB_ID"'"}' response.json - - echo "APP_SERVER_IP=$(jq -r '.app_server_ip' response.json)" >> app-servers.env - - echo "INSTANCE_ID=$(jq -r '.instance_id' response.json)" >> app-servers.env + - echo "APP_SERVER_IP_1=$(jq -r '.app_server_ip' response.json)" >> app-servers.env + - echo "INSTANCE_ID_1=$(jq -r '.instance_id' response.json)" >> app-servers.env + - | + aws lambda invoke --function-name launch_app_server --payload '{"launch_template_name": "'"$LAUNCH_TEMPLATE_NAME"'", "instance_name": "'"$INSTANCE_NAME"'", "ci_project_id": "'"$CI_PROJECT_ID"'", "build_job_id": "'"$BUILD_JOB_ID"'"}' response.json + - echo "APP_SERVER_IP_2=$(jq -r '.app_server_ip' response.json)" >> app-servers.env + - echo "INSTANCE_ID_2=$(jq -r '.instance_id' response.json)" >> app-servers.env tags: - functional-tests artifacts: @@ -22,7 +26,7 @@ .run-functional-tests: stage: functional-tests timeout: 3h - # Need to find a way of running the cleanup step even on failure + # Need to find another way of running the cleanup step even on failure allow_failure: true when: delayed # Wait for the app-server to come up. Saves time for the CI runners. @@ -35,10 +39,11 @@ script: - cp -r . /home/tester/freedombox && chown -R tester:tester /home/tester/freedombox - | - sudo FREEDOMBOX_URL="https://$APP_SERVER_IP" -u tester bash -c \ - 'cd /home/tester/freedombox && py.test-3 -v --durations=10 --include-functional --splinter-headless --template=html1/index.html --report=functional-tests.html' + sudo APP_SERVER_URL_1="https://$APP_SERVER_IP_1" APP_SERVER_URL_2="https://$APP_SERVER_IP_2" -u tester bash -c \ + 'cd /home/tester/freedombox && py.test-3 -v --durations=10 --include-functional --splinter-headless -n 2 --dist=loadscope --template=html1/index.html --report=functional-tests.html' after_script: - - echo "INSTANCE_ID=$INSTANCE_ID" >> app-servers.env + - echo "INSTANCE_ID_1=$INSTANCE_ID_1" >> app-servers.env + - echo "INSTANCE_ID_2=$INSTANCE_ID_2" >> app-servers.env - cp /home/tester/freedombox/functional-tests.html . - cp -r /home/tester/freedombox/screenshots/ . artifacts: @@ -55,6 +60,7 @@ script: - export AWS_DEFAULT_REGION=us-east-1 - | - aws lambda invoke --function-name terminate_app_server --payload '{"instance_id": "'"$INSTANCE_ID"'"}' response.json + aws lambda invoke --function-name terminate_app_server --payload '{"instance_id": "'"$INSTANCE_ID_1"'"}' response.json + aws lambda invoke --function-name terminate_app_server --payload '{"instance_id": "'"$INSTANCE_ID_2"'"}' response.json tags: - functional-tests diff --git a/debian/changelog b/debian/changelog index 1b4614aa7..89e30d0e8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,42 @@ +freedombox (23.20) unstable; urgency=medium + + [ gallegonovato ] + * Translated using Weblate (Spanish) + + [ Burak Yavuz ] + * Translated using Weblate (Turkish) + * Translated using Weblate (Turkish) + + [ Ettore Atalan ] + * Translated using Weblate (German) + + [ James Valleroy ] + * app: Update diagnose() docstring + * diagnostics: Add shortcut to re-run setup for app + * locale: Update translation strings + * doc: Fetch latest manual + + [ Sunil Mohan Adapa ] + * datetime: Fix diagnostic test for checking NTP server sync + * apache: tests: Update to use DiagnosticCheck class + * backups: Don't leave services stopped if backup fails + * operation: Fix issue with re-running setup when it fails first time + * coturn: Fix incorrectly passing transport argument to STUN URIs + * matrixsynapse: Update old STUN URIs to remove 'transport' parameter + * ejabberd: Update old STUN URIs to remove 'transport' parameter + * email: Increase the size of the message to 100MiB + + [ Ihor Hordiichuk ] + * Translated using Weblate (Ukrainian) + + [ Besnik Bleta ] + * Translated using Weblate (Albanian) + + [ Joseph Nuthalapati ] + * tests: functional: Run tests on two app servers + + -- James Valleroy Mon, 06 Nov 2023 21:03:50 -0500 + freedombox (23.19~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. diff --git a/doc/dev/reference/components/index.rst b/doc/dev/reference/components/index.rst index 52c2e8d42..ad3fd9d97 100644 --- a/doc/dev/reference/components/index.rst +++ b/doc/dev/reference/components/index.rst @@ -33,3 +33,12 @@ Base Classes .. autoclass:: plinth.app.FollowerComponent :members: + +Other Classes +^^^^^^^^^^^^^ + +.. autoclass:: plinth.modules.diagnostics.check.DiagnosticCheck + :members: + +.. autoclass:: plinth.modules.diagnostics.check.Result + :members: diff --git a/doc/manual/en/OrangePiZero.raw.wiki b/doc/manual/en/OrangePiZero.raw.wiki index b5102cf42..e3e8dbe8d 100644 --- a/doc/manual/en/OrangePiZero.raw.wiki +++ b/doc/manual/en/OrangePiZero.raw.wiki @@ -2,7 +2,7 @@ {{attachment:orange-pi-zero.jpg|Orange Pi Zero|width=649,height=537}} -[[http://www.orangepi.org/orangepizero/|Orange Pi Zero]] is a single board computer available at very low price. It uses the Allwinner H2 SoC, and has 256MB/512MB DDR3 SDRAM. It doesn't require any non-free firmware to run !FreedomBox. However, the onboard Wi-Fi module needs proprietary firmware to work. The board is available in two versions: with 256MB RAM and 512MB RAM. The version with 512 MB RAM is recommended for !FreedomBox. Even then, !FreedomBox is expected to gracefully run only a small number of services. +[[http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero.html|Orange Pi Zero]] is a single board computer available at very low price. It uses the Allwinner H2 SoC, and has 256MB/512MB DDR3 SDRAM. It doesn't require any non-free firmware to run !FreedomBox. However, the onboard Wi-Fi module needs proprietary firmware to work. The board is available in two versions: with 256MB RAM and 512MB RAM. The version with 512 MB RAM is recommended for !FreedomBox. Even then, !FreedomBox is expected to gracefully run only a small number of services. '''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this single board computer. diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 6f400148c..1e70e8f2e 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,26 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 23.20 (2023-11-06) == + +=== Highlights === + + * backups: Don't leave services stopped if backup fails + * coturn: Fix incorrectly passing transport argument to STUN URIs + +=== Other Changes === + + * apache: tests: Update to use !DiagnosticCheck class + * app: Update diagnose() docstring + * datetime: Fix diagnostic test for checking NTP server sync + * diagnostics: Add shortcut to re-run setup for app + * ejabberd: Update old STUN URIs to remove 'transport' parameter + * email: Increase the size of the message to 100MiB + * locale: Update translations for Albanian, German, Spanish, Turkish, Ukrainian + * matrixsynapse: Update old STUN URIs to remove 'transport' parameter + * operation: Fix issue with re-running setup when it fails first time + * tests: functional: Run tests on two app servers + == FreedomBox 23.19 (2023-10-23) == === Highlights === diff --git a/doc/manual/es/OrangePiZero.raw.wiki b/doc/manual/es/OrangePiZero.raw.wiki index b5102cf42..e3e8dbe8d 100644 --- a/doc/manual/es/OrangePiZero.raw.wiki +++ b/doc/manual/es/OrangePiZero.raw.wiki @@ -2,7 +2,7 @@ {{attachment:orange-pi-zero.jpg|Orange Pi Zero|width=649,height=537}} -[[http://www.orangepi.org/orangepizero/|Orange Pi Zero]] is a single board computer available at very low price. It uses the Allwinner H2 SoC, and has 256MB/512MB DDR3 SDRAM. It doesn't require any non-free firmware to run !FreedomBox. However, the onboard Wi-Fi module needs proprietary firmware to work. The board is available in two versions: with 256MB RAM and 512MB RAM. The version with 512 MB RAM is recommended for !FreedomBox. Even then, !FreedomBox is expected to gracefully run only a small number of services. +[[http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero.html|Orange Pi Zero]] is a single board computer available at very low price. It uses the Allwinner H2 SoC, and has 256MB/512MB DDR3 SDRAM. It doesn't require any non-free firmware to run !FreedomBox. However, the onboard Wi-Fi module needs proprietary firmware to work. The board is available in two versions: with 256MB RAM and 512MB RAM. The version with 512 MB RAM is recommended for !FreedomBox. Even then, !FreedomBox is expected to gracefully run only a small number of services. '''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this single board computer. diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index 6f400148c..1e70e8f2e 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,26 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 23.20 (2023-11-06) == + +=== Highlights === + + * backups: Don't leave services stopped if backup fails + * coturn: Fix incorrectly passing transport argument to STUN URIs + +=== Other Changes === + + * apache: tests: Update to use !DiagnosticCheck class + * app: Update diagnose() docstring + * datetime: Fix diagnostic test for checking NTP server sync + * diagnostics: Add shortcut to re-run setup for app + * ejabberd: Update old STUN URIs to remove 'transport' parameter + * email: Increase the size of the message to 100MiB + * locale: Update translations for Albanian, German, Spanish, Turkish, Ukrainian + * matrixsynapse: Update old STUN URIs to remove 'transport' parameter + * operation: Fix issue with re-running setup when it fails first time + * tests: functional: Run tests on two app servers + == FreedomBox 23.19 (2023-10-23) == === Highlights === diff --git a/plinth/__init__.py b/plinth/__init__.py index eb212d68e..87f304897 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '23.19' +__version__ = '23.20' diff --git a/plinth/app.py b/plinth/app.py index fef709259..17927270f 100644 --- a/plinth/app.py +++ b/plinth/app.py @@ -211,10 +211,11 @@ class App: def diagnose(self): """Run diagnostics and return results. - Return value must be a list of results. Each result is a two-tuple with - first value as user visible description of the test followed by the + Return value must be a list of results. Each result is a + :class:`~plinth.modules.diagnostics.check.DiagnosticCheck` with a + unique check_id, a user visible description of the test, and the result. The test result is a string enumeration from 'failed', - 'passed', 'error' and 'warning'. + 'passed', 'error', 'warning' and 'not_done'. Results are typically collected by diagnosing each component of the app and then supplementing the results with any app level diagnostic tests. @@ -303,10 +304,11 @@ class Component: def diagnose(): """Run diagnostics and return results. - Return value must be a list of results. Each result is a two-tuple with - first value as user visible description of the test followed by the - result. The test result is a string enumeration from 'failed', 'passed' - and 'error'. + Return value must be a list of results. Each result is a + :class:`~plinth.modules.diagnostics.check.DiagnosticCheck` with a + unique check_id, a user visible description of the test, and the + result. The test result is a string enumeration from 'failed', + 'passed', 'error', 'warning' and 'not_done'. Also see :meth:`.has_diagnostics`. diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index 9a1ea48ad..f5d551552 100644 --- a/plinth/locale/ar/LC_MESSAGES/django.po +++ b/plinth/locale/ar/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2023-10-19 06:18+0000\n" "Last-Translator: Shaik \n" "Language-Team: Arabic \n" "Language-Team: Arabic (Saudi Arabia) \n" "Language-Team: Bulgarian \n" "Language-Team: Bengali \n" "Language-Team: Czech \n" "Language-Team: Danish \n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" +"PO-Revision-Date: 2023-10-30 10:00+0000\n" +"Last-Translator: Ettore Atalan \n" "Language-Team: German \n" "Language: de\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -84,12 +84,12 @@ msgstr "" "Warnung! Die Anwendung könnte fehlerhaft laufen, falls der Domainname " "nachträglich geändert wird." -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "TLS Domain" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1418,7 +1418,7 @@ msgstr "Coturn" msgid "VoIP Helper" msgstr "VoIP-Helfer" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "Ungültige Liste von STUN/TURN-Server-URIs" @@ -1432,7 +1432,7 @@ msgstr "" msgid "Use the following shared authentication secret:" msgstr "Verwenden Sie das folgende geteilte Authentifizierungsgeheimnis:" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." @@ -1440,11 +1440,11 @@ msgstr "" "Der Netzwerk-Zeitserver hält Ihre Systemzeit synchron mit Servern im " "Internet." -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "Datum und Uhrzeit" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "Zeit synchronisiert mit NTP-Server" @@ -1516,7 +1516,7 @@ msgstr "" "um zu überprüfen, ob alle Anwendungen und Dienste funktionieren." #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "Diagnose" @@ -1539,27 +1539,27 @@ msgstr "Warnung" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "MiB" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "GiB" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" "Sie sollten einige Anwendungen deaktivieren, um den Speicherverbrauch zu " "reduzieren." -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "Sie sollten auf diesem System keine neuen Anwendungen installieren." -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " @@ -1568,32 +1568,28 @@ msgstr "" "Das System hat wenig Speicherplatz: {percent_used}% verwendet, " "{memory_available}·{memory_available_unit}frei. {advice_message}" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "Wenig Speicher" -#: plinth/modules/diagnostics/__init__.py:248 +#: plinth/modules/diagnostics/__init__.py:254 #, fuzzy #| msgid "Run Diagnostics" msgid "Running diagnostics" -msgstr "Diagnose starten" +msgstr "Laufende Diagnose" -#: plinth/modules/diagnostics/__init__.py:289 +#: plinth/modules/diagnostics/__init__.py:295 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: plinth/modules/diagnostics/__init__.py:290 -#, fuzzy -#| msgid "Diagnostic Results" +#: plinth/modules/diagnostics/__init__.py:296 msgid "Diagnostics results" msgstr "Diagnose-Ergebnisse" -#: plinth/modules/diagnostics/__init__.py:295 -#, fuzzy -#| msgid "Diagnostic Results" +#: plinth/modules/diagnostics/__init__.py:301 msgid "Go to diagnostics results" -msgstr "Diagnose-Ergebnisse" +msgstr "Zu Diagnose-Ergebnisse gehen" #: plinth/modules/diagnostics/templates/diagnostics.html:16 #: plinth/modules/diagnostics/templates/diagnostics_button.html:11 @@ -1601,29 +1597,31 @@ msgid "Run Diagnostics" msgstr "Diagnose starten" #: plinth/modules/diagnostics/templates/diagnostics.html:21 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Ergebnis" +msgstr "Ergebnisse ansehen" #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" msgstr "Diagnose-Ergebnisse" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "App: %(app_name)s" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "Einrichtung erneut ausführen" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "Diese App unterstützt keine Diagnose" #: plinth/modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Diagnose starten" +msgstr "Diagnose erneut ausführen" #: plinth/modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" @@ -1633,12 +1631,16 @@ msgstr "Diagnose läuft" msgid "Results" msgstr "Ergebnis" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 -#, python-format +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 +#, fuzzy, python-format +#| msgid "" +#| "\n" +#| " App: %(app_name)s\n" +#| " " msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" "\n" " App: %(app_name)s\n" @@ -1653,7 +1655,7 @@ msgstr "Testen" msgid "Result" msgstr "Ergebnis" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "Diagnose" @@ -9101,10 +9103,6 @@ msgstr "Aktualisieren" msgid "Backup" msgstr "Sicherungskopie" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "Einrichtung erneut ausführen" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 5d9439f0a..9a9c7b12f 100644 --- a/plinth/locale/django.pot +++ b/plinth/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -77,12 +77,12 @@ msgid "" "later." msgstr "" -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1258,7 +1258,7 @@ msgstr "" msgid "VoIP Helper" msgstr "" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "" @@ -1270,17 +1270,17 @@ msgstr "" msgid "Use the following shared authentication secret:" msgstr "" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." msgstr "" -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "" @@ -1346,7 +1346,7 @@ msgid "" msgstr "" #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "" @@ -1369,49 +1369,49 @@ msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "" -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "" -#: plinth/modules/diagnostics/__init__.py:248 +#: plinth/modules/diagnostics/__init__.py:254 msgid "Running diagnostics" msgstr "" -#: plinth/modules/diagnostics/__init__.py:289 +#: plinth/modules/diagnostics/__init__.py:295 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: plinth/modules/diagnostics/__init__.py:290 +#: plinth/modules/diagnostics/__init__.py:296 msgid "Diagnostics results" msgstr "" -#: plinth/modules/diagnostics/__init__.py:295 +#: plinth/modules/diagnostics/__init__.py:301 msgid "Go to diagnostics results" msgstr "" @@ -1428,12 +1428,18 @@ msgstr "" msgid "Diagnostic Results" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "" @@ -1449,12 +1455,12 @@ msgstr "" msgid "Results" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 #, python-format msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" #: plinth/modules/diagnostics/templates/diagnostics_results.html:11 @@ -1466,7 +1472,7 @@ msgstr "" msgid "Result" msgstr "" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "" @@ -7787,10 +7793,6 @@ msgstr "" msgid "Backup" msgstr "" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 7f661bb98..dec774b6f 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Greek \n" "Language-Team: Spanish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.1.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -83,12 +83,12 @@ msgstr "" "¡Atención! Puede que la aplicación no funcione correctamente si cambia el " "nombre de dominio más adelante." -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "Dominio TLS" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1408,7 +1408,7 @@ msgstr "Coturn" msgid "VoIP Helper" msgstr "Asistente VoIP" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "Lista de URIS del servidor Stun/Turn no válida" @@ -1420,7 +1420,7 @@ msgstr "Use las siguientes URL para configurar su servidor de comunicación:" msgid "Use the following shared authentication secret:" msgstr "Use la clave compartida siguiente:" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." @@ -1428,11 +1428,11 @@ msgstr "" "El servidor de tiempo de red (servicio NTP) mantiene sincronizada la hora " "del sistema con servidores de Internet." -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "Fecha y hora" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "Hora sincronizada con el servidor NTP" @@ -1504,7 +1504,7 @@ msgstr "" "confirmar que las aplicaciones y servicios están funcionando como se espera." #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "Diagnósticos" @@ -1527,26 +1527,26 @@ msgstr "aviso" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "MiB" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "GiB" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" "Habría que deshabilitar algunas apps para reducir el consumo de memoria." -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "Hay que evitar instalar más apps en este sistema." -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " @@ -1555,32 +1555,27 @@ msgstr "" "El sistema va justo de memoria: {percent_used}% usada, {memory_available} " "{memory_available_unit} libres. {advice_message}" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "Poca memoria libre" -#: plinth/modules/diagnostics/__init__.py:248 -#, fuzzy -#| msgid "Run Diagnostics" +#: plinth/modules/diagnostics/__init__.py:254 msgid "Running diagnostics" -msgstr "Ejecutar diagnósticos" +msgstr "Ejecutando los diagnósticos" -#: plinth/modules/diagnostics/__init__.py:289 +#: plinth/modules/diagnostics/__init__.py:295 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" +"Se han encontrado {issue_count} problemas durante las pruebas rutinarias." -#: plinth/modules/diagnostics/__init__.py:290 -#, fuzzy -#| msgid "Diagnostic Results" +#: plinth/modules/diagnostics/__init__.py:296 msgid "Diagnostics results" -msgstr "Resultado del diagnóstico" +msgstr "Resultados de los diagnósticos" -#: plinth/modules/diagnostics/__init__.py:295 -#, fuzzy -#| msgid "Diagnostic Results" +#: plinth/modules/diagnostics/__init__.py:301 msgid "Go to diagnostics results" -msgstr "Resultado del diagnóstico" +msgstr "Ir a los resultados de los diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics.html:16 #: plinth/modules/diagnostics/templates/diagnostics_button.html:11 @@ -1588,29 +1583,31 @@ msgid "Run Diagnostics" msgstr "Ejecutar diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics.html:21 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Resultados" +msgstr "Ver los resultados" #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" msgstr "Resultado del diagnóstico" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "Aplicación: %(app_name)s" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "Volver a ejecutar la configuración" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "Esta aplicación no soporta diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Ejecutar diagnósticos" +msgstr "Volver a ejecutar los diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" @@ -1620,12 +1617,16 @@ msgstr "El test de diagnósticos está ejecutándose" msgid "Results" msgstr "Resultados" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 -#, python-format +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 +#, fuzzy, python-format +#| msgid "" +#| "\n" +#| " App: %(app_name)s\n" +#| " " msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" "\n" " Aplicación: %(app_name)s\n" @@ -1640,7 +1641,7 @@ msgstr "Test" msgid "Result" msgstr "Resultado" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "Test de diagnóstico" @@ -3167,6 +3168,10 @@ msgid "" "Wikipedia available without using the internet, but it is potentially " "suitable for all HTML content. Kiwix packages are in the ZIM file format." msgstr "" +"Kiwix es un lector sin conexión para contenidos web. Es un software pensado " +"para que la Wikipedia esté disponible sin usar Internet, pero es " +"potencialmente adecuado para todo el contenido HTML. Los paquetes Kiwix " +"están en el formato ZIM." #: plinth/modules/kiwix/__init__.py:25 msgid "" @@ -3180,6 +3185,15 @@ msgid "" "
  • Magazines: Low-tech Magazine
  • \n" " " msgstr "" +"Kiwix puede alojar varios tipos de contenido:\n" +"
      \n" +"
    • Versiones sin conexión de páginas web: proyectos Wikimedia, Stack " +"Exchange
    • \n" +"
    • Contenidos de vídeo: Khan Academy, TED Talks, Crash Course
    • \n" +"
    • Materiales educativos: PHET, TED Ed, Vikidia
    • \n" +"
    • eBooks: Proyecto Gutenberg
    • \n" +"
    • Revistas: Low-tech Magazine
    • \n" +"
    " #: plinth/modules/kiwix/__init__.py:33 #: plinth/modules/kiwix/templates/kiwix-add-package.html:14 @@ -3189,25 +3203,26 @@ msgid "" "project or create your own." msgstr "" +"Puede descargar paquetes de contenido del proyecto Kiwix o crear los suyos propios." #: plinth/modules/kiwix/__init__.py:53 msgid "Manage Kiwix content server" -msgstr "" +msgstr "Gestionar el servidor de contenido Kiwix" #: plinth/modules/kiwix/__init__.py:56 plinth/modules/kiwix/manifest.py:8 msgid "Kiwix" -msgstr "" +msgstr "Kiwix" #: plinth/modules/kiwix/__init__.py:57 msgid "Offline Wikipedia" -msgstr "" +msgstr "Wikipedia sin conexión" #: plinth/modules/kiwix/forms.py:23 -#, fuzzy -#| msgid "Backup files have to be in .tar.gz format" msgid "Content packages have to be in .zim format" -msgstr "" -"Los archivos de la copia de seguridad deben de estar en formato .tar.gz" +msgstr "Los paquetes deben estar en formato .zim" #: plinth/modules/kiwix/forms.py:25 #, python-brace-format @@ -3216,73 +3231,64 @@ msgid "" "{box_name}. If Kiwix fails to add the file, it will be deleted immediately " "to save disk space." msgstr "" +"Los archivos ZIM cargados se almacenarán en {kiwix_home}/content en su " +"{box_name}. Si Kiwix no consigue añadir el archivo, se eliminará " +"inmediatamente para ahorrar espacio en disco." #: plinth/modules/kiwix/templates/kiwix-add-package.html:24 #, python-format msgid "You have %(max_filesize)s of free disk space available." -msgstr "" +msgstr "Dispone de %(max_filesize)s espacio libre en el disco." #: plinth/modules/kiwix/templates/kiwix-add-package.html:36 -#, fuzzy -#| msgid "Upload file" msgid "Upload ZIM file" -msgstr "Subir archivo" +msgstr "Cargar el archivo ZIM" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:11 -#, fuzzy, python-format -#| msgid "Delete Wiki or Blog %(name)s" +#, python-format msgid "Delete content package %(name)s" -msgstr "Borrar Wiki o Blog %(name)s" +msgstr "Eliminar el paquete de contenidos %(name)s" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:17 msgid "" "Delete this package permanently? You may add it back later if you have a " "copy of the ZIM file." msgstr "" +"¿Borrar este paquete definitivamente? Puedes volver a añadirlo más tarde si " +"tienes una copia del archivo ZIM." #: plinth/modules/kiwix/templates/kiwix.html:11 msgid "Manage Content Packages" -msgstr "" +msgstr "Gestionar los paquetes del contenido" #: plinth/modules/kiwix/templates/kiwix.html:15 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a content package" -msgstr "Añadir nuevo par" +msgstr "Añadir un paquete de contenidos" #: plinth/modules/kiwix/templates/kiwix.html:17 -#, fuzzy -#| msgid "Package" msgid "Add Package" -msgstr "Paquete" +msgstr "Añadir un paquete" #: plinth/modules/kiwix/templates/kiwix.html:24 -#, fuzzy -#| msgid "No status available." msgid "No content packages available." -msgstr "Estado de actualización No disponible." +msgstr "No hay paquetes de contenido disponibles." #: plinth/modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete site %(site)s" +#, python-format msgid "Delete package %(title)s" -msgstr "Eliminar sitio %(site)s" +msgstr "Borrar el paquete %(title)s" #: plinth/modules/kiwix/views.py:49 msgid "Content package added." -msgstr "" +msgstr "Se ha añadido un paquete de contenidos." #: plinth/modules/kiwix/views.py:54 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a new content package" -msgstr "Añadir nuevo par" +msgstr "Añadir un nuevo paquete de contenidos" #: plinth/modules/kiwix/views.py:83 -#, fuzzy -#| msgid "Failed to add user to group." msgid "Failed to add content package." -msgstr "Ha fallado añadir al o la usuaria al grupo." +msgstr "No se ha podido añadir el paquete de contenido." #: plinth/modules/letsencrypt/__init__.py:25 #, python-brace-format @@ -3526,13 +3532,6 @@ msgstr "" "@username:domainname." #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:26 -#, fuzzy -#| msgid "" -#| "\n" -#| " Warning! Changing the domain name after the " -#| "initial\n" -#| " setup is currently not supported.\n" -#| " " msgid "" "\n" " Warning! Changing the domain name after this step " @@ -3542,9 +3541,10 @@ msgid "" " " msgstr "" "\n" -" Atención! Actualmente no está soportado cambiar el " -"nombre\n" -" de dominio una vez hecha la configuración inicial.\n" +" ¡Atención! Cambiar el nombre del dominio después de " +"este paso \n" +" requerirá desinstalar y volver a instalar la aplicación, lo que " +"borrará los datos de la aplicación.\n" " " #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:35 @@ -8966,10 +8966,6 @@ msgstr "Actualización" msgid "Backup" msgstr "Copia de seguridad" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "Volver a ejecutar la configuración" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index 1bba609a5..b7bc8dad7 100644 --- a/plinth/locale/fa/LC_MESSAGES/django.po +++ b/plinth/locale/fa/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian \n" "Language-Team: Plinth Developers \n" "Language-Team: French \n" "Language-Team: Galician \n" "Language-Team: Gujarati \n" "Language-Team: Hindi \n" "Language-Team: Hungarian \n" "Language-Team: Indonesian \n" "Language-Team: Italian \n" "Language-Team: Japanese \n" "Language-Team: Kannada \n" "Language-Team: Lithuanian \n" "Language-Team: Latvian \n" "Language-Team: Norwegian Bokmål \n" "Language-Team: Dutch \n" "Language-Team: Polish \n" "Language-Team: Portuguese \n" "Language-Team: Russian \n" "Language-Team: Sinhala \n" "Language-Team: Slovenian \n" "Language-Team: Albanian \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -81,12 +81,12 @@ msgstr "" "Kujdes! Aplikacioni mund të mos funksionojë si duhet, nëse emri i " "përkatësisë ndryshohet më vonë." -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "Përkatësi TLS" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1398,7 +1398,7 @@ msgstr "Coturn" msgid "VoIP Helper" msgstr "Ndihmës VoIP" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "Listë e pavlefshme URI-sh Shërbyesi STUN/TURN" @@ -1411,7 +1411,7 @@ msgstr "" msgid "Use the following shared authentication secret:" msgstr "Përdor të fshehtën vijuese për mirëfilltësim të përbashkët:" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." @@ -1419,11 +1419,11 @@ msgstr "" "Shërbyesi i kohës së rrjetit është një program që kujdeset që koha e " "sistemit të jetë e njëkohshme me shërbyes në Internet." -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "Datë & Kohë" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "Kohë e njëkohësuar me shërbyes NTP" @@ -1496,7 +1496,7 @@ msgstr "" "siç pritet." #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "Diagnostikime" @@ -1519,26 +1519,26 @@ msgstr "kujdes" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "MiB" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "GiB" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" "Duhet të çaktivizoni disa aplikacione, për të zvogëluar përdorim kujtese." -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "S’duhet të instaloni çfarëdo aplikacioni të ri në këtë sistem." -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " @@ -1547,28 +1547,28 @@ msgstr "" "Ka pak kujtesë për sistemin: {percent_used}% të përdorur, {memory_available} " "{memory_available_unit} të lirë. {advice_message}" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "Kujtesë e Pakët" -#: plinth/modules/diagnostics/__init__.py:248 +#: plinth/modules/diagnostics/__init__.py:254 #, fuzzy #| msgid "Run Diagnostics" msgid "Running diagnostics" msgstr "Xhiro Diagnostikime" -#: plinth/modules/diagnostics/__init__.py:289 +#: plinth/modules/diagnostics/__init__.py:295 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: plinth/modules/diagnostics/__init__.py:290 +#: plinth/modules/diagnostics/__init__.py:296 #, fuzzy #| msgid "Diagnostic Results" msgid "Diagnostics results" msgstr "Përfundime Diagnostikimi" -#: plinth/modules/diagnostics/__init__.py:295 +#: plinth/modules/diagnostics/__init__.py:301 #, fuzzy #| msgid "Diagnostic Results" msgid "Go to diagnostics results" @@ -1589,12 +1589,18 @@ msgstr "Përfundime" msgid "Diagnostic Results" msgstr "Përfundime Diagnostikimi" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "Aplikacion: %(app_name)s" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "Ky aplikacion nuk mbulon diagnostikime" @@ -1612,12 +1618,16 @@ msgstr "Testi i diagnostikimeve është duke xhiruar" msgid "Results" msgstr "Përfundime" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 -#, python-format +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 +#, fuzzy, python-format +#| msgid "" +#| "\n" +#| " App: %(app_name)s\n" +#| " " msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" "\n" " Aplikacion: %(app_name)s\n" @@ -1632,7 +1642,7 @@ msgstr "Provë" msgid "Result" msgstr "Përfundim" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "Test Diagnostikimesh" @@ -1999,7 +2009,6 @@ msgid "Monal - XMPP Chat" msgstr "Monal - Fjalosje XMPP" #: plinth/modules/ejabberd/manifest.py:64 -#, fuzzy msgid "Siskin IM" msgstr "Siskin IM" @@ -3263,10 +3272,9 @@ msgid "No content packages available." msgstr "S’ka gjendje të ditur." #: plinth/modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete site %(site)s" +#, python-format msgid "Delete package %(title)s" -msgstr "Fshije sajtin %(site)s" +msgstr "Fshije paketën %(title)s" #: plinth/modules/kiwix/views.py:49 msgid "Content package added." @@ -4025,7 +4033,7 @@ msgstr "Fjalëkalimi i ardhjes u ndryshua" #: plinth/modules/mumble/views.py:53 msgid "Root channel name changed." -msgstr "Emri i kanalit rrënjë ndryshoi" +msgstr "Emri i kanalit rrënjë ndryshoi." #: plinth/modules/names/__init__.py:22 #, python-brace-format @@ -5941,7 +5949,7 @@ msgstr "Lexoni dhe pajtohuni te prurje lajmesh" #: plinth/modules/rssbridge/__init__.py:49 #: plinth/modules/rssbridge/manifest.py:10 msgid "RSS-Bridge" -msgstr "RSS-Bridge" +msgstr "" #: plinth/modules/rssbridge/__init__.py:50 msgid "RSS Feed Generator" @@ -9021,10 +9029,6 @@ msgstr "Përditësoje" msgid "Backup" msgstr "Kopjeruajtje" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index fb936ee89..34524eacc 100644 --- a/plinth/locale/sr/LC_MESSAGES/django.po +++ b/plinth/locale/sr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: LANGUAGE \n" @@ -78,12 +78,12 @@ msgid "" "later." msgstr "" -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1259,7 +1259,7 @@ msgstr "" msgid "VoIP Helper" msgstr "" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "" @@ -1271,17 +1271,17 @@ msgstr "" msgid "Use the following shared authentication secret:" msgstr "" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." msgstr "" -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "" @@ -1347,7 +1347,7 @@ msgid "" msgstr "" #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "" @@ -1370,49 +1370,49 @@ msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "" -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "" -#: plinth/modules/diagnostics/__init__.py:248 +#: plinth/modules/diagnostics/__init__.py:254 msgid "Running diagnostics" msgstr "" -#: plinth/modules/diagnostics/__init__.py:289 +#: plinth/modules/diagnostics/__init__.py:295 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: plinth/modules/diagnostics/__init__.py:290 +#: plinth/modules/diagnostics/__init__.py:296 msgid "Diagnostics results" msgstr "" -#: plinth/modules/diagnostics/__init__.py:295 +#: plinth/modules/diagnostics/__init__.py:301 msgid "Go to diagnostics results" msgstr "" @@ -1429,12 +1429,18 @@ msgstr "" msgid "Diagnostic Results" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "" @@ -1450,12 +1456,12 @@ msgstr "" msgid "Results" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 #, python-format msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" #: plinth/modules/diagnostics/templates/diagnostics_results.html:11 @@ -1467,7 +1473,7 @@ msgstr "" msgid "Result" msgstr "" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "" @@ -7788,10 +7794,6 @@ msgstr "" msgid "Backup" msgstr "" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 645409eda..27fc127ee 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2023-10-24 00:04+0000\n" "Last-Translator: Joseph Nuthalapati \n" "Language-Team: Telugu \n" "Language-Team: Turkish \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -81,12 +81,12 @@ msgstr "" "Uyarı! Etki alan adı daha sonra değiştirilirse uygulama düzgün olarak " "çalışmayabilir." -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "TLS etki alanı" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1386,7 +1386,7 @@ msgstr "Coturn" msgid "VoIP Helper" msgstr "VoIP Yardımcısı" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "STUN/TURN Sunucu URI'lerinin geçersiz listesi" @@ -1398,7 +1398,7 @@ msgstr "İletişim sunucunuzu yapılandırmak için aşağıdaki URL'leri kullan msgid "Use the following shared authentication secret:" msgstr "Aşağıdaki paylaşılan kimlik doğrulama gizli anahtarını kullanın:" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." @@ -1406,11 +1406,11 @@ msgstr "" "Ağ zaman sunucusu, sistem saatini İnternet'teki sunucularla eşit halde tutan " "bir programdır." -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "Tarih ve Saat" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "NTP sunucusu ile zaman eşitlendi" @@ -1482,7 +1482,7 @@ msgstr "" "çalıştığını doğrulamak için sisteminizde bir dizi denetim gerçekleştirecek." #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "Tanılama" @@ -1505,26 +1505,26 @@ msgstr "uyarı" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "MiB" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "GiB" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" "Bellek kullanımını azaltmak için bazı uygulamaları etkisizleştirmelisiniz." -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "Bu sisteme herhangi bir yeni uygulama yüklememelisiniz." -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " @@ -1533,32 +1533,26 @@ msgstr "" "Sistem belleği düşük: %{percent_used} kullanılıyor, {memory_available}." "{memory_available_unit} boş. {advice_message}" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "Düşük Bellek" -#: plinth/modules/diagnostics/__init__.py:248 -#, fuzzy -#| msgid "Run Diagnostics" +#: plinth/modules/diagnostics/__init__.py:254 msgid "Running diagnostics" -msgstr "Tanılamayı Çalıştır" - -#: plinth/modules/diagnostics/__init__.py:289 -#, no-python-format, python-brace-format -msgid "Found {issue_count} issues during routine tests." -msgstr "" - -#: plinth/modules/diagnostics/__init__.py:290 -#, fuzzy -#| msgid "Diagnostic Results" -msgid "Diagnostics results" -msgstr "Tanı Sonuçları" +msgstr "Tanılama çalıştırılıyor" #: plinth/modules/diagnostics/__init__.py:295 -#, fuzzy -#| msgid "Diagnostic Results" +#, no-python-format, python-brace-format +msgid "Found {issue_count} issues during routine tests." +msgstr "Sıradan denemeler sırasında {issue_count} sorun bulundu." + +#: plinth/modules/diagnostics/__init__.py:296 +msgid "Diagnostics results" +msgstr "Tanı sonuçları" + +#: plinth/modules/diagnostics/__init__.py:301 msgid "Go to diagnostics results" -msgstr "Tanı Sonuçları" +msgstr "Tanı sonuçlarına git" #: plinth/modules/diagnostics/templates/diagnostics.html:16 #: plinth/modules/diagnostics/templates/diagnostics_button.html:11 @@ -1566,29 +1560,31 @@ msgid "Run Diagnostics" msgstr "Tanılamayı Çalıştır" #: plinth/modules/diagnostics/templates/diagnostics.html:21 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Sonuçlar" +msgstr "Sonuçları Görüntüle" #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" msgstr "Tanı Sonuçları" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "Uygulama: %(app_name)s" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "Ayarlamayı yeniden çalıştır" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "Bu uygulama tanılamayı desteklemiyor" #: plinth/modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Tanılamayı Çalıştır" +msgstr "Tanılamayı Yeniden Çalıştır" #: plinth/modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" @@ -1598,12 +1594,16 @@ msgstr "Tanılama denemesi şu anda çalışıyor" msgid "Results" msgstr "Sonuçlar" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 -#, python-format +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 +#, fuzzy, python-format +#| msgid "" +#| "\n" +#| " App: %(app_name)s\n" +#| " " msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" "\n" " Uygulama: %(app_name)s\n" @@ -1618,7 +1618,7 @@ msgstr "Deneme" msgid "Result" msgstr "Sonuç" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "Tanı Denemesi" @@ -3150,6 +3150,10 @@ msgid "" "Wikipedia available without using the internet, but it is potentially " "suitable for all HTML content. Kiwix packages are in the ZIM file format." msgstr "" +"Kiwix, web içeriği için çevrimdışı bir okuyucudur. Vikipedi’yi interneti " +"kullanmadan kullanılabilir hale getirmeyi amaçlayan bir yazılımdır, ancak " +"potansiyel olarak tüm HTML içeriği için uygundur. Kiwix paketleri ZIM " +"dosyası biçimindedir." #: plinth/modules/kiwix/__init__.py:25 msgid "" @@ -3163,6 +3167,15 @@ msgid "" "
  • Magazines: Low-tech Magazine
  • \n" " " msgstr "" +"Kiwix çeşitli içerik türlerini barındırabilir:\n" +"
      \n" +"
    • Web sitelerinin çevrimdışı sürümleri: Wikimedia projects, Stack " +"Exchange
    • \n" +"
    • Video içeriği: Khan Academy, TED Talks, Crash Course
    • \n" +"
    • Eğitim materyalleri: PHET, TED Ed, Vikidia
    • \n" +"
    • eKitaplar: Project Gutenberg
    • \n" +"
    • Dergiler: Low-tech Magazine
    • \n" +"
    " #: plinth/modules/kiwix/__init__.py:33 #: plinth/modules/kiwix/templates/kiwix-add-package.html:14 @@ -3172,24 +3185,26 @@ msgid "" "project or create your own." msgstr "" +"Kiwix projesinden içerik paketlerini indirebilirsiniz veya " +"kendinizinkini oluşturabilirsiniz." #: plinth/modules/kiwix/__init__.py:53 msgid "Manage Kiwix content server" -msgstr "" +msgstr "Kiwix içerik sunucusunu yönetin" #: plinth/modules/kiwix/__init__.py:56 plinth/modules/kiwix/manifest.py:8 msgid "Kiwix" -msgstr "" +msgstr "Kiwix" #: plinth/modules/kiwix/__init__.py:57 msgid "Offline Wikipedia" -msgstr "" +msgstr "Çevrimdışı Vikipedi" #: plinth/modules/kiwix/forms.py:23 -#, fuzzy -#| msgid "Backup files have to be in .tar.gz format" msgid "Content packages have to be in .zim format" -msgstr "Yedekleme dosyaları .tar.gz biçiminde olmak zorundadır" +msgstr "İçerik paketleri .zim biçiminde olmak zorundadır" #: plinth/modules/kiwix/forms.py:25 #, python-brace-format @@ -3198,73 +3213,64 @@ msgid "" "{box_name}. If Kiwix fails to add the file, it will be deleted immediately " "to save disk space." msgstr "" +"Yüklenen ZIM dosyaları, {box_name} cihazınızda {kiwix_home}/content altında " +"saklanacaktır. Eğer Kiwix dosyayı eklemek için başarısız olursa, disk " +"alanından tasarruf etmek için dosya hemen silinecektir." #: plinth/modules/kiwix/templates/kiwix-add-package.html:24 #, python-format msgid "You have %(max_filesize)s of free disk space available." -msgstr "" +msgstr "Mevcut %(max_filesize)s boş disk alanınız var." #: plinth/modules/kiwix/templates/kiwix-add-package.html:36 -#, fuzzy -#| msgid "Upload file" msgid "Upload ZIM file" -msgstr "Dosya yükle" +msgstr "ZIM dosyası yükle" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:11 -#, fuzzy, python-format -#| msgid "Delete Wiki or Blog %(name)s" +#, python-format msgid "Delete content package %(name)s" -msgstr "%(name)s Viki veya Blog'unu Sil" +msgstr "%(name)s içerik paketini sil" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:17 msgid "" "Delete this package permanently? You may add it back later if you have a " "copy of the ZIM file." msgstr "" +"Bu paket kalıcı olarak silinsin mi? ZIM dosyasının bir kopyasına sahipseniz " +"daha sonra tekrar ekleyebilirsiniz." #: plinth/modules/kiwix/templates/kiwix.html:11 msgid "Manage Content Packages" -msgstr "" +msgstr "İçerik Paketlerini Yönet" #: plinth/modules/kiwix/templates/kiwix.html:15 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a content package" -msgstr "Yeni bir kişi ekle" +msgstr "İçerik paketi ekle" #: plinth/modules/kiwix/templates/kiwix.html:17 -#, fuzzy -#| msgid "Package" msgid "Add Package" -msgstr "Paket" +msgstr "Paket Ekle" #: plinth/modules/kiwix/templates/kiwix.html:24 -#, fuzzy -#| msgid "No status available." msgid "No content packages available." -msgstr "Mevcut durum yok." +msgstr "Mevcut içerik paketleri yok." #: plinth/modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete site %(site)s" +#, python-format msgid "Delete package %(title)s" -msgstr "%(site)s sitesini sil" +msgstr "%(title)s paketini sil" #: plinth/modules/kiwix/views.py:49 msgid "Content package added." -msgstr "" +msgstr "İçerik paketi eklendi." #: plinth/modules/kiwix/views.py:54 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a new content package" -msgstr "Yeni bir kişi ekle" +msgstr "Yeni bir içerik paketi ekle" #: plinth/modules/kiwix/views.py:83 -#, fuzzy -#| msgid "Failed to add user to group." msgid "Failed to add content package." -msgstr "Kullanıcıyı gruba ekleme başarısız oldu." +msgstr "İçerik paketi ekleme başarısız oldu." #: plinth/modules/letsencrypt/__init__.py:25 #, python-brace-format @@ -3508,13 +3514,6 @@ msgstr "" "etkialanıadı şeklinde görünecektir." #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:26 -#, fuzzy -#| msgid "" -#| "\n" -#| " Warning! Changing the domain name after the " -#| "initial\n" -#| " setup is currently not supported.\n" -#| " " msgid "" "\n" " Warning! Changing the domain name after this step " @@ -3524,8 +3523,10 @@ msgid "" " " msgstr "" "\n" -" Uyarı! İlk ayarlamadan sonra etki alanı adının\n" -" değiştirilmesi şu anda desteklenmiyor.\n" +" Uyarı! Bu adımdan sonra etki alanı adının " +"değiştirilmesi, uygulamanın verilerini\n" +" silecek olan uygulamanın kaldırılmasını ve yeniden yüklenmesini " +"gerektirecektir.\n" " " #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:35 @@ -8951,10 +8952,6 @@ msgstr "Güncelle" msgid "Backup" msgstr "Yedekle" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "Ayarlamayı yeniden çalıştır" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index d7dbe453c..570aaa94d 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" -"PO-Revision-Date: 2023-09-29 12:01+0000\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" +"PO-Revision-Date: 2023-11-03 20:31+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -82,12 +82,12 @@ msgstr "" "Попередження! Застосунок може працювати неправильно, якщо пізніше зміниться " "назва домену." -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "TLS-домен" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1394,7 +1394,7 @@ msgstr "Coturn" msgid "VoIP Helper" msgstr "Помічник VoIP" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "Невірний список URI серверів STUN/TURN" @@ -1408,7 +1408,7 @@ msgstr "" msgid "Use the following shared authentication secret:" msgstr "Використовуйте наступний спільний секрет автентифікації:" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." @@ -1416,11 +1416,11 @@ msgstr "" "Сервер мережевого часу — це програма, що підтримує системний час " "синхронізовано зі серверами в Інтернеті." -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "Дата і час" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "Час синхронізовано зі сервером NTP" @@ -1492,7 +1492,7 @@ msgstr "" "що застосунки і сервіси працюють так, як очікується." #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "Діагностика" @@ -1515,26 +1515,26 @@ msgstr "попередження" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "МіБ" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "ҐіБ" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" "Ви повинні вимкнути деякі застосунки, щоб зменшити використання памʼяті." -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "Не слід встановлювати нові застосунки в цій системі." -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " @@ -1543,32 +1543,26 @@ msgstr "" "У системі бракує памʼяті: {percent_used}% використано, {memory_available} " "{memory_available_unit} вільно. {advice_message}" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "Мало памʼяті" -#: plinth/modules/diagnostics/__init__.py:248 -#, fuzzy -#| msgid "Run Diagnostics" +#: plinth/modules/diagnostics/__init__.py:254 msgid "Running diagnostics" -msgstr "Запустити діагностику" +msgstr "Виконується діагностика" -#: plinth/modules/diagnostics/__init__.py:289 +#: plinth/modules/diagnostics/__init__.py:295 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." -msgstr "" +msgstr "Знайдено {issue_count} проблеми під час звичайних перевірок." -#: plinth/modules/diagnostics/__init__.py:290 -#, fuzzy -#| msgid "Diagnostic Results" +#: plinth/modules/diagnostics/__init__.py:296 msgid "Diagnostics results" msgstr "Результати діагностики" -#: plinth/modules/diagnostics/__init__.py:295 -#, fuzzy -#| msgid "Diagnostic Results" +#: plinth/modules/diagnostics/__init__.py:301 msgid "Go to diagnostics results" -msgstr "Результати діагностики" +msgstr "Перейти до результатів діагностики" #: plinth/modules/diagnostics/templates/diagnostics.html:16 #: plinth/modules/diagnostics/templates/diagnostics_button.html:11 @@ -1576,29 +1570,31 @@ msgid "Run Diagnostics" msgstr "Запустити діагностику" #: plinth/modules/diagnostics/templates/diagnostics.html:21 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Результати" +msgstr "Переглянути результати" #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" msgstr "Результати діагностики" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "Застосунок: %(app_name)s" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "Повторно розпочати налаштування" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "Цей застосунок не підтримує діагностику" #: plinth/modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Запустити діагностику" +msgstr "Повторно запустити діагностику" #: plinth/modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" @@ -1608,12 +1604,16 @@ msgstr "Тест діагностики вже запущено" msgid "Results" msgstr "Результати" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 -#, python-format +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 +#, fuzzy, python-format +#| msgid "" +#| "\n" +#| " App: %(app_name)s\n" +#| " " msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" "\n" " Застосунок: %(app_name)s\n" @@ -1628,7 +1628,7 @@ msgstr "Тест" msgid "Result" msgstr "Результат" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "Тест діагностики" @@ -3159,6 +3159,10 @@ msgid "" "Wikipedia available without using the internet, but it is potentially " "suitable for all HTML content. Kiwix packages are in the ZIM file format." msgstr "" +"Kiwix — це офлайн-читач вебконтенту. Це програмне забезпечення, призначене " +"для того, щоб зробити Вікіпедію доступною без доступу до інтернету, але він " +"потенційно придатний для будь-якого HTML-контенту. Пакунки Kiwix мають " +"формат ZIM." #: plinth/modules/kiwix/__init__.py:25 msgid "" @@ -3172,6 +3176,14 @@ msgid "" "
  • Magazines: Low-tech Magazine
  • \n" " " msgstr "" +"Kiwix може розміщувати різні види контенту:\n" +"
      \n" +"
    • Офлайн-версії вебсайтів: Проєкти Вікімедіа, Stack Exchange
    • \n" +"
    • Відеоматеріали: Khan Academy, TED Talks, Crash Course
    • \n" +"
    • Освітні матеріали: PHET, TED Ed, Vikidia
    • \n" +"
    • еКниги: Project Gutenberg
    • \n" +"
    • Журнали: Low-tech Magazine
    • \n" +"
    " #: plinth/modules/kiwix/__init__.py:33 #: plinth/modules/kiwix/templates/kiwix-add-package.html:14 @@ -3181,24 +3193,26 @@ msgid "" "project or create your own." msgstr "" +"Ви можете завантажити пакунки матеріалів з проєкту " +"Kiwix або створити власні." #: plinth/modules/kiwix/__init__.py:53 msgid "Manage Kiwix content server" -msgstr "" +msgstr "Керування сервером вмісту Kiwix" #: plinth/modules/kiwix/__init__.py:56 plinth/modules/kiwix/manifest.py:8 msgid "Kiwix" -msgstr "" +msgstr "Kiwix" #: plinth/modules/kiwix/__init__.py:57 msgid "Offline Wikipedia" -msgstr "" +msgstr "Вікіпедія офлайн" #: plinth/modules/kiwix/forms.py:23 -#, fuzzy -#| msgid "Backup files have to be in .tar.gz format" msgid "Content packages have to be in .zim format" -msgstr "Файли резервної копії повинні бути у форматі .tar.gz" +msgstr "Пакунки вмісту мають бути у форматі .zim" #: plinth/modules/kiwix/forms.py:25 #, python-brace-format @@ -3207,73 +3221,64 @@ msgid "" "{box_name}. If Kiwix fails to add the file, it will be deleted immediately " "to save disk space." msgstr "" +"Завантажені ZIM-файли будуть зберігатися в теці {kiwix_home}/content у " +"вашому {box_name}. Якщо Kiwix не зможе додати файл, він буде негайно " +"видалений для економії дискового простору." #: plinth/modules/kiwix/templates/kiwix-add-package.html:24 #, python-format msgid "You have %(max_filesize)s of free disk space available." -msgstr "" +msgstr "Вам доступно %(max_filesize)s дискового простору." #: plinth/modules/kiwix/templates/kiwix-add-package.html:36 -#, fuzzy -#| msgid "Upload file" msgid "Upload ZIM file" -msgstr "Вивантажити файл" +msgstr "Вивантажити ZIM-файл" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:11 -#, fuzzy, python-format -#| msgid "Delete Wiki or Blog %(name)s" +#, python-format msgid "Delete content package %(name)s" -msgstr "Видалити вікі або блоґ %(name)s" +msgstr "Видалити пакунок вмісту %(name)s" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:17 msgid "" "Delete this package permanently? You may add it back later if you have a " "copy of the ZIM file." msgstr "" +"Видалити цей пакунок назавжди? Ви можете додати його пізніше, якщо у вас є " +"копія ZIM-файлу." #: plinth/modules/kiwix/templates/kiwix.html:11 msgid "Manage Content Packages" -msgstr "" +msgstr "Керувати пакунками вмісту" #: plinth/modules/kiwix/templates/kiwix.html:15 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a content package" -msgstr "Додати новий вузол" +msgstr "Додати пакунок вмісту" #: plinth/modules/kiwix/templates/kiwix.html:17 -#, fuzzy -#| msgid "Package" msgid "Add Package" -msgstr "Пакунок" +msgstr "Додати пакунок" #: plinth/modules/kiwix/templates/kiwix.html:24 -#, fuzzy -#| msgid "No status available." msgid "No content packages available." -msgstr "Стан недоступний." +msgstr "Пакунки вмісту недоступні." #: plinth/modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete site %(site)s" +#, python-format msgid "Delete package %(title)s" -msgstr "Видалити сайт %(site)s" +msgstr "Видалити пакунок %(title)s" #: plinth/modules/kiwix/views.py:49 msgid "Content package added." -msgstr "" +msgstr "Додано пакунок вмісту." #: plinth/modules/kiwix/views.py:54 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a new content package" -msgstr "Додати новий вузол" +msgstr "Додати новий пакунок вмісту" #: plinth/modules/kiwix/views.py:83 -#, fuzzy -#| msgid "Failed to add user to group." msgid "Failed to add content package." -msgstr "Не вдалося додати користувача до групи." +msgstr "Не вдалося додати пакунок вмісту." #: plinth/modules/letsencrypt/__init__.py:25 #, python-brace-format @@ -3517,13 +3522,6 @@ msgstr "" "вигляд @ім'я_користувача:назва_домену." #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:26 -#, fuzzy -#| msgid "" -#| "\n" -#| " Warning! Changing the domain name after the " -#| "initial\n" -#| " setup is currently not supported.\n" -#| " " msgid "" "\n" " Warning! Changing the domain name after this step " @@ -3533,8 +3531,10 @@ msgid "" " " msgstr "" "\n" -" Увага! Зміна назви домену після початкового\n" -" налаштування зараз не підтримується.\n" +" Увага! Зміна назви домену після цього кроку потребує " +"видалення\n" +" та перевстановлення застосунку, що призведе до знищення даних " +"застосунку.\n" " " #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:35 @@ -8945,10 +8945,6 @@ msgstr "Оновити" msgid "Backup" msgstr "Резервна копія" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "Повторно розпочати налаштування" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 44cc5b340..56f626c5c 100644 --- a/plinth/locale/vi/LC_MESSAGES/django.po +++ b/plinth/locale/vi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese \n" "Language-Team: Chinese (Simplified) \n" "Language-Team: Chinese (Traditional) str: @@ -59,7 +61,7 @@ class TurnConfiguration: def validate_turn_uris(turn_uris: list[str]) -> bool: """Return whether the given TURN URI is valid.""" pattern = re.compile(TURN_URI_REGEX) - return all(map(pattern.match, turn_uris)) + return all(map(pattern.fullmatch, turn_uris)) @dataclass diff --git a/plinth/modules/coturn/forms.py b/plinth/modules/coturn/forms.py index e57740c1c..0f6f93608 100644 --- a/plinth/modules/coturn/forms.py +++ b/plinth/modules/coturn/forms.py @@ -18,7 +18,8 @@ def get_domain_choices(): def turn_uris_validator(turn_uris): """Validate list of STUN/TURN Server URIs.""" - if not TurnConfiguration.validate_turn_uris(turn_uris.split("\n")): + uris = [uri for uri in turn_uris.split('\r\n') if uri] + if not TurnConfiguration.validate_turn_uris(uris): raise ValidationError(_('Invalid list of STUN/TURN Server URIs')) diff --git a/plinth/modules/coturn/tests/test_components.py b/plinth/modules/coturn/tests/test_components.py index bf7678888..524cad258 100644 --- a/plinth/modules/coturn/tests/test_components.py +++ b/plinth/modules/coturn/tests/test_components.py @@ -3,6 +3,7 @@ Tests for the Coturn app component. """ +import json from unittest.mock import call, patch import pytest @@ -26,16 +27,15 @@ def fixture_empty_component_list(): TurnConsumer._all = {} -def test_configuration_init(): +def test_turn_configuration_init(): """Test creating configuration object.""" config = TurnConfiguration('test-domain.example', [], 'test-shared-secret') assert config.domain == 'test-domain.example' assert config.shared_secret == 'test-shared-secret' assert config.uris == [ - "stun:test-domain.example:3478?transport=tcp", - "stun:test-domain.example:3478?transport=udp", - "turn:test-domain.example:3478?transport=tcp", - "turn:test-domain.example:3478?transport=udp", + 'stun:test-domain.example:3478', + 'turn:test-domain.example:3478?transport=tcp', + 'turn:test-domain.example:3478?transport=udp', ] config = TurnConfiguration(None, ['test-uri1', 'test-uri2'], @@ -59,6 +59,42 @@ def test_configuration_init(): assert config.credential == 'test-credential' +def test_turn_configuration_to_json(): + """Test exporting configuration to JSON.""" + config = TurnConfiguration('test-domain.example', [], 'test-shared-secret') + assert json.loads(config.to_json()) == { + 'domain': 'test-domain.example', + 'uris': [ + 'stun:test-domain.example:3478', + 'turn:test-domain.example:3478?transport=tcp', + 'turn:test-domain.example:3478?transport=udp', + ], + 'shared_secret': 'test-shared-secret' + } + + +def test_turn_configuration_validate_turn_uris(): + """Test validation method to check for STUN/TURN URIs.""" + valid_uris = [ + 'stun:test-domain.example:3478', + 'turn:test-domain.example:3478?transport=tcp', + 'turn:test-domain.example:3478?transport=udp', + ] + invalid_uris = [ + 'x-invalid-uri', + 'stun:', + 'stun:domain-port-missing.example', + 'stun:testing.example:1234invalid-append', + 'turn:testing.example:1234', + 'turn:testing.example:1234?invalid-param=value', + 'turn:testing.example:1234?transport=invalid-value', + 'turn:testing.example:1234?transport=tcp-invalid-append', + ] + assert TurnConfiguration().validate_turn_uris(valid_uris) + for uri in invalid_uris: + assert not TurnConfiguration().validate_turn_uris([uri]) + + def test_component_init_and_list(): """Test initializing and listing all the components.""" component1 = TurnConsumer('component1') diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py index 209154ba4..edee893dd 100644 --- a/plinth/modules/datetime/__init__.py +++ b/plinth/modules/datetime/__init__.py @@ -11,6 +11,7 @@ from plinth import app as app_module from plinth import menu from plinth.daemon import Daemon, RelatedDaemon from plinth.modules.backups.components import BackupRestore +from plinth.modules.diagnostics.check import DiagnosticCheck, Result from plinth.package import Packages from . import manifest @@ -107,13 +108,14 @@ class DateTimeApp(app_module.App): def _diagnose_time_synchronized(): """Check whether time is synchronized to NTP server.""" - result = 'failed' + result = Result.FAILED try: output = subprocess.check_output( ['timedatectl', 'show', '--property=NTPSynchronized', '--value']) if 'yes' in output.decode(): - result = 'passed' + result = Result.PASSED except subprocess.CalledProcessError: pass - return [_('Time synchronized to NTP server'), result] + return DiagnosticCheck('datetime-ntp-sync', + _('Time synchronized to NTP server'), result) diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index 0009438b9..0285270a2 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -126,6 +126,7 @@ def _run_on_all_enabled_modules(): app_results = { 'diagnosis': None, 'exception': None, + 'show_rerun_setup': False, } try: @@ -135,6 +136,11 @@ def _run_on_all_enabled_modules(): exception) app_results['exception'] = str(exception) + for check in app_results['diagnosis']: + if check.result in [Result.FAILED, Result.WARNING]: + app_results['show_rerun_setup'] = True + break + with results_lock: current_results['results'][app_id].update(app_results) current_results['progress_percentage'] = \ diff --git a/plinth/modules/diagnostics/templates/diagnostics_app.html b/plinth/modules/diagnostics/templates/diagnostics_app.html index b1bd75dd4..ba2eb77e7 100644 --- a/plinth/modules/diagnostics/templates/diagnostics_app.html +++ b/plinth/modules/diagnostics/templates/diagnostics_app.html @@ -9,7 +9,18 @@

    {% trans "Diagnostic Results" %}

    -

    {% blocktrans %}App: {{ app_name }}{% endblocktrans %}

    +
    +

    {% blocktrans %}App: {{ app_name }}{% endblocktrans %}

    + + {% if show_rerun_setup %} +
    + {% csrf_token %} + +
    + {% endif %} +
    {% if results %} {% include "diagnostics_results.html" with results=results %} diff --git a/plinth/modules/diagnostics/templates/diagnostics_full.html b/plinth/modules/diagnostics/templates/diagnostics_full.html index a6e59ebef..836abd505 100644 --- a/plinth/modules/diagnostics/templates/diagnostics_full.html +++ b/plinth/modules/diagnostics/templates/diagnostics_full.html @@ -33,11 +33,22 @@ {% if results %}

    {% trans "Results" %}

    {% for app_id, app_data in results.results.items %} -

    - {% blocktrans with app_name=app_data.name %} - App: {{app_name}} - {% endblocktrans %} -

    +
    +

    + {% blocktrans with app_name=app_data.name %} + App: {{app_name}} + {% endblocktrans %} +

    + + {% if app_data.show_rerun_setup %} +
    + {% csrf_token %} + +
    + {% endif %} +
    {% if app_data.diagnosis %} {% include "diagnostics_results.html" with results=app_data.diagnosis %} diff --git a/plinth/modules/diagnostics/views.py b/plinth/modules/diagnostics/views.py index 7b1c0830a..a7006b886 100644 --- a/plinth/modules/diagnostics/views.py +++ b/plinth/modules/diagnostics/views.py @@ -17,6 +17,8 @@ from plinth.app import App from plinth.modules import diagnostics from plinth.views import AppView +from .check import Result + logger = logging.getLogger(__name__) @@ -87,10 +89,18 @@ def diagnose_app(request, app_id): exception) diagnosis_exception = str(exception) + show_rerun_setup = False + for check in diagnosis: + if check.result in [Result.FAILED, Result.WARNING]: + show_rerun_setup = True + break + return TemplateResponse( request, 'diagnostics_app.html', { 'title': _('Diagnostic Test'), + 'app_id': app_id, 'app_name': app_name, 'results': diagnosis, 'exception': diagnosis_exception, + 'show_rerun_setup': show_rerun_setup, }) diff --git a/plinth/modules/ejabberd/__init__.py b/plinth/modules/ejabberd/__init__.py index 3ee7771b0..d4489c7a1 100644 --- a/plinth/modules/ejabberd/__init__.py +++ b/plinth/modules/ejabberd/__init__.py @@ -50,7 +50,7 @@ class EjabberdApp(app_module.App): app_id = 'ejabberd' - _version = 7 + _version = 8 def __init__(self): """Create components for the app.""" @@ -148,9 +148,14 @@ class EjabberdApp(app_module.App): if not old_version: self.enable() - # Configure STUN/TURN only if there's a valid TLS domain set for Coturn - configuration = self.get_component('turn-ejabberd').get_configuration() - update_turn_configuration(configuration, force=True) + if not old_version or get_turn_configuration()[1]: + # Configure STUN/TURN only if there's a valid TLS domain set for + # Coturn. Do this if app is being freshly installed or if it is + # previously installed and configured to use STUN/TURN + # auto-management. + configuration = self.get_component( + 'turn-ejabberd').get_configuration() + update_turn_configuration(configuration, force=True) class EjabberdTurnConsumer(TurnConsumer): diff --git a/plinth/modules/ejabberd/privileged.py b/plinth/modules/ejabberd/privileged.py index 7dd6e6498..11851c734 100644 --- a/plinth/modules/ejabberd/privileged.py +++ b/plinth/modules/ejabberd/privileged.py @@ -30,7 +30,7 @@ yaml = YAML() yaml.allow_duplicate_keys = True yaml.preserve_quotes = True # type: ignore [assignment] -TURN_URI_REGEX = r'(stun|turn):(.*):([0-9]{4})\?transport=(tcp|udp)' +TURN_URI_REGEX = r'(stun|turn):(.*):([0-9]{4})(?:\?transport=(tcp|udp))?' @privileged @@ -290,7 +290,7 @@ def _generate_service(uri: str) -> dict: if not match: raise ValueError('URL does not match TURN URI') - typ, domain, port, transport = match.groups() + typ, domain, port, transport = match.groups('udp') return { "host": domain, "port": int(port), @@ -301,10 +301,16 @@ def _generate_service(uri: str) -> dict: def _generate_uris(services: list[dict]) -> list[str]: """Generate STUN/TURN URIs from ejabberd mod_stun_disco service config.""" - return [ - f"{s['type']}:{s['host']}:{s['port']}?transport={s['transport']}" - for s in services - ] + uris = [] + for s in services: + uri = f"{s['type']}:{s['host']}:{s['port']}" + if s['type'] != 'stun': + uri += f"?transport={s['transport']}" + + if uri not in uris: + uris.append(uri) + + return uris @privileged diff --git a/plinth/modules/email/__init__.py b/plinth/modules/email/__init__.py index 666dee9f4..947f45d63 100644 --- a/plinth/modules/email/__init__.py +++ b/plinth/modules/email/__init__.py @@ -53,7 +53,7 @@ class EmailApp(plinth.app.App): app_id = 'email' - _version = 3 + _version = 4 def __init__(self): """Initialize the email app.""" diff --git a/plinth/modules/email/privileged/postfix.py b/plinth/modules/email/privileged/postfix.py index dde893141..fe8aab279 100644 --- a/plinth/modules/email/privileged/postfix.py +++ b/plinth/modules/email/privileged/postfix.py @@ -29,7 +29,9 @@ default_config = { ','.join([ 'permit_sasl_authenticated', 'defer_unauth_destination', - ]) + ]), + 'message_size_limit': + '102400000', } submission_options: dict[str, str] = { diff --git a/plinth/modules/matrixsynapse/__init__.py b/plinth/modules/matrixsynapse/__init__.py index 4480adecd..9078111d5 100644 --- a/plinth/modules/matrixsynapse/__init__.py +++ b/plinth/modules/matrixsynapse/__init__.py @@ -44,7 +44,7 @@ class MatrixSynapseApp(app_module.App): app_id = 'matrixsynapse' - _version = 9 + _version = 10 def __init__(self): """Create components for the app.""" @@ -129,9 +129,14 @@ class MatrixSynapseApp(app_module.App): self.get_component('letsencrypt-matrixsynapse').setup_certificates() - # Configure STUN/TURN only if there's a valid TLS domain set for Coturn - config = self.get_component('turn-matrixsynapse').get_configuration() - update_turn_configuration(config, force=True) + if not old_version or get_turn_configuration()[1]: + # Configure STUN/TURN only if there's a valid TLS domain set for + # Coturn. Do this if app is being freshly installed or if it is + # previously installed and configured to use STUN/TURN + # auto-management. + config = self.get_component( + 'turn-matrixsynapse').get_configuration() + update_turn_configuration(config, force=True) def uninstall(self): """De-configure and uninstall the app.""" diff --git a/plinth/operation.py b/plinth/operation.py index acbcbe016..ce8c3095c 100644 --- a/plinth/operation.py +++ b/plinth/operation.py @@ -187,7 +187,8 @@ class OperationsManager: def new(self, op_id: str, *args, **kwargs) -> Operation: """Create a new operation instance and add to global list.""" with self._lock: - if op_id in self._operations: + if (op_id in self._operations and self._operations[op_id].state != + Operation.State.COMPLETED): raise KeyError('Operation in progress/scheduled') kwargs['on_complete'] = self._on_operation_complete diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index 26a74b2d9..d2a6dcc51 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -22,8 +22,17 @@ from selenium.webdriver.support.ui import WebDriverWait config = configparser.ConfigParser() config.read(pathlib.Path(__file__).with_name('config.ini')) -config['DEFAULT']['url'] = os.environ.get('FREEDOMBOX_URL', - config['DEFAULT']['url']).rstrip('/') +# Configuration to allow each pytest-xdist worker to hit a dedicated +# app server. See .ci/functional-tests.yml for usage. +worker = os.environ.get('PYTEST_XDIST_WORKER', 'master') +if worker == 'master': + config['DEFAULT']['url'] = os.environ.get( + 'FREEDOMBOX_URL', config['DEFAULT']['url']).rstrip('/') +else: + # worker_ids are like gw0, gw1, ... + worker_number = int(worker.lstrip('gw')) + 1 + config['DEFAULT']['url'] = os.environ[f'APP_SERVER_URL_{worker_number}'] + config['DEFAULT']['ssh_port'] = os.environ.get('FREEDOMBOX_SSH_PORT', config['DEFAULT']['ssh_port']) config['DEFAULT']['samba_port'] = os.environ.get( diff --git a/plinth/tests/test_operation.py b/plinth/tests/test_operation.py index f4baaeeb1..d3bd45ce9 100644 --- a/plinth/tests/test_operation.py +++ b/plinth/tests/test_operation.py @@ -285,16 +285,29 @@ def test_manager_new_without_show_message(): def test_manager_new_raises(): """Test that a new operation is always unique.""" manager = OperationsManager() - operation1 = manager.new('testop1', 'testapp', 'op1', Mock()) + event1 = threading.Event() + event2 = threading.Event() - # Creating operation with same id throws exception + operation1 = manager.new('testop1', 'testapp', 'op1', + lambda: event1.wait()) + + # Creating operation with different ID works + operation2 = manager.new('testop2', 'testapp', 'op3', lambda: event2.set()) + + assert manager._operations == OrderedDict(testop1=operation1, + testop2=operation2) + + # Creating operation with same id while the operation is running/scheduled + # throws exception with pytest.raises(KeyError): manager.new('testop1', 'testapp', 'op1', Mock()) - # Creating operation with different ID works - operation2 = manager.new('testop2', 'testapp', 'op3', Mock()) + # Creating operation with same id after the operation is completed works. + event1.set() # Allow the first operation to complete + event2.wait(10) # Wait until the second operation has started + operation1_new = manager.new('testop1', 'testapp', 'op1', Mock()) - assert manager._operations == OrderedDict(testop1=operation1, + assert manager._operations == OrderedDict(testop1=operation1_new, testop2=operation2)