From ccbd5d7d20efaa0678642d1311e8fc351192fc18 Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Thu, 18 Jul 2024 13:11:16 +0000 Subject: [PATCH 01/20] Translated using Weblate (Bulgarian) Currently translated at 46.1% (728 of 1576 strings) --- plinth/locale/bg/LC_MESSAGES/django.po | 150 +++++++------------------ 1 file changed, 41 insertions(+), 109 deletions(-) diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index c7e81996a..720df6d2c 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-01 20:10-0400\n" -"PO-Revision-Date: 2023-09-18 19:00+0000\n" +"PO-Revision-Date: 2024-07-19 14:09+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \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.0.2\n" +"X-Generator: Weblate 5.7-dev\n" #: config.py:103 #, python-brace-format @@ -120,10 +120,8 @@ msgid "Security" msgstr "Сигурност" #: menu.py:114 -#, fuzzy -#| msgid "Administrator Account" msgid "Administration" -msgstr "Профил на администратора" +msgstr "Администриране" #: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." @@ -1502,10 +1500,8 @@ msgid "Low Memory" msgstr "Паметта е малко" #: modules/diagnostics/__init__.py:266 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Running diagnostics" -msgstr "Диагностика" +msgstr "Диагностициране" #: modules/diagnostics/__init__.py:311 #, no-python-format, python-brace-format @@ -1513,57 +1509,40 @@ msgid "Found {issue_count} issues during routine tests." msgstr "" #: modules/diagnostics/__init__.py:312 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Diagnostics results" msgstr "Резултати от диагностиката" #: modules/diagnostics/__init__.py:317 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Go to diagnostics results" msgstr "Резултати от диагностиката" #: modules/diagnostics/forms.py:11 -#, fuzzy -#| msgid "Enable damage" msgid "Enable daily run" -msgstr "Получаване на щети" +msgstr "Включване всекидневно изпълняване" #: modules/diagnostics/forms.py:12 -#, fuzzy -#| msgid "When enabled, FreedomBox automatically updates once a day." msgid "When enabled, diagnostic checks will run once a day." -msgstr "" -"Когато е отметнато, FreedomBox автоматично ще се обновява веднъж дневно." +msgstr "Когато е отметнато, ще се извършва диагностика всеки ден." #: modules/diagnostics/forms.py:15 -#, fuzzy -#| msgid "Enable damage" msgid "Enable automatic repair" -msgstr "Получаване на щети" +msgstr "Включване на автоматична поправка" #: modules/diagnostics/forms.py:16 msgid "If issues are found, try to repair them automatically." -msgstr "" +msgstr "Ако бъдат открити проблеми бъде правен опит за отстраняване." #: modules/diagnostics/templates/diagnostics.html:11 -#, fuzzy -#| msgid "Diagnostics" msgid "Diagnostics Run" -msgstr "Диагностика" +msgstr "Диагностициране" #: modules/diagnostics/templates/diagnostics.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Run Diagnostics Now" -msgstr "Диагностика" +msgstr "Диагностициране сега" #: modules/diagnostics/templates/diagnostics.html:22 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Резултати" +msgstr "Преглед на резултатите" #: modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" @@ -1588,10 +1567,8 @@ msgid "Run Diagnostics" msgstr "Диагностика" #: modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Диагностика" +msgstr "Повторно диагностициране" #: modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" @@ -1602,19 +1579,15 @@ msgid "Results" msgstr "Резултати" #: modules/diagnostics/templates/diagnostics_full.html:38 -#, fuzzy, python-format -#| msgid "" -#| "\n" -#| " App: %(app_name)s\n" -#| " " +#, python-format msgid "" "\n" " App: %(app_name)s\n" " " msgstr "" "\n" -" Приложение: %(app_name)s\n" -" " +" Приложение: %(app_name)s\n" +" " #: modules/diagnostics/templates/diagnostics_results.html:11 msgid "Test" @@ -3003,10 +2976,8 @@ msgid "Offline Wikipedia" msgstr "" #: 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" #: modules/kiwix/forms.py:25 #, python-brace-format @@ -3022,16 +2993,13 @@ msgid "You have %(max_filesize)s of free disk space available." msgstr "" #: modules/kiwix/templates/kiwix-add-package.html:36 -#, fuzzy -#| msgid "Upload file" msgid "Upload ZIM file" -msgstr "Качване на файл" +msgstr "Качване на ZIM файл" #: modules/kiwix/templates/kiwix-delete-package.html:11 -#, fuzzy, python-format -#| msgid "Uninstall App %(app_name)s?" +#, python-format msgid "Delete content package %(name)s" -msgstr "Премахване на приложението %(app_name)s?" +msgstr "Премахване на пакета със съдържание %(name)s" #: modules/kiwix/templates/kiwix-delete-package.html:17 msgid "" @@ -3048,20 +3016,17 @@ msgid "Add a content package" msgstr "" #: modules/kiwix/templates/kiwix.html:17 -#, fuzzy -#| msgid "Package" msgid "Add Package" -msgstr "Пакет" +msgstr "Добавяне на пакет" #: modules/kiwix/templates/kiwix.html:24 msgid "No content packages available." msgstr "" #: modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete Archive %(name)s" +#, python-format msgid "Delete package %(title)s" -msgstr "Премахване на архива %(name)s" +msgstr "Премахване на пакета %(title)s" #: modules/kiwix/views.py:49 msgid "Content package added." @@ -3072,10 +3037,8 @@ msgid "Add a new content package" msgstr "" #: modules/kiwix/views.py:83 -#, fuzzy -#| msgid "Failed to add user to group." msgid "Failed to add content package." -msgstr "Потребителят не е добавен към групата." +msgstr "Грешка при добавяне на пакет със съдържание." #: modules/letsencrypt/__init__.py:27 #, python-brace-format @@ -4819,27 +4782,21 @@ msgid "" msgstr "" #: modules/nextcloud/__init__.py:40 -#, fuzzy -#| msgid "Uninstalling an app is an exprimental feature." msgid "This app is experimental." -msgstr "Премахването на приложения е експериментална възможност." +msgstr "Приложението е експериментално." #: modules/nextcloud/__init__.py:58 modules/nextcloud/manifest.py:11 #: modules/nextcloud/manifest.py:18 -#, fuzzy -#| msgid "Next" msgid "Nextcloud" -msgstr "Напред" +msgstr "Nextcloud" #: modules/nextcloud/__init__.py:60 msgid "File Storage & Collaboration" msgstr "" #: modules/nextcloud/forms.py:19 -#, fuzzy -#| msgid "Hostname set" msgid "Not set" -msgstr "Името на хоста е зададено" +msgstr "Не е зададено" #: modules/nextcloud/forms.py:26 msgid "Override domain" @@ -4853,25 +4810,17 @@ msgid "" msgstr "" #: modules/nextcloud/forms.py:33 -#, fuzzy -#| msgid "Administrator Account" msgid "Administrator password" -msgstr "Профил на администратора" +msgstr "Парола на администратора" #: modules/nextcloud/forms.py:34 -#, fuzzy -#| msgid "" -#| "Set a new password for MediaWiki's administrator account (admin). The " -#| "password cannot be a common one and the minimum required length is " -#| "10 characters. Leave this field blank to keep the " -#| "current password." msgid "" "Optional. Set a new password for Nextcloud's administrator account " "(nextcloud-admin). The password cannot be a common one and the minimum " "required length is 10 characters. Leave this field blank to " "keep the current password." msgstr "" -"Задайте нова парола за администратора на MediaWiki (admin). Не избирайте " +"По желание. Задайте нова парола за администратора на Nextcloud. Не избирайте " "често срещана парола, минималната дължина е 10 знака . " "Оставете полето празно, за да запазите текущата парола." @@ -4886,10 +4835,8 @@ msgid "" msgstr "" #: modules/nextcloud/views.py:53 -#, fuzzy -#| msgid "Password update failed. Please choose a stronger password" msgid "Password update failed. Please choose a stronger password." -msgstr "Паролата не е променена. Изберете по-сложна парола" +msgstr "Паролата не е променена. Изберете по-сложна парола." #: modules/openvpn/__init__.py:20 #, python-brace-format @@ -6211,20 +6158,16 @@ msgid "Created snapshot." msgstr "" #: modules/snapshot/views.py:160 -#, fuzzy -#| msgid "Configuration updated." msgid "Configuration update failed." -msgstr "Настройките са променени." +msgstr "Грешка при промяна на настройките." #: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" #: modules/snapshot/views.py:186 -#, fuzzy -#| msgid "Deleting LDAP user failed." msgid "Deleting snapshot failed." -msgstr "Потребителят на LDAP не е премахнат." +msgstr "Грешка при премахване на моментна снимка." #: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." @@ -6454,10 +6397,8 @@ msgid "Read-only root filesystem" msgstr "" #: modules/storage/__init__.py:392 -#, fuzzy -#| msgid "Power" msgid "Go to Power" -msgstr "Захранване" +msgstr "Към Захранване" #: modules/storage/forms.py:63 msgid "Invalid directory name." @@ -7872,10 +7813,9 @@ msgid "Finished: {name}" msgstr "Готово: {name}" #: package.py:206 -#, fuzzy, python-brace-format -#| msgid "Package {expression} is not available for install" +#, python-brace-format msgid "Package {package_expression} is not available for install" -msgstr "Пакетът „{expression}“ е недостъпен за инсталиране" +msgstr "Пакетът „{package_expression}“ е недостъпен за инсталиране" #: package.py:226 #, python-brace-format @@ -7917,10 +7857,9 @@ msgid "Error installing app: {error}" msgstr "Грешка при инсталиране на приложението: {error}" #: setup.py:81 setup.py:167 -#, fuzzy, python-brace-format -#| msgid "Error updating app: {error}" +#, python-brace-format msgid "Error repairing app: {error}" -msgstr "Грешка при обновяване на приложението: {error}" +msgstr "Грешка при поправка на приложението: {error}" #: setup.py:84 #, python-brace-format @@ -7936,16 +7875,13 @@ msgid "App updated" msgstr "Приложението е обновено" #: setup.py:115 -#, fuzzy -#| msgid "Updating app" msgid "Repairing app" -msgstr "Обновяване на приложение" +msgstr "Поправяне на приложение" #: setup.py:146 -#, fuzzy, python-brace-format -#| msgid "Error uninstalling app: {error}" +#, python-brace-format msgid "Error running diagnostics: {error}" -msgstr "Грешка при премахване на приложението: {error}" +msgstr "Грешка при диагностициране: {error}" #: setup.py:159 msgid "Skipping repair, no failed checks" @@ -7956,10 +7892,8 @@ msgid "Re-running setup to complete repairs" msgstr "" #: setup.py:181 -#, fuzzy -#| msgid "App updated" msgid "App repaired." -msgstr "Приложението е обновено" +msgstr "Приложението е поправено." #: setup.py:185 msgid "App repair completed with errors:\n" @@ -8144,10 +8078,8 @@ msgid "RPM:" msgstr "RPM:" #: templates/error.html:10 -#, fuzzy -#| msgid "error" msgid "Error" -msgstr "грешка" +msgstr "Грешка" #: templates/first_setup.html:18 #, python-format From 0b58a397588b21bdecfc0402ab111589f029a0c1 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Thu, 4 Jul 2024 13:19:34 +0530 Subject: [PATCH 02/20] miniflux: Add new app [sunil's changes] - Add copyright information the logo. - Deluge: undo an unintended change. - Drop wrapper calls over privileged methods. The new privileged method decorators make is easy to avoid these. - Styling updates: docstrings, single quotes for strings, casing for UI strings. - Drop "DO NOT EDIT" comment for files located in /usr as they are not expected to be editable by the user. - Fix 'miniflux' to 'Miniflux' in web client name. - Overwrite FreedomBox settings onto the existing configuration file when setup is re-run. This is to ensure that FreedomBox settings take priority. - Use return value of the miniflux command to raise errors. - Use pathlib module where possible. - Move message parsing into the privileged module from views module. - Resize SVG and PNG logo files for consistency with icon styling. - Use hypens instead of underscores in URLs and Django URL names. - Rename miniflux_configure.html to miniflux.html. - Use base method for minor simplification in backup functional test. Ensure that the test can be run independently when other tests are not run. - Update tests to reflect code changes. - Avoid concatenating internationalized strings so that they can be translated properly. Signed-off-by: Joseph Nuthalapati Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- debian/control | 2 + debian/copyright | 6 + plinth/modules/miniflux/__init__.py | 115 ++++++++++++ .../system/miniflux.service.d/freedombox.conf | 6 + .../conf-available/miniflux-freedombox.conf | 20 +++ .../share/freedombox/modules-enabled/miniflux | 1 + plinth/modules/miniflux/forms.py | 33 ++++ plinth/modules/miniflux/manifest.py | 27 +++ plinth/modules/miniflux/privileged.py | 160 +++++++++++++++++ .../miniflux/static/icons/miniflux.png | Bin 0 -> 3886 bytes .../miniflux/static/icons/miniflux.svg | 57 ++++++ .../modules/miniflux/templates/miniflux.html | 32 ++++ plinth/modules/miniflux/tests/__init__.py | 0 .../modules/miniflux/tests/test_functional.py | 134 ++++++++++++++ plinth/modules/miniflux/tests/test_views.py | 166 ++++++++++++++++++ plinth/modules/miniflux/urls.py | 14 ++ plinth/modules/miniflux/views.py | 88 ++++++++++ 17 files changed, 861 insertions(+) create mode 100644 plinth/modules/miniflux/__init__.py create mode 100644 plinth/modules/miniflux/data/usr/lib/systemd/system/miniflux.service.d/freedombox.conf create mode 100644 plinth/modules/miniflux/data/usr/share/freedombox/etc/apache2/conf-available/miniflux-freedombox.conf create mode 100644 plinth/modules/miniflux/data/usr/share/freedombox/modules-enabled/miniflux create mode 100644 plinth/modules/miniflux/forms.py create mode 100644 plinth/modules/miniflux/manifest.py create mode 100644 plinth/modules/miniflux/privileged.py create mode 100644 plinth/modules/miniflux/static/icons/miniflux.png create mode 100644 plinth/modules/miniflux/static/icons/miniflux.svg create mode 100644 plinth/modules/miniflux/templates/miniflux.html create mode 100644 plinth/modules/miniflux/tests/__init__.py create mode 100644 plinth/modules/miniflux/tests/test_functional.py create mode 100644 plinth/modules/miniflux/tests/test_views.py create mode 100644 plinth/modules/miniflux/urls.py create mode 100644 plinth/modules/miniflux/views.py diff --git a/debian/control b/debian/control index 1a4c3a4a1..6801a41a5 100644 --- a/debian/control +++ b/debian/control @@ -41,6 +41,7 @@ Build-Depends: python3-openssl, python3-pampy, python3-paramiko, + python3-pexpect, python3-pip, python3-psutil, python3-pytest, @@ -126,6 +127,7 @@ Depends: python3-markupsafe, python3-pampy, python3-paramiko, + python3-pexpect, python3-psutil, python3-requests, python3-ruamel.yaml, diff --git a/debian/copyright b/debian/copyright index dcf0cbb39..bb756b6ff 100644 --- a/debian/copyright +++ b/debian/copyright @@ -164,6 +164,12 @@ Copyright: 2015 Calinou, Nils Dagsson Moskopp Comment: https://github.com/minetest/minetest/blob/master/misc/minetest.svg License: CC-BY-SA-3.0 +Files: plinth/modules/miniflux/static/icons/miniflux.png + plinth/modules/miniflux/static/icons/miniflux.svg +Copyright: 2018, 2019 Frédéric Guillot +Comment: https://github.com/miniflux/logo +License: CC-BY-SA-4.0 + Files: plinth/modules/mumble/static/icons/mumble.png Copyright: 2009 Martin Skilnand Comment: https://commons.wikimedia.org/wiki/File:Icons_mumble.svg diff --git a/plinth/modules/miniflux/__init__.py b/plinth/modules/miniflux/__init__.py new file mode 100644 index 000000000..97d691c4f --- /dev/null +++ b/plinth/modules/miniflux/__init__.py @@ -0,0 +1,115 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""FreedomBox app for Miniflux.""" + +from django.utils.translation import gettext_lazy as _ + +from plinth import app as app_module +from plinth import frontpage, menu +from plinth.config import DropinConfigs +from plinth.daemon import Daemon +from plinth.modules.apache.components import Webserver +from plinth.modules.backups.components import BackupRestore +from plinth.modules.firewall.components import Firewall +from plinth.package import Packages + +from . import manifest, privileged + +_description = [ + _('Miniflux is a web-based tool that aggregates news and blog updates from' + ' various websites into one centralized, easy-to-read format. It has a ' + 'simple interface and focuses on a distraction-free reading experience. ' + 'You can can subscribe to your favorite sites and access full article ' + 'contents within the reader itself.'), + _('Key features include keyboard shortcuts for quick navigation, full-text' + ' search, filtering articles, categories and favorites. Miniflux ' + 'preserves user privacy by removing trackers. The primary interface is ' + 'web-based. There are several third-party ' + 'clients as well.'), +] + + +class MinifluxApp(app_module.App): + """FreedomBox app for Miniflux.""" + + app_id = 'miniflux' + + _version = 1 + + def __init__(self): + """Create components for the app.""" + super().__init__() + + info = app_module.Info(self.app_id, self._version, name=_('Miniflux'), + icon_filename='miniflux', + short_description=_('News Feed Reader'), + description=_description, + manual_page='miniflux', + clients=manifest.clients, + donation_url='https://miniflux.app/#donations') + self.add(info) + + menu_item = menu.Menu('menu-miniflux', info.name, + info.short_description, info.icon_filename, + 'miniflux:index', parent_url_name='apps') + self.add(menu_item) + + shortcut = frontpage.Shortcut('shortcut-miniflux', info.name, + info.short_description, + info.icon_filename, url='/miniflux', + clients=manifest.clients, + login_required=True) + self.add(shortcut) + + packages = Packages('packages-miniflux', [ + 'miniflux', + 'postgresql', + 'postgresql-contrib', + ]) + self.add(packages) + + drop_in_configs = DropinConfigs( + 'dropin-configs-miniflux', + ['/etc/apache2/conf-available/miniflux-freedombox.conf']) + self.add(drop_in_configs) + + firewall = Firewall('firewall-miniflux', info.name, + ports=['http', 'https'], is_external=True) + self.add(firewall) + + webserver = Webserver('webserver-miniflux', 'miniflux-freedombox', + urls=['https://{host}/miniflux/']) + self.add(webserver) + + daemon = Daemon('daemon-miniflux', 'miniflux', + listen_ports=[(8788, 'tcp4'), (8788, 'tcp6')]) + self.add(daemon) + + backup_restore = MinifluxBackupRestore('backup-restore-miniflux', + **manifest.backup) + self.add(backup_restore) + + def setup(self, old_version=None): + """Install and configure the app.""" + privileged.pre_setup() + super().setup(old_version) + if not old_version: + self.enable() + + def uninstall(self): + """De-configure and uninstall the app.""" + privileged.uninstall() + super().uninstall() + + +class MinifluxBackupRestore(BackupRestore): + """Component to backup/restore Miniflux.""" + + def backup_pre(self, packet): + """Save database contents.""" + super().backup_pre(packet) + privileged.dump_database() + + def restore_post(self, packet): + """Restore database contents.""" + super().restore_post(packet) + privileged.restore_database() diff --git a/plinth/modules/miniflux/data/usr/lib/systemd/system/miniflux.service.d/freedombox.conf b/plinth/modules/miniflux/data/usr/lib/systemd/system/miniflux.service.d/freedombox.conf new file mode 100644 index 000000000..053d7d6d5 --- /dev/null +++ b/plinth/modules/miniflux/data/usr/lib/systemd/system/miniflux.service.d/freedombox.conf @@ -0,0 +1,6 @@ +# FreedomBox configuration file stores both static settings and user +# preferences. These settings are loaded as environment variables. Hence, they +# take precedence, overriding the settings in miniflux.conf. + +[Service] +EnvironmentFile=/etc/miniflux/freedombox.conf diff --git a/plinth/modules/miniflux/data/usr/share/freedombox/etc/apache2/conf-available/miniflux-freedombox.conf b/plinth/modules/miniflux/data/usr/share/freedombox/etc/apache2/conf-available/miniflux-freedombox.conf new file mode 100644 index 000000000..8c0ec733f --- /dev/null +++ b/plinth/modules/miniflux/data/usr/share/freedombox/etc/apache2/conf-available/miniflux-freedombox.conf @@ -0,0 +1,20 @@ +## +## On all sites, provide miniflux web interface on a path: /miniflux +## + +# Redirect /miniflux to /miniflux/ as the miniflux server does not +# work without a slash at the end. + + + + RewriteEngine On + RewriteCond %{REQUEST_URI} ^/miniflux$ + RewriteRule .* /miniflux/ [R=301,L] + + + + + ProxyPreserveHost On + ProxyPass http://localhost:8788/miniflux/ + ProxyPassReverse http://localhost:8788/miniflux/ + diff --git a/plinth/modules/miniflux/data/usr/share/freedombox/modules-enabled/miniflux b/plinth/modules/miniflux/data/usr/share/freedombox/modules-enabled/miniflux new file mode 100644 index 000000000..e4c51f9d0 --- /dev/null +++ b/plinth/modules/miniflux/data/usr/share/freedombox/modules-enabled/miniflux @@ -0,0 +1 @@ +plinth.modules.miniflux diff --git a/plinth/modules/miniflux/forms.py b/plinth/modules/miniflux/forms.py new file mode 100644 index 000000000..0fc464d96 --- /dev/null +++ b/plinth/modules/miniflux/forms.py @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later + +from django import forms +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ + + +class UserCredentialsForm(forms.Form): + """Form to create admin user or change a user's password.""" + + username = forms.CharField(label=_('Username'), + help_text=_('Enter a username for the user.')) + password = forms.CharField( + label=_('Password'), widget=forms.PasswordInput, min_length=6, + strip=False, + help_text=_('Enter a strong password with a minimum of 6 characters.')) + password_confirmation = forms.CharField( + label=_('Password confirmation'), widget=forms.PasswordInput, + min_length=6, strip=False, + help_text=_('Enter the same password for confirmation.')) + + def clean(self): + """Raise error if passwords don't match.""" + cleaned_data = super().clean() + password = self.cleaned_data.get('password') + password_confirmation = self.cleaned_data.get('password_confirmation') + + if password and password_confirmation and (password + != password_confirmation): + self.add_error('password_confirmation', + ValidationError(_('Passwords do not match.'))) + + return cleaned_data diff --git a/plinth/modules/miniflux/manifest.py b/plinth/modules/miniflux/manifest.py new file mode 100644 index 000000000..6769ea111 --- /dev/null +++ b/plinth/modules/miniflux/manifest.py @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Application manifest for miniflux.""" + +from django.utils.translation import gettext_lazy as _ + +clients = [{ + 'name': _('Miniflux'), + 'platforms': [{ + 'type': 'web', + 'url': '/miniflux/' + }] +}] + +backup = { + 'config': { + 'files': [ + '/etc/miniflux/freedombox.conf', + '/var/lib/plinth/backups-data/miniflux-database.sql', + ], + }, + 'secrets': { + 'files': [ + '/etc/miniflux/database', '/etc/dbconfig-common/miniflux.conf' + ] + }, + 'services': ['miniflux'] +} diff --git a/plinth/modules/miniflux/privileged.py b/plinth/modules/miniflux/privileged.py new file mode 100644 index 000000000..3b7f93426 --- /dev/null +++ b/plinth/modules/miniflux/privileged.py @@ -0,0 +1,160 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Configuration helper for Miniflux feed reader.""" + +import json +import os +import pathlib +import subprocess +from typing import Dict +from urllib.parse import urlparse + +import pexpect + +from plinth import action_utils +from plinth.actions import privileged +from plinth.utils import is_non_empty_file + +STATIC_SETTINGS = { + 'BASE_URL': 'http://localhost/miniflux/', + 'RUN_MIGRATIONS': 1, + 'PORT': 8788 +} + +ENV_VARS_FILE = '/etc/miniflux/freedombox.conf' +DATABASE_FILE = '/etc/miniflux/database' +DB_BACKUP_FILE = '/var/lib/plinth/backups-data/miniflux-database.sql' + + +def _dict_to_env_file(dictionary: Dict) -> str: + """Write a dictionary into a systemd environment file format.""" + return "\n".join((f"{k}={v}" for k, v in dictionary.items())) + + +def _env_file_to_dict(env_vars: str) -> Dict: + """Return systemd environtment variables as a dictionary.""" + return { + line.split('=')[0]: line.split('=')[1].strip() + for line in env_vars.splitlines() + if line.strip() and not line.strip().startswith('#') + } + + +@privileged +def pre_setup(): + """Perform post-install actions for Miniflux.""" + vars_file = pathlib.Path(ENV_VARS_FILE) + vars_file.parent.mkdir(parents=True, exist_ok=True) + + existing_settings = {} + if is_non_empty_file(ENV_VARS_FILE): + # Any comments in the file will be dropped. + existing_settings = _env_file_to_dict(vars_file.read_text()) + + new_settings = existing_settings | STATIC_SETTINGS + vars_file.write_text(_dict_to_env_file(new_settings)) + + +def _run_miniflux_intreractively(command: str, username: str, + password: str) -> str: + """Fill interactive terminal prompt for username and password.""" + args = ['-c', '/etc/miniflux/miniflux.conf', command] + child = pexpect.spawn('miniflux', args, env={'LOG_FORMAT': 'json'}) + + # The CLI is in English only. + child.expect('Enter Username: ') + child.sendline(username) + + child.expect('Enter Password: ') + child.sendline(password) + + child.expect(pexpect.EOF) + status = child.before.decode() + + child.close() + if not os.WIFEXITED(child.exitstatus): + try: + status = json.loads(status)['msg'] + except (KeyError, json.JSONDecodeError): + pass + + raise Exception(status) + + +@privileged +def create_admin_user(username: str, password: str): + """Create a new admin user for Miniflux CLI. + + Raise exception if a user with the name already exists or otherwise fails. + """ + _run_miniflux_intreractively('--create-admin', username, password) + + +@privileged +def reset_user_password(username: str, password: str): + """Reset a user password using Miniflux CLI. + + Raise exception if the user does not exist or otherwise fails. + """ + _run_miniflux_intreractively('--reset-password', username, password) + + +@privileged +def uninstall(): + """Ensure that the database is removed.""" + action_utils.debconf_set_selections( + ['miniflux miniflux/purge boolean true']) + + +def _get_database_config(): + """Retrieve database credentials.""" + db_connection_string = pathlib.Path(DATABASE_FILE).read_text().strip() + parsed_url = urlparse(db_connection_string) + return { + 'user': parsed_url.username, + 'password': parsed_url.password, + 'database': parsed_url.path.lstrip('/'), + 'host': parsed_url.hostname, + } + + +# The following 3 methods are duplicated in tt-rss/privileged.py + + +def _run_as_postgres(command, stdin=None, stdout=None): + """Run a command as postgres user.""" + command = ['sudo', '--user', 'postgres'] + command + return subprocess.run(command, stdin=stdin, stdout=stdout, check=True) + + +@privileged +def dump_database(): + """Dump database to file.""" + config = _get_database_config() + os.makedirs(os.path.dirname(DB_BACKUP_FILE), exist_ok=True) + with open(DB_BACKUP_FILE, 'w', encoding='utf-8') as db_backup_file: + process = _run_as_postgres(['pg_dumpall', '--roles-only'], + stdout=subprocess.PIPE) + db_backup_file.write(f'DROP ROLE IF EXISTS {config["user"]};\n') + for line in process.stdout.decode().splitlines(): + if config['user'] in line: + db_backup_file.write(line + '\n') + + with open(DB_BACKUP_FILE, 'a', encoding='utf-8') as db_backup_file: + _run_as_postgres([ + 'pg_dump', '--create', '--clean', '--if-exists', config['database'] + ], stdout=db_backup_file) + + +@privileged +def restore_database(): + """Restore database from file.""" + config = _get_database_config() + + # This is needed for old backups only. New backups include 'DROP DATABASE + # IF EXISTS' and 'CREATE DATABASE' statements. + _run_as_postgres(['dropdb', config['database']]) + _run_as_postgres(['createdb', config['database']]) + + with open(DB_BACKUP_FILE, 'r', encoding='utf-8') as db_restore_file: + _run_as_postgres(['psql', '--dbname', config['database']], + stdin=db_restore_file) diff --git a/plinth/modules/miniflux/static/icons/miniflux.png b/plinth/modules/miniflux/static/icons/miniflux.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce9ecfd0a1409084442e0cd4bfbd1e17b185997 GIT binary patch literal 3886 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 literal 0 HcmV?d00001 diff --git a/plinth/modules/miniflux/static/icons/miniflux.svg b/plinth/modules/miniflux/static/icons/miniflux.svg new file mode 100644 index 000000000..fd755f388 --- /dev/null +++ b/plinth/modules/miniflux/static/icons/miniflux.svg @@ -0,0 +1,57 @@ + + + + + icon + + + + + icon + + + + diff --git a/plinth/modules/miniflux/templates/miniflux.html b/plinth/modules/miniflux/templates/miniflux.html new file mode 100644 index 000000000..572d45035 --- /dev/null +++ b/plinth/modules/miniflux/templates/miniflux.html @@ -0,0 +1,32 @@ +{% extends "app.html" %} +{% comment %} +# SPDX-License-Identifier: AGPL-3.0-or-later +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block configuration %} + {{ block.super }} + +

