Compare commits

..

No commits in common. "37e40883e1964893cccd5465ffbaf58b6dd1d339" and "d63324160a4257a1d196b9f4e13a3bf24048bfc6" have entirely different histories.

13 changed files with 328 additions and 679 deletions

5
debian/copyright vendored
View File

@ -38,11 +38,6 @@ Copyright: Marie Van den Broeck (https://thenounproject.com/marie49/)
Comment: https://thenounproject.com/icon/162372/ Comment: https://thenounproject.com/icon/162372/
License: CC-BY-SA-3.0 License: CC-BY-SA-3.0
Files: static/themes/default/js/color-modes.js
Copyright: 2011-2025 The Bootstrap Authors
Comment: https://getbootstrap.com/docs/5.3/customize/color-modes/
License: CC-BY-3.0
Files: plinth/modules/bepasty/static/icons/bepasty.svg Files: plinth/modules/bepasty/static/icons/bepasty.svg
Copyright: (c) 2014 by the Bepasty Team, see the AUTHORS file. Copyright: (c) 2014 by the Bepasty Team, see the AUTHORS file.
Comment: https://github.com/bepasty/bepasty-server/blob/master/src/bepasty/static/app/bepasty.svg Comment: https://github.com/bepasty/bepasty-server/blob/master/src/bepasty/static/app/bepasty.svg

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: FreedomBox UI\n" "Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-25 01:21+0000\n" "POT-Creation-Date: 2025-11-25 01:21+0000\n"
"PO-Revision-Date: 2025-12-02 12:00+0000\n" "PO-Revision-Date: 2025-10-30 04:24+0000\n"
"Last-Translator: Coucouf <coucouf@coucouf.fr>\n" "Last-Translator: Coucouf <coucouf@coucouf.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/freedombox/" "Language-Team: French <https://hosted.weblate.org/projects/freedombox/"
"freedombox/fr/>\n" "freedombox/fr/>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.15-dev\n" "X-Generator: Weblate 5.14.1-dev\n"
#: plinth/config.py:103 #: plinth/config.py:103
#, python-brace-format #, python-brace-format
@ -4460,7 +4460,11 @@ msgstr ""
"moins un domaine pour pouvoir utiliser Matrix Synapse." "moins un domaine pour pouvoir utiliser Matrix Synapse."
#: plinth/modules/matrixsynapse/templates/matrix-synapse.html:20 #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:20
#, python-format #, fuzzy, python-format
#| msgid ""
#| "The Matrix server domain is set to <em>%(domain_name)s</em>. User IDs "
#| "will look like <em>@username:%(domain_name)s</em>. Changing the domain "
#| "name after the initial setup is currently not supported."
msgid "" msgid ""
"The Matrix server domain is set to <em>%(domain_name)s</em>. User IDs will " "The Matrix server domain is set to <em>%(domain_name)s</em>. User IDs will "
"look like <em>@username:%(domain_name)s</em>. Changing the domain name " "look like <em>@username:%(domain_name)s</em>. Changing the domain name "
@ -4468,9 +4472,8 @@ msgid ""
msgstr "" msgstr ""
"Votre serveur Matrix utilise le domaine <em>%(domain_name)s</em>. Les " "Votre serveur Matrix utilise le domaine <em>%(domain_name)s</em>. Les "
"identifiants utilisateur seront du type <em>@identifiant:%(domain_name)s</" "identifiants utilisateur seront du type <em>@identifiant:%(domain_name)s</"
"em>. Le changement du nom de domaine nécéssite la désinstallation et " "em>. Le changement du nom de domaine après linstallation initiale nest "
"réinstallation de lappli ce qui entraînera la suppression de lensemble des " "actuellement pas pris en charge."
"données de cette appli."
#: plinth/modules/matrixsynapse/templates/matrix-synapse.html:28 #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:28
msgid "" msgid ""
@ -4513,8 +4516,10 @@ msgid "Unlimited"
msgstr "Illimité" msgstr "Illimité"
#: plinth/modules/matrixsynapse/templates/matrix-synapse.html:78 #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:78
#, fuzzy
#| msgid "Feed generator"
msgid "Federation" msgid "Federation"
msgstr "Fédération" msgstr "Générateur de fils"
#: plinth/modules/matrixsynapse/templates/matrix-synapse.html:81 #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:81
#, python-format #, python-format
@ -4525,12 +4530,6 @@ msgid ""
"hosted here. If you face problems with federation, try the <a " "hosted here. If you face problems with federation, try the <a "
"href=\"%(tester_url)s#%(domain_name)s\"> federation tester tool</a>." "href=\"%(tester_url)s#%(domain_name)s\"> federation tester tool</a>."
msgstr "" msgstr ""
"Matrix Synapse est configuré pour communiquer avec dautres serveurs sur "
"Internet. Ceci permet aux utilisateurices de la %(box_name)s de participer à "
"des salons hébergés ailleurs et à des utilisateurices dautres serveurs de "
"participer aux salons hébergés ici. En cas de problème avec la fédération, "
"vous pouvez utiliser l<a href=\"%(tester_url)s#%(domain_name)s\">outil de "
"test de fédération</a>."
#: plinth/modules/matrixsynapse/templates/matrix-synapse.html:99 #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:99
#, python-format #, python-format
@ -7454,16 +7453,20 @@ msgstr ""
"dactualités." "dactualités."
#: plinth/modules/rssbridge/__init__.py:28 #: plinth/modules/rssbridge/__init__.py:28
#, python-brace-format #, fuzzy, python-brace-format
#| msgid ""
#| "You can use RSS-Bridge with <a href=\"{miniflux_url}\">Miniflux</a> or <a "
#| "href=\"{ttrss_url}\">Tiny Tiny RSS</a> to follow various websites. When "
#| "adding a feed, enable authentication and use your {box_name} credentials."
msgid "" msgid ""
"You can use RSS-Bridge with <a href=\"{miniflux_url}\">Miniflux</a> or <a " "You can use RSS-Bridge with <a href=\"{miniflux_url}\">Miniflux</a> or <a "
"href=\"{nextcloud_url}\">Nextcloud News</a> to follow various websites. When " "href=\"{nextcloud_url}\">Nextcloud News</a> to follow various websites. When "
"adding a feed, enable authentication and use your {box_name} credentials." "adding a feed, enable authentication and use your {box_name} credentials."
msgstr "" msgstr ""
"Vous pouvez utiliser RSS-Bridge avec <a href=\"{miniflux_url}\">Miniflux</a> " "Vous pouvez utiliser RSS-Bridge avec <a href=\"{miniflux_url}\">Miniflux</a> "
"ou bien <a href=\"{nextcloud_url}\">Nextcloud News</a> pour suivre " "ou bien <a href=\"{ttrss_url}\">Tiny Tiny RSS</a> pour suivre différents "
"différents sites Internet. Lors de lajout dun fil, activez " "sites Internet. Lors de lajout dun fil, activez lauthentification et "
"lauthentification et utilisez vos identifiants {box_name}." "utilisez les identifiants de {box_name}."
#: plinth/modules/rssbridge/__init__.py:49 #: plinth/modules/rssbridge/__init__.py:49
msgid "Read and subscribe to news feeds" msgid "Read and subscribe to news feeds"

View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-25 01:21+0000\n" "POT-Creation-Date: 2025-11-25 01:21+0000\n"
"PO-Revision-Date: 2025-12-02 12:00+0000\n" "PO-Revision-Date: 2025-11-21 02:51+0000\n"
"Last-Translator: OwlGale <owlgale@users.noreply.hosted.weblate.org>\n" "Last-Translator: Roman Akimov <zoompyc@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/freedombox/" "Language-Team: Russian <https://hosted.weblate.org/projects/freedombox/"
"freedombox/ru/>\n" "freedombox/ru/>\n"
"Language: ru\n" "Language: ru\n"
@ -107,7 +107,7 @@ msgstr "Использовать языковые настройки брауз
#: plinth/menu.py:116 plinth/templates/base.html:120 #: plinth/menu.py:116 plinth/templates/base.html:120
msgid "Home" msgid "Home"
msgstr "Главная" msgstr "Домой"
#: plinth/menu.py:117 plinth/templates/base.html:129 #: plinth/menu.py:117 plinth/templates/base.html:129
msgid "Apps" msgid "Apps"
@ -1237,7 +1237,7 @@ msgstr "Библиотека"
#: plinth/modules/calibre/manifest.py:21 #: plinth/modules/calibre/manifest.py:21
msgid "Ebook reader" msgid "Ebook reader"
msgstr "Читалка" msgstr "Читалка для электронных книг"
#: plinth/modules/calibre/templates/calibre-delete-library.html:11 #: plinth/modules/calibre/templates/calibre-delete-library.html:11
#, python-format #, python-format
@ -1632,12 +1632,12 @@ msgstr "BitTorrent клиент, написанный на Python/pygtk"
#: plinth/modules/deluge/manifest.py:21 #: plinth/modules/deluge/manifest.py:21
#: plinth/modules/transmission/manifest.py:39 #: plinth/modules/transmission/manifest.py:39
msgid "BitTorrent" msgid "BitTorrent"
msgstr "BitTorrent" msgstr "БитТоррент"
#: plinth/modules/deluge/manifest.py:21 plinth/modules/roundcube/manifest.py:23 #: plinth/modules/deluge/manifest.py:21 plinth/modules/roundcube/manifest.py:23
#: plinth/modules/transmission/manifest.py:39 #: plinth/modules/transmission/manifest.py:39
msgid "Web client" msgid "Web client"
msgstr "Веб-клиент" msgstr "Веб клиент"
#: plinth/modules/deluge/manifest.py:21 plinth/modules/syncthing/manifest.py:58 #: plinth/modules/deluge/manifest.py:21 plinth/modules/syncthing/manifest.py:58
#: plinth/modules/transmission/manifest.py:39 #: plinth/modules/transmission/manifest.py:39
@ -2465,7 +2465,7 @@ msgstr "FairEmail"
#: plinth/modules/email/manifest.py:82 #: plinth/modules/email/manifest.py:82
msgid "Email server" msgid "Email server"
msgstr "Почтовый сервер" msgstr "Сервер Электронной почты"
#: plinth/modules/email/manifest.py:82 #: plinth/modules/email/manifest.py:82
msgid "IMAP" msgid "IMAP"
@ -2473,7 +2473,7 @@ msgstr "IMAP"
#: plinth/modules/email/manifest.py:82 #: plinth/modules/email/manifest.py:82
msgid "Spam control" msgid "Spam control"
msgstr "Защита от спама" msgstr "Контроль спама"
#: plinth/modules/email/templates/email-aliases.html:13 #: plinth/modules/email/templates/email-aliases.html:13
#: plinth/modules/email/templates/email.html:15 #: plinth/modules/email/templates/email.html:15
@ -2635,16 +2635,16 @@ msgstr ""
#: plinth/modules/ikiwiki/__init__.py:79 #: plinth/modules/ikiwiki/__init__.py:79
#: plinth/modules/tiddlywiki/__init__.py:61 #: plinth/modules/tiddlywiki/__init__.py:61
msgid "View and edit wiki applications" msgid "View and edit wiki applications"
msgstr "Просмотр и редактирование вики приложений" msgstr "Просмотр и редактирование приложений Wiki"
#: plinth/modules/featherwiki/__init__.py:59 #: plinth/modules/featherwiki/__init__.py:59
#: plinth/modules/featherwiki/manifest.py:9 #: plinth/modules/featherwiki/manifest.py:9
msgid "Feather Wiki" msgid "Feather Wiki"
msgstr "Feather Wiki" msgstr "Перо Вики"
#: plinth/modules/featherwiki/forms.py:13 plinth/modules/tiddlywiki/forms.py:13 #: plinth/modules/featherwiki/forms.py:13 plinth/modules/tiddlywiki/forms.py:13
msgid "Wiki files cannot be named \"index.html\"." msgid "Wiki files cannot be named \"index.html\"."
msgstr "Вики файлы не могут называться \"index.html\"." msgstr "Wiki-файлы не могут называться \"index.html\"."
#: plinth/modules/featherwiki/forms.py:20 plinth/modules/tiddlywiki/forms.py:20 #: plinth/modules/featherwiki/forms.py:20 plinth/modules/tiddlywiki/forms.py:20
msgid "Name of the wiki file, with file extension \".html\"" msgid "Name of the wiki file, with file extension \".html\""
@ -2684,13 +2684,13 @@ msgstr "Загрузите существующий файл Feather Wiki с э
#: plinth/modules/mediawiki/manifest.py:25 #: plinth/modules/mediawiki/manifest.py:25
#: plinth/modules/tiddlywiki/manifest.py:19 #: plinth/modules/tiddlywiki/manifest.py:19
msgid "Wiki" msgid "Wiki"
msgstr "Вики" msgstr "Wiki"
#: plinth/modules/featherwiki/manifest.py:18 #: plinth/modules/featherwiki/manifest.py:18
#: plinth/modules/infinoted/manifest.py:46 #: plinth/modules/infinoted/manifest.py:46
#: plinth/modules/tiddlywiki/manifest.py:20 #: plinth/modules/tiddlywiki/manifest.py:20
msgid "Note taking" msgid "Note taking"
msgstr "Заметки" msgstr "Взятие на заметку"
#: plinth/modules/featherwiki/manifest.py:18 #: plinth/modules/featherwiki/manifest.py:18
#: plinth/modules/ikiwiki/manifest.py:15 #: plinth/modules/ikiwiki/manifest.py:15
@ -2703,13 +2703,13 @@ msgstr "Веб-сайт"
#: plinth/modules/featherwiki/manifest.py:18 #: plinth/modules/featherwiki/manifest.py:18
#: plinth/modules/tiddlywiki/manifest.py:25 #: plinth/modules/tiddlywiki/manifest.py:25
msgid "Quine" msgid "Quine"
msgstr "Куайн" msgstr "Quine"
#: plinth/modules/featherwiki/manifest.py:18 #: plinth/modules/featherwiki/manifest.py:18
#: plinth/modules/nextcloud/manifest.py:56 #: plinth/modules/nextcloud/manifest.py:56
#: plinth/modules/tiddlywiki/manifest.py:26 #: plinth/modules/tiddlywiki/manifest.py:26
msgid "Non-Debian" msgid "Non-Debian"
msgstr "Не Debian" msgstr "Не-Debian"
#: plinth/modules/featherwiki/templates/featherwiki_configure.html:12 #: plinth/modules/featherwiki/templates/featherwiki_configure.html:12
#: plinth/modules/tiddlywiki/templates/tiddlywiki_configure.html:12 #: plinth/modules/tiddlywiki/templates/tiddlywiki_configure.html:12
@ -2781,7 +2781,7 @@ msgstr "Скачать"
#: plinth/modules/featherwiki/views.py:20 plinth/modules/tiddlywiki/views.py:20 #: plinth/modules/featherwiki/views.py:20 plinth/modules/tiddlywiki/views.py:20
msgid "A wiki file with the given name already exists." msgid "A wiki file with the given name already exists."
msgstr "Вики файл с указанным именем уже существует." msgstr "Файл wiki с указанным именем уже существует."
#: plinth/modules/featherwiki/views.py:54 plinth/modules/tiddlywiki/views.py:54 #: plinth/modules/featherwiki/views.py:54 plinth/modules/tiddlywiki/views.py:54
msgid "Wiki created." msgid "Wiki created."
@ -2816,7 +2816,7 @@ msgstr "Добавлен вики-файл."
#: plinth/modules/featherwiki/views.py:119 #: plinth/modules/featherwiki/views.py:119
#: plinth/modules/tiddlywiki/views.py:120 #: plinth/modules/tiddlywiki/views.py:120
msgid "Failed to add wiki file." msgid "Failed to add wiki file."
msgstr "Не удалось добавить вики файл." msgstr "Не удалось добавить файл wiki."
#: plinth/modules/featherwiki/views.py:138 #: plinth/modules/featherwiki/views.py:138
#: plinth/modules/tiddlywiki/views.py:139 #: plinth/modules/tiddlywiki/views.py:139
@ -3248,7 +3248,7 @@ msgstr "GNOME"
#: plinth/modules/gnome/manifest.py:9 plinth/templates/clients.html:42 #: plinth/modules/gnome/manifest.py:9 plinth/templates/clients.html:42
msgid "Desktop" msgid "Desktop"
msgstr "Рабочий стол" msgstr "Десктоп"
#: plinth/modules/gnome/manifest.py:10 #: plinth/modules/gnome/manifest.py:10
msgid "Browser" msgid "Browser"
@ -3260,7 +3260,7 @@ msgstr "Офисный пакет"
#: plinth/modules/gnome/manifest.py:12 #: plinth/modules/gnome/manifest.py:12
msgid "Software store" msgid "Software store"
msgstr "Магазин приложений" msgstr "Магазин программного обеспечения"
#: plinth/modules/gnome/manifest.py:13 #: plinth/modules/gnome/manifest.py:13
msgid "GUI" msgid "GUI"
@ -3288,7 +3288,7 @@ msgstr "Руководство"
#: plinth/modules/help/views.py:91 plinth/templates/help-menu.html:27 #: plinth/modules/help/views.py:91 plinth/templates/help-menu.html:27
#: plinth/templates/help-menu.html:28 #: plinth/templates/help-menu.html:28
msgid "Get Support" msgid "Get Support"
msgstr "Получить помощь" msgstr "Получить поддержку"
#: plinth/modules/help/__init__.py:45 #: plinth/modules/help/__init__.py:45
#: plinth/modules/help/templates/help_feedback.html:9 #: plinth/modules/help/templates/help_feedback.html:9
@ -3303,7 +3303,7 @@ msgstr "Отправить отзыв"
#: plinth/modules/help/views.py:74 plinth/templates/help-menu.html:39 #: plinth/modules/help/views.py:74 plinth/templates/help-menu.html:39
#: plinth/templates/help-menu.html:40 #: plinth/templates/help-menu.html:40
msgid "Contribute" msgid "Contribute"
msgstr "Помочь проекту" msgstr "Помощь проекту"
#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:216 #: plinth/modules/help/__init__.py:53 plinth/templates/base.html:216
#: plinth/templates/base.html:219 plinth/templates/help-menu.html:46 #: plinth/templates/base.html:219 plinth/templates/help-menu.html:46
@ -3327,13 +3327,13 @@ msgstr "Вы используете %(os_release)s и %(box_name)s версии
msgid "" msgid ""
"There is a new %(box_name)s version <a href=\"%(upgrades_url)s\">available</" "There is a new %(box_name)s version <a href=\"%(upgrades_url)s\">available</"
"a>." "a>."
msgstr "Доступна <a href=\"%(upgrades_url)s\">новая версия</a> %(box_name)s." msgstr "<a href=\"%(upgrades_url)s\">Доступна новая версия</a> %(box_name)s."
#: plinth/modules/help/templates/help_about.html:40 #: plinth/modules/help/templates/help_about.html:40
#: plinth/modules/upgrades/templates/upgrades_configure.html:42 #: plinth/modules/upgrades/templates/upgrades_configure.html:42
#, python-format #, python-format
msgid "%(box_name)s is up to date." msgid "%(box_name)s is up to date."
msgstr "Установлены все последние обновления %(box_name)s." msgstr "%(box_name)s в актуальном состоянии."
#: plinth/modules/help/templates/help_about.html:49 #: plinth/modules/help/templates/help_about.html:49
#, python-format #, python-format
@ -3346,14 +3346,14 @@ msgid ""
"and a Tor relay, on a device that can replace your Wi-Fi router, so that " "and a Tor relay, on a device that can replace your Wi-Fi router, so that "
"your data stays with you." "your data stays with you."
msgstr "" msgstr ""
"%(box_name)s это общественный проект для разработки, проектирования и " "%(box_name)s - это проект сообщества для разработки, дизайна и поощрения "
"продвижения персональных серверов работающих на свободном программном " "личных серверов под управлением свободного программного обеспечения для "
"обеспечении для частных, личных коммуникаций. Это сетевое устройство " "частных, личных сообщений. Это сетевое устройство, предназначенное разрешить "
"предназначено для взаимодействия с остальной частью Интернета при условии " "взаимодействие с остальной частью Интернета в условиях защиты "
"обеспечения конфиденциальности и безопасности данных. Оно позволяет " "конфиденциальности и безопасности данных. Он содержит различные приложения, "
"размещать такие веб-приложения, как блог, вики, веб-сайт, социальную сеть, " "такие как блог, вики, веб-сайт, социальную сеть, электронную почту, Web-"
"электронную почту, веб-прокси и узел сети Tor, на устройстве, которое может " "прокси и сервер Tor, на устройстве, которое может заменить ваш маршрутизатор "
"заменить ваш Wi-Fi роутер, чтобы ваши данные оставались с вами." "Wi-Fi, так что ваши данные остаются с вами."
#: plinth/modules/help/templates/help_about.html:62 #: plinth/modules/help/templates/help_about.html:62
msgid "" msgid ""
@ -3364,13 +3364,12 @@ msgid ""
"giving back power to the users over their networks and machines, we are " "giving back power to the users over their networks and machines, we are "
"returning the Internet to its intended peer-to-peer architecture." "returning the Internet to its intended peer-to-peer architecture."
msgstr "" msgstr ""
"Мы живем в мире, где использование сети определяется теми, кто зачастую не " "Мы живем в мире, сетями владеют те, с кем у нас не всегда общие интересы. "
"действует в наших интересах. Разрабатывая программное обеспечение, которое " "Путем создания программного обеспечения, которое не полагается на "
"не полагается на централизованный сервис, мы можем вернуть контроль и " "центральную службу, мы можем восстановить контроль и конфиденциальность. "
"конфиденциальность. Сохраняя наши данные у себя дома, мы повышаем правовую " "Сохраняя наши данные в наших домах, мы получаем полезную правовую защиту над "
"защищенность над ними. Давая пользователям власть над их сетями и " "ними. Давая обратно власть пользователям в их сети и машины, мы возвращаемся "
"устройствами, мы возвращаем Интернет к его одноранговой архитектуре, каким " его предполагаемую архитектуру Интернета peer-to-peer."
"он был задуман."
#: plinth/modules/help/templates/help_about.html:75 #: plinth/modules/help/templates/help_about.html:75
#, python-format #, python-format
@ -3380,7 +3379,7 @@ msgid ""
"package." "package."
msgstr "" msgstr ""
"Существует ряд проектов, которые работают в сторону реализации будущего " "Существует ряд проектов, которые работают в сторону реализации будущего "
"распределенных сервисов, %(box_name)s стремится объединить их." "распределенных служб, %(box_name)s стремится объединить их в удобном пакете."
#: plinth/modules/help/templates/help_about.html:83 #: plinth/modules/help/templates/help_about.html:83
#, python-format #, python-format
@ -3393,17 +3392,16 @@ msgid ""
"running \"apt source <i>package_name</i>\" in a terminal (using Cockpit or " "running \"apt source <i>package_name</i>\" in a terminal (using Cockpit or "
"SSH)." "SSH)."
msgstr "" msgstr ""
"%(box_name)s является свободным программным обеспечением и распространяется " "%(box_name)s - это свободное ПО, лицензированное по лицензии GNU Affero "
"по лицензии GNU Affero General Public License. Исходный код доступен онлайн " "General Public License. <a href=\"http://salsa.debian.org/freedombox-team/"
"в <a href=\"https://salsa.debian.org/freedombox-team/freedombox\"> " "freedombox\"> %(box_name)s репозиторий</a>. Кроме того, исходный код любого "
"репозитории %(box_name)s </a>. Кроме того, исходный код пакетов Debian " "пакета Debian может быть получен из <a href=\"https://sources.debian.org/"
"можно получить с сайта <a href=\"https://sources.debian.org/\">Debian " "\">Debian Sources</a> site, или путем запуска \"apt source <i>package_name</"
"Sources</a> или выполнив команду \"apt source <i>название_пакета</i>\" в " "i>\" в терминале (с использованием Cockpit или SSH)."
"терминале (с помощью Cockpit или SSH)."
#: plinth/modules/help/templates/help_about.html:97 #: plinth/modules/help/templates/help_about.html:97
msgid "Learn" msgid "Learn"
msgstr "Освоить" msgstr "Узнать"
#: plinth/modules/help/templates/help_about.html:116 #: plinth/modules/help/templates/help_about.html:116
#: plinth/templates/toolbar.html:19 #: plinth/templates/toolbar.html:19
@ -3412,7 +3410,7 @@ msgstr "Пожертвовать"
#: plinth/modules/help/templates/help_about.html:119 #: plinth/modules/help/templates/help_about.html:119
msgid "Join project" msgid "Join project"
msgstr "Присоединиться к проекту" msgstr "Присоединяйтесь к проекту"
#: plinth/modules/help/templates/help_about.html:123 #: plinth/modules/help/templates/help_about.html:123
msgid "Translate" msgid "Translate"
@ -3710,11 +3708,11 @@ msgstr "Home Assistant"
#: plinth/modules/homeassistant/manifest.py:62 #: plinth/modules/homeassistant/manifest.py:62
msgid "Home Automation" msgid "Home Automation"
msgstr "Умный дом" msgstr "Домашняя автоматизация"
#: plinth/modules/homeassistant/manifest.py:63 #: plinth/modules/homeassistant/manifest.py:63
msgid "IoT" msgid "IoT"
msgstr "Интернет вещей" msgstr "IoT"
#: plinth/modules/homeassistant/manifest.py:64 #: plinth/modules/homeassistant/manifest.py:64
#: plinth/modules/networks/manifest.py:8 #: plinth/modules/networks/manifest.py:8
@ -3735,7 +3733,7 @@ msgstr "Z-Wave"
#: plinth/modules/homeassistant/manifest.py:67 #: plinth/modules/homeassistant/manifest.py:67
msgid "Thread" msgid "Thread"
msgstr "Thread" msgstr "Тред"
#: plinth/modules/homeassistant/templates/homeassistant.html:17 #: plinth/modules/homeassistant/templates/homeassistant.html:17
msgid "" msgid ""
@ -3786,9 +3784,9 @@ msgid ""
"<i>edit</i> existing ones. In the <a href=\"{users_url}\">User " "<i>edit</i> existing ones. In the <a href=\"{users_url}\">User "
"Configuration</a> you can change these permissions or add new users." "Configuration</a> you can change these permissions or add new users."
msgstr "" msgstr ""
"Только пользователи {box_name} группы <b>администраторов</b> могут <i>" "Только пользователи {box_name} группы <b>администраторов</b> могут "
"создавать</i> и <i>управлять</i> блогами и вики, но любой пользователь " "<i>создавать</i> и <i>управлять</i> блогами и вики, но любой пользователь "
"группы <b>wiki</b> может <i>редактировать</i> существующие. На странице <a " "группы <b>wiki</b> могжет <i>редактировать</i> существующие. На странице <a "
"href=\"{users_url}\">Конфигурация пользователей</a> вы можете изменить " "href=\"{users_url}\">Конфигурация пользователей</a> вы можете изменить "
"разрешения или добавить новых пользователей." "разрешения или добавить новых пользователей."
@ -3979,7 +3977,7 @@ msgstr "JSXC"
#: plinth/modules/jsxc/manifest.py:16 #: plinth/modules/jsxc/manifest.py:16
msgid "Web chat" msgid "Web chat"
msgstr "Веб-чат" msgstr "Веб чат"
#: plinth/modules/jsxc/manifest.py:16 plinth/modules/quassel/manifest.py:54 #: plinth/modules/jsxc/manifest.py:16 plinth/modules/quassel/manifest.py:54
msgid "Client" msgid "Client"
@ -3991,10 +3989,10 @@ msgid ""
"Wikipedia available without using the internet, but it is potentially " "Wikipedia available without using the internet, but it is potentially "
"suitable for all HTML content. Kiwix packages are in the ZIM file format." "suitable for all HTML content. Kiwix packages are in the ZIM file format."
msgstr "" msgstr ""
"Kiwix является офлайн читалкой для веб-контента. Это программа " "Kiwix является офлайн-читателкой для веб-контента. Это программа "
"предназначенная для того, чтобы сделать Википедию доступной автономно без " "предназначенная для того,чтобы сделать Википедию доступной автономно без "
"Интернета, но потенциально подходит для любого HTML-контента. Пакеты Kiwix " "Интернета, но оно потенциально подходит для всего HTML-контента. Пакеты "
"представляют собой файлы в формате ZIM." "Kiwix находятся в формате ZIM."
#: plinth/modules/kiwix/__init__.py:25 #: plinth/modules/kiwix/__init__.py:25
msgid "" msgid ""
@ -4055,7 +4053,7 @@ msgstr ""
#: plinth/modules/kiwix/manifest.py:24 #: plinth/modules/kiwix/manifest.py:24
msgid "Offline reader" msgid "Offline reader"
msgstr "Оффлайн читалка" msgstr "Автономный читатель"
#: plinth/modules/kiwix/manifest.py:25 #: plinth/modules/kiwix/manifest.py:25
msgid "Archival" msgid "Archival"
@ -4066,7 +4064,7 @@ msgstr "Архив"
#: plinth/modules/shadowsocksserver/manifest.py:18 #: plinth/modules/shadowsocksserver/manifest.py:18
#: plinth/modules/tor/manifest.py:60 plinth/modules/torproxy/manifest.py:57 #: plinth/modules/tor/manifest.py:60 plinth/modules/torproxy/manifest.py:57
msgid "Censorship resistance" msgid "Censorship resistance"
msgstr "Сопротивление цензуре" msgstr "Противодействие цензуре"
#: plinth/modules/kiwix/manifest.py:27 #: plinth/modules/kiwix/manifest.py:27
msgid "Wikipedia" msgid "Wikipedia"
@ -4358,11 +4356,11 @@ msgstr "FluffyChat"
#: plinth/modules/matrixsynapse/manifest.py:101 #: plinth/modules/matrixsynapse/manifest.py:101
#: plinth/modules/quassel/manifest.py:54 #: plinth/modules/quassel/manifest.py:54
msgid "Chat room" msgid "Chat room"
msgstr "Чат" msgstr "Чат комната"
#: plinth/modules/matrixsynapse/manifest.py:105 #: plinth/modules/matrixsynapse/manifest.py:105
msgid "Matrix server" msgid "Matrix server"
msgstr "Cервер Matrix" msgstr "Matrix сервер"
#: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:18 #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:18
msgid "" msgid ""
@ -4514,7 +4512,7 @@ msgid ""
"Anyone with a link to this wiki can read it. Only users that are logged in " "Anyone with a link to this wiki can read it. Only users that are logged in "
"can make changes to the content." "can make changes to the content."
msgstr "" msgstr ""
"Кто угодно, имея ссылку на вики, может читать её. Только зарегистрированные " "Кто угодно, имея ссылку на wiki, может читать её. Только зарегистрированные "
"пользователи могут вносить изменения." "пользователи могут вносить изменения."
#: plinth/modules/mediawiki/__init__.py:51 #: plinth/modules/mediawiki/__init__.py:51
@ -4544,7 +4542,7 @@ msgid ""
"feeds and emails. Examples: \"myfreedombox.example.org\" or " "feeds and emails. Examples: \"myfreedombox.example.org\" or "
"\"example.onion\"." "\"example.onion\"."
msgstr "" msgstr ""
"Использовалось MediaWiki для создания ссылок на вики страницы, например " "Использовалось MediaWiki для создания ссылок на wiki страницы, например "
"внизу веб-страниц, в RSS-потоках или в электронных письмах. Например: " "внизу веб-страниц, в RSS-потоках или в электронных письмах. Например: "
"\"myfreedombox.example.org\" или \"example.onion\"." "\"myfreedombox.example.org\" или \"example.onion\"."
@ -4711,7 +4709,7 @@ msgstr "Игровой сервер"
#: plinth/modules/minetest/manifest.py:49 #: plinth/modules/minetest/manifest.py:49
msgid "Block sandbox" msgid "Block sandbox"
msgstr "Песочница" msgstr "Блокировать песочницу"
#: plinth/modules/minetest/manifest.py:49 #: plinth/modules/minetest/manifest.py:49
msgid "Platform" msgid "Platform"
@ -4774,7 +4772,7 @@ msgstr "totem"
#: plinth/modules/minidlna/manifest.py:116 #: plinth/modules/minidlna/manifest.py:116
msgid "Media server" msgid "Media server"
msgstr "Медиасервер" msgstr "Медиа сервер"
#: plinth/modules/minidlna/manifest.py:116 #: plinth/modules/minidlna/manifest.py:116
msgid "Television" msgid "Television"
@ -4879,7 +4877,7 @@ msgstr "RSS Охранник"
#: plinth/modules/miniflux/manifest.py:138 #: plinth/modules/miniflux/manifest.py:138
msgid "Feed reader" msgid "Feed reader"
msgstr "Ленты новостей" msgstr "Устройство для чтения фидов"
#: plinth/modules/miniflux/manifest.py:138 #: plinth/modules/miniflux/manifest.py:138
msgid "News aggregation" msgid "News aggregation"
@ -5229,7 +5227,7 @@ msgstr ""
#: plinth/modules/names/templates/names.html:152 plinth/templates/setup.html:87 #: plinth/modules/names/templates/names.html:152 plinth/templates/setup.html:87
msgid "Install" msgid "Install"
msgstr "Установить" msgstr "Установка"
#: plinth/modules/names/templates/names.html:162 #: plinth/modules/names/templates/names.html:162
msgid "Error retrieving status:" msgid "Error retrieving status:"
@ -7250,10 +7248,10 @@ msgid ""
"from an email client, including MIME support, address book, folder " "from an email client, including MIME support, address book, folder "
"manipulation, message searching and spell checking." "manipulation, message searching and spell checking."
msgstr "" msgstr ""
"Веб-почта Roundcube это браузерный многоязычный IMAP клиент с " "Roundcube webmail это основанный на браузере многоязычный IMAP клиент с "
"пользовательским интерфейсом. Он предоставляет полную функциональность, " "пользовательским интерфейсом. Это предоставляет полную функциональность, "
"которую вы ожидаете от почтового клиента, включая поддержку MIME, адресной " "которую вы ожидаете от почтового клиента, включая поддержку MIME, адресную "
"книги, управления папками, поиска сообщений и проверки орфографии." "книгу, управление папками, поиск сообщений и проверку орфографии."
#: plinth/modules/roundcube/__init__.py:24 #: plinth/modules/roundcube/__init__.py:24
msgid "" msgid ""
@ -7305,7 +7303,7 @@ msgstr ""
#: plinth/modules/roundcube/manifest.py:23 #: plinth/modules/roundcube/manifest.py:23
msgid "Email" msgid "Email"
msgstr "Электронная почта" msgstr "Email"
#: plinth/modules/rssbridge/__init__.py:21 #: plinth/modules/rssbridge/__init__.py:21
msgid "" msgid ""
@ -7321,8 +7319,9 @@ msgid ""
"When enabled, RSS-Bridge can be accessed by <a href=\"{users_url}\">any " "When enabled, RSS-Bridge can be accessed by <a href=\"{users_url}\">any "
"user</a> belonging to the feed-reader group." "user</a> belonging to the feed-reader group."
msgstr "" msgstr ""
"Когда эта функция включена, доступ к RSS-Bridge может получить <a href=" "Когда эта функция включена, доступ к RSS-мостику может получить <a "
"\"{users_url}\">любой пользователь</a>, входящий в группу читателей фидов." "href=\"{users_url}\">любой пользователь</a>, входящий в группу читателей "
"фидов."
#: plinth/modules/rssbridge/__init__.py:28 #: plinth/modules/rssbridge/__init__.py:28
#, python-brace-format #, python-brace-format
@ -7331,10 +7330,10 @@ msgid ""
"href=\"{nextcloud_url}\">Nextcloud News</a> to follow various websites. When " "href=\"{nextcloud_url}\">Nextcloud News</a> to follow various websites. When "
"adding a feed, enable authentication and use your {box_name} credentials." "adding a feed, enable authentication and use your {box_name} credentials."
msgstr "" msgstr ""
"Вы можете использовать RSS-Bridge с <a href=\"{miniflux_url}\">Miniflux</a> " "Вы можете использовать RSS-мост с <a href=\"{miniflux_url}\">Miniflux</a> or "
"или <a href=\"{nextcloud_url}\">Nextcloud News</a>, чтобы следить за " "<a href=\"{nextcloud_url}\">Nextcloud News</a> следить за различными веб-"
"различными веб-сайтами. При добавлении фида включите аутентификацию и " "сайтами. При добавлении фида включите аутентификацию и используйте свои "
"используйте свои учетные данные от {box_name}." "учетные данные от {box_name}."
#: plinth/modules/rssbridge/__init__.py:49 #: plinth/modules/rssbridge/__init__.py:49
msgid "Read and subscribe to news feeds" msgid "Read and subscribe to news feeds"
@ -7343,7 +7342,7 @@ msgstr "Чтение и подписка на ленты новостей"
#: plinth/modules/rssbridge/__init__.py:52 #: plinth/modules/rssbridge/__init__.py:52
#: plinth/modules/rssbridge/manifest.py:7 #: plinth/modules/rssbridge/manifest.py:7
msgid "RSS-Bridge" msgid "RSS-Bridge"
msgstr "RSS-Bridge" msgstr "RSS-мост"
#: plinth/modules/rssbridge/forms.py:12 plinth/modules/searx/forms.py:17 #: plinth/modules/rssbridge/forms.py:12 plinth/modules/searx/forms.py:17
msgid "Allow Public Access" msgid "Allow Public Access"
@ -7355,7 +7354,7 @@ msgstr "Разрешите использовать это приложение
#: plinth/modules/rssbridge/manifest.py:16 #: plinth/modules/rssbridge/manifest.py:16
msgid "Feed generator" msgid "Feed generator"
msgstr "Генератор лент новостей" msgstr "Генератор питания"
#: plinth/modules/rssbridge/manifest.py:16 #: plinth/modules/rssbridge/manifest.py:16
msgid "News" msgid "News"
@ -7436,11 +7435,11 @@ msgstr "Сетевой диск"
#: plinth/modules/samba/manifest.py:84 #: plinth/modules/samba/manifest.py:84
msgid "Media storage" msgid "Media storage"
msgstr "Хранилище медиафайлов" msgstr "Хранение носителей"
#: plinth/modules/samba/manifest.py:85 #: plinth/modules/samba/manifest.py:85
msgid "Backup storage" msgid "Backup storage"
msgstr "Резервное хранилище" msgstr "Резервное хранение"
#: plinth/modules/samba/templates/samba.html:20 #: plinth/modules/samba/templates/samba.html:20
msgid "Shares" msgid "Shares"
@ -7581,7 +7580,7 @@ msgstr "Строгий"
#: plinth/modules/searx/manifest.py:17 #: plinth/modules/searx/manifest.py:17
msgid "Web search" msgid "Web search"
msgstr "Веб-поиск" msgstr "Веб поиск"
#: plinth/modules/searx/manifest.py:17 #: plinth/modules/searx/manifest.py:17
msgid "Metasearch Engine" msgid "Metasearch Engine"
@ -7736,7 +7735,7 @@ msgstr ""
#: plinth/modules/shaarli/__init__.py:36 plinth/modules/shaarli/manifest.py:25 #: plinth/modules/shaarli/__init__.py:36 plinth/modules/shaarli/manifest.py:25
msgid "Shaarli" msgid "Shaarli"
msgstr "Shaarli" msgstr "Shаarli"
#: plinth/modules/shaarli/manifest.py:12 #: plinth/modules/shaarli/manifest.py:12
msgid "Shaarlier" msgid "Shaarlier"
@ -7800,7 +7799,7 @@ msgstr ""
#: plinth/modules/shadowsocks/__init__.py:50 #: plinth/modules/shadowsocks/__init__.py:50
msgid "Shadowsocks Client" msgid "Shadowsocks Client"
msgstr "Shadowsocks Клиент" msgstr "Клиент Shadowsocks"
#: plinth/modules/shadowsocks/forms.py:25 #: plinth/modules/shadowsocks/forms.py:25
msgid "Server hostname or IP address" msgid "Server hostname or IP address"
@ -7847,7 +7846,7 @@ msgstr ""
#: plinth/modules/shadowsocksserver/__init__.py:47 #: plinth/modules/shadowsocksserver/__init__.py:47
msgid "Shadowsocks Server" msgid "Shadowsocks Server"
msgstr "Shadowsocks Сервер" msgstr "Сервер Shadowsocks"
#: plinth/modules/shadowsocksserver/forms.py:10 #: plinth/modules/shadowsocksserver/forms.py:10
#: plinth/modules/shadowsocksserver/forms.py:11 #: plinth/modules/shadowsocksserver/forms.py:11
@ -7866,7 +7865,7 @@ msgstr "Метод шифрования. Клиенты должны испол
#: plinth/modules/shadowsocksserver/manifest.py:20 #: plinth/modules/shadowsocksserver/manifest.py:20
msgid "Exit point" msgid "Exit point"
msgstr "Точка выхода" msgstr "Место выхода"
#: plinth/modules/sharing/__init__.py:17 #: plinth/modules/sharing/__init__.py:17
#, python-brace-format #, python-brace-format
@ -7927,7 +7926,7 @@ msgstr ""
#: plinth/modules/sharing/manifest.py:19 plinth/modules/zoph/manifest.py:26 #: plinth/modules/sharing/manifest.py:19 plinth/modules/zoph/manifest.py:26
msgid "Web sharing" msgid "Web sharing"
msgstr "Обмен в Интернете" msgstr "Совместное использование веб-страниц"
#: plinth/modules/sharing/templates/sharing.html:18 #: plinth/modules/sharing/templates/sharing.html:18
#: plinth/modules/sharing/templates/sharing.html:21 #: plinth/modules/sharing/templates/sharing.html:21
@ -8264,7 +8263,7 @@ msgstr "Коннектор Thunderbird + SOGo"
#: plinth/modules/sogo/manifest.py:71 #: plinth/modules/sogo/manifest.py:71
msgid "Webmail" msgid "Webmail"
msgstr "Веб-почта" msgstr "Webmail"
#: plinth/modules/sogo/manifest.py:74 #: plinth/modules/sogo/manifest.py:74
msgid "Address book" msgid "Address book"
@ -8277,14 +8276,14 @@ msgid ""
"administration tasks, copy files or run other services using such " "administration tasks, copy files or run other services using such "
"connections." "connections."
msgstr "" msgstr ""
"SSH-сервер использует протокол безопасной оболочки на прием подключений с " "Secure Shell сервер использует протокол безопасной оболочки на прием "
"удаленных компьютеров. Уполномоченный удаленный компьютер может выполнять " "подключений с удаленных компьютеров. Уполномоченный удаленный компьютер "
"задачи администрирования, копировать файлы или запускать другие службы с " "может выполнять задачи администрирования, копировать файлы или запускать "
"использованием таких соединений." "другие службы с использованием таких соединений."
#: plinth/modules/ssh/__init__.py:42 #: plinth/modules/ssh/__init__.py:42
msgid "Secure Shell Server" msgid "Secure Shell Server"
msgstr "SSH-сервер" msgstr "Сервер защищенной оболочки"
#: plinth/modules/ssh/__init__.py:75 #: plinth/modules/ssh/__init__.py:75
msgid "Remotely login using Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)"
@ -8366,7 +8365,7 @@ msgstr "Перейдите к входу в систему"
#: plinth/modules/sso/templates/login.html:23 #: plinth/modules/sso/templates/login.html:23
msgid "Login" msgid "Login"
msgstr "Войти" msgstr "Логин"
#: plinth/modules/sso/views.py:86 #: plinth/modules/sso/views.py:86
msgid "Logged out successfully." msgid "Logged out successfully."
@ -8753,7 +8752,7 @@ msgstr "Цифровой сад"
#: plinth/modules/tiddlywiki/manifest.py:24 #: plinth/modules/tiddlywiki/manifest.py:24
msgid "Zettelkasten" msgid "Zettelkasten"
msgstr "Цеттелькастен" msgstr "Шкафы для застройки"
#: plinth/modules/tiddlywiki/templates/tiddlywiki_delete.html:18 #: plinth/modules/tiddlywiki/templates/tiddlywiki_delete.html:18
msgid "" msgid ""
@ -8921,15 +8920,15 @@ msgstr "Orbot: Прокси с Tor"
#: plinth/modules/tor/manifest.py:57 #: plinth/modules/tor/manifest.py:57
msgid "Onion services" msgid "Onion services"
msgstr "Onion-сервисы" msgstr "Луковые сервисы"
#: plinth/modules/tor/manifest.py:58 #: plinth/modules/tor/manifest.py:58
msgid "Relay" msgid "Relay"
msgstr "Сетевой узел" msgstr "Ретранслятор"
#: plinth/modules/tor/manifest.py:59 plinth/modules/torproxy/manifest.py:56 #: plinth/modules/tor/manifest.py:59 plinth/modules/torproxy/manifest.py:56
msgid "Anonymity network" msgid "Anonymity network"
msgstr "Анонимная сеть" msgstr "Сеть анонимности"
#: plinth/modules/tor/templates/tor.html:23 #: plinth/modules/tor/templates/tor.html:23
msgid "Onion Service" msgid "Onion Service"
@ -9086,7 +9085,7 @@ msgstr ""
#: plinth/modules/upgrades/__init__.py:146 #: plinth/modules/upgrades/__init__.py:146
#: plinth/modules/upgrades/__init__.py:309 #: plinth/modules/upgrades/__init__.py:309
msgid "Software Update" msgid "Software Update"
msgstr "Обновление ПО" msgstr "Обновление программного обеспечения"
#: plinth/modules/upgrades/__init__.py:131 #: plinth/modules/upgrades/__init__.py:131
msgid "FreedomBox Updated" msgid "FreedomBox Updated"
@ -9283,7 +9282,7 @@ msgstr "Перейти к обновлению дистрибутива"
#: plinth/templates/notifications.html:58 #: plinth/templates/notifications.html:58
#: plinth/templates/operation-notification.html:23 #: plinth/templates/operation-notification.html:23
msgid "Dismiss" msgid "Dismiss"
msgstr "Закрыть" msgstr "Отклонить"
#: plinth/modules/upgrades/templates/upgrades-dist-upgrade.html:15 #: plinth/modules/upgrades/templates/upgrades-dist-upgrade.html:15
#, python-format #, python-format
@ -9586,8 +9585,8 @@ msgstr "Имя пользователя уже занято."
msgid "" msgid ""
"Optional. Used to send emails to reset password and important notifications." "Optional. Used to send emails to reset password and important notifications."
msgstr "" msgstr ""
"Необязательное поле. Используется для отправки электронных писем для сброса " "Необязательно. Используется для отправки электронных писем для сброса пароля "
"пароля и важных уведомлений." "и важных уведомлений."
#: plinth/modules/users/forms.py:107 #: plinth/modules/users/forms.py:107
msgid "" msgid ""
@ -9611,8 +9610,7 @@ msgstr "Введите действительное имя пользовате
msgid "" msgid ""
"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." "Required. 150 characters or fewer. English letters, digits and @/./-/_ only."
msgstr "" msgstr ""
"Поле обязательно для заполнения. 150 символов или меньше. Только английские " "Требуется. 150 символов или меньше. Только английские буквы, цифры и @/./-/_."
"буквы, цифры и @/./-/_."
#: plinth/modules/users/forms.py:141 #: plinth/modules/users/forms.py:141
msgid "Authorization Password" msgid "Authorization Password"
@ -9798,8 +9796,8 @@ msgid ""
"Use the <a href='%(change_password_url)s'>change password form </a> to " "Use the <a href='%(change_password_url)s'>change password form </a> to "
"change the password." "change the password."
msgstr "" msgstr ""
"Для смены пароля используйте форму <a href=\"%(change_password_url)s\"" "Для смены пароля используйте форму <a "
">изменить пароль</a>." "href=\"%(change_password_url)s\">изменить пароль </a>."
#: plinth/modules/users/templates/users_update.html:37 #: plinth/modules/users/templates/users_update.html:37
#: plinth/templates/language-selection.html:17 #: plinth/templates/language-selection.html:17
@ -10556,7 +10554,7 @@ msgstr ""
#: plinth/templates/base.html:117 #: plinth/templates/base.html:117
msgid " Home" msgid " Home"
msgstr " Главная" msgstr " Домой"
#: plinth/templates/base.html:125 #: plinth/templates/base.html:125
msgid " Apps" msgid " Apps"
@ -10689,7 +10687,7 @@ msgstr "Уведомления"
#: plinth/templates/notifications.html:18 #: plinth/templates/notifications.html:18
#, python-format #, python-format
msgid "%(time_since)s ago" msgid "%(time_since)s ago"
msgstr "%(time_since)s назад" msgstr "%(time_since)s тому назад"
#: plinth/templates/port-forwarding-info.html:8 #: plinth/templates/port-forwarding-info.html:8
msgid "Port Forwarding" msgid "Port Forwarding"
@ -10822,7 +10820,7 @@ msgstr ""
#: plinth/views.py:89 #: plinth/views.py:89
msgid "Here" msgid "Here"
msgstr "Здесь" msgstr "Вот здесь"
#: plinth/views.py:431 #: plinth/views.py:431
msgid "Setting unchanged" msgid "Setting unchanged"

View File

@ -8,7 +8,7 @@ from plinth.tests import functional
pytestmark = [pytest.mark.apps, pytest.mark.homeassistant] pytestmark = [pytest.mark.apps, pytest.mark.homeassistant]
class TestHomeAssistantApp(functional.BaseAppTests): class TestHomeAssitantApp(functional.BaseAppTests):
"""Basic tests for Home Assistant app.""" """Basic tests for Home Assistant app."""
app_name = 'homeassistant' app_name = 'homeassistant'
has_service = True has_service = True

View File

@ -104,10 +104,10 @@
<h3>{% trans "Manual Update" %}</h3> <h3>{% trans "Manual Update" %}</h3>
{% if is_busy %} {% if is_busy %}
<div class="btn-toolbar"> <div class="btn-toolbar">
<button type="button" class="btn btn-default" disabled="disabled"> <button type="button" disabled="disabled"
<span class="spinner-border spinner-border-sm" aria-hidden="true"> class="running-status-parent btn btn-default" >
</span> <span class="running-status loading"></span>
<span role="status">{% trans "Updating..." %}</span> {% trans "Updating..." %}
</button> </button>
</div> </div>
{% else %} {% else %}

View File

@ -43,11 +43,10 @@
</section> </section>
{% if app_info.tags %} {% if app_info.tags %}
<div class="app-tags d-flex align-items-center flex-wrap"> <div class="app-tags">
{% for tag in app_info.tags %} {% for tag in app_info.tags %}
{% if not forloop.first %}•{% endif %}
<a href="{{ active_section_url }}?tag={{ tag|urlencode }}" <a href="{{ active_section_url }}?tag={{ tag|urlencode }}"
class="btn btn-default rounded-pill tag"> class="btn btn-light rounded-pill tag">
{% trans tag %} {% trans tag %}
</a> </a>
{% endfor %} {% endfor %}

View File

@ -58,9 +58,6 @@
<link rel="stylesheet" href="{% static user_css %}"/> <link rel="stylesheet" href="{% static user_css %}"/>
{% endif %} {% endif %}
<!-- This script is not loaded in defer mode because it needs to run before
page is rendered -->
<script type="text/javascript" src="{% static 'theme/js/color-modes.js' %}"></script>
<!-- Local link to system Bootstrap JS --> <!-- Local link to system Bootstrap JS -->
<script type="text/javascript" src="{% static '/javascript/popperjs2/popper.min.js' %}" defer></script> <script type="text/javascript" src="{% static '/javascript/popperjs2/popper.min.js' %}" defer></script>
<script type="text/javascript" src="{% static '/javascript/bootstrap5/js/bootstrap.bundle.min.js' %}" defer></script> <script type="text/javascript" src="{% static '/javascript/bootstrap5/js/bootstrap.bundle.min.js' %}" defer></script>
@ -151,8 +148,6 @@
{% include "notifications-dropdown.html" %} {% include "notifications-dropdown.html" %}
{% include "theme-menu.html" %}
{% include "help-menu.html" %} {% include "help-menu.html" %}
<li id="id_user_menu" class="nav-item dropdown"> <li id="id_user_menu" class="nav-item dropdown">

View File

@ -8,12 +8,12 @@
<div class="container"> <div class="container">
<div class="dropdown searchable-dropdown"> <div class="dropdown searchable-dropdown">
<div class="tag-input"> <div class="tag-input">
<div id="selected-tags" class="d-flex align-items-center flex-wrap"> <div id="selected-tags">
{% for tag in tags %} {% for tag in tags %}
<span class="btn btn-default rounded-pill tag d-flex align-items-center" <span class="btn btn-light rounded-pill tag"
data-tag="{{ tag }}"> data-tag="{{ tag }}">
{% trans tag %} {% trans tag %}
<button class="btn btn-sm btn-default remove-tag"> <button class="btn btn-sm btn-light remove-tag">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</button> </button>
</span> </span>

View File

@ -1,46 +0,0 @@
{% comment %}
# SPDX-License-Identifier: AGPL-3.0-or-later
{% endcomment %}
{% load i18n %}
<li id="id_theme_menu" class="dropdown nav-item">
<a href="#" title="{% trans "Toggle theme (auto)" %}"
class="nav-link dropdown-toggle" data-bs-toggle="dropdown"
role="button" aria-expanded="false" aria-haspopup="true"
id="id_theme_menu_link">
<span class="fa fa-adjust nav-icon" id="id_active_theme_icon"></span>
<span class="nav-text d-md-none" id="id_toggle_theme_text">
{% trans "Toggle theme" %}
</span>
</a>
<ul class="dropdown-menu" role="menu" aria-labelledby="id_theme_menu_link">
<li>
<button type="button" class="dropdown-item d-flex align-items-center"
data-bs-theme-value="light" data-bs-icon-value="fa-sun"
aria-pressed="false">
<span class="fa fa-sun nav-icon me-2"></span>
{% trans "Light" %}
<span class="fa fa-check nav-icon ms-auto d-none"></span>
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center"
data-bs-theme-value="dark" data-bs-icon-value="fa-moon"
aria-pressed="false">
<span class="fa fa-moon nav-icon me-2"></span>
{% trans "Dark" %}
<span class="fa fa-check nav-icon ms-auto d-none"></span>
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center"
data-bs-theme-value="auto" data-bs-icon-value="fa-adjust"
aria-pressed="true">
<span class="fa fa-adjust nav-icon me-2"></span>
{% trans "Auto" %}
<span class="fa fa-check nav-icon ms-auto d-none"></span>
</button>
</li>
</ul>
</li>

View File

@ -6,13 +6,14 @@
--neutral-light-color: #f5f5f5; /* Light grey */ --neutral-light-color: #f5f5f5; /* Light grey */
--freedombox-blue-color: #4989D4; /* Blue */ --freedombox-blue-color: #4989D4; /* Blue */
--progress-color: #3498db; /* Blue */ --progress-color: #3498db; /* Blue */
--freedombox-form-disabled-bg-color: #e9ecef; /* Grey */
--freedombox-navbar-color: white; --freedombox-navbar-color: white;
--freedombox-navbar-shadow-color: rgba(0, 0, 0, 0.25);
--freedombox-toggle-button-bg: #ccc;
}
[data-bs-theme="dark"] { /* Missing variables in Bootstrap 5.2 copied from Bootstrap 5.3 */
--freedombox-toggle-button-bg: #888; --bs-secondary-bg: #e9ecef;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
--bs-secondary-border-subtle: #c4c8cb;
} }
/* /*
@ -49,20 +50,20 @@ h6:not(:first-child) {
/* Default style removed in bootstrap 4 */ /* Default style removed in bootstrap 4 */
.btn-default { .btn-default {
--bs-btn-color: var(--bs-body-color); --bs-btn-color: #333;
--bs-btn-bg: var(--bs-body-bg); --bs-btn-bg: #fff;
--bs-btn-border-color: var(--bs-tertiary-color); --bs-btn-border-color: #ccc;
--bs-btn-hover-color: var(--bs-body-color); --bs-btn-hover-color: #333;
--bs-btn-hover-bg: var(--bs-secondary-bg); --bs-btn-hover-bg: #e6e6e6;
--bs-btn-hover-border-color: var(--bs-tertiary-color); --bs-btn-hover-border-color: #adadad;
--bs-btn-focus-shadow-rgb: 192, 192, 192; --bs-btn-focus-shadow-rgb: 192, 192, 192;
--bs-btn-active-color: var(--bs-body-color); --bs-btn-active-color: #333;
--bs-btn-active-bg: var(--bs-secondary-bg); --bs-btn-active-bg: #e6e6e6;
--bs-btn-active-border-color: var(--bs-tertiary-color); --bs-btn-active-border-color: #adadad;
--bs-btn-active-shadow: inset 0 3px 5px var(--bs-border-color-translucent); --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: var(--bs-body-color); --bs-btn-disabled-color: #333;
--bs-btn-disabled-bg: var(--bs-secondary-bg); --bs-btn-disabled-bg: #e6e6e6;
--bs-btn-disabled-border-color: var(--bs-tertiary-color); --bs-btn-disabled-border-color: #adadad;
} }
/* Help block removed from bootstrap 4, needs updated django-bootstrap-from */ /* Help block removed from bootstrap 4, needs updated django-bootstrap-from */
@ -70,7 +71,7 @@ h6:not(:first-child) {
display: block; display: block;
margin-top: 0.3125rem; margin-top: 0.3125rem;
margin-bottom: 0.625rem; margin-bottom: 0.625rem;
color: var(--bs-secondary-color); color: var(--bs-secondary);
} }
/* .close was renamed to .alert-dismissable.btn-close in Bootstrap 5, needs /* .close was renamed to .alert-dismissable.btn-close in Bootstrap 5, needs
@ -98,7 +99,7 @@ form .alert .close {
/* Disabled form elements show as gray, removed in Bootstrap 5 */ /* Disabled form elements show as gray, removed in Bootstrap 5 */
.form-control:disabled, .form-control[readonly] { .form-control:disabled, .form-control[readonly] {
background-color: var(--bs-secondary-bg); background-color: var(--freedombox-form-disabled-bg-color);
opacity: 1; opacity: 1;
} }
@ -227,6 +228,28 @@ body {
vertical-align: middle; vertical-align: middle;
} }
.running-status-parent {
display: inline-block;
}
.running-status {
border-radius: 50%;
border: 1px solid black;
width: 0.5rem;
height: 0.5rem;
display: inline-block;
}
.running-status.loading {
border: 0.25rem solid var(--neutral-light-color);
border-top: 0.25rem solid var(--progress-color);
border-radius: 50%;
width: 1rem;
height: 1rem;
display: inline-block;
animation: spin 1s linear infinite;
}
@keyframes spin { @keyframes spin {
0% { 0% {
transform: rotate(0deg); transform: rotate(0deg);
@ -291,21 +314,16 @@ html {
/* Tags */ /* Tags */
.tag { .tag {
--bs-btn-padding-y: 0.25rem; /* Make the badge shorter */ --bs-btn-padding-y: 0.25rem; /* Make the badge shorter */
border-style: none;
}
#selected-tags .tag {
border-style: solid;
} }
/* Tag Input Container */ /* Tag Input Container */
.tag-input { .tag-input {
display: flex; display: flex;
align-items: center; align-items: center;
border: 1px solid var(--bs-border-color); border: 1px solid #ced4da;
border-radius: .25rem; border-radius: .25rem;
padding: .375rem .75rem; padding: .375rem .75rem;
background-color: var(--bs-body-bg); background-color: #fff;
margin-bottom: 2rem; margin-bottom: 2rem;
} }
@ -454,7 +472,7 @@ footer {
*/ */
.main-header { .main-header {
background: var(--freedombox-blue-color); background: var(--freedombox-blue-color);
box-shadow: 0 0.25rem 0.375rem 0 var(--freedombox-navbar-shadow-color); box-shadow: 0 0.25rem 0.375rem 0 rgba(0, 0, 0, 0.25);
border: none; border: none;
} }
@ -504,10 +522,6 @@ footer {
border-bottom: var(--freedombox-navbar-color) 3px solid; border-bottom: var(--freedombox-navbar-color) 3px solid;
} }
.main-header .dropdown-menu .active .fa-check {
display: block !important;
}
/* Breadcrumbs */ /* Breadcrumbs */
.breadcrumb-item { .breadcrumb-item {
--bs-breadcrumb-divider: ">"; --bs-breadcrumb-divider: ">";
@ -570,7 +584,7 @@ footer {
.card-tags { .card-tags {
font-weight: 400; font-weight: 400;
color: var(--bs-secondary-color); color: var(--bs-secondary);
font-size: 0.875rem; font-size: 0.875rem;
/* Show ellipsis after 3 lines. */ /* Show ellipsis after 3 lines. */
@ -697,9 +711,9 @@ footer {
border-radius: 0.8125rem; border-radius: 0.8125rem;
width: 3.125rem; width: 3.125rem;
height: 1.625rem; height: 1.625rem;
background: var(--freedombox-toggle-button-bg); background: #ccc;
--bs-btn-hover-bg: var(--freedombox-toggle-button-bg); --bs-btn-hover-bg: #ccc;
--bs-btn-disabled-bg: var(--freedombox-toggle-button-bg);; --bs-btn-disabled-bg: #ccc;
--bs-btn-disabled-border-color: transparent; --bs-btn-disabled-border-color: transparent;
position: relative; position: relative;
} }
@ -710,7 +724,7 @@ footer {
height: 1.5rem; height: 1.5rem;
width: 1.5rem; width: 1.5rem;
border-radius: 100%; border-radius: 100%;
background: var(--bs-body-bg); background: #fff;
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 0%; left: 0%;
@ -730,8 +744,8 @@ footer {
.toggle-button.running-status-button::before { .toggle-button.running-status-button::before {
top: 0; top: 0;
border: 0.25rem solid var(--bs-body-bg); border: 0.25rem solid var(--neutral-light-color);
border-top-color: var(--freedombox-blue-color); border-top: 0.25rem solid var(--progress-color);
animation: spin 1s linear infinite; animation: spin 1s linear infinite;
} }
@ -744,8 +758,8 @@ footer {
*/ */
.running-status-button-before { .running-status-button-before {
display: inline-block; display: inline-block;
border: 0.25rem solid var(--bs-btn-color); border: 0.25rem solid var(--neutral-light-color);
border-top-color: transparent; border-top: 0.25rem solid var(--progress-color);
border-radius: 50%; border-radius: 50%;
width: 1rem; width: 1rem;
height: 1rem; height: 1rem;
@ -753,8 +767,6 @@ footer {
margin-left: 0.625rem; margin-left: 0.625rem;
margin-bottom: -0.25rem; margin-bottom: -0.25rem;
margin-right: -1.625rem; margin-right: -1.625rem;
position: relative;
z-index: 10;
} }
.running-status-button:disabled { .running-status-button:disabled {
@ -770,7 +782,7 @@ input[type='submit'].running-status-button {
*/ */
.select-all-label { .select-all-label {
border: 1px solid var(--bs-secondary-border-subtle); border: 1px solid var(--bs-secondary-border-subtle);
background-color: var(--bs-tertiary-bg); background-color: var(--neutral-light-color);
border-radius: 0.25rem; border-radius: 0.25rem;
padding: 0.5rem 1rem 0.25rem; padding: 0.5rem 1rem 0.25rem;
margin-left: -1rem; margin-left: -1rem;

View File

@ -1,96 +0,0 @@
// SPDX-License-Identifier: CC-BY-3.0
/*
This file is part of FreedomBox. Color mode toggler for Bootstrap's docs
(https://getbootstrap.com/). Copyright 2011-2025 The Bootstrap Authors.
@licstart The following is the entire license notice for the
JavaScript code in this page.
Licensed under the Creative Commons Attribution 3.0 Unported License.
@licend The above is the entire license notice
for the JavaScript code in this page.
*/
(() => {
'use strict';
const getStoredTheme = () => localStorage.getItem('theme');
const setStoredTheme = theme => localStorage.setItem('theme', theme);
const getBrowserTheme = () => {
return window.matchMedia('(prefers-color-scheme: dark)')
.matches ? 'dark' : 'light';
};
const getPreferredTheme = () => {
const storedTheme = getStoredTheme();
if (storedTheme) {
return storedTheme;
}
return getBrowserTheme();
};
const setTheme = (theme) => {
if (theme === 'auto') {
theme = getBrowserTheme();
}
document.documentElement.setAttribute('data-bs-theme', theme);
};
setTheme(getPreferredTheme());
const showActiveTheme = (theme, focus = false) => {
const themeSwitcher = document.querySelector('#id_theme_menu_link');
if (!themeSwitcher) {
return;
}
const themeSwitcherText = document.querySelector('#id_toggle_theme_text');
const activeThemeIcon = document.querySelector('#id_active_theme_icon');
const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`);
const iconOfActiveBtn = btnToActive.dataset.bsIconValue;
document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
element.classList.remove('active');
element.setAttribute('aria-pressed', 'false');
const iconOfBtn = element.dataset.bsIconValue;
if (activeThemeIcon.classList.contains(iconOfBtn)) {
activeThemeIcon.classList.remove(iconOfBtn);
}
});
btnToActive.classList.add('active');
btnToActive.setAttribute('aria-pressed', 'true');
activeThemeIcon.classList.add(iconOfActiveBtn);
const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`;
themeSwitcher.setAttribute('title', themeSwitcherLabel);
if (focus) {
themeSwitcher.focus();
};
};
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
const storedTheme = getStoredTheme();
if (storedTheme !== 'light' && storedTheme !== 'dark') {
setTheme(getPreferredTheme());
}
});
window.addEventListener('DOMContentLoaded', () => {
showActiveTheme(getPreferredTheme());
document.querySelectorAll('[data-bs-theme-value]')
.forEach(toggle => {
toggle.addEventListener('click', () => {
const theme = toggle.getAttribute('data-bs-theme-value');
setStoredTheme(theme);
setTheme(theme);
showActiveTheme(theme, true);
});
});
});
})();

View File

@ -85,11 +85,6 @@ function onSubmitAddProgress(event) {
// For push buttons // For push buttons
const beforeElement = document.createElement('div'); const beforeElement = document.createElement('div');
beforeElement.classList.add('running-status-button-before'); beforeElement.classList.add('running-status-button-before');
button.classList.forEach(className => {
if (className.startsWith('btn-')) {
beforeElement.classList.add(className);
}
});
button.parentNode.insertBefore(beforeElement, button); button.parentNode.insertBefore(beforeElement, button);
} else if (button.tagName == "BUTTON") { } else if (button.tagName == "BUTTON") {
// For toggle buttons // For toggle buttons