{% trans "Configuration" %}

+

+ {% blocktrans trimmed %} + Create an admin user to get started. Other users can be created from + within Miniflux. + {% endblocktrans %} +

+ + +{% endblock %} diff --git a/plinth/modules/miniflux/tests/__init__.py b/plinth/modules/miniflux/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/miniflux/tests/test_functional.py b/plinth/modules/miniflux/tests/test_functional.py new file mode 100644 index 000000000..db7eaaa09 --- /dev/null +++ b/plinth/modules/miniflux/tests/test_functional.py @@ -0,0 +1,134 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for Miniflux app. +""" + +import pytest + +from plinth.tests import functional + +pytestmark = [pytest.mark.apps, pytest.mark.miniflux] + +ADMIN_USERNAME = 'admin' +ADMIN_PASSWORD = 'str0ngp@$$word' +ADMIN_PASSWORD_NEW = 'str0ngERp@$$word' + +CREDENTIALS = {'username': 'admin', 'password': ADMIN_PASSWORD} + + +class TestMinifluxApp(functional.BaseAppTests): + """Class to customize basic app tests for Miniflux.""" + + app_name = 'miniflux' + has_service = True + has_web = True + + @pytest.fixture(name='create_admin_user') + def fixture_create_admin_user(self, session_browser): + """Create an admin user for Miniflux.""" + functional.app_enable(session_browser, self.app_name) + _create_admin_user(session_browser) + + def test_create_miniflux_admin_user(self, session_browser, + create_admin_user): + """Test creating an admin user.""" + _miniflux_login(session_browser) + # Verify that this user can see admin settings + with functional.wait_for_page_update(session_browser): + session_browser.links.find_by_href( + '/miniflux/settings').first.click() + + assert not session_browser.links.find_by_href( + '/miniflux/users').is_empty() + + def test_reset_miniflux_user_password(self, session_browser, + create_admin_user): + """Test Miniflux user password reset.""" + CREDENTIALS['password'] = ADMIN_PASSWORD_NEW + _reset_user_password(session_browser) + _miniflux_login(session_browser) + assert not session_browser.links.find_by_href( + '/miniflux/unread').is_empty() + + @pytest.mark.backups + def test_backup_restore(self, session_browser, create_admin_user): + """Test backup and restore of app data.""" + _subscribe(session_browser, 'https://planet.debian.org/atom.xml') + super().test_backup_restore(session_browser) + assert _is_subscribed(session_browser, 'Planet Debian') + + +def _fill_credentials_form(browser, href): + """Fill the user credentials form in Miniflux app.""" + functional.nav_to_module(browser, 'miniflux') + with functional.wait_for_page_update(browser): + browser.links.find_by_href( + f'/plinth/apps/miniflux/{href}/').first.click() + + browser.fill('miniflux-username', CREDENTIALS['username']) + browser.fill('miniflux-password', CREDENTIALS['password']) + browser.fill('miniflux-password_confirmation', CREDENTIALS['password']) + functional.submit(browser, form_class='form-miniflux') + + +def _create_admin_user(browser): + """Create Miniflux admin user.""" + _fill_credentials_form(browser, 'create-admin-user') + + +def _open_miniflux_app(browser): + """Load the web interface of Miniflux.""" + functional.visit(browser, '/miniflux/') + main = browser.find_by_id('main') + functional.eventually(lambda: main.visible) + + +def _miniflux_logout(browser): + """Attempt to log out of Miniflux app. Doesn't fail if not logged in.""" + _open_miniflux_app(browser) + maybe_logout_button = browser.links.find_by_href('/miniflux/logout') + if not maybe_logout_button.is_empty(): + with functional.wait_for_page_update(browser): + maybe_logout_button.first.click() + + +def _miniflux_submit(browser): + """Perform the Submit action in Miniflux forms.""" + functional.submit(browser, + element=browser.find_by_css('button[type="submit"]')) + + +def _miniflux_login(browser): + """Login to miniflux with the given credentials.""" + _open_miniflux_app(browser) + _miniflux_logout(browser) + browser.find_by_id('form-username').fill(CREDENTIALS['username']) + browser.find_by_id('form-password').fill(CREDENTIALS['password']) + _miniflux_submit(browser) + + +def _reset_user_password(browser): + """Reset a Miniflux user's password from FreedomBox web interface.""" + _fill_credentials_form(browser, 'reset-user-password') + + +def _subscribe(browser, feed_url): + """Subscribe to a feed in Miniflux.""" + _open_miniflux_app(browser) + _miniflux_login(browser) + with functional.wait_for_page_update(browser): + browser.links.find_by_href('/miniflux/subscribe').first.click() + + with functional.wait_for_page_update(browser): + browser.find_by_id('form-url').fill(feed_url) + _miniflux_submit(browser) + + +def _is_subscribed(browser, feed_name): + """Check if the user is subscribed to a feed.""" + _open_miniflux_app(browser) + _miniflux_login(browser) + with functional.wait_for_page_update(browser): + browser.links.find_by_href('/miniflux/feeds').first.click() + + return browser.is_text_present(feed_name) diff --git a/plinth/modules/miniflux/tests/test_views.py b/plinth/modules/miniflux/tests/test_views.py new file mode 100644 index 000000000..131f03e87 --- /dev/null +++ b/plinth/modules/miniflux/tests/test_views.py @@ -0,0 +1,166 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Tests for Miniflux views.""" + +from unittest.mock import patch + +import pytest +from django import urls +from django.contrib.messages.storage.fallback import FallbackStorage + +from plinth import module_loader +from plinth.modules.miniflux import views + +# For all tests, use plinth.urls instead of urls configured for testing +pytestmark = pytest.mark.urls('plinth.urls') + + +@pytest.fixture(autouse=True, scope='module') +def fixture_miniflux_urls(): + """Make sure Miniflux app's URLs are part of plinth.urls.""" + with patch('plinth.module_loader._modules_to_load', new=[]) as modules, \ + patch('plinth.urls.urlpatterns', new=[]): + modules.append('plinth.modules.miniflux') + module_loader.include_urls() + yield + + +def make_request(request, view, **kwargs): + """Make request with a message storage.""" + setattr(request, 'session', 'session') + messages = FallbackStorage(request) + setattr(request, '_messages', messages) + response = view(request, **kwargs) + + return response, messages + + +########################## +# Create Admin User view # +########################## + + +def test_create_admin_user_view(rf): + """Test that the create admin user view loads successfully.""" + request = rf.get(urls.reverse('miniflux:create-admin-user')) + view = views.CreateAdminUserView.as_view() + response, _ = make_request(request, view) + + assert response.status_code == 200 + + +@patch('plinth.modules.miniflux.privileged.create_admin_user') +def test_create_admin_user_form_valid(create_admin_user, rf): + """Test that the create admin user form is valid and redirects.""" + form_data = { + 'miniflux-username': 'admin', + 'miniflux-password': 'strongpassword', + 'miniflux-password_confirmation': 'strongpassword' + } + request = rf.post(urls.reverse('miniflux:create-admin-user'), + data=form_data) + view = views.CreateAdminUserView.as_view() + response, messages = make_request(request, view) + + assert response.status_code == 302 + assert list(messages)[0].message == 'Created admin user: admin' + + +def test_passwords_do_not_match(rf): + """Test that the form shows an error when passwords do not match.""" + form_data = { + 'miniflux-username': 'admin', + 'miniflux-password': 'strongpassword', + 'miniflux-password_confirmation': 'weakpassword' + } + request = rf.post(urls.reverse('miniflux:create-admin-user'), + data=form_data) + view = views.CreateAdminUserView.as_view() + response, messages = make_request(request, view) + + assert response.status_code == 200 + assert response.context_data['form'].errors['password_confirmation'][ + 0] == 'Passwords do not match.' + + +def test_password_too_short(rf): + """Test that the form shows an error when the password is too short.""" + form_data = { + 'miniflux-username': 'demo', + 'miniflux-password': 'demo', + 'miniflux-password_confirmation': 'demo' + } + request = rf.post(urls.reverse('miniflux:create-admin-user'), + data=form_data) + view = views.CreateAdminUserView.as_view() + response, messages = make_request(request, view) + + assert response.status_code == 200 + assert response.context_data['form'].errors['password'][ + 0] == 'Ensure this value has at least 6 characters (it has 4).' + + +@patch('plinth.modules.miniflux.privileged.create_admin_user') +def test_recreate_existing_user(create_admin_user, rf): + """Test that trying to recreate an existing user fails.""" + create_admin_user.side_effect = Exception( + 'Skipping admin user creation because it already exists') + + form_data = { + 'miniflux-username': 'admin', + 'miniflux-password': 'strongpassword', + 'miniflux-password_confirmation': 'strongpassword' + } + request = rf.post(urls.reverse('miniflux:create-admin-user'), + data=form_data) + view = views.CreateAdminUserView.as_view() + response, messages = make_request(request, view) + + error_msg = ('An error occurred while creating the user: Skipping admin ' + 'user creation because it already exists.') + assert response.status_code == 302 + assert list(messages)[0].message == error_msg + + +############################ +# Reset User Password view # +############################ + + +@patch('plinth.modules.miniflux.privileged.reset_user_password') +def test_reset_user_password_form_valid(reset_user_password, rf): + """Test that the reset user password form is valid and redirects.""" + reset_user_password.return_value = 'Password changed!' + + form_data = { + 'miniflux-username': 'admin', + 'miniflux-password': 'strongpassword', + 'miniflux-password_confirmation': 'strongpassword' + } + request = rf.post(urls.reverse('miniflux:reset-user-password'), + data=form_data) + view = views.ResetUserPasswordView.as_view() + response, messages = make_request(request, view) + + assert response.status_code == 302 + assert list(messages)[0].message == 'Password reset for user: admin' + + +@patch('plinth.modules.miniflux.privileged.reset_user_password') +def test_reset_user_password_for_invalid_user(reset_user_password, rf): + """Test that the resetting user password for an invalid user fails.""" + reset_user_password.side_effect = Exception('user not found') + + form_data = { + 'miniflux-username': 'admin', + 'miniflux-password': 'strongpassword', + 'miniflux-password_confirmation': 'strongpassword' + } + request = rf.post(urls.reverse('miniflux:reset-user-password'), + data=form_data) + view = views.ResetUserPasswordView.as_view() + response, messages = make_request(request, view) + + assert response.status_code == 302 + assert list( + messages + )[0].message == 'An error occurred during password reset: user not found.' diff --git a/plinth/modules/miniflux/urls.py b/plinth/modules/miniflux/urls.py new file mode 100644 index 000000000..ac2017197 --- /dev/null +++ b/plinth/modules/miniflux/urls.py @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""URLs for the Miniflux module.""" + +from django.urls import re_path + +from .views import CreateAdminUserView, MinifluxAppView, ResetUserPasswordView + +urlpatterns = [ + re_path(r'^apps/miniflux/$', MinifluxAppView.as_view(), name='index'), + re_path(r'^apps/miniflux/create-admin-user/$', + CreateAdminUserView.as_view(), name='create-admin-user'), + re_path(r'^apps/miniflux/reset-user-password/$', + ResetUserPasswordView.as_view(), name='reset-user-password'), +] diff --git a/plinth/modules/miniflux/views.py b/plinth/modules/miniflux/views.py new file mode 100644 index 000000000..76c507ef9 --- /dev/null +++ b/plinth/modules/miniflux/views.py @@ -0,0 +1,88 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Django views for Miniflux.""" + +import logging + +from django.contrib import messages +from django.contrib.messages.views import SuccessMessageMixin +from django.urls import reverse_lazy +from django.utils.translation import gettext as _ +from django.views.generic.edit import FormView + +from plinth import views + +from . import privileged +from .forms import UserCredentialsForm + +logger = logging.getLogger(__name__) + + +class MinifluxAppView(views.AppView): + """Serve configuration page.""" + + app_id = 'miniflux' + template_name = 'miniflux.html' + + +class CreateAdminUserView(SuccessMessageMixin, FormView): + """View to create a new admin user.""" + + form_class = UserCredentialsForm + prefix = 'miniflux' + template_name = 'form.html' + success_url = reverse_lazy('miniflux:index') + + def get_context_data(self, **kwargs): + """Return additional context for rendering the template.""" + context = super().get_context_data(**kwargs) + context['title'] = _('Create Admin User') + return context + + def form_valid(self, form): + """Create the admin user on valid form submission.""" + username = form.cleaned_data['username'] + password = form.cleaned_data['password'] + + try: + privileged.create_admin_user(username, password) + self.success_message = _('Created admin user: {username}').format( + username=username) + except Exception as error: + messages.error( + self.request, + _('An error occurred while creating the user: {error}.'). + format(error=error)) + + return super().form_valid(form) + + +class ResetUserPasswordView(SuccessMessageMixin, FormView): + """View to reset a user password.""" + + form_class = UserCredentialsForm + prefix = 'miniflux' + template_name = 'form.html' + success_url = reverse_lazy('miniflux:index') + + def get_context_data(self, **kwargs): + """Return additional context for rendering the template.""" + context = super().get_context_data(**kwargs) + context['title'] = _('Reset User Password') + return context + + def form_valid(self, form): + """Reset password on valid form submission.""" + username = form.cleaned_data['username'] + password = form.cleaned_data['password'] + + try: + privileged.reset_user_password(username, password).strip() + self.success_message = _('Password reset for user: {username}' + ).format(username=username) + except Exception as error: + messages.error( + self.request, + _('An error occurred during password reset: {error}.').format( + error=error)) + + return super().form_valid(form) From 948f8f7e590997440271a48f49963e119789706b Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 22 Jul 2024 23:13:23 -0700 Subject: [PATCH 03/20] miniflux: Drop postgres-contrib package as it seem redundant Both postgres and postgres-contrib package seem to pull the postgres-16 package ultimately. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/miniflux/__init__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plinth/modules/miniflux/__init__.py b/plinth/modules/miniflux/__init__.py index 97d691c4f..671d6d2af 100644 --- a/plinth/modules/miniflux/__init__.py +++ b/plinth/modules/miniflux/__init__.py @@ -60,11 +60,7 @@ class MinifluxApp(app_module.App): login_required=True) self.add(shortcut) - packages = Packages('packages-miniflux', [ - 'miniflux', - 'postgresql', - 'postgresql-contrib', - ]) + packages = Packages('packages-miniflux', ['miniflux', 'postgresql']) self.add(packages) drop_in_configs = DropinConfigs( From 3501b1f1a898d3c591a6ca934e55755d25aba555 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 23 Jul 2024 00:01:34 -0700 Subject: [PATCH 04/20] miniflux: Add list of client apps from upstream clients list Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/miniflux/manifest.py | 123 ++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 7 deletions(-) diff --git a/plinth/modules/miniflux/manifest.py b/plinth/modules/miniflux/manifest.py index 6769ea111..af244b701 100644 --- a/plinth/modules/miniflux/manifest.py +++ b/plinth/modules/miniflux/manifest.py @@ -3,13 +3,122 @@ from django.utils.translation import gettext_lazy as _ -clients = [{ - 'name': _('Miniflux'), - 'platforms': [{ - 'type': 'web', - 'url': '/miniflux/' - }] -}] +from plinth.clients import store_url + +clients = [ + { + 'name': _('Miniflux'), + 'platforms': [{ + 'type': 'web', + 'url': '/miniflux/' + }] + }, + { + 'name': + _('Fluent Reader Lite'), + 'platforms': [{ + 'type': 'store', + 'os': 'android', + 'store_name': 'google-play', + 'url': store_url('google-play', 'me.hyliu.fluent_reader_lite'), + }, { + 'type': 'store', + 'os': 'ios', + 'store_name': 'app-store', + 'url': 'https://apps.apple.com/app/id1549611796', + }] + }, + { + 'name': + _('Fluent Reader'), + 'platforms': [{ + 'type': 'download', + 'os': 'windows', + 'url': 'https://github.com/yang991178/fluent-reader/releases', + }, { + 'type': 'download', + 'os': 'macos', + 'url': 'https://github.com/yang991178/fluent-reader/releases', + }] + }, + { + 'name': + _('FluxNews'), + 'platforms': [{ + 'type': 'store', + 'os': 'android', + 'store_name': 'f-droid', + 'url': store_url('f-droid', 'de.circle_dev.flux_news') + }, { + 'type': 'store', + 'os': 'android', + 'store_name': 'google-play', + 'url': store_url('google-play', 'de.circle_dev.flux_news') + }] + }, + { + 'name': + _('MiniFlutt'), + 'platforms': [{ + 'type': 'store', + 'os': 'android', + 'store_name': 'google-play', + 'url': store_url('google-play', 'be.martinelli.miniflutt') + }] + }, + { + 'name': + _('NetNewsWire'), + 'platforms': [{ + 'type': 'download', + 'os': 'macos', + 'url': 'https://netnewswire.com/', + }, { + 'type': 'store', + 'os': 'ios', + 'store_name': 'app-store', + 'url': 'https://apps.apple.com/us/app/' + 'netnewswire-rss-reader/id1480640210', + }] + }, + { + 'name': + _('Newsflash'), + 'platforms': [{ + 'type': 'download', + 'os': 'gnu-linux', + 'url': 'https://flathub.org/apps/details/' + 'io.gitlab.news_flash.NewsFlash' + }] + }, + { + 'name': + _('Read You'), + 'platforms': [{ + 'type': 'store', + 'os': 'android', + 'store_name': 'f-droid', + 'url': store_url('f-droid', 'me.ash.reader') + }] + }, + { + 'name': + _('RSS Guard'), + 'platforms': [{ + 'type': 'download', + 'os': 'gnu-linux', + 'url': 'https://github.com/martinrotter/rssguard/releases', + }, { + 'type': 'download', + 'os': 'macos', + 'url': 'https://github.com/martinrotter/rssguard/releases', + }, { + 'type': 'download', + 'os': 'windows', + 'url': 'https://github.com/martinrotter/rssguard/releases', + }] + }, +] backup = { 'config': { From 2f3e586eb6a2b16660577681d883494c57aab749 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Wed, 24 Jul 2024 14:29:49 +0530 Subject: [PATCH 05/20] miniflux: Fix regression in creating admin user - Fix typo in private method - Fix mypy errors - Fix error message formatting Signed-off-by: Joseph Nuthalapati --- plinth/modules/miniflux/privileged.py | 38 ++++++++++++++++++--------- plinth/modules/miniflux/views.py | 2 +- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/plinth/modules/miniflux/privileged.py b/plinth/modules/miniflux/privileged.py index 3b7f93426..26e0a249f 100644 --- a/plinth/modules/miniflux/privileged.py +++ b/plinth/modules/miniflux/privileged.py @@ -5,7 +5,7 @@ import json import os import pathlib import subprocess -from typing import Dict +from typing import Any, Dict, Tuple from urllib.parse import urlparse import pexpect @@ -54,11 +54,12 @@ def pre_setup(): vars_file.write_text(_dict_to_env_file(new_settings)) -def _run_miniflux_intreractively(command: str, username: str, - password: str) -> str: +def _run_miniflux_interactively(command: str, username: str, + password: str) -> Tuple[Any, Any]: """Fill interactive terminal prompt for username and password.""" args = ['-c', '/etc/miniflux/miniflux.conf', command] - child = pexpect.spawn('miniflux', args, env={'LOG_FORMAT': 'json'}) + os.environ['LOG_FORMAT'] = 'json' + child = pexpect.spawn('miniflux', args, env=os.environ) # The CLI is in English only. child.expect('Enter Username: ') @@ -71,13 +72,7 @@ def _run_miniflux_intreractively(command: str, username: str, status = child.before.decode() child.close() - if not os.WIFEXITED(child.exitstatus): - try: - status = json.loads(status)['msg'] - except (KeyError, json.JSONDecodeError): - pass - - raise Exception(status) + return (status, child.exitstatus) @privileged @@ -86,7 +81,16 @@ def create_admin_user(username: str, password: str): Raise exception if a user with the name already exists or otherwise fails. """ - _run_miniflux_intreractively('--create-admin', username, password) + status, _ = _run_miniflux_interactively('--create-admin', username, + password) + try: + log = json.loads(status) + except (KeyError, json.JSONDecodeError): + pass + + # user_id is allocated only when a new user is created successfully. + if not log.get('user_id'): + raise Exception(log['msg']) @privileged @@ -95,7 +99,15 @@ def reset_user_password(username: str, password: str): Raise exception if the user does not exist or otherwise fails. """ - _run_miniflux_intreractively('--reset-password', username, password) + status, exit_code = _run_miniflux_interactively('--reset-password', + username, password) + if not os.WIFEXITED(exit_code): + try: + status_message = json.loads(status)['msg'] + except (KeyError, json.JSONDecodeError): + pass + + raise Exception(status) @privileged diff --git a/plinth/modules/miniflux/views.py b/plinth/modules/miniflux/views.py index 76c507ef9..011470632 100644 --- a/plinth/modules/miniflux/views.py +++ b/plinth/modules/miniflux/views.py @@ -83,6 +83,6 @@ class ResetUserPasswordView(SuccessMessageMixin, FormView): messages.error( self.request, _('An error occurred during password reset: {error}.').format( - error=error)) + error=str(error).strip())) return super().form_valid(form) From 81e1b0d9cf9f96fe076f35a95b5f6f586fbd19ed Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Thu, 25 Jul 2024 22:41:33 +0530 Subject: [PATCH 06/20] miniflux: Fix error handling for reset password Signed-off-by: Joseph Nuthalapati --- plinth/modules/miniflux/privileged.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plinth/modules/miniflux/privileged.py b/plinth/modules/miniflux/privileged.py index 26e0a249f..9a6e679b0 100644 --- a/plinth/modules/miniflux/privileged.py +++ b/plinth/modules/miniflux/privileged.py @@ -104,10 +104,9 @@ def reset_user_password(username: str, password: str): if not os.WIFEXITED(exit_code): try: status_message = json.loads(status)['msg'] + raise Exception(status_message) except (KeyError, json.JSONDecodeError): - pass - - raise Exception(status) + raise Exception(status) @privileged From 79365ba2ae7e6830f870ca8e833c03cbbfb0e241 Mon Sep 17 00:00:00 2001 From: Ricky From Hong Kong Date: Thu, 25 Jul 2024 07:29:07 +0000 Subject: [PATCH 07/20] Translated using Weblate (Chinese (Traditional)) Currently translated at 23.7% (375 of 1576 strings) --- plinth/locale/zh_Hant/LC_MESSAGES/django.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index f669e127a..33822161c 100644 --- a/plinth/locale/zh_Hant/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hant/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-01 20:10-0400\n" -"PO-Revision-Date: 2024-06-03 11:47+0000\n" -"Last-Translator: Ray Kuo \n" +"PO-Revision-Date: 2024-07-26 08:09+0000\n" +"Last-Translator: Ricky From Hong Kong \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: config.py:103 #, python-brace-format @@ -397,7 +397,7 @@ msgstr "SSH 伺服器密碼" msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." -msgstr "SSH 伺服器的密碼。
採金鑰的 SSH 認證機制目前無法使用。" +msgstr "SSH 伺服器的密碼。
採金鑰的 SSH 認證機制目前無法使用。" #: modules/backups/forms.py:268 msgid "Remote backup repository already exists." From 763d9dcf7c987daa69a1d1fdda544ad81a55e566 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Fri, 26 Jul 2024 22:27:57 +0530 Subject: [PATCH 08/20] readme: Mention the AGPLv3+ license GitLab wrongly identifies the license of FreedomBox as the non-free Server Side Public License. A mention of the license in the README can be useful to clarify this. Signed-off-by: Joseph Nuthalapati Reviewed-by: Sunil Mohan Adapa --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 1886ed995..3ea73a307 100644 --- a/README.md +++ b/README.md @@ -63,3 +63,11 @@ See the [HACKING.md](https://salsa.debian.org/freedombox-team/freedombox/blob/ma # Localization [![Translation status](https://hosted.weblate.org/widgets/freedombox/-/287x66-white.png)](https://hosted.weblate.org/engage/freedombox/?utm_source=widget) + +# License + +[![GNU AGPLv3 Image](https://www.gnu.org/graphics/agplv3-155x51.png)](https://www.gnu.org/licenses/agpl-3.0.html) + +FreedomBox is distributed under the GNU Affero General Public License, Version 3 +or later. A copy of [AGPLv3](http://www.gnu.org/licenses/agpl.html) is available +from the Free Software Foundation. From fe39b91bfeb7ee6b20bc9ebe3ea0c36bf1b9ccce Mon Sep 17 00:00:00 2001 From: Ettore Atalan Date: Sat, 27 Jul 2024 21:12:52 +0000 Subject: [PATCH 09/20] Translated using Weblate (German) Currently translated at 99.6% (1570 of 1576 strings) --- plinth/locale/de/LC_MESSAGES/django.po | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index 1241d943a..59cf8a30d 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-01 20:10-0400\n" -"PO-Revision-Date: 2024-07-09 17:09+0000\n" -"Last-Translator: Dietmar \n" +"PO-Revision-Date: 2024-07-27 21:41+0000\n" +"Last-Translator: Ettore Atalan \n" "Language-Team: German \n" "Language: de\n" @@ -1599,8 +1599,6 @@ msgid "When enabled, diagnostic checks will run once a day." msgstr "Wenn aktiviert, laufen einmal täglich diagnostische Tests." #: modules/diagnostics/forms.py:15 -#, fuzzy -#| msgid "Enable auto-update" msgid "Enable automatic repair" msgstr "Automatisches Reparieren aktivieren" From cfb8c9f8c2fdc74357ac827ac05124fd2f37fe6d Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 23 Jul 2024 14:08:56 -0700 Subject: [PATCH 10/20] miniflux: Remove a spurious error message after resetting password Tests: - Reset the password of an account successfully. No error is shown. - Reset the password of a non-existent account. Error is shown. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/miniflux/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/modules/miniflux/views.py b/plinth/modules/miniflux/views.py index 011470632..68d1160d1 100644 --- a/plinth/modules/miniflux/views.py +++ b/plinth/modules/miniflux/views.py @@ -76,7 +76,7 @@ class ResetUserPasswordView(SuccessMessageMixin, FormView): password = form.cleaned_data['password'] try: - privileged.reset_user_password(username, password).strip() + privileged.reset_user_password(username, password) self.success_message = _('Password reset for user: {username}' ).format(username=username) except Exception as error: From a6167a46b01e627c6530ff22104c8920084364e2 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 23 Jul 2024 14:11:28 -0700 Subject: [PATCH 11/20] miniflux: Fix issues with running the CLI in a pseudo-terminal - Check the exitstatus and signalstatus as seen from the ptyprocess module. - Avoid accessing 'log' before is it initialized. - When creating admin user, don't expect JSON message for all other types of errors. They are simple strings. Tests: - Try to modify the password of a non-existent account. Notice the error message is shown. Modify the password of an existing account and it succeeds. - Create an account with username that already exists. Notice that error is shown. Otherwise, it succeeds. - Allow the UI to enter short passwords and notice that error is shown properly during user creation and reset password. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/miniflux/privileged.py | 42 ++++++++++++--------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/plinth/modules/miniflux/privileged.py b/plinth/modules/miniflux/privileged.py index 9a6e679b0..e08a9b5a3 100644 --- a/plinth/modules/miniflux/privileged.py +++ b/plinth/modules/miniflux/privileged.py @@ -5,7 +5,7 @@ import json import os import pathlib import subprocess -from typing import Any, Dict, Tuple +from typing import Tuple from urllib.parse import urlparse import pexpect @@ -25,12 +25,12 @@ DATABASE_FILE = '/etc/miniflux/database' DB_BACKUP_FILE = '/var/lib/plinth/backups-data/miniflux-database.sql' -def _dict_to_env_file(dictionary: Dict) -> str: +def _dict_to_env_file(dictionary: dict[str, str]) -> str: """Write a dictionary into a systemd environment file format.""" return "\n".join((f"{k}={v}" for k, v in dictionary.items())) -def _env_file_to_dict(env_vars: str) -> Dict: +def _env_file_to_dict(env_vars: str) -> dict[str, str]: """Return systemd environtment variables as a dictionary.""" return { line.split('=')[0]: line.split('=')[1].strip() @@ -55,7 +55,7 @@ def pre_setup(): def _run_miniflux_interactively(command: str, username: str, - password: str) -> Tuple[Any, Any]: + password: str) -> Tuple[str, dict]: """Fill interactive terminal prompt for username and password.""" args = ['-c', '/etc/miniflux/miniflux.conf', command] os.environ['LOG_FORMAT'] = 'json' @@ -69,10 +69,18 @@ def _run_miniflux_interactively(command: str, username: str, child.sendline(password) child.expect(pexpect.EOF) - status = child.before.decode() + raw_message = child.before.decode() + try: + json_message = json.loads(raw_message) + except (KeyError, json.JSONDecodeError): + json_message = {} child.close() - return (status, child.exitstatus) + if child.exitstatus or child.signalstatus: + message = json_message.get('msg') if json_message else raw_message + raise Exception(message) + + return raw_message, json_message @privileged @@ -81,16 +89,11 @@ def create_admin_user(username: str, password: str): Raise exception if a user with the name already exists or otherwise fails. """ - status, _ = _run_miniflux_interactively('--create-admin', username, - password) - try: - log = json.loads(status) - except (KeyError, json.JSONDecodeError): - pass - + _, json_message = _run_miniflux_interactively('--create-admin', username, + password) # user_id is allocated only when a new user is created successfully. - if not log.get('user_id'): - raise Exception(log['msg']) + if json_message and not json_message.get('user_id'): + raise Exception(json_message.get('msg')) @privileged @@ -99,14 +102,7 @@ def reset_user_password(username: str, password: str): Raise exception if the user does not exist or otherwise fails. """ - status, exit_code = _run_miniflux_interactively('--reset-password', - username, password) - if not os.WIFEXITED(exit_code): - try: - status_message = json.loads(status)['msg'] - raise Exception(status_message) - except (KeyError, json.JSONDecodeError): - raise Exception(status) + _run_miniflux_interactively('--reset-password', username, password) @privileged From a66162d69798bea79d7fea945b36c1827db2cdbd Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 24 Jul 2024 13:11:55 -0700 Subject: [PATCH 12/20] miniflux: tests: functional: Fix failing tests when run out of order - When the password is changed during the reset-password test, running other tests in a different test run fails the tests. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/miniflux/tests/test_functional.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plinth/modules/miniflux/tests/test_functional.py b/plinth/modules/miniflux/tests/test_functional.py index db7eaaa09..159c0e39f 100644 --- a/plinth/modules/miniflux/tests/test_functional.py +++ b/plinth/modules/miniflux/tests/test_functional.py @@ -74,6 +74,7 @@ def _fill_credentials_form(browser, href): def _create_admin_user(browser): """Create Miniflux admin user.""" _fill_credentials_form(browser, 'create-admin-user') + _fill_credentials_form(browser, 'reset-user-password') def _open_miniflux_app(browser): From 62b9063bc2966b48921a3e1f4b7fcfec303ae761 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Tue, 30 Jul 2024 00:11:08 +0530 Subject: [PATCH 13/20] miniflux: Trim error messages when creating user Signed-off-by: Joseph Nuthalapati --- plinth/modules/miniflux/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/modules/miniflux/views.py b/plinth/modules/miniflux/views.py index 68d1160d1..ca0408cf0 100644 --- a/plinth/modules/miniflux/views.py +++ b/plinth/modules/miniflux/views.py @@ -51,7 +51,7 @@ class CreateAdminUserView(SuccessMessageMixin, FormView): messages.error( self.request, _('An error occurred while creating the user: {error}.'). - format(error=error)) + format(error=str(error).strip())) return super().form_valid(form) From df55ba8c610beae95621b235b0d36337f5f1d669 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 23 Jul 2024 00:17:52 -0700 Subject: [PATCH 14/20] miniflux, ttrss: Factor out duplicated postgres utility methods Tests: - Run functional tests on miniflux app. - Run backup and restore on ttrss app manually and notice that data is restored and there are no errors. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/db.py | 50 +++++++++++++++++++++++++++ plinth/modules/miniflux/privileged.py | 37 +++----------------- plinth/modules/ttrss/privileged.py | 36 +++---------------- 3 files changed, 58 insertions(+), 65 deletions(-) diff --git a/plinth/db.py b/plinth/db.py index 285d1f84c..42654d75c 100644 --- a/plinth/db.py +++ b/plinth/db.py @@ -3,6 +3,8 @@ Common utilities to help with handling a database. """ +import pathlib +import subprocess import threading from typing import ClassVar @@ -83,3 +85,51 @@ class DBLock: # most of the significant cases where we have seen database lock issues. lock = DBLock() + + +# +# PostgreSQL utilites +# +def _run_as_postgres(command, stdin=None, stdout=None): + """Run a command as postgres user.""" + command = ['sudo', '--user', 'postgres'] + command + return subprocess.run(command, stdin=stdin, stdout=stdout, check=True) + + +def postgres_dump_database(backup_file: str, database_name: str, + database_user: str): + """Dump PostgreSQL database to a file. + + Overwrites file if it exists. Uses pg_dump utility from postgres package + (needs to be installed). + """ + backup_path = pathlib.Path(backup_file) + backup_path.parent.mkdir(parents=True, exist_ok=True) + with open(backup_path, 'w', encoding='utf-8') as file_handle: + process = _run_as_postgres(['pg_dumpall', '--roles-only'], + stdout=subprocess.PIPE) + file_handle.write(f'DROP ROLE IF EXISTS {database_user};\n') + for line in process.stdout.decode().splitlines(): + if database_user in line: + file_handle.write(line + '\n') + + with open(backup_path, 'a', encoding='utf-8') as file_handle: + _run_as_postgres( + ['pg_dump', '--create', '--clean', '--if-exists', database_name], + stdout=file_handle) + + +def postgres_restore_database(backup_file: str, database_name): + """Restore PostgreSQL database from a file. + + Drops database and recreates it. Uses pg_dump utility from postgres package + (needs to be installed). + """ + # This is needed for old backups only. New backups include 'DROP DATABASE + # IF EXISTS' and 'CREATE DATABASE' statements. + _run_as_postgres(['dropdb', database_name]) + _run_as_postgres(['createdb', database_name]) + + with open(backup_file, 'r', encoding='utf-8') as file_handle: + _run_as_postgres(['psql', '--dbname', database_name], + stdin=file_handle) diff --git a/plinth/modules/miniflux/privileged.py b/plinth/modules/miniflux/privileged.py index e08a9b5a3..31b0bd59d 100644 --- a/plinth/modules/miniflux/privileged.py +++ b/plinth/modules/miniflux/privileged.py @@ -4,13 +4,12 @@ import json import os import pathlib -import subprocess from typing import Tuple from urllib.parse import urlparse import pexpect -from plinth import action_utils +from plinth import action_utils, db from plinth.actions import privileged from plinth.utils import is_non_empty_file @@ -124,44 +123,16 @@ def _get_database_config(): } -# The following 3 methods are duplicated in tt-rss/privileged.py - - -def _run_as_postgres(command, stdin=None, stdout=None): - """Run a command as postgres user.""" - command = ['sudo', '--user', 'postgres'] + command - return subprocess.run(command, stdin=stdin, stdout=stdout, check=True) - - @privileged def dump_database(): """Dump database to file.""" config = _get_database_config() - os.makedirs(os.path.dirname(DB_BACKUP_FILE), exist_ok=True) - with open(DB_BACKUP_FILE, 'w', encoding='utf-8') as db_backup_file: - process = _run_as_postgres(['pg_dumpall', '--roles-only'], - stdout=subprocess.PIPE) - db_backup_file.write(f'DROP ROLE IF EXISTS {config["user"]};\n') - for line in process.stdout.decode().splitlines(): - if config['user'] in line: - db_backup_file.write(line + '\n') - - with open(DB_BACKUP_FILE, 'a', encoding='utf-8') as db_backup_file: - _run_as_postgres([ - 'pg_dump', '--create', '--clean', '--if-exists', config['database'] - ], stdout=db_backup_file) + db.postgres_dump_database(DB_BACKUP_FILE, config['database'], + config['user']) @privileged def restore_database(): """Restore database from file.""" config = _get_database_config() - - # This is needed for old backups only. New backups include 'DROP DATABASE - # IF EXISTS' and 'CREATE DATABASE' statements. - _run_as_postgres(['dropdb', config['database']]) - _run_as_postgres(['createdb', config['database']]) - - with open(DB_BACKUP_FILE, 'r', encoding='utf-8') as db_restore_file: - _run_as_postgres(['psql', '--dbname', config['database']], - stdin=db_restore_file) + db.postgres_restore_database(DB_BACKUP_FILE, config['database']) diff --git a/plinth/modules/ttrss/privileged.py b/plinth/modules/ttrss/privileged.py index 5af79a56f..d184327e2 100644 --- a/plinth/modules/ttrss/privileged.py +++ b/plinth/modules/ttrss/privileged.py @@ -1,12 +1,9 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """Configure Tiny Tiny RSS.""" -import os -import subprocess - import augeas -from plinth import action_utils +from plinth import action_utils, db from plinth.actions import privileged CONFIG_FILE = '/etc/tt-rss/config.php' @@ -124,40 +121,15 @@ def enable_api_access(): def dump_database(): """Dump database to file.""" config = _get_database_config() - os.makedirs(os.path.dirname(DB_BACKUP_FILE), exist_ok=True) - with open(DB_BACKUP_FILE, 'w', encoding='utf-8') as db_backup_file: - process = _run_as_postgres(['pg_dumpall', '--roles-only'], - stdout=subprocess.PIPE) - db_backup_file.write(f'DROP ROLE IF EXISTS {config["user"]};\n') - for line in process.stdout.decode().splitlines(): - if config['user'] in line: - db_backup_file.write(line + '\n') - - with open(DB_BACKUP_FILE, 'a', encoding='utf-8') as db_backup_file: - _run_as_postgres([ - 'pg_dump', '--create', '--clean', '--if-exists', config['database'] - ], stdout=db_backup_file) + db.postgres_dump_database(DB_BACKUP_FILE, config['database'], + config['user']) @privileged def restore_database(): """Restore database from file.""" config = _get_database_config() - - # This is needed for old backups only. New backups include 'DROP DATABASE - # IF EXISTS' and 'CREATE DATABASE' statements. - _run_as_postgres(['dropdb', config['database']]) - _run_as_postgres(['createdb', config['database']]) - - with open(DB_BACKUP_FILE, 'r', encoding='utf-8') as db_restore_file: - _run_as_postgres(['psql', '--dbname', config['database']], - stdin=db_restore_file) - - -def _run_as_postgres(command, stdin=None, stdout=None): - """Run a command as postgres user.""" - command = ['sudo', '--user', 'postgres'] + command - return subprocess.run(command, stdin=stdin, stdout=stdout, check=True) + db.postgres_restore_database(DB_BACKUP_FILE, config['database']) def load_augeas(): From 170685c806fc26a58710906dec7714ce5268d3cc Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 25 Jul 2024 12:18:20 -0700 Subject: [PATCH 15/20] tests: functional: Handle click failure when waiting for page update When a click fails because the element is obscured or out of scroll port, the fails with ElementClickInterceptedException. This normally fails the test properly. However, when waiting for a page update, the wait loop silently swallows the error causing the click failure to be ignored. This later leads to a timeout waiting for page to be updated. Handling this error separately and re-raising it ensures that the test fails with the correct error allowing us to fix the problem. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/tests/functional/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index c08d7753e..dfe2c70c1 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -15,7 +15,8 @@ from contextlib import contextmanager import pytest import requests -from selenium.common.exceptions import (StaleElementReferenceException, +from selenium.common.exceptions import (ElementClickInterceptedException, + StaleElementReferenceException, WebDriverException) from selenium.webdriver.support.ui import WebDriverWait @@ -131,6 +132,10 @@ def wait_for_page_update(browser, timeout=300, expected_url=None): page_body = browser.find_by_tag('body').first try: yield + except ElementClickInterceptedException: + # When a element that is not visible is clicked, the click is ignored + # and we can't expect a page update. + raise except WebDriverException: # ignore a connection failure which may happen after web server restart pass From dd6b865de6544f2827f599ab1bebc8bd0d71d2cf Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 25 Jul 2024 12:22:28 -0700 Subject: [PATCH 16/20] tests: functional: Handle obscured elements when submitting forms In some cases in the backup page, when trying to restore a backup, the button is obscured and trying to click it fails. Handle such situations by scrolling the element into view first and try to click on the element again. Ensure that our navigation header does not obscure the element when scrolling it into view. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/tests/functional/__init__.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index dfe2c70c1..bca95b2ac 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -203,6 +203,17 @@ def download_file_outside_browser(url): ########################### # Form handling utilities # ########################### +def click(browser, element): + """Click an element after scrolling it into view considering header.""" + try: + element.click() + except ElementClickInterceptedException: + script = 'arguments[0].style.scrollMarginTop = "4.3125rem";' \ + 'arguments[0].scrollIntoView(true);' + browser.execute_script(script, element._element) + element.click() + + def submit(browser, element=None, form_class=None, expected_url=None): """Submit a specific form in the current page and wait for page change.""" if not (element or form_class): @@ -210,7 +221,7 @@ def submit(browser, element=None, form_class=None, expected_url=None): with wait_for_page_update(browser, expected_url=expected_url): if element: - element.click() + click(browser, element) elif form_class: browser.find_by_css( '.{} input[type=submit]'.format(form_class)).click() From de0d7228785027ec74a4bd58f547b6a8fa238176 Mon Sep 17 00:00:00 2001 From: bittin1ddc447d824349b2 Date: Mon, 29 Jul 2024 16:18:47 +0000 Subject: [PATCH 17/20] Translated using Weblate (Swedish) Currently translated at 100.0% (1576 of 1576 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 97f056f73..39edb4f1f 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-01 20:10-0400\n" -"PO-Revision-Date: 2024-06-09 16:09+0000\n" -"Last-Translator: Tymofii Lytvynenko \n" +"PO-Revision-Date: 2024-07-30 01:31+0000\n" +"Last-Translator: bittin1ddc447d824349b2 \n" "Language-Team: Swedish \n" "Language: sv\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.6-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: config.py:103 #, python-brace-format @@ -1572,14 +1572,12 @@ msgid "When enabled, diagnostic checks will run once a day." msgstr "När det är aktiverat körs diagnostiska kontroller en gång om dagen." #: modules/diagnostics/forms.py:15 -#, fuzzy -#| msgid "Enable auto-update" msgid "Enable automatic repair" -msgstr "Aktivera automatisk uppdatering" +msgstr "Aktivera automatisk reparation" #: modules/diagnostics/forms.py:16 msgid "If issues are found, try to repair them automatically." -msgstr "" +msgstr "Om problem upptäcks, försök att reparera dem automatiskt." #: modules/diagnostics/templates/diagnostics.html:11 msgid "Diagnostics Run" From 6a995d93694ad4670f8921a2fbe22489c3293058 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 29 Jul 2024 21:33:31 -0400 Subject: [PATCH 18/20] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/ar/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/ar_SA/LC_MESSAGES/django.po | 139 ++++++++++++++-- plinth/locale/be/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/bg/LC_MESSAGES/django.po | 162 +++++++++++++++++-- plinth/locale/bn/LC_MESSAGES/django.po | 139 ++++++++++++++-- plinth/locale/cs/LC_MESSAGES/django.po | 162 +++++++++++++++++-- plinth/locale/da/LC_MESSAGES/django.po | 163 +++++++++++++++++-- plinth/locale/de/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/django.pot | 137 ++++++++++++++-- plinth/locale/el/LC_MESSAGES/django.po | 157 ++++++++++++++++-- plinth/locale/es/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/fa/LC_MESSAGES/django.po | 165 ++++++++++++++++--- plinth/locale/fake/LC_MESSAGES/django.po | 155 ++++++++++++++++-- plinth/locale/fr/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/gl/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/gu/LC_MESSAGES/django.po | 151 ++++++++++++++++-- plinth/locale/hi/LC_MESSAGES/django.po | 157 ++++++++++++++++-- plinth/locale/hu/LC_MESSAGES/django.po | 163 +++++++++++++++++-- plinth/locale/id/LC_MESSAGES/django.po | 167 +++++++++++++++++--- plinth/locale/it/LC_MESSAGES/django.po | 163 +++++++++++++++++-- plinth/locale/ja/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/kn/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/lt/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/lv/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/nb/LC_MESSAGES/django.po | 162 +++++++++++++++++-- plinth/locale/nl/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/pl/LC_MESSAGES/django.po | 162 +++++++++++++++++-- plinth/locale/pt/LC_MESSAGES/django.po | 153 ++++++++++++++++-- plinth/locale/ru/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/si/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/sl/LC_MESSAGES/django.po | 149 +++++++++++++++-- plinth/locale/sq/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/sr/LC_MESSAGES/django.po | 149 +++++++++++++++-- plinth/locale/sv/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/ta/LC_MESSAGES/django.po | 137 ++++++++++++++-- plinth/locale/te/LC_MESSAGES/django.po | 162 +++++++++++++++++-- plinth/locale/tr/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/uk/LC_MESSAGES/django.po | 164 +++++++++++++++++-- plinth/locale/vi/LC_MESSAGES/django.po | 153 ++++++++++++++++-- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 159 +++++++++++++++++-- plinth/locale/zh_Hant/LC_MESSAGES/django.po | 153 ++++++++++++++++-- 41 files changed, 5887 insertions(+), 404 deletions(-) diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index 3d2153376..8614eddf1 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: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2023-10-19 06:18+0000\n" "Last-Translator: Shaik \n" "Language-Team: Arabic clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6523,10 +6646,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index 5bf9d7226..e0f08c68c 100644 --- a/plinth/locale/ar_SA/LC_MESSAGES/django.po +++ b/plinth/locale/ar_SA/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "اسم المستخدم غير صالح:{username}" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "اسم المستخدم غير صالح:{username}" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6528,10 +6653,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/be/LC_MESSAGES/django.po b/plinth/locale/be/LC_MESSAGES/django.po index 1fc2b930b..c38ed83e6 100644 --- a/plinth/locale/be/LC_MESSAGES/django.po +++ b/plinth/locale/be/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -798,8 +798,8 @@ msgid "No passwords currently configured." msgstr "" #: modules/bepasty/templates/bepasty.html:29 modules/dynamicdns/forms.py:91 -#: modules/networks/forms.py:208 modules/shadowsocks/forms.py:32 -#: modules/shadowsocksserver/forms.py:37 +#: modules/miniflux/forms.py:14 modules/networks/forms.py:208 +#: modules/shadowsocks/forms.py:32 modules/shadowsocksserver/forms.py:37 msgid "Password" msgstr "" @@ -1622,8 +1622,8 @@ msgstr "" msgid "Use HTTP basic authentication" msgstr "" -#: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:129 +#: modules/dynamicdns/forms.py:88 modules/miniflux/forms.py:11 +#: modules/networks/forms.py:207 modules/users/forms.py:129 msgid "Username" msgstr "" @@ -3088,6 +3088,7 @@ msgid "FluffyChat" msgstr "" #: modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:15 +#: modules/miniflux/templates/miniflux.html:12 #: modules/snapshot/templates/snapshot.html:13 templates/app.html:46 msgid "Configuration" msgstr "" @@ -3417,6 +3418,128 @@ msgstr "" msgid "Updated media directory" msgstr "" +#: modules/miniflux/__init__.py:18 +msgid "" +"Miniflux is a web-based tool that aggregates news and blog updates from " +"various websites into one centralized, easy-to-read format. It has a simple " +"interface and focuses on a distraction-free reading experience. You can can " +"subscribe to your favorite sites and access full article contents within the " +"reader itself." +msgstr "" + +#: modules/miniflux/__init__.py:23 +msgid "" +"Key features include keyboard shortcuts for quick navigation, full-text " +"search, filtering articles, categories and favorites. Miniflux preserves " +"user privacy by removing trackers. The primary interface is web-based. There " +"are several third-party clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6515,10 +6638,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index 720df6d2c..9c8c27574 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-19 14:09+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Четец на абонаменти за новини" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Въведете валидно потребителско име." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Запазване на настройки" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"За да разрешите промяната на профила, въведете паролата на потребителя " +"„{user}“." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Паролата е променена" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Четец на абонаменти за новини" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Създаване на потребител" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "Парола за сървъра на SSH" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Създаване на потребител" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Недействително потребителско име: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred while creating the user: {error}." +msgstr "Възникна грешка по време на настройване." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "Парола за сървъра на SSH" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Недействително потребителско име: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Възникна грешка по време на настройване." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6847,10 +6995,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Четец на абонаменти за новини" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index 8d48a152b..f25f56eb3 100644 --- a/plinth/locale/bn/LC_MESSAGES/django.po +++ b/plinth/locale/bn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2021-06-16 07:33+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Configuration" +msgid "Password confirmation" +msgstr "পছন্দসমূহ" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6559,10 +6684,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index 7c53f7ede..d816dfae5 100644 --- a/plinth/locale/cs/LC_MESSAGES/django.po +++ b/plinth/locale/cs/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-06-09 16:09+0000\n" "Last-Translator: Tymofii Lytvynenko \n" "Language-Team: Czech clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Čtečka novinek" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Zadejte platné uživatelské jméno." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Aktualizace konfigurace" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "Zadejte heslo uživatele \"{user}\" pro autorizaci změn účtu." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Heslo aktualizováno" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Čtečka novinek" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Číst" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Vytvořit uživatele" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Nastavení hesla superuživatele" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Vytvořit uživatele" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Neplatné uživatelské jméno: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Při vytváření úložiště došlo k chybě." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Nastavení hesla superuživatele" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Neplatné uživatelské jméno: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Při nastavování se vyskytla chyba." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7482,10 +7630,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Čtečka novinek" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index 6e21f40bf..e013910a0 100644 --- a/plinth/locale/da/LC_MESSAGES/django.po +++ b/plinth/locale/da/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +#, fuzzy +#| msgid "News Feed Reader (Tiny Tiny RSS)" +msgid "News Feed Reader" +msgstr "Nyhedsstrømlæser (Tiny Tiny RSS)" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a username for the user." +msgstr "Ugyldigt servernavn" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "Der opstod en fejl under konfigurationen." + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password" +msgid "Passwords do not match." +msgstr "Kodeord" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader (Tiny Tiny RSS)" +msgid "Fluent Reader" +msgstr "Nyhedsstrømlæser (Tiny Tiny RSS)" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Tilgå" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Opret Bruger" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Save Password" +msgid "Reset user password" +msgstr "Gem Kodeord" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Opret Bruger" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Ugyldigt brugernavn: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred while creating the user: {error}." +msgstr "Der opstod en fejl under konfigurationen." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Save Password" +msgid "Reset User Password" +msgstr "Gem Kodeord" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Ugyldigt brugernavn: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Der opstod en fejl under konfigurationen." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7544,12 +7691,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -#, fuzzy -#| msgid "News Feed Reader (Tiny Tiny RSS)" -msgid "News Feed Reader" -msgstr "Nyhedsstrømlæser (Tiny Tiny RSS)" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index 59cf8a30d..b564ef4f4 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-27 21:41+0000\n" "Last-Translator: Ettore Atalan \n" "Language-Team: German clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Feedreader" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Einen gültigen Benutzernamen eingeben." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Aktualisieren der Konfiguration" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Geben Sie das Passwort für den Benutzer „{user}“ ein, um Kontoänderungen zu " +"autorisieren." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Passwort geändert" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Feedreader" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Lesen" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Benutzer anlegen" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "SuperUser-Kennwort festlegen" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Benutzer anlegen" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Ungültiger Nutzername: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Beim Erstellen des Repository ist ein Fehler aufgetreten." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "SuperUser-Kennwort festlegen" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Ungültiger Nutzername: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Ein Fehler ist bei der Konfiguration aufgetreten." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7645,10 +7795,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Feedreader" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 5515b9d62..3b8a9f9ca 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: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -799,8 +799,8 @@ msgid "No passwords currently configured." msgstr "" #: modules/bepasty/templates/bepasty.html:29 modules/dynamicdns/forms.py:91 -#: modules/networks/forms.py:208 modules/shadowsocks/forms.py:32 -#: modules/shadowsocksserver/forms.py:37 +#: modules/miniflux/forms.py:14 modules/networks/forms.py:208 +#: modules/shadowsocks/forms.py:32 modules/shadowsocksserver/forms.py:37 msgid "Password" msgstr "" @@ -1623,8 +1623,8 @@ msgstr "" msgid "Use HTTP basic authentication" msgstr "" -#: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:129 +#: modules/dynamicdns/forms.py:88 modules/miniflux/forms.py:11 +#: modules/networks/forms.py:207 modules/users/forms.py:129 msgid "Username" msgstr "" @@ -3089,6 +3089,7 @@ msgid "FluffyChat" msgstr "" #: modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:15 +#: modules/miniflux/templates/miniflux.html:12 #: modules/snapshot/templates/snapshot.html:13 templates/app.html:46 msgid "Configuration" msgstr "" @@ -3418,6 +3419,128 @@ msgstr "" msgid "Updated media directory" msgstr "" +#: modules/miniflux/__init__.py:18 +msgid "" +"Miniflux is a web-based tool that aggregates news and blog updates from " +"various websites into one centralized, easy-to-read format. It has a simple " +"interface and focuses on a distraction-free reading experience. You can can " +"subscribe to your favorite sites and access full article contents within the " +"reader itself." +msgstr "" + +#: modules/miniflux/__init__.py:23 +msgid "" +"Key features include keyboard shortcuts for quick navigation, full-text " +"search, filtering articles, categories and favorites. Miniflux preserves " +"user privacy by removing trackers. The primary interface is web-based. There " +"are several third-party clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6516,10 +6639,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 8544d7b07..e2dfbb158 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: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Greek clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Αναγνώστης ειδήσεων" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a username for the user." +msgstr "Μη έγκυρο όνομα διακομιστή" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "Παρουσιάστηκε σφάλμα κατά τη ρύθμιση παραμέτρων." + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Ενημερώθηκε ο κωδικός πρόσβασης" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Αναγνώστης ειδήσεων" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Δημιουργία χρήστη" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Ορισμός κωδικού πρόσβασης SuperUser" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Δημιουργία χρήστη" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Μη έγκυρο όνομα χρήστη: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Παρουσιάστηκε σφάλμα κατά τη δημιουργία του αποθετηρίου." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Ορισμός κωδικού πρόσβασης SuperUser" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Μη έγκυρο όνομα χρήστη: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Παρουσιάστηκε σφάλμα κατά τη ρύθμιση παραμέτρων." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7777,10 +7920,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Αναγνώστης ειδήσεων" - #: modules/ttrss/manifest.py:10 #, fuzzy #| msgid "Tiny Tiny RSS (Fork)" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index c70b1e4bf..a93878c5b 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-03 07:09+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Lector de noticias" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Indique un nombre de usuario válido." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Actualizando la configuración" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Introduce la contraseña del usuario \"{user}\" para autorizar modificaciones " +"en la cuenta." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Clave actualizada" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Lector de noticias" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Leer" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Crear usuaria/o" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Definir clave para administración" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Crear usuaria/o" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Nombre de usuaria/o no válido: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Ha habido un error al crear el repositorio." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Definir clave para administración" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Nombre de usuaria/o no válido: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Ha habido un error en la configuración." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7537,10 +7687,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Lector de noticias" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index f2252eef0..52f5c468d 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: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a username for the user." +msgstr "نام کاربری معتبر نیست" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Current Network Configuration" +msgid "Password confirmation" +msgstr "پیکربندی فعلی شبکه" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password" +msgid "Passwords do not match." +msgstr "رمز" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create" +msgid "Create admin user" +msgstr "ساختن" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Please provide a password" +msgid "Reset user password" +msgstr "لطفاً یک رمز وارد کنید" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create Connection" +msgid "Create Admin User" +msgstr "ساختن اتصال" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid server name" +msgid "Created admin user: {username}" +msgstr "نام کاربری معتبر نیست" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "Error occurred while publishing key." +msgid "An error occurred while creating the user: {error}." +msgstr "هنگام انتشار کلید خطایی رخ داد." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Please provide a password" +msgid "Reset User Password" +msgstr "لطفاً یک رمز وارد کنید" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid server name" +msgid "Password reset for user: {username}" +msgstr "نام کاربری معتبر نیست" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "Error occurred while publishing key." +msgid "An error occurred during password reset: {error}." +msgstr "هنگام انتشار کلید خطایی رخ داد." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7202,10 +7343,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" @@ -9411,16 +9548,6 @@ msgstr "" #~ msgid "Disk" #~ msgstr "دیسک‌ها" -#, fuzzy -#~| msgid "Create" -#~ msgid "Create archive" -#~ msgstr "ساختن" - -#, fuzzy -#~| msgid "Create Connection" -#~ msgid "Create Archive" -#~ msgstr "ساختن اتصال" - #, fuzzy #~| msgid "Device" #~ msgid "Devices" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index dc87b978f..54c5aee06 100644 --- a/plinth/locale/fake/LC_MESSAGES/django.po +++ b/plinth/locale/fake/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth 0.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a username for the user." +msgstr "INVALID SERVER NAME" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "AN ERROR OCCURRED DURING CONFIGURATION." + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password" +msgid "Passwords do not match." +msgstr "PASSWORD" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "CREATE USER" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Save Password" +msgid "Reset user password" +msgstr "SAVE PASSWORD" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "CREATE USER" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid server name" +msgid "Created admin user: {username}" +msgstr "INVALID SERVER NAME" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred while creating the user: {error}." +msgstr "AN ERROR OCCURRED DURING CONFIGURATION." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Save Password" +msgid "Reset User Password" +msgstr "SAVE PASSWORD" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid server name" +msgid "Password reset for user: {username}" +msgstr "INVALID SERVER NAME" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "AN ERROR OCCURRED DURING CONFIGURATION." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7628,10 +7769,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index ba2eefd98..aae8281e6 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-03 07:09+0000\n" "Last-Translator: John Doe \n" "Language-Team: French clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Lecteur de fils d’actualités" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Entrez un nom d’utilisateur valide." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Mise à jour de la configuration" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Veuillez saisir votre mot de passe de l’utilisateur « {user} » pour " +"confirmer ces modifications de compte." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Mot de passe mis à jour" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Lecteur de fils d’actualités" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Lecture" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Créer un utilisateur" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Définir le mot de passe du super utilisateur" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Créer un utilisateur" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Nom d’utilisateur invalide : {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Une erreur est survenue pendant la création du dépôt." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Définir le mot de passe du super utilisateur" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Nom d’utilisateur invalide : {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Une erreur est survenue pendant la configuration." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7687,10 +7837,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Lecteur de fils d’actualités" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index f575545e2..87e57c872 100644 --- a/plinth/locale/gl/LC_MESSAGES/django.po +++ b/plinth/locale/gl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-12-30 10:51+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Galician clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6545,10 +6668,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index eeb43479e..775c9f8d4 100644 --- a/plinth/locale/gu/LC_MESSAGES/django.po +++ b/plinth/locale/gu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a username for the user." +msgstr "અમાન્ય સર્વર નામ" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "General Configuration" +msgid "Password confirmation" +msgstr "સામાન્ય ગોઠવણી" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password" +msgid "Passwords do not match." +msgstr "પાસવર્ડ" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Documentation" +msgid "Create admin user" +msgstr "દસ્તાવેજીકરણ" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Please provide a password" +msgid "Reset user password" +msgstr "કૃપા કરીને પાસવર્ડ આપો" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid server name" +msgid "Created admin user: {username}" +msgstr "અમાન્ય સર્વર નામ" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Please provide a password" +msgid "Reset User Password" +msgstr "કૃપા કરીને પાસવર્ડ આપો" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid server name" +msgid "Password reset for user: {username}" +msgstr "અમાન્ય સર્વર નામ" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6862,10 +6999,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index 3fd69058f..66433caf9 100644 --- a/plinth/locale/hi/LC_MESSAGES/django.po +++ b/plinth/locale/hi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2023-10-19 06:30+0000\n" "Last-Translator: Shaik \n" "Language-Team: Hindi clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "समाचार फ़ीड रीडर" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a username for the user." +msgstr "सर्वर नाम अमान्य है" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "कॉंफ़िगरेशन के दौरान कूछ त्रुटि हुई." + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "पासवर्ड अपडेट" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "समाचार फ़ीड रीडर" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "यूसर बनाये" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Save Password" +msgid "Reset user password" +msgstr "पासवर्ड सहेजें" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "यूसर बनाये" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid server name" +msgid "Created admin user: {username}" +msgstr "सर्वर नाम अमान्य है" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred while creating the user: {error}." +msgstr "कॉंफ़िगरेशन के दौरान कूछ त्रुटि हुई." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Save Password" +msgid "Reset User Password" +msgstr "पासवर्ड सहेजें" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid server name" +msgid "Password reset for user: {username}" +msgstr "सर्वर नाम अमान्य है" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "कॉंफ़िगरेशन के दौरान कूछ त्रुटि हुई." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7589,10 +7732,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "टिनी टिनी आरएसएस" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "समाचार फ़ीड रीडर" - #: modules/ttrss/manifest.py:10 #, fuzzy #| msgid "Tiny Tiny RSS (Fork)" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index fef1990c9..dcf8fc2e4 100644 --- a/plinth/locale/hu/LC_MESSAGES/django.po +++ b/plinth/locale/hu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-10-24 18:39+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Hungarian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Hírcsatorna-olvasó" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Adj meg egy érvényes felhasználónevet." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Beállítások frissítése" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"A fiókmódosítások engedélyezéséhez add meg \"{user}\" felhasználó jelszavát." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Jelszó frissítve" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Hírcsatorna-olvasó" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Olvas" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Felhasználó létrehozása" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "SuperUser jelszavának beállítása" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Felhasználó létrehozása" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Érvénytelen felhasználónév: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Hiba történt a tároló létrehozása közben." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "SuperUser jelszavának beállítása" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Érvénytelen felhasználónév: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Hiba történt a beállítás során." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7640,10 +7789,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Hírcsatorna-olvasó" - #: modules/ttrss/manifest.py:10 #, fuzzy #| msgid "Tiny Tiny RSS (Fork)" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index a7a9de29e..2648d1547 100644 --- a/plinth/locale/id/LC_MESSAGES/django.po +++ b/plinth/locale/id/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Indonesian (FreedomBox)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Indonesian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Masukkan sebuah nama pengguna yang valid." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "Terjadi kesalahan selama konfigurasi." + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Kata sandi diperbarui" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Baca baca" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create" +msgid "Create admin user" +msgstr "Buat" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Atur Kata sandi PenggunaSuper" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Administrator Account" +msgid "Create Admin User" +msgstr "Akun Administrator" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Nama pengguna tidak valid: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Terjadi kesalahan saat membuat repositori." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Atur Kata sandi PenggunaSuper" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Nama pengguna tidak valid: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Terjadi kesalahan selama konfigurasi." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7071,10 +7214,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 #, fuzzy msgid "Tiny Tiny RSS (TTTRSS)" @@ -9190,16 +9329,6 @@ msgstr "Bahasa Gujarat" #~ msgid "Restore apps" #~ msgstr "Jalankan ulang Sekarang" -#, fuzzy -#~| msgid "Create" -#~ msgid "Create archive" -#~ msgstr "Buat" - -#, fuzzy -#~| msgid "Administrator Account" -#~ msgid "Create Archive" -#~ msgstr "Akun Administrator" - #, fuzzy #~| msgid "Device" #~ msgid "Devices" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 2ae2edb8a..17341fc8e 100644 --- a/plinth/locale/it/LC_MESSAGES/django.po +++ b/plinth/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Italian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Inserisci un nome utente valido." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Aggiornamento della configurazione" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Password aggiornata" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create a custom service" +msgid "Create admin user" +msgstr "Crea un servizio personalizzato" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "Password server SSH" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create" +msgid "Create Admin User" +msgstr "Crea" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Nome utente non valido: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Si è verificato un errore durante la creazione del repository." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "Password server SSH" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Nome utente non valido: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Si è verificato un errore durante la configurazione." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7202,10 +7343,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 #, fuzzy #| msgid "Tiny Tiny RSS (Fork)" @@ -9414,9 +9551,6 @@ msgstr "Gujarati" #~ msgid "Save settings" #~ msgstr "Salva impostazioni" -#~ msgid "Create a custom service" -#~ msgstr "Crea un servizio personalizzato" - #~ msgid "Add Service" #~ msgstr "Aggiungi Servizio" @@ -9700,11 +9834,6 @@ msgstr "Gujarati" #~ "Percorso di una cartella su questo server su cui sarà archiviato nel " #~ "backup repository." -#, fuzzy -#~| msgid "Create" -#~ msgid "Create Archive" -#~ msgstr "Crea" - #, fuzzy #~| msgid "Service" #~ msgid "Devices" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index 8f39713d0..91034d7be 100644 --- a/plinth/locale/ja/LC_MESSAGES/django.po +++ b/plinth/locale/ja/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2023-05-07 23:50+0000\n" "Last-Translator: Nobuhiro Iwamatsu \n" "Language-Team: Japanese clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6518,10 +6641,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index e551128e6..8c5a0c2a8 100644 --- a/plinth/locale/kn/LC_MESSAGES/django.po +++ b/plinth/locale/kn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6520,10 +6643,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index 4c14f8462..69181b70c 100644 --- a/plinth/locale/lt/LC_MESSAGES/django.po +++ b/plinth/locale/lt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Lithuanian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6522,10 +6645,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/lv/LC_MESSAGES/django.po b/plinth/locale/lv/LC_MESSAGES/django.po index d047171bd..e65064717 100644 --- a/plinth/locale/lv/LC_MESSAGES/django.po +++ b/plinth/locale/lv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Latvian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6521,10 +6644,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index dd13b0c85..2505bf85f 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-03-28 01:01+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Nyhetstrøm-leser" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Skriv et gyldig brukernavn." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Oppdaterer oppsett" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "Skriv inn passordet for bruker «{user}» for å tillate kontoendringer." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Passord oppdatert" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Nyhetstrøm-leser" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Les" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Opprett bruker" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "SSH-tjenermaskinpassord" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Opprett bruker" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Ugyldig brukernavn: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred while creating the user: {error}." +msgstr "En feil oppsto under konfigureringen." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "SSH-tjenermaskinpassord" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Ugyldig brukernavn: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "En feil oppsto under konfigureringen." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7637,10 +7785,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Nyhetstrøm-leser" - #: modules/ttrss/manifest.py:10 #, fuzzy #| msgid "Tiny Tiny RSS (Fork)" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index c3123e664..a5941ea58 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-06-17 13:09+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "News Feed Reader" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Voer een geldige gebruikersnaam in." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Configuratie bijwerken" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Voer het wachtwoord voor gebruiker \"{user}\" in om accountwijzigingen toe " +"te staan." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Wachtwoord bijgewerkt" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "News Feed Reader" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Lezen" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Nieuwe gebruiker registreren" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Wachtwoord van de Supergebruiker vastleggen" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Nieuwe gebruiker registreren" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Ongeldige gebruikersnaam: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Er is een fout opgetreden bij het aanmaken van de repository." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Wachtwoord van de Supergebruiker vastleggen" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Ongeldige gebruikersnaam: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Er is een fout opgetreden tijdens de configuratie." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7545,10 +7695,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "News Feed Reader" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTRSS)" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index 9d244cad6..85b229a94 100644 --- a/plinth/locale/pl/LC_MESSAGES/django.po +++ b/plinth/locale/pl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-13 12:09+0000\n" "Last-Translator: Monika \n" "Language-Team: Polish clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a username for the user." +msgstr "Niewłaściwa nazwa użytkownika" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "Podczas konfiguracji wystąpił błąd." + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password" +msgid "Passwords do not match." +msgstr "Hasło" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Odczyt" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create Location" +msgid "Create admin user" +msgstr "Utwórz lokalizację" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "Hasło do serwera SSH" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create Account" +msgid "Create Admin User" +msgstr "Utwórz konto" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Niepoprawna nazwa użytkownika: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred while creating the user: {error}." +msgstr "Podczas konfiguracji wystąpił błąd." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "Hasło do serwera SSH" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Niepoprawna nazwa użytkownika: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Podczas konfiguracji wystąpił błąd." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7038,10 +7181,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" @@ -9224,11 +9363,6 @@ msgstr "Gujarati" #~ msgid "Disk" #~ msgstr "Dyski" -#, fuzzy -#~| msgid "Create Account" -#~ msgid "Create Archive" -#~ msgstr "Utwórz konto" - #~ msgid "" #~ "To complete the setup of your %(box_name)s, please provide some basic " #~ "information." diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index c00e45b62..3683099b1 100644 --- a/plinth/locale/pt/LC_MESSAGES/django.po +++ b/plinth/locale/pt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2023-05-22 15:50+0000\n" "Last-Translator: Frederico Gomes \n" "Language-Team: Portuguese clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Insira um nome de utilizador válido." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "General Configuration" +msgid "Password confirmation" +msgstr "Configuração Geral" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Archive deleted." +msgid "Passwords do not match." +msgstr "Arquivo apagado." + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Criar utilizador" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "Password do servidor SSH" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Criar utilizador" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Nome de utilizador inválido: {username}" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "Password do servidor SSH" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Nome de utilizador inválido: {username}" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6881,10 +7020,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 75e2aeeaa..386121656 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-05-26 04:09+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Чтение ленты новостей" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Введите действительное имя пользователя." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Обновление конфигурации" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Введите пароль пользователя \"{user}\" для авторизации изменений учетной " +"записи." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Пароль обновлен" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Чтение ленты новостей" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Читать" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Создать пользователя" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Установить пароль суперпользователя" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Создать пользователя" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Неверное имя пользователя: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Ошибка при создании репозитория." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Установить пароль суперпользователя" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Неверное имя пользователя: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Произошла ошибка во время настройки." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7554,10 +7704,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Чтение ленты новостей" - #: modules/ttrss/manifest.py:10 #, fuzzy #| msgid "Tiny Tiny RSS (Fork)" diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index e17cf2fc2..3e7ba7e2e 100644 --- a/plinth/locale/si/LC_MESSAGES/django.po +++ b/plinth/locale/si/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6518,10 +6641,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index b9b34b289..cd82bc399 100644 --- a/plinth/locale/sl/LC_MESSAGES/django.po +++ b/plinth/locale/sl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Invalid hostname" +msgid "Enter a username for the user." +msgstr "Neveljavno ime gostitelja" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Configuration updated" +msgid "Password confirmation" +msgstr "Konfiguracija je posodobljena" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Archive deleted." +msgid "Passwords do not match." +msgstr "Arhiv je izbrisan." + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create Repository" +msgid "Create admin user" +msgstr "Ustvari skladišče" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "Geslo strežnika SSH" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "Geslo strežnika SSH" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6809,10 +6944,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index ef5fea34b..ab70d814b 100644 --- a/plinth/locale/sq/LC_MESSAGES/django.po +++ b/plinth/locale/sq/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-03 07:09+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Lexues Prurjesh Lajmesh" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Jepni një emër përdoruesi të vlefshëm." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Po përditësohet formësimi" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Jepni fjalëkalimin për përdoruesin “{user}”, që të autorizoni ndryshime " +"llogarie." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Fjalëkalimi u përditësua" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Lexues Prurjesh Lajmesh" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Lexoni" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Krijoni Përdorues" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Caktoni Fjalëkalim Superpërdoruesi" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Krijoni Përdorues" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Emër përdoruesi i pavlefshëm: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Ndodhi një gabim teksa krijohej depoja." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Caktoni Fjalëkalim Superpërdoruesi" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Emër përdoruesi i pavlefshëm: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Ndodhi një gabim gjatë formësimit." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7575,10 +7725,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Lexues Prurjesh Lajmesh" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index bc353e834..f6d7be4a4 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: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Configuration updated" +msgid "Password confirmation" +msgstr "Konfiguracija sačuvana" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Archive deleted." +msgid "Passwords do not match." +msgstr "Arhiva izbrisana." + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create Location" +msgid "Create admin user" +msgstr "Kreirajte lokaciju" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "SSH serverska lozinka" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Pogrešno korisničko ime: {username}" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "SSH serverska lozinka" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Pogrešno korisničko ime: {username}" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6671,10 +6806,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 39edb4f1f..71eb678b8 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-30 01:31+0000\n" "Last-Translator: bittin1ddc447d824349b2 \n" "Language-Team: Swedish clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Läsare för nyhetsflödet" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Ange ett giltigt användarnamn." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Uppdatera konfigurationen" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Ange lösenordet för användaren \"{user}\" för att godkänna " +"kontomodifieringar." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Lösenord uppdaterad" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Läsare för nyhetsflödet" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Läsa" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Skapa användare" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Ange SuperUser lösenord" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Skapa användare" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Ogiltigt användernamn: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Ett fel uppstod medan skapa ett repository." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Ange SuperUser lösenord" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Ogiltigt användernamn: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Ett fel inträffade under konfiguration." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7501,10 +7651,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Läsare för nyhetsflödet" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index df86f8fc7..0a8f38274 100644 --- a/plinth/locale/ta/LC_MESSAGES/django.po +++ b/plinth/locale/ta/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -800,8 +800,8 @@ msgid "No passwords currently configured." msgstr "" #: modules/bepasty/templates/bepasty.html:29 modules/dynamicdns/forms.py:91 -#: modules/networks/forms.py:208 modules/shadowsocks/forms.py:32 -#: modules/shadowsocksserver/forms.py:37 +#: modules/miniflux/forms.py:14 modules/networks/forms.py:208 +#: modules/shadowsocks/forms.py:32 modules/shadowsocksserver/forms.py:37 msgid "Password" msgstr "" @@ -1624,8 +1624,8 @@ msgstr "" msgid "Use HTTP basic authentication" msgstr "" -#: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:129 +#: modules/dynamicdns/forms.py:88 modules/miniflux/forms.py:11 +#: modules/networks/forms.py:207 modules/users/forms.py:129 msgid "Username" msgstr "" @@ -3090,6 +3090,7 @@ msgid "FluffyChat" msgstr "" #: modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:15 +#: modules/miniflux/templates/miniflux.html:12 #: modules/snapshot/templates/snapshot.html:13 templates/app.html:46 msgid "Configuration" msgstr "" @@ -3419,6 +3420,128 @@ msgstr "" msgid "Updated media directory" msgstr "" +#: modules/miniflux/__init__.py:18 +msgid "" +"Miniflux is a web-based tool that aggregates news and blog updates from " +"various websites into one centralized, easy-to-read format. It has a simple " +"interface and focuses on a distraction-free reading experience. You can can " +"subscribe to your favorite sites and access full article contents within the " +"reader itself." +msgstr "" + +#: modules/miniflux/__init__.py:23 +msgid "" +"Key features include keyboard shortcuts for quick navigation, full-text " +"search, filtering articles, categories and favorites. Miniflux preserves " +"user privacy by removing trackers. The primary interface is web-based. There " +"are several third-party clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +msgid "Password confirmation" +msgstr "" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +msgid "Passwords do not match." +msgstr "" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +msgid "Read You" +msgstr "" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +msgid "Create admin user" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +msgid "Reset user password" +msgstr "" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, python-brace-format +msgid "Created admin user: {username}" +msgstr "" + +#: modules/miniflux/views.py:53 +#, python-brace-format +msgid "An error occurred while creating the user: {error}." +msgstr "" + +#: modules/miniflux/views.py:70 +msgid "Reset User Password" +msgstr "" + +#: modules/miniflux/views.py:80 +#, python-brace-format +msgid "Password reset for user: {username}" +msgstr "" + +#: modules/miniflux/views.py:85 +#, python-brace-format +msgid "An error occurred during password reset: {error}." +msgstr "" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6517,10 +6640,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 4a3a39c3a..9ee5e8694 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: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-02-11 20:14+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Telugu clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "న్యూస్ ఫీడ్ రీడర్" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "చెల్లుబాటు అయ్యే వినియోగదారు పేరును నమోదు చేయండి." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "కాన్ఫిగరేషన్‌ను నవీకరిస్తోంది" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "వినియోగదారు కోసం పాస్‌వర్డ్‌ను నమోదు చేయండి\"{user}\"ఖాతా సవరణలకు అధికారం ఇవ్వడానికి." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "అనుమతిపదం నవీకరించబడింది" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "న్యూస్ ఫీడ్ రీడర్" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "చదవండి" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "వినియోగదారుని సృష్టించు" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "సూపర్‌యూజర్ రహస్యపదంని సెట్ చేయండి" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "వినియోగదారుని సృష్టించు" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "చెల్లని వినియోగదారు పేరు: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "రిపోజిటరీని సృష్టిస్తున్నప్పుడు లోపం సంభవించింది." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "సూపర్‌యూజర్ రహస్యపదంని సెట్ చేయండి" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "చెల్లని వినియోగదారు పేరు: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "అక్రుతీకరణలో ఒక పొరపాటు జరిగింది." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7301,10 +7449,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "టైనీ టైనీ RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "న్యూస్ ఫీడ్ రీడర్" - #: modules/ttrss/manifest.py:10 #, fuzzy #| msgid "Tiny Tiny RSS (Fork)" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index a03026883..3f86253fe 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-03 07:09+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Haber Bildirim Okuyucusu" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Geçerli bir kullanıcı adı girin." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Yapılandırma güncelleniyor" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Hesap değişikliklerini yetkilendirmek için \"{user}\" kullanıcısının " +"parolasını girin." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Parola güncellendi" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Haber Bildirim Okuyucusu" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Oku" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Kullanıcı Oluştur" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Süper Kullanıcı Parolası Ayarlayın" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Kullanıcı Oluştur" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Geçersiz kullanıcı adı: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Depo oluşturulurken bir hata meydana geldi." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Süper Kullanıcı Parolası Ayarlayın" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Geçersiz kullanıcı adı: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Yapılandırma sırasında bir hata meydana geldi." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7525,10 +7675,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Haber Bildirim Okuyucusu" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index fb19d1e62..d5de68ea5 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-07 19:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "Читання новинних стрічок" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "Уведіть коректне імʼя користувача." + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "Оновлення налаштувань" + +#: modules/miniflux/forms.py:20 +#, fuzzy +#| msgid "" +#| "Enter the password for user \"{user}\" to authorize account modifications." +msgid "Enter the same password for confirmation." +msgstr "" +"Уведіть пароль для користувача \"{user}\", щоб авторизувати зміни облікового " +"запису." + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "Пароль оновлено" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "Читання новинних стрічок" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Читати" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "Створити користувача" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "Задати пароль суперкористувача" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "Створити користувача" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Некоректне імʼя користувача: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "Помилка відбулася під час створення репозиторію." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "Задати пароль суперкористувача" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Некоректне імʼя користувача: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Під час налаштування відбулася помилка." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -7518,10 +7668,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "Tiny Tiny RSS" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "Читання новинних стрічок" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "Tiny Tiny RSS (TTTRSS)" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 598a9e714..a382ac6c4 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: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "Đã xảy ra lỗi trong khi thiết lập." + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password deleted." +msgid "Passwords do not match." +msgstr "Đã xoá mật khẩu." + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "Đọc" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create Location" +msgid "Create admin user" +msgstr "Tạo vị trí" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "Mật khẩu máy chủ SSH" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "Tên người dùng không hợp lệ: {username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the library." +msgid "An error occurred while creating the user: {error}." +msgstr "Đã xảy ra lỗi trong khi tạo thư viện." + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "Mật khẩu máy chủ SSH" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "Tên người dùng không hợp lệ: {username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "Đã xảy ra lỗi trong khi thiết lập." + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6815,10 +6954,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index ad670baad..3b93d03b4 100644 --- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-03 12:34+0000\n" "Last-Translator: 大王叫我来巡山 \n" @@ -835,8 +835,8 @@ msgid "No passwords currently configured." msgstr "目前没有配置密码。" #: modules/bepasty/templates/bepasty.html:29 modules/dynamicdns/forms.py:91 -#: modules/networks/forms.py:208 modules/shadowsocks/forms.py:32 -#: modules/shadowsocksserver/forms.py:37 +#: modules/miniflux/forms.py:14 modules/networks/forms.py:208 +#: modules/shadowsocks/forms.py:32 modules/shadowsocksserver/forms.py:37 msgid "Password" msgstr "密码" @@ -1718,8 +1718,8 @@ msgstr "接受所有 SSL 证书" msgid "Use HTTP basic authentication" msgstr "使用 HTTP 基本身份验证" -#: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:129 +#: modules/dynamicdns/forms.py:88 modules/miniflux/forms.py:11 +#: modules/networks/forms.py:207 modules/users/forms.py:129 msgid "Username" msgstr "用户名" @@ -3245,6 +3245,7 @@ msgid "FluffyChat" msgstr "" #: modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:15 +#: modules/miniflux/templates/miniflux.html:12 #: modules/snapshot/templates/snapshot.html:13 templates/app.html:46 msgid "Configuration" msgstr "配置" @@ -3579,6 +3580,150 @@ msgstr "" msgid "Updated media directory" msgstr "" +#: modules/miniflux/__init__.py:18 +msgid "" +"Miniflux is a web-based tool that aggregates news and blog updates from " +"various websites into one centralized, easy-to-read format. It has a simple " +"interface and focuses on a distraction-free reading experience. You can can " +"subscribe to your favorite sites and access full article contents within the " +"reader itself." +msgstr "" + +#: modules/miniflux/__init__.py:23 +msgid "" +"Key features include keyboard shortcuts for quick navigation, full-text " +"search, filtering articles, categories and favorites. Miniflux preserves " +"user privacy by removing trackers. The primary interface is web-based. There " +"are several third-party clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "新闻源阅读器" + +#: modules/miniflux/forms.py:12 +#, fuzzy +#| msgid "Enter a valid username." +msgid "Enter a username for the user." +msgstr "输入有效的用户名。" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "Updating configuration" +msgid "Password confirmation" +msgstr "更新配置" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password updated" +msgid "Passwords do not match." +msgstr "密码已更新" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +#, fuzzy +#| msgid "News Feed Reader" +msgid "Fluent Reader" +msgstr "新闻源阅读器" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "读取" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create User" +msgid "Create admin user" +msgstr "创建用户" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset user password" +msgstr "设置超级用户密码" + +#: modules/miniflux/views.py:38 +#, fuzzy +#| msgid "Create User" +msgid "Create Admin User" +msgstr "创建用户" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "无效用户名:{username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the repository." +msgid "An error occurred while creating the user: {error}." +msgstr "创建存储库时发生错误。" + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "Set SuperUser Password" +msgid "Reset User Password" +msgstr "设置超级用户密码" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "无效用户名:{username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "在配置过程中出错。" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6770,10 +6915,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "新闻源阅读器" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index 33822161c..6b79c1cc1 100644 --- a/plinth/locale/zh_Hant/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-01 20:10-0400\n" +"POT-Creation-Date: 2024-07-29 21:32-0400\n" "PO-Revision-Date: 2024-07-26 08:09+0000\n" "Last-Translator: Ricky From Hong Kong \n" "Language-Team: Chinese (Traditional) clients as well." +msgstr "" + +#: modules/miniflux/__init__.py:42 modules/miniflux/manifest.py:10 +msgid "Miniflux" +msgstr "" + +#: modules/miniflux/__init__.py:44 modules/ttrss/__init__.py:51 +msgid "News Feed Reader" +msgstr "" + +#: modules/miniflux/forms.py:12 +msgid "Enter a username for the user." +msgstr "" + +#: modules/miniflux/forms.py:16 +msgid "Enter a strong password with a minimum of 6 characters." +msgstr "" + +#: modules/miniflux/forms.py:18 +#, fuzzy +#| msgid "An error occurred during configuration." +msgid "Password confirmation" +msgstr "設置過程中發生錯誤。" + +#: modules/miniflux/forms.py:20 +msgid "Enter the same password for confirmation." +msgstr "" + +#: modules/miniflux/forms.py:31 +#, fuzzy +#| msgid "Password deleted." +msgid "Passwords do not match." +msgstr "密碼已刪除。" + +#: modules/miniflux/manifest.py:18 +msgid "Fluent Reader Lite" +msgstr "" + +#: modules/miniflux/manifest.py:33 +msgid "Fluent Reader" +msgstr "" + +#: modules/miniflux/manifest.py:46 +msgid "FluxNews" +msgstr "" + +#: modules/miniflux/manifest.py:61 +msgid "MiniFlutt" +msgstr "" + +#: modules/miniflux/manifest.py:71 +msgid "NetNewsWire" +msgstr "" + +#: modules/miniflux/manifest.py:86 +msgid "Newsflash" +msgstr "" + +#: modules/miniflux/manifest.py:96 +#, fuzzy +#| msgid "Read" +msgid "Read You" +msgstr "讀取" + +#: modules/miniflux/manifest.py:106 +msgid "RSS Guard" +msgstr "" + +#: modules/miniflux/templates/miniflux.html:14 +msgid "" +"Create an admin user to get started. Other users can be created from within " +"Miniflux." +msgstr "" + +#: modules/miniflux/templates/miniflux.html:22 +#: modules/miniflux/templates/miniflux.html:24 +#, fuzzy +#| msgid "Create Location" +msgid "Create admin user" +msgstr "建立儲存路徑" + +#: modules/miniflux/templates/miniflux.html:27 +#: modules/miniflux/templates/miniflux.html:29 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset user password" +msgstr "SSH 伺服器密碼" + +#: modules/miniflux/views.py:38 +msgid "Create Admin User" +msgstr "" + +#: modules/miniflux/views.py:48 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Created admin user: {username}" +msgstr "無效的使用者名稱:{username}" + +#: modules/miniflux/views.py:53 +#, fuzzy, python-brace-format +#| msgid "An error occurred while creating the library." +msgid "An error occurred while creating the user: {error}." +msgstr "建立圖書館時發生錯誤。" + +#: modules/miniflux/views.py:70 +#, fuzzy +#| msgid "SSH server password" +msgid "Reset User Password" +msgstr "SSH 伺服器密碼" + +#: modules/miniflux/views.py:80 +#, fuzzy, python-brace-format +#| msgid "Invalid username: {username}" +msgid "Password reset for user: {username}" +msgstr "無效的使用者名稱:{username}" + +#: modules/miniflux/views.py:85 +#, fuzzy, python-brace-format +#| msgid "An error occurred during configuration." +msgid "An error occurred during password reset: {error}." +msgstr "設置過程中發生錯誤。" + #: modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " @@ -6686,10 +6825,6 @@ msgstr "" msgid "Tiny Tiny RSS" msgstr "" -#: modules/ttrss/__init__.py:51 -msgid "News Feed Reader" -msgstr "" - #: modules/ttrss/manifest.py:10 msgid "Tiny Tiny RSS (TTTRSS)" msgstr "" From 2f82c484ae41adc266e37a74559f19443c828ffd Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 29 Jul 2024 22:01:41 -0400 Subject: [PATCH 19/20] doc: Fetch latest manual Signed-off-by: James Valleroy --- doc/manual/en/Miniflux.raw.wiki | 69 ++++++++++++++++ doc/manual/en/ReleaseNotes.raw.wiki | 23 ++++++ doc/manual/en/Tor.raw.wiki | 37 +-------- doc/manual/en/TorProxy.raw.wiki | 77 ++++++++++++++++++ doc/manual/en/ejabberd.raw.wiki | 2 +- doc/manual/en/freedombox-manual.raw.wiki | 2 + doc/manual/en/images/Miniflux-icon_en_v01.png | Bin 0 -> 5648 bytes doc/manual/en/images/TorProxy-icon_en_V01.png | Bin 0 -> 20070 bytes doc/manual/es/Manual.raw.wiki | 2 + doc/manual/es/Miniflux.raw.wiki | 67 +++++++++++++++ doc/manual/es/ReleaseNotes.raw.wiki | 23 ++++++ doc/manual/es/Samba.raw.wiki | 3 +- doc/manual/es/Tor.raw.wiki | 27 +----- doc/manual/es/TorProxy.raw.wiki | 75 +++++++++++++++++ doc/manual/es/ejabberd.raw.wiki | 18 ++-- doc/manual/es/freedombox-manual.raw.wiki | 2 + doc/manual/es/images/Miniflux-icon_en_v01.png | Bin 0 -> 5648 bytes doc/manual/es/images/TorProxy-icon_en_V01.png | Bin 0 -> 20070 bytes 18 files changed, 351 insertions(+), 76 deletions(-) create mode 100644 doc/manual/en/Miniflux.raw.wiki create mode 100644 doc/manual/en/TorProxy.raw.wiki create mode 100644 doc/manual/en/images/Miniflux-icon_en_v01.png create mode 100644 doc/manual/en/images/TorProxy-icon_en_V01.png create mode 100644 doc/manual/es/Miniflux.raw.wiki create mode 100644 doc/manual/es/TorProxy.raw.wiki create mode 100644 doc/manual/es/images/Miniflux-icon_en_v01.png create mode 100644 doc/manual/es/images/TorProxy-icon_en_V01.png diff --git a/doc/manual/en/Miniflux.raw.wiki b/doc/manual/en/Miniflux.raw.wiki new file mode 100644 index 000000000..8e30b1022 --- /dev/null +++ b/doc/manual/en/Miniflux.raw.wiki @@ -0,0 +1,69 @@ +#language en + +##TAG:TRANSLATION-HEADER-START +~- [[FreedomBox/Manual/Miniflux|English]] - [[es/FreedomBox/Manual/Miniflux|Español]] - [[DebianWiki/EditorGuide#translation|(+)]] -~ +##TAG:TRANSLATION-HEADER-END + +<> + +## BEGIN_INCLUDE + +== Miniflux (News Feed Reader) == +|| {{attachment:Miniflux-icon_en_v01.png|Miniflux icon}} || + +'''Available since:''' !FreedomBox on Debian 13 (Trixie) + +Miniflux is a minimalist and opinionated news feed reader supporting a wide variety of feed formats - RSS, ATOM, RDF and JSON. It is an alternative to [[FreedomBox/Manual/TinyTinyRSS|Tiny Tiny RSS]] on !FreedomBox. + +=== Clients === + +The primary web interface is mobile-friendly and optimized for readability. Miniflux is a progressive web application. It can be added to the home screen on mobile and accessed like a native application. + +Miniflux server provides an API for clients. It is also compatible with existing applications built for Fever or Google Reader API. There is a listing of [[https://miniflux.app/docs/apps.html|clients]] for various desktop and mobile platforms on the official website. + +=== Reader === + +Miniflux's reader supports several content types. In addition to the usual blog posts and comics which most feed readers support, you can also listen to podcasts and play videos from within Miniflux. !YouTube videos are played using youtube-nocookie.com or (optional) a proxy like invidious.io to prevent tracking your preferences across websites. Miniflux also removes tracking pixels and all external !JavaScript. + +Miniflux has a content scraper that allows you to fetch and read the full article even if the site only publishes a summary in their feed. Only the relevant content is scraped, providing a reading experience similar to Firefox Reader View. This scraper is also capable of fetching the video duration from !YouTube or Invidious. + +=== Other Features === + +Miniflux provides some quality-of-life features like full-text search (powered by PostgreSQL database), [[https://miniflux.app/docs/rules.html|filtering rules]], [[https://miniflux.app/docs/keyboard_shortcuts.html|keyboard shortcuts]] and touch events. There are integrations with several applications like read-it-later solutions, bookmarking tools (Shaarli) and messaging apps (Matrix). If you don't use Shaarli, starring an article within Miniflux is equivalent to bookmarking it. + +Miniflux doesn't permit installing additional plugins or themes. You can pick one of the existing light/dark themes or install a browser extension to read in a different theme. + +=== Miniflux on FreedomBox === + +==== User Management ==== + +Miniflux does not integrate with the existing single sign-on mechanisms in !FreedomBox. The !FreedomBox app for Miniflux provides an option to create administrator users. Once an administrator user is created, any further users (administrator or not) can be created and managed from within Miniflux settings. + +The !FreedomBox app also provides an option to reset any Miniflux user's password. This is especially convenient in the case where there is only one person using Miniflux. Without this option, in case the only user of Miniflux forgets their password, another administrator user must be created to reset this user's password from Miniflux settings. + +Since Miniflux accounts are not tied to !FreedomBox accounts, you can provide Miniflux accounts to your friends who do not have accounts on your !FreedomBox. + +==== Migrating from Tiny Tiny RSS ==== + +TODO + +==== Integrations ==== + 1. Adding a bookmark to Shaarli + 2. Posting feeds to a Matrix channel + 3. RSS-Bridge + + +=== External links === + + * Upstream project: https://miniflux.app + * Upstream documentation: https://miniflux.app/docs/index.html + +## END_INCLUDE + +Back to [[FreedomBox/Features|Features introduction]] or [[FreedomBox/Manual|manual]] pages. + + +<> + +---- +CategoryFreedomBox diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index cb04f54af..d7fb11e44 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,29 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 24.16 (2024-07-29) == + +=== Highlights === + + * miniflux: Add new app + * Note that miniflux is currently only available in Debian testing and unstable. + +=== Other Changes === + + * locale: Update translations for Bulgarian, Chinese (Traditional), German, Swedish + * miniflux, ttrss: Factor out duplicated postgres utility methods + * miniflux: Add list of client apps from upstream clients list + * miniflux: Drop postgres-contrib package as it seem redundant + * miniflux: Fix error handling for reset password + * miniflux: Fix issues with running the CLI in a pseudo-terminal + * miniflux: Fix regression in creating admin user + * miniflux: Remove a spurious error message after resetting password + * miniflux: Trim error messages when creating user + * miniflux: tests: functional: Fix failing tests when run out of order + * readme: Mention the AGPLv3+ license + * tests: functional: Handle click failure when waiting for page update + * tests: functional: Handle obscured elements when submitting forms + == FreedomBox 24.15 (2024-07-16) == * locale: Update translations for Albanian, Chinese (Simplified), French, German, Polish, Spanish, Turkish, Ukrainian diff --git a/doc/manual/en/Tor.raw.wiki b/doc/manual/en/Tor.raw.wiki index aa5cc14f6..9f0da3e98 100644 --- a/doc/manual/en/Tor.raw.wiki +++ b/doc/manual/en/Tor.raw.wiki @@ -17,6 +17,8 @@ Tor is a network of servers operated by volunteers. It allows users of these servers to improve their privacy and security while surfing on the Internet. You and your friends are able to access to your !FreedomBox via Tor network without revealing its IP address. Activating Tor application on your !FreedomBox, you will be able to offer remote services (chat, wiki, file sharing, etc...) without showing your location. This application will give you a better protection than a public web server because you will be less exposed to intrusive people on the web. +To download software packages over Tor, or to run a SOCKS proxy, see the [[FreedomBox/Manual/TorProxy|Tor Proxy app]]. + === Using Tor to browse anonymously === Tor Browser is the recommended way to browse the web using Tor. You can download the Tor Browser from https://www.torproject.org/projects/torbrowser.html and follow the instructions on that site to install and run it. @@ -53,41 +55,6 @@ The requirements to run a relay are listed in the [[https://community.torproject * required that a Tor relay be allowed to use a minimum of 100 GByte of outbound and of incoming traffic per month. * recommended that a <40 Mbit/s non-exit relay should have at least 512 MB of RAM available; A relay faster than 40 Mbit/s should have at least 1 GB of RAM. -=== (Advanced) Usage as a SOCKS proxy === -!FreedomBox provides a Tor SOCKS port that other applications can connect to, in -order to route their traffic over the Tor network. This port is accessible on -any interfaces configured in the internal firewall zone. To configure the -application, set SOCKS Host to the internal network connection's IP address, and -set the SOCKS Port to 9050. - -==== Example with Firefox ==== - -Your web browser can be configured to use the Tor network for all of your -browsing activity. This allows for censorship circumvention and also hides your -IP address from websites during regular browsing. For anonymity, using tor -browser is recommended. - -Configure your local !FreedomBox IP address and port 9050 as a SOCKS v5 proxy in -Firefox. There are extensions to allow for easily turning the proxy on and off. - -{{attachment:tor-socks-firefox.png|Configuring Firefox with Tor SOCKS proxy|width=800}} - -With the SOCKS proxy configured, you can now access any onion URL directly -from Firefox. !FreedomBox itself has an onion v3 address that you can connect to -over the Tor network (bookmark this for use in emergency situations). - -=== Circumventing Tor censorship === -If your ISP is trying to block Tor traffic, you can use tor bridge relays to connect to the tor network. - -1. Get the bridge configuration from the [[https://bridges.torproject.org/bridges|Tor BridgeDB]] - -{{attachment:tor-bridge-db.png|Tor BridgeDB|width=800}} - -2. Add the lines to your !FreedomBox Tor configuration as show below. - -{{attachment:tor-bridge-configuration.png|Tor Configuration Page|width=800}} - - === External links === * Upstream project: https://www.torproject.org diff --git a/doc/manual/en/TorProxy.raw.wiki b/doc/manual/en/TorProxy.raw.wiki new file mode 100644 index 000000000..86e2d8f44 --- /dev/null +++ b/doc/manual/en/TorProxy.raw.wiki @@ -0,0 +1,77 @@ +#language en + +##TAG:TRANSLATION-HEADER-START +~- [[FreedomBox/Manual/TorProxy|English]] - [[es/FreedomBox/Manual/TorProxy|Español]] - [[DebianWiki/EditorGuide#translation|(+)]] -~ +##TAG:TRANSLATION-HEADER-END + +<> + +## BEGIN_INCLUDE + +== Tor Proxy (Anonymity Network) == +|| {{attachment:TorProxy-icon_en_V01.png|Tor Proxy icon}} || + +'''Available since''': version 23.14 + +=== What is Tor Proxy? === + +Tor is a network of servers operated by volunteers. It allows users of these servers to improve their privacy and security while surfing on the Internet. + +The Tor Proxy app provides an option to download software packages over Tor for added anonymity. It also provides a web proxy on your !FreedomBox for internal networks, which can be used by various apps to access the internet via the Tor network. In case of ISP censorship, upstream bridges can be configured to circumvented the censorship. + +For using Tor Onion Service, or running a Tor relay, see the [[FreedomBox/Manual/Tor|Tor app]] instead. + +=== Using Tor Browser to browse anonymously === +Tor Browser is the recommended way to browse the web using Tor. You can download the Tor Browser from https://www.torproject.org/projects/torbrowser.html and follow the instructions on that site to install and run it. + +=== (Advanced) Using Tor Proxy as a SOCKS proxy === +!FreedomBox provides a Tor SOCKS port that other applications can connect to, in order to route their traffic over the Tor network. This port is accessible on any interfaces configured in the internal firewall zone. To configure the application, set SOCKS Host to the internal network connection's IP address, and set the SOCKS Port to 9050. + +==== Example with Firefox ==== + +Your web browser can be configured to use the Tor network for all of your +browsing activity. This allows for censorship circumvention and also hides your +IP address from websites during regular browsing. For anonymity, using tor +browser is recommended. + +Configure your local !FreedomBox IP address and port 9050 as a SOCKS v5 proxy in +Firefox. There are extensions to allow for easily turning the proxy on and off. + +{{attachment:tor-socks-firefox.png|Configuring Firefox with Tor SOCKS proxy|width=800}} + +With the SOCKS proxy configured, you can now access any onion URL directly +from Firefox. !FreedomBox itself has an onion v3 address that you can connect to +over the Tor network (bookmark this for use in emergency situations). + +=== Circumventing Tor censorship === +If your ISP is trying to block Tor traffic, you can use tor bridge relays to connect to the tor network. + +1. Get the bridge configuration from the [[https://bridges.torproject.org/bridges|Tor BridgeDB]] + +{{attachment:tor-bridge-db.png|Tor BridgeDB|width=800}} + +2. Add the lines to your !FreedomBox Tor configuration as show below. + +{{attachment:tor-bridge-configuration.png|Tor Configuration Page|width=800}} + +=== External links === + + * Upstream project: https://www.torproject.org/ + * Upstream end user documentation: https://support.torproject.org/ + +==== Client Apps ==== +Links to recommended client apps, where applicable, can be found in !FreedomBox by select the Apps page, selecting the application tile, and clicking the '''> Client Apps''' button. + +Tor proxy may be used by configuring a proxy in your web browser. Alternately, you can use the Tor Browser. + + * Tor Browser download: https://www.torproject.org/download/ + + +## END_INCLUDE + +Back to [[FreedomBox/Features|Features introduction]] or [[FreedomBox/Manual|manual]] pages. + +<> + +---- +CategoryFreedomBox diff --git a/doc/manual/en/ejabberd.raw.wiki b/doc/manual/en/ejabberd.raw.wiki index 700a2bcd7..aa2c2060e 100644 --- a/doc/manual/en/ejabberd.raw.wiki +++ b/doc/manual/en/ejabberd.raw.wiki @@ -86,7 +86,7 @@ Once logged into a FreedomBox/XMPP account (2), the Conversation app provides a ===== Monal (iOS) ===== -[[https://monal-im.org|Monal]] is a free software XMPP client with audio and video call support available from the [[https://apps.apple.com/us/app/monal-free-xmpp-chat/id317711500|App Store]]. Audio and video calls also work between Conversations on Android and Monal. In addition to text messaging, you can use Conversations to send images/files and have group chats. +[[https://monal-im.org|Monal]] is a free software XMPP client with audio and video call support available from the [[https://apps.apple.com/us/app/monal-free-xmpp-chat/id317711500|App Store]]. Audio and video calls also work between Conversations on Android and Monal. In addition to text messaging, you can use Monal to send images/files and have group chats. ===== Siskin (iOS) ===== diff --git a/doc/manual/en/freedombox-manual.raw.wiki b/doc/manual/en/freedombox-manual.raw.wiki index 0c41a34c7..a4302dff1 100644 --- a/doc/manual/en/freedombox-manual.raw.wiki +++ b/doc/manual/en/freedombox-manual.raw.wiki @@ -32,6 +32,7 @@ <> <> <> +<> <> <> <> @@ -47,6 +48,7 @@ <> <> <> +<> <> <> <> diff --git a/doc/manual/en/images/Miniflux-icon_en_v01.png b/doc/manual/en/images/Miniflux-icon_en_v01.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a246a9e50152803c419fab6d6d7ae5dc1be96e GIT binary patch literal 5648 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 S6QqGjFPR2b7gLG04gEjO+=6oe literal 0 HcmV?d00001 diff --git a/doc/manual/en/images/TorProxy-icon_en_V01.png b/doc/manual/en/images/TorProxy-icon_en_V01.png new file mode 100644 index 0000000000000000000000000000000000000000..b1e1c2b75d64b0c0996fc9e3a173c6d7ba537378 GIT binary patch literal 20070 zcmZsj1yogA)bEdUw}3Q=f`F8ibTP`*@fh&?j?RRD0Sm1 z(G@%(anc{d{YLgj)F!=7V7o@pW--1^jg6vTNx$H6AP;E;#vLNfAL=r=ctoEmK2Cid z^ zmCHpD)Dxx{s#MMY*ZHLQdH*M`>-zN078hh(b`}03A5ouxrio8`MNfxL*oFwbyu1Qk z1aW(vvYD|^BoGJ^EY!kcEWO0D>&CKNefGN)Q8^k#?XCu0t4{9~?@8yXqeuk2etqlX zm^Dd+4E*u56@Taufk@5&pvgi{6VvHL<&lZ5m$>Xnl zLx({S)4SZrEb@ z**yJkXP+9P!lbDzqQ(1!AwdzI?`zff9xOx-Geg<{0|pXo4eSxDn>lxwa|2F)6|8E` z2s5nSssJYra=ta(JZvRg?0vt5Xs-)SqJ@N(R&qWjZ2FvH9LmsPb}yQhaPqt)q!;4Qc}o&&V-4=P!#isd=}-{NX^WOHCb%MbDb`Od_-yAC5$1Bd4>d%yz_^x6V(pcFIj3AdK{sScAV9eVD^?QRtlgk53zo-7WWw=o zX#K;sAlx>03JwJY#gYIXV!uP1~oKiS>hj(|I)bzq1MFd_G``M9Tg zKi;*@BL~;}WcL?pfe`vb3IqAS0`rE}pWrYuhs!e(!Lhm!xKtU^OYEkZcQpWG>~-Qy zoizF@9E0D*i3105ww7Lj$aXfkxcH)uIsEG{XV{(J-E94Vd*{E8Hp260mFoomNiLqm zD&O~1Cy|k;)P+@(BS2wJ>i>QQrUABBw(UAZ4ED{auyQiyP+^yb`$iaXz{@R|gX_W? zDVzJ<=@q+To6uV^lJNw@51L;lMx5HT?LvD`&?;kun6XGWnAzG zd}$V|Ou0NbZ*bp{s;ZMnGZ2b0xnSSV%{R*%a;8F;AlRo}JRyvdo!1{S5<7Z2md0Z3pbI$1TFNwtAL5XX^8h&JURQBqs5pP zd{37X6(1f1p>4tNZqxaWQAuMQI|x)Aex8kd6&VmQ>SQ zAf_etS2_`@z!FZ|lBOsJ$IMr;@d?h>dOl=+FSigYP?&EGKZ{Hvi23Ph$;F{;_HH&_~z1&u@SG?UtwVr<*ZW$^U$F`CemkPqI??=b-{6^9=LILF{^tKd~M8%S&`LG>=Q` zM@p0?D?dJ8{cQ?qx=K*Yv%kDW7vD!m6jqT`(4?@_y3&3`=C-#$O`rqM*nFPP|8(PC zth}RICMkz>s5{n-6agw@?=)DdDp3a{Xz-)^3duEIrvI}odiRQz<+J#^o7`7h@ zLssDyU2{hg>zc3t9+6=l>uVKmXFzfBcZXYaum!=CDHRH1HpXbMlNDWK7Z03|dVel|%NqJOGUs`M zyQtr0)W2s|d6L*cV9jAvph_;Fs?N8jH^AUp$@aqgmZ?GXM)8@D}sF}UKg zm2<#5x-$RHc#x&+>7*DReCIR4-Kd$wtY=s@dfGMlZ(ed3Ov*Iq2b+-V?-Md~$saB( zEEqBpVHOsL>$CS}(1z!TGlq*_%KtExv~DDzmmT%6?v$nG)WnX5 zvaykrdQ1KQE~cueW<;&_P@YU7ExWQZ7CWwpjP>SyJKge)#_NL_bIRMEG(Tr}IJv+L6fCAf>Z zrFLI#W_Y+gst7^%v^}Znj`^>T^ta)0y$o3l;AH40s}7`bTjQ$HiWCv`tR9&CL3ed` zUlm$B8>}#D^Efa~e>M1cudnjr$msegy9F{pa8v@Tk&hhv?j;$obcKDmO><9vG(cLG zIZU=#kQ-B1&0p-c)Z1V0ttkFGic5~5t z=Y9!%YB?QMY}%QRwR3U%%!!f=-1O$nwkJNB8S+>TrZ0Gv%yzDx zaJJSCvJ%~zm$y}gc0O~Od6H!B(u{iMwiQL_@~OlZA>GbrA__Be8%tCzI0$>bp5aVx}%??EwZ&$6bvQ)iRhgqL$3#eqUW}L2KVE? z*wxLWDa1L>+SPq%YNBkrIx2^JI`QH2U`*osIOjsB676T}Suy;JKE#L$?-P4O`{LEk zVh$WU+UwKak(rtBtm}*QjqUBunn}Zm2=+!eG)vQ#S>4q`q7fNF?vQmVrwb608MqL> z7)-}hCm9(Z5Axn^Ku0*vSQjjp7+tdLwN92B#bjOnw!{cTWL^AZI_SXW$cCE;A>z&}vQu zJ9yEqR9+j%@Ki<5%)h5RLa)@tIa%}&WrEKPT!pkiycCH zS0RgJi$VpL_$eW#;Nn0x^hoq#ztgtf|Jc$$xZLL#>uCpBYkQ72H8r)zY7{?OOAHQw zhN>A@uWPDtC+{4Ykx%Tk|4JCsgh-p+EFV-Mx@^Htt34+0H$1kA3Z@*Ho@7RLN06Cq zj^+tm{vEr8@IURO-A`M*Ktt@O4EY3OYfY5uA2C#yf6KB0CQO=QyxtR57!nOZ#g{%8nireY+2 z6;_b;??2Y^W+EK}*V~JKXg!v0A+*Mm(;Qk;N-k6%|00?5+WrJJ+7q!$9`?2iXQ)iR zXNl2XA3IzJ>$8W1(0E~RwEQJPEdA-{=*478Z_na2>%qBL_rGFN9_#9fqICL#N(MI< zQG#YUkm~xq%;Xa@9j4n;39knIGSb|!Ii!__8mxfa+YW7)e2XH3!iV1**9QewaiZm$ zk0zeKS@1rdwxo?+Mrt4OJANb#TePvUVce-jf_h{1=-uD%#$t#bSH@H>Ljd?a-$aIR z993YdTt*tNYQH&Y;;#Gskcv~zKPX5?LU=3(kwGcT>9iuP?|1ggb&=O*g6--+;epNDo>HcsCj6yR)$DCcP;^Vv}#j1Sia zrW##Y4SkQa5ba>7F`K-Mt9kY&e|mgq6o|4E=@ke(KfB{kD)uKS=1DLGMH(}kJ*K$m zZ@cJMH`)&o)J6!q=N#8SHGShIrr*7xYkxH)5;9$FX*T*%!F4a|ktLp?*XBLQ^T$hc zUVS@)b1b|@t;UjI8f8XQkY9vy^=k+$>niO6lH3>PAQ zQH0Ni6m7B1T`^J#cV-RQf;HouT88o6I8hE<;yXJTB#@s!El@>8*v>cJ#uxcZu;8(Z zYdckOt3;=KZE_$}XFAj+g5Q2nhb?37Q7pi&tV}_C5>-6ihrT~TLSBLrr36A^*)>&lGeS| z46g#eV_WrqATk|%y&KbBYnSe|RrIFAz4v9| zcOI24Q?7jT5i6H#HS*Lq;z1i-uX`o&pL3^lO}1URUUVB>ph7KO&*J~>{R7=*j{~j* zEg~60{&^STvZh_Zbe}(cbB}M%vCr1itd6*QN>FiTdaPjno@*eEV_fFA{=+dX{5N?iUa14&uCUn+LH_ogl3=^KbcMn zxBrGV5=-Wz*yZMvQi7Z0(3@M(Emjhrha|Pxfmx8-ZFqLJ|4t2f`p#V0Z>$-rQd(Lx zC9>Y!ao$AMZi##6TIO3ig{bX{G;;E`m2gJO;X>f9^vLN=M)t^5cZ~*C8_%(_O=)A7D1G313C4SQ4KN6+FJoqD=F@j(zJO<$GB6J zT`AP=$D24Pb)vl9`uY#@A)@zZ1HYVqyIN zy}kX5KBicTS&(477uBpdx+)PWV{jS5m|h7BoU(0(tRZB?PhGa28XS`QtfUdWrKYN( ztLVkW&ii006C?^y=$mto7jvtV(1$a48*bTP6PkXsMn)vg-y2fu{>zXc7M}CfHI76F zUT2gr*nztESEjW3oLCK3VSb?9Y;f5&)bqKmXWU&=h;A2ayh`g-M+36Pvb$MBQfwqx zrJ;r;lLYotl2q7*pI9AiZQ)4EuqTy7JKu{6_7EO?P;bQ}cwg{=WTZXR)qRgBk~8{$ z!LAfj)lYQd;ot;%v??kp=@b(@4@>QC z(r-7~xW7Z@+;E(rvZ1ic_VXCyneMP*Dtk+=m#oTPr9J6%Hd{2C)>C?q2yivk{90kW6n>>xzj0&ZZy8?LTM0@w1*pQ>)>tJ#@ zd)S@Sz2oIy&grv>o_z%}s`A)RLCS9xm5PiiBWT4tdpznw>1aIMj;wkY#{)JMk7i#V z&iZ-H$x%Wnu3n@GIYmsB={y>i3_%?;2^N$wn2&7ln%8GMUo&=Cw*D@-^MF}ntD>BC z%*TJRf>whgfiW!atJ}_umR&m|@*w2OEi}=NzW%W_jr(2O>kO859o+?Gj|-PmRrw8P zebN2S*T&7R(qSJmI>Mv_EwZH5yG{>QOU459Cxg~KA#X1ARn#b;U!d(YXtThZQ^d1W zJw;13t43?dubT?ny+W_7xt3szdKLUDMNUYgh$JFPO~;!6<=hfK{=?`;iPR^A6Njz* zpO?hnl<>}l^_4iTy>-Cjo|$y>rEKXwLIg|%Z#((TBKLNm8=aF-nLWgnQofpPH zU{`prn|?v$FR38@%X&grjd`?zPv!^bpR&6DJxroW3dRm#s*Wq1^pePc@7ss>pj|*@V zXIzl0pIv8>Z6y;wV?Y#Su%V3TZ3mM@%|Gnz59OygJ>4&yBWouF zZa?Twt9{1P{eo&TSSfRo6NfxlomX4^Z4PsKA;B9ualwqWQ$5h1k}p9)}(%muOFkOj&Q+XEL(y- zEWvnxe-nxR=!DmJu9I6{?@uv;S=8V<68x-FgocQq6AG}ot=)6cB-up8yvq?ZaFF0K zJ!y!-q~|%m5Xi;sUX44lKK>Y4j^>tX0=duDNlIFXolnn6}4bM)*&6aJ< ztP?GQj+*xfT7r%`z2?=r1?Y=8ao#YsoVVhulYA&<0iA@`MRt4>85tQtp!ly1n=@lq zLeqp9PEYi?eVEjjDmIAS+8n6GM7SR}7>WEtWpkVL?%u_7a+ylm5%_Im&ZVvsNo=}d z1+wD*2#@elbIj0opdS+sx8lJ9nab9NoW2s9n^bztd1RpU`H8zD@Y z;|^1jV<223qmRaGa*m<>bN00Nq3rY3zMTGcOc(d{Jnf`Kp?XMQOI5WNeB+uXSm#2X~Xw2A1_nV4~ZZ_Gs!BoM`q){R??T+otMwm8uand(9obQ12+eD z`JbrQQ&f;ik@@8fUD`m-r%$-7iT;E|E|0W78NN9?EdO$*Q$`zict7gZe(VFv4q|td zo5q5R!Fr=1OW4Ov-frzBgNWtloUNHiifoJff^{I*cE_ zKOf^ne1d&jV_tH@H3sK-o&B%iC39}f{wj}MNA{#QH@Sye1nOqGxeVz;+YMX#O(h}TGux*B8> zG0HL!^6>IXsFT>cMabrw*mZIaFDyh)OlX%rGcXdMLAjMKNl|BT&GRqo45{qjz6eB% zv3!-1)n0nMDCqHkB;?v6eW$QYCtqO(M9oxOXqafSIBk1Fp)~jrN-$hp-0u&q+{sKmdaw}&X@+1s z#zrZjCIx4ewY9bTUAV}QW7sv&VU&j3>uK}ytIs}AHhE+)`C;43<2d-WCX1{5s_)LH zm#+siJEHf^sp%m=BPs&pO~^mKfBLIAj`2&aT_&6StLYBYzsvM#B9Y%WTJ@hOI#6AC zOCk`n7NC>PG7T8VGZqP|$&ko^wqItwFU;}Y+bf9(kh%`jo%#-^r9KVM$zIZ@Yd@5-ka&iSs-0~Mgl3kw;-`;Xw< z=9|J3X)UcQe@3Edv5+VVj)-ms?JdFXBwl}JZz0B*3<5(* zf1L!+oeV>(Fg&M11SE^UCnwcjZMtxq7)a3MQI}X|F6mr_v$HaLU7Y22on0>E|8IKg z^R_1nD_Z6B(yV zpC63~vq$Z|et2;@S53C`cdf{_{gLH&oCjS5+3$3r5PXRpuwE5r-W|tyW7tg?@g#3r zb}r5ir@xZUIUc=p`M{?)GU0`UFrMDY>O2(ke|pl`mhN`fd&%-@{f@Gr(`a_b@jE`v z&YEA&4XTcBk1ato{knb#>0!4iVUXnO{$WX+?_$5LAdv$bw<}jC;tan}?0vq|vy& z-dfXY3vOFK9&G5Ja3=a$FTdN{)W4Rbz8+XRep5lBR>$R? zWUezsMEf!IET{LeEhrY(_2r^>V_WDj)Yy|iu7c#;*vLsqL z@ADLNU!#+W4D_R}>KCfLxRXPj97g4XNnQVk1@LtoK6kknm=a&!W#qfzHrVyapow&6 zXXkXHuGMv}40%KkDjene(5AEWN0lfH{#HmCFZtqgKX%JQ&XZ!Lk)uDW=ts3RBp=+W z(V&x@vwQ7-(!!BDIrCaYD2w*bqaG&J4l?!&!57M{M5(sWR5R%gzkMSfG&VLyDAI>@R}QoT0OK_J{jcc;QiPjL5$yx=m{f^xH1@UB%-z75l*@`1{R5 z=ywhm{r9d{+OAKpbAHn_|8!aV$?DYUY4n0)4zxf}4`|&f1;=qoYoW9%F~vLg`V~V~`m6>EoSRwnW7jPbmzIlDiRu?p8d1GjLWdd#<$9-0CAY2j8{TeeuY(x&Ej~%FC!DE9)TX zRQh~TJU*%sd&eUbyI{$URWBWlY?8`?P8NLOSx z12O<5cvQga(bR!RTtZ~=w*y+?V4$Wi%zQhwZR)!m@arB>k{E0(y!M=&3)MRD-^)f@ zoNz-DoNVLVIJn2Z7@*^JX|KDGWYvYc?tACc=2$c(a-v1bx=F7o*TgT}K;yOpjRAA^ zq*cr}W}f%Eb7Ug6_+G#|h%)$LBi!d(C=SaSFj@UQ&gnZXm6F)HMmhW~hgXesx$zrc zF2#8Bx{dj1m%R=`ndEf>36i@>GBOmnnACp!> z&_AyK%q8^x05@8(IoNvLAgDmdKV;AqpZ2(=NE7LB%`jZ6g!YrSJ^_lp^Fd^%{amo5 zot?Cf&Sdg@SGOsbCd=*r+8^khoRAC{lgsj^D-9%qm4@fgVIXC`;+?2)+j)k^UsIdu z*hN|Wy!8+D_taO^t!Gi)H^yr6YBf)Z)D$)Xz56xU#dyNh(#!$& zl9nN-%%xF;lE|(Xkl#OiD)NO4|#^=G_Hp&fK_QVlEc;O->0S^l7IGdb%i>@se4(_M719cKd$fc*pTl`a}+JgJ>@69Q<_dVE}5wj1F zD!q=jxDsR+bRMHYHfv1*n`o{l3ret;p(1`sF_uCcC@A98-DapYEia_H%|f`_r;`jr zU}4~s#TX2IvcF82E(h9FygW)3M9y-u7OK*|&VE^a_mVv#)Y`p0-J`%8RwMiLa zO&|B=z>@8^XR41IyiER*)Y2X~*xCq0wK!N>t|uR~LaVRr#ptoqoHWCiBmOu>t&(q5 z)3&b6Y0NooZCPOly6pz;pUlg>>!16(pWuCO{p)pc8saZxo9dW-FyXa{jQt8>yo{?e zsgAy~u&0SvJaInp0$1+Q=%&lO-}frED`+Sd)wY5cAa%2{w_h8cwvyA)A!}^pbE@B} z0I-gKIc-tbM>Dvob~Q{wUoasYf2+*OMu>3dX@Rj_FY(3H`>`whT0C1%xwe{5%RG!H z3W}c$TfCIX%NZ4*`RPa%@|YuNxSlaC|K<9jC-6D&i#(X?KHtl?p07AWTzFPq^>ZGj zKafjjxL-U{vw0-ZBV@DYQtIV6kUcq+=KWy8O}Ovcfg;IE=j~~J-EO%!CAO1MDv~BM z38-geIZq3k3YoEhi(*NTWF%UCSyh>>H8FBP9`N%1j#^q-4fT_yon30V?@nPaOPjrU zwb_ig-^Ti({Es1)#O$3k=P+jfPLWF}E$rT0J&wU8$M$vnyhj0&9rH&eJ${9_Vg)RU zM3t6<#;o4ft~{Am~UjI;)!<>-vlg^h<&7@7vdIH$T;8g@PF!=XwKI;o zHrtr44<+nAF;Qu%TvB^3{I%wF58dTj_Ei}(S25J!bTz0`q%1T`cKOEEPeD8q+-Y(o zWrIfA(RizdCZ&^Vy<86L# zqqZI#gXYWQ=uYiWt<^T8F8(&BL&9$VlfQrQ{}1bauq_ti zbQ2TmQgp>BZb~@XH9c&XYh`(;T?qb+(C@)zq}y11vLLjmhb6KSMRd26z{!L z?!kXnK||pnV&$l~!=wGrUoazBw@4F!FNlB8l|r9%)jRa(d2|0M&3AcA$jXP+wD{6` zXQG*cwa%ZPXF>qiO|rAG5pg2u6;TWQ=)FBiUosR;YT@7??)mx23<=6>tzqBA-re~o z`tX%2oHXlHHLcq~Q&zFP5!kmXz~xE#)2^bPLFn4z_ikX0IGO+CuG~*oGQVRR-9~d0 z>f1#sxAyo8FAwGik2vTOl(W6Jo7R18uzh+ul64IxMyU4>5v zM50t()}Sl*PEAVQhse*qTO_t#7Kal2uR6o7Cn&u6l4wcXO6-TxSl52gJn=riQZcK# zFLZ1_96XX~ko!9Ez=H|^p(8VJlP{)#O@m+1wS{xVyH%-{JT@~UXhmGJ$eN*RclcNw zBPKG5@hs#`p3xPa_SOFJo6#_2YbCy<#S?wr#8$to*98lxtMgUm#GYF}igNuf<#mTn ze52n2;3+`>IY13=C|g=+r3ty2X(u#Ugc0Jst50a&o)~hPx7dx}#Vc1UDB0%yp8EJQ zySzLP6Ww&IDV=7w&%ts~sm+%Mut2<+SbCuBw6sbVl76}rF1@bb)!lCfAfU9V2LDg8 z5-AOj3-5b58mtl;VVCeT<8d<*i+3-vvR|$f)8bxDHCYb_3C&1ZkepT7rB$~nvoh!A zGh_9-+s)Dt6BR(dp8nusqV772zDUYuyGuetnFN(Qah*En%}V?Jl-kBZBQX>(390OM z2GPyAi|5~3O@cms`s6y2ID*B}MSrDK!B&#m4&^?$zx>}5pP;dB13ogiMQRwnnw_p}W^cv*GJ z;IY@x`N~AGu@PvYxk|YrGeGfzKZDv51gF?dU^C-f8grP1eYoxF=c0O7r>$$e&F#6#SbXlTkH1KR-jnTf#jgu#y^SK;_)1MDLZRZObt6ern z8_7?sV))eXIyi9vjGS>s8*!q-2n+zp386nLq>c3o?{Dkkzhg1HX#%}|-xB@Pw-On6 zQU~*Q`971f_@e2 zR%0|!rdL;2g6f-etkc));Y=!c(oS5J-V| zNnw7LSVxu;%eq`(=7rnEAAEdn19DcPCp92j2hsr(MhEPyDc%rGzP9P&$#xuxnbUn4 zmV}O(8k>}B_J4C#g2<|QM7l>~du9;owYsJKT!iBK1W0}DrzQ9;Z!-LG{7;WRe$gmS zc|rX2U&HD_@yKL&5YD6{t=DERv-f?V-2{b%dZ`Q$#d(dI2lA8xrl_g;TC2_G%hHrR zaeRApnKKK~AnLrK*e^{PJIK3-&3V1bU&-a}zE>C_OI1JZeZKSIF7dQ2O@sbx)`1DJ zLx%ixKdhMo)i2>fSFuv&1ulmjk#m37rcVA7OMjR6Gd=k4Tkx7V z_nqGB6Qk=lMeFI&~35YfD{M11#yfA_w7q_0JMNMe&@ue=hNGwwGP@c5I0I6Pns;uDOH-D5wTtT zo~-!yh1X;0Y7h5i&u@_V;-6$hMRB-hw_GX%KLbXzQa9w#4(E@4w(VB+x_$`Y{_PNY zVpW-j$BzVgrrSXQ_-9hm_pL0H%5XO^HUpl`^&c~~vsfT+6F2P*Y3)1vTxS8?Igl(E0xJ2d4qud)iSXELY#mTvY z@Ob5JY;J1T8=wAiSN|Hx?f1qP1*YhA=1$P1LU`xEPwkhto#Rp3+t{%3+0O~A;gTW9 zRtfB&gXzi=I~snQRlB~dzmui#H;%Z$-mq>^*|sgl_GGzSgDu!`yl&f-OuAFg16{XS zBeUt9YXm~~xTa0w{KtdSw6sLCp#@PND=#4z1GDm$-wxL_7PCDe*T03E_a(`$&W!w` z{ZGG4?$=zOpPU}{i$)#|UC@-b9y1}vv8rqa&n_flO1zD+X|6k8Ueunq)!*~moohH9 zaPWI{Uyw1l-_tsZSz4B!M=z1yoI53;P}1L@cSatbgl&^adfTRV<2PhJu zpzIk;sxy;hThAn~H=|2gS~6*u>Z&slrz+laJTv+({^SWQRd46I*a;>NU;aM6SR-v3 zpIy(5vzz$7De&uO{C@X6_v`{o4pHY#nbUE9x7`R8(rHHrfxUj$6*`f#9S@7iy$b8e zLs#7Q5VUkFO}m{W2!kU_|NaH}5PI~zPR6PC0YcDyU_eezjuG%Ot#VaBxMIN7;06@y zeFRd|jk7H^I45^*_$RRUQGs}Aiajzk`jwam9|3~n!jHJtVKE9IKjbF2o!8ch&?q&Y zRn1u5Qbd7VyTa8N`>NjkX~q{K5#4&nC4=H~2T%FIa2^-%+pIXrSl$ZN`R)e8%gH_GqT z5S>{Dk2TSYq0A_~>K7&p&7Nl5%Z@x#t-eBl6F>1TKwAddGD>)=mKvgp%2>s#byc_i zT066jx0uU!gfaMccXwrB;jhzZ#NL}c$q>8^h>D$^ot2GEXQ^KG=^{N^E&z5w9cUEM zkw!?6$Nt_do5naZJ^a zY|-4e257MBnOg62daqD3{2HPs(zm}R1M>6jpLga>I#2EV8Gite%gyS|b|cj-)&xbi zw`I&&KfyQ3Gj;^w^V}aRClmpeSk-EVi z>*k!XtEPV^Uq%_7ebWKs86-US`*yMB{P?&LDqau+#+B1d$X%VUG#@?I7zuW6h`gti zNOd^#99Zaj0E~3Sw)d`f_o4+VUu}P?TRCaFzRd1*Xgyo&3~z1zw^ictcSNrD^BbTx zTK534Q6=PuafYAq8=f@1Zhhw(m4ot24eObm0B8l`Qu0xaZT$uk6Dpr{*}cup$16h+ z_hUqkr_?>`a?e_CI)A!P-hLy8PM)aI4%2(HO7eoB2g=$&*XK580n&K`@0GP2Kf4&Z zzQE7)T)T4vzaffKvHUMqX}LH#Zw8X28D3L5G!p_%n{T}mD@Oy(pjpuG1|P3eea{er zqhJaoXtJoU;0<5qkr~p@-h}gN?faJ}et(G5;o#PgAU%ja@rbG zx8Q}XW8}+wbMZOgHj}|iczJtQ`kXn>d9G(z+1hr^I}0whZ81^ zl%kwpOr+4gq4{1a{Kp>u)qaQ=0&#;ceoy7a&dA7cbr0B?ty}G(bm($#J2y~H=DhVp zL~A_%vYW&2HQYYL&m}N!Pd;~hJ55Wz&mdIfgeZ!ER%)P=N%UHbJbwAyZ z6ARz-J8AMM1(NRSd=J>E`r{d!#mSdaqw6(nB`m9LUXG90|HfKw+!J|c{CODL>PiGh4_vlmFO55o zWp@tL{{Myxp=`bZahLOw3?+*+JFc&w^#Ol%jWtuyBP}hhfv~2b;ZE5$P2wQcR&_`R z9JB}^t(TJ8E-dC(%Ug~qyj##|JP?$8wgMYI&A?ZZ!TOq-wOsw%KAUrObzKG+vAd+a zH5_&&<46Du8%ZIq!mJnX>iY3|`qN1~w?*F*lat-~)6-tDtJYcMB7T`%b@@2WquQLW zzp%O0>>R7@C>zVFL#NN9M7)o0s8Dcw9#>~u!dzoKmG<+3Hx%$2Lk^4%_06L3*1fy5 zXBd8$+eUZO237*G*$cO01gUgHsG|Q?11$NnRKFn(_Z@o|@e^S}Xdw#zK2d>V2WIiS z))s)NWMNNks@^YfwB$l_LT{e*XcAvU%B*mre8~Um(Bo&U+&%!p%W+EVoh;3%UIUv~3pe zYysbA3E2aPT?w)k2mkZu@F!Y<-|n?_b)8jg7bpJLCqmDXXX2H}u44UanZs`o>wsPw z@5s%b6wAyo!1ZxKBu2ZLb8S9bOS7Fyv^aP#57Sv+@cjs4g#Ta|{f4mscE5uNqb1k` zz=K>T^rosTumMCsAkz39g4aC-4!Vf(J@x&Mbo_%BFV^@&3_?zjYFvLsMMXh0{GX9I ztpxemTHy5_qmo6*F6!8u>5&?GETaODYdIY42j-<)w>$i3MD(cW34PX(8Fb+44+n(+ zwHIVF;D9t`M25`d&(A(knMJo&$z%x03_a*~n-5im|9rhGcR3BU0tgj9QElw)do0Dy z_2%3ceIW}&-EBR$hoTUng&SH{#_n@IySO%cbz^>D1pl2W#8UI&VCP_l(6k2t5RR8e zldGBDyI-i?=Uzugvzi6kKyTpBLdRQmqa`O45L!YS;ybgDk zw@Pg;S1#TFAOw71c#fvcy-qc~P(sLWy+j}7!MzzepMSYFz=>0)T|g1?tZ(clGt}&T z&Yl$8|Eu0O()s_U#emEO<&wOvrY2#BxKI)ME2Pt7JcH(H^j-oX4*|es`C5b>+vi-f z`?{xNvS*a7A8XrFDpCNaQ@m2wywBi&<6kgyUe2bp?RvDMD-)N4?ze74)e|T0vK4| z&|cVFqrdb}!!BS*3u(#7NZ(WGl$OAAf5W zX&&1oj5wM?rQgU71KlPKL5gbyC~5E)uM#-g}S z&d^mUPARYR5eD&Z=Fr1nu8&#@PA`n1H*H9M2mq8g-*PLMoEj_*Rt(Ch%yr;OpaK{{ zkNrVcJj*k^2h}L2R2L>BB`t}qB3=IE_p6oJ@~{!Dz8qm(KtB9d2<|M z(TaZlJoE&F4`4MIaPMK&Fpz@z%2c$WL&=5$f?kw$m>L0yN#wb#Cz7zV? zRcumP;}u6DU7?^mgFA@c(OA>b8ZXYh7ew{#nd32oW*81vM|KPOW*B_zHDt=~in=0i z5F=A&CyJG1M7LWQAzT@f;{5#lm+1gKN)ezW#zaap06|318+kxP38+JubdLSU5^?~= zBf53T!jaoe6wE^j(Z&x+u~4DO1w-44dB&+P#tn-e#Zz!#2O(){{c_8`ITnn?Ab%#$ zAT2f6GU##PGUwMua4Hb4=w{=J*EE)D|9=>qJk^_{43quGx|F`KGg=8u>LjtM1?nsb z(4((MFlc_q@7!eLyk7IP&D6OljOU2aI zx=q5KJ3y%*8U&M>P$;G5JL%v@Jy$9i(+cDEGJ%>CzTtqY+Od;#MK_dhSok+|3>%w2 z@-iSTrS|EwqZ>>%=rG^7UeT;|y$6hYS$*apnZ?R8(!HqGgGvDeGle)%87EbO;R3*H z6>74;DFYxS*aS-cgC*P8)Q3ggf#$CIleo`cOGc7g$znYoU0ZuW`kGOcO~W*&R?#5Q z0wa)s!XcCp`AA#CXVQtvts;k68&@xm5#oHU)eTF)``#CeO9NCz+fq##Qj}XEgEyUf zm?Kxr({)Pa@w&B-ZT%Ur`8{;`ny{DTp}6ntU7)L9EThqy98L=};m;e``lp)Q9du1d zSA3=5xgpL2(7_NZ4#ypoC6rq*4#cxTjX)XWL9Tisqh6o?x{;SP0gI|v;_1_;x_bmG zB0+Yup!C4-vwj(;Ne7BwX8vc5Q{@}+2fRzZwf+SR@p*31VgA#Y>mZQh<`EdUD`sH_SkTP6E>h>Ll>JAF1k4 z$52F7y?FWG9Cc}#s`U$QpHZDWOli$8+C`d6=c4dU3_}HkRX_eI+bPs66G6*Jj}%)& zt%%CEj5++m6E*<`==qTW-hsht@34I93bqJdHs)L@RC?)L`TY(am5KVoPhBu~uWzc@ z24b5gOTyNDGuqpba=p0aP@E3md;x$_Gdx=i&t2$D-FzL1ed_&)VW5}sg3QIOb74|* z>cOpX1_y5V77mZ0r_W8~b7=}|(|CTr>_^w1{Ix1DdQ@;&#;iDh2v{!Y>+P9v8~>|= z^N(jbkK?$ylXAx-XNOtm$03n!CxtZ|8zxz+>HMq{n#pp?kB}nyEez*$v*lOwBR}F= zp+#2-57%YeqlElu7F)}%vd|Ci-n++Rf9;=r_xXN4@6Y@FdcWRJCfk2s(*`Y#i_n?C zS42Xzz{zi@t*|hpq1Z+a%`toyhXSW}Qmt&dr)@M#ZHomaMy)U^w8Qn$*gGr&viZxt zotsm*T5uvC9lvJuYnoZ= zu<%o`DxjrsY@roLIc(L-H5DVy(fLqrR z2RCvKNwR^J09`=Hwvg+y@N(=>XCdfLffZxqk?@XyLT9?Y!_|w1t#191h+Av$1;^a^ z%DC-AK+sGtk2OZB?Ir~9t&g+8>pZ<|CSClHEgIc3M*--l|+d~YGX=3uX^YYnnpP2Fcl`%rwIcd^PIvA!Kv1D zVkKKyE+vpBdug_BO{r9ar9>X1(@abv=@vM>RHY8eWY`h9@PxN4kXjzr?l#GU`)$z! zjRV9CtnlnWG2O(n!9(E>4+iLrRg#Y?sX zYxb5n{AiPM6;^hd%eC1;$Pn0QzBnqykLyg#5_yTl5e7B(NJktEi`XHPP}V8Wj$%^3113(=U=hIt2Atb!|odP_2hw5gK|7<4fRUjPb%%NkUX zjM(mYy9cRqSDQKAbUFs2XN5a-ZkP2PzZ=;3^;(Ds2gkXkC*U?ilwb;57-~Y(0+hk( z{;FLp@9V$0{r;ZPAQr4i_vAJ^7v0yEsVZS5V)&Wo)Ikwb8MK3BosX{jqIzQUTSUIk zNcC=W75{T?n@i8jCkKmzl#D<_s3K+!)yRzp-Ed%IXSB22LoZ}GF%4#TBV3Te2n78R zE05Etoc2V?!3TfHmymhH%4wnGsWA;uGQIndu4#10@|QPLEYW`1r1|obt^EBRD)!(O z>gpyPH7X-CIbkOC5=`-Yk7d4J1R*>uNs^2AfYf z@%r)S;BJIxi@+H5J`ojhY7x?_-;*U1N1JHPx8Dq1hZhUhBw(pT<58S0C{+OcvW$*L zwk%B4rl++cTQ2FbSY?C*CORa~=udZZPnB4>{IUxA?{r+Wjy*(jnib3YO+W7W`-VpM zg^%KS@z$X8`HrSBt0akwbZ#38V)B_JUt1S|qqJsVPc_jba&;Xlr^eii@# literal 0 HcmV?d00001 diff --git a/doc/manual/es/Manual.raw.wiki b/doc/manual/es/Manual.raw.wiki index 0c41a34c7..a4302dff1 100644 --- a/doc/manual/es/Manual.raw.wiki +++ b/doc/manual/es/Manual.raw.wiki @@ -32,6 +32,7 @@ <> <> <> +<> <> <> <> @@ -47,6 +48,7 @@ <> <> <> +<> <> <> <> diff --git a/doc/manual/es/Miniflux.raw.wiki b/doc/manual/es/Miniflux.raw.wiki new file mode 100644 index 000000000..7e846b8b1 --- /dev/null +++ b/doc/manual/es/Miniflux.raw.wiki @@ -0,0 +1,67 @@ +#language es + +<> + +<> + +## BEGIN_INCLUDE + +== Miniflux (Lector de noticias) == +|| {{attachment:FreedomBox/Manual/Miniflux/Miniflux-icon_en_v01.png|Icono de Miniflux}} || + +'''Disponible desde''': !FreedomBox en Debian 13 (Trixie) + +Miniflux es un lector de noticias minimalista y con una marcada personalidad que soporta una amplia variedad de formatos - RSS, ATOM, RDF y JSON. En !FreedomBox es una alternativa a [[es/FreedomBox/Manual/TinyTinyRSS|Tiny Tiny RSS]]. + +=== Clientes === + +La interfaz web primaria es amigable con los dispositivos móviles y maximiza la legibilidad. Miniflux es una aplicación web progresiva. Se puede añadir a la pantalla principal del móvil y acceder como si fuera nativa. + +El servidor Miniflux proporciona una API para clientes. También es compatible con aplicaciones existentes creadas para Fever o la API de Google Reader. Hay una lista de [[https://miniflux.app/docs/apps.html|clientes]] para varias plataformas de escritorio y móviles en el sitio web oficial del projecto original. + +=== Lector === + +El lector de Miniflux soporta varios tipos de contenido. Además de los blogs y comics habituales que soportan la mayoría de lectores, puedes también escuchar podcasts y reproducir videos desde Miniflux. Los videos de !YouTube se reproducen usando youtube-nocookie.com o (opcionalmente) un proxy como invidious.io para evitar que se rastreen tus preferencias entre sitios webs. Miniflux también elimina los pixeles de rastreo y todo el !JavaScript externo. + +Miniflux tiene un extractor de contenido qu te permite obtner y leer el artículo completo incluso si el sitio solo publica un resumen en su feed. Solo se extrae el contenido relevante, proporcionando una experiencia de lectura similar a Firefox Reader View. Este extractor es también capaz de obtener la duración de un video de !YouTube o Invidious. + +=== Otras funcionalidades === + +Miniflux proporciona algunas funcionalidades de comodidad como búsqueda de texto completo (basada en una base de datos PostgreSQL), [[https://miniflux.app/docs/rules.html|reglas de filtrado]], [[https://miniflux.app/docs/keyboard_shortcuts.html|atajos de teclado]] y eventos táctiles. Hay integraciones con varias aplicaciones como soluciones de lectura diferida, marcapáginas (Shaarli) y apps de mensajería (Matrix). Si no usas Shaarli, marca un artículo con una estrella en Miniflux. + +Miniflux no permite instalar extensiones ni estilos. Puedes elegir uno de los estilos existentes o instalar una extensión de navegador para leer con otro estilo. + +=== Miniflux en FreedomBox === + +==== Administración de usuarios ==== + +Miniflux no se integra con los mecanismos de ingreso único de !FreedomBox. La app de !FreedomBox para Miniflux proporciona una opción para crear usuarios administradores. Una vez creado el usuario administrador se pueden crear y administrar más usuarios (administradores o no) desde los ajustes de Miniflux. + +La app de !FreedomBox app también permite restablecer la contraseña de cualquier usuario de Miniflux. Esto es especialmente útil en caso que solo una persona use Miniflux. Sin esta opción, si el único usuario de Miniflux olvida su contraseña habría que crear un administrador para restablecerla desde los ajustes de Miniflux. + +Como las cuentas de Miniflux no están conectadas a las de !FreedomBox puedes dar cuentas Miniflux a tus amigos aunque carezcan de cuenta en !FreedomBox. + +==== Migrar desde Tiny Tiny RSS ==== + +Por hacer + +==== Integraciones ==== + 1. Añadir un marcapáginas a Shaarli + 2. Publicar feeds en un canal de Matrix + 3. Puente RSS + + +=== Enlaces externos === + + * Proyecto original: https://miniflux.app + * Documentación del proyecto original: : https://miniflux.app/docs/index.html + +## END_INCLUDE + +Volver a la [[es/FreedomBox/Features|descripción de Funcionalidades]] o a las páginas del [[es/FreedomBox/Manual|manual]]. + + +<> + +---- +CategoryFreedomBox diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index cb04f54af..d7fb11e44 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,29 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 24.16 (2024-07-29) == + +=== Highlights === + + * miniflux: Add new app + * Note that miniflux is currently only available in Debian testing and unstable. + +=== Other Changes === + + * locale: Update translations for Bulgarian, Chinese (Traditional), German, Swedish + * miniflux, ttrss: Factor out duplicated postgres utility methods + * miniflux: Add list of client apps from upstream clients list + * miniflux: Drop postgres-contrib package as it seem redundant + * miniflux: Fix error handling for reset password + * miniflux: Fix issues with running the CLI in a pseudo-terminal + * miniflux: Fix regression in creating admin user + * miniflux: Remove a spurious error message after resetting password + * miniflux: Trim error messages when creating user + * miniflux: tests: functional: Fix failing tests when run out of order + * readme: Mention the AGPLv3+ license + * tests: functional: Handle click failure when waiting for page update + * tests: functional: Handle obscured elements when submitting forms + == FreedomBox 24.15 (2024-07-16) == * locale: Update translations for Albanian, Chinese (Simplified), French, German, Polish, Spanish, Turkish, Ukrainian diff --git a/doc/manual/es/Samba.raw.wiki b/doc/manual/es/Samba.raw.wiki index 967b66bca..0f4fbc042 100644 --- a/doc/manual/es/Samba.raw.wiki +++ b/doc/manual/es/Samba.raw.wiki @@ -54,7 +54,7 @@ Los shares Samba solo están disponibles en tu red local. Como Syncthing es primordialmente una solución de sincronización, tiene funcionalidades como resolución de conflictos y versionado. Samba solo tiene una copia del fichero, así que no necesita tales funcionalidades. Por ejemplo, si dos personas están editando una hoja de cálculo almacenada en un share Samba el último que grabe el fichero gana. -=== External links === +=== Enlaces externos === * Sitio web del proyecto original: https://www.samba.org * Documentación de uso del proyecto original: https://www.samba.org/samba/docs @@ -66,7 +66,6 @@ Como Syncthing es primordialmente una solución de sincronización, tiene funcio Volver a la [[es/FreedomBox/Features|descripción de Funcionalidades]] o a las páginas del [[es/FreedomBox/Manual|manual]]. - <> ---- diff --git a/doc/manual/es/Tor.raw.wiki b/doc/manual/es/Tor.raw.wiki index 7403a2346..9fb18dbfc 100644 --- a/doc/manual/es/Tor.raw.wiki +++ b/doc/manual/es/Tor.raw.wiki @@ -15,6 +15,8 @@ ''Tor'' es una red de servidores operada por voluntarios. Permite a los usuarios de esos servidores mejorar su privacidad y seguridad cuando navegan por Internet. Tu y tus amigos podéis acceder a tu !FreedomBox a través de la red Tor sin revelar su dirección IP. Activando la aplicación Tor en tu !FreedomBox podrás ofrecer servicios remotos (chat, wiki, file sharing, etc...) sin mostrar tu localización. Esta aplicación te dará una protección mejor que un servidor web público porque estarás menos expuesto a gente intrusiva. +Para descargar paquetes de software a través de Tor, o ejecutar un proxy SOCKS que salga a internet por Tor, ve a [[FreedomBox/Manual/TorProxy|Proxy via Tor]]. + === Usar Tor para navegación anónima === ''Tor Browser'' es la manera recomendada para navegar la web a través de Tor. Puedes descargar Tor Browser desde https://www.torproject.org/projects/torbrowser.html y seguir sus instrucciones para instalarlo y ejecutarlo. @@ -48,31 +50,6 @@ Los requisitos para ejecutar un puente a la red se listan en la [[https://commun * requiere que a se le permita al puente usar un mínimo de 100 GByte de tráfico mensual de salida y de entrada. * recomienda que un nodo sin salida (mero reenrutador) de <40 Mbit/s tenga al menos 512 MB de RAM disponible; Uno más rápido de 40 Mbit/s debería tener al menos 1 GB de RAM. -=== Usar el puerto Tor SOCKS (avanzado) === -!FreedomBox proporciona un puerto Tor SOCKS al que pueden conectar otras aplicaciones para enrutar su tráfico a través de la red Tor. Este puerto es accesible a cualquier interfaz (de red) configurado en la zona interna del cortafuegos. Para configurar la aplicación apunta el ''Host SOCKS'' a la dirección IP interna de la conexión y pon el ''Puerto SOCKS'' a 9050. - -==== Exjemplo con Firefox ==== - -Tu navegador web se puede configurar para emplear la red Tor para toda tu actividad de navegación. Esto permite eludir la censura y oculta tu dirección IP a los sitios web durante la navegación normal. Para anonimato se recomienda usar el Navegador Tor. - -Configura tu dirección IP local de !FreedomBox y el puerto 9050 como un proxy SOCKS en Firefox. Hay extensiones para facilitar la activación y desactivación del proxy. - -{{attachment:tor-socks-firefox.png|Configuring Firefox with Tor SOCKS proxy|width=800}} - -Con en proxy SOCKS configurado puedes acceder cualquier URL de tipo ''onion'' diréctamente desde Firefox. !FreedomBox tiene una dirección onion v3 propia a la que puedes conectarte por la red Tor (guárdala en tus favoritos para usarla en situaciones de emergencia). - - -=== Eludiendo la censura de Tor === -Si tu proveedor de Internet (ISP) está tratando de bloquear el tráfico Tor puedes usar puentes (a la red Tor) para conectar (a la red Tor). - -1. Obtén la configuración de los puentes de [[https://bridges.torproject.org/bridges|Tor BridgeDB]] - -{{attachment:tor-bridge-db.png|Tor BridgeDB|width=800}} - -2. Añade las líneas a la configuración de Tor de tu !FreedomBox como se muestra. - -{{attachment:tor-bridge-configuration.png|Tor Configuration Page|width=800}} - === Enlaces externos === diff --git a/doc/manual/es/TorProxy.raw.wiki b/doc/manual/es/TorProxy.raw.wiki new file mode 100644 index 000000000..972ea44b9 --- /dev/null +++ b/doc/manual/es/TorProxy.raw.wiki @@ -0,0 +1,75 @@ +#language es + +<> + +<> + +## BEGIN_INCLUDE + +== Proxy Tor (Red Anónima) == +|| {{attachment:FreedomBox/Manual/TorProxy/TorProxy-icon_en_V01.png|Tor Proxy icon}} || + +'''Disponible desde''': versión 23.14 + +=== ¿Qué es el Proxy Tor? === + +''Tor'' es una red de servidores operada por voluntarios. Permite a los usuarios de esos servidores mejorar su privacidad y seguridad cuando navegan por Internet. + +La aplicación de proxy para Tor proporciona la posibilidad de descargar paquetes de software por Tor, mejorando el anonimato. También proporciona un proxy web en tu !FreedomBox para redes internas, que varias apps pueden usar para acceder a internet via Tor. En caso de censura del proveedor de internet se pueden configurar pasarelas para circundarla. + +Para usar el servicio Tor Onion o ejecutar un repetidor Tor ve a [[es/FreedomBox/Manual/Tor|la app Tor]]. + +=== Navegación anónima con el navegador Tor === + +El navegador Tor es la manera recomendada de navegar la web usando Tor. Puedes descargar el navegador Tor de https://www.torproject.org/projects/torbrowser.html y seguir sus instrucciones para instalarlo y usarlo. + +=== Usar el Proxy Tor como un proxy SOCKS (Avanzado) === + +!FreedomBox proporciona un puerto Tor SOCKS al que se pueden conectar otras aplicaciones para enrutar su tráfico a través de la red Tor. Este puerto está accessible en cualquier interfaz configurado en la zona interna del cortafuegos. Para configurar la aplicación, asigna el anfitrión SOCKS a la dirección IP de la conexión de red interna y pon el puerto SOCKS a 9050. + +==== Ejemplo con Firefox ==== + +Tu navegador web se puede configurar para que toda tu actividad de navegación pase por la red Tor. +Esto permite eludir la censura y también oculta tu dirección IP a los sitios web. Para el anonimato se recomienda el navegador Tor. + +Configura la dirección IP local de tu !FreedomBox y el puerto 9050 como proxy SOCKS v5 en Firefox. Hay extensiones que facilitan (des)activar el proxy. + +{{attachment:FreedomBox/Manual/TorProxy/tor-socks-firefox.png|Configurar Firefox con Tor como proxy SOCKS|width=800}} + +Con el proxy SOCKS configurado, puedes acceder a cualquier URL onion directamente desde Firefox. +!FreedomBox tiene una dirección onion v3 a la que puedes conectarte a tavés de la red Tor (anótala para emergencias). + +=== Eludir la censura de Tor === +Si tu proveedor de internet te bloquea el tráfico a la red Tor puedes usar pasarelas para acceder. + +1. Obtén la configuración de la pasarela de la [[https://bridges.torproject.org/bridges|base de datos de pasarelas Tor]] + +{{attachment:FreedomBox/Manual/TorProxy/tor-bridge-db.png|Tor BridgeDB|width=800}} + +2. Añade las líneas a la configuración de Tor en !FreedomBox Tor como se muestra a continuación. + +{{attachment:FreedomBox/Manual/TorProxy/tor-bridge-configuration.png|Página de configuración de Tor|width=800}} + +=== Enlaces externos === + + * Sitio web del proyecto original: https://www.torproject.org + * Documentación de uso del proyecto original: https://support.torproject.org + +==== Clientes compatibles ==== + +!FreedomBox recomienda algunas aplicaciones cliente. Selecciona su icono en la página de ''Aplicaciones'' y haz clic en el botón> '''Aplicaciones Cliente'''. + +El proxy se puede usar configurando el proxy en tu navegador web. O mejor, usando el Navegador Tor + + * Descargar el navegador Tor: https://www.torproject.org/download/ + + +## END_INCLUDE + +Volver a la [[es/FreedomBox/Features|descripción de Funcionalidades]] o a las páginas del [[es/FreedomBox/Manual|manual]]. + + +<> + +---- +CategoryFreedomBox diff --git a/doc/manual/es/ejabberd.raw.wiki b/doc/manual/es/ejabberd.raw.wiki index 11efc8397..8d1b3790c 100644 --- a/doc/manual/es/ejabberd.raw.wiki +++ b/doc/manual/es/ejabberd.raw.wiki @@ -28,7 +28,7 @@ Actualmente !FreedomBox ofrece ambas partes desde su interfaz web: un servidor ( Con XMPP las conversaciones se pueden securizar de 2 maneras: 1. TLS: Esto securiza la conexión entre el cliente y el servidor o entre 2 servidores. Esto está altamente recomendado y ya debería estar soportado por todos los clientes. - 1. Punto a punto: Esto securiza los mensajes enviados entre los clientes de modo que ni siquiera el servidor pueda ver los contenidos. El último protocolo y también el más cómodo se llama ''OMEMO'' pero solo lo soportan algunos clientes. Algunos clientes que no soportan OMEMO podrían soportar otro protocolo llamado OTR. Para que funcione ambos clientes tienen que ser compatibles con el mismo protocolo. + 1. Punto a punto: Esto securiza los mensajes enviados entre los clientes de modo que ni siquiera el servidor pueda ver los contenidos. El último protocolo y también el más cómodo se llama ''OMEMO''. Algunos clientes que no soportan OMEMO podrían soportar otro protocolo llamado OTR. Para que funcione ambos clientes tienen que ser compatibles con el mismo protocolo. === Establer un Nombre de Dominio === @@ -69,7 +69,7 @@ Puedes descargar uno de los cliente XMPP para tu smartphone o tableta listados a ===== Conversations (Android) ===== -[[https://conversations.im/|Conversations]] es un cliente XMPP para Android con soporte de videollamada disponible en [[https://f-droid.org/packages/eu.siacs.conversations|F-Droid]] o en la [[https://play.google.com/store/apps/details?id=eu.siacs.conversations|Play Store]]. Además de para mensajería de texto puedes usar Conversations para enviar imágenes y tener conversaciones grupales. +[[https://conversations.im/|Conversations]] es un cliente XMPP para Android con soporte de llamadas de audio y/o video disponible en [[https://f-droid.org/packages/eu.siacs.conversations|F-Droid]] o en la [[https://play.google.com/store/apps/details?id=eu.siacs.conversations|Play Store]]. Las llamadas de audio y video funcionan entre Conversations y Monal sobre iOS. Además de para mensajería de texto puedes usar Conversations para enviar imágenes y/o ficheros y tener conversaciones grupales. || {{attachment:FreedomBox/Manual/ejabberd/conversations-first-screen.png|Conversations - Primera pantalla|width=200}} {{attachment:FreedomBox/Manual/ejabberd/conversations-login.png|Conversations - Pantalla de acceso|width=200}} {{attachment:FreedomBox/Manual/ejabberd/conversations-add-contacts.png|Conversations - Añadir contactos|width=200}}|| @@ -81,17 +81,9 @@ Con ejabberd instalado !FreedomBox proporciona una cuenta XMPP a cada usuario. S Una vez ingresado en tu cuenta !Freedombox/XMPP la app Conversations proporciona un botón + que ofrece varias opciones para contactar a otra gente (3). -===== Movim (Android) ===== - -[[https://movim.eu/|Movim]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://f-droid.org/packages/com.movim.movim/|F-Droid]]. - -===== ChatSecure (iOS) ===== - -[[https://chatsecure.org|ChatSecure]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://apps.apple.com/us/app/chatsecure/id464200063|App Store]]. - ===== Monal (iOS) ===== -[[https://monal-im.org|Monal]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://apps.apple.com/us/app/monal-free-xmpp-chat/id317711500|App Store]]. +[[https://monal-im.org|Monal]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://apps.apple.com/us/app/monal-free-xmpp-chat/id317711500|App Store]]. Las llamadas de audio y video funcionan entre Conversations sobre Android y Monal. Además de para mensajería de texto puedes usar Monal para enviar imágenes y/o ficheros y tener conversaciones grupales. ===== Siskin (iOS) ===== @@ -118,7 +110,7 @@ Finallmente, tras ingresar con éxito verás la pantalla principal de Gajim (3). || {{attachment:FreedomBox/Manual/ejabberd/dino-first-screen.png|Dino - Primera pantalla|width=200}} {{attachment:FreedomBox/Manual/ejabberd/dino-login.png|Dino - Pantalla de acceso|width=300}} {{attachment:FreedomBox/Manual/ejabberd/dino-start-conversation.png|Dino - Comenzar una conversación|width=200}}|| -''De izquierda a derecha: (1) Primera pantalla - (2) Pantalla de acceso - (3) Comenzar una conversación +''De izquierda a derecha: (1) Primera pantalla - (2) Pantalla de acceso - (3) Comenzar una conversación'' Tras la instalación, al abrir Dino por primera vez haz clic en el botón `Configurar cuenta`. Se te pedirá tu `JID`: es tu usuario en !FreedomBox. Introdúcelo y haz clic en `Seguir` (2). O puedes hacer clic en `Crear cuenta` si no tienes usuario en !FreedomBox. @@ -130,7 +122,7 @@ Una vez ingreses podrás comenzar una conversación con algún contacto XMPP o u ===== Monal (MacOS) ===== -[[https://monal.im|Monal]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://apps.apple.com/app/id1499227291?mt=12|Mac App Store]]. +[[https://monal.im|Monal]] es un cliente XMPP libre con soporte a llamadas de audio y/o video disponible en [[https://apps.apple.com/app/id1499227291?mt=12|Mac App Store]]. === Enlaces externos === diff --git a/doc/manual/es/freedombox-manual.raw.wiki b/doc/manual/es/freedombox-manual.raw.wiki index d42e83723..e1a73706c 100644 --- a/doc/manual/es/freedombox-manual.raw.wiki +++ b/doc/manual/es/freedombox-manual.raw.wiki @@ -31,6 +31,7 @@ <> <> <> +<> <> <> <> @@ -46,6 +47,7 @@ <> <> <> +<> <> <> <> diff --git a/doc/manual/es/images/Miniflux-icon_en_v01.png b/doc/manual/es/images/Miniflux-icon_en_v01.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a246a9e50152803c419fab6d6d7ae5dc1be96e GIT binary patch literal 5648 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 S6QqGjFPR2b7gLG04gEjO+=6oe literal 0 HcmV?d00001 diff --git a/doc/manual/es/images/TorProxy-icon_en_V01.png b/doc/manual/es/images/TorProxy-icon_en_V01.png new file mode 100644 index 0000000000000000000000000000000000000000..b1e1c2b75d64b0c0996fc9e3a173c6d7ba537378 GIT binary patch literal 20070 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 literal 0 HcmV?d00001 From ba673b9a51044d4a323df842d96537f89c997e1c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 29 Jul 2024 22:03:09 -0400 Subject: [PATCH 20/20] Release v24.16 to unstable Signed-off-by: James Valleroy --- debian/changelog | 37 +++++++++++++++++++++++++++++++++++++ plinth/__init__.py | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 9efca16aa..3e6aa74eb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,40 @@ +freedombox (24.16) unstable; urgency=medium + + [ 109247019824 ] + * Translated using Weblate (Bulgarian) + + [ Joseph Nuthalapati ] + * miniflux: Add new app + * miniflux: Fix regression in creating admin user + * miniflux: Fix error handling for reset password + * readme: Mention the AGPLv3+ license + * miniflux: Trim error messages when creating user + + [ Sunil Mohan Adapa ] + * miniflux: Drop postgres-contrib package as it seem redundant + * miniflux: Add list of client apps from upstream clients list + * miniflux: Remove a spurious error message after resetting password + * miniflux: Fix issues with running the CLI in a pseudo-terminal + * miniflux: tests: functional: Fix failing tests when run out of order + * miniflux, ttrss: Factor out duplicated postgres utility methods + * tests: functional: Handle click failure when waiting for page update + * tests: functional: Handle obscured elements when submitting forms + + [ Ricky From Hong Kong ] + * Translated using Weblate (Chinese (Traditional)) + + [ Ettore Atalan ] + * Translated using Weblate (German) + + [ bittin1ddc447d824349b2 ] + * Translated using Weblate (Swedish) + + [ James Valleroy ] + * locale: Update translation strings + * doc: Fetch latest manual + + -- James Valleroy Mon, 29 Jul 2024 22:02:09 -0400 + freedombox (24.15) unstable; urgency=medium [ gallegonovato ] diff --git a/plinth/__init__.py b/plinth/__init__.py index 9b97b02ba..e588c055e 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '24.15' +__version__ = '24.16'