diff --git a/actions/dynamicdns b/actions/dynamicdns
index 0e111b45b..3cbe07793 100755
--- a/actions/dynamicdns
+++ b/actions/dynamicdns
@@ -106,7 +106,10 @@ def subcommand_export_config(_):
and _active_config.exists()):
enabled = True
- output_config = {'enabled': enabled, 'domains': {domain['domain']: domain}}
+ output_config = {'enabled': enabled, 'domains': {}}
+ if domain['domain']:
+ output_config['domains'][domain['domain']] = domain
+
print(json.dumps(output_config))
diff --git a/actions/email_server b/actions/email
similarity index 88%
rename from actions/email_server
rename to actions/email
index 8cfc79ae5..28704472b 100755
--- a/actions/email_server
+++ b/actions/email
@@ -10,7 +10,7 @@ import os
import sys
import plinth.log
-from plinth.modules.email_server import audit
+from plinth.modules.email import privileged
EXIT_SYNTAX = 10
EXIT_PERM = 20
@@ -42,12 +42,12 @@ def _call(module_name, action_name, arguments):
logger.critical('This action is reserved for root')
sys.exit(EXIT_PERM)
- # We only run actions defined in the audit module
- if module_name not in audit.__all__:
+ # We only run actions defined in the privileged module
+ if module_name not in privileged.__all__:
logger.critical('Bad module name: %r', module_name)
sys.exit(EXIT_SYNTAX)
- module = getattr(audit, module_name)
+ module = getattr(privileged, module_name)
try:
action = getattr(module, 'action_' + action_name)
except AttributeError:
diff --git a/debian/changelog b/debian/changelog
index 24a8bbccc..50664c614 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,183 @@
+freedombox (22.6.1) unstable; urgency=medium
+
+ [ Johannes Keyser ]
+ * Translated using Weblate (German)
+
+ [ ikmaak ]
+ * Translated using Weblate (Dutch)
+ * Translated using Weblate (Dutch)
+
+ [ Burak Yavuz ]
+ * Translated using Weblate (Turkish)
+
+ [ Eric ]
+ * Translated using Weblate (Chinese (Simplified))
+
+ [ Jiří Podhorecký ]
+ * Translated using Weblate (Czech)
+
+ [ 109247019824 ]
+ * Translated using Weblate (Bulgarian)
+
+ -- James Valleroy
కొత్త %(box_name)sలో "
+"బ్యాకప్ని పునరుద్ధరించడానికి మీకు SSH ఆధారాలు మరియు ఎంచుకుంటే ఎన్క్రిప్షన్ పాస్ఫ్రేజ్ అవసరం."
#: plinth/modules/backups/templates/backups_add_remote_repository.html:28
-#, fuzzy
-#| msgid "Create Connection"
msgid "Create Location"
-msgstr "అనుసంధానం సృష్టించు"
+msgstr "స్థానాన్ని సృష్టించు"
#: plinth/modules/backups/templates/backups_add_repository.html:19
#: plinth/modules/gitweb/views.py:50
-#, fuzzy
-#| msgid "Create User"
msgid "Create Repository"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "రిపోజిటరీని సృష్టించు"
#: plinth/modules/backups/templates/backups_delete.html:12
-#, fuzzy
-#| msgid "Delete connection %(name)s permanently?"
msgid "Delete this archive permanently?"
-msgstr "%(name)s అనుసంధానం శాశ్వతంగా తొలగించు ?"
+msgstr "ఈ ఆర్కైవ్ను శాశ్వతంగా తొలగించాలా?"
#: plinth/modules/backups/templates/backups_delete.html:18
msgid "Time"
msgstr "సమయం"
#: plinth/modules/backups/templates/backups_delete.html:34
-#, fuzzy, python-format
-#| msgid "Delete %(name)s"
+#, python-format
msgid "Delete Archive %(name)s"
-msgstr "%(name)s తొలగించు"
+msgstr "%(name)s ఆర్కైవ్ను తొలగించు"
#: plinth/modules/backups/templates/backups_form.html:20
#: plinth/modules/backups/templates/backups_schedule.html:19
@@ -518,23 +516,19 @@ msgstr "ఈ రిపోజిటరీ గుప్తీకరించబడ
#: plinth/modules/backups/templates/backups_repository.html:29
msgid "Schedule"
-msgstr ""
+msgstr "షెడ్యూల్"
#: plinth/modules/backups/templates/backups_repository.html:40
-#, fuzzy
-#| msgid "Documentation"
msgid "Unmount Location"
-msgstr "పత్రావళి"
+msgstr "స్థానాన్ని అన్మౌంట్ చేయండి"
#: plinth/modules/backups/templates/backups_repository.html:51
-#, fuzzy
-#| msgid "Mount Point"
msgid "Mount Location"
-msgstr "ఆరొహించు కోన"
+msgstr "స్థానాన్ని మౌంట్ చేయండి"
#: plinth/modules/backups/templates/backups_repository.html:62
msgid "Remove Backup Location. This will not delete the remote backup."
-msgstr ""
+msgstr "బ్యాకప్ స్థానాన్ని తీసివేయండి. ఇది రిమోట్ బ్యాకప్ను తొలగించదు."
#: plinth/modules/backups/templates/backups_repository.html:83
msgid "Download"
@@ -559,18 +553,16 @@ msgid ""
"The remote repository will not be deleted. This just removes the repository "
"from the listing on the backup page, you can add it again later on."
msgstr ""
+"రిమోట్ రిపోజిటరీ తొలగించబడదు. ఇది బ్యాకప్ పేజీలోని జాబితా నుండి రిపోజిటరీని తీసివేస్తుంది, మీరు దీన్ని తర్వాత మళ్లీ "
+"జోడించవచ్చు."
#: plinth/modules/backups/templates/backups_repository_remove.html:31
-#, fuzzy
-#| msgid "Documentation"
msgid "Remove Location"
-msgstr "పత్రావళి"
+msgstr "స్థానాన్ని తీసివేయి"
#: plinth/modules/backups/templates/backups_restore.html:15
-#, fuzzy
-#| msgid "Delete %(name)s"
msgid "Restore data from"
-msgstr "%(name)s తొలగించు"
+msgstr "నుండి డేటాను పునరుద్ధరించండి"
#: plinth/modules/backups/templates/backups_upload.html:17
#, python-format
@@ -583,6 +575,12 @@ msgid ""
" backup file.\n"
" "
msgstr ""
+"\n"
+" దాన్ని పునరుద్ధరించడానికి మరొక %(box_name)s నుండి డౌన్లోడ్ చేయబడిన బ్యాకప్ ఫైల్ను అప్లోడ్ "
+"చేయండి\n"
+" విషయాలు. మీరు అప్లోడ్ చేసిన తర్వాత పునరుద్ధరించాలనుకుంటున్న యాప్లను ఎంచుకోవచ్చు a\n"
+" బ్యాకప్ ఫైల్.\n"
+" "
#: plinth/modules/backups/templates/backups_upload.html:27
#: plinth/modules/help/templates/statuslog.html:23
@@ -591,11 +589,13 @@ msgid "Caution:"
msgstr "జాగ్రత్త:"
#: plinth/modules/backups/templates/backups_upload.html:28
-#, python-format
+#, fuzzy, python-format
msgid ""
"You have %(max_filesize)s available to restore a backup. Exceeding this "
"limit can leave your %(box_name)s unusable."
msgstr ""
+"బ్యాకప్ని పునరుద్ధరించడానికి మీకు %(max_filesize)sలు అందుబాటులో ఉన్నాయి. ఈ పరిమితిని అధిగమించడం "
+"వలన మీ %(box_name)s నిరుపయోగంగా ఉంటాయి."
#: plinth/modules/backups/templates/backups_upload.html:41
msgid "Upload file"
@@ -607,6 +607,8 @@ msgid ""
"Could not reach SSH host %(hostname)s. Please verify that the host is up and "
"accepting connections."
msgstr ""
+"SSH హోస్ట్ ను %(hostname)s చేరుకోలేకపోయింది. దయచేసి హోస్ట్ సిద్ధంగా ఉందని మరియు కనెక్షన్లను "
+"అంగీకరిస్తున్నట్లు ధృవీకరించండి."
#: plinth/modules/backups/templates/verify_ssh_hostkey.html:28
#, python-format
@@ -614,20 +616,21 @@ msgid ""
"The authenticity of SSH host %(hostname)s could not be established. The host "
"advertises the following SSH public keys. Please verify any one of them."
msgstr ""
+"SSH హోస్ట్ %(hostname)s యొక్క ప్రామాణికత స్థాపించబడలేదు. హోస్ట్ కింది SSH పబ్లిక్ కీలను ప్రచారం "
+"చేస్తుంది. దయచేసి వాటిలో దేనినైనా ధృవీకరించండి."
#: plinth/modules/backups/templates/verify_ssh_hostkey.html:40
msgid "How to verify?"
msgstr "ఎలా ధృవీకరించాలి?"
#: plinth/modules/backups/templates/verify_ssh_hostkey.html:45
-#, fuzzy
msgid ""
"Run the following command on the SSH host machine. The output should match "
"one of the provided options. You can also use DSA, ECDSA, Ed25519 etc. "
"instead of RSA, by choosing the corresponding file."
msgstr ""
"SSH హోస్ట్ మెషిన్ మీద దిగువ కమాండ్ రన్ చేయాలి. అవుట్ పుట్ ఇవ్వబడ్డ ఆప్షన్ ల్లో ఒకదానిని జతచేయాలి. సంబంధిత "
-"ఫైలును ఎంచుకోవడం ద్వారా, rsa కు బదులుగా dsa, ecdsa, ed25519 మొదలైనవి కూడా ఉపయోగించవచ్చు."
+"ఫైలును ఎంచుకోవడం ద్వారా, RSA కు బదులుగా DSA, ECDSA, Ed25519 మొదలైనవి కూడా ఉపయోగించవచ్చు."
#: plinth/modules/backups/templates/verify_ssh_hostkey.html:60
msgid "Verify Host"
@@ -635,11 +638,9 @@ msgstr "హోస్ట్ ను నిర్ధారించండి"
#: plinth/modules/backups/views.py:55
msgid "Backup schedule updated."
-msgstr ""
+msgstr "బ్యాకప్ షెడ్యూల్ నవీకరించబడింది."
#: plinth/modules/backups/views.py:74
-#, fuzzy
-#| msgid "Create Account"
msgid "Schedule Backups"
msgstr "ఖాతా సృష్టించు"
@@ -676,20 +677,16 @@ msgid "No additional disks available to add a repository."
msgstr "రిపోజిటరీని జోడించడానికి అదనపు డిస్కులు అందుబాటులో లేవు."
#: plinth/modules/backups/views.py:297
-#, fuzzy
-#| msgid "Create Snapshot"
msgid "Create backup repository"
-msgstr "స్నాప్షాట్ని సృష్టించు"
+msgstr "బ్యాకప్ రిపోజిటరీని సృష్టించండి"
#: plinth/modules/backups/views.py:324
msgid "Create remote backup repository"
msgstr "రిమోట్ బ్యాకప్ రిపోజిటరీని సృష్టించండి"
#: plinth/modules/backups/views.py:344
-#, fuzzy
-#| msgid "Add new introducer"
msgid "Added new remote SSH repository."
-msgstr "కొత్త పరిచయకర్తని జోడించండి"
+msgstr "కొత్త రిమోట్ SSH రిపోజిటరీ జోడించబడింది."
#: plinth/modules/backups/views.py:366
msgid "Verify SSH hostkey"
@@ -712,10 +709,8 @@ msgid "Authentication to remote server failed."
msgstr "రిమోట్ సర్వర్కు ప్రామాణీకరణ విఫలమైంది."
#: plinth/modules/backups/views.py:421
-#, fuzzy
-#| msgid "Error installing application: {error}"
msgid "Error establishing connection to server: {}"
-msgstr "అనువర్తనం స్థాపించుటలో దోషం: {error}"
+msgstr "సర్వర్కు కనెక్షన్ని ఏర్పాటు చేయడంలో లోపం: {}"
#: plinth/modules/backups/views.py:432
msgid "Repository removed."
@@ -744,6 +739,10 @@ msgid ""
"audio, video and PDF documents can be previewed in the browser. Shared files "
"can be set to expire after a time period."
msgstr ""
+"bepasty అనేది పెద్ద ఫైల్లను అప్లోడ్ చేయడానికి మరియు భాగస్వామ్యం చేయడానికి అనుమతించే వెబ్ అప్లికేషన్. టెక్స్ట్ "
+"మరియు కోడ్ స్నిప్పెట్లను కూడా అతికించవచ్చు మరియు భాగస్వామ్యం చేయవచ్చు. టెక్స్ట్, ఇమేజ్, ఆడియో, వీడియో మరియు "
+"PDF డాక్యుమెంట్లను బ్రౌజర్లో ప్రివ్యూ చేయవచ్చు. షేర్ చేసిన ఫైల్లు కొంత సమయం తర్వాత గడువు ముగిసేలా సెట్ "
+"చేయవచ్చు."
#: plinth/modules/bepasty/__init__.py:25
msgid ""
@@ -752,6 +751,9 @@ msgid ""
"password, you can share it with the users who should have the associated "
"permissions."
msgstr ""
+"bepasty లాగిన్ కోసం వినియోగదారు పేర్లను ఉపయోగించదు. ఇది password మాత్రమే ఉపయోగిస్తుంది. ప్రతి "
+"password కోసం, అనుమతుల సమితిని ఎంచుకోవచ్చు. మీరు పాస్వర్డ్ను సృష్టించిన తర్వాత, అనుబంధిత "
+"అనుమతులను కలిగి ఉన్న వినియోగదారులతో మీరు దాన్ని భాగస్వామ్యం చేయవచ్చు."
#: plinth/modules/bepasty/__init__.py:29
msgid ""
@@ -760,56 +762,53 @@ msgid ""
"revoke access for a single person or group, by removing their password from "
"the list."
msgstr ""
+"మీరు ఒకే ప్రత్యేక అధికారాలతో బహుళ పాస్వర్డ్లను కూడా సృష్టించవచ్చు మరియు వాటిని వేర్వేరు వ్యక్తులు లేదా "
+"సమూహాలకు పంపిణీ చేయవచ్చు. ఇది జాబితా నుండి వారి పాస్వర్డ్ను తీసివేయడం ద్వారా ఒక వ్యక్తి లేదా సమూహం కోసం "
+"యాక్సెస్ని తర్వాత ఉపసంహరించుకోవడానికి మిమ్మల్ని అనుమతిస్తుంది."
#: plinth/modules/bepasty/__init__.py:38 plinth/modules/bepasty/__init__.py:47
msgid "Read a file, if a web link to the file is available"
-msgstr ""
+msgstr "ఫైల్కి వెబ్ లింక్ అందుబాటులో ఉంటే ఫైల్ని చదవండి"
#: plinth/modules/bepasty/__init__.py:39
-#, fuzzy
-#| msgid "Restore from uploaded file"
msgid "Create or upload files"
-msgstr "అప్లోడ్ చేసిన ఫైల్ నుండి పునరుద్ధరించండి"
+msgstr "ఫైల్లను సృష్టించండి లేదా అప్లోడ్ చేయండి"
#: plinth/modules/bepasty/__init__.py:40
msgid "List all files and their web links"
-msgstr ""
+msgstr "అన్ని ఫైల్లు మరియు వాటి వెబ్ లింక్లను జాబితా చేయండి"
#: plinth/modules/bepasty/__init__.py:41
-#, fuzzy
-#| msgid "Delete User"
msgid "Delete files"
-msgstr "వినియోగదారుని తొలగించు"
+msgstr "ఫైళ్లను తొలగించండి"
#: plinth/modules/bepasty/__init__.py:42
msgid "Administer files: lock/unlock files"
-msgstr ""
+msgstr "ఫైల్లను నిర్వహించండి: ఫైల్లను లాక్/అన్లాక్ చేయండి"
#: plinth/modules/bepasty/__init__.py:46
msgid "None, password is always required"
-msgstr ""
+msgstr "ఏదీ లేదు, పాస్వర్డ్ ఎల్లప్పుడూ అవసరం"
#: plinth/modules/bepasty/__init__.py:48
msgid "List and read all files"
-msgstr ""
+msgstr "అన్ని ఫైల్లను జాబితా చేసి చదవండి"
#: plinth/modules/bepasty/__init__.py:63 plinth/modules/bepasty/manifest.py:6
msgid "bepasty"
-msgstr ""
+msgstr "దుష్ప్రవర్తన"
#: plinth/modules/bepasty/__init__.py:65
-#, fuzzy
-#| msgid "File Sharing"
msgid "File & Snippet Sharing"
-msgstr "ఫైలు పంచుకొనుట"
+msgstr "ఫైల్ & స్నిప్పెట్ భాగస్వామ్యం"
#: plinth/modules/bepasty/forms.py:17
msgid "Public Access (default permissions)"
-msgstr ""
+msgstr "ప్రజా యాక్సిస్ (అప్రమేయం అనుమతులు )"
#: plinth/modules/bepasty/forms.py:18
msgid "Permissions for anonymous users, who have not provided a password."
-msgstr ""
+msgstr "రహస్యపదం అందించని అనామక వినియోగదారులకు అనుమతులు."
#: plinth/modules/bepasty/forms.py:27
#: plinth/modules/bepasty/templates/bepasty.html:30
@@ -820,35 +819,29 @@ msgstr "అనుమతులు"
#: plinth/modules/bepasty/forms.py:29
msgid ""
"Users that log in with this password will have the selected permissions."
-msgstr ""
+msgstr "ఈ రహస్యపదంతో లాగిన్ అయిన వినియోగదారులు ఎంచుకున్న అనుమతులను కలిగి ఉంటారు."
#: plinth/modules/bepasty/forms.py:33
#: plinth/modules/bepasty/templates/bepasty.html:31
msgid "Comment"
-msgstr ""
+msgstr "వ్యాఖ్య"
#: plinth/modules/bepasty/forms.py:34
msgid "Any comment to help you remember the purpose of this password."
-msgstr ""
+msgstr "ఈ రహస్యపదం యొక్క ఉద్దేశ్యాన్ని గుర్తుంచుకోవడంలో మీకు సహాయపడే ఏదైనా వ్యాఖ్య."
#: plinth/modules/bepasty/templates/bepasty.html:12
-#, fuzzy
-#| msgid "Change Password"
msgid "Manage Passwords"
-msgstr "పాస్వర్డ్ మార్చు"
+msgstr "రహస్యపదాలను నిర్వహించండి"
#: plinth/modules/bepasty/templates/bepasty.html:16
#: plinth/modules/bepasty/templates/bepasty.html:18
-#, fuzzy
-#| msgid "Show password"
msgid "Add password"
-msgstr "రహస్యపదం కనబర్చు"
+msgstr "రహస్యపదం జోడించండి"
#: plinth/modules/bepasty/templates/bepasty.html:23
-#, fuzzy
-#| msgid "No shares currently configured."
msgid "No passwords currently configured."
-msgstr "ప్రస్తుతం ఏ షేర్లు ఏర్పాటు చేయబడలేదు."
+msgstr "ప్రస్తుతం రహస్యపదాలను ఏవీ కాన్ఫిగర్ చేయబడలేదు."
#: plinth/modules/bepasty/templates/bepasty.html:29
#: plinth/modules/dynamicdns/forms.py:91 plinth/modules/networks/forms.py:213
@@ -858,21 +851,19 @@ msgstr "రహస్యపదం"
#: plinth/modules/bepasty/views.py:22
msgid "admin"
-msgstr ""
+msgstr "అడ్మిన్"
#: plinth/modules/bepasty/views.py:23
-#, fuzzy
-#| msgid "Repository"
msgid "editor"
-msgstr "భాండాగారము"
+msgstr "సంపాదకుడు"
#: plinth/modules/bepasty/views.py:24
msgid "viewer"
-msgstr ""
+msgstr "వీక్షకుడు"
#: plinth/modules/bepasty/views.py:49
msgid "Read"
-msgstr ""
+msgstr "చదవండి"
#: plinth/modules/bepasty/views.py:50
msgid "Create"
@@ -880,10 +871,10 @@ msgstr "సృష్టించు"
#: plinth/modules/bepasty/views.py:51
msgid "List"
-msgstr ""
+msgstr "జాబితా"
#: plinth/modules/bepasty/views.py:52
-#: plinth/modules/email_server/templates/email_alias.html:28
+#: plinth/modules/email/templates/email-aliases.html:24
#: plinth/modules/letsencrypt/templates/letsencrypt.html:86
#: plinth/modules/networks/templates/connection_show.html:56
#: plinth/modules/samba/templates/samba.html:154
@@ -896,7 +887,7 @@ msgstr "తొలగించు"
#: plinth/modules/bepasty/views.py:53
msgid "Admin"
-msgstr ""
+msgstr "నిర్వాహకుడు"
#: plinth/modules/bepasty/views.py:90 plinth/modules/searx/views.py:38
#: plinth/modules/searx/views.py:49 plinth/modules/tor/views.py:130
@@ -904,7 +895,7 @@ msgstr ""
msgid "Configuration updated."
msgstr "ఆకృతీకరణ నవీకరించబడింది."
-#: plinth/modules/bepasty/views.py:93 plinth/modules/email_server/views.py:41
+#: plinth/modules/bepasty/views.py:93 plinth/modules/email/views.py:48
#: plinth/modules/gitweb/views.py:117 plinth/modules/searx/views.py:41
#: plinth/modules/searx/views.py:52 plinth/modules/tor/views.py:159
#: plinth/modules/zoph/views.py:72
@@ -912,22 +903,16 @@ msgid "An error occurred during configuration."
msgstr "అక్రుతీకరణలో ఒక పొరపాటు జరిగింది."
#: plinth/modules/bepasty/views.py:104
-#, fuzzy
-#| msgid "Password updated"
msgid "Password added."
-msgstr "అనుమతిపదం నవీకరించబడింది"
+msgstr "రహస్యపదం జోడించబడింది."
#: plinth/modules/bepasty/views.py:109
-#, fuzzy
-#| msgid "Password"
msgid "Add Password"
-msgstr "రహస్యపదం"
+msgstr "రహస్యపదాన్ని జోడించండి"
#: plinth/modules/bepasty/views.py:126
-#, fuzzy
-#| msgid "Password updated"
msgid "Password deleted."
-msgstr "అనుమతిపదం నవీకరించబడింది"
+msgstr "రహస్యపదం తొలగించబడింది."
#: plinth/modules/bind/__init__.py:25
msgid ""
@@ -944,8 +929,9 @@ msgid ""
"machines on local network. It is also incompatible with sharing Internet "
"connection from {box_name}."
msgstr ""
-"ప్రస్తుతం, ఈ {box_name} యొక్క లోకల్ నెట్వర్క్ పరిధిలో ఉన్న మెషిన్ల డ్.ఎన్.ఎస్ శోధనలను పరిష్కరించడానికి "
-"మాత్రమే బైండ్ ఉపయోగించబడుతుంది. ఇది ఈ {box_name} నుంచి అంతర్జాల భాగస్వామ్యానికి అననుకూలమైనది."
+"ప్రస్తుతం, {box_name},లో BIND స్థానిక నెట్వర్క్లోని ఇతర మెషీన్ల కోసం DNS ప్రశ్నలను పరిష్కరించడానికి "
+"మాత్రమే ఉపయోగించబడుతుంది. ఇది {box_name} నుండి ఇంటర్నెట్ బంధాన్ని భాగస్వామ్యం చేయడంతో కూడా "
+"అననుకూలంగా ఉంది."
#: plinth/modules/bind/__init__.py:76
msgid "BIND"
@@ -973,11 +959,11 @@ msgid "Enable Domain Name System Security Extensions"
msgstr "డొమైన్ నేమ్ సిస్టం భద్రతా పొడిగింపు ని ప్రారంభించండి"
#: plinth/modules/bind/templates/bind.html:11
-#, fuzzy
msgid "Serving Domains"
-msgstr "సర్వర్ డొమైన్"
+msgstr "అధికారకక్షేత్రాలను అందిస్తోంది"
#: plinth/modules/bind/templates/bind.html:17
+#: plinth/modules/email/templates/email.html:38
#: plinth/modules/ikiwiki/forms.py:12
#: plinth/modules/names/templates/names.html:15
#: plinth/modules/networks/templates/connection_show.html:91
@@ -987,20 +973,14 @@ msgid "Type"
msgstr "రకం"
#: plinth/modules/bind/templates/bind.html:18
-#, fuzzy
-#| msgid "Domain Name"
msgid "Domain Names"
-msgstr "డొమైను పేరు"
+msgstr "అధికారకక్షేత్రాల పేరులు"
#: plinth/modules/bind/templates/bind.html:19
-#, fuzzy
-#| msgid "Service"
msgid "Serving"
msgstr "సేవ"
#: plinth/modules/bind/templates/bind.html:20
-#, fuzzy
-#| msgid "IP address"
msgid "IP addresses"
msgstr "IP చిరునామా"
@@ -1011,7 +991,7 @@ msgstr "IP చిరునామా మరియు డొమైన్లన
#: plinth/modules/bind/views.py:71 plinth/modules/coturn/views.py:39
#: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78
-#: plinth/modules/ejabberd/views.py:85 plinth/modules/email_server/views.py:38
+#: plinth/modules/ejabberd/views.py:85 plinth/modules/email/views.py:45
#: plinth/modules/matrixsynapse/views.py:124
#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:28
#: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28
@@ -1028,6 +1008,8 @@ msgid ""
"store your e-books on your {box_name}, read them online or from any of your "
"devices."
msgstr ""
+"క్యాలిబర్ సర్వర్ మీ ఇ-బుక్ సేకరణకు ఆన్లైన్ యాక్సెస్ను అందిస్తుంది. మీరు మీ ఇ-బుక్స్లను మీ {box_name}"
+"లో నిల్వ చేయవచ్చు, వాటిని ఆన్లైన్లో లేదా మీ పరికరాల్లో దేని నుండైనా చదవవచ్చు."
#: plinth/modules/calibre/__init__.py:29
msgid ""
@@ -1037,47 +1019,50 @@ msgid ""
"an online web reader. It remembers your last read location, bookmarks, and "
"highlighted text. Content distribution using OPDS is currently not supported."
msgstr ""
+"మీరు మీ ఇ-పుస్తకాలను నిర్వహించవచ్చు, వాటి మెటాడేటాను సంగ్రహించవచ్చు మరియు సవరించవచ్చు మరియు "
+"అధునాతన శోధనను నిర్వహించవచ్చు. క్యాలిబర్ ఏదైనా పరికరంలో చదవడానికి ఇ-పుస్తకాలను సిద్ధంగా ఉంచడానికి "
+"విస్తృత శ్రేణి ఫార్మాట్లలో దిగుమతి చేసుకోవచ్చు, ఎగుమతి చేయవచ్చు లేదా మార్చవచ్చు. ఇది ఆన్లైన్ వెబ్ రీడర్ను "
+"కూడా అందిస్తుంది. ఇది మీరు చివరిగా చదివిన స్థానం, బుక్మార్క్లు మరియు హైలైట్ చేసిన వచనాన్ని "
+"గుర్తుంచుకుంటుంది. OPDSని ఉపయోగించి కంటెంట్ పంపిణీకి ప్రస్తుతం మద్దతు లేదు"
#: plinth/modules/calibre/__init__.py:35
msgid ""
"Only users belonging to calibre group will be able to access the "
"app. All users with access can use all the libraries."
msgstr ""
+"calibre సమూహానికి చెందిన వినియోగదారులు మాత్రమే యాప్ని యాక్సెస్ చేయగలరు. యాక్సెస్ ఉన్న "
+"వినియోగదారులందరూ అన్ని గ్రంధాలయంను ఉపయోగించవచ్చు"
#: plinth/modules/calibre/__init__.py:57
msgid "Use calibre e-book libraries"
-msgstr ""
+msgstr "క్యాలిబర్ ఇ-బుక్ లైబ్రరీ ఉపయోగించండి"
#: plinth/modules/calibre/__init__.py:60 plinth/modules/calibre/manifest.py:6
msgid "calibre"
-msgstr ""
+msgstr "క్యాలిబర్"
#: plinth/modules/calibre/__init__.py:61
msgid "E-book Library"
-msgstr ""
+msgstr "ఇ-బుక్ లైబ్రరీ"
#: plinth/modules/calibre/forms.py:18
-#, fuzzy
-#| msgid "Name of the share"
msgid "Name of the new library"
-msgstr "షేర్ యొక్క పేరు"
+msgstr "కొత్త గ్రంధాలయం పేరు"
#: plinth/modules/calibre/forms.py:27
-#, fuzzy
msgid "A library with this name already exists."
-msgstr "ఈ సేవ ఇప్పటికే ఉంది"
+msgstr "ఈ పేరుతో గ్రంధాలయం ఇప్పటికే ఉంది."
#: plinth/modules/calibre/templates/calibre-delete-library.html:11
-#, fuzzy, python-format
-#| msgid "Delete Wiki or Blog %(name)s"
+#, python-format
msgid "Delete calibre Library %(name)s"
-msgstr "వికీ లేదా బ్లాగ్ తొలగించు %(name)s"
+msgstr "క్యాలిబర్ గ్రంధాలయం %(name)sని తొలగించండి"
#: plinth/modules/calibre/templates/calibre-delete-library.html:17
msgid ""
"Delete this library permanently? All stored e-books and saved data will be "
"lost."
-msgstr ""
+msgstr "ఈ లైబ్రరీని శాశ్వతంగా నిర్ములించు?భద్రపరచిన ఇ-బుక్స్ మరియు సమాచారం కోల్పోతాయి."
#: plinth/modules/calibre/templates/calibre-delete-library.html:27
#: plinth/modules/gitweb/templates/gitweb_delete.html:27
@@ -1088,46 +1073,35 @@ msgid "Delete %(name)s"
msgstr "%(name)s తొలగించు"
#: plinth/modules/calibre/templates/calibre.html:11
-#, fuzzy
-#| msgid "Create User"
msgid "Manage Libraries"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "గ్రంధాలయంను నిర్వహించండి"
#: plinth/modules/calibre/templates/calibre.html:15
#: plinth/modules/calibre/templates/calibre.html:17
-#, fuzzy
-#| msgid "Create User"
msgid "Create Library"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "గ్రంధాలయంను సృష్టించు"
#: plinth/modules/calibre/templates/calibre.html:24
-#, fuzzy
-#| msgid "Tor relay port available"
msgid "No libraries available."
-msgstr "టార్ రిలే పోర్ట్ అందుబాటులో ఉంది"
+msgstr "గ్రంధాలయంలు అందుబాటులో లేవు."
#: plinth/modules/calibre/templates/calibre.html:31
#, python-format
msgid "Go to library %(library)s"
-msgstr ""
+msgstr "%(library)s లైబ్రరీకి వెళ్లుము"
#: plinth/modules/calibre/templates/calibre.html:37
-#, fuzzy, python-format
-#| msgid "Delete site %(site)s"
+#, python-format
msgid "Delete library %(library)s"
-msgstr "ప్రదేశం తొలగించు %(site)s"
+msgstr "గ్రంధాలయంను తొలగించు %(library)s"
#: plinth/modules/calibre/views.py:39
-#, fuzzy
-#| msgid "Repository created."
msgid "Library created."
-msgstr "రిపోజిటరీ సృష్టించబడింది."
+msgstr "గ్రంధాలయంను సృష్టించారు."
#: plinth/modules/calibre/views.py:50
-#, fuzzy
-#| msgid "An error occurred during configuration."
msgid "An error occurred while creating the library."
-msgstr "అక్రుతీకరణలో ఒక పొరపాటు జరిగింది."
+msgstr "గ్రంధాలయంని సృష్టిస్తున్నప్పుడు లోపం సంభవించింది."
#: plinth/modules/calibre/views.py:64 plinth/modules/gitweb/views.py:138
#, python-brace-format
@@ -1158,29 +1132,26 @@ msgid ""
"firewall ports and advanced networking such as bonding, bridging and VLAN "
"management."
msgstr ""
+"కాక్పిట్ ను ఉన్నత స్థితి నిల్వ కార్యాచరణాలు ఐనా ఖని విభజన పనిలో మరియు RAID నిర్వాహణ లో "
+"ఉపయోగించబడుతుంది .ఇది కస్టమ్ ఫైర్వాల్ పోర్ట్లను తెరవడానికి మరియు బాండింగ్, బ్రిడ్జింగ్ మరియు VLAN నిర్వహణ "
+"వంటి అధునాతన నెట్వర్కింగ్ కోసం కూడా ఉపయోగించవచ్చు."
#: plinth/modules/cockpit/__init__.py:36
-#, fuzzy, python-brace-format
-#| msgid ""
-#| "When enabled, Cockpit will be available from /"
-#| "_cockpit/ path on the web server. It can be accessed by any user with a {box_name} login. Sensitive "
-#| "information and system altering abilities are limited to users belonging "
-#| "to admin group."
+#, python-brace-format
msgid ""
"It can be accessed by any user on {box_name} "
"belonging to the admin group."
msgstr ""
-"ప్రారంభించినప్పుడు, వెబ్ సర్వర్లో / _cockpit / మార్గం నుండి "
-"కాక్పిట్ అందుబాటులో ఉంటుంది. దీన్ని మంది వినియోగదారులచే "
-"ద్వారా పొందవచ్చు {box_name}.\n"
-"అంగీకార సమాచారం మరియు సిస్టమ్ మార్చడం సామర్ధ్యాలు నిర్వాహక సమూహం చెందిన వినియోగదారులకు పరిమితం."
+"నిర్వాహక సమూహానికి చెందిన {box_name}లో ఏదైనా వినియోగదారు దీన్ని "
+"యాక్సెస్ చేయవచ్చు."
#: plinth/modules/cockpit/__init__.py:40
msgid ""
"Cockpit requires that you access it through a domain name. It will not work "
"when accessed using an IP address as part of the URL."
msgstr ""
+"కాక్పిట్ని మీరు అధికారక్షేత్రం పేరు ద్వారా యాక్సెస్ చేయడం అవసరం. URLలో భాగంగా IP చిరునామాను ఉపయోగించి "
+"యాక్సెస్ చేసినప్పుడు ఇది పని చేయదు."
#: plinth/modules/cockpit/__init__.py:62 plinth/modules/cockpit/manifest.py:9
#: plinth/modules/performance/manifest.py:9
@@ -1192,20 +1163,20 @@ msgid "Server Administration"
msgstr "సేవిక పరిపాలన"
#: plinth/modules/cockpit/templates/cockpit.html:11
-#, fuzzy
-#| msgid "Access Point"
msgid "Access"
msgstr "ప్రాప్తి సూచి"
#: plinth/modules/cockpit/templates/cockpit.html:14
msgid "Cockpit will only work when accessed using the following URLs."
-msgstr ""
+msgstr "కింది URLలను ఉపయోగించి యాక్సెస్ చేసినప్పుడు మాత్రమే కాక్పిట్ పని చేస్తుంది."
#: plinth/modules/config/__init__.py:23
msgid ""
"Here you can set some general configuration options like hostname, domain "
"name, webserver home page etc."
msgstr ""
+"ఇక్కడ మీరు ఆతిథ్య నామం అధికారక్షేత్రం మహాతలంసేవిక మొదలైన కొన్ని సాధారణ రూపకరణ ఎంపికలను అమరిక "
+"చేయవచ్చు."
#: plinth/modules/config/__init__.py:53
msgid "General Configuration"
@@ -1232,17 +1203,15 @@ msgstr "డొమైన్ పేరు చెల్లదు"
#: plinth/modules/config/forms.py:40
#, python-brace-format
msgid "{user}'s website"
-msgstr ""
+msgstr "{user}'sమహాతలం పుట"
#: plinth/modules/config/forms.py:42
-#, fuzzy
-#| msgid "Default"
msgid "Apache Default"
msgstr "అప్రమేయం"
#: plinth/modules/config/forms.py:43
msgid "FreedomBox Service (Plinth)"
-msgstr ""
+msgstr "ఫ్రీడమ్ బాక్స్ (ప్లిన్త్ )"
#: plinth/modules/config/forms.py:55
msgid "Hostname"
@@ -1293,6 +1262,11 @@ msgid ""
"is set to something other than {box_name} Service (Plinth), your users must "
"explicitly type /plinth or /freedombox to reach {box_name} Service (Plinth)."
msgstr ""
+"ఎవరైనా మిమ్మల్ని సందర్శించినప్పుడు తప్పనిసరిగా అందించాల్సిన డిఫాల్ట్ పేజీని ఎంచుకోండి {box_name} "
+"అంతర్జాలంలో .ఎవరైనా డొమైన్ పేరును సందర్శించినప్పుడు మీ బ్లాగ్ లేదా వికీని హోమ్ పేజీగా సెట్ చేయడం ఒక సాధారణ "
+"ఉపయోగ సందర్భం. ఒకసారి హోమ్ పేజీని కాకుండా వేరే వాటికి సెట్ చేయబడిందని గమనించండి {box_name}సర్వీస్ "
+"(ప్లింత్), చేరుకోవడానికి మీ వినియోగదారులు స్పష్టంగా /ప్లిన్త్ లేదా /ఫ్రీడమ్బాక్స్ అని టైప్ చేయాలి {box_name} "
+"సర్వీస్ (ప్లింత్)."
#: plinth/modules/config/forms.py:98
msgid "Show advanced apps and features"
@@ -1330,8 +1304,7 @@ msgid "Webserver home page set"
msgstr "వెబ్ సర్వర్ హోమ్ పేజీ సెట్ చేయబడింది"
#: plinth/modules/config/views.py:80
-#, fuzzy, python-brace-format
-#| msgid "Error setting domain name: {exception}"
+#, python-brace-format
msgid "Error changing advanced mode: {exception}"
msgstr "అధికారక్షేత్రం పేరు అమర్పులోపం: {exception}"
@@ -1350,6 +1323,9 @@ msgid ""
"other communication servers can use it to establish a call between parties "
"who are otherwise unable connect to each other."
msgstr ""
+"Coturn అనేది TURN మరియు STUN ప్రోటోకాల్ల అమలును అందించడం ద్వారా ఆడియో/వీడియో కాల్లు మరియు "
+"సమావేశాలను సులభతరం చేయడానికి ఒక సర్వర్. WebRTC, SIP మరియు ఇతర కమ్యూనికేషన్ సర్వర్లు ఒకదానికొకటి "
+"కనెక్ట్ చేయలేని పార్టీల మధ్య కాల్ని ఏర్పాటు చేయడానికి దీన్ని ఉపయోగించవచ్చు."
#: plinth/modules/coturn/__init__.py:34
#, python-brace-format
@@ -1358,28 +1334,28 @@ msgid ""
"\"{ms_url}\">Matrix Synapse or ejabberd need to "
"be configured with the details provided here."
msgstr ""
+"ఇది వినియోగదారులచే నేరుగా ఉపయోగించబడదు. వంటి సర్వర్లుMatrix Synapse"
+"a> or ejabberd ఇక్కడ అందించిన వివరాలతో రూపకరణచేయాలి."
#: plinth/modules/coturn/__init__.py:57
msgid "Coturn"
-msgstr ""
+msgstr "కోటుర్న్"
#: plinth/modules/coturn/__init__.py:58
msgid "VoIP Helper"
-msgstr ""
+msgstr "విఓఐపీ సహాయకుడు"
#: plinth/modules/coturn/forms.py:22
msgid "Invalid list of STUN/TURN Server URIs"
-msgstr ""
+msgstr "నిస్సారం జాబిత యొక్క స్టన్/టర్న్ సర్వర్ ఉరల్స్"
#: plinth/modules/coturn/templates/coturn.html:15
msgid "Use the following URLs to configure your communication server:"
-msgstr ""
+msgstr "మీ కమ్యూనికేషన్ సర్వర్ను కాన్ఫిగర్ చేయడానికి క్రింది URLలను ఉపయోగించండి:"
#: plinth/modules/coturn/templates/coturn.html:24
-#, fuzzy
-#| msgid "The following disks are in use:"
msgid "Use the following shared authentication secret:"
-msgstr "క్రింది డిస్కులు ఉపయోగంలో ఉన్నాయి:"
+msgstr "కింది భాగస్వామ్య ప్రమాణీకరణ రహస్యాన్ని ఉపయోగించండి:"
#: plinth/modules/datetime/__init__.py:19
msgid ""
@@ -1395,7 +1371,7 @@ msgstr "తేదీ & సమయం"
#: plinth/modules/datetime/__init__.py:117
msgid "Time synchronized to NTP server"
-msgstr ""
+msgstr "సమయం NTP సర్వర్కి సమకాలీకరించబడింది"
#: plinth/modules/datetime/forms.py:18
msgid "Time Zone"
@@ -1426,19 +1402,13 @@ msgid "Deluge is a BitTorrent client that features a Web UI."
msgstr "డీలడ్జ్ అనేది జాల UI కలిగివున్న ఒక బిట్ టోరెంట్ కక్షిదారు."
#: plinth/modules/deluge/__init__.py:23
-#, fuzzy
-#| msgid ""
-#| "When enabled, the Deluge web client will be available from /deluge path on the web server. The default password is "
-#| "'deluge', but you should log in and change it immediately after enabling "
-#| "this service."
msgid ""
"The default password is 'deluge', but you should log in and change it "
"immediately after enabling this service."
msgstr ""
-"ఈ సేవని అనుమతించినప్పుడు మీ డెల్యూజ్ వెబ్ క్లైంట్ మీకు /డెల్యూజ్ అనే "
-"మార్గంలో అందుబాటులోనుంటుంది. ప్రధమ పాస్వర్డ్ గా 'డెల్యూజ్' ఉంటుంది, కానీ మీరు లాగ్ ఇన్ అయినవెంటనే మీ "
-"పాస్వర్డ్ ను మార్చుకోవాలి."
+"ఈ సేవని అనుమతించినప్పుడు మీ డెల్యూజ్ వెబ్ క్లైంట్ మీకు <a href=\"/deluge\">/డెల్యూజ్</"
+"a> అనే మార్గంలో అందుబాటులోనుంటుంది. ప్రధమ పాస్వర్డ్ గా 'డెల్యూజ్' ఉంటుంది, కానీ మీరు లాగ్ ఇన్ "
+"అయినవెంటనే మీ పాస్వర్డ్ ను మార్చుకోవాలి."
#: plinth/modules/deluge/__init__.py:44
#: plinth/modules/transmission/__init__.py:49
@@ -1476,47 +1446,41 @@ msgid "Diagnostics"
msgstr "లక్షణాలు"
#: plinth/modules/diagnostics/__init__.py:97
-#, fuzzy
-#| msgid "Quassel"
msgid "passed"
-msgstr "క్వాసెల్"
+msgstr "ఉత్తీర్ణులయ్యారు"
#: plinth/modules/diagnostics/__init__.py:98
#: plinth/modules/networks/views.py:49
-#, fuzzy
-#| msgid "Setup failed."
msgid "failed"
-msgstr "అమరక విఫలమైంది."
+msgstr "విఫలమయ్యారు"
#: plinth/modules/diagnostics/__init__.py:99
msgid "error"
-msgstr ""
+msgstr "లోపం"
#: plinth/modules/diagnostics/__init__.py:100
msgid "warning"
-msgstr ""
+msgstr "హెచ్చరిక"
#. Translators: This is the unit of computer storage Mebibyte similar to
#. Megabyte.
#: plinth/modules/diagnostics/__init__.py:202
msgid "MiB"
-msgstr ""
+msgstr "నిర్వహణ సమాచార ఆధారం"
#. Translators: This is the unit of computer storage Gibibyte similar to
#. Gigabyte.
#: plinth/modules/diagnostics/__init__.py:207
-#, fuzzy
-#| msgid "Git"
msgid "GiB"
-msgstr "గిట్"
+msgstr "గిబ్"
#: plinth/modules/diagnostics/__init__.py:214
msgid "You should disable some apps to reduce memory usage."
-msgstr ""
+msgstr "మెమరీ వినియోగాన్ని తగ్గించడానికి మీరు కొన్ని యాప్లను నిలిపివేయాలి."
#: plinth/modules/diagnostics/__init__.py:219
msgid "You should not install any new apps on this system."
-msgstr ""
+msgstr "మీరు ఈ సిస్టమ్లో ఏ కొత్త యాప్లను ఇన్స్టాల్ చేయకూడదు."
#: plinth/modules/diagnostics/__init__.py:231
#, no-python-format, python-brace-format
@@ -1524,10 +1488,12 @@ msgid ""
"System is low on memory: {percent_used}% used, {memory_available} "
"{memory_available_unit} free. {advice_message}"
msgstr ""
+"సిస్టమ్ మెమరీ తక్కువగా ఉంది: {percent_used}% ఉపయోగించబడింది, {memory_available} "
+"{memory_available_unit} ఉచితం. {advice_message}"
#: plinth/modules/diagnostics/__init__.py:233
msgid "Low Memory"
-msgstr ""
+msgstr "తక్కువ మెమరీ"
#: plinth/modules/diagnostics/templates/diagnostics.html:17
#: plinth/modules/diagnostics/templates/diagnostics_button.html:11
@@ -1549,6 +1515,9 @@ msgid ""
" App: %(app_name)s\n"
" "
msgstr ""
+"\n"
+" యాప్: %(app_name)s\n"
+" "
#: plinth/modules/diagnostics/templates/diagnostics_app.html:10
msgid "Diagnostic Results"
@@ -1557,13 +1526,11 @@ msgstr "లక్షణములు ఫలితాలు"
#: plinth/modules/diagnostics/templates/diagnostics_app.html:12
#, python-format
msgid "App: %(app_name)s"
-msgstr ""
+msgstr "యాప్: %(app_name)s"
#: plinth/modules/diagnostics/templates/diagnostics_app.html:21
-#, fuzzy
-#| msgid "This module does not support diagnostics"
msgid "This app does not support diagnostics"
-msgstr "ఈ మాడ్యూల్ విశ్లేషణకు సహకరించదు"
+msgstr "ఈ యాప్ డయాగ్నస్టిక్స్కు మద్దతు ఇవ్వదు"
#: plinth/modules/diagnostics/templates/diagnostics_results.html:11
msgid "Test"
@@ -1606,23 +1573,16 @@ msgstr ""
"DNS పేరు అడుగుతాడు ఉంటే, వారు మీ ప్రస్తుత ఐ.పీ. చిరునామాతో సమాధానం పొందుతారు."
#: plinth/modules/dynamicdns/__init__.py:41
-#, fuzzy
-#| msgid ""
-#| "If you are looking for a free dynamic DNS account, you may find a free "
-#| "GnuDIP service at gnudip.datasystems24.net or you may find free update "
-#| "URL based services at freedns.afraid.org."
msgid ""
"If you are looking for a free dynamic DNS account, you may find a free "
"GnuDIP service at ddns."
"freedombox.org or you may find free update URL based services at freedns.afraid.org."
msgstr ""
-"మీరు ఒక ఉచిత డైనమిక్ DNS ఖాతా కోసం చూస్తున్న ఉంటే, మీరు 1gnudip.datasystems24.net 2 వద్ద ఉచిత "
-"GnuDIP సేవ కనుగొనేందుకు ఉండవచ్చు లేదా మీరు 3 freedns.afraid.org 4 ఉచిత నవీకరణ URL ఆధారిత సేవలు "
+"మీరు ఒక ఉచిత డైనమిక్ DNS ఖాతా కోసం చూస్తున్న ఉంటే, మీరు 1gnudip.datasystems24.net 2 వద్ద "
+"ఉచిత GnuDIP సేవ కనుగొనేందుకు ఉండవచ్చు లేదా మీరు 3 freedns.afraid.org 4 ఉచిత నవీకరణ URL ఆధారిత సేవలు "
"కనుగొనవచ్చు."
#: plinth/modules/dynamicdns/__init__.py:64
@@ -1630,10 +1590,8 @@ msgid "Dynamic DNS Client"
msgstr "గతిక DNS కక్షిదారు"
#: plinth/modules/dynamicdns/__init__.py:77
-#, fuzzy
-#| msgid "Domain Name"
msgid "Dynamic Domain Name"
-msgstr "డొమైను పేరు"
+msgstr "డైనమిక్ డొమైన్ పేరు"
#: plinth/modules/dynamicdns/forms.py:18
msgid ""
@@ -1683,12 +1641,7 @@ msgid "Leave this field empty if you want to keep your current password."
msgstr "మీరు మీ ప్రస్తుత పాస్వర్డ్ ను ఉంచుకోవాలనుకుంటే ఈ ఫీల్డ్ ఖాళీగా వదిలివేయండి."
#: plinth/modules/dynamicdns/forms.py:43
-#, fuzzy, python-brace-format
-#| msgid ""
-#| "Optional Value. If your {box_name} is not connected directly to the "
-#| "Internet (i.e. connected to a NAT router) this URL is used to determine "
-#| "the real IP address. The URL should simply return the IP where the client "
-#| "comes from (example: http://myip.datasystems24.de)."
+#, python-brace-format
msgid ""
"Optional Value. If your {box_name} is not connected directly to the Internet "
"(i.e. connected to a NAT router) this URL is used to determine the real IP "
@@ -1706,13 +1659,11 @@ msgstr "మీరు మీ ఖాతాను సృష్టించినప
#: plinth/modules/dynamicdns/forms.py:54
msgid "GnuDIP"
-msgstr ""
+msgstr "జ్ఞుడిప్"
#: plinth/modules/dynamicdns/forms.py:57
-#, fuzzy
-#| msgid "Update URL"
msgid "Other update URL"
-msgstr "URL నవీకరణ"
+msgstr "ఇతర నవీకరణ URL"
#: plinth/modules/dynamicdns/forms.py:59
msgid "Service Type"
@@ -1753,11 +1704,11 @@ msgstr "పబ్లిక్ IP చూసేందుకు URL"
#: plinth/modules/dynamicdns/forms.py:104
msgid "Use IPv6 instead of IPv4"
-msgstr ""
+msgstr "ఇప్ప్4 బదులు ఇప్ప్6 వినియోగించండి"
#: plinth/modules/dynamicdns/forms.py:123
msgid "This field is required."
-msgstr ""
+msgstr "ఇది అవసరమేయిన్న క్షేత్రం."
#: plinth/modules/dynamicdns/templates/dynamicdns.html:11
#: plinth/modules/firewall/templates/firewall.html:16
@@ -1774,6 +1725,7 @@ msgid "Status"
msgstr "స్థితి"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:18
+#: plinth/modules/email/templates/email.html:35
#: plinth/modules/letsencrypt/templates/letsencrypt.html:24
msgid "Domain"
msgstr "డొమైన్"
@@ -1783,50 +1735,36 @@ msgid "Last update"
msgstr "చివరి నవీకరణ"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:21
-#, fuzzy
-#| msgid "IP address"
msgid "IP Address"
msgstr "IP చిరునామా"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:32
-#, fuzzy
-#| msgid "Access Point"
msgid "Success"
-msgstr "ప్రాప్తి సూచి"
+msgstr "విజయం"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:36
-#, fuzzy
-#| msgid "Setup failed."
msgid "Failed"
msgstr "అమరక విఫలమైంది."
#: plinth/modules/dynamicdns/templates/dynamicdns.html:52
-#, fuzzy
-#| msgid "Tor relay port available"
msgid "No status available."
-msgstr "టార్ రిలే పోర్ట్ అందుబాటులో ఉంది"
+msgstr "స్థితి అందుబాటులో లేదు."
#: plinth/modules/dynamicdns/views.py:24 plinth/modules/dynamicdns/views.py:26
-#, fuzzy
-#| msgid "Connection Name"
msgid "Connection timed out"
-msgstr "అనుసంధానం పేరు"
+msgstr "కనెక్షన్ సమయం ముగిసింది"
#: plinth/modules/dynamicdns/views.py:25
msgid "Could not find server"
-msgstr ""
+msgstr "సర్వర్ కనుగొనబడలేదు"
#: plinth/modules/dynamicdns/views.py:27
-#, fuzzy
-#| msgid "Delete connection"
msgid "Server refused connection"
-msgstr "అనుసంధానం తొలగించండి"
+msgstr "సర్వర్ కనెక్షన్ నిరాకరించింది"
#: plinth/modules/dynamicdns/views.py:28
-#, fuzzy
-#| msgid "Last update"
msgid "Already up-to-date"
-msgstr "చివరి నవీకరణ"
+msgstr "ఇప్పటికే తాజాగా ఉంది"
#: plinth/modules/ejabberd/__init__.py:31
msgid ""
@@ -1837,26 +1775,26 @@ msgstr ""
"అమలు చేయగలరు ejabberd అని ఆకృతీకరించవచ్చు."
#: plinth/modules/ejabberd/__init__.py:34
-#, fuzzy, python-brace-format
-#| msgid ""
-#| "To actually communicate, you can use the web client or any other XMPP "
-#| "client."
+#, python-brace-format
msgid ""
"To actually communicate, you can use the web client"
"a> or any other XMPP client. When enabled, ejabberd can be accessed by "
"any user with a {box_name} login."
msgstr ""
-"నిజానికి సమాచార మార్పిడి చేయడానికి, మీరు వెబ్ క్లయింట్ లేదా ఏ ఇతర XMPP క్లయింట్ ఉపయోగించవచ్చు."
+"వాస్తవానికి కమ్యూనికేట్ చేయడానికి, మీరు వెబ్ క్లయింట్ లేదా ఏదైనా ఇతర ని ఉపయోగించవచ్చు. "
+"XMPP క్లయింట్. ప్రారంభించబడినప్పుడు, ejabberdని ఏ "
+"వినియోగదారు అయినా {box_name} లాగిన్తో యాక్సెస్ చేయవచ్చు."
#: plinth/modules/ejabberd/__init__.py:42
-#, python-brace-format
+#, fuzzy, python-brace-format
msgid ""
"ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server."
msgstr ""
+"ejabberd కి శ్రావణ /దృశ్యం కాల్ల కోసం stun /turn సేవిక అవసరం. కార్యక్షేత్రం ను నెలకొల్పడం "
+"చేయండి లేదా బాహ్య సేవిక ను రూపకారణం చేయండి {coturn_url}"
#: plinth/modules/ejabberd/__init__.py:65
msgid "ejabberd"
@@ -1885,33 +1823,33 @@ msgstr ""
#: plinth/modules/ejabberd/forms.py:27 plinth/modules/matrixsynapse/forms.py:22
msgid "Automatically manage audio/video call setup"
-msgstr ""
+msgstr "ఆడియో/వీడియో కాల్ స్వయంచాలకంగా నిర్వహించండి"
#: plinth/modules/ejabberd/forms.py:29
-#, python-brace-format
+#, fuzzy, python-brace-format
msgid ""
"Configures the local coturn app as the STUN/TURN "
"server for ejabberd. Disable this if you want to use a different STUN/TURN "
"server."
msgstr ""
+"ejjabred కోసం స్థానిక కార్యక్షేత్రం stun /turn సేవికగా రూపకరణ చెయ్యండి. మీరు వేరే stun /turn "
+"సేవికాని ఉపయోగలించాలనుకుంటే దీన్ని నిలిపివేయండి {coturn_url}"
#: plinth/modules/ejabberd/forms.py:36 plinth/modules/matrixsynapse/forms.py:31
msgid "STUN/TURN Server URIs"
-msgstr ""
+msgstr "స్టన్/టర్న్ సర్వర్ యు ఆర్ ఎల్"
#: plinth/modules/ejabberd/forms.py:38 plinth/modules/matrixsynapse/forms.py:33
msgid "List of public URIs of the STUN/TURN server, one on each line."
-msgstr ""
+msgstr "stun /turn సేవిక యొక్క ప్రజా యూరిన్ జాబితా , ప్రతి లైన్లో ఒకటి ."
#: plinth/modules/ejabberd/forms.py:42 plinth/modules/matrixsynapse/forms.py:37
-#, fuzzy
-#| msgid "Authentication Mode"
msgid "Shared Authentication Secret"
-msgstr "ప్రామాణీకరణ విధం"
+msgstr "భాగస్వామ్య ప్రమాణీకరణ రహస్యం"
#: plinth/modules/ejabberd/forms.py:43 plinth/modules/matrixsynapse/forms.py:38
msgid "Shared secret used to compute passwords for the TURN server."
-msgstr ""
+msgstr "TURN సర్వర్ కోసం పాస్వర్డ్లను గణించడానికి ఉపయోగించే భాగస్వామ్య రహస్యం."
#: plinth/modules/ejabberd/manifest.py:10
msgid "Conversations"
@@ -1968,148 +1906,160 @@ msgstr ""
"కనిపిస్తాయి \n"
"మీరు మీ డొమైన్ను kaanfigar పేజీలో సెటప్ చేయవచ్చు."
-#: plinth/modules/email_server/__init__.py:31
+#: plinth/modules/email/__init__.py:26
+msgid ""
+"This is a complete email server solution using Postfix, Dovecot, and Rspamd. "
+"Postfix sends and receives emails. Dovecot allows email clients to access "
+"your mailbox using IMAP and POP3. Rspamd deals with spam."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:31
+#, python-brace-format
+msgid ""
+"Each user on {box_name} gets an email address like user@mydomain.example. "
+"They will also receive mail from all addresses that look like user"
+"+foo@mydomain.example. Further, they can add aliases to their email address. "
+"Necessary aliases such as \"postmaster\" are automatically created pointing "
+"to the first admin user."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:37
msgid ""
"Roundcube app provides web interface "
"for users to access email."
msgstr ""
+"Roundcube యాప్ వినియోగదారులు ఇమెయిల్ను యాక్సెస్ "
+"చేయడానికి వెబ్ ఇంటర్ఫేస్ను అందిస్తుంది."
-#: plinth/modules/email_server/__init__.py:33
+#: plinth/modules/email/__init__.py:39
msgid ""
"During installation, any other email servers in the system will be "
"uninstalled."
+msgstr "ఇన్స్టాలేషన్ సమయంలో, సిస్టమ్లోని ఏదైనా ఇతర ఇమెయిల్ సర్వర్లు అన్ఇన్స్టాల్ చేయబడతాయి"
+
+#: plinth/modules/email/__init__.py:58
+msgid "Postfix/Dovecot"
msgstr ""
-#: plinth/modules/email_server/__init__.py:44
-#, fuzzy
-#| msgid "Chat Server"
+#: plinth/modules/email/__init__.py:60
msgid "Email Server"
msgstr "కబుర్ల సేవిక"
-#: plinth/modules/email_server/__init__.py:100
-msgid "Powered by Postfix, Dovecot & Rspamd"
-msgstr ""
-
-#: plinth/modules/email_server/audit/ldap.py:68
-msgid "Postfix-Dovecot SASL integration"
-msgstr ""
-
-#: plinth/modules/email_server/audit/ldap.py:69
-msgid "Postfix alias maps"
-msgstr ""
-
-#: plinth/modules/email_server/audit/spam.py:87
-msgid "Inbound and outbound mail filters"
-msgstr ""
-
-#: plinth/modules/email_server/forms.py:24
+#: plinth/modules/email/__init__.py:80
#, fuzzy
-#| msgid "Primary connection"
+#| msgid "Manage Aliases"
+msgid "My Email Aliases"
+msgstr "మారుపేర్లను నిర్వహించండి"
+
+#: plinth/modules/email/__init__.py:81
+#, fuzzy
+#| msgid "Manage Aliases"
+msgid "Manage Aliases for Mailbox"
+msgstr "మారుపేర్లను నిర్వహించండి"
+
+#: plinth/modules/email/forms.py:25
msgid "Primary domain"
msgstr "ప్రాథమిక అనుసంధానం"
-#: plinth/modules/email_server/forms.py:26
+#: plinth/modules/email/forms.py:27
msgid ""
"Mails are received for all domains configured in the system. Among these, "
"select the most important one."
-msgstr ""
+msgstr "సిస్టమ్లో కాన్ఫిగర్ చేయబడిన అన్ని డొమైన్లకు మెయిల్స్ అందుతాయి. వీటిలో ముఖ్యమైనది ఎంచుకోండి"
-#: plinth/modules/email_server/forms.py:34
+#: plinth/modules/email/forms.py:35
msgid "New alias (without @domain)"
-msgstr ""
+msgstr "కొత్త మారుపేరు (@డొమైన్ లేకుండా)"
-#: plinth/modules/email_server/forms.py:41
+#: plinth/modules/email/forms.py:42
msgid "Contains illegal characters"
-msgstr ""
+msgstr "చట్టవిరుద్ధమైన పాత్రలను కలిగి ఉంది"
-#: plinth/modules/email_server/forms.py:44
+#: plinth/modules/email/forms.py:45
msgid "Must start and end with a-z or 0-9"
-msgstr ""
+msgstr "తప్పనిసరిగా a-z లేదా 0-9తో ప్రారంభించి ముగించాలి"
-#: plinth/modules/email_server/forms.py:47
+#: plinth/modules/email/forms.py:49
msgid "Cannot be a number"
-msgstr ""
+msgstr "సంఖ్య కాకూడదు"
-#: plinth/modules/email_server/forms.py:57
-#, fuzzy
-#| msgid "Create User"
+#: plinth/modules/email/forms.py:59
msgid "Aliases"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "మారుపేర్లు"
-#: plinth/modules/email_server/forms.py:69
-#: plinth/modules/firewall/templates/firewall.html:54
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-msgid "Enabled"
-msgstr "క్రియాశీలం"
-
-#: plinth/modules/email_server/forms.py:72
-#: plinth/modules/firewall/templates/firewall.html:57
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-#: plinth/templates/cards.html:34
-msgid "Disabled"
-msgstr "నిలిపివేయబడింది"
-
-#: plinth/modules/email_server/manifest.py:8
-#: plinth/modules/roundcube/__init__.py:54
+#: plinth/modules/email/manifest.py:12 plinth/modules/roundcube/__init__.py:54
#: plinth/modules/roundcube/manifest.py:6
msgid "Roundcube"
msgstr "రౌండ్ క్యూబ్"
-#: plinth/modules/email_server/manifest.py:16
-#: plinth/modules/radicale/manifest.py:36
-#, fuzzy
-#| msgid "Mozilla Thunderbird"
+#: plinth/modules/email/manifest.py:20 plinth/modules/radicale/manifest.py:36
msgid "Thunderbird"
msgstr "మొజిల్లా థండర్ బర్డ్"
-#: plinth/modules/email_server/manifest.py:33
+#: plinth/modules/email/manifest.py:37
msgid "K-9 Mail"
-msgstr ""
+msgstr "K-9 మెయిల్"
-#: plinth/modules/email_server/manifest.py:48
+#: plinth/modules/email/manifest.py:52
msgid "FairEmail"
-msgstr ""
+msgstr "ఫెయిర్ఇమెయిల్"
-#: plinth/modules/email_server/templates/email_alias.html:13
-#: plinth/modules/email_server/templates/email_server.html:15
-#, fuzzy
-#| msgid "Create User"
+#: plinth/modules/email/templates/email-aliases.html:13
+#: plinth/modules/email/templates/email.html:15
msgid "Manage Aliases"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "మారుపేర్లను నిర్వహించండి"
-#: plinth/modules/email_server/templates/email_alias.html:16
+#: plinth/modules/email/templates/email-aliases.html:16
msgid "You have no email aliases."
-msgstr ""
+msgstr "మీకు ఇ-తపాలా మారుపేర్లు లేవు."
-#: plinth/modules/email_server/templates/email_alias.html:24
-#, fuzzy
-#| msgid "Disabled"
-msgid "Disable"
-msgstr "నిలిపివేయబడింది"
-
-#: plinth/modules/email_server/templates/email_alias.html:26
-#, fuzzy
-#| msgid "Enabled"
-msgid "Enable"
-msgstr "క్రియాశీలం"
-
-#: plinth/modules/email_server/templates/email_alias.html:32
-#, fuzzy
-#| msgid "Create a new backup"
+#: plinth/modules/email/templates/email-aliases.html:28
msgid "Create a new email alias"
-msgstr "క్రొత్త బ్యాకప్ను సృష్టించండి"
+msgstr "కొత్త ఇమెయిల్ అలియాస్ని సృష్టించండి"
-#: plinth/modules/email_server/templates/email_alias.html:38
+#: plinth/modules/email/templates/email-aliases.html:34
msgid "Add"
msgstr "జోడించు"
-#: plinth/modules/email_server/templates/email_server.html:10
-#, fuzzy
-#| msgid "Storage Snapshots"
+#: plinth/modules/email/templates/email.html:10
msgid "Manage Spam"
-msgstr "నిల్వ దృశ్యములు"
+msgstr "స్పామ్ని నిర్వహించండి"
+
+#: plinth/modules/email/templates/email.html:22
+msgid "DNS Records"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:25
+msgid ""
+"The following DNS records must be added manually on your primary domain for "
+"the mail server to work properly."
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:36
+msgid "TTL"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:37
+msgid "Class"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:39
+msgid "Priority"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:40
+msgid "Weight"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:41
+#: plinth/modules/minetest/templates/minetest.html:18
+#: plinth/modules/tor/templates/tor.html:72
+msgid "Port"
+msgstr "పోర్టు"
+
+#: plinth/modules/email/templates/email.html:42
+msgid "Host/Target/Value"
+msgstr ""
#: plinth/modules/firewall/__init__.py:26
#, python-brace-format
@@ -2126,21 +2076,19 @@ msgid "Firewall"
msgstr "ఫైర్వాల్"
#: plinth/modules/firewall/components.py:134
-#, fuzzy, python-brace-format
-#| msgid "Service discovery server is not running"
+#, python-brace-format
msgid "Port {name} ({details}) available for internal networks"
-msgstr "సేవ ఆవిష్కరణ సేవికను నడుపటంలేదు"
+msgstr "అంతర్గత నెట్వర్క్ల కోసం పోర్ట్ {name} ({details}) అందుబాటులో ఉంది"
#: plinth/modules/firewall/components.py:142
-#, fuzzy, python-brace-format
-#| msgid "Service discovery server is not running"
+#, python-brace-format
msgid "Port {name} ({details}) available for external networks"
-msgstr "సేవ ఆవిష్కరణ సేవికను నడుపటంలేదు"
+msgstr "అంతర్గత నెట్వర్క్ల కోసం పోర్ట్ {name} ({details}) అందుబాటులో ఉంది"
#: plinth/modules/firewall/components.py:147
#, python-brace-format
msgid "Port {name} ({details}) unavailable for external networks"
-msgstr ""
+msgstr "Port {name} ({details})బాహ్య నెట్వర్క్లకు అందుబాటులో లేదు"
#: plinth/modules/firewall/templates/firewall.html:21
#, python-format
@@ -2150,15 +2098,28 @@ msgid ""
"you may run it using the command 'service firewalld start' or in case of a "
"system with systemd 'systemctl start firewalld'."
msgstr ""
-"ఫైర్వాల్ డెమోన్ నడుస్తుందో లేదు. దీన్ని అమలు దయచేసి. ఫైర్వాల్ ఎనేబుల్ వస్తుంది %(box_name)s . ఏ "
-"డెబియన్ ఆధారిత కంప్యూటరులో (అటువంటి %(box_name)s) మీరు కమాండ్ 'సేవ ప్రారంభించడానికి firewalld "
-"లేదా systemd systemctl ఒక వ్యవస్థ యొక్క సందర్భంలో ఉపయోగించి దీన్ని అమలు ఉండవచ్చు firewalld "
-"మొదలు."
+"ఫైర్వాల్ డెమోన్ రన్ కావడం లేదు. దయచేసి దీన్ని అమలు చేయండి. %(box_name)sలో ఫైర్వాల్ డిఫాల్ట్గా "
+"ప్రారంభించబడింది. ఏదైనా డెబియన్ ఆధారిత సిస్టమ్లో (%(box_name)s వంటివి) మీరు 'సర్వీస్ ఫైర్వాల్డ్ స్టార్ట్' "
+"కమాండ్ని ఉపయోగించి లేదా systemd 'systemctl start firewalld' ఉన్న సిస్టమ్ విషయంలో దీన్ని అమలు "
+"చేయవచ్చు."
#: plinth/modules/firewall/templates/firewall.html:35
msgid "Service/Port"
msgstr "సేవ/పోర్ట్"
+#: plinth/modules/firewall/templates/firewall.html:54
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+msgid "Enabled"
+msgstr "క్రియాశీలం"
+
+#: plinth/modules/firewall/templates/firewall.html:57
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+#: plinth/templates/cards.html:34
+msgid "Disabled"
+msgstr "నిలిపివేయబడింది"
+
#: plinth/modules/firewall/templates/firewall.html:72
msgid "Permitted"
msgstr "అనుమతించబడిన"
@@ -2188,13 +2149,15 @@ msgstr ""
#: plinth/modules/networks/templates/networks_configuration.html:22
#: plinth/modules/storage/templates/storage.html:93
msgid "Advanced"
-msgstr ""
+msgstr "ఉన్నత స్థితి"
#: plinth/modules/firewall/templates/firewall.html:104
msgid ""
"Advanced firewall operations such as opening custom ports are provided by "
"the Cockpit app."
msgstr ""
+"అనుకూల పోర్ట్లను తెరవడం వంటి అధునాతన ఫైర్వాల్ కార్యకలాపాలు కాక్పిట్ యాప్ ద్వారా అందించబడతాయి."
#: plinth/modules/first_boot/forms.py:14
#, python-brace-format
@@ -2203,10 +2166,13 @@ msgid ""
"also be obtained by running the command \"sudo cat /var/lib/plinth/firstboot-"
"wizard-secret\" on your {box_name}"
msgstr ""
+"Freedom Box ఇన్స్టాలేషన్ సమయంలో రూపొందించబడిన రహస్యాన్ని నమోదు చేయండి. మీ {box_name}లో \" sudo "
+"cat / var /lib/plinth/firstboot-wizard-secret\" ఆదేశాన్ని అమలు చేయడం ద్వారా కూడా ఈ "
+"రహస్యాన్ని పొందవచ్చు."
#: plinth/modules/first_boot/forms.py:19
msgid "Firstboot Wizard Secret"
-msgstr ""
+msgstr "ఫస్ట్బూట్ విజార్డ్ సీక్రెట్"
#: plinth/modules/first_boot/templates/firstboot_complete.html:11
msgid "Setup Complete!"
@@ -2247,47 +2213,48 @@ msgid ""
"available graphical clients. And you can share your code with people around "
"the world."
msgstr ""
+"Git అనేది సాఫ్ట్వేర్ అభివృద్ధి సమయంలో సోర్స్ కోడ్లో మార్పులను ట్రాక్ చేయడానికి పంపిణీ చేయబడిన సంస్కరణ-"
+"నియంత్రణ వ్యవస్థ. Gitweb Git రిపోజిటరీలకు వెబ్ ఇంటర్ఫేస్ను అందిస్తుంది. మీరు సోర్స్ కోడ్ యొక్క చరిత్ర "
+"మరియు కంటెంట్ను బ్రౌజ్ చేయవచ్చు, సంబంధిత కమిట్లు మరియు కోడ్లను కనుగొనడానికి శోధనను ఉపయోగించవచ్చు. "
+"మీరు రిపోజిటరీలను క్లోన్ చేయవచ్చు మరియు కమాండ్-లైన్ Git క్లయింట్తో లేదా అందుబాటులో ఉన్న బహుళ గ్రాఫికల్ "
+"క్లయింట్లతో కోడ్ మార్పులను అప్లోడ్ చేయవచ్చు. మరియు మీరు మీ కోడ్ని ప్రపంచవ్యాప్తంగా ఉన్న వ్యక్తులతో "
+"పంచుకోవచ్చు."
#: plinth/modules/gitweb/__init__.py:33
-#, fuzzy
msgid ""
"To learn more on how to use Git visit Git tutorial."
msgstr ""
-"Git ని ఎలా ఉపయోగించాలో మరింత తెలుసుకోవడానికి Git tutorial ని సందర్శించండి."
+"Gitని ఎలా ఉపయోగించాలో మరింత తెలుసుకోవడానికి Git ట్యుటోరియల్ని సందర్శించండి."
#: plinth/modules/gitweb/__init__.py:51
msgid "Read-write access to Git repositories"
-msgstr ""
+msgstr "Git రిపోజిటరీలకు చదవడానికి-వ్రాయడానికి యాక్సెస్"
#: plinth/modules/gitweb/__init__.py:56 plinth/modules/gitweb/manifest.py:10
msgid "Gitweb"
-msgstr ""
+msgstr "గిట్వెబ్"
#: plinth/modules/gitweb/__init__.py:57
msgid "Simple Git Hosting"
-msgstr ""
+msgstr "సాధారణ Git హోస్టింగ్"
#: plinth/modules/gitweb/forms.py:59
-#, fuzzy
-#| msgid "Invalid hostname"
msgid "Invalid repository URL."
-msgstr "ఆతిథ్యనామం చెల్లనిది"
+msgstr "చెల్లని రిపోజిటరీ URL."
#: plinth/modules/gitweb/forms.py:69
-#, fuzzy
-#| msgid "Invalid hostname"
msgid "Invalid repository name."
-msgstr "ఆతిథ్యనామం చెల్లనిది"
+msgstr "చెల్లని రిపోజిటరీ పేరు."
#: plinth/modules/gitweb/forms.py:77
msgid "Name of a new repository or URL to import an existing repository."
-msgstr ""
+msgstr "ఇప్పటికే ఉన్న రిపోజిటరీని దిగుమతి చేయడానికి కొత్త రిపోజిటరీ పేరు లేదా URL."
#: plinth/modules/gitweb/forms.py:83
msgid "Description of the repository"
-msgstr ""
+msgstr "రిపోజిటరీ వివరణ"
#: plinth/modules/gitweb/forms.py:84 plinth/modules/gitweb/forms.py:88
msgid "Optional, for displaying on Gitweb."
@@ -2298,114 +2265,90 @@ msgid "Repository's owner name"
msgstr "రిపోజిటరీ యొక్క యజమాని పేరు"
#: plinth/modules/gitweb/forms.py:91
-#, fuzzy
-#| msgid "Create User"
msgid "Private repository"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "స్వంత రిపోజిటరీ"
#: plinth/modules/gitweb/forms.py:92
msgid "Allow only authorized users to access this repository."
msgstr "ఈ రిపోజిటరీని యాక్సెస్ చేయడానికి అధికారం ఉన్న వినియోగదారులను మాత్రమే అనుమతించండి."
#: plinth/modules/gitweb/forms.py:113 plinth/modules/gitweb/forms.py:155
-#, fuzzy
msgid "A repository with this name already exists."
-msgstr "ఈ సేవ ఇప్పటికే ఉంది"
+msgstr "ఈ పేరుతో ఒక రిపోజిటరీ ఇప్పటికే ఉంది."
#: plinth/modules/gitweb/forms.py:126
-#, fuzzy
-#| msgid "Name of the share"
msgid "Name of the repository"
-msgstr "షేర్ యొక్క పేరు"
+msgstr "రిపోజిటరీ పేరు"
#: plinth/modules/gitweb/forms.py:130
-#, fuzzy
-#| msgid ""
-#| "A lowercase alpha-numeric string that uniquely identifies a share. "
-#| "Example: media."
msgid "An alpha-numeric string that uniquely identifies a repository."
-msgstr "ప్రత్యేకంగా ఒక వాటాను గుర్తించే చిన్న అక్షర సంఖ్యా స్ట్రింగ్. ఉదాహరణ: media."
+msgstr ""
+"భాగస్వామ్యాన్ని ప్రత్యేకంగా గుర్తించే లోయర్కేసన్ ఆల్ఫా-న్యూమరిక్ స్ట్రింగ్. ఉదాహరణ: <em>మీడియా</"
+"em>రిపోజిటరీ."
#: plinth/modules/gitweb/forms.py:134
-#, fuzzy
-#| msgid "Default Skin"
msgid "Default branch"
msgstr "డిఫాల్ట్ చర్మం"
#: plinth/modules/gitweb/forms.py:135
msgid "Gitweb displays this as a default branch."
-msgstr ""
+msgstr "Gitweb దీన్ని డిఫాల్ట్ బ్రాంచ్గా ప్రదర్శిస్తుంది."
#: plinth/modules/gitweb/manifest.py:18
msgid "Git"
msgstr "గిట్"
#: plinth/modules/gitweb/templates/gitweb_configure.html:13
-#, fuzzy
-#| msgid "Create User"
msgid "Manage Repositories"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "రిపోజిటరీలను నిర్వహించండి"
#: plinth/modules/gitweb/templates/gitweb_configure.html:17
#: plinth/modules/gitweb/templates/gitweb_configure.html:19
-#, fuzzy
-#| msgid "Create User"
msgid "Create repository"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "యూజర్ రిపోజిటరీని సృష్టించండి"
#: plinth/modules/gitweb/templates/gitweb_configure.html:26
-#, fuzzy
-#| msgid "Tor relay port available"
msgid "No repositories available."
-msgstr "టార్ రిలే పోర్ట్ అందుబాటులో ఉంది"
+msgstr "రిపోజిటరీలు ఏవీ అందుబాటులో లేవు."
#: plinth/modules/gitweb/templates/gitweb_configure.html:35
-#, fuzzy, python-format
-#| msgid "Go to site %(site)s"
+#, python-format
msgid "Go to repository %(repo.name)s"
-msgstr "ప్రదేశం కు వెళ్ళండి %(site)s"
+msgstr "రిపోజిటరీ %(repo.name)sకి వెళ్లండి"
#: plinth/modules/gitweb/templates/gitweb_configure.html:42
msgid "Cloning…"
-msgstr ""
+msgstr "క్లోనింగ్…"
#: plinth/modules/gitweb/templates/gitweb_configure.html:59
-#, fuzzy, python-format
-#| msgid "Delete user %(username)s"
+#, python-format
msgid "Delete repository %(repo.name)s"
-msgstr "వినియోగదారి %(username)s ను తొలగించు"
+msgstr "రిపోజిటరీ %(repo.name)sని తొలగించండి"
#: plinth/modules/gitweb/templates/gitweb_delete.html:12
-#, fuzzy, python-format
-#| msgid "Delete Wiki or Blog %(name)s"
+#, python-format
msgid "Delete Git Repository %(name)s"
-msgstr "వికీ లేదా బ్లాగ్ తొలగించు %(name)s"
+msgstr "Git రిపోజిటరీ %(name)sని తొలగించండి"
#: plinth/modules/gitweb/templates/gitweb_delete.html:18
-#, fuzzy
-#| msgid "Delete connection %(name)s permanently?"
msgid "Delete this repository permanently?"
-msgstr "%(name)s అనుసంధానం శాశ్వతంగా తొలగించు ?"
+msgstr "ఈ రిపోజిటరీని శాశ్వతంగా తొలగించాలా?"
#: plinth/modules/gitweb/views.py:45
msgid "Repository created."
msgstr "రిపోజిటరీ సృష్టించబడింది."
#: plinth/modules/gitweb/views.py:69
-#, fuzzy
-#| msgid "An error occurred during configuration."
msgid "An error occurred while creating the repository."
-msgstr "అక్రుతీకరణలో ఒక పొరపాటు జరిగింది."
+msgstr "రిపోజిటరీని సృష్టిస్తున్నప్పుడు లోపం సంభవించింది."
#: plinth/modules/gitweb/views.py:84
msgid "Repository edited."
msgstr "రిపోజిటరీ సవరించబడింది."
#: plinth/modules/gitweb/views.py:89
-#, fuzzy
-#| msgid "Create User"
msgid "Edit repository"
-msgstr "వినియోగదారుని సృష్టించు"
+msgstr "రిపోజిటరీని సవరించండి"
#: plinth/modules/help/__init__.py:35
msgid "Documentation"
@@ -2413,11 +2356,9 @@ msgstr "పత్రావళి"
#: plinth/modules/help/__init__.py:39 plinth/templates/help-menu.html:20
#: plinth/templates/help-menu.html:21 plinth/templates/index.html:128
-#, fuzzy
-#| msgid "Manual"
msgctxt "User guide"
msgid "Manual"
-msgstr "కరదీపిక"
+msgstr "నిర్దేశిక"
#: plinth/modules/help/__init__.py:43
#: plinth/modules/help/templates/help_support.html:9
@@ -2453,12 +2394,11 @@ msgstr ""
"మీరు %(os_release)s మరియు %(box_name)s రూపాంతరం %(version)s ను నడుపుతున్నారు."
#: plinth/modules/help/templates/help_about.html:23
-#, fuzzy, python-format
-#| msgid "There is a new %(box_name)s version available."
+#, python-format
msgid ""
"There is a new %(box_name)s version available"
"a>."
-msgstr "%(box_name)s యొక్క కొత్త వెర్షన్ అందుబాటులో ఉంది."
+msgstr "కొత్త %(box_name)s వెర్షన్ అందుబాటులో ఉంది."
#: plinth/modules/help/templates/help_about.html:28
#: plinth/modules/upgrades/templates/upgrades_configure.html:37
@@ -2467,7 +2407,7 @@ msgid "%(box_name)s is up to date."
msgstr "%(box_name)s తాజాగా ఉంది."
#: plinth/modules/help/templates/help_about.html:35
-#, fuzzy, python-format
+#, python-format
msgid ""
"%(box_name)s is a community project to develop, design and promote personal "
"servers running free software for private, personal communications. It is a "
@@ -2477,8 +2417,11 @@ msgid ""
"and a Tor relay, on a device that can replace your Wi-Fi router, so that "
"your data stays with you."
msgstr ""
-"%(box_name)s వ్యక్తిగత మరియు స్వీయ సమాచార కార్యకలాపాలను నడుపుటకు రూపకల్పన చేయుటకు మరియు "
-"అభివృద్ది"
+"%(box_name)s అనేది ప్రైవేట్, వ్యక్తిగత కమ్యూనికేషన్ల కోసం ఉచిత సాఫ్ట్వేర్ని నడుపుతున్న వ్యక్తిగత "
+"సర్వర్లను అభివృద్ధి చేయడానికి, రూపొందించడానికి మరియు ప్రోత్సహించడానికి ఒక సంఘం ప్రాజెక్ట్. ఇది రక్షిత గోప్యత "
+"మరియు డేటా భద్రత పరిస్థితులలో మిగిలిన ఇంటర్నెట్తో ఇంటర్ఫేసింగ్ను అనుమతించడానికి రూపొందించబడిన నెట్వర్కింగ్ "
+"ఉపకరణం. ఇది మీ Wi-Fi రూటర్ని భర్తీ చేయగల పరికరంలో బ్లాగ్, వికీ, వెబ్సైట్, సోషల్ నెట్వర్క్, ఇమెయిల్, వెబ్ "
+"ప్రాక్సీ మరియు టోర్ రిలే వంటి అప్లికేషన్లను హోస్ట్ చేస్తుంది, తద్వారా మీ డేటా మీ వద్ద ఉంటుంది."
#: plinth/modules/help/templates/help_about.html:48
msgid ""
@@ -2516,10 +2459,8 @@ msgstr ""
"org/FreedomBox\"> %(box_name)s వికీ ను దర్శించండి."
#: plinth/modules/help/templates/help_about.html:78
-#, fuzzy
-#| msgid "Learn more..."
msgid "Learn more"
-msgstr "మరింత తెలుసుకోండి.."
+msgstr "మరింత తెలుసుకోండి"
#: plinth/modules/help/templates/help_base.html:21
#: plinth/modules/help/templates/help_index.html:61
@@ -2590,6 +2531,10 @@ msgid ""
"tracker to let our developers know. To report, first check if the issue "
"is already reported and then use the \"New issue\" button."
msgstr ""
+"మీరు ఏవైనా బగ్లు లేదా సమస్యలను కనుగొంటే, దయచేసి మా డెవలపర్లను అనుమతించడానికి ఇష్యూ "
+"ట్రాకర్ని ఉపయోగించండి తెలుసు. నివేదించడానికి, సమస్య ఇప్పటికే నివేదించబడిందో లేదో తనిఖీ చేసి, ఆపై \"కొత్త "
+"సమస్య\" బటన్ను ఉపయోగించండి."
#: plinth/modules/help/templates/help_feedback.html:36
msgid "Thank you!"
@@ -2644,10 +2589,8 @@ msgstr ""
"కోరవచ్చు."
#: plinth/modules/help/templates/help_manual.html:18
-#, fuzzy
-#| msgid "downloading"
msgid "Download as PDF"
-msgstr "దిగుమతి అవుతోంది"
+msgstr "PDFగా డౌన్లోడ్ చేయండి"
#: plinth/modules/help/templates/help_support.html:12
#, python-format
@@ -2656,12 +2599,16 @@ msgid ""
"using %(box_name)s, you can ask for help from our community of users and "
"contributors."
msgstr ""
+"ఒక వేళా మీకు ఏదైనా పూర్తి చేయడానికి సహాయం అవసరమయితే లేదా దీన్ని %(box_name)s , ఉపయోగయించడం వలన ,"
+"మీకు సమస్య వస్తే మా వినియోగదారులు మరియు సహకారుల సంఘం నుంచి సహాయం కోరగలరు ."
#: plinth/modules/help/templates/help_support.html:20
msgid ""
"Search for past discussions or post a new query on our discussion forum."
msgstr ""
+"గత చర్చల కోసం శోధించండి లేదా కొత్త ప్రశ్నను దీనిలో discussion forumపోస్ట్ చేయండి ."
#: plinth/modules/help/templates/help_support.html:27
msgid ""
@@ -2670,22 +2617,26 @@ msgid ""
"Or send an email to our mailing list."
msgstr ""
+"మీరు మా యొక్క IRC మరియు Matrix ఛానల్ లో చాట్ చేయవచ్చు (bridged):
\n"
+"లేదా మాకు ఇమెయిల్ పంపండి mailing list."
#: plinth/modules/help/templates/statuslog.html:10
msgid "Status Log"
msgstr "స్థితి లాగ్"
#: plinth/modules/help/templates/statuslog.html:13
-#, fuzzy, python-format
+#, python-format
msgid ""
"These are the last %(num_lines)s lines of the status log for this web "
"interface. If you want to report a bug, please use the bug tracker and "
"attach this status log to the bug report."
msgstr ""
-"ఈ చివరి% (num_lines) లు ఈ వెబ్ ఇంటర్ఫేస్ స్థితి లాగ్ 1 రేఖలు. మీరు ఒక బగ్ను నివేదించి అనుకుంటే, "
-"దయచేసి 2bug ట్రాకర్ "
-"తప్పుల నివేదిక ఈ స్థితి లాగ్ అటాచ్ 3 మరియు ఉపయోగించడానికి."
+"ఇవి ఈ వెబ్ ఇంటర్ఫేస్ కోసం స్టేటస్ లాగ్ యొక్క చివరి %(num_lines)s లైన్లు. మీరు బగ్ను "
+"నివేదించాలనుకుంటే, దయచేసి బగ్ ట్రాకర్ని ఉపయోగించండి మరియు బగ్ నివేదికకు ఈ స్థితి లాగ్ను జోడించండి ."
#: plinth/modules/help/templates/statuslog.html:24
msgid ""
@@ -2716,47 +2667,43 @@ msgid ""
"anonymity by sending encrypted traffic through a volunteer-run network "
"distributed around the world."
msgstr ""
+"ఇన్విజిబుల్ ఇంటర్నెట్ ప్రాజెక్ట్ అనేది సెన్సార్షిప్ మరియు నిఘా నుండి కమ్యూనికేషన్ను రక్షించడానికి ఉద్దేశించిన "
+"అనామక నెట్వర్క్ లేయర్. I2P ప్రపంచవ్యాప్తంగా పంపిణీ చేయబడిన వాలంటీర్-రన్ నెట్వర్క్ ద్వారా ఎన్క్రిప్టెడ్ ట్రాఫిక్ను "
+"పంపడం ద్వారా అనామకతను అందిస్తుంది."
#: plinth/modules/i2p/__init__.py:26
-#, fuzzy
-#| msgid ""
-#| "For more information about the %(box_name)s project, see the %(box_name)s Wiki."
msgid ""
"Find more information about I2P on their project homepage."
msgstr ""
-"%(box_name)s ప్రాజెక్ట్ కి సంబందించిన మరింత సమాచారం కోసం %(box_name)s వికీ ను దర్శించండి."
+"వారి పథకం హోమ్పేజీలో I2P గురించి "
+"మరింత సమాచారాన్ని కనుగొనండి."
#: plinth/modules/i2p/__init__.py:28
msgid ""
"The first visit to the provided web interface will initiate the "
"configuration process."
-msgstr ""
+msgstr "అందించిన వెబ్ ఇంటర్ఫేస్కు మొదటి సందర్శన కాన్ఫిగరేషన్ ప్రక్రియను ప్రారంభిస్తుంది."
#: plinth/modules/i2p/__init__.py:52
-#, fuzzy
-#| msgid "Enable application"
msgid "Manage I2P application"
-msgstr "అనువర్తనాన్ని చేతనించు"
+msgstr "I2P కార్యక్షేతాన్ని నిర్వహించండి"
#: plinth/modules/i2p/__init__.py:55 plinth/modules/i2p/manifest.py:13
msgid "I2P"
-msgstr ""
+msgstr "ఇ౨ప్"
#: plinth/modules/i2p/__init__.py:56 plinth/modules/tor/__init__.py:51
msgid "Anonymity Network"
msgstr "అజ్ఞాత జాలిక"
#: plinth/modules/i2p/__init__.py:82
-#, fuzzy
msgid "I2P Proxy"
-msgstr "వెబ్ ప్రాక్సీ (Privoxy)"
+msgstr "I2P ప్రాతినిధ్య"
#: plinth/modules/i2p/templates/i2p.html:12
msgid "I2P Proxies and Tunnels"
-msgstr ""
+msgstr "I2P ప్రాతినిధ్య మరియు టన్నెల్స్"
#: plinth/modules/i2p/templates/i2p.html:21
#: plinth/modules/i2p/templates/i2p.html:34 plinth/templates/clients.html:28
@@ -2765,7 +2712,7 @@ msgstr "ప్రారంభించు"
#: plinth/modules/i2p/templates/i2p.html:25
msgid "Anonymous Torrents"
-msgstr ""
+msgstr "అనామక టోరెంట్స్"
#: plinth/modules/i2p/views.py:16
msgid ""
@@ -2773,12 +2720,16 @@ msgid ""
"For this, your browser, preferably the Tor Browser, needs to be configured "
"with a proxy."
msgstr ""
+"I2P మీరు ఇంటర్నెట్ మరియు దాచిన సేవలను (ఈప్సైట్లు) అనామకంగా అన్వేశించడానికి అనుమతిస్తుంది. దీని కోసం, "
+"మీ అన్వేషి, ప్రాధాన్యంగా టోర్ అన్వేషి,ప్రాతినిధ్య కాన్ఫిగర్ చేయబడాలి."
#: plinth/modules/i2p/views.py:19
msgid ""
"By default HTTP, HTTPS and IRC proxies are available. Additional proxies and "
"tunnels may be configured using the tunnel configuration interface."
msgstr ""
+"అప్రమేయంగా HTTP, HTTPS మరియు IRC “ప్రాతినిధ్య అందుబాటులో ఉన్నాయి. టన్నెల్ కాన్ఫిగరేషన్ సంవిధానంని "
+"ఉపయోగించి అదనపు ప్రాతినిధ్య మరియు టన్నెల్లు కాన్ఫిగర్ చేయబడవచ్చు."
#: plinth/modules/i2p/views.py:24
msgid ""
@@ -2786,41 +2737,31 @@ msgid ""
"network. Download files by adding torrents or create a new torrent to share "
"a file."
msgstr ""
+"పీర్-టు-పీర్ నెట్వర్క్లో అనామకంగా ఫైల్లను డౌన్లోడ్ చేయడానికి I2P కార్యక్షేత్రం అందిస్తుంది. టొరెంట్లను "
+"జోడించడం ద్వారా దస్త్రంలను సమాచార దిగుమతి చేయండి లేదా దస్త్రంలను భాగస్వామ్యం చేయడానికి కొత్త టొరెంట్ని "
+"సృష్టించండి."
#: plinth/modules/ikiwiki/__init__.py:22
-#, fuzzy
-#| msgid ""
-#| "ikiwiki is a simple wiki and blog application. It supports several "
-#| "lightweight markup languages, including Markdown, and common blogging "
-#| "functionality such as comments and RSS feeds. When enabled, the blogs and "
-#| "wikis will be available at /ikiwiki (once "
-#| "created)."
msgid ""
"ikiwiki is a simple wiki and blog application. It supports several "
"lightweight markup languages, including Markdown, and common blogging "
"functionality such as comments and RSS feeds."
msgstr ""
-"ఇకివికీ ఒక సాధారణ వికీ మరియు బ్లాగ్ అప్లికేషన్. ఇది అనేక తేలికైన మార్కప్ బాషలకు మరియు వ్యాఖ్యానాలు, ఆర్.ఎస్."
-"ఎస్ ఫీడ్లు వంటి సాధారణ బ్లాగింగ్ కార్యాచరణకు సహకరిస్తుంది. దీన్ని ఆమోదించినప్పుడు మీ బ్లాగులు మరియు "
-"వికీలు /ikiwiki వద్ద అందుబాటులో ఉంటాయి(తయారుచేసిన తరువాత)."
+"ikiwiki అనేది ఒక సాధారణ వికీ మరియు బ్లాగ్ అప్లికేషన్. ఇది మార్క్డౌన్తో సహా పలు తేలికపాటి మార్కప్ భాషలకు "
+"మరియు వ్యాఖ్యలు మరియు RSS ఫీడ్ల వంటి సాధారణ బ్లాగింగ్ కార్యాచరణకు మద్దతు ఇస్తుంది."
#: plinth/modules/ikiwiki/__init__.py:26
-#, fuzzy, python-brace-format
-#| msgid ""
-#| "Only {box_name} users in the admin group can create and "
-#| "manage blogs and wikis, but any user in the wiki group can "
-#| "edit existing ones. In the User "
-#| "Configuration you can change these permissions or add new users."
+#, python-brace-format
msgid ""
"Only {box_name} users in the admin group can create and "
"manage blogs and wikis, but any user in the wiki group can "
"edit existing ones. In the User "
"Configuration you can change these permissions or add new users."
msgstr ""
-"admin సమూహంలో కేవలం {box_name} వినియోగదారులు బ్లాగులను మరియు వికీలను "
-"సృష్టించవచ్చు మరియు నిర్వహించవచ్చు , కానీ wiki సమూహంలోని ఏ యూజర్ అయినా "
-"ఇప్పటికే ఉన్న వాటిని సవరించగలరు. వినియోగదారు "
-"ఆకృతీకరణ లో మీరు అనుమతులను మార్చవచ్చు లేదా క్రొత్త వినియోగదారులను చేర్చవచ్చు."
+"అడ్మిన్ సమూహంలోని {box_name} వినియోగదారులు మాత్రమే బ్లాగులు మరియు వికీలను "
+"సృష్టించగలరు మరియు నిర్వహించగలరు కానీ wikiలోని ఏ వినియోగదారు అయినా > "
+"సమూహం ఇప్పటికే ఉన్న వాటిని సవరించవచ్చు. వినియోగదారు "
+"కాన్ఫిగరేషన్లో మీరు ఈ అనుమతులను మార్చవచ్చు లేదా కొత్త వినియోగదారులను జోడించవచ్చు."
#: plinth/modules/ikiwiki/__init__.py:49 plinth/modules/ikiwiki/manifest.py:6
msgid "ikiwiki"
@@ -2907,10 +2848,9 @@ msgid "Could not create blog: {error}"
msgstr "బ్లాగు సృష్టించలేము: {error}"
#: plinth/modules/ikiwiki/views.py:101
-#, fuzzy, python-brace-format
-#| msgid "{name} deleted."
+#, python-brace-format
msgid "{title} deleted."
-msgstr "{name} తొలగించబడింది."
+msgstr "{title} తొలగించబడింది."
#: plinth/modules/ikiwiki/views.py:105
#, python-brace-format
@@ -2978,7 +2918,7 @@ msgid "JavaScript license information"
msgstr "జావాస్క్రిప్ట్ లైసెన్స్ సమాచరం"
#: plinth/modules/letsencrypt/__init__.py:28
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"A digital certificate allows users of a web service to verify the identity "
"of the service and to securely communicate with it. {box_name} can "
@@ -2986,23 +2926,22 @@ msgid ""
"domain. It does so by proving itself to be the owner of a domain to Let's "
"Encrypt, a certificate authority (CA)."
msgstr ""
-"ఒక డిజిటల్ సర్టిఫికెట్ వెబ్ సేవ వినియోగదారులు సేవ యొక్క గుర్తింపును ధ్రువీకరించడం మరియు సురక్షితంగా అది "
-"సంభాషించడానికి అనుమతిస్తుంది. {Box_name} 1 స్వయంచాలకంగా పొందటానికి మరియు ప్రతి అందుబాటులో డొమైన్ "
-"కొరకు సెటప్ డిజిటల్ సర్టిఫికెట్లు చేయవచ్చు. ఇది ఎన్క్రిప్ట్ తెలపండి ఒక డొమైన్ యొక్క యజమాని, ధృవపత్ర (CA) "
-"ఉన్నట్లు రుజువు చేసుకుంటూ అవుతున్నారు."
+"డిజిటల్ సర్టిఫికేట్ వెబ్ సేవ యొక్క వినియోగదారులను సేవ యొక్క గుర్తింపును ధృవీకరించడానికి మరియు దానితో "
+"సురక్షితంగా సంభాషణ చేయడానికి అనుమతిస్తుంది. అందుబాటులో ఉన్న ప్రతి అధికారక్షేత్రం కోసం {box_name} "
+"స్వయం చాలక డిజిటల్ సర్టిఫికెట్లను పొందవచ్చు మరియు అమర్చిపెట్టు చేయగలదు. ఇది సర్టిఫికేట్ అథారిటీ (CA) "
+"లెట్స్ ఎన్క్రిప్ట్కు అధికారక్షేత్రం యజమాని అని నిరూపించుకోవడం ద్వారా అలా చేస్తుంది."
#: plinth/modules/letsencrypt/__init__.py:34
-#, fuzzy
msgid ""
"Let's Encrypt is a free, automated, and open certificate authority, run for "
"the public's benefit by the Internet Security Research Group (ISRG). Please "
"read and agree with the Let's Encrypt Subscriber Agreement before using this service."
msgstr ""
-"లెట్స్ ఎన్క్రిప్ట్ ఇంటర్నెట్ సెక్యూరిటీ రీసెర్చ్ గ్రూప్ (ISRG) ద్వారా ప్రజల ప్రయోజనం కోసం అమలు ఉచిత, "
-"స్వయంచాలక, మరియు బహిరంగ సర్టిఫికెట్ అధికారం, ఉంది. చదవండి మరియు ఈ సేవ ఉపయోగించి ముందు 1Let యొక్క ఎన్క్రిప్ట్ సబ్స్క్రయిబర్ ఒప్పందం "
-"a> 2 తో అంగీకరిస్తున్నారు."
+"లెట్స్ ఎన్క్రిప్ట్ అనేది ఇంటర్నెట్ సెక్యూరిటీ రీసెర్చ్ గ్రూప్ (ISRG) ద్వారా ప్రజల ప్రయోజనం కోసం నిర్వహించబడే "
+"ఉచిత, స్వయంచాలక మరియు ఓపెన్ సర్టిఫికెట్ అథారిటీ. దయచేసి ఈ సేవను ఉపయోగించే ముందు సభ్యుల ఒప్పందాన్ని ఎన్క్రిప్ట్ చేద్దాంని చదివి, "
+"అంగీకరించండి."
#: plinth/modules/letsencrypt/__init__.py:61
msgid "Let's Encrypt"
@@ -3014,7 +2953,7 @@ msgstr "యోగ్యతాపత్రాలు"
#: plinth/modules/letsencrypt/__init__.py:98
msgid "Cannot test: No domains are configured."
-msgstr ""
+msgstr "పరీక్షించడం సాధ్యం కాదు: డొమైన్లు ఏవీ కాన్ఫిగర్ చేయబడలేదు."
#: plinth/modules/letsencrypt/templates/letsencrypt.html:25
msgid "Certificate Status"
@@ -3073,15 +3012,18 @@ msgstr "పొందు"
msgid ""
"No domains have been configured. Configure "
"domains to be able to obtain certificates for them."
-msgstr "తోబుట్టువుల డొమైన్లు కన్ఫిగర్ చేయబడ్డాయి. వారికి సర్టిఫికేట్లు పొందగలగటం డొమైన్ ఆకృతీకరించుము."
+msgstr ""
+"తోబుట్టువుల అధికారక్షేత్రం కన్ఫిగర్ చేయబడ్డాయి. వారికి సర్టిఫికేట్లు పొందగలగటం అధికారక్షేత్రం "
+"ఆకృతీకరించుము. %(config_url)s"
#: plinth/modules/letsencrypt/views.py:41
-#, fuzzy, python-brace-format
-#| msgid "Certificate successfully revoked for domain {domain}"
+#, python-brace-format
msgid ""
"Certificate successfully revoked for domain {domain}.This may take a few "
"moments to take effect."
-msgstr "{domain} డోమైన్ కొరకు సర్టిఫికేట్ ఉప్సంహరుంచుకొనబడింది"
+msgstr ""
+"డొమైన్ {domain} కోసం సర్టిఫికేట్ విజయవంతంగా ఉపసంహరించబడింది. ఇది అమలులోకి రావడానికి కొన్ని క్షణాలు "
+"పట్టవచ్చు."
#: plinth/modules/letsencrypt/views.py:47
#, python-brace-format
@@ -3119,6 +3061,11 @@ msgid ""
"not require phone numbers to work. Users on a given Matrix server can "
"converse with users on all other Matrix servers via federation."
msgstr ""
+"ఇది Matrix ఓపెన్, ఫెడరేటెడ్ "
+"ఇన్స్టంట్ మెసేజింగ్ మరియు VoIP కోసం కొత్త పర్యావరణ వ్యవస్థ.Synapse అనేది మ్యాట్రిక్స్ ప్రోటోకాల్ను అమలు "
+"చేసే సర్వర్. ఇది చాట్ సమూహాలు, ఆడియో/వీడియో కాల్లు, ఎండ్-టు-ఎండ్ ఎన్క్రిప్షన్, బహుళ పరికర సమకాలీకరణను "
+"అందిస్తుంది మరియు పని చేయడానికి ఫోన్ నంబర్లు అవసరం లేదు. ఇచ్చిన మ్యాట్రిక్స్ సర్వర్లోని వినియోగదారులు "
+"ఫెడరేషన్ ద్వారా అన్ని ఇతర మ్యాట్రిక్స్ సర్వర్లలోని వినియోగదారులతో సంభాషించవచ్చు."
#: plinth/modules/matrixsynapse/__init__.py:37
#, python-brace-format
@@ -3126,6 +3073,8 @@ msgid ""
"Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the "
"Coturn app or configure an external server."
msgstr ""
+"Matrix Synapseకి ఆడియో/వీడియో కాల్ల కోసం STUN/TURN సర్వర్ అవసరం.Coturn యాప్ను ఇన్స్టాల్ చేయండి లేదా బాహ్య సర్వర్ను కాన్ఫిగర్ చేయండి."
#: plinth/modules/matrixsynapse/__init__.py:70
msgid "Matrix Synapse"
@@ -3151,14 +3100,16 @@ msgid ""
"server for Matrix Synapse. Disable this if you want to use a different STUN/"
"TURN server."
msgstr ""
+"Matrix Synapse కోసం స్థానిక coturn యాప్ని STUN/TURN "
+"సర్వర్గా కాన్ఫిగర్ చేస్తుంది. మీరు వేరే STUN/TURN సర్వర్ని ఉపయోగించాలనుకుంటే దీన్ని నిలిపివేయండి."
#: plinth/modules/matrixsynapse/manifest.py:14
msgid "Element"
-msgstr ""
+msgstr "మూలకం"
#: plinth/modules/matrixsynapse/manifest.py:48
msgid "FluffyChat"
-msgstr ""
+msgstr "FluffyChat"
#: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:15
#: plinth/modules/snapshot/templates/snapshot.html:12
@@ -3221,6 +3172,9 @@ msgid ""
"with other Matrix Synapse instances requires a valid TLS certificate. Please "
"go to Let's Encrypt to obtain one."
msgstr ""
+"కాన్ఫిగర్ చేయబడిన డొమైన్ పేరు స్వీయ సంతకం చేసిన ప్రమాణపత్రాన్ని ఉపయోగిస్తోంది. ఇతర మ్యాట్రిక్స్ సినాప్స్ ఉదంతాలతో "
+"కూడిన ఫెడరేషన్కు చెల్లుబాటు అయ్యే TLS ప్రమాణపత్రం అవసరం. దయచేసి ఒకదాన్ని పొందడానికి లెట్స్ ఎన్క్రిప్ట్కి వెళ్లండి."
#: plinth/modules/mediawiki/__init__.py:23
msgid ""
@@ -3241,6 +3195,10 @@ msgid ""
"from MediaWiki itself by going to the Special:CreateAccount page."
msgstr ""
+"ఈ MediaWiki ఉదాహరణ యాదృచ్ఛికంగా రూపొందించబడిన నిర్వాహక పాస్వర్డ్తో వస్తుంది. మీరు \"కాన్ఫిగరేషన్\" "
+"విభాగంలో కొత్త పాస్వర్డ్ను సెట్ చేయవచ్చు మరియు \"అడ్మిన్\" ఖాతాను ఉపయోగించి లాగిన్ చేయవచ్చు. అప్పుడు మీరు "
+"Special:"
+"CreateAccount పేజీకి వెళ్లడం ద్వారా MediaWiki నుండే మరిన్ని వినియోగదారు ఖాతాలను సృష్టించవచ్చు."
#: plinth/modules/mediawiki/__init__.py:33
msgid ""
@@ -3271,16 +3229,16 @@ msgstr ""
"ఉంచాలనుకుంటే ఈ ఫీల్డ్ ను ఖాళీగా వదిలేయండి."
#: plinth/modules/mediawiki/forms.py:58
-#, fuzzy
-#| msgid "Service"
msgid "Server URL"
-msgstr "సేవ"
+msgstr "సేవిక URL"
#: plinth/modules/mediawiki/forms.py:59
msgid ""
"Used by MediaWiki to generate URLs that point to the wiki such as in footer, "
"feeds and emails."
msgstr ""
+"ఫుటర్, ఫీడ్లు మరియు ఇమెయిల్లు వంటి వికీని సూచించే URLలను రూపొందించడానికి MediaWiki ద్వారా "
+"ఉపయోగించబడుతుంది."
#: plinth/modules/mediawiki/forms.py:64
msgid "Enable public registrations"
@@ -3297,16 +3255,12 @@ msgid "Enable private mode"
msgstr "ప్రైవేట్ మోడ్ను ప్రారంభించండి"
#: plinth/modules/mediawiki/forms.py:70
-#, fuzzy
-#| msgid ""
-#| "If enabled, Access will be restricted. Only people who have accounts can "
-#| "read/write to the wiki. Public registrations will also be disabled."
msgid ""
"If enabled, access will be restricted. Only people who have accounts can "
"read/write to the wiki. Public registrations will also be disabled."
msgstr ""
-"ఇది సశక్త పరిచినట్లయితే, ప్రవేశము నియంత్రించబడుతుంది. ఎవరికీ అయితే ఇప్పటికే ఖాతా ఉందో, వారే మీ వికీని "
-"చదవగలరు/మార్చగలరు. ప్రజా నమోదు కూడా ఆపివేయబడుతింది."
+"ప్రారంభించబడితే, సాంగత్యం పరిమితం చేయబడుతుంది. ఖాతాలు ఉన్నవారు మాత్రమే వికీలో చదవగలరు/వ్రాయగలరు. "
+"ప్రజా రిజిస్ట్రేషన్లు కూడా నిలిపివేయబడతాయి."
#: plinth/modules/mediawiki/forms.py:75
msgid "Default Skin"
@@ -3345,22 +3299,20 @@ msgid "Default skin changed"
msgstr "డిఫాల్ట్ చర్మం మార్చబడింది"
#: plinth/modules/mediawiki/views.py:90
-#, fuzzy
-#| msgid "{name} deleted."
msgid "Server URL updated"
-msgstr "{name} తొలగించబడింది."
+msgstr "సర్వర్ URL నవీకరించబడింది"
#: plinth/modules/minetest/__init__.py:34
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"Minetest is a multiplayer infinite-world block sandbox. This module enables "
"the Minetest server to be run on this {box_name}, on the default port "
"(30000). To connect to the server, a Minetest client is needed."
msgstr ""
-"Minetest ఒక మల్టీప్లేయర్ అనంతం ప్రపంచ బ్లాక్ శాండ్బాక్స్ ఉంది. ఈ మాడ్యూల్ డిఫాల్ట్ పోర్ట్ (30000) పై "
-"Minetest సర్వర్ ఈ {box_name} 1 అమలు సహకరిస్తుంది. సర్వర్కు కనెక్ట్ చెయ్యడానికి ఒక 2Minetest క్లైంట్ 3 అవసరమవుతుంది."
+"Minetest అనేది మల్టీప్లేయర్ అనంత-వరల్డ్ బ్లాక్ శాండ్బాక్స్. ఈ మాడ్యూల్ డిఫాల్ట్ పోర్ట్లో (30000) ఈ "
+"{box_name}లో Minetest సర్వర్ని అమలు చేయడానికి అనుమతిస్తుంది. సర్వర్కి కనెక్ట్ చేయడానికి, Minetest క్లయింట్ అవసరం."
#: plinth/modules/minetest/__init__.py:59 plinth/modules/minetest/manifest.py:9
msgid "Minetest"
@@ -3385,49 +3337,35 @@ msgid "Enable creative mode"
msgstr "క్రియేటివ్ మోడ్ను ప్రారంభించండి"
#: plinth/modules/minetest/forms.py:20
-#, fuzzy
-#| msgid ""
-#| "Creative mode changes the rules of the game to make "
-#| "it more suitable for creative gameplay, rather "
-#| "than challenging \"survival\" gameplay."
msgid ""
"Creative mode changes the rules of the game to make it more suitable for "
"creative gameplay, rather than challenging \"survival\" gameplay."
msgstr ""
-"క్రియేటివ్ మోడ్ \"మనుగడ\" గేమ్ప్లే సవాలు కంటే, సృజనాత్మక గేమ్ప్లే అనువుగా ఆట నియమాలు మారుస్తుంది."
+"సృజనాత్మక సంవిధానం \"మనుగడ\" గేమ్ప్లే సవాలు కంటే, సృజనాత్మక గేమ్ప్లే అనువుగా ఆట నియమాలు "
+"మారుస్తుంది."
#: plinth/modules/minetest/forms.py:25
msgid "Enable PVP"
msgstr "పివిపిని ప్రారంభించండి"
#: plinth/modules/minetest/forms.py:26
-#, fuzzy
msgid "Enabling Player Vs Player will allow players to damage other players."
-msgstr "ప్లేయర్ Vs ప్లేయర్ అనే ఆప్షన్ ని అనుమతిస్తే క్రీడాకారులు ఇతర క్రీడాకారులు దెబ్బతినేలా చూస్తుంది"
+msgstr ""
+"ప్లేయర్ Vs ప్లేయర్ని ఉపయోగించు చేయడం వల్ల ఆటగాళ్లు ఇతర ఆటగాళ్లను పాడయిన చేయడానికి అనుమతిస్తుంది."
#: plinth/modules/minetest/forms.py:30
-#, fuzzy
msgid "Enable damage"
-msgstr "PageKite ప్రారంభించు"
+msgstr "నష్టాన్ని ప్రారంభించండి"
#: plinth/modules/minetest/forms.py:31
-#, fuzzy
-#| msgid ""
-#| "When disabled, players cannot die or receive damage "
-#| "of any kind"
msgid "When disabled, players cannot die or receive damage of any kind."
-msgstr "డిసేబుల్ లో ఉన్నప్పుడు, క్రీడాకారులు చనిపోయే లేదా ఏ రకమైన నష్టం అందుకోలేరు"
+msgstr "నిరుపయోగం అయినప్పుడు, ఆటగాళ్ళు చనిపోలేరు లేదా ఎలాంటి నష్టాన్ని పొందలేరు."
#: plinth/modules/minetest/templates/minetest.html:17
#: plinth/modules/networks/forms.py:54 plinth/modules/networks/forms.py:90
msgid "Address"
msgstr "చిరునామా"
-#: plinth/modules/minetest/templates/minetest.html:18
-#: plinth/modules/tor/templates/tor.html:72
-msgid "Port"
-msgstr "పోర్టు"
-
#: plinth/modules/minidlna/__init__.py:20
msgid ""
"MiniDLNA is a simple media server software, with the aim of being fully "
@@ -3438,14 +3376,19 @@ msgid ""
"gaming systems (such as PS3 and Xbox 360) or applications such as totem and "
"Kodi."
msgstr ""
+"MiniDLNA అనేది DLNA/UPnP-AV క్లయింట్లకు పూర్తిగా అనుగుణంగా ఉండాలనే లక్ష్యంతో ఒక సాధారణ మీడియా "
+"సర్వర్ సాఫ్ట్వేర్. MiniDLNA డెమోన్ నెట్వర్క్లోని క్లయింట్లకు మీడియా ఫైల్లను (సంగీతం, చిత్రాలు మరియు వీడియో) "
+"అందిస్తుంది. DLNA/UPnP అనేది జీరో కాన్ఫిగరేషన్ ప్రోటోకాల్ మరియు పోర్టబుల్ మీడియా ప్లేయర్లు, స్మార్ట్ఫోన్లు, "
+"టెలివిజన్లు మరియు గేమింగ్ సిస్టమ్లు (PS3 మరియు Xbox 360 వంటివి) లేదా టోటెమ్ మరియు కోడి వంటి "
+"అప్లికేషన్లు వంటి DLNA సర్టిఫికేషన్ను పాస్ చేసే ఏదైనా పరికరానికి అనుగుణంగా ఉంటుంది."
#: plinth/modules/minidlna/__init__.py:43
msgid "Media streaming server"
-msgstr ""
+msgstr "మీడియా స్ట్రీమింగ్ సేవిక"
#: plinth/modules/minidlna/__init__.py:46
msgid "MiniDLNA"
-msgstr ""
+msgstr "చిన్న DLNA"
#: plinth/modules/minidlna/__init__.py:47
msgid "Simple Media Server"
@@ -3453,7 +3396,7 @@ msgstr "సరళమైన మీడియా సేవిక"
#: plinth/modules/minidlna/forms.py:13
msgid "Media Files Directory"
-msgstr ""
+msgstr "మీడియా ఫైల్స్ డైరెక్టరీ"
#: plinth/modules/minidlna/forms.py:14
msgid ""
@@ -3462,20 +3405,24 @@ msgid ""
"that the new directory exists and that is readable from the \"minidlna\" "
"user. Any user media directories (\"/home/username/\") will usually work."
msgstr ""
+"MiniDLNA సర్వర్ కంటెంట్ కోసం చదివే డైరెక్టరీ. దీని యొక్క అన్ని ఉప డైరెక్టరీలు మీడియా ఫైల్ల కోసం కూడా స్కాన్ "
+"చేయబడతాయి. మీరు డిఫాల్ట్ని మార్చినట్లయితే, కొత్త డైరెక్టరీ ఉందని మరియు అది \"minidlna\" వినియోగదారు నుండి "
+"చదవగలిగేలా ఉందని నిర్ధారించుకోండి. ఏదైనా వినియోగదారు మీడియా డైరెక్టరీలు (\"/home/username/\") "
+"సాధారణంగా పని చేస్తాయి."
#: plinth/modules/minidlna/manifest.py:10
msgid "vlc"
-msgstr ""
+msgstr "వెళ్సి"
-#: plinth/modules/minidlna/manifest.py:43
+#: plinth/modules/minidlna/manifest.py:48
msgid "kodi"
-msgstr ""
+msgstr "కోడి"
-#: plinth/modules/minidlna/manifest.py:76
+#: plinth/modules/minidlna/manifest.py:81
msgid "yaacc"
-msgstr ""
+msgstr "యాక్"
-#: plinth/modules/minidlna/manifest.py:86
+#: plinth/modules/minidlna/manifest.py:91
msgid "totem"
msgstr "టోటెమ్"
@@ -3496,14 +3443,13 @@ msgstr ""
"సాఫ్ట్వేర్."
#: plinth/modules/mumble/__init__.py:28
-#, fuzzy
msgid ""
"You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your "
"desktop and mobile devices are available."
msgstr ""
-"మీరు మీ డెస్క్టాప్ నుండి Mumble కనెక్ట్ చేయడానికి సాధారణ నమలు పోర్ట్ 64738. 1Clients 2 మీ నమలు సర్వర్ కనెక్ట్ చేయవచ్చు మరియు Android పరికరాలు "
+"మీరు సాధారణ Mumble రేవు 64738లో మీ Mumble సర్వర్కి బందించవచ్చు. మీ రంగస్థలం మరియు చరవాణి "
+"పరికరాల నుండి Mumbleకి బంధించడానికి క్లయింట్లు "
"అందుబాటులో ఉన్నాయి."
#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9
@@ -3515,16 +3461,16 @@ msgid "Voice Chat"
msgstr "స్వర సంభాషణ"
#: plinth/modules/mumble/forms.py:30
-#, fuzzy
-#| msgid "SSH server password"
msgid "Set SuperUser Password"
-msgstr "SSH సర్వర్ పాస్ వర్డ్"
+msgstr "సూపర్యూజర్ రహస్యపదంని సెట్ చేయండి"
#: plinth/modules/mumble/forms.py:33
msgid ""
"Optional. Leave this field blank to keep the current password. SuperUser "
"password can be used to manage permissions in Mumble."
msgstr ""
+"ఐచ్ఛికం. ప్రస్తుత పాస్వర్డ్ను ఉంచడానికి ఈ ఫీల్డ్ను ఖాళీగా ఉంచండి. Mumbleలో అనుమతులను నిర్వహించడానికి "
+"SuperUser పాస్వర్డ్ని ఉపయోగించవచ్చు."
#: plinth/modules/mumble/manifest.py:34
msgid "Mumblefly"
@@ -3532,13 +3478,11 @@ msgstr "ముంబుల్ ఫ్లై"
#: plinth/modules/mumble/manifest.py:43
msgid "Mumla"
-msgstr ""
+msgstr "ముంల"
#: plinth/modules/mumble/views.py:39
-#, fuzzy
-#| msgid "Password changed successfully."
msgid "SuperUser password successfully updated."
-msgstr "పాస్వర్డ్ విజయవంతంగా మార్చబడినది."
+msgstr "సూపర్ యూసర్ ర హస్యపదం విజయవంతంగా మార్చబడినది."
#: plinth/modules/names/__init__.py:22
#, python-brace-format
@@ -3548,6 +3492,9 @@ msgid ""
"each type of name, it is shown whether the HTTP, HTTPS, and SSH services are "
"enabled or disabled for incoming connections through the given name."
msgstr ""
+"నేమ్ సర్వీసెస్ మార్గాల యొక్క అవలోకనాన్ని అందిస్తుంది {box_name}పబ్లిక్ ఇంటర్నెట్ నుండి చేరుకోవచ్చు: డొమైన్ "
+"పేరు, టోర్ ఉల్లిపాయ సేవ మరియు పేజ్కైట్. ప్రతి రకమైన పేరు కోసం, ఇచ్చిన పేరు ద్వారా ఇన్కమింగ్ కనెక్షన్ల కోసం "
+"HTTP, HTTPS మరియు SSH సేవలు ప్రారంభించబడినా లేదా నిలిపివేయబడినా చూపబడుతుంది."
#: plinth/modules/names/__init__.py:43
msgid "Name Services"
@@ -3555,27 +3502,27 @@ msgstr "పేరు సేవలు"
#: plinth/modules/names/components.py:12
msgid "All"
-msgstr ""
+msgstr "అన్నీ"
#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20
msgid "All web apps"
-msgstr ""
+msgstr "అన్నీ వెబ్ యాప్లు"
#: plinth/modules/names/components.py:24
msgid "Secure Shell"
msgstr "సెక్యూర్ షెల్"
#: plinth/modules/names/templates/names.html:17
-#, fuzzy
-#| msgid "Service"
msgid "Services"
-msgstr "సేవ"
+msgstr "సేవలు"
#: plinth/modules/networks/__init__.py:36
msgid ""
"Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or "
"PPPoE. Share that connection with other devices on the network."
msgstr ""
+"కాన్ఫిగర్ చేయగల నెట్వర్క్ పరికరాలు. ఈథర్నెట్ మరియు Wi-Fi లేదా PPPoE ద్వారా ఇంటర్నెట్తో కనెక్ట్ అవ్వండి. "
+"నెట్వర్క్లోని ఇతర పరికరాలతో ఆ కనెక్షన్ని భాగస్వామ్యం చేయండి."
#: plinth/modules/networks/__init__.py:38
msgid ""
@@ -3601,10 +3548,8 @@ msgid "Connection Name"
msgstr "అనుసంధానం పేరు"
#: plinth/modules/networks/forms.py:30
-#, fuzzy
-#| msgid "Interface"
msgid "Network Interface"
-msgstr "అంతర్ముఖం"
+msgstr "నెట్వర్క్ అంతర్ముఖం"
#: plinth/modules/networks/forms.py:31
msgid "The network device that this connection should be bound to."
@@ -3615,7 +3560,6 @@ msgid "Firewall Zone"
msgstr "కంచుకోట క్షేత్రాం"
#: plinth/modules/networks/forms.py:35
-#, fuzzy
msgid ""
"The firewall zone will control which services are available over this "
"interfaces. Select Internal only for trusted networks."
@@ -3632,22 +3576,25 @@ msgid ""
"Automatic (DHCP): Configure automatically, use Internet connection from this "
"network"
msgstr ""
+"స్వయంచాలక (DHCP ): స్వయంచాలకంగా కాన్ఫిగర్ చేయండి, ఈ నెట్వర్క్ నుండి ఇంటర్నెట్ కనెక్షన్ని ఉపయోగించండి"
#: plinth/modules/networks/forms.py:44
msgid ""
"Shared: Act as a router, provide Internet connection to other devices on "
"this network"
msgstr ""
+"భాగస్వామ్యం చేయబడింది: రూటర్ వలె పని చేయండి, ఈ నెట్వర్క్లోని ఇతర పరికరాలకు ఇంటర్నెట్ కనెక్షన్ను అందించండి"
#: plinth/modules/networks/forms.py:47 plinth/modules/networks/forms.py:85
msgid ""
"Manual: Use manually specified parameters, use Internet connection from this "
"network"
msgstr ""
+"నిర్దేశిక : నిర్దేశికంగా పేర్కొన్న పారామితులను ఉపయోగించండి, ఈ నెట్వర్క్ నుండి ఇంటర్నెట్ కనెక్షన్ని ఉపయోగించండి"
#: plinth/modules/networks/forms.py:50
msgid "Disabled: Do not configure this addressing method"
-msgstr ""
+msgstr "నిలిపివేయబడింది: ఈ చిరునామా పద్ధతిని కాన్ఫిగర్ చేయవద్దు"
#: plinth/modules/networks/forms.py:57
msgid "Netmask"
@@ -3674,7 +3621,6 @@ msgid "DNS Server"
msgstr "DNS సేవకం"
#: plinth/modules/networks/forms.py:66
-#, fuzzy
msgid ""
"Optional value. If this value is given and IPv4 addressing method is "
"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored."
@@ -3687,7 +3633,6 @@ msgid "Second DNS Server"
msgstr "ద్వితీయ DNS సేవకం"
#: plinth/modules/networks/forms.py:72
-#, fuzzy
msgid ""
"Optional value. If this value is given and IPv4 Addressing Method is "
"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored."
@@ -3702,20 +3647,21 @@ msgstr "IPv6 చిరునామా ఇచ్చు పద్ధతి"
#: plinth/modules/networks/forms.py:79
msgid ""
"Automatic: Configure automatically, use Internet connection from this network"
-msgstr ""
+msgstr "స్వయంచాలికమైన : స్వయంచాలకంగా కాన్ఫిగర్ చేయండి, ఈ నెట్వర్క్ నుండి ఇంటర్నెట్ కనెక్షన్ని ఉపయోగించండి"
#: plinth/modules/networks/forms.py:82
msgid ""
"Automatic (DHCP only): Configure automatically, use Internet connection from "
"this network"
msgstr ""
+"స్వయంచాలక (DHCP మాత్రమే): స్వయంచాలకంగా కాన్ఫిగర్ చేయండి, ఈ నెట్వర్క్ నుండి ఇంటర్నెట్ కనెక్షన్ని "
+"ఉపయోగించండి"
#: plinth/modules/networks/forms.py:87
msgid "Ignore: Ignore this addressing method"
-msgstr ""
+msgstr "విస్మరించండి: ఈ చిరునామా పద్ధతిని విస్మరించండి"
#: plinth/modules/networks/forms.py:92
-#, fuzzy
msgid "Prefix"
msgstr "ఉపసర్గ"
@@ -3724,7 +3670,6 @@ msgid "Value between 1 and 128."
msgstr "1 మరియు 128 మధ్యగల విలువ."
#: plinth/modules/networks/forms.py:101
-#, fuzzy
msgid ""
"Optional value. If this value is given and IPv6 addressing method is "
"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored."
@@ -3733,7 +3678,6 @@ msgstr ""
"DHCP సర్వర్ అందించిన DNS సర్వర్లు విస్మరించబడుతుంది"
#: plinth/modules/networks/forms.py:107
-#, fuzzy
msgid ""
"Optional value. If this value is given and IPv6 Addressing Method is "
"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored."
@@ -3768,7 +3712,6 @@ msgid "Access Point"
msgstr "ప్రాప్తి సూచి"
#: plinth/modules/networks/forms.py:252
-#, fuzzy
msgid "Ad-hoc"
msgstr "తదర్థ"
@@ -3777,7 +3720,6 @@ msgid "Frequency Band"
msgstr "ఫ్రీక్వెన్సీ బ్యాండ్"
#: plinth/modules/networks/forms.py:254
-#, fuzzy
msgid "Automatic"
msgstr "స్వయంచాలక"
@@ -3795,7 +3737,6 @@ msgid "Channel"
msgstr "మార్గం"
#: plinth/modules/networks/forms.py:259
-#, fuzzy
msgid ""
"Optional value. Wireless channel in the selected frequency band to restrict "
"to. Blank or 0 value means automatic selection."
@@ -3808,7 +3749,6 @@ msgid "BSSID"
msgstr "BSSID"
#: plinth/modules/networks/forms.py:265
-#, fuzzy
msgid ""
"Optional value. Unique identifier for the access point. When connecting to "
"an access point, connect only if the BSSID of the access point matches the "
@@ -3822,7 +3762,6 @@ msgid "Authentication Mode"
msgstr "ప్రామాణీకరణ విధం"
#: plinth/modules/networks/forms.py:272
-#, fuzzy
msgid ""
"Select WPA if the wireless network is secured and requires clients to have "
"the password to connect."
@@ -3838,9 +3777,8 @@ msgstr "తెరచిన"
#: plinth/modules/networks/forms.py:310
#, fuzzy, python-brace-format
-#| msgid "Choose how your {box_name} is connected to your network"
msgid "Specify how your {box_name} is connected to your network"
-msgstr "మీ {box_name} మీ నెట్వర్క్కు ఎలా కనెక్ట్ అయిందో ఎంచుకోండి"
+msgstr "మీ బాక్స్_నామ మీ నెట్వర్క్కు ఎలా కనెక్ట్ అయిందో ఎంచుకోండి {box_name}"
#: plinth/modules/networks/forms.py:317
#, python-brace-format
@@ -3849,6 +3787,8 @@ msgid ""
"Internet connection from your router via Wi-Fi or Ethernet cable. This is a "
"typical home setup.
మీ {box_name} మీ రూటర్ నుండి Wi-Fi లేదా " +"Ethernet కేబుల్ ద్వారా ఇంటర్నెట్ కనెక్షన్ని పొందుతుంది. ఇది సాధారణ ఇంటి సెటప్.
" #: plinth/modules/networks/forms.py:324 #, python-brace-format @@ -3858,6 +3798,9 @@ msgid "" "adapter. {box_name} is directly connected to the Internet and all your " "devices connect to {box_name} for their Internet connectivity." msgstr "" +"{box_name} మీ రూటర్మీ {box_name} బహుళ ఈథర్నెట్ పోర్ట్లు లేదా " +"wi-fi అడాప్టర్ వంటి బహుళ నెట్వర్క్ ఇంటర్ఫేస్లను కలిగి ఉంది. {box_name} నేరుగా ఇంటర్నెట్కి కనెక్ట్ " +"చేయబడింది మరియు మీ అన్ని పరికరాలు వాటి ఇంటర్నెట్ కనెక్టివిటీ కోసం {box_name}కి కనెక్ట్ చేయబడ్డాయి.
" #: plinth/modules/networks/forms.py:333 #, python-brace-format @@ -3866,10 +3809,13 @@ msgid "" "connection is directly attached to your {box_name} and there are no other " "devices on the network. This can happen on community or cloud setups." msgstr "" +"నేరుగా ఇంటర్నెట్కి కనెక్ట్ చేయబడిందిమీ ఇంటర్నెట్ కనెక్షన్ నేరుగా మీ " +"{box_name}కి జోడించబడింది మరియు నెట్వర్క్లో ఇతర పరికరాలు ఏవీ లేవు. ఇది సంఘం లేదా క్లౌడ్ సెటప్లలో " +"జరగవచ్చు.
" #: plinth/modules/networks/forms.py:352 msgid "Choose your internet connection type" -msgstr "" +msgstr "మీ ఇంటర్నెట్ కనెక్షన్ రకాన్ని ఎంచుకోండి" #: plinth/modules/networks/forms.py:356 msgid "" @@ -3881,6 +3827,11 @@ msgid "" "connectivity. If you have a public IP address but are unsure if it changes " "over time or not, it is safer to choose this option." msgstr "" +"నా దగ్గర పబ్లిక్ IP చిరునామా ఉంది, అది కాలక్రమేణా మారవచ్చుదీని అర్థం " +"మీరు ఇంటర్నెట్కి కనెక్ట్ చేయబడినప్పుడు ఇంటర్నెట్లోని పరికరాలు మిమ్మల్ని చేరుకోగలవు. మీరు మీ ఇంటర్నెట్ " +"సర్వీస్ ప్రొవైడర్ (ISP)తో ఇంటర్నెట్కి కనెక్ట్ చేసిన ప్రతిసారీ, మీరు వేరే IP చిరునామాను పొందవచ్చు, ప్రత్యేకించి " +"కొంత ఆఫ్లైన్ సమయం తర్వాత. అనేక ISPలు ఈ రకమైన కనెక్టివిటీని అందిస్తాయి. మీరు పబ్లిక్ IP చిరునామాను కలిగి " +"ఉండి, అది కాలక్రమేణా మారుతుందో లేదో ఖచ్చితంగా తెలియకపోతే, ఈ ఎంపికను ఎంచుకోవడం సురక్షితం.
" #: plinth/modules/networks/forms.py:368 #, python-brace-format @@ -3893,6 +3844,11 @@ msgid "" "but very few ISPs offer this. You may be able to get this service from your " "ISP by making an additional payment." msgstr "" +"నా దగ్గర పబ్లిక్ IP చిరునామా ఉంది, అది కాలక్రమేణా మారదు (సిఫార్సు చేయబడింది)దీని అర్థం మీరు ఇంటర్నెట్కి కనెక్ట్ చేయబడినప్పుడు ఇంటర్నెట్లోని పరికరాలు మిమ్మల్ని చేరుకోగలవు. మీరు మీ " +"ఇంటర్నెట్ సర్వీస్ ప్రొవైడర్ (ISP)తో ఇంటర్నెట్కి కనెక్ట్ చేసిన ప్రతిసారీ, మీరు ఎల్లప్పుడూ ఒకే IP చిరునామాను " +"పొందుతారు. ఇది చాలా {box_name} సేవలకు అత్యంత ఇబ్బంది లేని సెటప్, కానీ చాలా కొద్ది మంది ISPలు దీన్ని " +"అందిస్తున్నారు. మీరు అదనపు చెల్లింపు చేయడం ద్వారా మీ ISP నుండి ఈ సేవను పొందవచ్చు.
" #: plinth/modules/networks/forms.py:381 #, python-brace-format @@ -3905,18 +3861,23 @@ msgid "" "troublesome situation for hosting services at home. {box_name} provides many " "workaround solutions but each solution has some limitations." msgstr "" +"నా దగ్గర పబ్లిక్ IP చిరునామా లేదుదీని అర్థం మీరు ఇంటర్నెట్కి కనెక్ట్ " +"చేయబడినప్పుడు ఇంటర్నెట్లోని పరికరాలు మీకు చేరలేవు. మీరు మీ ఇంటర్నెట్ సర్వీస్ ప్రొవైడర్ (ISP)తో " +"ఇంటర్నెట్కి కనెక్ట్ చేసిన ప్రతిసారీ, మీరు స్థానిక నెట్వర్క్లకు మాత్రమే సంబంధించిన IP చిరునామాను పొందుతారు. " +"అనేక ISPలు ఈ రకమైన కనెక్టివిటీని అందిస్తాయి. ఇంట్లో సేవలను హోస్ట్ చేయడానికి ఇది చాలా సమస్యాత్మకమైన పరిస్థితి. " +"{box_name} అనేక పరిష్కార పరిష్కారాలను అందిస్తుంది కానీ ప్రతి పరిష్కారానికి కొన్ని పరిమితులు ఉంటాయి.
" #: plinth/modules/networks/forms.py:394 msgid "" "I do not know the type of connection my ISP providesYou will be suggested the most conservative actions.
" msgstr "" +"నా ఐ ఎస్ పి అందించే కనెక్షన్ రకం నాకు తెలియదుమీరు అత్యంత సాంప్రదాయిక " +"చర్యలను సూచించబడతారు
" #: plinth/modules/networks/forms.py:411 -#, fuzzy -#| msgid "Current Network Configuration" msgid "Preferred router configuration" -msgstr "ప్రస్తుత అల్లిక ఆకృతీకరణ" +msgstr "ప్రస్తుత ఇష్టపడే మార్గం అల్లిక ఆకృతీకరణ" #: plinth/modules/networks/forms.py:416 #, python-brace-format @@ -3928,6 +3889,11 @@ msgid "" "static local IP address for your {box_name} in your router's configuration." "p>" msgstr "" +"మొత్తం ట్రాఫిక్ను ఫార్వార్డ్ చేయడానికి DMZ ఫీచర్ని ఉపయోగించండి (సిఫార్సు చేయబడింది)చాలా రౌటర్లు DMZ అనే కాన్ఫిగరేషన్ సెట్టింగ్ను అందిస్తాయి. ఇది ఇంటర్నెట్ నుండి ఇన్కమింగ్ ట్రాఫిక్ " +"మొత్తాన్ని {box_name} యొక్క ఐపి చిరునామా వంటి ఒకే ఐపి చిరునామాకు ఫార్వార్డ్ చేయడానికి రూటర్ని " +"అనుమతిస్తుంది. ముందుగా మీ రూటర్ కాన్ఫిగరేషన్లో మీ {box_name} కోసం స్టాటిక్ స్థానిక ఐపి చిరునామాను " +"కాన్ఫిగర్ చేయాలని గుర్తుంచుకోండి.
" #: plinth/modules/networks/forms.py:428 #, python-brace-format @@ -3940,6 +3906,12 @@ msgid "" "443 to work. Each of the other applications will suggest which port(s) need " "to be forwarded for that application to work." msgstr "" +"ప్రతి అప్లికేషన్అవసరమైన నిర్దిష్ట ట్రాఫిక్ని ఫార్వార్డ్ చేయండి>మీరు " +"ప్రత్యామ్నాయంగా మీ {box_name}కి నిర్దిష్ట ట్రాఫిక్ను మాత్రమే ఫార్వార్డ్ చేయడాన్ని ఎంచుకోవచ్చు. మీరు మీ " +"నెట్వర్క్లో {box_name} వంటి ఇతర సర్వర్లను కలిగి ఉంటే లేదా మీ రూటర్ డి ఎం జెడ్ ఫీచర్కు మద్దతు " +"ఇవ్వకపోతే ఇది అనువైనది. వెబ్ ఇంటర్ఫేస్ను అందించే అన్ని అప్లికేషన్లు పని చేయడానికి మీరు పోర్ట్లు 80 మరియు " +"443 నుండి ట్రాఫిక్ను ఫార్వార్డ్ చేయాలి. ప్రతి ఇతర అప్లికేషన్లు ఆ అప్లికేషన్ పని చేయడానికి ఏ పోర్ట్(లు) " +"ఫార్వార్డ్ చేయాలో సూచిస్తాయి.
" #: plinth/modules/networks/forms.py:442 msgid "" @@ -3947,6 +3919,9 @@ msgid "" "have not configured or are unable to configure the router currently and wish " "to be reminded later. Some of the other configuration steps may fail." msgstr "" +"రూటర్ ప్రస్తుతం కాన్ఫిగర్ చేయబడలేదుమీరు కాన్ఫిగర్ చేయకుంటే లేదా " +"ప్రస్తుతం రూటర్ని కాన్ఫిగర్ చేయలేక పోతే దీన్ని ఎంచుకోండి మరియు తర్వాత గుర్తు చేయాలనుకుంటున్నాను. కొన్ని " +"ఇతర కాన్ఫిగరేషన్ దశలు విఫలం కావచ్చు.
" #: plinth/modules/networks/templates/connection_show.html:24 #, python-format @@ -3956,6 +3931,9 @@ msgid "" "that you have other means to access %(box_name)s before altering this " "connection." msgstr "" +"ఇంటర్నెట్ కనెక్టివిటీ కోసం %(box_name)s ఆధారపడే ప్రాథమిక కనెక్షన్ ఇది. దీన్ని మార్చడం వలన మీ " +"%(box_name)s అందుబాటులోకి రాకపోవచ్చు. ఈ కనెక్షన్ని మార్చే ముందు %(box_name)sని యాక్సెస్ చేయడానికి " +"మీకు ఇతర మార్గాలు ఉన్నాయని నిర్ధారించుకోండి." #: plinth/modules/networks/templates/connection_show.html:36 msgid "Edit connection" @@ -4109,18 +4087,17 @@ msgid "Firewall zone" msgstr "ఫైర్వాల్ క్షేత్రాం" #: plinth/modules/networks/templates/connection_show.html:273 -#, fuzzy msgid "" "This interface should be connected to a local network/machine. If you " "connect this interface to a public network, services meant to be available " "only internally will become available externally. This is a security risk." msgstr "" "ఈ ఇంటర్ఫేస్ ఒక స్థానిక నెట్వర్క్ / యంత్రానికి కనెక్ట్ చేయాలి. మీరు పబ్లిక్ నెట్వర్క్ ఈ ఇంటర్ఫేస్ కనెక్ట్ ఉంటే, " -"సేవలు కేవలం అంతర్గతంగానే బాహ్యంగా అందుబాటులో అవుతుంది అందుబాటులో ఉండాలి అర్థం. ఈ ప్రమాదం ఉంది." +"సేవలు కేవలం అంతర్గతంగానే బాహ్యంగా అందుబాటులో అవుతుంది అందుబాటులో ఉండాలి అర్థం. ఇది భద్రతాపరమైన " +"ప్రమాదం." #: plinth/modules/networks/templates/connection_show.html:293 #: plinth/modules/networks/templates/connection_show.html:316 -#, fuzzy msgid "" "This interface should receive your Internet connection. If you connect it to " "a local network/machine, many services meant to available only internally " @@ -4141,6 +4118,8 @@ msgid "" "This interface is not maintained by %(box_name)s. For security, it is " "automatically assigned to the external zone." msgstr "" +"ఈ ఇంటర్ఫేస్ %(box_name)s ద్వారా నిర్వహించబడదు. భద్రత కోసం, ఇది స్వయంచాలకంగా బాహ్య జోన్కు " +"కేటాయించబడుతుంది." #: plinth/modules/networks/templates/connections_create.html:19 msgid "Create Connection" @@ -4199,8 +4178,6 @@ msgid "Edit Connection" msgstr "అనుసంధానాన్ని సవరించండి" #: plinth/modules/networks/templates/connections_list.html:8 -#, fuzzy -#| msgid "Connection" msgid "Connections" msgstr "అనుసంధానం" @@ -4236,20 +4213,20 @@ msgstr "సృష్టించు..." #: plinth/modules/networks/templates/internet_connectivity_content.html:10 msgid "What Type Of Internet Connection Do You Have?" -msgstr "" +msgstr "మీకు ఏ రకమైన ఇంటర్నెట్ కనెక్షన్ ఉంది?" #: plinth/modules/networks/templates/internet_connectivity_content.html:16 msgid "" "Select an option that best describes the type of Internet connection. This " "information is used only to guide you with further setup." msgstr "" +"ఇంటర్నెట్ కనెక్షన్ రకాన్ని ఉత్తమంగా వివరించే ఎంపికను ఎంచుకోండి. తదుపరి సెటప్తో మీకు మార్గనిర్దేశం చేయడానికి " +"మాత్రమే ఈ సమాచారం ఉపయోగించబడుతుంది." #: plinth/modules/networks/templates/internet_connectivity_firstboot.html:19 #: plinth/modules/networks/templates/network_topology_firstboot.html:19 #: plinth/modules/networks/templates/router_configuration_firstboot.html:19 #: plinth/modules/users/templates/users_firstboot.html:63 -#, fuzzy -#| msgid "skip this step" msgid "Skip this step" msgstr "ఈ దశను దాటవేయి" @@ -4264,8 +4241,6 @@ msgid "Next" msgstr "తర్వాత" #: plinth/modules/networks/templates/internet_connectivity_main.html:9 -#, fuzzy -#| msgid "Connection Type" msgid "Your Internet Connection Type" msgstr "అనుసంధాన రకం" @@ -4275,29 +4250,29 @@ msgid "" "your ISP. This information is only used to suggest you necessary " "configuration actions." msgstr "" +"కిందిది మీ ద్వారా అందించబడిన ఇంటర్నెట్ కనెక్షన్ రకాన్ని ఉత్తమంగా వివరిస్తుంది. ఈ సమాచారం మీకు అవసరమైన " +"కాన్ఫిగరేషన్ చర్యలను సూచించడానికి మాత్రమే ఉపయోగించబడుతుంది." #: plinth/modules/networks/templates/internet_connectivity_main.html:23 msgid "My ISP provides a public IP address that does not change over time." -msgstr "" +msgstr "నా ISP పబ్లిక్ IP చిరునామాను అందిస్తుంది, అది కాలక్రమేణా మారదు." #: plinth/modules/networks/templates/internet_connectivity_main.html:27 msgid "My ISP provides a public IP address that may change over time." -msgstr "" +msgstr "నా ISP పబ్లిక్ IP చిరునామాను అందిస్తుంది, అది కాలక్రమేణా మారదు." #: plinth/modules/networks/templates/internet_connectivity_main.html:31 msgid "My ISP does not provide a public IP address." -msgstr "" +msgstr "నా ISP ప్రజాIP చిరునామాను అందించదు." #: plinth/modules/networks/templates/internet_connectivity_main.html:35 msgid "I do not know the type of connection my ISP provides." -msgstr "" +msgstr "నా ISP అందించే బంధం రకం నాకు తెలియదు." #: plinth/modules/networks/templates/internet_connectivity_main.html:41 #: plinth/modules/networks/templates/network_topology_main.html:41 -#, fuzzy -#| msgid "Update" msgid "Update..." -msgstr "నవీకరణ యూ.ఆర్.ఎల్" +msgstr "...నవీకరించు" #: plinth/modules/networks/templates/network_topology_content.html:10 #, python-format @@ -4311,11 +4286,13 @@ msgid "" "your network. This information is used to guide you with further setup. It " "can be changed later." msgstr "" +"మీ అల్లిక మీ %(box_name)s ఎలా బంధంచేయబడిందో ఉత్తమంగా వివరించే ఎంపికను ఎంచుకోండి. తదుపరి " +"అమర్చిపెట్టు మీకు మార్గనిర్దేశం చేయడానికి ఈ సమాచారం ఉపయోగించబడుతుంది. తర్వాత మార్చుకోవచ్చు." #: plinth/modules/networks/templates/network_topology_main.html:9 #, python-format msgid "%(box_name)s Internet Connectivity" -msgstr "" +msgstr "%(box_name)s ఇంటర్నెట్ కనెక్టివిటీ" #: plinth/modules/networks/templates/network_topology_main.html:15 #, python-format @@ -4324,6 +4301,8 @@ msgid "" "network. This information is used only to suggest necessary configuration " "actions." msgstr "" +"మీ అల్లిక మీ %(box_name)s ఎలా బంధం చేయబడిందో క్రింది ఉత్తమంగా వివరిస్తుంది. ఈ సమాచారం అవసరమైన " +"రూపకరణ చర్యలను సూచించడానికి మాత్రమే ఉపయోగించబడుతుంది." #: plinth/modules/networks/templates/network_topology_main.html:24 #, python-format @@ -4331,6 +4310,8 @@ msgid "" "Your %(box_name)s gets its Internet connection from your router via Wi-Fi or " "Ethernet cable. This is a typical home setup." msgstr "" +"Wi-Fi లేదా ఇంటర్ నెట్కేబుల్ ద్వారా మీ రూటర్ నుండి మీ %(box_name)s ఇంటర్నెట్ కనెక్షన్ని పొందుతుంది. " +"ఇది సాధారణ ఇంటి సెటప్." #: plinth/modules/networks/templates/network_topology_main.html:29 #, python-format @@ -4338,6 +4319,8 @@ msgid "" "Your %(box_name)s is directly connected to the Internet and all your devices " "connect to %(box_name)s for their Internet connectivity." msgstr "" +"మీ %(box_name)s నేరుగా ఇంటర్నెట్కి కనెక్ట్ చేయబడింది మరియు మీ అన్ని పరికరాలు వాటి ఇంటర్నెట్ కనెక్టివిటీ " +"కోసం %(box_name)sకి కనెక్ట్ అవుతాయి." #: plinth/modules/networks/templates/network_topology_main.html:34 #, python-format @@ -4345,18 +4328,20 @@ msgid "" "Your Internet connection is directly attached to your %(box_name)s and there " "are no other devices on the network." msgstr "" +"మీ ఇంటర్నెట్ కనెక్షన్ నేరుగా మీ %(box_name)sకి జోడించబడింది మరియు నెట్వర్క్లో ఇతర పరికరాలు ఏవీ లేవు." #: plinth/modules/networks/templates/networks_configuration.html:24 msgid "" "Advanced networking operations such as bonding, bridging and VLAN management " "are provided by the Cockpit app." msgstr "" +"బాండింగ్, బ్రిడ్జింగ్ మరియు VLAN నిర్వహణ వంటి అధునాతన నెట్వర్కింగ్ కార్యకలాపాలు కాక్పిట్ యాప్ ద్వారా అందించబడతాయి" #: plinth/modules/networks/templates/router_configuration_content.html:10 -#, fuzzy, python-format -#| msgid "%(box_name)s is up to date." +#, python-format msgid "Setup %(box_name)s Behind a Router" -msgstr "%(box_name)s తాజాగా ఉంది." +msgstr "రూటర్ వెనుక %(box_name)sని సెటప్ చేయండి" #: plinth/modules/networks/templates/router_configuration_content.html:16 #, python-format @@ -4364,6 +4349,8 @@ msgid "" "Your %(box_name)s gets its internet connection from your router via Wi-Fi or " "Ethernet cable. This is a typical home setup." msgstr "" +"Wi-Fi లేదా ఈథర్నెట్ కేబుల్ ద్వారా మీ రూటర్ నుండి మీ %(box_name)s ఇంటర్నెట్ కనెక్షన్ని పొందుతుంది. " +"ఇది సాధారణ ఇంటి సెటప్." #: plinth/modules/networks/templates/router_configuration_content.html:23 #, python-format @@ -4373,6 +4360,8 @@ msgid "" "configured to forward all traffic it receives so that %(box_name)s provides " "the services." msgstr "" +"ఈ సెటప్తో, మీ %(box_name)sని చేరుకోవడానికి ఇంటర్నెట్లోని ఏదైనా పరికరం మీ రూటర్ ద్వారా వెళ్లాలి. " +"%(box_name)s సేవలను అందజేసేలా రౌటర్ మొత్తం ట్రాఫిక్ను ఫార్వార్డ్ చేయడానికి కాన్ఫిగర్ చేయబడాలి." #: plinth/modules/networks/templates/router_configuration_content.html:32 msgid "" @@ -4381,16 +4370,21 @@ msgid "" "address' option in Internet connection type selection." msgstr "" +"మీ రూటర్పై మీకు నియంత్రణ లేకపోతే, దాన్ని కాన్ఫిగర్ చేయకూడదని ఎంచుకోండి. ఈ పరిమితిని అధిగమించడానికి " +"ఎంపికలను చూడటానికి, ఇంటర్నెట్ కనెక్షన్ రకం ఎంపికలో 'నాకు పబ్లిక్ IP చిరునామా లేదు' ఎంపికను ఎంచుకోండి." #: plinth/modules/networks/templates/router_configuration_content.html:39 msgid "Choose How You Wish to Configure Your Router" -msgstr "" +msgstr "మీరు మీ రూటర్ను ఎలా కాన్ఫిగర్ చేయాలనుకుంటున్నారో ఎంచుకోండి" #: plinth/modules/networks/templates/router_configuration_content.html:42 msgid "" "You will need to login to your router's administration console provided by " "the router. This may look like one of the following:" msgstr "" +"మీరు రూటర్ అందించిన మీ రూటర్ యొక్క అడ్మినిస్ట్రేషన్ కన్సోల్కు లాగిన్ అవ్వాలి. ఇది క్రింది వాటిలో ఒకటి లాగా " +"ఉండవచ్చు:" #: plinth/modules/networks/templates/router_configuration_content.html:54 msgid "" @@ -4401,202 +4395,164 @@ msgid "" "model number and search online for the router's manual. This will provide " "full instructions on how to perform this task." msgstr "" +"మీరు మొదట రూటర్ని సెటప్ చేసినప్పుడు వినియోగదారు పేరు మరియు password మీచే కాన్ఫిగర్ చేయబడుతుంది. అనేక " +"రౌటర్ల కోసం, ఈ సమాచారం రౌటర్ వెనుక భాగంలో ముద్రించబడుతుంది. మీకు రూటర్ యొక్క ఆధారాలు లేదా IP " +"చిరునామా గుర్తులేకపోతే, మీరు దాన్ని రీసెట్ చేసి తాజాగా సెటప్ చేయాలని నిర్ణయించుకోవచ్చు. మీ రౌటర్ మోడల్ నంబర్ని " +"శోధించండి మరియు రూటర్ మాన్యువల్ కోసం ఆన్లైన్లో శోధించండి. ఈ పనిని ఎలా నిర్వహించాలో ఇది పూర్తి సూచనలను " +"అందిస్తుంది." #: plinth/modules/networks/views.py:27 -#, fuzzy -#| msgid "Disabled" msgid "disabled" msgstr "నిలిపివేయబడింది" #: plinth/modules/networks/views.py:28 -#, fuzzy msgid "automatic" msgstr "స్వయంచాలక" #: plinth/modules/networks/views.py:29 -#, fuzzy -#| msgid "Manual" msgid "manual" msgstr "కరదీపిక" #: plinth/modules/networks/views.py:30 -#, fuzzy -#| msgid "Shared" msgid "shared" -msgstr "పంచుకోబడ్డ" +msgstr "పంచుకున్నారు" #: plinth/modules/networks/views.py:31 msgid "link-local" -msgstr "" +msgstr "లింక్-స్థానిక" #: plinth/modules/networks/views.py:37 plinth/modules/networks/views.py:98 #: plinth/modules/networks/views.py:109 msgid "unknown" -msgstr "" +msgstr "తెలియని" #: plinth/modules/networks/views.py:38 -#, fuzzy -#| msgid "Manage" msgid "unmanaged" -msgstr "నిర్వహించండి" +msgstr "నిర్వహించబడలేదు" #: plinth/modules/networks/views.py:39 -#, fuzzy -#| msgid "Available Domains" msgid "unavailable" -msgstr "అందుబాటులో ఉన్న డొమైన్లు" +msgstr "అందుబాటులో లేదు" #: plinth/modules/networks/views.py:40 -#, fuzzy -#| msgid "cable is connected" msgid "disconnected" -msgstr "కేబుల్ అనుసంధానించబడిన" +msgstr "కేబుల్ తొలగించడం" #: plinth/modules/networks/views.py:41 -#, fuzzy msgid "preparing" -msgstr "ఫైలు సమకాలీకరించబడుచున్నధి" +msgstr "సిద్ధమవుతున్నారు" #: plinth/modules/networks/views.py:42 -#, fuzzy -#| msgid "Connection" msgid "connecting" msgstr "అనుసంధానం" #: plinth/modules/networks/views.py:43 -#, fuzzy -#| msgid "Use HTTP basic authentication" msgid "needs authentication" -msgstr "HTTP ప్రాథమిక ప్రమాణీకరణ ఉపయోగించు" +msgstr "ప్రమాణీకరణ అవసరం" #: plinth/modules/networks/views.py:44 msgid "requesting address" -msgstr "" +msgstr "చిరునామాను అభ్యర్థిస్తోంది" #: plinth/modules/networks/views.py:45 msgid "checking" -msgstr "" +msgstr "తనిఖీ చేస్తోంది" #: plinth/modules/networks/views.py:46 msgid "waiting for secondary" -msgstr "" +msgstr "ద్వితీయ కోసం వేచి ఉంది" #: plinth/modules/networks/views.py:47 -#, fuzzy -#| msgid "Deactivate" msgid "activated" msgstr "క్రియారహితం చేయి" #: plinth/modules/networks/views.py:48 -#, fuzzy -#| msgid "Deactivate" msgid "deactivating" -msgstr "క్రియారహితం చేయి" +msgstr "నిష్క్రియం చేస్తోంది" #: plinth/modules/networks/views.py:56 -#, fuzzy -#| msgid "State reason" msgid "no reason" -msgstr "స్థితి కారణాం" +msgstr "కారణం లేదు" #: plinth/modules/networks/views.py:58 msgid "unknown error" -msgstr "" +msgstr "అపరిచిత దోషం" #: plinth/modules/networks/views.py:60 -#, fuzzy -#| msgid "Mumble server is not running" msgid "device is now managed" -msgstr "మంబ్లు సేవిక నడవంలేదు" +msgstr "పరికరం ఇప్పుడు నిర్వహించబడుతుంది" #: plinth/modules/networks/views.py:62 -#, fuzzy -#| msgid "Mumble server is not running" msgid "device is now unmanaged" -msgstr "మంబ్లు సేవిక నడవంలేదు" +msgstr "పరికరం ఇప్పుడు నిర్వహించబడలేదు" #: plinth/modules/networks/views.py:64 -#, fuzzy -#| msgid "configuration file: {file}" msgid "configuration failed" -msgstr "ఆకృతీకరణ ఫైలు: {file}" +msgstr "కాన్ఫిగరేషన్ విఫలమైంది" #: plinth/modules/networks/views.py:66 msgid "secrets required" -msgstr "" +msgstr "రహస్యాలు అవసరం" #: plinth/modules/networks/views.py:68 msgid "DHCP client failed to start" -msgstr "" +msgstr "DHCP క్లయింట్ ప్రారంభించడంలో విఫలమైంది" #: plinth/modules/networks/views.py:70 msgid "DHCP client error" -msgstr "" +msgstr "DHCP క్లయింట్ లోపం" #: plinth/modules/networks/views.py:72 -#, fuzzy -#| msgid "{name} deleted." msgid "DHCP client failed" -msgstr "{name} తొలగించబడింది." +msgstr "DHCP క్లయింట్ విఫలమైంది" #: plinth/modules/networks/views.py:74 msgid "shared connection service failed to start" -msgstr "" +msgstr "భాగస్వామ్య కనెక్షన్ సేవ ప్రారంభించడంలో విఫలమైంది" #: plinth/modules/networks/views.py:76 -#, fuzzy -#| msgid "Internet connection type saved." msgid "shared connection service failed" -msgstr "ఇంటర్నెట్ కనెక్షన్ రకం సేవ్ చేయబడింది." +msgstr "భాగస్వామ్య కనెక్షన్ సేవ విఫలమైంది" #: plinth/modules/networks/views.py:78 -#, fuzzy msgid "device was removed" -msgstr "ఈ సేవ ఇప్పటికే ఉంది" +msgstr "పరికరం తీసివేయబడింది" #: plinth/modules/networks/views.py:80 -#, fuzzy -#| msgid "The device is mounted by another user." msgid "device disconnected by user" -msgstr "పరికరం మరొక వినియోగదారుచే మౌంట్ చేయబడింది." +msgstr "వినియోగదారు ద్వారా పరికరం తొలగించవేయబడింది" #: plinth/modules/networks/views.py:82 msgid "a dependency of the connection failed" -msgstr "" +msgstr "బంధం యొక్క ఆధారపడటం విఫలమైంది" #: plinth/modules/networks/views.py:84 -#, fuzzy -#| msgid "Client not found" msgid "Wi-Fi network not found" -msgstr "క్లయింట్ దొరకలేదు" +msgstr "Wi-Fi నెట్వర్క్ కనుగొనబడలేదు" #: plinth/modules/networks/views.py:86 msgid "a secondary connection failed" -msgstr "" +msgstr "ద్వితీయ కనెక్షన్ విఫలమైంది" #: plinth/modules/networks/views.py:88 msgid "new connection activation was enqueued" -msgstr "" +msgstr "కొత్త కనెక్షన్ యాక్టివేషన్ క్యూలో ఉంది" #: plinth/modules/networks/views.py:90 msgid "a duplicate IP address was detected" -msgstr "" +msgstr "నకిలీ IP చిరునామా కనుగొనబడింది" #: plinth/modules/networks/views.py:92 msgid "selected IP method is not supported" -msgstr "" +msgstr "ఎంచుకున్న IP పద్ధతికి మద్దతు లేదు" #: plinth/modules/networks/views.py:101 -#, fuzzy -#| msgid "Generic" msgid "generic" msgstr "సాధారణమైన" #: plinth/modules/networks/views.py:102 -#, fuzzy -#| msgid "Interface" msgid "TUN or TAP interface" -msgstr "అంతర్ముఖం" +msgstr "TUN లేదా TAP సంవిధానం" #: plinth/modules/networks/views.py:103 plinth/modules/wireguard/__init__.py:49 #: plinth/modules/wireguard/manifest.py:14 @@ -4604,25 +4560,18 @@ msgid "WireGuard" msgstr "వైర్గార్డ్" #: plinth/modules/networks/views.py:110 -#, fuzzy msgid "ad-hoc" -msgstr "తదర్థ" +msgstr "తాత్కాలిక" #: plinth/modules/networks/views.py:111 -#, fuzzy -#| msgid "Infrastructure" msgid "infrastructure" -msgstr "ఇన్ఫ్రాస్ట్రక్చర్" +msgstr "మౌలిక సదుపాయాలు" #: plinth/modules/networks/views.py:112 -#, fuzzy -#| msgid "Access Point" msgid "access point" -msgstr "ప్రాప్తి సూచి" +msgstr "సాంగత్యం సూచి" #: plinth/modules/networks/views.py:113 -#, fuzzy -#| msgid "Access Point" msgid "mesh point" msgstr "ప్రాప్తి సూచి" @@ -4670,10 +4619,8 @@ msgid "Failed to de-activate connection: Connection not found." msgstr "అనుసంధానం క్రియారహితం విఫలమైంది: అనుసంధానం దొరకలేదు." #: plinth/modules/networks/views.py:411 -#, fuzzy -#| msgid "Adding New Ethernet Connection" msgid "Adding New Generic Connection" -msgstr "కొత్త ఈథర్నెట్ అనుసంధానాన్ని కలుపుతోంది" +msgstr "కొత్త జెనరిక్ కనెక్షన్ని జోడిస్తోంది" #: plinth/modules/networks/views.py:429 msgid "Adding New Ethernet Connection" @@ -4697,7 +4644,7 @@ msgid "Failed to delete connection: Connection not found." msgstr "అనుసంధానం తొలగించడం విఫలమైంది: అనుసంధానం దొరకలేదు." #: plinth/modules/openvpn/__init__.py:25 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " "devices in order to access resources of a private network. While you are " @@ -4713,16 +4660,12 @@ msgstr "" "అనామకత్వం కోసం." #: plinth/modules/openvpn/__init__.py:55 -#, fuzzy -#| msgid "Connection Type" msgid "Connect to VPN services" -msgstr "అనుసంధాన రకం" +msgstr "అనుసంధాన రకం విపిన్ సేవలకు" #: plinth/modules/openvpn/__init__.py:58 plinth/modules/openvpn/manifest.py:17 -#, fuzzy -#| msgid "Open" msgid "OpenVPN" -msgstr "తెరచిన" +msgstr "తెరచిన విపిన్" #: plinth/modules/openvpn/__init__.py:59 #: plinth/modules/wireguard/__init__.py:51 @@ -4738,11 +4681,11 @@ msgstr "" #: plinth/modules/openvpn/manifest.py:52 msgid "Tunnelblick" -msgstr "" +msgstr "టన్నెల్బ్లిక్" #: plinth/modules/openvpn/templates/migrate_to_ecc.html:7 msgid "Migrate to ECC" -msgstr "" +msgstr "ECCకి మైగ్రేట్ చేయండి" #: plinth/modules/openvpn/templates/migrate_to_ecc.html:10 msgid "" @@ -4751,6 +4694,9 @@ msgid "" "security. This operation is irreversible. It should only take a few minutes " "on most single board computers." msgstr "" +"మీ OpenVPN ఇన్స్టాలేషన్ ప్రస్తుతం RSAని ఉపయోగిస్తోంది. ఆధునిక ఎలిప్టిక్ కర్వ్ క్రిప్టోగ్రఫీకి మారడం కనెక్షన్ " +"మరియు భద్రతను ఏర్పాటు చేసే వేగాన్ని మెరుగుపరుస్తుంది. ఈ ఆపరేషన్ కోలుకోలేనిది. చాలా సింగిల్ బోర్డ్ " +"కంప్యూటర్లలో దీనికి కొన్ని నిమిషాలు మాత్రమే పడుతుంది." #: plinth/modules/openvpn/templates/migrate_to_ecc.html:19 #, python-format @@ -4758,6 +4704,8 @@ msgid "" "All new installations of OpenVPN on %(box_name)s will use ECC by default. We " "recommend migrating as soon as possible." msgstr "" +"%(box_name)sలో OpenVPN యొక్క అన్ని కొత్త ఇన్స్టాలేషన్లు డిఫాల్ట్గా ECCని ఉపయోగిస్తాయి. వీలైనంత త్వరగా " +"వలస వెళ్లాలని మేము సిఫార్సు చేస్తున్నాము." #: plinth/modules/openvpn/templates/migrate_to_ecc.html:26 #, python-format @@ -4767,12 +4715,13 @@ msgid "" "profiles. OpenVPN clients compatible with ECC should be used to connect to " "this server." msgstr "" +"హెచ్చరిక: ఈ ఆపరేషన్ ద్వారా ఇప్పటికే ఉన్న క్లయింట్ ప్రొఫైల్లు చెల్లుబాటు కావు. %(box_name)sలోని " +"OpenVPN వినియోగదారులందరూ తప్పనిసరిగా వారి కొత్త ప్రొఫైల్లను డౌన్లోడ్ చేసుకోవాలి. ఈ సర్వర్కి కనెక్ట్ చేయడానికి " +"ECCకి అనుకూలమైన OpenVPN క్లయింట్లను ఉపయోగించాలి." #: plinth/modules/openvpn/templates/migrate_to_ecc.html:38 -#, fuzzy -#| msgid "Moderate" msgid "Migrate" -msgstr "మితమైన" +msgstr "మోడిగ్రేట్ చేయండి" #: plinth/modules/openvpn/templates/openvpn.html:22 msgid "Profile" @@ -4786,11 +4735,11 @@ msgid "" "available for most platforms. Click \"Learn more...\" above for recommended " "clients and instructions on how to configure them." msgstr "" -"% (Box_name) లు 1 యొక్క VPN కనెక్ట్, మీరు ఒక ప్రొఫైల్ డౌన్లోడ్ మరియు మీ మొబైల్ లేదా డెస్క్టాప్ మిషన్పై " -"OpenVPN క్లయింట్ ఆహారం అవసరం. OpenVPN క్లయింట్లు అత్యంత వేదికలపై అందుబాటులో ఉన్నాయి. 2documentation 3 title=\"%(box_name)s ఆకృతీకరించుటకు ఎలా సిఫార్సు " -"ఖాతాదారులకు మరియు సూచనలతో వాటిని." +"బాక్స్_నామలు 1 యొక్క విపిన్ కనెక్ట్, మీరు ఒక ప్రొఫైల్ డౌన్లోడ్ మరియు మీ మొబైల్ లేదా డెస్క్టాప్ మిషన్పై ఓపెన్ప్ప్న్ " +"క్లయింట్ ఆహారం అవసరం. ఓపెన్ప్ప్న్ క్లయింట్లు అత్యంత వేదికలపై అందుబాటులో ఉన్నాయి. &ల్టీ;a చూడండి " +"హార్ఫ్=\"హెట్ప్స్: //వికీ.డెబియన్.ఆర్గ్/ఫ్రిఏడొంబోస్/మానుల్/ఓపెంపునఁ\" మాన్యువల్-ఓపెన్ప్ప్న్\"&జీత్; " +"2డాక్యుమెంటేషన్ &ల్టీ;/ఆ&జీత్; 3 టైటిల్=\"%బావీ క్స్_నామ ఆకృతీకరించుటకు ఎలా సిఫార్సు " +"ఖాతాదారులకు మరియు సూచనలతో వాటిని. %(box_name)s" #: plinth/modules/openvpn/templates/openvpn.html:35 #, python-format @@ -4802,98 +4751,82 @@ msgid "Download my profile" msgstr "నా స్థూలవివరంల దిగుమతి" #: plinth/modules/pagekite/__init__.py:21 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " "direct connection to the Internet. You only need this if your {box_name} " "services are unreachable from the rest of the Internet. This includes the " "following situations:" msgstr "" -"PageKite {box_name} 1 సేవలను పరిచయం చేస్తూ మీరు ఇంటర్నెట్ కు ఒక ప్రత్యక్ష సంబంధం కలిగి " -"లేనప్పుడు కోసం ఒక వ్యవస్థ. మీ {box_name} 2 సేవలు ఇంటర్నెట్ మిగిలిన నుండి అందుబాటులో ఉంటే మీరు " -"మాత్రమే ఈ అవసరం. ఈ క్రింది సందర్భాలలో కలిగి:" +"PageKite అనేది మీకు ఇంటర్నెట్కి ప్రత్యక్ష కనెక్షన్ లేనప్పుడు {box_name} సేవలను బహిర్గతం చేసే " +"వ్యవస్థ. మీ {box_name} సేవలు మిగిలిన ఇంటర్నెట్లో అందుబాటులో లేనట్లయితే మాత్రమే మీకు ఇది అవసరం. ఇది " +"క్రింది పరిస్థితులను కలిగి ఉంటుంది:" #: plinth/modules/pagekite/__init__.py:26 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{box_name} is behind a restricted firewall." -msgstr "{Box_name} 1 నిరోధిత ఫైర్వాల్ వెనుక ఉంది." +msgstr "{box_name} పరిమితం చేయబడిన ఫైర్వాల్ వెనుక ఉంది." #: plinth/modules/pagekite/__init__.py:29 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." -msgstr "{Box_name} 1 మీరు నియంత్రించే లేని ఒక (వైర్లెస్) రౌటర్ అనుసంధానించబడిన." +msgstr "{box_name} మీరు నియంత్రించని (వైర్లెస్) రూటర్కి బందించబడింది ." #: plinth/modules/pagekite/__init__.py:31 -#, fuzzy msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -"మీ ISP మీరు ఒక బాహ్య IP చిరునామా అందించడం లేదు మరియు బదులుగా NAT ద్వారా ఇంటర్నెట్ కనెక్షన్ " -"అందిస్తుంది." +"మీ ISP మీకు బాహ్య IP చిరునామాను అందించదు మరియు బదులుగా NAT ద్వారా ఇంటర్నెట్ కనెక్షన్ని అందిస్తుంది." #: plinth/modules/pagekite/__init__.py:33 -#, fuzzy msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -"మీ ISP మీరు స్టాటిక్ IP చిరునామా అందించడం లేదు మరియు మీ IP చిరునామా మీరు ఇంటర్నెట్ కు కనెక్ట్ ప్రతి " -"సమయ మార్పులు." +"మీ ISP మీకు స్టాటిక్ IP చిరునామాను అందించదు మరియు మీరు ఇంటర్నెట్కి కనెక్ట్ అయిన ప్రతిసారీ మీ IP చిరునామా " +"మారుతుంది." #: plinth/modules/pagekite/__init__.py:35 -#, fuzzy msgid "Your ISP limits incoming connections." -msgstr "మీ ISP ఇన్కమింగ్ కనెక్షన్లను పరిమితం చేస్తుంది." +msgstr "మీ ISP ఇన్కమింగ్ కనెక్షన్లను పరిమితం చేస్తుంది." #: plinth/modules/pagekite/__init__.py:37 -#, fuzzy, python-brace-format -#| msgid "" -#| "PageKite works around NAT, firewalls and IP-address limitations by using " -#| "a combination of tunnels and reverse proxies. You can use any pagekite " -#| "service provider, for example pagekite." -#| "net. In future it might be possible to use your buddy's {box_name} " -#| "for this." +#, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " "combination of tunnels and reverse proxies. You can use any pagekite service " "provider, for example pagekite.net. In " "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -"PageKite సొరంగాలు కలయిక ఉపయోగించి మరియు ప్రతినిధులను రివర్స్ ద్వారా NAT, ఫైర్వాల్లు మరియు IP- " -"చిరునామా పరిమితులు చుట్టూ పనిచేస్తుంది. మీరు . భవిష్యత్లో ఇది ఈ కోసం మీ స్నేహితుని యొక్క {box_name} " -"ఉపయోగించడానికి 3 సాధ్యం కావచ్చు ఉదాహరణకు pagekite." -"net కోసం, ఏ pagekite సేవా ప్రదాత ఉపయోగించవచ్చు." +"టన్నెల్స్ మరియు రివర్స్ ప్రాక్సీల కలయికను ఉపయోగించడం ద్వారా PageKite NAT, ఫైర్వాల్లు మరియు IP చిరునామా " +"పరిమితుల చుట్టూ పని చేస్తుంది. మీరు ఏదైనా పేజ్కైట్ సర్వీస్ ప్రొవైడర్ని ఉపయోగించవచ్చు, ఉదాహరణకు pagekite.net. భవిష్యత్తులో దీని కోసం మీ స్నేహితుని " +"{box_name}ని ఉపయోగించడం సాధ్యమవుతుంది." #: plinth/modules/pagekite/__init__.py:63 -#, fuzzy -#| msgid "Pagekite" msgid "PageKite" -msgstr "పేజ్ కైట్" +msgstr "పేజ్కైట్" #: plinth/modules/pagekite/__init__.py:64 -#, fuzzy msgid "Public Visibility" -msgstr "పబ్లిక్ దృష్టి గోచరత (PageKite)" +msgstr "ప్రజా దృశ్యమానం" #: plinth/modules/pagekite/__init__.py:77 -#, fuzzy msgid "PageKite Domain" -msgstr "PageKite ఖాతా" +msgstr "పేజ్కైట్ అధికారక్షేత్రం" #: plinth/modules/pagekite/forms.py:32 -#, fuzzy msgid "Server domain" -msgstr "సర్వర్ డొమైన్" +msgstr "సర్వర్ అధికారక్షేత్రం" #: plinth/modules/pagekite/forms.py:34 -#, fuzzy msgid "" "Select your pagekite server. Set \"pagekite.net\" to use the default " "pagekite.net server." msgstr "" -"మీ pagekite సర్వర్ ఎంచుకోండి. డిఫాల్ట్ pagekite.net సర్వర్ ఉపయోగించడానికి \"pagekite.net\" " -"సెట్." +"మీ పేజ్కైట్ సర్వర్ని ఎంచుకోండి. డిఫాల్ట్ pagekite.net సర్వర్ని ఉపయోగించడానికి \"pagekite.net\"ని సెట్ " +"చేయండి." #: plinth/modules/pagekite/forms.py:37 plinth/modules/shadowsocks/forms.py:40 msgid "Server port" @@ -4920,11 +4853,11 @@ msgid "Kite secret" msgstr "కైట్ రహస్యము" #: plinth/modules/pagekite/forms.py:48 -#, fuzzy msgid "" "A secret associated with the kite or the default secret for your account if " "no secret is set on the kite." -msgstr "గాలిపటం లేదా రహస్యం గాలిపటం సెట్ అయితే మీ ఖాతా కోసం డిఫాల్ట్ రహస్య అనుబంధించబడిన ఒక రహస్య." +msgstr "" +"గాలిపటంతో అనుబంధించబడిన రహస్యం లేదా గాలిపటంపై రహస్యం ఏదీ సెట్ చేయకుంటే మీ ఖాతా కోసం డిఫాల్ట్ రహస్యం." #: plinth/modules/pagekite/forms.py:88 msgid "protocol" @@ -4943,35 +4876,29 @@ msgid "Enable Subdomains" msgstr "సబ్డొమైన్లు క్రియాశీలీకరించు" #: plinth/modules/pagekite/forms.py:130 -#, fuzzy msgid "Deleted custom service" -msgstr "తొలగించినవి కస్టమ్ సేవ" +msgstr "కస్టమ్ సర్వీస్ తొలగించబడింది" #: plinth/modules/pagekite/forms.py:164 -#, fuzzy msgid "This service is already available as a standard service." -msgstr "" -"ఈ సేవను ప్రమాణం సేవగా అందుబాటులో ఉంది. దయచేసి దాన్ని ఎనేబుల్ \"ప్రామాణిక సేవలు\" పేజీ ఉపయోగించడానికి." +msgstr "ఈ సేవ ఇప్పటికే ప్రామాణిక సేవగా అందుబాటులో ఉంది." #: plinth/modules/pagekite/forms.py:172 -#, fuzzy msgid "Added custom service" -msgstr "కస్టమ్ సేవ చేర్చబడింది" +msgstr "అనుకూల సేవ జోడించబడింది" #: plinth/modules/pagekite/forms.py:175 msgid "This service already exists" msgstr "ఈ సేవ ఇప్పటికే ఉంది" #: plinth/modules/pagekite/templates/pagekite_configure.html:13 -#, fuzzy msgid "Custom Services" msgstr "కస్టమ్ సేవలు" #: plinth/modules/pagekite/templates/pagekite_configure.html:17 #: plinth/modules/pagekite/templates/pagekite_configure.html:19 -#, fuzzy msgid "Add Custom Service" -msgstr "కస్టమ్ సేవలు" +msgstr "అనుకూల సేవను జోడించండి" #: plinth/modules/pagekite/templates/pagekite_configure.html:35 #, python-format @@ -4984,9 +4911,8 @@ msgstr "ఈ సేవను తొలగించు" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:11 #: plinth/modules/pagekite/views.py:34 -#, fuzzy msgid "Add custom PageKite service" -msgstr "కస్టమ్ సేవ చేర్చబడింది" +msgstr "అనుకూల పేజ్కైట్ సేవను జోడించండి" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:14 msgid "" @@ -5030,7 +4956,7 @@ msgstr "" #: plinth/modules/performance/__init__.py:16 #: plinth/modules/performance/__init__.py:42 msgid "Performance" -msgstr "" +msgstr "ప్రదర్శన" #: plinth/modules/performance/__init__.py:19 msgid "" @@ -5038,18 +4964,19 @@ msgid "" "utilization of the hardware. This can give you basic insights into usage " "patterns and whether the hardware is overloaded by users and services." msgstr "" +"పనితీరు అనువర్తనం హార్డ్వేర్ వినియోగం గురించి సమాచారాన్ని సేకరించడానికి, నిల్వ చేయడానికి మరియు వీక్షించడానికి " +"మిమ్మల్ని అనుమతిస్తుంది. ఇది మీకు వినియోగ నమూనాలు మరియు హార్డ్వేర్ వినియోగదారులు మరియు సేవల ద్వారా ఓవర్లోడ్ " +"చేయబడిందా అనే దాని గురించి ప్రాథమిక అంతర్దృష్టులను అందిస్తుంది." #: plinth/modules/performance/__init__.py:23 msgid "" "Performance metrics are collected by Performance Co-Pilot and can be viewed " "using the Cockpit app." -msgstr "" +msgstr "పనితీరు కొలమానాలు పనితీరు కో-పైలట్ ద్వారా సేకరించబడతాయి మరియు కాక్పిట్ యాప్ని ఉపయోగించి వీక్షించవచ్చు." #: plinth/modules/performance/__init__.py:43 -#, fuzzy -#| msgid "System Configuration" msgid "System Monitoring" -msgstr "వ్యవస్థ రూపశిల్పం" +msgstr "వ్యవస్థ దర్శినికరణ" #: plinth/modules/power/__init__.py:14 msgid "Restart or shut down the system." @@ -5073,10 +5000,8 @@ msgid "Restart" msgstr "పునఃప్రారంభించండి" #: plinth/modules/power/templates/power.html:25 -#, fuzzy -#| msgid "Shut Down Now" msgid "Shut Down" -msgstr "ఇపుడు మూసివేయండి" +msgstr "మూసివేయండి" #: plinth/modules/power/templates/power_restart.html:17 msgid "" @@ -5166,6 +5091,11 @@ msgid "" "one or more Quassel clients from a desktop or a mobile can be used to " "connect and disconnect from it." msgstr "" +"క్వాసెల్ అనేది IRC అప్లికేషన్, ఇది \"కోర్\" మరియు \"క్లయింట్\" అనే రెండు భాగాలుగా విభజించబడింది. ఇది " +"కోర్ని IRC సర్వర్లకు కనెక్ట్ చేయడానికి మరియు క్లయింట్ డిస్కనెక్ట్ చేయబడినప్పటికీ సందేశాలను స్వీకరించడాన్ని " +"కొనసాగించడానికి అనుమతిస్తుంది. {box_name} మిమ్మల్ని ఎల్లప్పుడూ ఆన్లైన్లో ఉంచేలా Quassel కోర్ సేవను " +"అమలు చేయగలదు మరియు డెస్క్టాప్ లేదా మొబైల్ నుండి ఒకటి లేదా అంతకంటే ఎక్కువ క్వాసెల్ క్లయింట్లను కనెక్ట్ " +"చేయడానికి మరియు డిస్కనెక్ట్ చేయడానికి ఉపయోగించవచ్చు." #: plinth/modules/quassel/__init__.py:34 msgid "" @@ -5174,6 +5104,10 @@ msgid "" "downloads\">desktop and mobile devices are available." msgstr "" +"మీరు డిఫాల్ట్ Quassel పోర్ట్ 4242లో మీ Quassel కోర్కి కనెక్ట్ చేయవచ్చు. క్లయింట్లు మీ డెస్క్టాప్ మరియు మొబైల్ పరికరాలు అందుబాటులో " +"ఉన్నాయి." #: plinth/modules/quassel/__init__.py:56 plinth/modules/quassel/manifest.py:9 msgid "Quassel" @@ -5196,10 +5130,10 @@ msgid "" "application is needed. Radicale can be accessed by any user with a " "{box_name} login." msgstr "" -"రాడికల్ అనేది CalDAV మరియు CardDAV సర్వర్.ఇది సిన్క్రోనైజేషన్ మరియు షెడ్యూలింగ్ మరియు సంప్రదింపు డేటా " -"యొక్క భాగస్వామ్యాన్ని అనుమతిస్తుంది.రాడికల్ ను వాడటానికి supported client application అవసరం.\n" -"రాడికల్ ఏ యూజర్ అయినా {box_name}లాగిన్ తో యాక్సెస్ చేయవచ్చు" +"రాడికల్ అనేది కాల్డప్మరియు కార్డ్డిఎవిసర్వర్.ఇది సిన్క్రోనైజేషన్ మరియు షెడ్యూలింగ్ మరియు సంప్రదింపు డేటా యొక్క " +"భాగస్వామ్యాన్ని అనుమతిస్తుంది.రాడికల్ ను వాడటానికి &ల్టీ ;ఆ హార్ఫ్=\"హ్త్త్ప్://రాడికల్.ఆర్గ్/క్లైంట్స్/" +"\"&జిత్ ;మద్దతు ఉన్న క్లయింట్ అప్లికేషన్&ల్టీ ;/ఆ &జిత్; అవసరం.\n" +"రాడికల్ ఏ యూజర్ అయినా బాక్స్_నామలాగిన్ తో యాక్సెస్ చేయవచ్చు {box_name}" #: plinth/modules/radicale/__init__.py:31 msgid "" @@ -5207,6 +5141,9 @@ msgid "" "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" +"Radicale ప్రాథమిక వెబ్ ఇంటర్ఫేస్ను అందిస్తుంది, ఇది కొత్త క్యాలెండర్లు మరియు అడ్రస్బుక్లను " +"రూపొందించడానికి మాత్రమే మద్దతు ఇస్తుంది. ఈవెంట్లు లేదా పరిచయాలను జోడించడానికి ఇది మద్దతు ఇవ్వదు, ఇది " +"ప్రత్యేక క్లయింట్ని ఉపయోగించి చేయాలి." #: plinth/modules/radicale/__init__.py:55 #: plinth/modules/radicale/manifest.py:74 @@ -5223,28 +5160,25 @@ msgstr "క్యాలెండర్ / ఆడ్రస్ బుక్ యజ #: plinth/modules/radicale/forms.py:18 #, fuzzy, python-brace-format -#| msgid "" -#| "Any user can view any calendar/addressbook, but only the owner can make " -#| "changes." msgid "" "Any user with a {box_name} login can view any calendar/addressbook, but only " "the owner can make changes." msgstr "" -"ఏ వినియోగదారుడు అయినా క్యాలెండరు /ఆడ్రస్ బుక్ ని చూడవచ్చు, కానీ కేవలం యజమాని మాత్రమే మార్పులు చేయగలరు." +"బాక్స్_నామ లాగిన్ ఉన్న ఏ వినియోగదారు అయినా ఏదైనా క్యాలెండర్/చిరునామా పుస్తకాన్ని వీక్షించగలరు, కానీ యజమాని " +"మాత్రమే మార్పులు చేయగలరు. {box_name}" #: plinth/modules/radicale/forms.py:23 #, fuzzy, python-brace-format -#| msgid "Any user can view or make changes to any calendar/addressbook." msgid "" "Any user with a {box_name} login can view or make changes to any calendar/" "addressbook." -msgstr "ఏ వినియోగదారుడు అయినా క్యాలెండరు /ఆడ్రస్ బుక్ ని చూడగలరు లేదా మార్పులు చేయగలరు." +msgstr "" +"బాక్స్_నామలాగిన్ ఉన్న ఏ వినియోగదారు అయినా ఏదైనా క్యాలెండర్/చిరునామా పుస్తకాన్ని వీక్షించవచ్చు లేదా మార్పులు " +"చేయవచ్చు. {box_name}" #: plinth/modules/radicale/forms.py:30 -#, fuzzy -#| msgid "Access Point" msgid "Access rights" -msgstr "ప్రాప్తి సూచి" +msgstr "సాంగత్యం హక్కులు" #: plinth/modules/radicale/manifest.py:9 msgid "DAVx5" @@ -5256,6 +5190,9 @@ msgid "" "address>) and your user name. DAVx5 will show all existing calendars and " "address books and you can create new." msgstr "" +"రాడికేల్ సర్వర్ యొక్క URL (ఉదా. https://imaps://imap.example.com"
"code>."
msgstr ""
+"imap.example.com వంటి మీ ఇమెయిల్ ప్రొవైడర్ కోసం IMAP సర్వర్ డొమైన్ పేరును "
+"అనుసరించి మీరు యాక్సెస్ చేయాలనుకుంటున్న ఇమెయిల్ ఖాతా యొక్క వినియోగదారు పేరు మరియు పాస్వర్డ్ను అందించడం "
+"ద్వారా మీరు దీన్ని ఉపయోగించవచ్చు. SSL ద్వారా IMAP కోసం (సిఫార్సు చేయబడింది), imaps://imap."
+"example.com వంటి సర్వర్ ఫీల్డ్ను పూరించండి."
#: plinth/modules/roundcube/__init__.py:31
msgid ""
@@ -5316,6 +5259,11 @@ msgid ""
"lesssecureapps\">https://www.google.com/settings/security/lesssecureapps"
"a>)."
msgstr ""
+"జి-తపాలా కోసం, వినియోగదారు పేరు మీ Gmail చిరునామా, పాస్వర్డ్ మీ Google ఖాతా పాస్వర్డ్ మరియు సర్వర్ "
+"imaps://imap.gmail.com అవుతుంది. మీరు మీ Google ఖాతా సెట్టింగ్లలో (https://www."
+"google.comలో \"తక్కువ సురక్షిత యాప్లు\" కూడా ప్రారంభించవలసి ఉంటుందని గుర్తుంచుకోండి /"
+"settings/security/lesssecureapps)."
#: plinth/modules/roundcube/__init__.py:55
msgid "Email Client"
@@ -5323,7 +5271,7 @@ msgstr "ఇమెయిల్ క్లయింట్"
#: plinth/modules/roundcube/forms.py:16
msgid "Use only the local mail server"
-msgstr ""
+msgstr "స్థానిక తపాల సేవికని మాత్రమే ఉపయోగించండి"
#: plinth/modules/roundcube/forms.py:17
#, python-brace-format
@@ -5331,6 +5279,8 @@ msgid ""
"When enabled, text box for server input is removed from login page and users "
"can only read and send mails from this {box_name}."
msgstr ""
+"ప్రారంభించబడినప్పుడు, లాగిన్ పేజీ నుండి సర్వర్ ఇన్పుట్ కోసం టెక్స్ట్ బాక్స్ తీసివేయబడుతుంది మరియు "
+"వినియోగదారులు ఈ {box_name} నుండి మెయిల్లను మాత్రమే చదవగలరు మరియు పంపగలరు."
#: plinth/modules/samba/__init__.py:27
msgid ""
@@ -5348,6 +5298,9 @@ msgid ""
"\\{hostname} (on Windows) or smb://{hostname}.local (on Linux and Mac). "
"There are three types of shares you can choose from: "
msgstr ""
+"ఇన్స్టాలేషన్ తర్వాత, భాగస్వామ్యం కోసం ఏ డిస్క్లను ఉపయోగించాలో మీరు ఎంచుకోవచ్చు. ప్రారంభించబడిన షేర్లను మీ "
+"కంప్యూటర్లోని ఫైల్ మేనేజర్లో \\\\{hostname} (Windowsలో) లేదా smb://{hostname}.local "
+"(Linux మరియు Macలో) వద్ద యాక్సెస్ చేయవచ్చు. మీరు ఎంచుకోగల మూడు రకాల షేర్లు ఉన్నాయి: "
#: plinth/modules/samba/__init__.py:35
msgid "Open share - accessible to everyone in your local network."
@@ -5378,39 +5331,32 @@ msgid "Samba"
msgstr "సాంబా"
#: plinth/modules/samba/__init__.py:60
-#, fuzzy
-#| msgid "Network Time Server"
msgid "Network File Storage"
-msgstr "అల్లిక సేవిక సమయం"
+msgstr "నెట్వర్క్ దస్త్రంనిల్వ"
#: plinth/modules/samba/manifest.py:14
-#, fuzzy
msgid "Android Samba Client"
-msgstr "ఐ ర్ సి క్లయింట్ (Quassel)"
+msgstr "ఆండ్రాయిడ్ సాంబా క్లయింట్"
#: plinth/modules/samba/manifest.py:27
msgid "Ghost Commander - Samba plugin"
-msgstr ""
+msgstr "ఘోస్ట్ కమాండర్ - సాంబా ప్లగ్ఇన్"
#: plinth/modules/samba/manifest.py:41
msgid "VLC media player"
-msgstr ""
+msgstr "VLC మాద్యమ ప్లేయర్"
-#: plinth/modules/samba/manifest.py:55
-#, fuzzy
-#| msgid "GNOME Calendar"
+#: plinth/modules/samba/manifest.py:60
msgid "GNOME Files"
-msgstr "కేలండర్"
+msgstr "GNOME దస్త్రం"
-#: plinth/modules/samba/manifest.py:67
+#: plinth/modules/samba/manifest.py:72
msgid "Dolphin"
-msgstr ""
+msgstr "డాల్ఫిన్"
#: plinth/modules/samba/templates/samba.html:20
-#, fuzzy
-#| msgid "Shared"
msgid "Shares"
-msgstr "పంచుకోబడ్డ"
+msgstr "భాగస్వామ్యాలు"
#: plinth/modules/samba/templates/samba.html:22
msgid ""
@@ -5431,6 +5377,9 @@ msgid ""
"\"%(storage_url)s\">storage module page and configure access to the "
"shares on the users module page."
msgstr ""
+"మీరు డిస్క్ల గురించి అదనపు సమాచారాన్ని నిల్వ మాడ్యూల్ పేజీలో "
+"కనుగొనవచ్చు మరియు యూజర్లలోని భాగస్వామ్యాలకు ప్రాప్యతను కాన్ఫిగర్ "
+"చేయవచ్చు. /a> మాడ్యూల్ పేజీ."
#: plinth/modules/samba/templates/samba.html:120
msgid "Users who can currently access group and home shares"
@@ -5445,10 +5394,8 @@ msgstr ""
"అవసరం ఉన్న వినియోగదారులు"
#: plinth/modules/samba/templates/samba.html:129
-#, fuzzy
-#| msgid "Available Domains"
msgid "Unavailable Shares"
-msgstr "అందుబాటులో ఉన్న డొమైన్లు"
+msgstr "అందుబాటులో లేని భాగస్వామ్యాలు"
#: plinth/modules/samba/templates/samba.html:131
msgid ""
@@ -5459,64 +5406,46 @@ msgstr ""
"ప్రారంభించబడుతుంది."
#: plinth/modules/samba/templates/samba.html:140
-#, fuzzy
-#| msgid "Shared"
msgid "Share name"
-msgstr "పంచుకోబడ్డ"
+msgstr "భాగస్వామ్యం పేరు"
#: plinth/modules/samba/templates/samba.html:141
-#, fuzzy
-#| msgid "Actions"
msgid "Action"
-msgstr "చర్యలు"
+msgstr "చర్య"
#: plinth/modules/samba/views.py:33
-#, fuzzy
-#| msgid "FreedomBox"
msgid "FreedomBox OS disk"
-msgstr "ఫ్రీడమ్బాక్స్"
+msgstr "ఫ్రీడమ్బాక్స్ OS డిస్క్"
#: plinth/modules/samba/views.py:59 plinth/modules/storage/forms.py:146
-#, fuzzy
-#| msgid "Add Service"
msgid "Open Share"
-msgstr "సేవ జోడించండి"
+msgstr "భాగస్వామ్యాన్ని తెరవండి"
#: plinth/modules/samba/views.py:63 plinth/modules/storage/forms.py:144
-#, fuzzy
-#| msgid "Add Service"
msgid "Group Share"
-msgstr "సేవ జోడించండి"
+msgstr "సమూహం భాగస్వామ్యం"
#: plinth/modules/samba/views.py:67
-#, fuzzy
-#| msgid "Homepage"
msgid "Home Share"
-msgstr "హోంపేజ్"
+msgstr "నివాస భాగస్వామ్యం"
#: plinth/modules/samba/views.py:102
-#, fuzzy
-#| msgid "{name} deleted."
msgid "Share enabled."
-msgstr "{name} తొలగించబడింది."
+msgstr "భాగస్వామ్యం ప్రారంభించబడింది."
#: plinth/modules/samba/views.py:107
-#, fuzzy, python-brace-format
-#| msgid "Error installing application: {error}"
+#, python-brace-format
msgid "Error enabling share: {error_message}"
-msgstr "అనువర్తనం స్థాపించుటలో దోషం: {error}"
+msgstr "భాగస్వామ్యాన్ని ప్రారంభించడంలో లోపం: {error_message}"
#: plinth/modules/samba/views.py:112
-#, fuzzy
-#| msgid "Shared"
msgid "Share disabled."
-msgstr "పంచుకోబడ్డ"
+msgstr "భాగస్వామ్యం నిలిపివేయబడింది."
#: plinth/modules/samba/views.py:117
-#, fuzzy, python-brace-format
-#| msgid "Error installing application: {error}"
+#, python-brace-format
msgid "Error disabling share: {error_message}"
-msgstr "అనువర్తనం స్థాపించుటలో దోషం: {error}"
+msgstr "భాగస్వామ్యాన్ని నిలిపివేయడంలో లోపం: {error_message}"
#: plinth/modules/searx/__init__.py:22
msgid ""
@@ -5599,21 +5528,19 @@ msgstr ""
#: plinth/modules/security/templates/security.html:12
#: plinth/modules/security/templates/security.html:14
-#, fuzzy
-#| msgid "Security"
msgid "Show security report"
-msgstr "భద్రత"
+msgstr "భద్రతా నివేదికను చూపు"
#: plinth/modules/security/templates/security.html:19
#: plinth/modules/upgrades/templates/backports-firstboot.html:11
#: plinth/modules/upgrades/templates/upgrades_configure.html:44
msgid "Frequent Feature Updates"
-msgstr ""
+msgstr "తరచుగా ఫీచర్ అప్డేట్లు"
#: plinth/modules/security/templates/security.html:21
#: plinth/modules/upgrades/templates/upgrades_configure.html:52
msgid "Frequent feature updates are activated."
-msgstr ""
+msgstr "తరచుగా ఫీచర్ అప్డేట్లు యాక్టివేట్ చేయబడింది."
#: plinth/modules/security/templates/security.html:26
#: plinth/modules/upgrades/templates/backports-firstboot.html:14
@@ -5628,13 +5555,16 @@ msgid ""
"Instead, they are maintained by contributors to Debian and the %(box_name)s "
"community."
msgstr ""
+"తరచుగా ఫీచర్ అప్డేట్లు %(box_name)s సర్వీస్తో పాటు చాలా పరిమిత సాఫ్ట్వేర్ సెట్ను కొత్త ఫీచర్లను మరింత "
+"తరచుగా స్వీకరించడానికి అనుమతిస్తాయి (బ్యాక్పోర్ట్ల రిపోజిటరీ నుండి). దీని ఫలితంగా ప్రతి 2 సంవత్సరాలకు ఒకసారి "
+"మాత్రమే కాకుండా, వారాల్లోనే కొన్ని కొత్త ఫీచర్లు అందుతాయి. తరచుగా ఫీచర్ అప్డేట్లు ఉన్న సాఫ్ట్వేర్కు డెబియన్ "
+"సెక్యూరిటీ టీమ్ నుండి మద్దతు లేదని గమనించండి. బదులుగా, అవి డెబియన్ మరియు %(box_name)s కమ్యూనిటీకి "
+"కంట్రిబ్యూటర్లచే నిర్వహించబడతాయి."
#: plinth/modules/security/templates/security_report.html:10
#: plinth/modules/security/views.py:74
-#, fuzzy
-#| msgid "Security"
msgid "Security Report"
-msgstr "భద్రత"
+msgstr "భద్రతా నివేదిక"
#: plinth/modules/security/templates/security_report.html:12
#, python-format
@@ -5642,6 +5572,8 @@ msgid ""
"There are %(count)s reported security vulnerabilities in the FreedomBox app, "
"which provides the core services and user interface for a FreedomBox server."
msgstr ""
+"స్వేచ్చపెట్టే యాప్లో %(count)s భద్రతా లోపాలు నివేదించబడ్డాయి, ఇది స్వేచ్చపెట్టే సర్వర్ కోసం ప్రధాన సేవలు "
+"మరియు వినియోగదారు ఇంటర్ఫేస్ను అందిస్తుంది."
#: plinth/modules/security/templates/security_report.html:19
msgid ""
@@ -5650,6 +5582,9 @@ msgid ""
"vulnerabilities can be found on the Debian Security Bug Tracker."
msgstr ""
+"కింది పట్టిక ప్రతి ఇన్స్టాల్ చేసిన యాప్కు సంబంధించి ప్రస్తుతం నివేదించబడిన భద్రతా దుర్బలత్వాల సంఖ్యను "
+"జాబితా చేస్తుంది. దుర్బలత్వాలపై మరింత సమాచారం డెబియన్ సెక్యూరిటీ బగ్ ట్రాకర్లో కనుగొనవచ్చు."
#: plinth/modules/security/templates/security_report.html:28
msgid ""
@@ -5657,6 +5592,8 @@ msgid ""
"sandboxing features are in use. Sandboxing mitigates the impact of a "
"potentially compromised app to the rest of the system."
msgstr ""
+"సేవలను అందించే యాప్ల కోసం, శాండ్బాక్సింగ్ ఫీచర్లు ఉపయోగంలో ఉన్నాయో లేదో \"శాండ్బాక్స్డ్\" నిలువు వరుస "
+"చూపుతుంది. శాండ్బాక్సింగ్ మిగిలిన సిస్టమ్కు సంభావ్యంగా రాజీపడే యాప్ ప్రభావాన్ని తగ్గిస్తుంది."
#: plinth/modules/security/templates/security_report.html:35
msgid ""
@@ -5664,62 +5601,49 @@ msgid ""
"from the rest of the system. It is only displayed while the service is "
"running."
msgstr ""
+"\"శాండ్బాక్స్ కవరేజ్\" అనేది మిగిలిన సిస్టమ్ నుండి సేవ ఎంత ప్రభావవంతంగా వేరు చేయబడిందనే దాని స్కోర్. సేవ "
+"నడుస్తున్నప్పుడు మాత్రమే ఇది ప్రదర్శించబడుతుంది."
#: plinth/modules/security/templates/security_report.html:45
-#, fuzzy
-#| msgid "Name"
msgid "App Name"
-msgstr "పేరు"
+msgstr "కార్యక్షేత్రం పేరు"
#: plinth/modules/security/templates/security_report.html:46
msgid "Current Vulnerabilities"
msgstr "ప్రస్తుత దుర్బలతలు"
#: plinth/modules/security/templates/security_report.html:47
-#, fuzzy
-#| msgid "Block Sandbox (Minetest)"
msgid "Sandboxed"
-msgstr "స్యాండ్ బాక్స్ ను అడ్డగించు (మైన్ పరీక్ష)"
+msgstr "శాండ్బాక్స్ చేయబడింది"
#: plinth/modules/security/templates/security_report.html:48
-#, fuzzy
-#| msgid "Block Sandbox (Minetest)"
msgid "Sandbox Coverage"
-msgstr "స్యాండ్ బాక్స్ ను అడ్డగించు (మైన్ పరీక్ష)"
+msgstr "శాండ్బాక్స్ కవరేజ్"
#: plinth/modules/security/templates/security_report.html:58
msgid "N/A"
msgstr "N/A"
#: plinth/modules/security/templates/security_report.html:60
-#, fuzzy
-#| msgid "yes"
msgid "Yes"
msgstr "అవును"
#: plinth/modules/security/templates/security_report.html:62
-#, fuzzy
-#| msgid "None"
msgid "No"
msgstr "ఏమీ లేదు"
#: plinth/modules/security/templates/security_report.html:69
-#, fuzzy
-#| msgid "is not running"
msgid "Not running"
-msgstr "డెల్యూజ్ నడవడంలేదు"
+msgstr "పరుగు లేదు"
#: plinth/modules/security/views.py:56
-#, fuzzy, python-brace-format
-#| msgid "Error setting time zone: {exception}"
+#, python-brace-format
msgid "Error setting restricted access: {exception}"
-msgstr "సమయమండలం అమర్పులోపం: {exception}"
+msgstr "నియంత్రిత ప్రాప్యతను సెట్ చేయడంలో లోపం: {exception}"
#: plinth/modules/security/views.py:59
-#, fuzzy
-#| msgid "General Configuration"
msgid "Updated security configuration"
-msgstr "సాధారణ ఆకృతీకరణ"
+msgstr "నవీకరించబడిన భద్రతా ఆకృతీకరణ"
#: plinth/modules/shaarli/__init__.py:18
msgid "Shaarli allows you to save and share bookmarks."
@@ -5730,23 +5654,20 @@ msgid ""
"Note that Shaarli only supports a single user account, which you will need "
"to setup on the initial visit."
msgstr ""
+"శారలి ఒక వినియోగదారు ఖాతాకు మాత్రమే మద్దతు ఇస్తుందని గమనించండి, మీరు ప్రారంభ సందర్శనలో సెటప్ చేయాల్సి "
+"ఉంటుంది."
#: plinth/modules/shaarli/__init__.py:38 plinth/modules/shaarli/manifest.py:25
msgid "Shaarli"
msgstr "షార్లి"
#: plinth/modules/shaarli/__init__.py:39
-#, fuzzy
msgid "Bookmarks"
-msgstr ""
-"గుర్తుంచు\n"
-" (Shaarli)"
+msgstr "బుక్మార్క్లు"
#: plinth/modules/shaarli/manifest.py:12
-#, fuzzy
-#| msgid "Shaarli"
msgid "Shaarlier"
-msgstr "షార్లి"
+msgstr "షార్లియర్"
#: plinth/modules/shadowsocks/__init__.py:21
msgid ""
@@ -5765,12 +5686,17 @@ msgid ""
"connect to this proxy, and their data will be encrypted and proxied through "
"the Shadowsocks server."
msgstr ""
+"మీ {box_name} Shadowsocks క్లయింట్ని అమలు చేయగలదు, అది Shadowsocks సర్వర్కి కనెక్ట్ "
+"చేయగలదు. ఇది SOCKS5 ప్రాక్సీని కూడా అమలు చేస్తుంది. స్థానిక పరికరాలు ఈ ప్రాక్సీకి కనెక్ట్ చేయగలవు "
+"మరియు వాటి డేటా Shadowsocks సర్వర్ ద్వారా గుప్తీకరించబడుతుంది మరియు ప్రాక్సీ చేయబడుతుంది."
#: plinth/modules/shadowsocks/__init__.py:30
msgid ""
"To use Shadowsocks after setup, set the SOCKS5 proxy URL in your device, "
"browser or application to http://freedombox_address:1080/"
msgstr ""
+"సెటప్ తర్వాత Shadowsocksని ఉపయోగించడానికి, మీ పరికరం, బ్రౌజర్ లేదా అప్లికేషన్లో SOCKS5 ప్రాక్సీ URLని "
+"http://freedombox_address:1080/కి సెట్ చేయండి"
#: plinth/modules/shadowsocks/__init__.py:51
msgid "Shadowsocks"
@@ -5786,10 +5712,8 @@ msgid "Recommended"
msgstr "సిఫార్సు చేయబడింది"
#: plinth/modules/shadowsocks/forms.py:37
-#, fuzzy
-#| msgid "Service"
msgid "Server"
-msgstr "సేవ"
+msgstr "సర్వర్"
#: plinth/modules/shadowsocks/forms.py:38
msgid "Server hostname or IP address"
@@ -5813,11 +5737,12 @@ msgid ""
"Sharing allows you to share files and folders on your {box_name} over the "
"web with chosen groups of users."
msgstr ""
+"వెబ్లో ఎంచుకున్న వినియోగదారుల సమూహాలతో మీ {box_name}లోని ఫైల్లు మరియు ఫోల్డర్లను భాగస్వామ్యం చేయడానికి "
+"భాగస్వామ్యం మిమ్మల్ని అనుమతిస్తుంది."
#: plinth/modules/sharing/__init__.py:39
-#, fuzzy
msgid "Sharing"
-msgstr "ఫైలు సమకాలీకరించబడుచున్నధి"
+msgstr "భాగస్వామ్యం"
#: plinth/modules/sharing/forms.py:18
msgid "Name of the share"
@@ -5838,10 +5763,8 @@ msgid "Disk path to a folder on this server that you intend to share."
msgstr "ఈ సర్వర్ పైన మీరు పంచుకోవాలి అనుకుంటున్న ఫోల్డర్ యొక్క డిస్క్ మార్గం."
#: plinth/modules/sharing/forms.py:28
-#, fuzzy
-#| msgid "Publish Key"
msgid "Public share"
-msgstr "కీని ప్రచురించండి"
+msgstr "ప్రజా వాటా"
#: plinth/modules/sharing/forms.py:29
msgid "Make files in this folder available to anyone with the link."
@@ -5852,19 +5775,14 @@ msgid "User groups that can read the files in the share:"
msgstr "భాగస్వామ్యంలోని ఫైళ్లను చదవగలిగే వినియోగదారుల సమూహాలు:"
#: plinth/modules/sharing/forms.py:36
-#, fuzzy
-#| msgid ""
-#| "Users who have these permissions will also be able to read the files in "
-#| "the share."
msgid ""
"Users of the selected user groups will be able to read the files in the "
"share."
-msgstr "ఈ అనుమతులను కలిగి ఉన్న వినియోగదారులు వాటాలోని ఫైళ్ళను కూడా చదవగలరు."
+msgstr "ఎంచుకున్న వినియోగదారు సమూహాల వినియోగదారులు షేర్లోని ఫైల్లను చదవగలరు."
#: plinth/modules/sharing/forms.py:52
-#, fuzzy
msgid "A share with this name already exists."
-msgstr "ఈ సేవ ఇప్పటికే ఉంది"
+msgstr "ఈ పేరుతో ఒక వాటా ఇప్పటికే ఉంది."
#: plinth/modules/sharing/forms.py:63
msgid "Shares should be either public or shared with at least one group"
@@ -5872,10 +5790,8 @@ msgstr "షేర్లు పబ్లిక్ గా ఉండాలి ల
#: plinth/modules/sharing/templates/sharing.html:19
#: plinth/modules/sharing/templates/sharing.html:22
-#, fuzzy
-#| msgid "Add Service"
msgid "Add share"
-msgstr "సేవ జోడించండి"
+msgstr "వాటాను జోడించండి"
#: plinth/modules/sharing/templates/sharing.html:27
msgid "No shares currently configured."
@@ -5886,10 +5802,8 @@ msgid "Disk Path"
msgstr "డిస్క్ మార్గం"
#: plinth/modules/sharing/templates/sharing.html:35
-#, fuzzy
-#| msgid "Shared"
msgid "Shared Over"
-msgstr "పంచుకోబడ్డ"
+msgstr "పైగా షేర్ చేయబడింది"
#: plinth/modules/sharing/templates/sharing.html:36
msgid "With Groups"
@@ -5900,34 +5814,24 @@ msgid "public access"
msgstr "ప్రజా ప్రాప్తి"
#: plinth/modules/sharing/views.py:39
-#, fuzzy
-#| msgid "Shared"
msgid "Share added."
msgstr "పంచుకోబడ్డ"
#: plinth/modules/sharing/views.py:44
-#, fuzzy
-#| msgid "Add Service"
msgid "Add Share"
-msgstr "సేవ జోడించండి"
+msgstr "వాటా జోడించండి"
#: plinth/modules/sharing/views.py:59
-#, fuzzy
-#| msgid "Shared"
msgid "Share edited."
-msgstr "పంచుకోబడ్డ"
+msgstr "భాగస్వామ్యం సవరించబడింది."
#: plinth/modules/sharing/views.py:64
-#, fuzzy
-#| msgid "Edit User"
msgid "Edit Share"
-msgstr "వినియోగదారి మార్పు"
+msgstr "భాగస్వామ్యాన్ని సవరించండి"
#: plinth/modules/sharing/views.py:95
-#, fuzzy
-#| msgid "{name} deleted."
msgid "Share deleted."
-msgstr "{name} తొలగించబడింది."
+msgstr "వాటా తొలగించబడింది."
#: plinth/modules/snapshot/__init__.py:22
msgid ""
@@ -5935,6 +5839,9 @@ msgid ""
"can be used to roll back the system to a previously known good state in case "
"of unwanted changes to the system."
msgstr ""
+"snapshots btrfs ఫైల్ సిస్టమ్ స్నాప్షాట్లను సృష్టించడానికి మరియు నిర్వహించడానికి అనుమతిస్తుంది. సిస్టమ్లో "
+"అవాంఛిత మార్పులు సంభవించినప్పుడు సిస్టమ్ను గతంలో తెలిసిన మంచి స్థితికి రోల్ బ్యాక్ చేయడానికి వీటిని "
+"ఉపయోగించవచ్చు."
#: plinth/modules/snapshot/__init__.py:26
#, no-python-format
@@ -5943,6 +5850,8 @@ msgid ""
"and after a software installation. Older snapshots will be automatically "
"cleaned up according to the settings below."
msgstr ""
+"స్నాప్షాట్లు క్రమానుగతంగా తీసుకోబడతాయి (టైమ్లైన్ స్నాప్షాట్లు అని పిలుస్తారు) మరియు సాఫ్ట్వేర్ ఇన్స్టాలేషన్కు "
+"ముందు మరియు తర్వాత కూడా. దిగువ సెట్టింగ్ల ప్రకారం పాత స్నాప్షాట్లు స్వయంచాలకంగా శుభ్రం చేయబడతాయి."
#: plinth/modules/snapshot/__init__.py:29
msgid ""
@@ -5950,6 +5859,9 @@ msgid ""
"partition only. Snapshots are not a replacement for backups since they can only be stored on the same partition. "
msgstr ""
+"స్నాప్షాట్లు ప్రస్తుతం btrfs ఫైల్ సిస్టమ్లలో మాత్రమే మరియు రూట్ విభజనపై మాత్రమే పని చేస్తాయి. స్నాప్షాట్లు బ్యాకప్లకి ప్రత్యామ్నాయం కాదు, ఎందుకంటే అవి ఒకే విభజనలో "
+"మాత్రమే నిల్వ చేయబడతాయి. "
#: plinth/modules/snapshot/__init__.py:54
msgid "Storage Snapshots"
@@ -5957,7 +5869,7 @@ msgstr "నిల్వ దృశ్యములు"
#: plinth/modules/snapshot/forms.py:12
msgid "Free Disk Space to Maintain"
-msgstr ""
+msgstr "నిర్వహించడానికి ఉచిత డిస్క్ స్పేస్"
#: plinth/modules/snapshot/forms.py:13
msgid ""
@@ -5965,59 +5877,48 @@ msgid ""
"below this value, older snapshots are removed until this much free space is "
"regained. The default value is 30%."
msgstr ""
+"డిస్క్లో ఖాళీ స్థలం యొక్క ఈ శాతాన్ని నిర్వహించండి. ఖాళీ స్థలం ఈ విలువ కంటే తక్కువగా ఉంటే, ఇంత ఖాళీ "
+"స్థలాన్ని తిరిగి పొందే వరకు పాత స్నాప్షాట్లు తీసివేయబడతాయి. డిఫాల్ట్ విలువ 30%."
#: plinth/modules/snapshot/forms.py:20
-#, fuzzy
-#| msgid "Enable Timeline Snapshots"
msgid "Timeline Snapshots"
-msgstr "కాలక్రమం స్నాప్షాట్లు ఉపయోగించండి"
+msgstr "కాలక్రమం స్నాప్షాట్లు"
#: plinth/modules/snapshot/forms.py:21
-#, fuzzy
-#| msgid ""
-#| "Uncheck this to disable timeline snapshots (hourly, daily, monthly and "
-#| "yearly)."
msgid ""
"Enable or disable timeline snapshots (hourly, daily, monthly and yearly)."
-msgstr "కాలపట్టిక స్నాప్షాట్లను (గంట, రోజువారీ, నెలవారీ మరియు వార్షిక) నిలిపివేయడానికి దీనికి టిక్కు తీసివేయండి."
+msgstr "కాలక్రమం స్నాప్షాట్లను ప్రారంభించండి లేదా నిలిపివేయండి (గంటకు, రోజువారీ, నెలవారీ మరియు వార్షికంగా)."
#: plinth/modules/snapshot/forms.py:26
msgid "Software Installation Snapshots"
msgstr "సాఫ్ట్వేర్ సంస్థాపన స్నాప్షాట్లు"
#: plinth/modules/snapshot/forms.py:27
-#, fuzzy
-#| msgid "Enable or disable snapshots before and after software installation"
msgid ""
"Enable or disable snapshots before and after each software installation and "
"update."
-msgstr "సాఫ్ట్వేర్ ఇన్స్టాలేషన్కు ముందు మరియు తర్వాత స్నాప్షాట్లను అనుమతించండి లేదా అనుమతి నిరాకరించండి"
+msgstr ""
+"ప్రతి సాఫ్ట్వేర్ ఇన్స్టాలేషన్ మరియు అప్డేట్కు ముందు మరియు తర్వాత స్నాప్షాట్లను ప్రారంభించండి లేదా నిలిపివేయండి."
#: plinth/modules/snapshot/forms.py:32
-#, fuzzy
-#| msgid "Storage Snapshots"
msgid "Hourly Snapshots Limit"
-msgstr "నిల్వ దృశ్యములు"
+msgstr "గంటకు స్నాప్షాట్ల పరిమితి"
#: plinth/modules/snapshot/forms.py:33
msgid "Keep a maximum of this many hourly snapshots."
msgstr "ఒక గంటలో స్నాప్షాట్స్ ని ఇంతకు నియంత్రించుము."
#: plinth/modules/snapshot/forms.py:36
-#, fuzzy
-#| msgid "Delete Snapshots"
msgid "Daily Snapshots Limit"
-msgstr "స్నాప్షాట్లను తొలగించు"
+msgstr "గంటకు స్నాప్షాట్ల పరిమితి"
#: plinth/modules/snapshot/forms.py:37
msgid "Keep a maximum of this many daily snapshots."
msgstr "ఒక రోజులో స్నాప్షాట్స్ ని ఇంతకు నియంత్రించుము."
#: plinth/modules/snapshot/forms.py:40
-#, fuzzy
-#| msgid "Delete Snapshots"
msgid "Weekly Snapshots Limit"
-msgstr "స్నాప్షాట్లను తొలగించు"
+msgstr "వారపు స్నాప్షాట్ల పరిమితి"
#: plinth/modules/snapshot/forms.py:41
msgid "Keep a maximum of this many weekly snapshots."
@@ -6032,19 +5933,14 @@ msgid "Keep a maximum of this many monthly snapshots."
msgstr "గరిష్టంగా ఒక నెలకు ఇన్ని స్నాప్షాట్లను ఉంచండి."
#: plinth/modules/snapshot/forms.py:48
-#, fuzzy
-#| msgid "Delete Snapshots"
msgid "Yearly Snapshots Limit"
-msgstr "స్నాప్షాట్లను తొలగించు"
+msgstr "వార్షిక స్నాప్షాట్ల పరిమితి"
#: plinth/modules/snapshot/forms.py:49
-#, fuzzy
-#| msgid ""
-#| "Keep a maximum of this many yearly snapshots. The default is 0 (disabled)."
msgid ""
"Keep a maximum of this many yearly snapshots. The default value is 0 (keep "
"no yearly snapshot)."
-msgstr "ఒక సవంత్సరంలో స్నాప్షాట్స్ ని ఇంతకు నియంత్రించుము. ప్రస్తుత సంఖ్యా 0 (సశక్తపరచబడలేదు)."
+msgstr "ఈ అనేక వార్షిక స్నాప్షాట్లను గరిష్టంగా ఉంచండి. డిఫాల్ట్ విలువ 0 (వార్షిక స్నాప్షాట్ను ఉంచవద్దు)."
#: plinth/modules/snapshot/templates/snapshot_delete_selected.html:12
msgid "Delete the following snapshots permanently?"
@@ -6078,11 +5974,11 @@ msgstr "యథాస్థితి"
#: plinth/modules/snapshot/templates/snapshot_manage.html:40
msgid "will be used at next boot"
-msgstr ""
+msgstr "తదుపరి బూట్లో ఉపయోగించబడుతుంది"
#: plinth/modules/snapshot/templates/snapshot_manage.html:45
msgid "in use"
-msgstr ""
+msgstr "వాడుకలోఉంది"
#: plinth/modules/snapshot/templates/snapshot_manage.html:54
#, python-format
@@ -6095,11 +5991,12 @@ msgid ""
"You have a filesystem of type %(fs_type)s. Snapshots are "
"currently only available on %(types_supported)s filesystems."
msgstr ""
+"మీకు %(fs_type)s రకం ఫైల్ సిస్టమ్ ఉంది. స్నాప్షాట్లు ప్రస్తుతం "
+"%(types_supported)s ఫైల్ సిస్టమ్లలో మాత్రమే అందుబాటులో ఉన్నాయి."
#: plinth/modules/snapshot/templates/snapshot_rollback.html:12
-#, fuzzy
msgid "Roll back the system to this snapshot?"
-msgstr "ఈ వ్యవస్థ ని స్నాప్షాట్ కి రొల్ల్బచ్క్ చేయగలరా?"
+msgstr "సిస్టమ్ను ఈ స్నాప్షాట్కి తిరిగి వెళ్లాలా?"
#: plinth/modules/snapshot/templates/snapshot_rollback.html:15
msgid ""
@@ -6116,34 +6013,28 @@ msgid "Rollback to Snapshot #%(number)s"
msgstr "స్నాప్షాట్ #%(number)s కు రోల్బ్యాక్ చేయండి"
#: plinth/modules/snapshot/views.py:27
-#, fuzzy
-#| msgid "Repository created."
msgid "manually created"
-msgstr "రిపోజిటరీ సృష్టించబడింది."
+msgstr "మానవీయంగా సృష్టించబడింది"
#: plinth/modules/snapshot/views.py:28
msgid "timeline"
-msgstr ""
+msgstr "కాలక్రమం"
#: plinth/modules/snapshot/views.py:29
msgid "apt"
-msgstr ""
+msgstr "సముచితమైనది"
#: plinth/modules/snapshot/views.py:39
-#, fuzzy
-#| msgid "Storage Snapshots"
msgid "Manage Snapshots"
-msgstr "నిల్వ దృశ్యములు"
+msgstr "స్నాప్షాట్లను నిర్వహించండి"
#: plinth/modules/snapshot/views.py:88
msgid "Created snapshot."
msgstr "స్నాప్షాట్ సృష్టించబడినది."
#: plinth/modules/snapshot/views.py:151
-#, fuzzy
-#| msgid "Configuration updated"
msgid "Storage snapshots configuration updated"
-msgstr "ఆకృతీకరణ నవీకరించబడింది"
+msgstr "నిల్వ స్నాప్షాట్ల కాన్ఫిగరేషన్ నవీకరించబడింది"
#: plinth/modules/snapshot/views.py:155 plinth/modules/tor/views.py:60
#, python-brace-format
@@ -6151,14 +6042,12 @@ msgid "Action error: {0} [{1}] [{2}]"
msgstr "చర్య లోపం:{0}{1}{2}"
#: plinth/modules/snapshot/views.py:183
-#, fuzzy
-#| msgid "Delete all the snapshots"
msgid "Deleted selected snapshots"
-msgstr "అన్ని స్నాప్షాట్లను తొలగించు"
+msgstr "ఎంచుకున్న స్నాప్షాట్లు తొలగించబడ్డాయి"
#: plinth/modules/snapshot/views.py:188
msgid "Snapshot is currently in use. Please try again later."
-msgstr ""
+msgstr "స్నాప్షాట్ ప్రస్తుతం వాడుకలో ఉంది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి."
#: plinth/modules/snapshot/views.py:207
#, python-brace-format
@@ -6180,16 +6069,17 @@ msgid ""
"administration tasks, copy files or run other services using such "
"connections."
msgstr ""
+"సురక్షిత షెల్ సర్వర్ రిమోట్ కంప్యూటర్ల నుండి కనెక్షన్లను ఆమోదించడానికి సురక్షిత షెల్ ప్రోటోకాల్ను "
+"ఉపయోగిస్తుంది. అధీకృత రిమోట్ కంప్యూటర్ అటువంటి కనెక్షన్లను ఉపయోగించి అడ్మినిస్ట్రేషన్ పనులను చేయగలదు, "
+"ఫైల్లను కాపీ చేయగలదు లేదా ఇతర సేవలను అమలు చేయగలదు."
#: plinth/modules/ssh/__init__.py:45
msgid "Secure Shell (SSH) Server"
msgstr "సెక్యూర్ షెల్ (SSH) సర్వర్"
#: plinth/modules/ssh/forms.py:13
-#, fuzzy
-#| msgid "Use HTTP basic authentication"
msgid "Disable password authentication"
-msgstr "HTTP ప్రాథమిక ప్రమాణీకరణ ఉపయోగించు"
+msgstr "పాస్వర్డ్ ప్రమాణీకరణను నిలిపివేయండి"
#: plinth/modules/ssh/forms.py:14
msgid ""
@@ -6197,36 +6087,36 @@ msgid ""
"setup SSH keys in your administrator user account before enabling this "
"option."
msgstr ""
+"పాస్వర్డ్ ఊహించడాన్ని నిరోధించడం ద్వారా భద్రతను మెరుగుపరుస్తుంది. ఈ ఎంపికను ప్రారంభించే ముందు మీరు మీ "
+"నిర్వాహక వినియోగదారు ఖాతాలో సెటప్ SSH కీలను కలిగి ఉన్నారని నిర్ధారించుకోండి."
#: plinth/modules/ssh/templates/ssh.html:11
-#, fuzzy
-#| msgid "SSH Fingerprint"
msgid "Server Fingerprints"
-msgstr "SSH వేలిముద్ర"
+msgstr "సర్వర్ వేలిముద్రలు"
#: plinth/modules/ssh/templates/ssh.html:14
msgid ""
"When connecting to the server, ensure that the fingerprint shown by the SSH "
"client matches one of these fingerprints."
msgstr ""
+"సర్వర్కు కనెక్ట్ చేస్తున్నప్పుడు, SSH క్లయింట్ చూపిన వేలిముద్ర ఈ వేలిముద్రలలో ఒకదానికి సరిపోలుతుందని "
+"నిర్ధారించుకోండి."
#: plinth/modules/ssh/templates/ssh.html:24
msgid "Algorithm"
msgstr "అల్గారిథం"
#: plinth/modules/ssh/templates/ssh.html:25
-#, fuzzy
-#| msgid "SSH Fingerprint"
msgid "Fingerprint"
-msgstr "SSH వేలిముద్ర"
+msgstr "వేలిముద్ర"
#: plinth/modules/ssh/views.py:48
msgid "SSH authentication with password disabled."
-msgstr ""
+msgstr "SSH ప్రమాణీకరణ తో SSH ఆపివేయబడింది ."
#: plinth/modules/ssh/views.py:51
msgid "SSH authentication with password enabled."
-msgstr ""
+msgstr "SSH ప్రమాణీకరణ తో SSH ఆపివేయబడింది ."
#: plinth/modules/sso/__init__.py:28
msgid "Single Sign On"
@@ -6237,10 +6127,8 @@ msgid "Login"
msgstr "ప్రవేశించు"
#: plinth/modules/sso/views.py:101
-#, fuzzy
-#| msgid "Password changed successfully."
msgid "Logged out successfully."
-msgstr "పాస్వర్డ్ విజయవంతంగా మార్చబడినది."
+msgstr "విజయవంతంగా లాగ్ అవుట్ చేయబడింది."
#: plinth/modules/storage/__init__.py:26
#, python-brace-format
@@ -6249,12 +6137,14 @@ msgid ""
"You can view the storage media currently in use, mount and unmount removable "
"media, expand the root partition etc."
msgstr ""
+"ఈ మాడ్యూల్ మీకు జోడించిన నిల్వ మీడియాను నిర్వహించడానికి మిమ్మల్ని అనుమతిస్తుంది {box_name}.మీరు "
+"ప్రస్తుతం వాడుకలో ఉన్న స్టోరేజ్ మీడియాను వీక్షించవచ్చు, తొలగించగల మీడియాను మౌంట్ చేయవచ్చు మరియు అన్మౌంట్ "
+"చేయవచ్చు, రూట్ విభజనను విస్తరించవచ్చు మొదలైనవి."
#: plinth/modules/storage/__init__.py:51 plinth/modules/storage/__init__.py:322
#: plinth/modules/storage/__init__.py:353
-#, fuzzy
msgid "Storage"
-msgstr "అన్హొస్టెడ్ స్టోరేజ్ ని (పునరుద్ధరించండి)"
+msgstr "నిల్వ"
#: plinth/modules/storage/__init__.py:216
#, python-brace-format
@@ -6283,21 +6173,19 @@ msgstr "{disk_size:.1f} టెరాబైట్లు"
#: plinth/modules/storage/__init__.py:243
msgid "The operation failed."
-msgstr ""
+msgstr "ఆపరేషన్ విఫలమైంది."
#: plinth/modules/storage/__init__.py:245
msgid "The operation was cancelled."
-msgstr ""
+msgstr "ఆపరేషన్ రద్దు చేయబడింది."
#: plinth/modules/storage/__init__.py:247
-#, fuzzy
-#| msgid "Mumble server is running"
msgid "The device is already unmounting."
-msgstr "మంబ్లు సేవిక నడుస్తుంది"
+msgstr "పరికరం ఇప్పటికే అన్మౌంట్ చేయబడుతోంది."
#: plinth/modules/storage/__init__.py:249
msgid "The operation is not supported due to missing driver/tool support."
-msgstr ""
+msgstr "డ్రైవర్/టూల్ సపోర్ట్ తప్పిపోయినందున ఆపరేషన్కు మద్దతు లేదు."
#: plinth/modules/storage/__init__.py:252
msgid "The operation timed out."
@@ -6308,9 +6196,8 @@ msgid "The operation would wake up a disk that is in a deep-sleep state."
msgstr "ఈ ఆపరేషన్ గాఢ నిద్రలో ఉన్న ఒక డిస్క్ ను మేల్కొలుపుతుంది."
#: plinth/modules/storage/__init__.py:257
-#, fuzzy
msgid "Attempting to unmount a device that is busy."
-msgstr "బిజీగా ఉన్న పరికరాన్ని అన్ మౌంట్ చేయడానికి ప్రయత్నిస్తోంది."
+msgstr "బిజీగా ఉన్న పరికరాన్ని అన్మౌంట్ చేయడానికి ప్రయత్నిస్తోంది."
#: plinth/modules/storage/__init__.py:259
msgid "The operation has already been cancelled."
@@ -6323,15 +6210,12 @@ msgid "Not authorized to perform the requested operation."
msgstr "అభ్యర్థించిన ఆపరేషన్ చేయడానికి అధికారం లేదు."
#: plinth/modules/storage/__init__.py:267
-#, fuzzy
msgid "The device is already mounted."
-msgstr "ఈ సేవ ఇప్పటికే ఉంది"
+msgstr "పరికరం ఇప్పటికే మౌంట్ చేయబడింది."
#: plinth/modules/storage/__init__.py:269
-#, fuzzy
-#| msgid "Mumble server is not running"
msgid "The device is not mounted."
-msgstr "మంబ్లు సేవిక నడవంలేదు"
+msgstr "పరికరం మౌంట్ చేయబడలేదు."
#: plinth/modules/storage/__init__.py:271
msgid "Not permitted to use the requested option."
@@ -6344,15 +6228,15 @@ msgstr "పరికరం మరొక వినియోగదారుచే
#: plinth/modules/storage/__init__.py:317
#, no-python-format, python-brace-format
msgid "Low space on system partition: {percent_used}% used, {free_space} free."
-msgstr ""
+msgstr "సిస్టమ్ విభజనలో తక్కువ స్థలం: {percent_used}% used, {free_space} ఉచితం."
#: plinth/modules/storage/__init__.py:319
msgid "Low disk space"
-msgstr ""
+msgstr "తక్కువ ఖని స్థలం"
#: plinth/modules/storage/__init__.py:347
msgid "Disk failure imminent"
-msgstr ""
+msgstr "ఖని వైఫల్యం ఆసన్నమైంది"
#: plinth/modules/storage/__init__.py:349
#, python-brace-format
@@ -6360,22 +6244,20 @@ msgid ""
"Disk {id} is reporting that it is likely to fail in the near future. Copy "
"any data while you still can and replace the drive."
msgstr ""
+"ఖని {id}సమీప భవిష్యత్తులో విఫలమయ్యే అవకాశం ఉందని నివేదిస్తోంది. మీరు చేయగలిగినప్పుడు ఏదైనా సమాచారంకాపీ "
+"చేసి, చోదకం భర్తీ చేయండి."
#: plinth/modules/storage/forms.py:62
-#, fuzzy
-#| msgid "Invalid hostname"
msgid "Invalid directory name."
-msgstr "ఆతిథ్యనామం చెల్లనిది"
+msgstr "డైరెక్టరీ పేరు చెల్లదు."
#: plinth/modules/storage/forms.py:79
msgid "Directory does not exist."
msgstr "డైరెక్టరీ ఉనికిలో లేదు."
#: plinth/modules/storage/forms.py:82
-#, fuzzy
-#| msgid "Download directory"
msgid "Path is not a directory."
-msgstr "డైరెక్టరీని దిగుమతి చేయు"
+msgstr "మార్గం అనేది డైరెక్టరీ కాదు."
#: plinth/modules/storage/forms.py:85
msgid "Directory is not readable by the user."
@@ -6386,18 +6268,14 @@ msgid "Directory is not writable by the user."
msgstr "వినియోగదారు ద్వారా డైరెక్టరీ వ్రాయబడలేదు."
#: plinth/modules/storage/forms.py:93
-#, fuzzy
-#| msgid "Download directory"
msgid "Directory"
-msgstr "డైరెక్టరీని దిగుమతి చేయు"
+msgstr "డైరెక్టరీ"
#: plinth/modules/storage/forms.py:95
msgid "Subdirectory (optional)"
msgstr "ఉప డైరెక్టరీ (ఐచ్ఛికం)"
#: plinth/modules/storage/forms.py:142
-#, fuzzy
-#| msgid "Shared"
msgid "Share"
msgstr "పంచుకోబడ్డ"
@@ -6406,8 +6284,6 @@ msgid "Other directory (specify below)"
msgstr "ఇతర డైరెక్టరీ (దిగువన పేర్కొనండి)"
#: plinth/modules/storage/templates/storage.html:17
-#, fuzzy
-#| msgid "The following disks are in use:"
msgid "The following storage devices are in use:"
msgstr "క్రింది డిస్కులు ఉపయోగంలో ఉన్నాయి:"
@@ -6449,6 +6325,8 @@ msgid ""
"Advanced storage operations such as disk partitioning and RAID management "
"are provided by the Cockpit app."
msgstr ""
+"ఖని విభజన మరియు RAID నిర్వహణ వంటి అధునాతన నిల్వ కార్యకలాపాలు అందించబడతాయిCockpit app."
#: plinth/modules/storage/templates/storage_expand.html:14
#, python-format
@@ -6484,16 +6362,15 @@ msgid "Error ejecting device: {error_message}"
msgstr "పరికరాన్ని తొలగించడంలో లోపం: {error_message}"
#: plinth/modules/syncthing/__init__.py:23
-#, fuzzy
msgid ""
"Syncthing is an application to synchronize files across multiple devices, e."
"g. your desktop computer and mobile phone. Creation, modification, or "
"deletion of files on one device will be automatically replicated on all "
"other devices that also run Syncthing."
msgstr ""
-"syncthing అనేది మీ సమచారాన్ని మీ వివిధ ఉపకరణాలని సమకాలీకరించడానికి,ఉ.దా మీ కంప్యూటర్ మరియు మీ ఫోను.…"
-"ఒక ఉపకరణంలో ఒక ఫైలు యొక్క తయారీ,మార్పులు, లేదా నిర్మూలిస్తే అది మిగిలిన అన్ని ఉపకరణాలలో దానికి "
-"సంబందించిన మార్పులు చెయ్యడం సమకాలీకరించడం"
+"సమకాలీకరణ అనేది బహుళ పరికరాలలో ఫైల్లను సమకాలీకరించడానికి ఒక అప్లికేషన్, ఉదా. మీ డెస్క్టాప్ కంప్యూటర్ "
+"మరియు మొబైల్ ఫోన్. ఒక పరికరంలో ఫైల్లను సృష్టించడం, సవరించడం లేదా తొలగించడం అనేది సమకాలీకరణను అమలు "
+"చేసే అన్ని ఇతర పరికరాలలో స్వయంచాలకంగా పునరావృతమవుతుంది."
#: plinth/modules/syncthing/__init__.py:28
#, python-brace-format
@@ -6506,12 +6383,15 @@ msgid ""
"{box_name} is only available for users belonging to the \"admin\" or "
"\"syncthing-access\" group."
msgstr ""
+"సమకాలీకరణ ఆన్లో ఉంది {box_name}మీ డేటా కోసం అదనపు సమకాలీకరణ పాయింట్ను అందిస్తుంది, ఇది చాలా సమయం "
+"అందుబాటులో ఉంటుంది, మీ పరికరాలను మరింత తరచుగా సమకాలీకరించడానికి అనుమతిస్తుంది. {box_name}బహుళ "
+"వినియోగదారులచే ఉపయోగించబడే సమకాలీకరణ యొక్క ఒకే ఉదాహరణను అమలు చేస్తుంది. ప్రతి వినియోగదారు యొక్క పరికరాల "
+"సెట్ ప్రత్యేక ఫోల్డర్ల సెట్తో సమకాలీకరించబడవచ్చు.వెబ్ ఇంటర్ఫేస్ ఆన్ చేయబడింది{box_name} నిర్వాహకుడు \" "
+"లేదా \"సమకాలీకరణ-యాక్సెస్\" సమూహానికి చెందిన వినియోగదారులకు మాత్రమే అందుబాటులో ఉంటుంది."
#: plinth/modules/syncthing/__init__.py:57
-#, fuzzy
-#| msgid "Install this application?"
msgid "Administer Syncthing application"
-msgstr "ఈ అనువర్తనాన్ని నిక్షిప్తం చేయాలా?"
+msgstr "సమకాలీకరణ అప్లికేషన్ను నిర్వహించండి"
#: plinth/modules/syncthing/__init__.py:61
#: plinth/modules/syncthing/manifest.py:12
@@ -6540,16 +6420,12 @@ msgid "Tor"
msgstr "టార్"
#: plinth/modules/tor/__init__.py:67
-#, fuzzy
-#| msgid "Tor Hidden Service"
msgid "Tor Onion Service"
-msgstr "దాచిన టార్ సర్వీస్"
+msgstr "టోర్ ఉల్లిపాయ సేవ"
#: plinth/modules/tor/__init__.py:71
-#, fuzzy
-#| msgid "Socks5 Proxy"
msgid "Tor Socks Proxy"
-msgstr "సాక్స్5 ప్రాక్సీ"
+msgstr "టోర్ సాక్స్ ప్రాతినిధ్య"
#: plinth/modules/tor/__init__.py:75
msgid "Tor Bridge Relay"
@@ -6581,6 +6457,7 @@ msgstr "టోర్ వాడుకను నిర్ధారించండ
msgid ""
"Enter a valid bridge with this format: [transport] IP:ORPort [fingerprint]"
msgstr ""
+"ఈ ఫార్మాట్తో చెల్లుబాటు అయ్యే వంతెనను నమోదు చేయండి: [transport] IP:ORPort [fingerprint]"
#: plinth/modules/tor/forms.py:75
msgid "Enable Tor"
@@ -6615,10 +6492,8 @@ msgstr ""
"చెయ్యండి. ప్రస్తుతం మద్దతిచ్చే ట్రాన్స్పోర్ట్ లు none, obfs3, obfs4 మరియు scamblesuit."
#: plinth/modules/tor/forms.py:92
-#, fuzzy
-#| msgid "Enable network time"
msgid "Enable Tor relay"
-msgstr "అల్లిక సమయం చేతనించు"
+msgstr "టోర్ రిలేని ప్రారంభించండి"
#: plinth/modules/tor/forms.py:93
#, python-brace-format
@@ -6645,24 +6520,18 @@ msgstr ""
"తప్పించుకునేందుకు ఇది దోహదపడుతుంది."
#: plinth/modules/tor/forms.py:105
-#, fuzzy
-#| msgid "Enable Tor Hidden Service"
msgid "Enable Tor Hidden Service"
-msgstr "టార్ దాచిన సేవని ప్రారంభించండి"
+msgstr "టోర్ హిడెన్ సర్వీస్ని ప్రారంభించండి"
#: plinth/modules/tor/forms.py:107
#, fuzzy, python-brace-format
-#| msgid ""
-#| "A hidden service will allow {box_name} to provide selected services (such "
-#| "as wiki or chat) without revealing its location. Do not use this for "
-#| "strong anonymity yet."
msgid ""
"A hidden service will allow {box_name} to provide selected services (such as "
"wiki or chat) without revealing its location. Do not use this for strong "
"anonymity yet."
msgstr ""
-"ఎంపిక చేసిన సేవలను (వికీ లేదా చాట్ వంటివి) దాని స్థానాన్ని బహిర్గతం చేయకుండా ఒక రహస్య సేవ {box_name} "
-"1 ను అనుమతిస్తుంది. ఇది ఇంకా బలమైన పేరు కోసం ఉపయోగించకండి."
+"దాచిన సేవ దాని స్థానాన్ని బహిర్గతం చేయకుండా ఎంచుకున్న సేవలను (వికీ లేదా చాట్ వంటివి) అందించడానికి "
+"బాక్స్_నామని అనుమతిస్తుంది. ఇంకా బలమైన అనామకత్వం కోసం దీన్ని ఉపయోగించవద్దు. {box_name}"
#: plinth/modules/tor/forms.py:112
msgid "Download software packages over Tor"
@@ -6694,10 +6563,8 @@ msgid "Tor configuration is being updated"
msgstr "టోర్ ఆకృతీకరణ నవీకరించబడుతుంది"
#: plinth/modules/tor/templates/tor.html:26
-#, fuzzy
-#| msgid "Hidden Service"
msgid "Onion Service"
-msgstr "దాగిన సేవ"
+msgstr "ఉల్లిపాయ సేవ"
#: plinth/modules/tor/templates/tor.html:28
msgid "Ports"
@@ -6734,26 +6601,18 @@ msgid "Setting unchanged"
msgstr "మారకుండా అమర్చుతోంది"
#: plinth/modules/transmission/__init__.py:24
-#, fuzzy
-#| msgid "Deluge is a BitTorrent client that features a Web UI."
msgid "Transmission is a BitTorrent client with a web interface."
-msgstr "డీలడ్జ్ అనేది జాల UI కలిగివున్న ఒక బిట్ టోరెంట్ కక్షిదారు."
+msgstr "ప్రసరణ అనేది వెబ్ ఇంటర్ఫేస్తో కూడిన బిట్టొరెంట్ క్లయింట్."
#: plinth/modules/transmission/__init__.py:25
-#, fuzzy
-#| msgid ""
-#| "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon "
-#| "handles Bitorrent file sharing. Note that BitTorrent is not anonymous."
msgid ""
"BitTorrent is a peer-to-peer file sharing protocol. Note that BitTorrent is "
"not anonymous."
-msgstr ""
-"బిట్ టోర్రెంట్ పీర్-టు-పీర్ ఫైల్ షేరింగ్ ప్రోటోకాల్. ట్రాన్స్మిషన్ డెమోన్ బిట్ టోర్రెంట్ ఫైల్ భాగస్వామ్యాన్ని నిర్వహిస్తుంది. "
-"బిట్ టోర్రెంట్ అజ్ఞాత కాదని గమనించండి."
+msgstr "బిట్ టొరెంట్ అనేది పీర్-టు-పీర్ ఫైల్ భాగస్వామ్య ప్రోటోకాల్. బిట్ టొరెంట్ అనామకం కాదని గమనించండి."
#: plinth/modules/transmission/__init__.py:27
msgid "Please do not change the default port of the Transmission daemon."
-msgstr ""
+msgstr "దయచేసి ట్రాన్స్మిషన్ డెమోన్ డిఫాల్ట్ పోర్ట్ను మార్చవద్దు."
#: plinth/modules/transmission/__init__.py:53
#: plinth/modules/transmission/manifest.py:6
@@ -6766,29 +6625,26 @@ msgid ""
"allow reading news from any location, while feeling as close to a real "
"desktop application as possible."
msgstr ""
+"చిన్న చిన్న RSS అనేది ఒక న్యూస్ ఫీడ్ (RSS/Atom) రీడర్ మరియు అగ్రిగేటర్, ఇది సాధ్యమైనంతవరకు నిజమైన "
+"డెస్క్టాప్ అప్లికేషన్కు దగ్గరగా ఉన్నట్లు భావించేటప్పుడు ఏ ప్రదేశం నుండి అయినా వార్తలను చదవడానికి "
+"అనుమతించేలా రూపొందించబడింది."
#: plinth/modules/ttrss/__init__.py:27
-#, fuzzy, python-brace-format
-#| msgid ""
-#| "When enabled, Cockpit will be available from /"
-#| "_cockpit/ path on the web server. It can be accessed by any user with a {box_name} login. Sensitive "
-#| "information and system altering abilities are limited to users belonging "
-#| "to admin group."
+#, python-brace-format
msgid ""
"When enabled, Tiny Tiny RSS can be accessed by any user with a {box_name} login."
msgstr ""
-"ప్రారంభించినప్పుడు, వెబ్ సర్వర్లో / _cockpit / మార్గం నుండి "
-"కాక్పిట్ అందుబాటులో ఉంటుంది. దీన్ని మంది వినియోగదారులచే "
-"ద్వారా పొందవచ్చు {box_name}.\n"
-"అంగీకార సమాచారం మరియు సిస్టమ్ మార్చడం సామర్ధ్యాలు నిర్వాహక సమూహం చెందిన వినియోగదారులకు పరిమితం."
+"ప్రారంభించబడినప్పుడు, చిన్న చిన్న RSSని ఏ {box_name} లాగిన్తో "
+"వినియోగదారు అయినా సాంగత్యం చేయవచ్చు."
#: plinth/modules/ttrss/__init__.py:31
msgid ""
"When using a mobile or desktop application for Tiny Tiny RSS, use the URL /tt-rss-app for connecting."
msgstr ""
+"చిన్న చిన్న RSS కోసం మొబైల్ లేదా డెస్క్టాప్ అప్లికేషన్ను ఉపయోగిస్తున్నప్పుడు, URLని ఉపయోగించండి/tt-rss-app కలపడం కోసం ."
#: plinth/modules/ttrss/__init__.py:49
msgid "Read and subscribe to news feeds"
@@ -6803,15 +6659,13 @@ msgid "News Feed Reader"
msgstr "న్యూస్ ఫీడ్ రీడర్"
#: plinth/modules/ttrss/manifest.py:9
-#, fuzzy
-#| msgid "Tiny Tiny RSS"
msgid "Tiny Tiny RSS (Fork)"
-msgstr "టైనీ టైనీ RSS"
+msgstr "చిన్న చిన్న RSS (ఫోర్క్)"
#: plinth/modules/upgrades/__init__.py:39
#: plinth/modules/upgrades/templates/update-firstboot.html:14
msgid "Check for and apply the latest software and security updates."
-msgstr ""
+msgstr "తాజా సాఫ్ట్వేర్ మరియు భద్రత నవీకరణను కోసం తనిఖీ చేయండి మరియు వర్తించండి."
#: plinth/modules/upgrades/__init__.py:40
msgid ""
@@ -6820,25 +6674,25 @@ msgid ""
"to be unavailable briefly. If system reboot is deemed necessary, it is done "
"automatically at 02:00 causing all apps to be unavailable briefly."
msgstr ""
+"స్థానిక టైమ్ జోన్ ప్రకారం ప్రతిరోజూ 06:00 గంటలకు అప్డేట్లు అమలు చేయబడతాయి. తేదీ & సమయ యాప్లో మీ "
+"టైమ్ జోన్ని సెట్ చేయండి. అప్డేట్ చేసిన తర్వాత యాప్లు పునఃప్రారంభించబడతాయి, దీని వలన అవి క్లుప్తంగా "
+"అందుబాటులో ఉండవు. సిస్టమ్ రీబూట్ అవసరమని భావించినట్లయితే, అది స్వయంచాలకంగా 02:00కి చేయబడుతుంది, "
+"దీని వలన అన్ని యాప్లు క్లుప్తంగా అందుబాటులో ఉండవు."
#: plinth/modules/upgrades/__init__.py:74
#: plinth/modules/upgrades/__init__.py:129
#: plinth/modules/upgrades/templates/update-firstboot-progress.html:11
#: plinth/modules/upgrades/templates/update-firstboot.html:11
-#, fuzzy
-#| msgid "Software Upgrades"
msgid "Software Update"
-msgstr "సాఫ్ట్వేర్ నవీకరణలు"
+msgstr "సాఫ్ట్వేర్ నవీకరణ"
#: plinth/modules/upgrades/__init__.py:132
-#, fuzzy
-#| msgid "FreedomBox Manual"
msgid "FreedomBox Updated"
-msgstr "ఫ్రీడమ్ బాక్స్ నిర్దేశిక"
+msgstr "స్వతంత్ర సాఫ్ట్వేర్ తాజా పరుచడం"
#: plinth/modules/upgrades/__init__.py:217
msgid "Could not start distribution update"
-msgstr ""
+msgstr "పంపిణీ నవీకరణను ప్రారంభించడం సాధ్యపడలేదు"
#: plinth/modules/upgrades/__init__.py:219
msgid ""
@@ -6846,66 +6700,66 @@ msgid ""
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
+"పంపిణీ నవీకరణను ప్రారంభించడానికి రూట్ విభజనలో తగినంత ఖాళీ స్థలం లేదు. దయచేసి కనీసం 5 GB ఉచితంగా "
+"ఉండేలా చూసుకోండి. ప్రారంభించబడితే, పంపిణీ నవీకరణ 24 గంటల తర్వాత మళ్లీ ప్రయత్నించబడుతుంది."
#: plinth/modules/upgrades/__init__.py:230
-#, fuzzy
-#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
-msgstr "స్వయంచాలక నవీకరణలు నిలిపివేయబడ్డాయి"
+msgstr "పంపిణీ నవీకరణ ప్రారంభమైంది"
#: plinth/modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
-msgstr ""
+msgstr "తదుపరి స్థిరమైన విడుదలకు నవీకరణ ప్రారంభించబడింది. ఇది పూర్తి కావడానికి చాలా సమయం పట్టవచ్చు."
#: plinth/modules/upgrades/forms.py:15
-#, fuzzy
-#| msgid "Enable automatic upgrades"
msgid "Enable auto-update"
-msgstr "స్వయంచాలక నవీకరణలు ప్రారంభించు"
+msgstr "స్వీయ నవీకరణను ప్రారంభించండి"
#: plinth/modules/upgrades/forms.py:16
msgid "When enabled, FreedomBox automatically updates once a day."
-msgstr ""
+msgstr "ప్రారంభించబడినప్పుడు, FreedomBox స్వయంచాలకంగా రోజుకు ఒకసారి నవీకరించబడుతుంది."
#: plinth/modules/upgrades/forms.py:19
-#, fuzzy
-#| msgid "Enable automatic upgrades"
msgid "Enable auto-update to next stable release"
-msgstr "స్వయంచాలక నవీకరణలు ప్రారంభించు"
+msgstr "తదుపరి స్థిరమైన విడుదలకు స్వీయ-నవీకరణను ప్రారంభించండి"
#: plinth/modules/upgrades/forms.py:20
msgid ""
"When enabled, FreedomBox will update to the next stable distribution release "
"when it is available."
msgstr ""
+"ప్రారంభించబడినప్పుడు, FreedomBox అది అందుబాటులో ఉన్నప్పుడు తదుపరి స్థిరమైన పంపిణీ విడుదలకు "
+"నవీకరించబడుతుంది."
#: plinth/modules/upgrades/forms.py:34
#: plinth/modules/upgrades/templates/upgrades_configure.html:89
msgid "Activate frequent feature updates (recommended)"
-msgstr ""
+msgstr "తరచుగా ఫీచర్ అప్డేట్లను యాక్టివేట్ చేయండి (సిఫార్సు చేయబడింది)"
#: plinth/modules/upgrades/forms.py:40
-#, fuzzy
-#| msgid "Fail2Ban (recommended)"
msgid "Update now (recommended)"
-msgstr "ఫెయిల్2బ్యాన్ (సిఫారసుచేయబడినవి)"
+msgstr "ఇప్పుడే నవీకరించండి (సిఫార్సు చేయబడింది)"
#: plinth/modules/upgrades/templates/backports-firstboot.html:26
msgid ""
"It is strongly recommended to activate frequent feature updates. If not "
"activated now, they can be activated later."
msgstr ""
+"తరచుగా ఫీచర్ అప్డేట్లను యాక్టివేట్ చేయాలని గట్టిగా సిఫార్సు చేయబడింది. ఇప్పుడు యాక్టివేట్ కాకపోతే, తర్వాత "
+"యాక్టివేట్ చేసుకోవచ్చు."
#: plinth/modules/upgrades/templates/backports-firstboot.html:33
msgid ""
"Note: Once frequent feature updates are activated, they "
"cannot be deactivated."
msgstr ""
+"గమనిక: ఒకసారి తరచుగా ఫీచర్ తాజా పరుచడం యాక్టివేట్ చేయబడితే, వాటిని డియాక్టివేట్ చేయడం "
+"సాధ్యం కాదు."
#: plinth/modules/upgrades/templates/update-firstboot-progress.html:19
msgid "Updating, please wait..."
-msgstr ""
+msgstr "నవీకరిస్తోంది, దయచేసి వేచి ఉండండి..."
#: plinth/modules/upgrades/templates/update-firstboot-progress.html:22
#: plinth/modules/upgrades/templates/update-firstboot.html:20
@@ -6914,21 +6768,25 @@ msgid ""
"this web interface may be temporarily unavailable and show an error. In that "
"case, refresh the page to continue."
msgstr ""
+"ఇది పూర్తి కావడానికి చాలా సమయం పట్టవచ్చు. నవీకరణ సమయంలో, ఈ వెబ్ ఇంటర్ఫేస్ "
+"తాత్కాలికంగా అందుబాటులో ఉండకపోవచ్చు మరియు లోపాన్ని చూపుతుంది. అలాంటప్పుడు, కొనసాగించడానికి పేజీని రిఫ్రెష్ "
+"చేయండి."
#: plinth/modules/upgrades/templates/update-firstboot-progress.html:31
-#, fuzzy, python-format
-#| msgid "%(box_name)s is up to date."
+#, python-format
msgid ""
"\n"
"\t%(box_name)s is up to date. Press Next to continue.\n"
" "
-msgstr "%(box_name)s తాజాగా ఉంది."
+msgstr ""
+"\n"
+"\t%(box_name)s తాజాగా ఉంది. కొనసాగించడానికి తదుపరి నొక్కండ....\n"
+" "
#: plinth/modules/upgrades/templates/upgrades-new-release.html:9
-#, fuzzy, python-format
-#| msgid "%(box_name)s is up to date."
+#, python-format
msgid "%(box_name)s updated"
-msgstr "%(box_name)s తాజాగా ఉంది."
+msgstr "%(box_name)s నవీకరించబడింది"
#: plinth/modules/upgrades/templates/upgrades-new-release.html:13
#, python-format
@@ -6936,16 +6794,18 @@ msgid ""
"%(box_name)s has been updated to version %(version)s. See the release announcement."
msgstr ""
+"%(box_name)s సంస్కరణ %(version)s నవీకరించబడింది. &ల్టీ;ఆ హార్ఫ్=\"%(url)s\"&జీత్;"
+"విడుదల ప్రకటన&ల్టీ;/ఆ &జీత్;ని చూడండి."
#: plinth/modules/upgrades/templates/upgrades-new-release.html:22
#: plinth/templates/notifications.html:44
msgid "Dismiss"
-msgstr ""
+msgstr "రద్దుచేసే"
#: plinth/modules/upgrades/templates/upgrades_configure.html:30
#: plinth/modules/upgrades/templates/upgrades_configure.html:100
msgid "Updating..."
-msgstr ""
+msgstr "నవీకరిస్తోంది."
#: plinth/modules/upgrades/templates/upgrades_configure.html:32
#, python-format
@@ -6953,21 +6813,19 @@ msgid "There is a new %(box_name)s version available."
msgstr "%(box_name)s యొక్క కొత్త వెర్షన్ అందుబాటులో ఉంది."
#: plinth/modules/upgrades/templates/upgrades_configure.html:35
-#, fuzzy
-#| msgid "FreedomBox Manual"
msgid "Your Freedombox needs an update!"
-msgstr "ఫ్రీడమ్ బాక్స్ నిర్దేశిక"
+msgstr "మీ స్వతంత్రబాక్స్ కి తాజాపరుచాలి!"
#: plinth/modules/upgrades/templates/upgrades_configure.html:47
msgid ""
"Frequent feature updates can be activated. Activating them is recommended."
-msgstr ""
+msgstr "తరచుగా ఫీచర్ అప్డేట్లను యాక్టివేట్ చేయవచ్చు. వాటిని సక్రియం చేయడం సిఫార్సు చేయబడింది."
#: plinth/modules/upgrades/templates/upgrades_configure.html:56
msgid ""
"Frequent feature updates cannot be activated. They may not be necessary on "
"your distribution."
-msgstr ""
+msgstr "తరచుగా ఫీచర్ అప్డేట్లు యాక్టివేట్ చేయబడవు. మీ పంపిణీలో అవి అవసరం లేకపోవచ్చు."
#: plinth/modules/upgrades/templates/upgrades_configure.html:78
#, python-format
@@ -6976,18 +6834,17 @@ msgid ""
"cannot be deactivated. You may wish to take a snapshot using Storage Snapshots before continuing."
msgstr ""
+"హెచ్చరిక! ఒకసారి తరచుగా ఫీచర్ అప్డేట్లు యాక్టివేట్ చేయబడితే, వాటిని డియాక్టివేట్ చేయడం "
+"సాధ్యం కాదు. మీరు కొనసాగడానికి ముందు స్టోరేజ్ స్నాప్షాట్లు "
+"ఉపయోగించి స్నాప్షాట్ తీయాలనుకోవచ్చు."
#: plinth/modules/upgrades/templates/upgrades_configure.html:94
-#, fuzzy
-#| msgid "Last update"
msgid "Manual Update"
-msgstr "చివరి నవీకరణ"
+msgstr "నిర్దేశిక నవీకరణ"
#: plinth/modules/upgrades/templates/upgrades_configure.html:108
-#, fuzzy
-#| msgid "Update"
msgid "Update now"
-msgstr "నవీకరణ యూ.ఆర్.ఎల్"
+msgstr "ఇప్పుడే నవీకరించండి"
#: plinth/modules/upgrades/templates/upgrades_configure.html:114
msgid ""
@@ -6995,10 +6852,13 @@ msgid ""
"you cannot install apps. Also, this web interface may be temporarily "
"unavailable and show an error. In that case, refresh the page to continue."
msgstr ""
+"ఇది పూర్తి కావడానికి చాలా సమయం పట్టవచ్చు. నవీకరణ సమయంలో, మీరు యాప్లను ఇన్స్టాల్ "
+"చేయలేరు. అలాగే, ఈ వెబ్ ఇంటర్ఫేస్ తాత్కాలికంగా అందుబాటులో ఉండకపోవచ్చు మరియు లోపాన్ని చూపుతుంది. "
+"అలాంటప్పుడు, కొనసాగించడానికి పేజీని రిఫ్రెష్ చేయండి."
#: plinth/modules/upgrades/templates/upgrades_configure.html:128
msgid "Show recent update logs"
-msgstr ""
+msgstr "ఇటీవలి నవీకరణ లాగ్లను చూపు"
#: plinth/modules/upgrades/views.py:67
#, python-brace-format
@@ -7014,16 +6874,12 @@ msgid "Automatic upgrades disabled"
msgstr "స్వయంచాలక నవీకరణలు నిలిపివేయబడ్డాయి"
#: plinth/modules/upgrades/views.py:82
-#, fuzzy
-#| msgid "Automatic upgrades enabled"
msgid "Distribution upgrade enabled"
-msgstr "స్వయంచాలక నవీకరణలు ప్రారంభించబడ్డాయి"
+msgstr "పంపిణీ మెరుగుపరుచడం ప్రారంభించబడింది"
#: plinth/modules/upgrades/views.py:85
-#, fuzzy
-#| msgid "Automatic upgrades disabled"
msgid "Distribution upgrade disabled"
-msgstr "స్వయంచాలక నవీకరణలు నిలిపివేయబడ్డాయి"
+msgstr "పంపిణీ మెరుగుపరుచడం నిలిపివేయబడింది"
#: plinth/modules/upgrades/views.py:127
msgid "Upgrade process started."
@@ -7035,7 +6891,7 @@ msgstr "నవీకరణ ప్రారంభం విఫలమైంద
#: plinth/modules/upgrades/views.py:139
msgid "Frequent feature updates activated."
-msgstr ""
+msgstr "తరచుగా ఫీచర్ అప్డేట్లు యాక్టివేట్ చేయబడ్డాయి."
#: plinth/modules/users/__init__.py:29
msgid ""
@@ -7043,6 +6899,9 @@ msgid ""
"authentication mechanism for most apps. Some apps further require a user "
"account to be part of a group to authorize the user to access the app."
msgstr ""
+"వినియోగదారు ఖాతాలను సృష్టించండి మరియు నిర్వహించండి. ఈ ఖాతాలు చాలా యాప్ల కోసం కేంద్రీకృత ప్రామాణీకరణ "
+"విధానంగా పనిచేస్తాయి. కొన్ని యాప్లకు యాప్ను యాక్సెస్ చేయడానికి వినియోగదారుని ప్రామాణీకరించడానికి సమూహంలో భాగంగా "
+"వినియోగదారు ఖాతా అవసరం"
#: plinth/modules/users/__init__.py:34
#, python-brace-format
@@ -7051,6 +6910,9 @@ msgid ""
"relevant to them in the home page. However, only users of the admin "
"group may alter apps or system settings."
msgstr ""
+"హోమ్ పేజీలో వారికి సంబంధించిన యాప్ల జాబితాను చూడటానికి ఏ వినియోగదారు అయినా {box_name} వెబ్ ఇంటర్ఫేస్కి లాగిన్ "
+"చేయవచ్చు. అయినప్పటికీ, అడ్మిన్ సమూహం యొక్క వినియోగదారులు మాత్రమే యాప్లు లేదా సిస్టమ్ "
+"సెట్టింగ్లను మార్చవచ్చు."
#: plinth/modules/users/__init__.py:57
msgid "Users and Groups"
@@ -7070,33 +6932,28 @@ msgid "Username is taken or is reserved."
msgstr "యూజర్ పేరు తీసుకోబడింది లేదా రిజర్వ్ చేయబడింది."
#: plinth/modules/users/forms.py:63
-#, fuzzy
-#| msgid "Invalid server name"
msgid "Enter a valid username."
-msgstr "సేవిక పేరు చెలదు"
+msgstr "చెల్లుబాటు అయ్యే వినియోగదారు పేరును నమోదు చేయండి."
#: plinth/modules/users/forms.py:70
msgid ""
"Required. 150 characters or fewer. English letters, digits and @/./-/_ only."
msgstr ""
+"అవసరం. 150 అక్షరాలు లేదా అంతకంటే తక్కువ. ఆంగ్ల అక్షరాలు, అంకెలు మరియు @/./-/_ మాత్రమే."
#: plinth/modules/users/forms.py:78
-#, fuzzy
-#| msgid "Administrator Password"
msgid "Authorization Password"
-msgstr "నిర్వాహకుని రహస్యపదం"
+msgstr "అధికార రహస్యపదం"
#: plinth/modules/users/forms.py:84
#, python-brace-format
msgid ""
"Enter the password for user \"{user}\" to authorize account modifications."
-msgstr ""
+msgstr "వినియోగదారు కోసం పాస్వర్డ్ను నమోదు చేయండి\"{user}\"ఖాతా సవరణలకు అధికారం ఇవ్వడానికి."
#: plinth/modules/users/forms.py:93
-#, fuzzy
-#| msgid "Show password"
msgid "Invalid password."
-msgstr "రహస్యపదం కనబర్చు"
+msgstr "చెల్లని రహస్యపదం."
#: plinth/modules/users/forms.py:110
msgid ""
@@ -7106,18 +6963,22 @@ msgid ""
"able to log in to all services. They can also log in to the system through "
"SSH and have administrative privileges (sudo)."
msgstr ""
+"కొత్త వినియోగదారుకు ఏ సేవలు అందుబాటులో ఉండాలో ఎంచుకోండి. వినియోగదారు తగిన సమూహంలో ఉన్నట్లయితే, LDAP "
+"ద్వారా ఒకే సైన్-ఆన్కు మద్దతు ఇచ్చే సేవలకు లాగిన్ చేయగలరు..
నిర్వాహక సమూహంలోని వినియోగదారులు "
+"అన్ని సేవలకు లాగిన్ చేయగలరు. వారు SSH ద్వారా సిస్టమ్కి లాగిన్ అవ్వగలరు మరియు నిర్వాహక అధికారాలను (సూడో) "
+"కలిగి ఉంటారు."
#: plinth/modules/users/forms.py:155 plinth/modules/users/forms.py:399
-#, fuzzy, python-brace-format
-#| msgid "Creating LDAP user failed."
+#, python-brace-format
msgid "Creating LDAP user failed: {error}"
-msgstr "ఎల్.డి.ఏ.పి వాడుకరి సృష్టించడంలో విఫలమైంది."
+msgstr ""
+"ల్డప్ వినియోగదారుని సృష్టించడం విఫలమైంది.\n"
+".: {error}"
#: plinth/modules/users/forms.py:168
#, fuzzy, python-brace-format
-#| msgid "Failed to add new user to {group} group."
msgid "Failed to add new user to {group} group: {error}"
-msgstr "వినియోగదారుని {group} సముహానికి జోడించడంలో విఫలం."
+msgstr "సమూహంసమూహానికి కొత్త వినియోగదారుని జోడించడంలో విఫలమైంది: {లోపం {group} {error}"
#: plinth/modules/users/forms.py:182
msgid "Authorized SSH Keys"
@@ -7129,6 +6990,9 @@ msgid ""
"system without using a password. You may enter multiple keys, one on each "
"line. Blank lines and lines starting with # will be ignored."
msgstr ""
+"SSH పబ్లిక్ కీని సెట్ చేయడం వలన ఈ వినియోగదారు పాస్వర్డ్ని ఉపయోగించకుండా సిస్టమ్కి సురక్షితంగా లాగిన్ "
+"అవ్వడానికి అనుమతిస్తుంది. మీరు బహుళ కీలను నమోదు చేయవచ్చు, ఒక్కో లైన్లో ఒకటి. #తో ప్రారంభమయ్యే ఖాళీ "
+"పంక్తులు మరియు పంక్తులు విస్మరించబడతాయి."
#: plinth/modules/users/forms.py:269
msgid "Renaming LDAP user failed."
@@ -7147,26 +7011,22 @@ msgid "Unable to set SSH keys."
msgstr "SSH కీలను సెట్ చేయడం సాధ్యం కాలేదు."
#: plinth/modules/users/forms.py:325
-#, fuzzy
-#| msgid "Failed to add user to group."
msgid "Failed to change user status."
-msgstr "సమూహంలోకి వినియోగదారుని జోడించడంలో విఫలం."
+msgstr "వినియోగదారు స్థితిని మార్చడంలో విఫలమైంది."
#: plinth/modules/users/forms.py:370
msgid "Changing LDAP user password failed."
msgstr "ఎల్.డి.ఏ.పి వాడుకరి పాస్వర్డ్ మార్పిడి విఫలం."
#: plinth/modules/users/forms.py:410
-#, fuzzy, python-brace-format
-#| msgid "Failed to add new user to admin group."
+#, python-brace-format
msgid "Failed to add new user to admin group: {error}"
-msgstr "కొత్త వాడుకరి ను అడ్మిన్ సమూహంలో జోడించడం విఫలమైనది."
+msgstr "నిర్వాహక సమూహానికి కొత్త వినియోగదారుని జోడించడంలో విఫలమైంది: {error}"
#: plinth/modules/users/forms.py:429
-#, fuzzy, python-brace-format
-#| msgid "Failed to restrict console access."
+#, python-brace-format
msgid "Failed to restrict console access: {error}"
-msgstr "console ప్రవేశమును పరిమితి చెయడంలొ విఫలమైంది."
+msgstr "కన్సోల్ యాక్సెస్ని పరిమితం చేయడంలో విఫలమైంది: {error}"
#: plinth/modules/users/forms.py:442
msgid "User account created, you are now logged in"
@@ -7222,16 +7082,12 @@ msgid "Create Account"
msgstr "ఖాతా సృష్టించు"
#: plinth/modules/users/templates/users_firstboot.html:32
-#, fuzzy
-#| msgid "Administrator Account"
msgid "An administrator account already exists."
-msgstr "నిర్వాహక ఖాతా"
+msgstr "నిర్వహణదారుడు ఖాతా ఇప్పటికే ఉంది."
#: plinth/modules/users/templates/users_firstboot.html:38
-#, fuzzy
-#| msgid "Cannot delete the only administrator in the system."
msgid "The following administrator accounts exist in the system."
-msgstr "సిస్టమ్లోని ఏకైక నిర్వాహకుడిని తొలగించలేరు."
+msgstr "వ్యవస్థలో కింది నిర్వాహక ఖాతాలు ఉన్నాయి."
#: plinth/modules/users/templates/users_firstboot.html:50
#, python-format, python-brace-format
@@ -7242,6 +7098,10 @@ msgid ""
"{username}'. If an account is already usable with %(box_name)s, skip this "
"step."
msgstr ""
+"కమాండ్ లైన్ నుండి ఈ ఖాతాలను తొలగించండి మరియు %(box_name)sతో ఉపయోగించగల ఖాతాను సృష్టించడానికి పేజీని "
+"రిఫ్రెష్ చేయండి. కమాండ్ లైన్లో 'echo \"{password}\" | ఆదేశాన్ని అమలు చేయండి /usr/share/plinth/"
+"actions/users remove-user {username}'. ఒక ఖాతాను ఇప్పటికే %(box_name)sతో "
+"ఉపయోగించగలిగితే, ఈ దశను దాటవేయండి."
#: plinth/modules/users/templates/users_list.html:11
#: plinth/modules/users/views.py:61
@@ -7259,10 +7119,9 @@ msgid "Delete user %(username)s"
msgstr "వినియోగదారి %(username)s ను తొలగించు"
#: plinth/modules/users/templates/users_update.html:11
-#, fuzzy, python-format
-#| msgid "Edit user %(username)s"
+#, python-format
msgid "Edit User %(username)s"
-msgstr "%(username)s వినియోగదారుని మార్చు"
+msgstr "వినియోగదారు%(username)sని సవరించండి"
#: plinth/modules/users/templates/users_update.html:19
#, python-format
@@ -7310,73 +7169,72 @@ msgid "Password changed successfully."
msgstr "పాస్వర్డ్ విజయవంతంగా మార్చబడినది."
#: plinth/modules/wireguard/__init__.py:20
-#, fuzzy
msgid "WireGuard is a fast, modern, secure VPN tunnel."
-msgstr "వైర్గార్డ్ వేగవంతమైన, ఆధునిక, సురక్షితమైన VPN సొరంగం."
+msgstr "వైర్గార్డ్ వేగవంతమైన, ఆధునిక, సురక్షితమైన వపన్ సొరంగం."
#: plinth/modules/wireguard/__init__.py:22
-#, python-brace-format
+#, fuzzy, python-brace-format
msgid ""
"It can be used to connect to a VPN provider which supports WireGuard, and to "
"route all outgoing traffic from {box_name} through the VPN."
msgstr ""
+"ఇది వీరేగార్డ్కి మద్దతిచ్చే వపన్ ప్రొవైడర్కి కనెక్ట్ చేయడానికి మరియుబాక్స్_నామ నుండి వపన్ ద్వారా అవుట్గోయింగ్ ట్రాఫిక్ "
+"మొత్తాన్ని రూట్ చేయడానికి ఉపయోగించవచ్చు. {box_name}"
#: plinth/modules/wireguard/__init__.py:26
-#, python-brace-format
+#, fuzzy, python-brace-format
msgid ""
"A second use case is to connect a mobile device to {box_name} while "
"travelling. While connected to a public Wi-Fi network, all traffic can be "
"securely relayed through {box_name}."
msgstr ""
+"ప్రయాణిస్తున్నప్పుడు చరవాణి పరికరాన్ని బాక్స్_నామకి కనెక్ట్ చేయడం రెండవ ఉపయోగ సందర్భం. పబ్లిక్ వి-ఫై "
+"నెట్వర్క్కి కనెక్ట్ చేయబడినప్పుడు, ట్రాఫిక్ మొత్తం బాక్స్_నామ ద్వారా సురక్షితంగా ప్రసారం చేయబడుతుంది. "
+"{box_name} {box_name}"
#: plinth/modules/wireguard/forms.py:32
-#, fuzzy
-#| msgid "Invalid kite name"
msgid "Invalid key."
-msgstr "చెల్లని కైట్ పేరు"
+msgstr "చెల్లని తాళంచెవి ."
#: plinth/modules/wireguard/forms.py:61
#: plinth/modules/wireguard/templates/wireguard.html:17
#: plinth/modules/wireguard/templates/wireguard.html:77
#: plinth/modules/wireguard/templates/wireguard_delete_server.html:24
-#, fuzzy
-#| msgid "Publish Key"
msgid "Public Key"
-msgstr "కీని ప్రచురించండి"
+msgstr "ప్రజా తాళంచెవి"
#: plinth/modules/wireguard/forms.py:62
msgid ""
"Public key of the peer. Example: "
"MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ."
-msgstr ""
+msgstr "పీర్ యొక్క ప్రజా తాళంచెవి ఉదాహరణ:ఎంకోనేజ్ఫిగ్౬+డీఫ్హఙ౨జ్౧ణ్ణ౯శ్నలొసే౯కృ౦య్సద్ప్గ్మ్పజిబ్స్."
#: plinth/modules/wireguard/forms.py:70
msgid "Endpoint of the server"
-msgstr ""
+msgstr "సర్వర్ యొక్క ముగింపు స్థానం"
#: plinth/modules/wireguard/forms.py:71
msgid ""
"Domain name and port in the form \"ip:port\". Example: demo.wireguard."
"com:12912 ."
msgstr ""
+"\"ip:port\" రూపంలోఅధికారక్షేత్రం పేరు మరియు పోర్ట్. ఉదాహరణ: demo.wireguard.com:12912 ."
#: plinth/modules/wireguard/forms.py:76
-#, fuzzy
-#| msgid "Published key to keyserver."
msgid "Public key of the server"
-msgstr "కీ కీసేవకానికి ప్రచురించబడింది."
+msgstr "సర్వర్ యొక్క ప్రజా తాళంచెవి ."
#: plinth/modules/wireguard/forms.py:77
msgid ""
"Provided by the server operator, a long string of characters. Example: "
"MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ."
msgstr ""
+"సర్వర్ ఆపరేటర్ ద్వారా అందించబడింది, అక్షరాల యొక్క పొడవైన స్ట్రింగ్. ఉదాహరణ: "
+"MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ."
#: plinth/modules/wireguard/forms.py:82
-#, fuzzy
-#| msgid "A list of IP addresses, separated by space"
msgid "Client IP address provided by server"
-msgstr "IP చిరునామాల జాబితా, స్పేస్ ద్వారా వేరుచేయటమయినది"
+msgstr "సర్వర్ అందించిన క్లయింట్ IP చిరునామా"
#: plinth/modules/wireguard/forms.py:83
msgid ""
@@ -7384,10 +7242,12 @@ msgid ""
"endpoint. This value is usually provided by the server operator. Example: "
"192.168.0.10."
msgstr ""
+"ఎండ్ పాయింట్కి కనెక్ట్ చేసిన తర్వాత వపన్ లో ఈ మెషీన్కు ఇప్ చిరునామా కేటాయించబడుతుంది. ఈ విలువ సాధారణంగా "
+"సర్వర్ ఆపరేటర్ ద్వారా అందించబడుతుంది. ఉదాహరణ: ౧౯౨.౧౬౮.౦.౧౦."
#: plinth/modules/wireguard/forms.py:89
msgid "Private key of this machine"
-msgstr ""
+msgstr "ఈ యంత్రం యొక్క స్వంత తాళం"
#: plinth/modules/wireguard/forms.py:90
msgid ""
@@ -7396,10 +7256,13 @@ msgid ""
"some server operators insist on providing this. Example: "
"MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ."
msgstr ""
+"ఐచ్ఛికం. ఖాళీగా ఉంచితే కొత్త పబ్లిక్/ప్రైవేట్ కీలు రూపొందించబడతాయి. పబ్లిక్ కీని సర్వర్కు అందించవచ్చు. ఇది "
+"సిఫార్సు చేయబడిన మార్గం. అయితే, కొంతమంది సర్వర్ ఆపరేటర్లు దీన్ని అందించాలని పట్టుబట్టారు. ఉదాహరణ:"
+"MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs= ."
#: plinth/modules/wireguard/forms.py:98
msgid "Pre-shared key"
-msgstr ""
+msgstr "ముందుగా భాగస్వామ్యం చేసిన తాళం"
#: plinth/modules/wireguard/forms.py:99
msgid ""
@@ -7407,24 +7270,24 @@ msgid ""
"layer of security. Fill in only if provided. Example: "
"MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=."
msgstr ""
+"ఐచ్ఛికం. అదనపు భద్రతా పొరను జోడించడానికి సర్వర్ అందించిన షేర్డ్ సీక్రెట్ కీ. అందించినట్లయితే మాత్రమే "
+"పూరించండి. ఉదాహరణ: MConEJFIg6+DFHg2J1nn9SNLOSE9KR0ysdPgmPjibEs=."
#: plinth/modules/wireguard/forms.py:105
msgid "Use this connection to send all outgoing traffic"
-msgstr ""
+msgstr "అవుట్గోయింగ్ ట్రాఫిక్ మొత్తాన్ని పంపడానికి ఈ కనెక్షన్ని ఉపయోగించండి"
#: plinth/modules/wireguard/forms.py:107
msgid "Typically checked for a VPN service through which all traffic is sent."
-msgstr ""
+msgstr "సాధారణంగా ట్రాఫిక్ మొత్తం పంపబడే వపన్ సేవ కోసం తనిఖీ చేయబడుతుంది."
#: plinth/modules/wireguard/templates/wireguard.html:10
-#, fuzzy
-#| msgid "Chat Server"
msgid "As a Server"
-msgstr "కబుర్ల సేవిక"
+msgstr "ఛాయస్ ఆ సర్వర్"
#: plinth/modules/wireguard/templates/wireguard.html:12
msgid "Peers allowed to connect to this server:"
-msgstr ""
+msgstr "ఈ సర్వర్కి కనెక్ట్ చేయడానికి సహచరులు అనుమతించబడ్డారు:"
#: plinth/modules/wireguard/templates/wireguard.html:18
msgid "Allowed IPs"
@@ -7432,10 +7295,8 @@ msgstr "అనుమతించబడిన ఐపిలు"
#: plinth/modules/wireguard/templates/wireguard.html:19
#: plinth/modules/wireguard/templates/wireguard.html:78
-#, fuzzy
-#| msgid "Create Connection"
msgid "Last Connected Time"
-msgstr "అనుసంధానం సృష్టించు"
+msgstr "చివరిగా కనెక్ట్ చేయబడిన సమయం"
#: plinth/modules/wireguard/templates/wireguard.html:38
#, python-format
@@ -7443,20 +7304,15 @@ msgid "No peers configured to connect to this %(box_name)s yet."
msgstr "ఈ %(box_name)s కు కనెక్ట్ చేయడానికి సహచరులు ఇంకా కాన్ఫిగర్ చేయబడలేదు."
#: plinth/modules/wireguard/templates/wireguard.html:48
-#, fuzzy, python-format
-#| msgid "Public key of this machine:"
+#, python-format
msgid "Public key for this %(box_name)s:"
-msgstr "ఈ యంత్రం యొక్క పబ్లిక్ కీ:"
+msgstr "ఈ %(box_name)s కోసం స్వయం తాళం :"
#: plinth/modules/wireguard/templates/wireguard.html:54
-#, fuzzy
-#| msgid "No shares currently configured."
msgid "Not configured yet."
msgstr "ప్రస్తుతం ఏ షేర్లు ఏర్పాటు చేయబడలేదు."
#: plinth/modules/wireguard/templates/wireguard.html:59
-#, fuzzy
-#| msgid "Add new introducer"
msgid "Add a new peer"
msgstr "కొత్త పరిచయకర్తని జోడించండి"
@@ -7466,8 +7322,6 @@ msgid "Add Allowed Client"
msgstr "అనుమతించబడిన క్లయింట్ను జోడించండి"
#: plinth/modules/wireguard/templates/wireguard.html:67
-#, fuzzy
-#| msgid "Chat Client"
msgid "As a Client"
msgstr "చాట్ క్లయింట్"
@@ -7486,20 +7340,15 @@ msgid "No connections to remote servers are configured yet."
msgstr "రిమోట్ సర్వర్ లకు కనెక్షన్ లు ఇంకా కాన్ఫిగర్ చేయబడలేదు."
#: plinth/modules/wireguard/templates/wireguard.html:110
-#, fuzzy
-#| msgid "Add new introducer"
msgid "Add a new server"
msgstr "కొత్త పరిచయకర్తని జోడించండి"
#: plinth/modules/wireguard/templates/wireguard.html:114
#: plinth/modules/wireguard/views.py:157
-#, fuzzy
-#| msgid "Add Connection"
msgid "Add Connection to Server"
msgstr "అనుసంధానాన్ని జతచేయండి"
#: plinth/modules/wireguard/templates/wireguard_add_client.html:19
-#, fuzzy
msgid "Add Client"
msgstr "ఐ ర్ సి క్లయింట్ (Quassel)"
@@ -7512,23 +7361,21 @@ msgid "Are you sure that you want to delete this server?"
msgstr "ఈ సర్వర్ ని మీరు కచ్చితంగా డిలీట్ చేయాలని అనుకుంటున్నారా?"
#: plinth/modules/wireguard/templates/wireguard_edit_client.html:19
-#, fuzzy
-#| msgid "Chat Client"
msgid "Update Client"
-msgstr "చాట్ క్లయింట్"
+msgstr "క్లయింట్ని నవీకరించండి"
#: plinth/modules/wireguard/templates/wireguard_edit_server.html:19
-#, fuzzy
-#| msgid "Create Connection"
msgid "Update Connection"
-msgstr "అనుసంధానం సృష్టించు"
+msgstr "కనెక్షన్ని నవీకరించండి"
#: plinth/modules/wireguard/templates/wireguard_show_client.html:12
-#, python-format
+#, fuzzy, python-format
msgid ""
"%(box_name)s will allow this client to connect to it. Ensure that the client "
"is configured with the following information."
msgstr ""
+"%(box_name)s (బాక్స్_నామ)స్ఈ క్లయింట్కి కనెక్ట్ చేయడానికి అనుమతిస్తుంది. క్లయింట్ కింది సమాచారంతో కాన్ఫిగర్ "
+"చేయబడిందని నిర్ధారించుకోండి."
#: plinth/modules/wireguard/templates/wireguard_show_client.html:21
msgid "Client public key:"
@@ -7574,6 +7421,8 @@ msgid ""
"information. Ensure that the server is configured to allow %(box_name)s's "
"public key and IP address."
msgstr ""
+"%(box_name)s స్కింది సమాచారంతో వీరేగార్డ్ సర్వర్ని చేరుకోవడానికి ప్రయత్నిస్తుంది. పబ్లిక్ కీ మరియు IP "
+"చిరునామాను అనుమతించడానికి సర్వర్ కాన్ఫిగర్ చేయబడిందని నిర్ధారించుకోండి."
#: plinth/modules/wireguard/templates/wireguard_show_server.html:24
msgid "Server endpoint:"
@@ -7588,82 +7437,60 @@ msgid "IP address of this machine:"
msgstr "ఈ యంత్రం యొక్క IP చిరునామా:"
#: plinth/modules/wireguard/views.py:43
-#, fuzzy
-#| msgid "Add new introducer"
msgid "Added new client."
-msgstr "కొత్త పరిచయకర్తని జోడించండి"
+msgstr "కొత్త క్లయింట్ జోడించబడింది."
#: plinth/modules/wireguard/views.py:58 plinth/modules/wireguard/views.py:117
-#, fuzzy
msgid "Client with public key already exists"
-msgstr "ఈ సేవ ఇప్పటికే ఉంది"
+msgstr "పబ్లిక్ కీతో క్లయింట్ ఇప్పటికే ఉంది"
#: plinth/modules/wireguard/views.py:71
-#, fuzzy
msgid "Allowed Client"
-msgstr "తపాల బంట్రౌతు(Roundcube)"
+msgstr "అనుమతించబడిన క్లయింట్"
#: plinth/modules/wireguard/views.py:93
-#, fuzzy
-#| msgid "Update setup"
msgid "Updated client."
-msgstr "అమరికను నవీకరించు"
+msgstr "నవీకరించబడిన క్లయింట్."
#: plinth/modules/wireguard/views.py:98
-#, fuzzy
msgid "Modify Client"
-msgstr "తపాల బంట్రౌతు(Roundcube)"
+msgstr "క్లయింట్ని సవరించండి"
#: plinth/modules/wireguard/views.py:131
-#, fuzzy
-#| msgid "Delete All"
msgid "Delete Allowed Client"
-msgstr "అన్నింటిని తొలగించు"
+msgstr "అనుమతించబడిన క్లయింట్ను తొలగించండి"
#: plinth/modules/wireguard/views.py:140
-#, fuzzy
-#| msgid "{name} deleted."
msgid "Client deleted."
-msgstr "{name} తొలగించబడింది."
+msgstr "క్లయింట్ తొలగించబడింది."
#: plinth/modules/wireguard/views.py:142
msgid "Client not found"
msgstr "క్లయింట్ దొరకలేదు"
#: plinth/modules/wireguard/views.py:152
-#, fuzzy
msgid "Added new server."
-msgstr "కస్టమ్ సేవ చేర్చబడింది"
+msgstr "కొత్త సర్వర్ జోడించబడింది."
#: plinth/modules/wireguard/views.py:173
-#, fuzzy
-#| msgid "Connection Type"
msgid "Connection to Server"
-msgstr "అనుసంధాన రకం"
+msgstr "సర్వర్కి కనెక్షన్"
#: plinth/modules/wireguard/views.py:191
-#, fuzzy
-#| msgid "Update setup"
msgid "Updated server."
-msgstr "అమరికను నవీకరించు"
+msgstr "నవీకరించబడిన సర్వర్."
#: plinth/modules/wireguard/views.py:196
-#, fuzzy
-#| msgid "Edit Connection"
msgid "Modify Connection to Server"
-msgstr "అనుసంధానాన్ని సవరించండి"
+msgstr "సర్వర్కి కనెక్షన్ని సవరించండి"
#: plinth/modules/wireguard/views.py:233
-#, fuzzy
-#| msgid "Delete Connection"
msgid "Delete Connection to Server"
-msgstr "అనుసంధానం తొలగించు"
+msgstr "సర్వర్కు కనెక్షన్ని తొలగించండి"
#: plinth/modules/wireguard/views.py:253
-#, fuzzy
-#| msgid "{name} deleted."
msgid "Server deleted."
-msgstr "{name} తొలగించబడింది."
+msgstr "సర్వర్ తొలగించబడింది."
#: plinth/modules/wordpress/__init__.py:23
msgid ""
@@ -7673,6 +7500,10 @@ msgid ""
"Administration interface and produced web pages are suitable for mobile "
"devices."
msgstr ""
+"వెబ్సైట్లు మరియు బ్లాగులను సృష్టించడానికి మరియు నిర్వహించడానికి WordPress ఒక ప్రసిద్ధ మార్గం. విజువల్ "
+"ఇంటర్ఫేస్ని ఉపయోగించి కంటెంట్ని మేనేజ్ చేయవచ్చు. వెబ్ పేజీల లేఅవుట్ మరియు కార్యాచరణను అనుకూలీకరించవచ్చు. "
+"థీమ్లను ఉపయోగించి రూపాన్ని ఎంచుకోవచ్చు. అడ్మినిస్ట్రేషన్ ఇంటర్ఫేస్ మరియు ఉత్పత్తి చేయబడిన వెబ్ పేజీలు మొబైల్ "
+"పరికరాలకు అనుకూలంగా ఉంటాయి."
#: plinth/modules/wordpress/__init__.py:29
#, python-brace-format
@@ -7682,6 +7513,10 @@ msgid ""
"the correct domain name. Enable permalinks in administrator interface for "
"better URLs to your pages and posts."
msgstr ""
+"దిగువన ఉన్న సైట్ను పబ్లిక్గా అందుబాటులో ఉంచడానికి ముందు మీరు యాప్ని సందర్శించడం ద్వారా WordPress "
+"సెటప్ని అమలు చేయాలి. సరైన డొమైన్ పేరుతో {box_name}ని యాక్సెస్ చేస్తున్నప్పుడు సెటప్ తప్పనిసరిగా అమలు "
+"చేయబడాలి. మీ పేజీలు మరియు పోస్ట్లకు మెరుగైన URLల కోసం అడ్మినిస్ట్రేటర్ ఇంటర్ఫేస్లో పెర్మాలింక్లను "
+"ప్రారంభించండి."
#: plinth/modules/wordpress/__init__.py:34
msgid ""
@@ -7689,6 +7524,9 @@ msgid ""
"during setup. Bookmark the admin page "
"to reach administration interface in the future."
msgstr ""
+"వర్డుప్రెస్సు దాని స్వంత వినియోగదారు ఖాతాలను కలిగి ఉంది. సెటప్ సమయంలో మొదటి అడ్మినిస్ట్రేటర్ ఖాతా "
+"సృష్టించబడుతుంది. భవిష్యత్తులో అడ్మినిస్ట్రేషన్ ఇంటర్ఫేస్ను చేరుకోవడానికి అడ్మిన్ పేజీని బుక్మార్క్ చేయండి."
#: plinth/modules/wordpress/__init__.py:38
msgid ""
@@ -7696,23 +7534,20 @@ msgid ""
"from administrator interface. Additional plugins or themes may be installed "
"and upgraded at your own risk."
msgstr ""
+"ప్రధాన సంస్కరణ మెరుగుపరుచు తర్వాత, మీరు నిర్వహణ నుండి దత్తాంశస్థానం అప్గ్రేడ్ను మాన్యువల్గా అమలు "
+"చేయాలి. అదనపు ప్లగిన్లు లేదా థీమ్లు మీ స్వంత పూచీతో ఇన్స్టాల్ చేయబడవచ్చు మరియు మెరుగుపరుచు "
+"చేయబడవచ్చు."
#: plinth/modules/wordpress/__init__.py:58
#: plinth/modules/wordpress/manifest.py:6
-#, fuzzy
-#| msgid "Address"
msgid "WordPress"
-msgstr "చిరునామా"
+msgstr "వర్డుప్రెస్సు"
#: plinth/modules/wordpress/__init__.py:59
-#, fuzzy
-#| msgid "Wiki and Blog"
msgid "Website and Blog"
-msgstr "వికీ మరియు బ్లాగ్"
+msgstr "వెబ్సైట్ మరియు బ్లాగ్"
#: plinth/modules/wordpress/forms.py:14
-#, fuzzy
-#| msgid "public access"
msgid "Public access"
msgstr "ప్రజా ప్రాప్తి"
@@ -7721,6 +7556,8 @@ msgid ""
"Allow all visitors. Disabling allows only administrators to view the "
"WordPress site or blog. Enable only after performing initial WordPress setup."
msgstr ""
+"సందర్శకులందరినీ అనుమతించండి. నిరుపయోగం చేయడం వలన వర్డుప్రెస్సు సైట్ లేదా బ్లాగును వీక్షించడానికి "
+"నిర్వాహకులు మాత్రమే అనుమతిస్తుంది. ప్రారంభ వర్డుప్రెస్సు సెటప్ చేసిన తర్వాత మాత్రమే ప్రారంభించండి."
#: plinth/modules/zoph/__init__.py:26
#, python-brace-format
@@ -7734,6 +7571,12 @@ msgid ""
"location using search, map and calendar views. Individual photos can be "
"shared with others by sending a direct link."
msgstr ""
+"Zoph మీ ఫోటో సేకరణను నిర్వహిస్తుంది. ఫోటోలు మీ నియంత్రణలో మీ {box_name}లో నిల్వ చేయబడతాయి. పబ్లిక్ "
+"డిస్ప్లే కోసం గ్యాలరీలపై దృష్టి పెట్టే బదులు, వాటిని మీ స్వంత ఉపయోగం కోసం నిర్వహించడం, వాటిని ఎవరు "
+"తీసుకెళ్లారు, ఎక్కడికి తీసుకెళ్లారు మరియు వాటిలో ఉన్న వారి ద్వారా వాటిని నిర్వహించడంపై జోఫ్ దృష్టి సారిస్తుంది. "
+"ఫోటోలను బహుళ క్రమానుగత ఆల్బమ్లు మరియు వర్గాలకు లింక్ చేయవచ్చు. శోధన, మ్యాప్ మరియు క్యాలెండర్ "
+"వీక్షణలను ఉపయోగించి ఒక వ్యక్తిని కలిగి ఉన్న అన్ని ఫోటోలు లేదా తేదీలో తీసిన ఫోటోలు లేదా ఒక ప్రదేశంలో తీసిన "
+"ఫోటోలను కనుగొనడం సులభం. డైరెక్ట్ లింక్ని పంపడం ద్వారా వ్యక్తిగత ఫోటోలను ఇతరులతో పంచుకోవచ్చు."
#: plinth/modules/zoph/__init__.py:37
#, python-brace-format
@@ -7742,38 +7585,40 @@ msgid ""
"Zoph. For additional users, accounts must be created both in {box_name} and "
"in Zoph with the same user name."
msgstr ""
+"జోఫ్ని సెటప్ చేసిన {box_name} వినియోగదారు కూడా Zophలో నిర్వాహకులు అవుతారు. అదనపు వినియోగదారుల "
+"కోసం, ఖాతాలు తప్పనిసరిగా {box_name}లో మరియు జోఫ్లో ఒకే వినియోగదారు పేరుతో సృష్టించబడాలి."
#: plinth/modules/zoph/__init__.py:58 plinth/modules/zoph/manifest.py:6
msgid "Zoph"
-msgstr ""
+msgstr "జోఫ్"
#: plinth/modules/zoph/__init__.py:59
msgid "Photo Organizer"
-msgstr ""
+msgstr "ఫోటో ఆర్గనైజర్"
#: plinth/modules/zoph/forms.py:14
msgid "Enable OpenStreetMap for maps"
-msgstr ""
+msgstr "మ్యాప్ల కోసం ఓపెన్స్ట్రీట్మ్యాప్ని ప్రారంభించండి"
#: plinth/modules/zoph/forms.py:15
msgid ""
"When enabled, requests will be made to OpenStreetMap servers from user's "
"browser. This impacts privacy."
msgstr ""
+"ప్రారంభించబడినప్పుడు, వినియోగదారు బ్రౌజర్ నుండి ఓపెన్స్ట్రీట్మ్యాప్ని సర్వర్లకు అభ్యర్థనలు చేయబడతాయి. ఇది "
+"గోప్యతను ప్రభావితం చేస్తుంది."
#: plinth/modules/zoph/templates/zoph-pre-setup.html:15
#: plinth/modules/zoph/templates/zoph-pre-setup.html:28
-#, fuzzy
-#| msgid "Start Setup"
msgid "Setup"
-msgstr "అమరికను ప్రారంభించు"
+msgstr "అమర్చిపెట్టు"
#: plinth/modules/zoph/templates/zoph-pre-setup.html:18
#, python-format
msgid ""
"User account %(username)s will become the administrator "
"account for Zoph."
-msgstr ""
+msgstr "వినియోగదారు ఖాతా %(username)s జోఫ్ కోసం నిర్వాహక ఖాతా అవుతుంది."
#: plinth/network.py:29
msgid "PPPoE"
@@ -7786,7 +7631,7 @@ msgstr "సాధారణమైన"
#: plinth/package.py:94
#, python-brace-format
msgid "Package {package_name} is the latest version ({latest_version})"
-msgstr ""
+msgstr "ప్యాకేజీ {package_name} తాజా వెర్షన్ ({latest_version})"
#: plinth/package.py:245
msgid "Error during installation"
@@ -7833,22 +7678,25 @@ msgid ""
"FreedomBox Service (Plinth) project issue tracker."
msgstr ""
+"ఈ తప్పిపోయిన పేజీ ఉనికిలో ఉందని మీరు విశ్వసిస్తే, దయచేసి ఫ్రీడంబోస్ సర్వీస్ (Plinth) ప్రాజెక్ట్ ఇష్యూ ట్రాకర్."
#: plinth/templates/500.html:10
msgid "500"
msgstr "500"
#: plinth/templates/500.html:14
-#, fuzzy, python-format
+#, python-format
msgid ""
"This is an internal error and not something you caused or can fix. Please "
"report the error on the bug tracker so we can fix it. Also, please attach "
"the status log to the bug report."
msgstr ""
-"ఈ చివరి% (num_lines) లు ఈ వెబ్ ఇంటర్ఫేస్ స్థితి లాగ్ 1 రేఖలు. మీరు ఒక బగ్ను నివేదించి అనుకుంటే, "
-"దయచేసి 2bug ట్రాకర్ "
-"తప్పుల నివేదిక ఈ స్థితి లాగ్ అటాచ్ 3 మరియు ఉపయోగించడానికి."
+"ఇది అంతర్గత లోపం మరియు మీరు కలిగించినది లేదా పరిష్కరించగలిగేది కాదు. దయచేసి బగ్ ట్రాకర్లో లోపాన్ని "
+"నివేదించండి, తద్వారా మేము దాన్ని పరిష్కరించగలము. అలాగే, దయచేసి బగ్ రిపోర్ట్కి స్టేటస్ లాగ్ని జత చేయండి."
#: plinth/templates/app-header.html:22
msgid "Installation"
@@ -7862,33 +7710,27 @@ msgstr "%(service_name)s సేవ నడవడం లేదు."
#: plinth/templates/base.html:30
#, python-format
msgid "Core functionality and web interface for %(box_name)s"
-msgstr ""
+msgstr "%(box_name)s కోసం కోర్ ఫంక్షనాలిటీ మరియు వెబ్ ఇంటర్ఫేస్"
#: plinth/templates/base.html:107
-#, fuzzy
-#| msgid "Home"
msgid " Home"
-msgstr "ముంగిలి"
+msgstr " నివాసం"
#: plinth/templates/base.html:110
msgid "Home"
msgstr "ముంగిలి"
#: plinth/templates/base.html:115
-#, fuzzy
-#| msgid "Apps"
msgid " Apps"
-msgstr "అనువర్తనాలు"
+msgstr " కార్యక్షేత్రం"
#: plinth/templates/base.html:119
msgid "Apps"
msgstr "అనువర్తనాలు"
#: plinth/templates/base.html:124
-#, fuzzy
-#| msgid "System"
msgid " System"
-msgstr "వ్యవస్థ"
+msgstr " కార్యవ్యవస్థ"
#: plinth/templates/base.html:128
msgid "System"
@@ -7920,20 +7762,16 @@ msgid "Launch web client"
msgstr "వెబ్ క్లయింట్ ని ప్రారంభించండి"
#: plinth/templates/clients-button.html:25
-#, fuzzy
msgid "Client Apps"
-msgstr "క్లయింట్ అనువర్తనాలు"
+msgstr "క్లయింట్ ర్యక్షేత్రం"
#: plinth/templates/clients.html:17
msgid "Web"
msgstr "వెబ్"
#: plinth/templates/clients.html:42
-#, fuzzy
msgid "Desktop"
-msgstr ""
-"చాట్ క్లయింట్\n"
-" (JSXC)"
+msgstr "రంగస్థలం"
#: plinth/templates/clients.html:53
msgid "GNU/Linux"
@@ -7960,9 +7798,8 @@ msgid "F-Droid"
msgstr "ఎఫ్-డ్రాయిడ్"
#: plinth/templates/clients.html:88
-#, fuzzy
msgid "App Store"
-msgstr "అన్హొస్టెడ్ స్టోరేజ్ ని (పునరుద్ధరించండి)"
+msgstr "యాప్ స్టోర్"
#: plinth/templates/clients.html:104
msgid "Package"
@@ -7995,6 +7832,8 @@ msgid ""
"Enable some applications to add shortcuts to "
"this page."
msgstr ""
+"ఈ పేజీకి సత్వరమార్గాలను జోడించడానికి కొన్ని అప్లికేషన్లను "
+"ప్రారంభించండి."
#: plinth/templates/index.html:108
#, python-format
@@ -8003,6 +7842,9 @@ msgid ""
"server to deploy social applications on small machines. It provides online "
"communication tools respecting your privacy and data ownership."
msgstr ""
+"%(box_name)s, డెబియన్ స్వచ్ఛమైన కలపడం, చిన్న మెషీన్లలో సోషల్ అప్లికేషన్లను అమలు చేయడానికి 100%% "
+"ఉచిత సాఫ్ట్వేర్ స్వీయ-హోస్టింగ్ వెబ్ సర్వర్. ఇది మీ గోప్యత మరియు డేటా యాజమాన్యానికి సంబంధించి ఆన్లైన్ కమ్యూనికేషన్ "
+"సాధనాలను అందిస్తుంది."
#: plinth/templates/index.html:117
#, python-format
@@ -8011,6 +7853,8 @@ msgid ""
"free software, distributed under the GNU Affero General Public License, "
"Version 3 or later."
msgstr ""
+"ఈ పోర్టల్ %(box_name)s వెబ్ సంవిధానంలో ఒక భాగం. %(box_name)s అనేది ఉచిత సాఫ్ట్వేర్, ఇది GNU "
+"అఫెరో జనరల్ పబ్లిక్ లైసెన్స్, వెర్షన్ 3 లేదా తదుపరిది కింద పంపిణీ చేయబడింది."
#: plinth/templates/index.html:137
msgid "Homepage"
@@ -8025,8 +7869,6 @@ msgid "Donate"
msgstr "విరాళమివ్వండి"
#: plinth/templates/index.html:147
-#, fuzzy
-#| msgid "FreedomBox Manual"
msgid "FreedomBox Foundation"
msgstr "ఫ్రీడమ్ బాక్స్ నిర్దేశిక"
@@ -8039,12 +7881,13 @@ msgid "Mailing list"
msgstr "మెయిలింగ్ జాబితా"
#: plinth/templates/internal-zone.html:11
-#, fuzzy, python-format
-#| msgid "Service discovery server is not running"
+#, python-format
msgid ""
"%(service_name)s is available only on internal networks or when the "
"client is connected to %(box_name)s through VPN."
-msgstr "సేవ ఆవిష్కరణ సేవికను నడుపటంలేదు"
+msgstr ""
+"%(service_name)s అంతర్గత నెట్వర్క్లలో లేదా క్లయింట్ VPN ద్వారా %(box_name)sకి కనెక్ట్ "
+"చేయబడినప్పుడు మాత్రమే అందుబాటులో ఉంటుంది."
#: plinth/templates/internal-zone.html:17
msgid "Currently there are no network interfaces configured as internal."
@@ -8060,29 +7903,24 @@ msgstr ""
#: plinth/templates/messages.html:11
msgid "Close"
-msgstr ""
+msgstr "దగ్గరగా"
#: plinth/templates/notifications-dropdown.html:11
-#, fuzzy
-#| msgid "No certificate"
msgid "Notifications"
-msgstr "ధృవీకరణ పత్రం లేదు"
+msgstr "నోటిఫికేషన్లు"
#: plinth/templates/port-forwarding-info.html:8
-#, fuzzy
msgid "Port Forwarding"
-msgstr "సబ్డొమైన్లు ప్రారంభించు"
+msgstr "రేవు ఫార్వార్డింగ్"
#: plinth/templates/port-forwarding-info.html:13
-#, fuzzy, python-format
-#| msgid ""
-#| "You may want to check the network setup "
-#| "and modify it if necessary."
+#, python-format
msgid ""
"Your FreedomBox is not behind a router. No "
"action is necessary."
msgstr ""
-"మీరు నెట్వర్క్ సెటప్ తనిఖీ చేసి, అవసరమైతే దాన్ని సవరించవచ్చు."
+"మీ ఫ్రీదోంబాక్స్ రూటర్ వెనుక లేదు. ఎటువంటి చర్య అవసరం "
+"లేదు."
#: plinth/templates/port-forwarding-info.html:19
#, python-format
@@ -8091,36 +7929,32 @@ msgid ""
"are using the DMZ feature to forward all ports. No further router "
"configuration is necessary."
msgstr ""
+"మీ ఫ్రీడమ్బాక్స్ రూటర్ వెనుక ఉంది మరియు మీరు అన్ని పోర్ట్లను "
+"ఫార్వార్డ్ చేయడానికి DMZ ఫీచర్ని ఉపయోగిస్తున్నారు. తదుపరి రూటర్ కాన్ఫిగరేషన్ అవసరం లేదు."
#: plinth/templates/port-forwarding-info.html:26
-#, fuzzy, python-format
-#| msgid ""
-#| "If your FreedomBox is behind a router, you will need to set up port "
-#| "forwarding on your router. You should forward the following ports for "
-#| "%(service_name)s:"
+#, python-format
msgid ""
"Your FreedomBox is behind a router and you "
"are not using the DMZ feature. You will need to set up port forwarding on "
"your router. You should forward the following ports for %(service_name)s:"
msgstr ""
-"మీ ఫ్రీడమ్బాక్స్ ఒక రౌటర్ వెనుక ఉంటే, మీరు మీ రౌటర్లో పోర్ట్ ఫార్వడింగ్ ను ఏర్పాటు చేయాల్సి ఉంటుంది. "
-"%(service_name)s కొరకు దిగువ పోర్టులను మీరు ఫార్వర్డ్ చేయాలి:"
+"మీ ఫ్రీదోంబాక్స్ రూటర్ వెనుక ఉంది మరియు మీరు DMZ ఫీచర్ని "
+"ఉపయోగించడం లేదు. మీరు మీ రూటర్లో పోర్ట్ ఫార్వార్డింగ్ని సెటప్ చేయాలి. మీరు %(service_name)s కోసం "
+"క్రింది పోర్ట్లను ఫార్వార్డ్ చేయాలి:"
#: plinth/templates/port-forwarding-info.html:37
-#, fuzzy
-#| msgid "protocol"
msgid "Protocol"
msgstr "ప్రోటోకాల్"
#: plinth/templates/port-forwarding-info.html:38
msgid "From Router/WAN Ports"
-msgstr ""
+msgstr "రూటర్/WAN పోర్ట్ల నుండి"
#: plinth/templates/port-forwarding-info.html:39
-#, fuzzy, python-format
-#| msgid "%(box_name)s Setup"
+#, python-format
msgid "To %(box_name)s Ports"
-msgstr "%(box_name)s అమరిక"
+msgstr "%(box_name)s పోర్ట్లకు"
#: plinth/templates/setup.html:24
msgid "Install this application?"
@@ -8151,6 +7985,8 @@ msgid ""
"conflict with the installation of this app. The following packages will be "
"removed if you proceed:"
msgstr ""
+"విరుద్ధమైన ప్యాకేజీలు: సిస్టమ్లో ఇన్స్టాల్ చేయబడిన కొన్ని ప్యాకేజీలు ఈ యాప్ ఇన్స్టాలేషన్తో "
+"విభేదిస్తున్నాయి. మీరు కొనసాగితే క్రింది ప్యాకేజీలు తీసివేయబడతాయి:"
#: plinth/templates/setup.html:71
msgid "Install"
@@ -8182,6 +8018,24 @@ msgstr "%(percentage)s %% పూర్తి"
msgid "Gujarati"
msgstr "గుజరాతీ"
+#~ msgid "Powered by Postfix, Dovecot & Rspamd"
+#~ msgstr "Postfix, Dovecot & Rspamd ద్వారా ఆధారితం"
+
+#~ msgid "Postfix-Dovecot SASL integration"
+#~ msgstr "Postfix-Dovecot SASL integration"
+
+#~ msgid "Postfix alias maps"
+#~ msgstr "పోస్ట్ఫిక్స్ అలియాస్ మ్యాప్స్"
+
+#~ msgid "Inbound and outbound mail filters"
+#~ msgstr "ఇన్బౌండ్ మరియు అవుట్బౌండ్ మెయిల్ ఫిల్టర్లు"
+
+#~ msgid "Disable"
+#~ msgstr "నిలిపివేయబడింది"
+
+#~ msgid "Enable"
+#~ msgstr "ప్రారంభించు"
+
#~ msgid "Enable Dynamic DNS"
#~ msgstr "చురుకైన DNS అమలుచెయ్యి"
diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po
index a062a2773..02e6d0db8 100644
--- a/plinth/locale/tr/LC_MESSAGES/django.po
+++ b/plinth/locale/tr/LC_MESSAGES/django.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-14 20:10-0500\n"
-"PO-Revision-Date: 2022-02-02 08:55+0000\n"
+"POT-Creation-Date: 2022-03-02 08:06-0500\n"
+"PO-Revision-Date: 2022-03-04 12:58+0000\n"
"Last-Translator: Burak Yavuz \n"
"Language-Team: Turkish \n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.11-dev\n"
+"X-Generator: Weblate 4.11.1-dev\n"
#: doc/dev/_templates/layout.html:11
msgid "Page source"
@@ -889,7 +889,7 @@ msgid "List"
msgstr "Listele"
#: plinth/modules/bepasty/views.py:52
-#: plinth/modules/email_server/templates/email_alias.html:28
+#: plinth/modules/email/templates/email-aliases.html:24
#: plinth/modules/letsencrypt/templates/letsencrypt.html:86
#: plinth/modules/networks/templates/connection_show.html:56
#: plinth/modules/samba/templates/samba.html:154
@@ -910,7 +910,7 @@ msgstr "Yönetici"
msgid "Configuration updated."
msgstr "Yapılandırma güncellendi."
-#: plinth/modules/bepasty/views.py:93 plinth/modules/email_server/views.py:41
+#: plinth/modules/bepasty/views.py:93 plinth/modules/email/views.py:48
#: plinth/modules/gitweb/views.py:117 plinth/modules/searx/views.py:41
#: plinth/modules/searx/views.py:52 plinth/modules/tor/views.py:159
#: plinth/modules/zoph/views.py:72
@@ -980,6 +980,7 @@ msgid "Serving Domains"
msgstr "Hizmet Veren Etki Alanları"
#: plinth/modules/bind/templates/bind.html:17
+#: plinth/modules/email/templates/email.html:38
#: plinth/modules/ikiwiki/forms.py:12
#: plinth/modules/names/templates/names.html:15
#: plinth/modules/networks/templates/connection_show.html:91
@@ -1007,7 +1008,7 @@ msgstr "IP adresi ve etki alanlarını yenile"
#: plinth/modules/bind/views.py:71 plinth/modules/coturn/views.py:39
#: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78
-#: plinth/modules/ejabberd/views.py:85 plinth/modules/email_server/views.py:38
+#: plinth/modules/ejabberd/views.py:85 plinth/modules/email/views.py:45
#: plinth/modules/matrixsynapse/views.py:124
#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:28
#: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28
@@ -1606,13 +1607,6 @@ msgstr ""
"adınızı sorarsa, şu anki IP adresinizle bir yanıt alacaktır."
#: plinth/modules/dynamicdns/__init__.py:41
-#, fuzzy
-#| msgid ""
-#| "If you are looking for a free dynamic DNS account, you may find a free "
-#| "GnuDIP service at ddns.freedombox.org or you may find free update URL "
-#| "based services at "
-#| "freedns.afraid.org."
msgid ""
"If you are looking for a free dynamic DNS account, you may find a free "
"GnuDIP service at ddns."
@@ -1707,10 +1701,8 @@ msgid "GnuDIP"
msgstr "GnuDIP"
#: plinth/modules/dynamicdns/forms.py:57
-#, fuzzy
-#| msgid "other update URL"
msgid "Other update URL"
-msgstr "diğer güncelleme URL'si"
+msgstr "Diğer güncelleme URL'si"
#: plinth/modules/dynamicdns/forms.py:59
msgid "Service Type"
@@ -1754,10 +1746,8 @@ msgid "Use IPv6 instead of IPv4"
msgstr "IPv4 yerine IPv6 kullan"
#: plinth/modules/dynamicdns/forms.py:123
-#, fuzzy
-#| msgid "secrets required"
msgid "This field is required."
-msgstr "gizli anahtarlar gerekli"
+msgstr "Bu alan gereklidir."
#: plinth/modules/dynamicdns/templates/dynamicdns.html:11
#: plinth/modules/firewall/templates/firewall.html:16
@@ -1774,6 +1764,7 @@ msgid "Status"
msgstr "Durum"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:18
+#: plinth/modules/email/templates/email.html:35
#: plinth/modules/letsencrypt/templates/letsencrypt.html:24
msgid "Domain"
msgstr "Etki Alanı"
@@ -1783,50 +1774,36 @@ msgid "Last update"
msgstr "Son güncelleme"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:21
-#, fuzzy
-#| msgid "IP address"
msgid "IP Address"
-msgstr "IP adresi"
+msgstr "IP Adresi"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:32
-#, fuzzy
-#| msgid "Access"
msgid "Success"
-msgstr "Erişim"
+msgstr "Başarılı"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:36
-#, fuzzy
-#| msgid "failed"
msgid "Failed"
-msgstr "başarısız"
+msgstr "Başarısız"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:52
-#, fuzzy
-#| msgid "No libraries available."
msgid "No status available."
-msgstr "Kullanılabilir kütüphane yok."
+msgstr "Mevcut durum yok."
#: plinth/modules/dynamicdns/views.py:24 plinth/modules/dynamicdns/views.py:26
-#, fuzzy
-#| msgid "Connection Name"
msgid "Connection timed out"
-msgstr "Bağlantı Adı"
+msgstr "Bağlantı zaman aşımı"
#: plinth/modules/dynamicdns/views.py:25
msgid "Could not find server"
-msgstr ""
+msgstr "Sunucu bulunamadı"
#: plinth/modules/dynamicdns/views.py:27
-#, fuzzy
-#| msgid "Delete connection"
msgid "Server refused connection"
-msgstr "Bağlantıyı sil"
+msgstr "Sunucu bağlantıyı reddetti"
#: plinth/modules/dynamicdns/views.py:28
-#, fuzzy
-#| msgid "Last update"
msgid "Already up-to-date"
-msgstr "Son güncelleme"
+msgstr "Zaten güncel"
#: plinth/modules/ejabberd/__init__.py:31
msgid ""
@@ -1979,7 +1956,32 @@ msgstr ""
"Etki alanınızı sistemde Yapılandır sayfasında "
"ayarlayabilirsiniz."
-#: plinth/modules/email_server/__init__.py:31
+#: plinth/modules/email/__init__.py:26
+msgid ""
+"This is a complete email server solution using Postfix, Dovecot, and Rspamd. "
+"Postfix sends and receives emails. Dovecot allows email clients to access "
+"your mailbox using IMAP and POP3. Rspamd deals with spam."
+msgstr ""
+"Bu, Postfix, Dovecot ve Rspamd kullanan tam bir e-posta sunucusu çözümüdür. "
+"Postfix e-posta gönderir ve alır. Dovecot, e-posta istemcilerinin IMAP ve "
+"POP3 kullanarak posta kutunuza erişmesini sağlar. Rspamd spam ile ilgilenir."
+
+#: plinth/modules/email/__init__.py:31
+#, python-brace-format
+msgid ""
+"Each user on {box_name} gets an email address like user@mydomain.example. "
+"They will also receive mail from all addresses that look like user"
+"+foo@mydomain.example. Further, they can add aliases to their email address. "
+"Necessary aliases such as \"postmaster\" are automatically created pointing "
+"to the first admin user."
+msgstr ""
+"{box_name} üzerindeki her kullanıcı, kullanici@etkialanim.ornek gibi bir e-"
+"posta adresi alır. Ayrıca kullanici+diger@etkialanim.ornek gibi görünen tüm "
+"adreslerden posta alacaklardır. Ayrıca, e-posta adreslerine kod adları "
+"ekleyebilirler. \"Postmaster\" gibi gerekli kod adları, ilk yönetici "
+"kullanıcıyı işaret ederek otomatik olarak oluşturulur."
+
+#: plinth/modules/email/__init__.py:37
msgid ""
"Roundcube app provides web interface "
"for users to access email."
@@ -1987,38 +1989,34 @@ msgstr ""
"Roundcube uygulaması, kullanıcıların "
"e-postaya erişmesi için web arayüzü sağlar."
-#: plinth/modules/email_server/__init__.py:33
+#: plinth/modules/email/__init__.py:39
msgid ""
"During installation, any other email servers in the system will be "
"uninstalled."
msgstr ""
"Kurulum sırasında sistemdeki diğer tüm e-posta sunucuları kaldırılacaktır."
-#: plinth/modules/email_server/__init__.py:44
+#: plinth/modules/email/__init__.py:58
+msgid "Postfix/Dovecot"
+msgstr "Postfix/Dovecot"
+
+#: plinth/modules/email/__init__.py:60
msgid "Email Server"
msgstr "E-posta Sunucusu"
-#: plinth/modules/email_server/__init__.py:100
-msgid "Powered by Postfix, Dovecot & Rspamd"
-msgstr "Postfix, Dovecot ve Rspamd tarafından desteklenmektedir"
+#: plinth/modules/email/__init__.py:80
+msgid "My Email Aliases"
+msgstr "E-posta Kod Adlarım"
-#: plinth/modules/email_server/audit/ldap.py:68
-msgid "Postfix-Dovecot SASL integration"
-msgstr "Postfix-Dovecot SASL bütünleştirmesi"
+#: plinth/modules/email/__init__.py:81
+msgid "Manage Aliases for Mailbox"
+msgstr "Posta Kutusu için Kod Adlarını Yönet"
-#: plinth/modules/email_server/audit/ldap.py:69
-msgid "Postfix alias maps"
-msgstr "Postfix kod adı eşlemeleri"
-
-#: plinth/modules/email_server/audit/spam.py:87
-msgid "Inbound and outbound mail filters"
-msgstr "Gelen ve giden posta süzgeçleri"
-
-#: plinth/modules/email_server/forms.py:24
+#: plinth/modules/email/forms.py:25
msgid "Primary domain"
msgstr "Birincil etki alanı"
-#: plinth/modules/email_server/forms.py:26
+#: plinth/modules/email/forms.py:27
msgid ""
"Mails are received for all domains configured in the system. Among these, "
"select the most important one."
@@ -2026,89 +2024,102 @@ msgstr ""
"Postalar sistemde yapılandırılan tüm etki alanları için alınır. Bunlar "
"arasından en önemli olanı seçin."
-#: plinth/modules/email_server/forms.py:34
+#: plinth/modules/email/forms.py:35
msgid "New alias (without @domain)"
msgstr "Yeni kod adı (@domain olmadan)"
-#: plinth/modules/email_server/forms.py:41
+#: plinth/modules/email/forms.py:42
msgid "Contains illegal characters"
msgstr "Geçersiz karakterler içeriyor"
-#: plinth/modules/email_server/forms.py:44
+#: plinth/modules/email/forms.py:45
msgid "Must start and end with a-z or 0-9"
msgstr "A-z veya 0-9 ile başlamalı ve bitmelidir"
-#: plinth/modules/email_server/forms.py:47
+#: plinth/modules/email/forms.py:49
msgid "Cannot be a number"
msgstr "Sayı olamaz"
-#: plinth/modules/email_server/forms.py:57
+#: plinth/modules/email/forms.py:59
msgid "Aliases"
msgstr "Kod Adları"
-#: plinth/modules/email_server/forms.py:69
-#: plinth/modules/firewall/templates/firewall.html:54
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-msgid "Enabled"
-msgstr "Etkinleştirildi"
-
-#: plinth/modules/email_server/forms.py:72
-#: plinth/modules/firewall/templates/firewall.html:57
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-#: plinth/templates/cards.html:34
-msgid "Disabled"
-msgstr "Etkisizleştirildi"
-
-#: plinth/modules/email_server/manifest.py:8
-#: plinth/modules/roundcube/__init__.py:54
+#: plinth/modules/email/manifest.py:12 plinth/modules/roundcube/__init__.py:54
#: plinth/modules/roundcube/manifest.py:6
msgid "Roundcube"
msgstr "Roundcube"
-#: plinth/modules/email_server/manifest.py:16
-#: plinth/modules/radicale/manifest.py:36
+#: plinth/modules/email/manifest.py:20 plinth/modules/radicale/manifest.py:36
msgid "Thunderbird"
msgstr "Thunderbird"
-#: plinth/modules/email_server/manifest.py:33
+#: plinth/modules/email/manifest.py:37
msgid "K-9 Mail"
msgstr "K-9 Mail"
-#: plinth/modules/email_server/manifest.py:48
+#: plinth/modules/email/manifest.py:52
msgid "FairEmail"
msgstr "FairEmail"
-#: plinth/modules/email_server/templates/email_alias.html:13
-#: plinth/modules/email_server/templates/email_server.html:15
+#: plinth/modules/email/templates/email-aliases.html:13
+#: plinth/modules/email/templates/email.html:15
msgid "Manage Aliases"
msgstr "Kod Adlarını Yönet"
-#: plinth/modules/email_server/templates/email_alias.html:16
+#: plinth/modules/email/templates/email-aliases.html:16
msgid "You have no email aliases."
msgstr "E-posta kod adlarınız yok."
-#: plinth/modules/email_server/templates/email_alias.html:24
-msgid "Disable"
-msgstr "Etkisizleştir"
-
-#: plinth/modules/email_server/templates/email_alias.html:26
-msgid "Enable"
-msgstr "Etkinleştir"
-
-#: plinth/modules/email_server/templates/email_alias.html:32
+#: plinth/modules/email/templates/email-aliases.html:28
msgid "Create a new email alias"
msgstr "Yeni bir e-posta kod adı oluşturun"
-#: plinth/modules/email_server/templates/email_alias.html:38
+#: plinth/modules/email/templates/email-aliases.html:34
msgid "Add"
msgstr "Ekle"
-#: plinth/modules/email_server/templates/email_server.html:10
+#: plinth/modules/email/templates/email.html:10
msgid "Manage Spam"
msgstr "İstenmeyen İletiyi Yönet"
+#: plinth/modules/email/templates/email.html:22
+msgid "DNS Records"
+msgstr "DNS Kayıtları"
+
+#: plinth/modules/email/templates/email.html:25
+msgid ""
+"The following DNS records must be added manually on your primary domain for "
+"the mail server to work properly."
+msgstr ""
+"Posta sunucusunun düzgün çalışması için aşağıdaki DNS kayıtları birincil "
+"etki alanınıza el ile eklenmek zorundadır."
+
+#: plinth/modules/email/templates/email.html:36
+msgid "TTL"
+msgstr "TTL"
+
+#: plinth/modules/email/templates/email.html:37
+msgid "Class"
+msgstr "Sınıf"
+
+#: plinth/modules/email/templates/email.html:39
+msgid "Priority"
+msgstr "Öncelik"
+
+#: plinth/modules/email/templates/email.html:40
+msgid "Weight"
+msgstr "Ağırlık"
+
+#: plinth/modules/email/templates/email.html:41
+#: plinth/modules/minetest/templates/minetest.html:18
+#: plinth/modules/tor/templates/tor.html:72
+msgid "Port"
+msgstr "Bağlantı noktası"
+
+#: plinth/modules/email/templates/email.html:42
+msgid "Host/Target/Value"
+msgstr "Anamakine/Hedef/Değer"
+
#: plinth/modules/firewall/__init__.py:26
#, python-brace-format
msgid ""
@@ -2158,6 +2169,19 @@ msgstr ""
msgid "Service/Port"
msgstr "Hizmet/Bağlantı Noktası"
+#: plinth/modules/firewall/templates/firewall.html:54
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+msgid "Enabled"
+msgstr "Etkinleştirildi"
+
+#: plinth/modules/firewall/templates/firewall.html:57
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+#: plinth/templates/cards.html:34
+msgid "Disabled"
+msgstr "Etkisizleştirildi"
+
#: plinth/modules/firewall/templates/firewall.html:72
msgid "Permitted"
msgstr "İzin Verildi"
@@ -3451,11 +3475,6 @@ msgstr ""
msgid "Address"
msgstr "Adres"
-#: plinth/modules/minetest/templates/minetest.html:18
-#: plinth/modules/tor/templates/tor.html:72
-msgid "Port"
-msgstr "Bağlantı noktası"
-
#: plinth/modules/minidlna/__init__.py:20
msgid ""
"MiniDLNA is a simple media server software, with the aim of being fully "
@@ -3507,15 +3526,15 @@ msgstr ""
msgid "vlc"
msgstr "vlc"
-#: plinth/modules/minidlna/manifest.py:43
+#: plinth/modules/minidlna/manifest.py:48
msgid "kodi"
msgstr "kodi"
-#: plinth/modules/minidlna/manifest.py:76
+#: plinth/modules/minidlna/manifest.py:81
msgid "yaacc"
msgstr "yaacc"
-#: plinth/modules/minidlna/manifest.py:86
+#: plinth/modules/minidlna/manifest.py:91
msgid "totem"
msgstr "totem"
@@ -5507,11 +5526,11 @@ msgstr "Ghost Commander - Samba eklentisi"
msgid "VLC media player"
msgstr "VLC ortam oynatıcı"
-#: plinth/modules/samba/manifest.py:55
+#: plinth/modules/samba/manifest.py:60
msgid "GNOME Files"
msgstr "GNOME Dosyaları"
-#: plinth/modules/samba/manifest.py:67
+#: plinth/modules/samba/manifest.py:72
msgid "Dolphin"
msgstr "Dolphin"
@@ -7117,11 +7136,6 @@ msgid "Frequent feature updates activated."
msgstr "Sık yapılan özellik güncellemeleri etkinleştirildi."
#: plinth/modules/users/__init__.py:29
-#, fuzzy
-#| msgid ""
-#| "Create and managed user accounts. These accounts serve as centralized "
-#| "authentication mechanism for most apps. Some apps further require a user "
-#| "account to be part of a group to authorize the user to access the app."
msgid ""
"Create and manage user accounts. These accounts serve as centralized "
"authentication mechanism for most apps. Some apps further require a user "
@@ -8278,6 +8292,24 @@ msgstr "%%%(percentage)s tamamlandı"
msgid "Gujarati"
msgstr "Gujarati"
+#~ msgid "Powered by Postfix, Dovecot & Rspamd"
+#~ msgstr "Postfix, Dovecot ve Rspamd tarafından desteklenmektedir"
+
+#~ msgid "Postfix-Dovecot SASL integration"
+#~ msgstr "Postfix-Dovecot SASL bütünleştirmesi"
+
+#~ msgid "Postfix alias maps"
+#~ msgstr "Postfix kod adı eşlemeleri"
+
+#~ msgid "Inbound and outbound mail filters"
+#~ msgstr "Gelen ve giden posta süzgeçleri"
+
+#~ msgid "Disable"
+#~ msgstr "Etkisizleştir"
+
+#~ msgid "Enable"
+#~ msgstr "Etkinleştir"
+
#~ msgid "Enable Dynamic DNS"
#~ msgstr "Değişken DNS'i etkinleştir"
diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po
index f34944944..665678b3b 100644
--- a/plinth/locale/uk/LC_MESSAGES/django.po
+++ b/plinth/locale/uk/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-14 20:10-0500\n"
-"PO-Revision-Date: 2022-02-07 23:55+0000\n"
+"POT-Creation-Date: 2022-03-02 08:06-0500\n"
+"PO-Revision-Date: 2022-02-16 20:57+0000\n"
"Last-Translator: Andrij Mizyk \n"
"Language-Team: Ukrainian \n"
@@ -894,7 +894,7 @@ msgid "List"
msgstr "Показати"
#: plinth/modules/bepasty/views.py:52
-#: plinth/modules/email_server/templates/email_alias.html:28
+#: plinth/modules/email/templates/email-aliases.html:24
#: plinth/modules/letsencrypt/templates/letsencrypt.html:86
#: plinth/modules/networks/templates/connection_show.html:56
#: plinth/modules/samba/templates/samba.html:154
@@ -915,7 +915,7 @@ msgstr "Адміністратор"
msgid "Configuration updated."
msgstr "Налаштування оновлено."
-#: plinth/modules/bepasty/views.py:93 plinth/modules/email_server/views.py:41
+#: plinth/modules/bepasty/views.py:93 plinth/modules/email/views.py:48
#: plinth/modules/gitweb/views.py:117 plinth/modules/searx/views.py:41
#: plinth/modules/searx/views.py:52 plinth/modules/tor/views.py:159
#: plinth/modules/zoph/views.py:72
@@ -984,6 +984,7 @@ msgid "Serving Domains"
msgstr "Обслуговування доменів"
#: plinth/modules/bind/templates/bind.html:17
+#: plinth/modules/email/templates/email.html:38
#: plinth/modules/ikiwiki/forms.py:12
#: plinth/modules/names/templates/names.html:15
#: plinth/modules/networks/templates/connection_show.html:91
@@ -1011,7 +1012,7 @@ msgstr "Оновити IP-адреси і домени"
#: plinth/modules/bind/views.py:71 plinth/modules/coturn/views.py:39
#: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78
-#: plinth/modules/ejabberd/views.py:85 plinth/modules/email_server/views.py:38
+#: plinth/modules/ejabberd/views.py:85 plinth/modules/email/views.py:45
#: plinth/modules/matrixsynapse/views.py:124
#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:28
#: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28
@@ -1679,10 +1680,8 @@ msgid "GnuDIP"
msgstr "GnuDIP"
#: plinth/modules/dynamicdns/forms.py:57
-#, fuzzy
-#| msgid "other update URL"
msgid "Other update URL"
-msgstr "інша URL оновлення"
+msgstr "Інша URL-адреса оновлення"
#: plinth/modules/dynamicdns/forms.py:59
msgid "Service Type"
@@ -1727,7 +1726,7 @@ msgstr "Використовувати IPv6 замість IPv4"
#: plinth/modules/dynamicdns/forms.py:123
msgid "This field is required."
-msgstr ""
+msgstr "Це поле обовʼязкове."
#: plinth/modules/dynamicdns/templates/dynamicdns.html:11
#: plinth/modules/firewall/templates/firewall.html:16
@@ -1744,6 +1743,7 @@ msgid "Status"
msgstr "Стан"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:18
+#: plinth/modules/email/templates/email.html:35
#: plinth/modules/letsencrypt/templates/letsencrypt.html:24
msgid "Domain"
msgstr "Домен"
@@ -1753,50 +1753,36 @@ msgid "Last update"
msgstr "Востаннє оновлено"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:21
-#, fuzzy
-#| msgid "IP address"
msgid "IP Address"
msgstr "IP-адреса"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:32
-#, fuzzy
-#| msgid "Access"
msgid "Success"
-msgstr "Доступ"
+msgstr "Успішно"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:36
-#, fuzzy
-#| msgid "failed"
msgid "Failed"
-msgstr "невдало"
+msgstr "Невдало"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:52
-#, fuzzy
-#| msgid "No libraries available."
msgid "No status available."
-msgstr "Нема доступних бібліотек."
+msgstr "Стан недоступний."
#: plinth/modules/dynamicdns/views.py:24 plinth/modules/dynamicdns/views.py:26
-#, fuzzy
-#| msgid "Connection Name"
msgid "Connection timed out"
-msgstr "Назва зʼєднання"
+msgstr "Час зʼєднання вийшов"
#: plinth/modules/dynamicdns/views.py:25
msgid "Could not find server"
-msgstr ""
+msgstr "Не вдалося знайти сервер"
#: plinth/modules/dynamicdns/views.py:27
-#, fuzzy
-#| msgid "Delete connection"
msgid "Server refused connection"
-msgstr "Видалити зʼєднання"
+msgstr "Сервер відмовив у зʼєднанні"
#: plinth/modules/dynamicdns/views.py:28
-#, fuzzy
-#| msgid "Enable auto-update"
msgid "Already up-to-date"
-msgstr "Дозволити автооновлення"
+msgstr "Вже оновлено"
#: plinth/modules/ejabberd/__init__.py:31
msgid ""
@@ -1939,7 +1925,24 @@ msgstr ""
"виглядатиме як username@%(domainname)s. Ви можете налаштувати свій "
"домен на системній сторінці Налаштувати."
-#: plinth/modules/email_server/__init__.py:31
+#: plinth/modules/email/__init__.py:26
+msgid ""
+"This is a complete email server solution using Postfix, Dovecot, and Rspamd. "
+"Postfix sends and receives emails. Dovecot allows email clients to access "
+"your mailbox using IMAP and POP3. Rspamd deals with spam."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:31
+#, python-brace-format
+msgid ""
+"Each user on {box_name} gets an email address like user@mydomain.example. "
+"They will also receive mail from all addresses that look like user"
+"+foo@mydomain.example. Further, they can add aliases to their email address. "
+"Necessary aliases such as \"postmaster\" are automatically created pointing "
+"to the first admin user."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:37
msgid ""
"Roundcube app provides web interface "
"for users to access email."
@@ -1947,126 +1950,139 @@ msgstr ""
"Застосунок Roundcube надає "
"вебінтерфейс для доступу користувачів до ел. пошти."
-#: plinth/modules/email_server/__init__.py:33
+#: plinth/modules/email/__init__.py:39
msgid ""
"During installation, any other email servers in the system will be "
"uninstalled."
msgstr ""
"Під час встановлення всі інші сервери ел. пошти в системі буде видалено."
-#: plinth/modules/email_server/__init__.py:44
+#: plinth/modules/email/__init__.py:58
+msgid "Postfix/Dovecot"
+msgstr ""
+
+#: plinth/modules/email/__init__.py:60
msgid "Email Server"
msgstr "Сервер електронної пошти"
-#: plinth/modules/email_server/__init__.py:100
-msgid "Powered by Postfix, Dovecot & Rspamd"
-msgstr "Працює на Postfix, Dovecot та Rspamd"
+#: plinth/modules/email/__init__.py:80
+#, fuzzy
+#| msgid "Manage Aliases"
+msgid "My Email Aliases"
+msgstr "Керування аліясами"
-#: plinth/modules/email_server/audit/ldap.py:68
-msgid "Postfix-Dovecot SASL integration"
-msgstr ""
+#: plinth/modules/email/__init__.py:81
+#, fuzzy
+#| msgid "Manage Aliases"
+msgid "Manage Aliases for Mailbox"
+msgstr "Керування аліясами"
-#: plinth/modules/email_server/audit/ldap.py:69
-msgid "Postfix alias maps"
-msgstr "Мапи аліясів Postfix"
-
-#: plinth/modules/email_server/audit/spam.py:87
-msgid "Inbound and outbound mail filters"
-msgstr "Фільтри вхідної і вихідної пошти"
-
-#: plinth/modules/email_server/forms.py:24
+#: plinth/modules/email/forms.py:25
msgid "Primary domain"
msgstr "Основний домен"
-#: plinth/modules/email_server/forms.py:26
+#: plinth/modules/email/forms.py:27
msgid ""
"Mails are received for all domains configured in the system. Among these, "
"select the most important one."
msgstr ""
+"Листи надходять для всіх доменів, налаштованих у системі. Серед них виберіть "
+"найважливіший."
-#: plinth/modules/email_server/forms.py:34
+#: plinth/modules/email/forms.py:35
msgid "New alias (without @domain)"
msgstr "Новий аліяс (без @domain)"
-#: plinth/modules/email_server/forms.py:41
+#: plinth/modules/email/forms.py:42
msgid "Contains illegal characters"
msgstr "Містить неправильні символи"
-#: plinth/modules/email_server/forms.py:44
+#: plinth/modules/email/forms.py:45
msgid "Must start and end with a-z or 0-9"
msgstr "Має починатися і закінчуватися на a-z або 0-9"
-#: plinth/modules/email_server/forms.py:47
+#: plinth/modules/email/forms.py:49
msgid "Cannot be a number"
msgstr "Не може бути числом"
-#: plinth/modules/email_server/forms.py:57
+#: plinth/modules/email/forms.py:59
msgid "Aliases"
msgstr "Псевдоніми"
-#: plinth/modules/email_server/forms.py:69
-#: plinth/modules/firewall/templates/firewall.html:54
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-msgid "Enabled"
-msgstr "Дозволено"
-
-#: plinth/modules/email_server/forms.py:72
-#: plinth/modules/firewall/templates/firewall.html:57
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-#: plinth/templates/cards.html:34
-msgid "Disabled"
-msgstr "Вимкнено"
-
-#: plinth/modules/email_server/manifest.py:8
-#: plinth/modules/roundcube/__init__.py:54
+#: plinth/modules/email/manifest.py:12 plinth/modules/roundcube/__init__.py:54
#: plinth/modules/roundcube/manifest.py:6
msgid "Roundcube"
msgstr "Roundcube"
-#: plinth/modules/email_server/manifest.py:16
-#: plinth/modules/radicale/manifest.py:36
+#: plinth/modules/email/manifest.py:20 plinth/modules/radicale/manifest.py:36
msgid "Thunderbird"
msgstr "Thunderbird"
-#: plinth/modules/email_server/manifest.py:33
+#: plinth/modules/email/manifest.py:37
msgid "K-9 Mail"
msgstr "K-9 Mail"
-#: plinth/modules/email_server/manifest.py:48
+#: plinth/modules/email/manifest.py:52
msgid "FairEmail"
msgstr "FairEmail"
-#: plinth/modules/email_server/templates/email_alias.html:13
-#: plinth/modules/email_server/templates/email_server.html:15
+#: plinth/modules/email/templates/email-aliases.html:13
+#: plinth/modules/email/templates/email.html:15
msgid "Manage Aliases"
msgstr "Керування аліясами"
-#: plinth/modules/email_server/templates/email_alias.html:16
+#: plinth/modules/email/templates/email-aliases.html:16
msgid "You have no email aliases."
msgstr "У Вас нема аліясів ел. пошти."
-#: plinth/modules/email_server/templates/email_alias.html:24
-msgid "Disable"
-msgstr "Вимкнути"
-
-#: plinth/modules/email_server/templates/email_alias.html:26
-msgid "Enable"
-msgstr "Дозволити"
-
-#: plinth/modules/email_server/templates/email_alias.html:32
+#: plinth/modules/email/templates/email-aliases.html:28
msgid "Create a new email alias"
msgstr "Створити новий аліяс електронної пошти"
-#: plinth/modules/email_server/templates/email_alias.html:38
+#: plinth/modules/email/templates/email-aliases.html:34
msgid "Add"
msgstr "Додати"
-#: plinth/modules/email_server/templates/email_server.html:10
+#: plinth/modules/email/templates/email.html:10
msgid "Manage Spam"
msgstr "Керування спамом"
+#: plinth/modules/email/templates/email.html:22
+msgid "DNS Records"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:25
+msgid ""
+"The following DNS records must be added manually on your primary domain for "
+"the mail server to work properly."
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:36
+msgid "TTL"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:37
+msgid "Class"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:39
+msgid "Priority"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:40
+msgid "Weight"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:41
+#: plinth/modules/minetest/templates/minetest.html:18
+#: plinth/modules/tor/templates/tor.html:72
+msgid "Port"
+msgstr "Порт"
+
+#: plinth/modules/email/templates/email.html:42
+msgid "Host/Target/Value"
+msgstr ""
+
#: plinth/modules/firewall/__init__.py:26
#, python-brace-format
msgid ""
@@ -2110,6 +2126,19 @@ msgstr ""
msgid "Service/Port"
msgstr "Сервіс/Порт"
+#: plinth/modules/firewall/templates/firewall.html:54
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+msgid "Enabled"
+msgstr "Дозволено"
+
+#: plinth/modules/firewall/templates/firewall.html:57
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+#: plinth/templates/cards.html:34
+msgid "Disabled"
+msgstr "Вимкнено"
+
#: plinth/modules/firewall/templates/firewall.html:72
msgid "Permitted"
msgstr "Дозволяється"
@@ -2271,7 +2300,7 @@ msgstr "Типова гілка"
#: plinth/modules/gitweb/forms.py:135
msgid "Gitweb displays this as a default branch."
-msgstr ""
+msgstr "Gitweb відображає це як типову гілку."
#: plinth/modules/gitweb/manifest.py:18
msgid "Git"
@@ -2586,6 +2615,10 @@ msgid ""
"salsa.debian.org/freedombox-team/freedombox/issues\">bug tracker and "
"attach this status log to the bug report."
msgstr ""
+"Це останні %(num_lines)s рядків із журналу стану для цього вебінтерфейсу. "
+"Якщо Ви бажаєте повідомити про ваду, будь ласка використовуйте сторінку відстеження вад і прикріпіть цей журнал стану до звіту про ваду."
#: plinth/modules/help/templates/statuslog.html:24
msgid ""
@@ -2630,6 +2663,7 @@ msgid ""
"The first visit to the provided web interface will initiate the "
"configuration process."
msgstr ""
+"Перше відвідування наданого вебінтерфейсу розпочне процес налаштування."
#: plinth/modules/i2p/__init__.py:52
msgid "Manage I2P application"
@@ -2736,7 +2770,7 @@ msgstr "Створити вікі або блоґ"
#: plinth/modules/ikiwiki/templates/ikiwiki_configure.html:25
msgid "No wikis or blogs available."
-msgstr "Нема доступних вікі або боґів."
+msgstr "Нема доступних вікі або блоґів."
#: plinth/modules/ikiwiki/templates/ikiwiki_configure.html:31
#, python-format
@@ -2813,7 +2847,7 @@ msgstr ""
#: plinth/modules/infinoted/__init__.py:44
msgid "infinoted"
-msgstr ""
+msgstr "infinoted"
#: plinth/modules/infinoted/__init__.py:45
msgid "Gobby Server"
@@ -2903,25 +2937,25 @@ msgstr "Дії"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:37
#, python-format
msgid "Valid, expires on %(expiry_date)s"
-msgstr ""
+msgstr "Правильний, дійсний до %(expiry_date)s"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:44
msgid "Revoked"
-msgstr ""
+msgstr "Відкликано"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:48
#, python-format
msgid "Expired on %(expiry_date)s"
-msgstr ""
+msgstr "Дійсний до %(expiry_date)s"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:52
msgid "Invalid test certificate"
-msgstr ""
+msgstr "Неправильний тестовий сертифікат"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:56
#, python-format
msgid "Invalid (%(reason)s)"
-msgstr ""
+msgstr "Неправильний (%(reason)s)"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:63
msgid "No certificate"
@@ -2929,15 +2963,15 @@ msgstr "Нема сертифікату"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:80
msgid "Re-obtain"
-msgstr ""
+msgstr "Отримати повторно"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:93
msgid "Revoke"
-msgstr ""
+msgstr "Відкликати"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:101
msgid "Obtain"
-msgstr ""
+msgstr "Отримати"
#: plinth/modules/letsencrypt/templates/letsencrypt.html:112
#, python-format
@@ -2958,29 +2992,29 @@ msgstr ""
#: plinth/modules/letsencrypt/views.py:47
#, python-brace-format
msgid "Failed to revoke certificate for domain {domain}: {error}"
-msgstr ""
+msgstr "Не вдалося відкликати сертифікат для домену {domain}: {error}"
#: plinth/modules/letsencrypt/views.py:60
#: plinth/modules/letsencrypt/views.py:77
#, python-brace-format
msgid "Certificate successfully obtained for domain {domain}"
-msgstr ""
+msgstr "Сертифікат успішно отримано для домену {domain}"
#: plinth/modules/letsencrypt/views.py:65
#: plinth/modules/letsencrypt/views.py:82
#, python-brace-format
msgid "Failed to obtain certificate for domain {domain}: {error}"
-msgstr ""
+msgstr "Не вдалося отримати сертифікат для домену {domain}: {error}"
#: plinth/modules/letsencrypt/views.py:94
#, python-brace-format
msgid "Certificate successfully deleted for domain {domain}"
-msgstr ""
+msgstr "Сертифікат успішно видалено для домену {domain}"
#: plinth/modules/letsencrypt/views.py:99
#, python-brace-format
msgid "Failed to delete certificate for domain {domain}: {error}"
-msgstr ""
+msgstr "Не вдалося видалити сертифікат для домену {domain}: {error}"
#: plinth/modules/matrixsynapse/__init__.py:29
msgid ""
@@ -3001,7 +3035,7 @@ msgstr ""
#: plinth/modules/matrixsynapse/__init__.py:70
msgid "Matrix Synapse"
-msgstr ""
+msgstr "Matrix Synapse"
#: plinth/modules/matrixsynapse/forms.py:16
msgid "Enable Public Registration"
@@ -3028,7 +3062,7 @@ msgstr "Елемент"
#: plinth/modules/matrixsynapse/manifest.py:48
msgid "FluffyChat"
-msgstr ""
+msgstr "FluffyChat"
#: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:15
#: plinth/modules/snapshot/templates/snapshot.html:12
@@ -3050,6 +3084,10 @@ msgid ""
" setup is currently not supported.\n"
" "
msgstr ""
+"\n"
+" Увага! Зміна назви домену після початкового\n"
+" налаштування зараз не підтримується.\n"
+" "
#: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:35
#, python-format
@@ -3057,6 +3095,8 @@ msgid ""
"No domain(s) are available. Configure at "
"least one domain to be able to use Matrix Synapse."
msgstr ""
+"Нема доступних доменів. Налаштувати "
+"щонайменше один домен для використання Matrix Synapse."
#: plinth/modules/matrixsynapse/templates/matrix-synapse.html:15
#, python-format
@@ -3071,6 +3111,8 @@ msgid ""
"New users can be registered from any client if public registration is "
"enabled."
msgstr ""
+"Нові користувачі можуть реєструватися з будь-якого клієнта, якщо дозволена "
+"публічна реєстрація."
#: plinth/modules/matrixsynapse/templates/matrix-synapse.html:31
#, python-format
@@ -3087,6 +3129,10 @@ msgid ""
"website. You can use MediaWiki to host a wiki-like website, take notes or "
"collaborate with friends on projects."
msgstr ""
+"MediaWiki — це вікірушій, на якому працює Вікіпедія та інші проєкти "
+"WikiMedia. Вікірушій є програмою для створення колективно редагованого "
+"вебсайту. Ви можете використовувати MediaWiki для розміщення вебсайту на "
+"зразок вікі, робити нотатки або співпрацювати з друзями над проєктами."
#: plinth/modules/mediawiki/__init__.py:27
msgid ""
@@ -3096,6 +3142,11 @@ msgid ""
"from MediaWiki itself by going to the Special:CreateAccount page."
msgstr ""
+"Цей екземпляр MediaWiki йде з випадково зґенерованим паролем адміністратора. "
+"Ви можете вказати новий пароль у розділі «Налаштування» і ввійти за "
+"допомогою обліківки «admin». Потім Ви можете створити більше обліківок "
+"користувачів із самої MediaWiki перейшовши на сторінку Special:CreateAccount."
#: plinth/modules/mediawiki/__init__.py:33
msgid ""
@@ -3123,6 +3174,8 @@ msgid ""
"Set a new password for MediaWiki's administrator account (admin). Leave this "
"field blank to keep the current password."
msgstr ""
+"Вкажіть новий пароль для обліківки адміністратора (admin) MediaWiki. Залиште "
+"поле порожнім, якщо хочете зберегти поточний пароль."
#: plinth/modules/mediawiki/forms.py:58
msgid "Server URL"
@@ -3133,6 +3186,8 @@ msgid ""
"Used by MediaWiki to generate URLs that point to the wiki such as in footer, "
"feeds and emails."
msgstr ""
+"Використовується MediaWiki, щоб ґенерувати URL-адреси, які вказують на "
+"вікісторінки, наприклад, внизу вебсторінок, у RSS-стрічках чи в ел. листах."
#: plinth/modules/mediawiki/forms.py:64
msgid "Enable public registrations"
@@ -3143,6 +3198,8 @@ msgid ""
"If enabled, anyone on the internet will be able to create an account on your "
"MediaWiki instance."
msgstr ""
+"Якщо дозволено, будь-хто з Інтернету зможе створити обліківку у Вашому "
+"екземплярі MediaWiki."
#: plinth/modules/mediawiki/forms.py:69
msgid "Enable private mode"
@@ -3153,16 +3210,20 @@ msgid ""
"If enabled, access will be restricted. Only people who have accounts can "
"read/write to the wiki. Public registrations will also be disabled."
msgstr ""
+"Якщо дозволено, доступ буде обмежено. Лише люди, що мають обліківки можуть "
+"читати/писати у вікі. Публічна реєстрація також буде вимкнена."
#: plinth/modules/mediawiki/forms.py:75
msgid "Default Skin"
-msgstr ""
+msgstr "Типова шкурка"
#: plinth/modules/mediawiki/forms.py:76
msgid ""
"Choose a default skin for your MediaWiki installation. Users have the option "
"to select their preferred skin."
msgstr ""
+"Оберіть типову шкурку для Вашого встановлення MediaWiki. Користувачі мають "
+"можливість вибирати бажану шкурку."
#: plinth/modules/mediawiki/views.py:49
msgid "Password updated"
@@ -3186,7 +3247,7 @@ msgstr "Приватний режим вимкнено"
#: plinth/modules/mediawiki/views.py:86
msgid "Default skin changed"
-msgstr ""
+msgstr "Типову шкурку змінено"
#: plinth/modules/mediawiki/views.py:90
msgid "Server URL updated"
@@ -3200,6 +3261,10 @@ msgid ""
"(30000). To connect to the server, a Minetest client is needed."
msgstr ""
+"Minetest — це багатокористувацька блокова пісочниця з нескінченним світом. "
+"Цей модуль дозволяє запустити сервер Minetest на цьому {box_name}, з типовим "
+"портом (30000). Щоб підʼєднатися до сервера потрібено клієнт Minetest."
#: plinth/modules/minetest/__init__.py:59 plinth/modules/minetest/manifest.py:9
msgid "Minetest"
@@ -3218,6 +3283,8 @@ msgid ""
"You can change the maximum number of players playing minetest at a single "
"instance of time."
msgstr ""
+"Ви можете змінити найбільшу кількість гравців, що грають minetest на одному "
+"екземплярі."
#: plinth/modules/minetest/forms.py:19
msgid "Enable creative mode"
@@ -3253,11 +3320,6 @@ msgstr ""
msgid "Address"
msgstr "Адреса"
-#: plinth/modules/minetest/templates/minetest.html:18
-#: plinth/modules/tor/templates/tor.html:72
-msgid "Port"
-msgstr "Порт"
-
#: plinth/modules/minidlna/__init__.py:20
msgid ""
"MiniDLNA is a simple media server software, with the aim of being fully "
@@ -3297,15 +3359,15 @@ msgstr ""
msgid "vlc"
msgstr "vlc"
-#: plinth/modules/minidlna/manifest.py:43
+#: plinth/modules/minidlna/manifest.py:48
msgid "kodi"
msgstr "kodi"
-#: plinth/modules/minidlna/manifest.py:76
+#: plinth/modules/minidlna/manifest.py:81
msgid "yaacc"
msgstr "yaacc"
-#: plinth/modules/minidlna/manifest.py:86
+#: plinth/modules/minidlna/manifest.py:91
msgid "totem"
msgstr "totem"
@@ -3322,6 +3384,8 @@ msgid ""
"Mumble is an open source, low-latency, encrypted, high quality voice chat "
"software."
msgstr ""
+"Mumble — це високоякісне ПЗ для голосового чату з відкритим кодом, низькою "
+"затримкою і шифруванням."
#: plinth/modules/mumble/__init__.py:28
msgid ""
@@ -3432,7 +3496,7 @@ msgstr "Мережевий пристрій до якого підʼєднано
#: plinth/modules/networks/forms.py:34
msgid "Firewall Zone"
-msgstr ""
+msgstr "Зона фаєрволу"
#: plinth/modules/networks/forms.py:35
msgid ""
@@ -3523,15 +3587,15 @@ msgstr ""
#: plinth/modules/networks/forms.py:87
msgid "Ignore: Ignore this addressing method"
-msgstr ""
+msgstr "Ігнорувати: Ігнорувати на цей спосіб адресування"
#: plinth/modules/networks/forms.py:92
msgid "Prefix"
-msgstr ""
+msgstr "Префікс"
#: plinth/modules/networks/forms.py:93
msgid "Value between 1 and 128."
-msgstr ""
+msgstr "Значення між 1 і 128."
#: plinth/modules/networks/forms.py:101
msgid ""
@@ -3581,7 +3645,7 @@ msgstr ""
#: plinth/modules/networks/forms.py:254
msgid "Automatic"
-msgstr ""
+msgstr "Автоматично"
#: plinth/modules/networks/forms.py:255
msgid "A (5 GHz)"
@@ -3844,7 +3908,7 @@ msgstr "Опис"
#: plinth/modules/networks/templates/connection_show.html:109
msgid "Physical Link"
-msgstr ""
+msgstr "Фізична ланка"
#: plinth/modules/networks/templates/connection_show.html:114
msgid "Link state"
@@ -3866,12 +3930,12 @@ msgstr "Швидкість"
#: plinth/modules/networks/templates/connection_show.html:126
#, python-format
msgid "%(ethernet_speed)s Mbit/s"
-msgstr ""
+msgstr "%(ethernet_speed)s Мбіт/с"
#: plinth/modules/networks/templates/connection_show.html:142
#, python-format
msgid "%(wireless_bitrate)s Mbit/s"
-msgstr ""
+msgstr "%(wireless_bitrate)s Мбіт/с"
#: plinth/modules/networks/templates/connection_show.html:154
msgid "Signal strength"
@@ -3901,7 +3965,7 @@ msgstr "Сервер DNS"
#: plinth/modules/networks/templates/connection_show.html:248
#: plinth/modules/storage/forms.py:138
msgid "Default"
-msgstr ""
+msgstr "Типово"
#: plinth/modules/networks/templates/connection_show.html:213
msgid "IPv6"
@@ -3920,7 +3984,7 @@ msgstr "Безпека"
#: plinth/modules/networks/templates/connection_show.html:284
#: plinth/modules/networks/templates/connection_show.html:303
msgid "Firewall zone"
-msgstr ""
+msgstr "Зона фаєрволу"
#: plinth/modules/networks/templates/connection_show.html:273
msgid ""
@@ -3962,7 +4026,7 @@ msgstr "Видалити зʼєднання"
#: plinth/modules/networks/templates/connections_delete.html:14
#, python-format
msgid "Delete connection %(name)s permanently?"
-msgstr ""
+msgstr "Видалити зʼєднання %(name)s назавжди?"
#: plinth/modules/networks/templates/connections_diagram.html:11
msgid "Internet"
@@ -4231,15 +4295,15 @@ msgstr ""
#: plinth/modules/networks/views.py:27
msgid "disabled"
-msgstr ""
+msgstr "вимкнено"
#: plinth/modules/networks/views.py:28
msgid "automatic"
-msgstr ""
+msgstr "автоматично"
#: plinth/modules/networks/views.py:29
msgid "manual"
-msgstr ""
+msgstr "вручну"
#: plinth/modules/networks/views.py:30
msgid "shared"
@@ -4252,7 +4316,7 @@ msgstr ""
#: plinth/modules/networks/views.py:37 plinth/modules/networks/views.py:98
#: plinth/modules/networks/views.py:109
msgid "unknown"
-msgstr ""
+msgstr "невідомо"
#: plinth/modules/networks/views.py:38
msgid "unmanaged"
@@ -4260,11 +4324,11 @@ msgstr ""
#: plinth/modules/networks/views.py:39
msgid "unavailable"
-msgstr ""
+msgstr "недоступно"
#: plinth/modules/networks/views.py:40
msgid "disconnected"
-msgstr ""
+msgstr "відʼєднано"
#: plinth/modules/networks/views.py:41
msgid "preparing"
@@ -4376,7 +4440,7 @@ msgstr "вибраний метод IP не підтримується"
#: plinth/modules/networks/views.py:101
msgid "generic"
-msgstr ""
+msgstr "загальний"
#: plinth/modules/networks/views.py:102
msgid "TUN or TAP interface"
@@ -5051,7 +5115,7 @@ msgstr "Клієнт ел. пошти"
#: plinth/modules/roundcube/forms.py:16
msgid "Use only the local mail server"
-msgstr ""
+msgstr "Використовувати лише локальний поштовий сервер"
#: plinth/modules/roundcube/forms.py:17
#, python-brace-format
@@ -5115,11 +5179,11 @@ msgstr "Ghost Commander - втулка для Samba"
msgid "VLC media player"
msgstr "Медіяпрогравач VLC"
-#: plinth/modules/samba/manifest.py:55
+#: plinth/modules/samba/manifest.py:60
msgid "GNOME Files"
msgstr "Файли GNOME"
-#: plinth/modules/samba/manifest.py:67
+#: plinth/modules/samba/manifest.py:72
msgid "Dolphin"
msgstr "Dolphin"
@@ -5402,6 +5466,8 @@ msgid ""
"Note that Shaarli only supports a single user account, which you will need "
"to setup on the initial visit."
msgstr ""
+"Зауважте, що Shaarli підтримує лише одну користувацьку обліківку, яку можна "
+"налаштувати під час початкового відвідування."
#: plinth/modules/shaarli/__init__.py:38 plinth/modules/shaarli/manifest.py:25
msgid "Shaarli"
@@ -6592,20 +6658,15 @@ msgid "Frequent feature updates activated."
msgstr "Оновлення частих можливостей активовано."
#: plinth/modules/users/__init__.py:29
-#, fuzzy
-#| msgid ""
-#| "Create and managed user accounts. These accounts serve as centralized "
-#| "authentication mechanism for most apps. Some apps further require a user "
-#| "account to be part of a group to authorize the user to access the app."
msgid ""
"Create and manage user accounts. These accounts serve as centralized "
"authentication mechanism for most apps. Some apps further require a user "
"account to be part of a group to authorize the user to access the app."
msgstr ""
-"Створення і керування обліковими записами користувачів. Ці обліківки "
-"обробляються як централізований механізм автентифікації для більшості "
-"застосунків. Деякі застосунки також вимагають, щоб обліківка була частиною "
-"групи, щоб отримати авторизований доступ до застосунку."
+"Створення і керування обліковими записами. Ці обліківки обробляються як "
+"централізований механізм автентифікації для більшості застосунків. Деякі "
+"застосунки також вимагають, щоб обліківка була частиною групи, щоб отримати "
+"авторизований доступ до застосунку."
#: plinth/modules/users/__init__.py:34
#, python-brace-format
@@ -7353,6 +7414,11 @@ msgid ""
"freedombox/issues\">bug tracker so we can fix it. Also, please attach "
"the status log to the bug report."
msgstr ""
+"Це внутрішня помилка і не те, що Ви спричинили чи можете виправити. Будь "
+"ласка, повідомте про помилку на сторінці відстеження вад, щоб ми могли "
+"виправити її. Також, будь ласка, прикріпіть до звіту про ваду журнал стану."
#: plinth/templates/app-header.html:22
msgid "Installation"
@@ -7679,6 +7745,21 @@ msgstr "%(percentage)s%% завершено"
msgid "Gujarati"
msgstr "Gujarati"
+#~ msgid "Powered by Postfix, Dovecot & Rspamd"
+#~ msgstr "Працює на Postfix, Dovecot та Rspamd"
+
+#~ msgid "Postfix alias maps"
+#~ msgstr "Мапи аліясів Postfix"
+
+#~ msgid "Inbound and outbound mail filters"
+#~ msgstr "Фільтри вхідної і вихідної пошти"
+
+#~ msgid "Disable"
+#~ msgstr "Вимкнути"
+
+#~ msgid "Enable"
+#~ msgstr "Дозволити"
+
#~ msgid "Enable Dynamic DNS"
#~ msgstr "Дозволити динамічну DNS"
diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po
index 099821eed..04afe1588 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: 2022-02-14 20:10-0500\n"
+"POT-Creation-Date: 2022-03-02 08:06-0500\n"
"PO-Revision-Date: 2021-07-28 08:34+0000\n"
"Last-Translator: bruh \n"
"Language-Team: Vietnamese Configure page."
msgstr ""
-#: plinth/modules/email_server/__init__.py:31
+#: plinth/modules/email/__init__.py:26
+msgid ""
+"This is a complete email server solution using Postfix, Dovecot, and Rspamd. "
+"Postfix sends and receives emails. Dovecot allows email clients to access "
+"your mailbox using IMAP and POP3. Rspamd deals with spam."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:31
+#, python-brace-format
+msgid ""
+"Each user on {box_name} gets an email address like user@mydomain.example. "
+"They will also receive mail from all addresses that look like user"
+"+foo@mydomain.example. Further, they can add aliases to their email address. "
+"Necessary aliases such as \"postmaster\" are automatically created pointing "
+"to the first admin user."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:37
msgid ""
"Roundcube app provides web interface "
"for users to access email."
msgstr ""
-#: plinth/modules/email_server/__init__.py:33
+#: plinth/modules/email/__init__.py:39
msgid ""
"During installation, any other email servers in the system will be "
"uninstalled."
msgstr ""
-#: plinth/modules/email_server/__init__.py:44
+#: plinth/modules/email/__init__.py:58
+msgid "Postfix/Dovecot"
+msgstr ""
+
+#: plinth/modules/email/__init__.py:60
#, fuzzy
#| msgid "Domain Name Server"
msgid "Email Server"
msgstr "Máy chủ tên miền"
-#: plinth/modules/email_server/__init__.py:100
-msgid "Powered by Postfix, Dovecot & Rspamd"
-msgstr ""
+#: plinth/modules/email/__init__.py:80
+#, fuzzy
+#| msgid "Manage Libraries"
+msgid "My Email Aliases"
+msgstr "Quản lý thư viện"
-#: plinth/modules/email_server/audit/ldap.py:68
-msgid "Postfix-Dovecot SASL integration"
-msgstr ""
+#: plinth/modules/email/__init__.py:81
+#, fuzzy
+#| msgid "Manage Libraries"
+msgid "Manage Aliases for Mailbox"
+msgstr "Quản lý thư viện"
-#: plinth/modules/email_server/audit/ldap.py:69
-msgid "Postfix alias maps"
-msgstr ""
-
-#: plinth/modules/email_server/audit/spam.py:87
-msgid "Inbound and outbound mail filters"
-msgstr ""
-
-#: plinth/modules/email_server/forms.py:24
+#: plinth/modules/email/forms.py:25
#, fuzzy
#| msgid "TLS domain"
msgid "Primary domain"
msgstr "Miền TLS"
-#: plinth/modules/email_server/forms.py:26
+#: plinth/modules/email/forms.py:27
msgid ""
"Mails are received for all domains configured in the system. Among these, "
"select the most important one."
msgstr ""
-#: plinth/modules/email_server/forms.py:34
+#: plinth/modules/email/forms.py:35
msgid "New alias (without @domain)"
msgstr ""
-#: plinth/modules/email_server/forms.py:41
+#: plinth/modules/email/forms.py:42
msgid "Contains illegal characters"
msgstr ""
-#: plinth/modules/email_server/forms.py:44
+#: plinth/modules/email/forms.py:45
msgid "Must start and end with a-z or 0-9"
msgstr ""
-#: plinth/modules/email_server/forms.py:47
+#: plinth/modules/email/forms.py:49
msgid "Cannot be a number"
msgstr ""
-#: plinth/modules/email_server/forms.py:57
+#: plinth/modules/email/forms.py:59
#, fuzzy
#| msgid "Manage Libraries"
msgid "Aliases"
msgstr "Quản lý thư viện"
-#: plinth/modules/email_server/forms.py:69
-#: plinth/modules/firewall/templates/firewall.html:54
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-msgid "Enabled"
-msgstr ""
-
-#: plinth/modules/email_server/forms.py:72
-#: plinth/modules/firewall/templates/firewall.html:57
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-#: plinth/templates/cards.html:34
-msgid "Disabled"
-msgstr ""
-
-#: plinth/modules/email_server/manifest.py:8
-#: plinth/modules/roundcube/__init__.py:54
+#: plinth/modules/email/manifest.py:12 plinth/modules/roundcube/__init__.py:54
#: plinth/modules/roundcube/manifest.py:6
msgid "Roundcube"
msgstr ""
-#: plinth/modules/email_server/manifest.py:16
-#: plinth/modules/radicale/manifest.py:36
+#: plinth/modules/email/manifest.py:20 plinth/modules/radicale/manifest.py:36
msgid "Thunderbird"
msgstr ""
-#: plinth/modules/email_server/manifest.py:33
+#: plinth/modules/email/manifest.py:37
msgid "K-9 Mail"
msgstr ""
-#: plinth/modules/email_server/manifest.py:48
+#: plinth/modules/email/manifest.py:52
msgid "FairEmail"
msgstr ""
-#: plinth/modules/email_server/templates/email_alias.html:13
-#: plinth/modules/email_server/templates/email_server.html:15
+#: plinth/modules/email/templates/email-aliases.html:13
+#: plinth/modules/email/templates/email.html:15
#, fuzzy
#| msgid "Manage Libraries"
msgid "Manage Aliases"
msgstr "Quản lý thư viện"
-#: plinth/modules/email_server/templates/email_alias.html:16
+#: plinth/modules/email/templates/email-aliases.html:16
msgid "You have no email aliases."
msgstr ""
-#: plinth/modules/email_server/templates/email_alias.html:24
-msgid "Disable"
-msgstr ""
-
-#: plinth/modules/email_server/templates/email_alias.html:26
-#, fuzzy
-#| msgid "Enable DNSSEC"
-msgid "Enable"
-msgstr "Bật DNSSEC"
-
-#: plinth/modules/email_server/templates/email_alias.html:32
+#: plinth/modules/email/templates/email-aliases.html:28
#, fuzzy
#| msgid "Create a new backup"
msgid "Create a new email alias"
msgstr "Tạo một bản sao lưu mới"
-#: plinth/modules/email_server/templates/email_alias.html:38
+#: plinth/modules/email/templates/email-aliases.html:34
msgid "Add"
msgstr ""
-#: plinth/modules/email_server/templates/email_server.html:10
+#: plinth/modules/email/templates/email.html:10
#, fuzzy
#| msgid "Manage Libraries"
msgid "Manage Spam"
msgstr "Quản lý thư viện"
+#: plinth/modules/email/templates/email.html:22
+msgid "DNS Records"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:25
+msgid ""
+"The following DNS records must be added manually on your primary domain for "
+"the mail server to work properly."
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:36
+msgid "TTL"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:37
+msgid "Class"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:39
+msgid "Priority"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:40
+msgid "Weight"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:41
+#: plinth/modules/minetest/templates/minetest.html:18
+#: plinth/modules/tor/templates/tor.html:72
+msgid "Port"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:42
+msgid "Host/Target/Value"
+msgstr ""
+
#: plinth/modules/firewall/__init__.py:26
#, python-brace-format
msgid ""
@@ -2135,6 +2163,19 @@ msgstr ""
msgid "Service/Port"
msgstr ""
+#: plinth/modules/firewall/templates/firewall.html:54
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+msgid "Enabled"
+msgstr ""
+
+#: plinth/modules/firewall/templates/firewall.html:57
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+#: plinth/templates/cards.html:34
+msgid "Disabled"
+msgstr ""
+
#: plinth/modules/firewall/templates/firewall.html:72
msgid "Permitted"
msgstr ""
@@ -3221,11 +3262,6 @@ msgstr ""
msgid "Address"
msgstr ""
-#: plinth/modules/minetest/templates/minetest.html:18
-#: plinth/modules/tor/templates/tor.html:72
-msgid "Port"
-msgstr ""
-
#: plinth/modules/minidlna/__init__.py:20
msgid ""
"MiniDLNA is a simple media server software, with the aim of being fully "
@@ -3265,15 +3301,15 @@ msgstr ""
msgid "vlc"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:43
+#: plinth/modules/minidlna/manifest.py:48
msgid "kodi"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:76
+#: plinth/modules/minidlna/manifest.py:81
msgid "yaacc"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:86
+#: plinth/modules/minidlna/manifest.py:91
msgid "totem"
msgstr ""
@@ -4981,11 +5017,11 @@ msgstr ""
msgid "VLC media player"
msgstr ""
-#: plinth/modules/samba/manifest.py:55
+#: plinth/modules/samba/manifest.py:60
msgid "GNOME Files"
msgstr ""
-#: plinth/modules/samba/manifest.py:67
+#: plinth/modules/samba/manifest.py:72
msgid "Dolphin"
msgstr ""
@@ -7419,6 +7455,11 @@ msgstr ""
msgid "Gujarati"
msgstr ""
+#, fuzzy
+#~| msgid "Enable DNSSEC"
+#~ msgid "Enable"
+#~ msgstr "Bật DNSSEC"
+
#~ msgid "Enable Dynamic DNS"
#~ msgstr "Bật DNS động"
diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po
index 8662d343d..6b46dd0b5 100644
--- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Plinth\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-14 20:10-0500\n"
-"PO-Revision-Date: 2022-02-02 08:55+0000\n"
+"POT-Creation-Date: 2022-03-02 08:06-0500\n"
+"PO-Revision-Date: 2022-03-04 12:58+0000\n"
"Last-Translator: Eric \n"
"Language-Team: Chinese (Simplified) \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 4.11-dev\n"
+"X-Generator: Weblate 4.11.1-dev\n"
#: doc/dev/_templates/layout.html:11
msgid "Page source"
@@ -857,7 +857,7 @@ msgid "List"
msgstr "列表"
#: plinth/modules/bepasty/views.py:52
-#: plinth/modules/email_server/templates/email_alias.html:28
+#: plinth/modules/email/templates/email-aliases.html:24
#: plinth/modules/letsencrypt/templates/letsencrypt.html:86
#: plinth/modules/networks/templates/connection_show.html:56
#: plinth/modules/samba/templates/samba.html:154
@@ -878,7 +878,7 @@ msgstr "管理员"
msgid "Configuration updated."
msgstr "配置已更新。"
-#: plinth/modules/bepasty/views.py:93 plinth/modules/email_server/views.py:41
+#: plinth/modules/bepasty/views.py:93 plinth/modules/email/views.py:48
#: plinth/modules/gitweb/views.py:117 plinth/modules/searx/views.py:41
#: plinth/modules/searx/views.py:52 plinth/modules/tor/views.py:159
#: plinth/modules/zoph/views.py:72
@@ -945,6 +945,7 @@ msgid "Serving Domains"
msgstr "服务域"
#: plinth/modules/bind/templates/bind.html:17
+#: plinth/modules/email/templates/email.html:38
#: plinth/modules/ikiwiki/forms.py:12
#: plinth/modules/names/templates/names.html:15
#: plinth/modules/networks/templates/connection_show.html:91
@@ -972,7 +973,7 @@ msgstr "刷新 IP 地址和域"
#: plinth/modules/bind/views.py:71 plinth/modules/coturn/views.py:39
#: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78
-#: plinth/modules/ejabberd/views.py:85 plinth/modules/email_server/views.py:38
+#: plinth/modules/ejabberd/views.py:85 plinth/modules/email/views.py:45
#: plinth/modules/matrixsynapse/views.py:124
#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:28
#: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28
@@ -1538,13 +1539,6 @@ msgstr ""
"从您当前 IP 地址收到响应。"
#: plinth/modules/dynamicdns/__init__.py:41
-#, fuzzy
-#| msgid ""
-#| "If you are looking for a free dynamic DNS account, you may find a free "
-#| "GnuDIP service at ddns.freedombox.org or you may find free update URL "
-#| "based services at "
-#| "freedns.afraid.org."
msgid ""
"If you are looking for a free dynamic DNS account, you may find a free "
"GnuDIP service at ddns."
@@ -1553,8 +1547,8 @@ msgid ""
msgstr ""
"如果您正在寻找一个免费的动态 DNS 帐户,您可以在ddns.freedombox.org 找到免费的 GnuDIP "
-"服务,或您可以在 "
-"freedns.afraid.org 找到免费更新网址服务。"
+"服务,或您可以在freedns.afraid.org 找到免费更新网址服务。"
#: plinth/modules/dynamicdns/__init__.py:64
msgid "Dynamic DNS Client"
@@ -1630,8 +1624,6 @@ msgid "GnuDIP"
msgstr "GnuDIP"
#: plinth/modules/dynamicdns/forms.py:57
-#, fuzzy
-#| msgid "other update URL"
msgid "Other update URL"
msgstr "其他更新 URL"
@@ -1695,6 +1687,7 @@ msgid "Status"
msgstr "状态"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:18
+#: plinth/modules/email/templates/email.html:35
#: plinth/modules/letsencrypt/templates/letsencrypt.html:24
msgid "Domain"
msgstr "域名"
@@ -1704,50 +1697,36 @@ msgid "Last update"
msgstr "最后一次更新"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:21
-#, fuzzy
-#| msgid "IP address"
msgid "IP Address"
msgstr "IP 地址"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:32
-#, fuzzy
-#| msgid "Access"
msgid "Success"
-msgstr "访问"
+msgstr "成功"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:36
-#, fuzzy
-#| msgid "failed"
msgid "Failed"
msgstr "失败"
#: plinth/modules/dynamicdns/templates/dynamicdns.html:52
-#, fuzzy
-#| msgid "No libraries available."
msgid "No status available."
-msgstr "没有可用的库。"
+msgstr "无状态可用。"
#: plinth/modules/dynamicdns/views.py:24 plinth/modules/dynamicdns/views.py:26
-#, fuzzy
-#| msgid "Connection Name"
msgid "Connection timed out"
-msgstr "连接名称"
+msgstr "连接超时"
#: plinth/modules/dynamicdns/views.py:25
msgid "Could not find server"
msgstr ""
#: plinth/modules/dynamicdns/views.py:27
-#, fuzzy
-#| msgid "Delete connection"
msgid "Server refused connection"
-msgstr "删除连接"
+msgstr "服务器拒绝连接"
#: plinth/modules/dynamicdns/views.py:28
-#, fuzzy
-#| msgid "Last update"
msgid "Already up-to-date"
-msgstr "最后一次更新"
+msgstr "已是最新"
#: plinth/modules/ejabberd/__init__.py:31
msgid ""
@@ -1883,131 +1862,155 @@ msgstr ""
"%(domainname)s。你可以在系统的配置中设置你"
"的域名。"
-#: plinth/modules/email_server/__init__.py:31
+#: plinth/modules/email/__init__.py:26
+msgid ""
+"This is a complete email server solution using Postfix, Dovecot, and Rspamd. "
+"Postfix sends and receives emails. Dovecot allows email clients to access "
+"your mailbox using IMAP and POP3. Rspamd deals with spam."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:31
+#, python-brace-format
+msgid ""
+"Each user on {box_name} gets an email address like user@mydomain.example. "
+"They will also receive mail from all addresses that look like user"
+"+foo@mydomain.example. Further, they can add aliases to their email address. "
+"Necessary aliases such as \"postmaster\" are automatically created pointing "
+"to the first admin user."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:37
msgid ""
"Roundcube app provides web interface "
"for users to access email."
msgstr ""
-#: plinth/modules/email_server/__init__.py:33
+#: plinth/modules/email/__init__.py:39
msgid ""
"During installation, any other email servers in the system will be "
"uninstalled."
msgstr ""
-#: plinth/modules/email_server/__init__.py:44
+#: plinth/modules/email/__init__.py:58
+msgid "Postfix/Dovecot"
+msgstr ""
+
+#: plinth/modules/email/__init__.py:60
msgid "Email Server"
msgstr "邮件服务器"
-#: plinth/modules/email_server/__init__.py:100
-msgid "Powered by Postfix, Dovecot & Rspamd"
-msgstr ""
+#: plinth/modules/email/__init__.py:80
+msgid "My Email Aliases"
+msgstr "我的邮箱别名"
-#: plinth/modules/email_server/audit/ldap.py:68
-msgid "Postfix-Dovecot SASL integration"
-msgstr ""
+#: plinth/modules/email/__init__.py:81
+msgid "Manage Aliases for Mailbox"
+msgstr "管理邮箱别名"
-#: plinth/modules/email_server/audit/ldap.py:69
-msgid "Postfix alias maps"
-msgstr ""
-
-#: plinth/modules/email_server/audit/spam.py:87
-msgid "Inbound and outbound mail filters"
-msgstr ""
-
-#: plinth/modules/email_server/forms.py:24
+#: plinth/modules/email/forms.py:25
msgid "Primary domain"
msgstr "主域名"
-#: plinth/modules/email_server/forms.py:26
+#: plinth/modules/email/forms.py:27
msgid ""
"Mails are received for all domains configured in the system. Among these, "
"select the most important one."
msgstr ""
-#: plinth/modules/email_server/forms.py:34
+#: plinth/modules/email/forms.py:35
msgid "New alias (without @domain)"
msgstr ""
-#: plinth/modules/email_server/forms.py:41
+#: plinth/modules/email/forms.py:42
msgid "Contains illegal characters"
msgstr ""
-#: plinth/modules/email_server/forms.py:44
+#: plinth/modules/email/forms.py:45
msgid "Must start and end with a-z or 0-9"
msgstr ""
-#: plinth/modules/email_server/forms.py:47
+#: plinth/modules/email/forms.py:49
msgid "Cannot be a number"
msgstr ""
-#: plinth/modules/email_server/forms.py:57
+#: plinth/modules/email/forms.py:59
msgid "Aliases"
msgstr "别名"
-#: plinth/modules/email_server/forms.py:69
-#: plinth/modules/firewall/templates/firewall.html:54
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-msgid "Enabled"
-msgstr "启用"
-
-#: plinth/modules/email_server/forms.py:72
-#: plinth/modules/firewall/templates/firewall.html:57
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-#: plinth/templates/cards.html:34
-msgid "Disabled"
-msgstr "已禁用"
-
-#: plinth/modules/email_server/manifest.py:8
-#: plinth/modules/roundcube/__init__.py:54
+#: plinth/modules/email/manifest.py:12 plinth/modules/roundcube/__init__.py:54
#: plinth/modules/roundcube/manifest.py:6
msgid "Roundcube"
msgstr "Roundcube"
-#: plinth/modules/email_server/manifest.py:16
-#: plinth/modules/radicale/manifest.py:36
+#: plinth/modules/email/manifest.py:20 plinth/modules/radicale/manifest.py:36
msgid "Thunderbird"
msgstr ""
-#: plinth/modules/email_server/manifest.py:33
+#: plinth/modules/email/manifest.py:37
msgid "K-9 Mail"
msgstr ""
-#: plinth/modules/email_server/manifest.py:48
+#: plinth/modules/email/manifest.py:52
msgid "FairEmail"
msgstr ""
-#: plinth/modules/email_server/templates/email_alias.html:13
-#: plinth/modules/email_server/templates/email_server.html:15
+#: plinth/modules/email/templates/email-aliases.html:13
+#: plinth/modules/email/templates/email.html:15
msgid "Manage Aliases"
msgstr "管理别名"
-#: plinth/modules/email_server/templates/email_alias.html:16
+#: plinth/modules/email/templates/email-aliases.html:16
msgid "You have no email aliases."
msgstr ""
-#: plinth/modules/email_server/templates/email_alias.html:24
-msgid "Disable"
-msgstr "禁用"
-
-#: plinth/modules/email_server/templates/email_alias.html:26
-msgid "Enable"
-msgstr "启用"
-
-#: plinth/modules/email_server/templates/email_alias.html:32
+#: plinth/modules/email/templates/email-aliases.html:28
msgid "Create a new email alias"
msgstr "创建新的电子邮件别名"
-#: plinth/modules/email_server/templates/email_alias.html:38
+#: plinth/modules/email/templates/email-aliases.html:34
msgid "Add"
msgstr "添加"
-#: plinth/modules/email_server/templates/email_server.html:10
+#: plinth/modules/email/templates/email.html:10
msgid "Manage Spam"
msgstr "管理垃圾邮件"
+#: plinth/modules/email/templates/email.html:22
+msgid "DNS Records"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:25
+msgid ""
+"The following DNS records must be added manually on your primary domain for "
+"the mail server to work properly."
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:36
+msgid "TTL"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:37
+msgid "Class"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:39
+msgid "Priority"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:40
+msgid "Weight"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:41
+#: plinth/modules/minetest/templates/minetest.html:18
+#: plinth/modules/tor/templates/tor.html:72
+msgid "Port"
+msgstr "端口"
+
+#: plinth/modules/email/templates/email.html:42
+msgid "Host/Target/Value"
+msgstr ""
+
#: plinth/modules/firewall/__init__.py:26
#, python-brace-format
msgid ""
@@ -2054,6 +2057,19 @@ msgstr ""
msgid "Service/Port"
msgstr "服务/端口"
+#: plinth/modules/firewall/templates/firewall.html:54
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+msgid "Enabled"
+msgstr "启用"
+
+#: plinth/modules/firewall/templates/firewall.html:57
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+#: plinth/templates/cards.html:34
+msgid "Disabled"
+msgstr "已禁用"
+
#: plinth/modules/firewall/templates/firewall.html:72
msgid "Permitted"
msgstr "允许"
@@ -3188,11 +3204,6 @@ msgstr "禁用后,玩家不能死或受到任何伤害。"
msgid "Address"
msgstr "地址"
-#: plinth/modules/minetest/templates/minetest.html:18
-#: plinth/modules/tor/templates/tor.html:72
-msgid "Port"
-msgstr "端口"
-
#: plinth/modules/minidlna/__init__.py:20
msgid ""
"MiniDLNA is a simple media server software, with the aim of being fully "
@@ -3232,15 +3243,15 @@ msgstr ""
msgid "vlc"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:43
+#: plinth/modules/minidlna/manifest.py:48
msgid "kodi"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:76
+#: plinth/modules/minidlna/manifest.py:81
msgid "yaacc"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:86
+#: plinth/modules/minidlna/manifest.py:91
msgid "totem"
msgstr ""
@@ -5013,11 +5024,11 @@ msgstr ""
msgid "VLC media player"
msgstr ""
-#: plinth/modules/samba/manifest.py:55
+#: plinth/modules/samba/manifest.py:60
msgid "GNOME Files"
msgstr ""
-#: plinth/modules/samba/manifest.py:67
+#: plinth/modules/samba/manifest.py:72
msgid "Dolphin"
msgstr ""
@@ -7504,6 +7515,12 @@ msgstr "已完成 %(percentage)s%%"
msgid "Gujarati"
msgstr "古吉拉特语"
+#~ msgid "Disable"
+#~ msgstr "禁用"
+
+#~ msgid "Enable"
+#~ msgstr "启用"
+
#~ msgid "Enable Dynamic DNS"
#~ msgstr "启用动态 DNS"
diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po
index 1c524d717..d354d7b60 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: 2022-02-14 20:10-0500\n"
+"POT-Creation-Date: 2022-03-02 08:06-0500\n"
"PO-Revision-Date: 2021-12-23 12:50+0000\n"
"Last-Translator: pesder \n"
"Language-Team: Chinese (Traditional) Configure page."
msgstr ""
-#: plinth/modules/email_server/__init__.py:31
+#: plinth/modules/email/__init__.py:26
+msgid ""
+"This is a complete email server solution using Postfix, Dovecot, and Rspamd. "
+"Postfix sends and receives emails. Dovecot allows email clients to access "
+"your mailbox using IMAP and POP3. Rspamd deals with spam."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:31
+#, python-brace-format
+msgid ""
+"Each user on {box_name} gets an email address like user@mydomain.example. "
+"They will also receive mail from all addresses that look like user"
+"+foo@mydomain.example. Further, they can add aliases to their email address. "
+"Necessary aliases such as \"postmaster\" are automatically created pointing "
+"to the first admin user."
+msgstr ""
+
+#: plinth/modules/email/__init__.py:37
msgid ""
"Roundcube app provides web interface "
"for users to access email."
msgstr ""
-#: plinth/modules/email_server/__init__.py:33
+#: plinth/modules/email/__init__.py:39
msgid ""
"During installation, any other email servers in the system will be "
"uninstalled."
msgstr ""
-#: plinth/modules/email_server/__init__.py:44
+#: plinth/modules/email/__init__.py:58
+msgid "Postfix/Dovecot"
+msgstr ""
+
+#: plinth/modules/email/__init__.py:60
#, fuzzy
#| msgid "Domain Name Server"
msgid "Email Server"
msgstr "域名服務器 DNS"
-#: plinth/modules/email_server/__init__.py:100
-msgid "Powered by Postfix, Dovecot & Rspamd"
-msgstr ""
+#: plinth/modules/email/__init__.py:80
+#, fuzzy
+#| msgid "Manage Libraries"
+msgid "My Email Aliases"
+msgstr "管理圖書館"
-#: plinth/modules/email_server/audit/ldap.py:68
-msgid "Postfix-Dovecot SASL integration"
-msgstr ""
+#: plinth/modules/email/__init__.py:81
+#, fuzzy
+#| msgid "Manage Libraries"
+msgid "Manage Aliases for Mailbox"
+msgstr "管理圖書館"
-#: plinth/modules/email_server/audit/ldap.py:69
-msgid "Postfix alias maps"
-msgstr ""
-
-#: plinth/modules/email_server/audit/spam.py:87
-msgid "Inbound and outbound mail filters"
-msgstr ""
-
-#: plinth/modules/email_server/forms.py:24
+#: plinth/modules/email/forms.py:25
msgid "Primary domain"
msgstr ""
-#: plinth/modules/email_server/forms.py:26
+#: plinth/modules/email/forms.py:27
msgid ""
"Mails are received for all domains configured in the system. Among these, "
"select the most important one."
msgstr ""
-#: plinth/modules/email_server/forms.py:34
+#: plinth/modules/email/forms.py:35
msgid "New alias (without @domain)"
msgstr ""
-#: plinth/modules/email_server/forms.py:41
+#: plinth/modules/email/forms.py:42
msgid "Contains illegal characters"
msgstr ""
-#: plinth/modules/email_server/forms.py:44
+#: plinth/modules/email/forms.py:45
msgid "Must start and end with a-z or 0-9"
msgstr ""
-#: plinth/modules/email_server/forms.py:47
+#: plinth/modules/email/forms.py:49
msgid "Cannot be a number"
msgstr ""
-#: plinth/modules/email_server/forms.py:57
+#: plinth/modules/email/forms.py:59
#, fuzzy
#| msgid "Manage Libraries"
msgid "Aliases"
msgstr "管理圖書館"
-#: plinth/modules/email_server/forms.py:69
-#: plinth/modules/firewall/templates/firewall.html:54
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-msgid "Enabled"
-msgstr ""
-
-#: plinth/modules/email_server/forms.py:72
-#: plinth/modules/firewall/templates/firewall.html:57
-#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
-#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
-#: plinth/templates/cards.html:34
-msgid "Disabled"
-msgstr ""
-
-#: plinth/modules/email_server/manifest.py:8
-#: plinth/modules/roundcube/__init__.py:54
+#: plinth/modules/email/manifest.py:12 plinth/modules/roundcube/__init__.py:54
#: plinth/modules/roundcube/manifest.py:6
msgid "Roundcube"
msgstr ""
-#: plinth/modules/email_server/manifest.py:16
-#: plinth/modules/radicale/manifest.py:36
+#: plinth/modules/email/manifest.py:20 plinth/modules/radicale/manifest.py:36
msgid "Thunderbird"
msgstr ""
-#: plinth/modules/email_server/manifest.py:33
+#: plinth/modules/email/manifest.py:37
msgid "K-9 Mail"
msgstr ""
-#: plinth/modules/email_server/manifest.py:48
+#: plinth/modules/email/manifest.py:52
msgid "FairEmail"
msgstr ""
-#: plinth/modules/email_server/templates/email_alias.html:13
-#: plinth/modules/email_server/templates/email_server.html:15
+#: plinth/modules/email/templates/email-aliases.html:13
+#: plinth/modules/email/templates/email.html:15
#, fuzzy
#| msgid "Manage Libraries"
msgid "Manage Aliases"
msgstr "管理圖書館"
-#: plinth/modules/email_server/templates/email_alias.html:16
+#: plinth/modules/email/templates/email-aliases.html:16
msgid "You have no email aliases."
msgstr ""
-#: plinth/modules/email_server/templates/email_alias.html:24
-msgid "Disable"
-msgstr ""
-
-#: plinth/modules/email_server/templates/email_alias.html:26
-#, fuzzy
-#| msgid "Enable DNSSEC"
-msgid "Enable"
-msgstr "啟用域名系統安全擴充 DNSSEC"
-
-#: plinth/modules/email_server/templates/email_alias.html:32
+#: plinth/modules/email/templates/email-aliases.html:28
#, fuzzy
#| msgid "Create a new backup"
msgid "Create a new email alias"
msgstr "建立一個新的備份檔"
-#: plinth/modules/email_server/templates/email_alias.html:38
+#: plinth/modules/email/templates/email-aliases.html:34
msgid "Add"
msgstr ""
-#: plinth/modules/email_server/templates/email_server.html:10
+#: plinth/modules/email/templates/email.html:10
#, fuzzy
#| msgid "Manage Libraries"
msgid "Manage Spam"
msgstr "管理圖書館"
+#: plinth/modules/email/templates/email.html:22
+msgid "DNS Records"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:25
+msgid ""
+"The following DNS records must be added manually on your primary domain for "
+"the mail server to work properly."
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:36
+msgid "TTL"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:37
+msgid "Class"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:39
+msgid "Priority"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:40
+msgid "Weight"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:41
+#: plinth/modules/minetest/templates/minetest.html:18
+#: plinth/modules/tor/templates/tor.html:72
+msgid "Port"
+msgstr ""
+
+#: plinth/modules/email/templates/email.html:42
+msgid "Host/Target/Value"
+msgstr ""
+
#: plinth/modules/firewall/__init__.py:26
#, python-brace-format
msgid ""
@@ -2014,6 +2042,19 @@ msgstr ""
msgid "Service/Port"
msgstr ""
+#: plinth/modules/firewall/templates/firewall.html:54
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:69
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+msgid "Enabled"
+msgstr ""
+
+#: plinth/modules/firewall/templates/firewall.html:57
+#: plinth/modules/letsencrypt/templates/letsencrypt.html:71
+#: plinth/modules/snapshot/forms.py:23 plinth/modules/snapshot/forms.py:29
+#: plinth/templates/cards.html:34
+msgid "Disabled"
+msgstr ""
+
#: plinth/modules/firewall/templates/firewall.html:72
msgid "Permitted"
msgstr ""
@@ -3100,11 +3141,6 @@ msgstr ""
msgid "Address"
msgstr ""
-#: plinth/modules/minetest/templates/minetest.html:18
-#: plinth/modules/tor/templates/tor.html:72
-msgid "Port"
-msgstr ""
-
#: plinth/modules/minidlna/__init__.py:20
msgid ""
"MiniDLNA is a simple media server software, with the aim of being fully "
@@ -3144,15 +3180,15 @@ msgstr ""
msgid "vlc"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:43
+#: plinth/modules/minidlna/manifest.py:48
msgid "kodi"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:76
+#: plinth/modules/minidlna/manifest.py:81
msgid "yaacc"
msgstr ""
-#: plinth/modules/minidlna/manifest.py:86
+#: plinth/modules/minidlna/manifest.py:91
msgid "totem"
msgstr ""
@@ -4860,11 +4896,11 @@ msgstr ""
msgid "VLC media player"
msgstr ""
-#: plinth/modules/samba/manifest.py:55
+#: plinth/modules/samba/manifest.py:60
msgid "GNOME Files"
msgstr ""
-#: plinth/modules/samba/manifest.py:67
+#: plinth/modules/samba/manifest.py:72
msgid "Dolphin"
msgstr ""
@@ -7295,6 +7331,11 @@ msgstr ""
msgid "Gujarati"
msgstr ""
+#, fuzzy
+#~| msgid "Enable DNSSEC"
+#~ msgid "Enable"
+#~ msgstr "啟用域名系統安全擴充 DNSSEC"
+
#, fuzzy
#~| msgid "Invalid domain name"
#~ msgid "Enter a valid domain"
diff --git a/plinth/modules/dynamicdns/__init__.py b/plinth/modules/dynamicdns/__init__.py
index 9fc18467c..170f21552 100644
--- a/plinth/modules/dynamicdns/__init__.py
+++ b/plinth/modules/dynamicdns/__init__.py
@@ -258,7 +258,18 @@ def get_config():
"""Return the current configuration."""
default_config = {'domains': {}}
config = kvstore.get_default('dynamicdns_config', '{}')
- return json.loads(config) or default_config
+ config = json.loads(config) or default_config
+ return _fix_corrupt_config(config)
+
+
+def _fix_corrupt_config(config):
+ """Fix malformed configuration result of bug in older version."""
+ if 'null' not in config['domains']:
+ return config
+
+ del config['domains']['null']
+ set_config(config)
+ return config
def set_config(config):
diff --git a/plinth/modules/email/__init__.py b/plinth/modules/email/__init__.py
new file mode 100644
index 000000000..a5d7a81f7
--- /dev/null
+++ b/plinth/modules/email/__init__.py
@@ -0,0 +1,226 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+FreedomBox app to manage an email server.
+"""
+
+import logging
+
+from django.urls import reverse_lazy
+from django.utils.translation import gettext_lazy as _
+
+import plinth.app
+from plinth import actions, cfg, frontpage, menu
+from plinth.daemon import Daemon
+from plinth.modules.apache.components import Webserver
+from plinth.modules.backups.components import BackupRestore
+from plinth.modules.config import get_domainname
+from plinth.modules.firewall.components import Firewall
+from plinth.modules.letsencrypt.components import LetsEncrypt
+from plinth.package import Packages, remove
+from plinth.signals import domain_added, domain_removed
+from plinth.utils import format_lazy
+
+from . import aliases, manifest, privileged
+
+_description = [
+ _('This is a complete email server solution using Postfix, Dovecot, '
+ 'and Rspamd. Postfix sends and receives emails. Dovecot allows '
+ 'email clients to access your mailbox using IMAP and POP3. Rspamd deals '
+ 'with spam.'),
+ format_lazy(
+ _('Each user on {box_name} gets an email address like '
+ 'user@mydomain.example. They will also receive mail from all '
+ 'addresses that look like user+foo@mydomain.example. Further, '
+ 'they can add aliases to their email address. Necessary aliases '
+ 'such as "postmaster" are automatically created pointing to the '
+ 'first admin user.'), box_name=_(cfg.box_name)),
+ _('Roundcube app provides web '
+ 'interface for users to access email.'),
+ _('During installation, any other email servers in the system will be '
+ 'uninstalled.')
+]
+
+app = None
+logger = logging.getLogger(__name__)
+
+
+class EmailApp(plinth.app.App):
+ """FreedomBox app for an email server."""
+ app_id = 'email'
+
+ _version = 1
+
+ def __init__(self):
+ """The app's constructor"""
+ super().__init__()
+
+ info = plinth.app.Info(app_id=self.app_id, version=self._version,
+ name=_('Postfix/Dovecot'),
+ icon_filename='email',
+ short_description=_('Email Server'),
+ description=_description, manual_page='Email',
+ clients=manifest.clients,
+ donation_url='https://rspamd.com/support.html')
+ self.add(info)
+
+ menu_item = menu.Menu('menu-email', info.name, info.short_description,
+ info.icon_filename, 'email:index',
+ parent_url_name='apps', advanced=True)
+ self.add(menu_item)
+
+ shortcut = frontpage.Shortcut(
+ 'shortcut-email', info.name,
+ short_description=info.short_description, icon=info.icon_filename,
+ description=info.description,
+ configure_url=reverse_lazy('email:index'), clients=info.clients,
+ login_required=True)
+ self.add(shortcut)
+
+ shortcut = frontpage.Shortcut(
+ 'shortcut-email-aliases', _('My Email Aliases'),
+ short_description=_('Manage Aliases for Mailbox'),
+ icon=info.icon_filename, url=reverse_lazy('email:aliases'),
+ login_required=True)
+ self.add(shortcut)
+
+ # Other likely install conflicts have been discarded:
+ # - msmtp, nullmailer, sendmail don't cause install faults.
+ # - qmail and smail are missing in Bullseye (Not tested,
+ # but less likely due to that).
+ packages = Packages(
+ 'packages-email', [
+ 'postfix', 'postfix-sqlite', 'dovecot-pop3d', 'dovecot-imapd',
+ 'dovecot-lmtpd', 'dovecot-managesieved', 'dovecot-ldap',
+ 'rspamd', 'redis-server', 'openssl'
+ ], conflicts=['exim4-base', 'exim4-config', 'exim4-daemon-light'],
+ conflicts_action=Packages.ConflictsAction.IGNORE)
+ self.add(packages)
+
+ listen_ports = [(25, 'tcp4'), (25, 'tcp6'), (465, 'tcp4'),
+ (465, 'tcp6'), (587, 'tcp4'), (587, 'tcp6')]
+ daemon = Daemon('daemon-email-postfix', 'postfix',
+ listen_ports=listen_ports)
+ self.add(daemon)
+
+ listen_ports = [(143, 'tcp4'), (143, 'tcp6'), (993, 'tcp4'),
+ (993, 'tcp6'), (110, 'tcp4'), (110, 'tcp6'),
+ (995, 'tcp4'), (995, 'tcp6'), (4190, 'tcp4'),
+ (4190, 'tcp6')]
+ daemon = Daemon('daemon-email-dovecot', 'dovecot',
+ listen_ports=listen_ports)
+ self.add(daemon)
+
+ listen_ports = [(11332, 'tcp4'), (11332, 'tcp6'), (11333, 'tcp4'),
+ (11333, 'tcp6'), (11334, 'tcp4'), (11334, 'tcp6')]
+ daemon = Daemon('daemon-email-rspamd', 'rspamd',
+ listen_ports=listen_ports)
+ self.add(daemon)
+
+ daemon = Daemon('daemon-email-redis', 'redis-server',
+ listen_ports=[(6379, 'tcp4'), (6379, 'tcp6')])
+ self.add(daemon)
+
+ port_names = [
+ 'smtp', 'smtps', 'smtp-submission', 'imaps', 'pop3s', 'managesieve'
+ ]
+ firewall = Firewall('firewall-email', info.name, ports=port_names,
+ is_external=True)
+ self.add(firewall)
+
+ # /rspamd location
+ webserver = Webserver(
+ 'webserver-email', # unique id
+ 'email-freedombox', # config file name
+ urls=['https://{host}/rspamd'])
+ self.add(webserver)
+
+ # Let's Encrypt event hook
+ letsencrypt = LetsEncrypt(
+ 'letsencrypt-email-postfix', domains='*', daemons=['postfix'],
+ should_copy_certificates=True,
+ private_key_path='/etc/postfix/letsencrypt/{domain}/chain.pem',
+ certificate_path='/etc/postfix/letsencrypt/{domain}/chain.pem',
+ user_owner='root', group_owner='root', managing_app='email')
+ self.add(letsencrypt)
+
+ letsencrypt = LetsEncrypt(
+ 'letsencrypt-email-dovecot', domains='*', daemons=['dovecot'],
+ should_copy_certificates=True,
+ private_key_path='/etc/dovecot/letsencrypt/{domain}/privkey.pem',
+ certificate_path='/etc/dovecot/letsencrypt/{domain}/cert.pem',
+ user_owner='root', group_owner='root', managing_app='email')
+ self.add(letsencrypt)
+
+ backup_restore = BackupRestore('backup-restore-email',
+ **manifest.backup)
+ self.add(backup_restore)
+
+ @staticmethod
+ def post_init():
+ """Perform post initialization operations."""
+ domain_added.connect(on_domain_added)
+ domain_removed.connect(on_domain_removed)
+
+
+def get_domains():
+ """Return the list of domains configured."""
+ default_domain = get_domainname()
+ return [default_domain] if default_domain else []
+
+
+def _get_first_admin():
+ """Return an admin user in the system or None if non exist."""
+ from django.contrib.auth.models import User
+ users = User.objects.filter(groups__name='admin')
+ return users[0].username if users else None
+
+
+def setup(helper, old_version=None):
+ """Installs and configures module"""
+
+ def _clear_conflicts():
+ component = app.get_component('packages-email')
+ packages_to_remove = component.find_conflicts()
+ if packages_to_remove:
+ logger.info('Removing conflicting packages: %s',
+ packages_to_remove)
+ remove(packages_to_remove)
+
+ # Install
+ helper.call('pre', _clear_conflicts)
+ app.setup(old_version)
+
+ # Setup
+ helper.call('post', privileged.home.setup)
+ app.get_component('letsencrypt-email-postfix').setup_certificates()
+ app.get_component('letsencrypt-email-dovecot').setup_certificates()
+ helper.call('post', privileged.domain.set_domains)
+ helper.call('post', privileged.postfix.setup)
+ helper.call('post', aliases.setup_common_aliases, _get_first_admin())
+ helper.call('post', privileged.spam.setup)
+
+ # Restart daemons
+ actions.superuser_run('service', ['try-restart', 'postfix'])
+ actions.superuser_run('service', ['try-restart', 'dovecot'])
+ actions.superuser_run('service', ['try-restart', 'rspamd'])
+
+ # Expose to public internet
+ if old_version == 0:
+ helper.call('post', app.enable)
+
+
+def on_domain_added(sender, domain_type, name, description='', services=None,
+ **kwargs):
+ """Handle addition of a new domain."""
+ if app.needs_setup():
+ return
+
+ privileged.domain.set_domains()
+
+
+def on_domain_removed(sender, domain_type, name='', **kwargs):
+ """Handle removal of a domain."""
+ if app.needs_setup():
+ return
+
+ privileged.domain.set_domains()
diff --git a/plinth/modules/email_server/aliases.py b/plinth/modules/email/aliases.py
similarity index 64%
rename from plinth/modules/email_server/aliases.py
rename to plinth/modules/email/aliases.py
index e3c9515f2..5d5b3fec8 100644
--- a/plinth/modules/email_server/aliases.py
+++ b/plinth/modules/email/aliases.py
@@ -1,10 +1,12 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
-"""Manage email aliases."""
+"""
+Manage email aliases stored in sqlite database.
+"""
import contextlib
import pwd
import sqlite3
-from dataclasses import InitVar, dataclass, field
+from dataclasses import dataclass
from plinth import actions
@@ -13,11 +15,6 @@ from plinth import actions
class Alias:
value: str
name: str
- enabled: bool = field(init=False)
- status: InitVar[int]
-
- def __post_init__(self, status):
- self.enabled = (status != 0)
@contextlib.contextmanager
@@ -36,7 +33,7 @@ def _get_cursor():
def get(username):
"""Get all aliases of a user."""
- query = 'SELECT name, value, status FROM alias WHERE value=?'
+ query = 'SELECT name, value FROM alias WHERE value=?'
with _get_cursor() as cursor:
rows = cursor.execute(query, (username, ))
return [Alias(**row) for row in rows]
@@ -58,10 +55,10 @@ def exists(name):
def put(username, name):
"""Insert if not exists a new alias."""
- query = 'INSERT INTO alias (name, value, status) VALUES (?, ?, ?)'
+ query = 'INSERT INTO alias (name, value) VALUES (?, ?)'
with _get_cursor() as cursor:
try:
- cursor.execute(query, (name, username, 1))
+ cursor.execute(query, (name, username))
except sqlite3.IntegrityError:
pass # Alias exists, rare since we are already checking
@@ -76,29 +73,9 @@ def delete(username, aliases):
cursor.execute('COMMIT')
-def enable(username, aliases):
- """Enable a list of aliases."""
- return _set_status(username, aliases, 1)
-
-
-def disable(username, aliases):
- """Disable a list of aliases."""
- return _set_status(username, aliases, 0)
-
-
-def _set_status(username, aliases, status):
- """Set the status value of a list of aliases."""
- query = 'UPDATE alias SET status=? WHERE value=? AND name=?'
- parameter_seq = ((status, username, name) for name in aliases)
- with _get_cursor() as cursor:
- cursor.execute('BEGIN')
- cursor.executemany(query, parameter_seq)
- cursor.execute('COMMIT')
-
-
def first_setup():
"""Create the database file and schema inside it."""
- actions.superuser_run('email_server', ['aliases', 'setup'])
+ actions.superuser_run('email', ['aliases', 'setup'])
# Create schema if not exists
query = '''
@@ -106,10 +83,24 @@ BEGIN;
CREATE TABLE IF NOT EXISTS alias (
name TEXT NOT NULL,
value TEXT NOT NULL,
- status INTEGER NOT NULL,
PRIMARY KEY (name)
);
COMMIT;
'''
with _get_cursor() as cursor:
cursor.executescript(query)
+
+
+def setup_common_aliases(username):
+ """Create aliases for common mailboxes described in RFC2142.
+
+ See: https://datatracker.ietf.org/doc/html/rfc2142
+ """
+ aliases = [
+ 'mailer-daemon', 'postmaster', 'nobody', 'webmaster', 'www',
+ 'hostmaster', 'info', 'support', 'abuse', 'noc', 'security'
+ 'usenet', 'news', 'ftp'
+ ]
+ for alias in aliases:
+ if not exists(alias):
+ put(username, alias)
diff --git a/plinth/modules/email/data/etc/apache2/conf-available/email-freedombox.conf b/plinth/modules/email/data/etc/apache2/conf-available/email-freedombox.conf
new file mode 100644
index 000000000..9f99790de
--- /dev/null
+++ b/plinth/modules/email/data/etc/apache2/conf-available/email-freedombox.conf
@@ -0,0 +1,30 @@
+# Serve rspamd web UI:
+# https://www.rspamd.com/doc/faq.html#how-to-use-the-webui-behind-a-proxy-server
+
+ Redirect "/rspamd/"
+
+
+
+ ProxyPass http://127.0.0.1:11334/
+ ProxyPassReverse http://127.0.0.1:11334/
+
+ # Don't add X-Forwarded* headers to make rspamd think that request is coming
+ # from localhost. This disables rspamd's password auth mechanism in favor of
+ # FreedomBox authentication and authorization below.
+ ProxyAddHeaders off
+
+ # Require SSO
+ Include includes/freedombox-single-sign-on.conf
+
+ TKTAuthToken "admin"
+
+
+
+# Automatic configuration for clients like Thunderbird:
+# https://wiki.mozilla.org/Thunderbird:Autoconfiguration#Implementation
+
+
+ RewriteEngine On
+ RewriteRule ^ /plinth/apps/email/config.xml [PT]
+
+
diff --git a/plinth/modules/email/data/etc/dovecot/conf.d/05-freedombox-passdb.conf b/plinth/modules/email/data/etc/dovecot/conf.d/05-freedombox-passdb.conf
new file mode 100644
index 000000000..efc226d78
--- /dev/null
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/05-freedombox-passdb.conf
@@ -0,0 +1,15 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# See:
+# https://doc.dovecot.org/configuration_manual/authentication/password_databases_passdb/
+#
+# For passdb, the passwd driver looks up using NSS. In FreedomBox, NSS is
+# configured to lookup LDAP with the help of libnss-ldapd. Lookup using passdb
+# would have been sufficient if FreedomBox allowed all its users to login using
+# pam. However, by default, FreedomBox disallows all users but 'admin' group to
+# login. Hence, the need for LDAP lookup.
+#
+passdb {
+ driver = ldap
+ args = /etc/dovecot/conf.d/freedombox-ldap.conf.ext
+}
diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/05-freedombox-mail.conf b/plinth/modules/email/data/etc/dovecot/conf.d/05-freedombox-userdb.conf
similarity index 62%
rename from plinth/modules/email_server/data/etc/dovecot/conf.d/05-freedombox-mail.conf
rename to plinth/modules/email/data/etc/dovecot/conf.d/05-freedombox-userdb.conf
index e3c908d64..4932085ab 100644
--- a/plinth/modules/email_server/data/etc/dovecot/conf.d/05-freedombox-mail.conf
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/05-freedombox-userdb.conf
@@ -1,6 +1,8 @@
-# Direct edits to this file will be lost!
-# Manage your settings on Plinth
+# Do not edit this file. Manage your settings on FreedomBox.
+# See:
+# https://doc.dovecot.org/configuration_manual/authentication/user_databases_userdb/
+#
# Users in FreedomBox are not expected to access mail by logging into the
# system. Storing the mail in single location instead of home directories and
# with single UID/GID simplifies security reasoning and backup/restore
@@ -11,15 +13,16 @@
# FreedomBox. So, authenticate and store mails based on username only instead of
# including domain names in storage path.
#
-# For authdb and userdb, the passwd driver looks up using NSS. In FreedomBox,
-# NSS is configured to lookup LDAP with the help of libnss-ldapd. There is no
-# need to configure LDAP lookup separately.
-#
# Directories are created under /var/mail as necessary by dovecot. Permissions
# for newly created directories are inherited from parent directory. FreedomBox
# will remove all permissions for 'others' from /var/mail to ensure that mail is
# not read by non-root users.
+#
+# userdb provides lookup for three parameters after authentication of a user.
+# These parameters are uid, gid, and home directory of the user. If these do not
+# change from user to user, a 'static' database type with fixed values is
+# sufficient as userdb.
userdb {
- driver = passwd
- override_fields = home=/var/mail/%Ln uid=mail gid=mail
+ driver = static
+ args = home=/var/mail/%Ln uid=mail gid=mail
}
diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/05-freedombox-auth.conf b/plinth/modules/email/data/etc/dovecot/conf.d/15-freedombox-auth.conf
similarity index 65%
rename from plinth/modules/email_server/data/etc/dovecot/conf.d/05-freedombox-auth.conf
rename to plinth/modules/email/data/etc/dovecot/conf.d/15-freedombox-auth.conf
index a2d3eabcc..5371ccc24 100644
--- a/plinth/modules/email_server/data/etc/dovecot/conf.d/05-freedombox-auth.conf
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/15-freedombox-auth.conf
@@ -1,5 +1,6 @@
-# Direct edits to this file will be lost!
-# Manage your settings on Plinth
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# See: https://doc.dovecot.org/settings/core/
# Outlook and Windows Mail works only with LOGIN mechanism, not the standard
# PLAIN:
diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/15-freedombox-mail.conf b/plinth/modules/email/data/etc/dovecot/conf.d/15-freedombox-mail.conf
similarity index 79%
rename from plinth/modules/email_server/data/etc/dovecot/conf.d/15-freedombox-mail.conf
rename to plinth/modules/email/data/etc/dovecot/conf.d/15-freedombox-mail.conf
index 40bccbce2..26d619208 100644
--- a/plinth/modules/email_server/data/etc/dovecot/conf.d/15-freedombox-mail.conf
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/15-freedombox-mail.conf
@@ -1,5 +1,7 @@
-# Direct edits to this file will be lost!
-# Manage your settings on Plinth
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# See: https://doc.dovecot.org/configuration_manual/mail_location/
+# See: https://doc.dovecot.org/settings/core/
# Use sdbox, a format specific to dovecot, for storing mails. The format allows
# better performance with some IMAP queries. When this is combined with Full
diff --git a/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf b/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf
new file mode 100644
index 000000000..7c06223c5
--- /dev/null
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf
@@ -0,0 +1,8 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# See: https://doc.dovecot.org/configuration_manual/sieve/configuration/
+
+# Enable the sieve plugin to sort mail during delivery using sieve scripts.
+protocol lmtp {
+ mail_plugins = $mail_plugins sieve
+}
diff --git a/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf b/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf
new file mode 100644
index 000000000..df45817c2
--- /dev/null
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf
@@ -0,0 +1,71 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# Mark various mailboxes with special use flags (RFC 6154). Various names used
+# in mail clients for mailboxes: https://www.imapwiki.org/SpecialUse
+# See: https://doc.dovecot.org/configuration_manual/namespace/
+
+namespace inbox {
+ # Archive
+ mailbox Archive {
+ auto = subscribe
+ special_use = \Archive
+ }
+ mailbox Archives { # Thunderbird
+ auto = no
+ special_use = \Archive
+ }
+
+ # Drafts
+ mailbox Drafts {
+ auto = subscribe
+ special_use = \Drafts
+ }
+
+ # Sent
+ mailbox Sent {
+ auto = subscribe
+ special_use = \Sent
+ }
+ mailbox "Sent Items" { # Outlook 2010/2013
+ auto = no
+ special_use = \Sent
+ }
+ mailbox "Sent Messages" { # iOS
+ auto = no
+ special_use = \Sent
+ }
+
+ # Junk
+ mailbox Junk {
+ auto = subscribe
+ autoexpunge = 60d
+ special_use = \Junk
+ }
+ mailbox Spam { # KMail, K-9 Mail
+ auto = no
+ autoexpunge = 60d
+ special_use = \Junk
+ }
+ mailbox "Junk E-mail" { # Outlook 2010
+ auto = no
+ autoexpunge = 60d
+ special_use = \Junk
+ }
+ mailbox INBOX.Junk {
+ auto = no
+ autoexpunge = 60d
+ special_use = \Junk
+ }
+
+ # Trash
+ mailbox Trash {
+ auto = subscribe
+ autoexpunge = 60d
+ special_use = \Trash
+ }
+ mailbox INBOX.Trash {
+ auto = no
+ autoexpunge = 60d
+ special_use = \Trash
+ }
+}
diff --git a/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-master.conf b/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-master.conf
new file mode 100644
index 000000000..51a5e2964
--- /dev/null
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-master.conf
@@ -0,0 +1,21 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# Listen on Unix domain sockets for postfix to use dovecot SASL authentication
+# and for postfix to deliver mail using dovecot to local mailboxes. See:
+# https://doc.dovecot.org/configuration_manual/howto/postfix_and_dovecot_sasl/
+
+service auth {
+ unix_listener /var/spool/postfix/private/auth {
+ mode = 0600
+ user = postfix
+ group = postfix
+ }
+}
+
+service lmtp {
+ unix_listener /var/spool/postfix/private/dovecot-lmtp {
+ mode = 0600
+ user = postfix
+ group = postfix
+ }
+}
diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-tls.conf b/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-tls.conf
similarity index 65%
rename from plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-tls.conf
rename to plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-tls.conf
index 8734fe4a2..b61e9f6ae 100644
--- a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-tls.conf
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/90-freedombox-tls.conf
@@ -1,9 +1,8 @@
-# Direct edits to this file will be lost!
-# Manage your settings on FreedomBox
+# Do not edit this file. Manage your settings on FreedomBox.
-# Mozilla Guideline v5.6, Dovecot 2.3.9, OpenSSL 1.1.1d, intermediate
-# Generated 2021-08
-# https://ssl-config.mozilla.org/
+# Mozilla Guideline v5.6, Dovecot 2.3.9, OpenSSL 1.1.1d, intermediate.
+# Generated 2021-08: https://ssl-config.mozilla.org/
+# See: https://doc.dovecot.org/configuration_manual/dovecot_ssl_configuration/
ssl = required
ssl_min_protocol = TLSv1.2
diff --git a/plinth/modules/email/data/etc/dovecot/conf.d/95-freedombox-sieve.conf b/plinth/modules/email/data/etc/dovecot/conf.d/95-freedombox-sieve.conf
new file mode 100644
index 000000000..2b4ec8ccb
--- /dev/null
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/95-freedombox-sieve.conf
@@ -0,0 +1,9 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# Default sieve scripts applied for delivery to all users. To move mail to Junk
+# folder based on classification headers set by rspamd. See:
+# https://doc.dovecot.org/settings/pigeonhole/
+
+plugin {
+ sieve_after = /etc/dovecot/freedombox-sieve-after
+}
diff --git a/plinth/modules/email/data/etc/dovecot/conf.d/freedombox-ldap.conf.ext b/plinth/modules/email/data/etc/dovecot/conf.d/freedombox-ldap.conf.ext
new file mode 100644
index 000000000..708caf22a
--- /dev/null
+++ b/plinth/modules/email/data/etc/dovecot/conf.d/freedombox-ldap.conf.ext
@@ -0,0 +1,8 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# See: https://wiki.dovecot.org/AuthDatabase/LDAP/AuthBinds
+
+uris = ldapi:///
+base =
+auth_bind = yes
+auth_bind_userdn = uid=%u,ou=users,dc=thisbox
diff --git a/plinth/modules/email/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve b/plinth/modules/email/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve
new file mode 100644
index 000000000..9600ba9b7
--- /dev/null
+++ b/plinth/modules/email/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve
@@ -0,0 +1,11 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# A simple sieve script that applies to all users. Moves mail to Junk folder
+# based on classification header set by rspamd.
+# See: https://docs.gandi.net/en/gandimail/sieve/sieve_tutorial.html
+
+require ["fileinto", "mailbox"];
+
+if header :is "X-Spam" "Yes" {
+ fileinto :create "Junk";
+}
diff --git a/plinth/modules/email/data/etc/plinth/modules-enabled/email b/plinth/modules/email/data/etc/plinth/modules-enabled/email
new file mode 100644
index 000000000..c9c704d34
--- /dev/null
+++ b/plinth/modules/email/data/etc/plinth/modules-enabled/email
@@ -0,0 +1 @@
+plinth.modules.email
diff --git a/plinth/modules/email/data/etc/postfix/freedombox-aliases.cf b/plinth/modules/email/data/etc/postfix/freedombox-aliases.cf
new file mode 100644
index 000000000..3cd9c0166
--- /dev/null
+++ b/plinth/modules/email/data/etc/postfix/freedombox-aliases.cf
@@ -0,0 +1,7 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# Configuration for sqlite based postfix lookup table for aliases. See:
+# https://www.postfix.org/SQLITE_README.html
+
+dbpath = /var/lib/postfix/freedombox-aliases/aliases.sqlite3
+query = SELECT value FROM alias WHERE name='%s'
diff --git a/plinth/modules/email/data/etc/rspamd/local.d/freedombox-logging.inc b/plinth/modules/email/data/etc/rspamd/local.d/freedombox-logging.inc
new file mode 100644
index 000000000..d342720b0
--- /dev/null
+++ b/plinth/modules/email/data/etc/rspamd/local.d/freedombox-logging.inc
@@ -0,0 +1 @@
+type=syslog
diff --git a/plinth/modules/email/data/etc/rspamd/local.d/freedombox-milter-headers.conf b/plinth/modules/email/data/etc/rspamd/local.d/freedombox-milter-headers.conf
new file mode 100644
index 000000000..f42f4ed37
--- /dev/null
+++ b/plinth/modules/email/data/etc/rspamd/local.d/freedombox-milter-headers.conf
@@ -0,0 +1,13 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# Configure which/how headers are added by rspamd before returning mail to
+# postfix. See: https://rspamd.com/doc/modules/milter_headers.html
+
+use = ["authentication-results", "x-spam-level", "x-spam-status",
+ "x-spamd-bar", "x-spamd-result"];
+
+routines {
+ authentication-results {
+ add_smtp_user = false;
+ }
+}
diff --git a/plinth/modules/email/data/etc/rspamd/local.d/freedombox-redis.conf b/plinth/modules/email/data/etc/rspamd/local.d/freedombox-redis.conf
new file mode 100644
index 000000000..72200cd99
--- /dev/null
+++ b/plinth/modules/email/data/etc/rspamd/local.d/freedombox-redis.conf
@@ -0,0 +1,8 @@
+# Do not edit this file. Manage your settings on FreedomBox.
+
+# Many modules such as bayes classifier require redis. Default configuration
+# does not connect to a local redis server. See:
+# https://rspamd.com/doc/configuration/redis.html
+
+servers = "127.0.0.1";
+db = "7"; # Use database number 8 not to clash with other clients
diff --git a/plinth/modules/email/dns.py b/plinth/modules/email/dns.py
new file mode 100644
index 000000000..c6df85abe
--- /dev/null
+++ b/plinth/modules/email/dns.py
@@ -0,0 +1,74 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Manage DNS entries needed for an email server.
+
+See: https://en.wikipedia.org/wiki/MX_record
+See: https://dmarcguide.globalcyberalliance.org/
+See: https://support.google.com/a/answer/2466580
+See: https://datatracker.ietf.org/doc/html/rfc6186
+See: https://rspamd.com/doc/modules/dkim_signing.html
+"""
+
+from dataclasses import dataclass
+from typing import Union
+
+from plinth.errors import ActionError
+
+
+@dataclass
+class Entry: # pylint: disable=too-many-instance-attributes
+ """A DNS entry."""
+ type_: str
+ value: str
+ domain: Union[str, None] = None
+ class_: str = 'IN'
+ ttl: int = 60
+ priority: int = 10
+ weight: Union[int, None] = None
+ port: Union[int, None] = None
+
+ def get_split_value(self):
+ """If the record is TXT and value > 255, split it."""
+ if len(self.value) <= 255:
+ return self.value
+
+ pieces = []
+ value = self.value
+ while value:
+ pieces.append(f'"{value[:255]}"')
+ value = value[255:]
+
+ return ' '.join(pieces)
+
+
+def get_entries():
+ """Return the list of DNS entries to make."""
+ from . import privileged
+
+ domain = privileged.domain.get_domains()['primary_domain']
+ mx_spam_entries = [
+ Entry(type_='MX', value=f'{domain}.'),
+ Entry(type_='TXT', value='v=spf1 mx a ~all'),
+ Entry(
+ domain='_dmarc', type_='TXT',
+ value='v=DMARC1; p=none; sp=quarantine; '
+ f'rua=mailto:postmaster@{domain}; ')
+ ]
+ try:
+ dkim_public_key = privileged.dkim.get_public_key(domain)
+ dkim_entries = [
+ Entry(domain='dkim._domainkey', type_='TXT',
+ value=f'v=DKIM1; k=rsa; p={dkim_public_key}')
+ ]
+ except ActionError:
+ dkim_entries = []
+
+ autoconfig_entries = [
+ Entry(domain='_submission._tcp', type_='SRV', weight=10, port=587,
+ value=f'{domain}.'),
+ Entry(domain='_imaps._tcp', type_='SRV', weight=10, port=993,
+ value=f'{domain}.'),
+ Entry(domain='_pop3s._tcp', type_='SRV', priority=20, weight=10,
+ port=995, value=f'{domain}.'),
+ ]
+ return mx_spam_entries + dkim_entries + autoconfig_entries
diff --git a/plinth/modules/email_server/forms.py b/plinth/modules/email/forms.py
similarity index 64%
rename from plinth/modules/email_server/forms.py
rename to plinth/modules/email/forms.py
index 265bfa5dd..89fc89df9 100644
--- a/plinth/modules/email_server/forms.py
+++ b/plinth/modules/email/forms.py
@@ -2,6 +2,7 @@
"""
Forms for the email app.
"""
+
import re
from django import forms
@@ -37,13 +38,14 @@ class AliasCreateForm(forms.Form):
def clean_alias(self):
"""Return the checked value for alias."""
value = self.data['alias'].strip().lower()
- if not re.match('^[a-z0-9-_\\.]+$', value):
+ if not re.match(r'^[a-z0-9-_\.]+$', value):
raise ValidationError(_('Contains illegal characters'))
- if not re.match('^[a-z0-9].*[a-z0-9]$', value):
+ if not re.match(r'^[a-z0-9].*[a-z0-9]$', value):
raise ValidationError(_('Must start and end with a-z or 0-9'))
- if re.match('^[0-9]+$', value):
+ # For when uids are automatically aliased to username
+ if re.match(r'^[0-9]+$', value):
raise ValidationError(_('Cannot be a number'))
if aliases_module.exists(value):
@@ -60,26 +62,5 @@ class AliasListForm(forms.Form):
def __init__(self, aliases, *args, **kwargs):
"""Populate the choices for aliases."""
super().__init__(*args, **kwargs)
- enabled_aliases = [(alias.name, alias.name) for alias in aliases
- if alias.enabled]
- disabled_aliases = [(alias.name, alias.name) for alias in aliases
- if not alias.enabled]
- choices = []
- if enabled_aliases:
- choices.append((_('Enabled'), enabled_aliases))
-
- if disabled_aliases:
- choices.append((_('Disabled'), disabled_aliases))
-
+ choices = [(alias.name, alias.name) for alias in aliases]
self.fields['aliases'].choices = choices
-
- def clean(self):
- """Add the pressed button to cleaned data."""
- cleaned_data = super().clean()
- buttons = [key[4:] for key in self.data if key.startswith('btn_')]
- if len(buttons) != 1 or buttons[0] not in ('enable', 'disable',
- 'delete'):
- raise ValidationError('Invalid button pressed')
-
- cleaned_data['action'] = buttons[0]
- return cleaned_data
diff --git a/plinth/modules/email_server/manifest.py b/plinth/modules/email/manifest.py
similarity index 78%
rename from plinth/modules/email_server/manifest.py
rename to plinth/modules/email/manifest.py
index 8eb919993..d46f8fbca 100644
--- a/plinth/modules/email_server/manifest.py
+++ b/plinth/modules/email/manifest.py
@@ -1,4 +1,8 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Application manifest for email.
+"""
+
from django.utils.translation import gettext_lazy as _
from plinth.clients import store_url
@@ -17,15 +21,15 @@ clients = [
'platforms': [{
'type': 'download',
'os': 'gnu-linux',
- 'url': 'https://www.thunderbird.net/en-US/'
+ 'url': 'https://www.thunderbird.net/'
}, {
'type': 'download',
'os': 'macos',
- 'url': 'https://www.thunderbird.net/en-US/'
+ 'url': 'https://www.thunderbird.net/'
}, {
'type': 'download',
'os': 'windows',
- 'url': 'https://www.thunderbird.net/en-US/'
+ 'url': 'https://www.thunderbird.net/'
}]
},
{
@@ -62,13 +66,14 @@ clients = [
backup = {
'data': {
+ 'files': ['/etc/aliases', ],
'directories': [
- '/var/lib/plinth/mailsrv',
- '/var/spool/postfix/fbx-managed',
- '/etc/postfix',
- '/etc/dovecot',
- '/etc/rspamd',
- '/var/lib/rspamd',
+ '/etc/postfix/',
+ '/etc/dovecot/conf.d/',
+ '/etc/rspamd/',
+ '/var/lib/postfix/freedombox-aliases/',
+ '/var/lib/rspamd/',
+ '/var/mail/',
]
},
'services': ['postfix', 'dovecot', 'rspamd']
diff --git a/plinth/modules/email/postfix.py b/plinth/modules/email/postfix.py
new file mode 100644
index 000000000..a23c3153a
--- /dev/null
+++ b/plinth/modules/email/postfix.py
@@ -0,0 +1,129 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Set and get postfix configuration using postconf.
+
+See: http://www.postfix.org/postconf.1.html
+See: http://www.postfix.org/master.5.html
+See: http://www.postfix.org/postconf.5.html
+"""
+
+import re
+import subprocess
+from dataclasses import dataclass
+
+
+@dataclass
+class Service: # NOQA, pylint: disable=too-many-instance-attributes
+ """Representation of a postfix daemon and its options."""
+ service: str
+ type_: str
+ private: str
+ unpriv: str
+ chroot: str
+ wakeup: str
+ maxproc: str
+ command: str
+ options: str
+
+ def __str__(self) -> str:
+ parts = [
+ self.service, self.type_, self.private, self.unpriv, self.chroot,
+ self.wakeup, self.maxproc, self.command
+ ]
+ for key, value in self.options.items():
+ _validate_key(key)
+ _validate_value(value)
+ parts.extend(['-o', f'{key}={value}'])
+
+ return ' '.join(parts)
+
+
+def get_config(keys: list) -> dict:
+ """Get postfix configuration using the postconf command."""
+ for key in keys:
+ _validate_key(key)
+
+ args = ['/sbin/postconf']
+ for key in keys:
+ args.append(key)
+
+ output = _run(args)
+ result = {}
+ for line in filter(None, output.split('\n')):
+ key, sep, value = line.partition('=')
+ if not sep:
+ raise ValueError('Invalid output detected')
+
+ result[key.strip()] = value.strip()
+
+ if set(keys) != set(result.keys()):
+ raise ValueError('Some keys were missing from the output')
+
+ return result
+
+
+def set_config(config: dict, flag=None):
+ """Set postfix configuration using the postconf command."""
+ if not config:
+ return
+
+ for key, value in config.items():
+ _validate_key(key)
+ _validate_value(value)
+
+ args = ['/sbin/postconf']
+ if flag:
+ args.append(flag)
+
+ for key, value in config.items():
+ args.append('{}={}'.format(key, value))
+
+ _run(args)
+
+
+def set_master_config(service: Service):
+ """Set daemons and their options in postfix master.cf."""
+ service_key = service.service + '/' + service.type_
+ set_config({service_key: str(service)}, '-M')
+
+
+def parse_maps(raw_value):
+ """Parse postfix configuration values that are maps."""
+ if '{' in raw_value or '}' in raw_value:
+ raise ValueError('Unsupported map list format')
+
+ value_list = []
+ for segment in raw_value.split(','):
+ for sub_segment in segment.strip().split(' '):
+ sub_segment = sub_segment.strip()
+ if sub_segment:
+ value_list.append(sub_segment)
+
+ return value_list
+
+
+def _run(args):
+ """Run process. Capture and return standard output as a string.
+
+ Raise a RuntimeError on non-zero exit codes.
+ """
+ try:
+ result = subprocess.run(args, check=True, capture_output=True)
+ return result.stdout.decode()
+ except subprocess.SubprocessError as subprocess_error:
+ raise RuntimeError('Subprocess failed') from subprocess_error
+ except UnicodeDecodeError as unicode_error:
+ raise RuntimeError('Unicode decoding failed') from unicode_error
+
+
+def _validate_key(key):
+ """Validate postconf key format or raise ValueError."""
+ if not re.match(r'^[a-zA-Z][a-zA-Z0-9_/]*$', key):
+ raise ValueError('Invalid postconf key format')
+
+
+def _validate_value(value):
+ """Validate postconf value format or raise ValueError."""
+ for char in value:
+ if ord(char) < 32:
+ raise ValueError('Value contains control characters')
diff --git a/plinth/modules/email/privileged/__init__.py b/plinth/modules/email/privileged/__init__.py
new file mode 100644
index 000000000..8591aa98c
--- /dev/null
+++ b/plinth/modules/email/privileged/__init__.py
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Provides privileged actions that run as root.
+"""
+
+from . import aliases, dkim, domain, home, postfix, spam, tls
+
+__all__ = ['aliases', 'domain', 'dkim', 'home', 'postfix', 'spam', 'tls']
diff --git a/plinth/modules/email_server/audit/aliases.py b/plinth/modules/email/privileged/aliases.py
similarity index 86%
rename from plinth/modules/email_server/audit/aliases.py
rename to plinth/modules/email/privileged/aliases.py
index 6edba5865..78e4ea62b 100644
--- a/plinth/modules/email_server/audit/aliases.py
+++ b/plinth/modules/email/privileged/aliases.py
@@ -1,5 +1,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
-"""Privileged operations for managing aliases."""
+"""
+Privileged operations for managing aliases.
+"""
import pathlib
import shutil
diff --git a/plinth/modules/email/privileged/dkim.py b/plinth/modules/email/privileged/dkim.py
new file mode 100644
index 000000000..95a413e8e
--- /dev/null
+++ b/plinth/modules/email/privileged/dkim.py
@@ -0,0 +1,64 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Generate DKIM keys for signing outgoing messages.
+
+See: https://rspamd.com/doc/modules/dkim_signing.html
+"""
+
+import pathlib
+import re
+import shutil
+import subprocess
+
+from plinth import actions
+
+_keys_dir = pathlib.Path('/var/lib/rspamd/dkim/')
+
+DOMAIN_PART_REGEX = r'^[a-zA-Z0-9]([-a-zA-Z0-9]{,61}[a-zA-Z0-9])?$'
+
+
+def _validate_domain_name(domain):
+ for part in domain.split('.'):
+ if not re.match(DOMAIN_PART_REGEX, part):
+ raise ValueError('Invalid domain name')
+
+
+def get_public_key(domain):
+ """Return the DKIM public key for the given domain."""
+ output = actions.superuser_run('email',
+ ['dkim', 'get_dkim_public_key', domain])
+ return output.strip()
+
+
+def action_get_dkim_public_key(domain):
+ """Privileged action to get the public key from DKIM key."""
+ _validate_domain_name(domain)
+ key_file = _keys_dir / f'{domain}.dkim.key'
+ output = subprocess.check_output(
+ ['openssl', 'rsa', '-in',
+ str(key_file), '-pubout'], stderr=subprocess.DEVNULL)
+ print(''.join(output.decode().splitlines()[1:-1]))
+
+
+def action_setup_dkim(domain):
+ """Create DKIM key for a given domain."""
+ _validate_domain_name(domain)
+
+ _keys_dir.mkdir(exist_ok=True)
+ _keys_dir.chmod(0o500)
+ shutil.chown(_keys_dir, '_rspamd', '_rspamd')
+
+ # Default path is /var/lib/dkim/$domain.$selector.key. Default selector is
+ # "dkim". Use these to simplify key management until we have a need to
+ # implement creating new or multiple keys.
+ key_file = _keys_dir / f'{domain}.dkim.key'
+ if key_file.exists():
+ return
+
+ # Ed25519 is widely *not* accepted as of 2022-01. See:
+ # https://serverfault.com/questions/1023674
+ subprocess.run([
+ 'rspamadm', 'dkim_keygen', '-t', 'rsa', '-b', '2048', '-s', 'dkim',
+ '-d', domain, '-k', (str(key_file))
+ ], check=True)
+ key_file.chmod(0o400)
diff --git a/plinth/modules/email_server/audit/domain.py b/plinth/modules/email/privileged/domain.py
similarity index 63%
rename from plinth/modules/email_server/audit/domain.py
rename to plinth/modules/email/privileged/domain.py
index 5e8d341f7..c7e03bfa3 100644
--- a/plinth/modules/email_server/audit/domain.py
+++ b/plinth/modules/email/privileged/domain.py
@@ -1,13 +1,19 @@
-"""Configure email domains"""
# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Configure domains accepted by postfix.
+
+See: http://www.postfix.org/postconf.5.html#mydestination
+See: http://www.postfix.org/postconf.5.html#mydomain
+See: http://www.postfix.org/postconf.5.html#myhostname
+"""
import pathlib
import re
-import subprocess
from plinth.actions import superuser_run
+from plinth.app import App
from plinth.modules import config
-from plinth.modules.email_server import postconf
+from plinth.modules.email import postfix
from plinth.modules.names.components import DomainName
from . import tls
@@ -15,28 +21,35 @@ from . import tls
def get_domains():
"""Return the current domain configuration."""
- conf = postconf.get_many(['mydomain', 'mydestination'])
- domains = set(postconf.parse_maps(conf['mydestination']))
+ conf = postfix.get_config(['mydomain', 'mydestination'])
+ domains = set(postfix.parse_maps(conf['mydestination']))
defaults = {'$myhostname', 'localhost.$mydomain', 'localhost'}
domains.difference_update(defaults)
return {'primary_domain': conf['mydomain'], 'all_domains': domains}
def set_domains(primary_domain=None):
- """Set the primary domain and all the domains for postfix. """
+ """Set the primary domain and all the domains for postfix."""
all_domains = DomainName.list_names()
if not primary_domain:
primary_domain = get_domains()['primary_domain']
if primary_domain not in all_domains:
primary_domain = config.get_domainname() or list(all_domains)[0]
+ # Update configuration and don't restart daemons
superuser_run(
- 'email_server',
+ 'email',
['domain', 'set_domains', primary_domain, ','.join(all_domains)])
+ superuser_run('email', ['dkim', 'setup_dkim', primary_domain])
+
+ # Copy certificates (self-signed if needed) and restart daemons
+ app = App.get('email')
+ app.get_component('letsencrypt-email-postfix').setup_certificates()
+ app.get_component('letsencrypt-email-dovecot').setup_certificates()
def action_set_domains(primary_domain, all_domains):
- """Set the primary domain and all the domains for postfix. """
+ """Set the primary domain and all the domains for postfix."""
all_domains = [_clean_domain(domain) for domain in all_domains.split(',')]
primary_domain = _clean_domain(primary_domain)
@@ -47,14 +60,10 @@ def action_set_domains(primary_domain, all_domains):
'mydomain': primary_domain,
'mydestination': my_destination
}
- postconf.set_many(conf)
+ postfix.set_config(conf)
pathlib.Path('/etc/mailname').write_text(primary_domain + '\n')
tls.set_postfix_config(primary_domain, all_domains)
tls.set_dovecot_config(primary_domain, all_domains)
- subprocess.run(['systemctl', 'try-reload-or-restart', 'postfix'],
- check=True)
- subprocess.run(['systemctl', 'try-reload-or-restart', 'dovecot'],
- check=True)
def _clean_domain(domain):
diff --git a/plinth/modules/email_server/audit/home.py b/plinth/modules/email/privileged/home.py
similarity index 67%
rename from plinth/modules/email_server/audit/home.py
rename to plinth/modules/email/privileged/home.py
index dae22f6fc..37d9ff2b4 100644
--- a/plinth/modules/email_server/audit/home.py
+++ b/plinth/modules/email/privileged/home.py
@@ -1,12 +1,17 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
-"""Privileged actions to setup users' dovecot mail home directory."""
+"""
+Privileged actions to setup users' dovecot mail home directory.
+
+See:
+https://doc.dovecot.org/configuration_manual/authentication/user_databases_userdb/
+"""
import subprocess
from plinth import actions
-def repair():
+def setup():
"""Set correct permissions on /var/mail/ directory.
For each user, /var/mail/ is the 'dovecot mail home' for that user.
@@ -14,9 +19,9 @@ def repair():
directory. Ensure that 'others' can access /var/mail/.
"""
- actions.superuser_run('email_server', ['home', 'set_up'])
+ actions.superuser_run('email', ['home', 'setup'])
-def action_set_up():
+def action_setup():
"""Run chmod on /var/mail to remove all permissions for 'others'."""
subprocess.run(['chmod', 'o-rwx', '/var/mail'], check=True)
diff --git a/plinth/modules/email/privileged/postfix.py b/plinth/modules/email/privileged/postfix.py
new file mode 100644
index 000000000..9b42d6a50
--- /dev/null
+++ b/plinth/modules/email/privileged/postfix.py
@@ -0,0 +1,88 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Configure postfix to use auth and local delivery with dovecot. Start smtps and
+submission services. Setup aliases database.
+
+See:
+https://doc.dovecot.org/configuration_manual/howto/postfix_and_dovecot_sasl/
+See: https://doc.dovecot.org/configuration_manual/howto/postfix_dovecot_lmtp/
+See: http://www.postfix.org/TLS_README.html
+"""
+
+from plinth import actions
+
+from .. import aliases
+from .. import postfix as postconf
+
+default_config = {
+ 'smtpd_sasl_auth_enable':
+ 'yes',
+ 'smtpd_sasl_type':
+ 'dovecot',
+ 'smtpd_sasl_path':
+ 'private/auth',
+ 'mailbox_transport':
+ 'lmtp:unix:private/dovecot-lmtp',
+ 'virtual_transport':
+ 'lmtp:unix:private/dovecot-lmtp',
+ 'smtpd_relay_restrictions':
+ ','.join([
+ 'permit_sasl_authenticated',
+ 'defer_unauth_destination',
+ ])
+}
+
+submission_options = {
+ 'syslog_name': 'postfix/submission',
+ 'smtpd_tls_security_level': 'encrypt',
+ 'smtpd_client_restrictions': 'permit_sasl_authenticated,reject',
+ 'smtpd_relay_restrictions': 'permit_sasl_authenticated,reject'
+}
+submission_service = postconf.Service(service='submission', type_='inet',
+ private='n', unpriv='-', chroot='y',
+ wakeup='-', maxproc='-', command='smtpd',
+ options=submission_options)
+
+smtps_options = {
+ 'syslog_name': 'postfix/smtps',
+ 'smtpd_tls_wrappermode': 'yes',
+ 'smtpd_sasl_auth_enable': 'yes',
+ 'smtpd_relay_restrictions': 'permit_sasl_authenticated,reject'
+}
+smtps_service = postconf.Service(service='smtps', type_='inet', private='n',
+ unpriv='-', chroot='y', wakeup='-',
+ maxproc='-', command='smtpd',
+ options=smtps_options)
+
+SQLITE_ALIASES = 'sqlite:/etc/postfix/freedombox-aliases.cf'
+
+
+def setup():
+ """Set SASL, mail submission, and user lookup settings."""
+ aliases.first_setup()
+ actions.superuser_run('email', ['postfix', 'setup'])
+
+
+def action_setup():
+ postconf.set_config(default_config)
+ _setup_submission()
+ _setup_alias_maps()
+
+
+def _setup_submission():
+ """Update configuration for smtps and smtp-submission."""
+ postconf.set_master_config(submission_service)
+ postconf.set_master_config(smtps_service)
+
+
+def _setup_alias_maps():
+ """Setup alias maps to include an sqlite DB."""
+ alias_maps = postconf.get_config(['alias_maps'])['alias_maps']
+ alias_maps = alias_maps.replace(',', ' ').split(' ')
+ if SQLITE_ALIASES not in alias_maps:
+ # Prioritize FreedomBox's sqlite based aliases file over /etc/aliases.
+ # Otherwise, the common aliases will be pointing to 'root' instead of
+ # first admin user (which is more practical in FreedomBox).
+ alias_maps = [SQLITE_ALIASES] + alias_maps
+
+ postconf.set_config({'alias_maps': ' '.join(alias_maps)})
diff --git a/plinth/modules/email/privileged/spam.py b/plinth/modules/email/privileged/spam.py
new file mode 100644
index 000000000..a2f8bbc8d
--- /dev/null
+++ b/plinth/modules/email/privileged/spam.py
@@ -0,0 +1,63 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Configures rspamd to handle incoming and outgoing spam.
+
+See: http://www.postfix.org/MILTER_README.html
+See: https://rspamd.com/doc/configuration/ucl.html
+"""
+
+import pathlib
+import re
+import subprocess
+
+from plinth import actions
+from plinth.modules.email import postfix
+
+_milter_config = {
+ 'smtpd_milters': 'inet:127.0.0.1:11332',
+ 'non_smtpd_milters': 'inet:127.0.0.1:11332',
+}
+
+
+def setup():
+ """Trigger a privileged setup action."""
+ actions.superuser_run('email', ['spam', 'setup'])
+
+
+def action_setup():
+ """Compile sieve filters and set rspamd/postfix configuration."""
+ _compile_sieve()
+ _setup_rspamd()
+ postfix.set_config(_milter_config)
+
+
+def _compile_sieve():
+ """Compile all .sieve script to binary format for performance."""
+ sieve_dir = '/etc/dovecot/freedombox-sieve-after/'
+ subprocess.run(['sievec', sieve_dir], check=True)
+
+
+def _setup_rspamd():
+ """Adjust configuration to include FreedomBox configuration files."""
+ configs = [('milter_headers.conf', 'freedombox-milter-headers.conf'),
+ ('redis.conf', 'freedombox-redis.conf'),
+ ('logging.inc', 'freedombox-logging.inc')]
+ base_path = pathlib.Path('/etc/rspamd/local.d')
+ for orig_path, include_path in configs:
+ _setup_local_include(base_path / orig_path, base_path / include_path)
+
+
+def _setup_local_include(orig_path, include_path):
+ """Adjust configuration to include a FreedomBox configuration file."""
+ lines = []
+ if orig_path.exists():
+ lines = orig_path.read_text().splitlines()
+
+ file_name = include_path.name
+ for line in lines:
+ if re.match(rf'\s*.include\(.*\)\s+".*/{file_name}"', line):
+ return
+
+ lines.append('.include(priority=2,duplicate=merge) '
+ f'"$LOCAL_CONFDIR/local.d/{file_name}"\n')
+ orig_path.write_text('\n'.join(lines))
diff --git a/plinth/modules/email_server/audit/tls.py b/plinth/modules/email/privileged/tls.py
similarity index 77%
rename from plinth/modules/email_server/audit/tls.py
rename to plinth/modules/email/privileged/tls.py
index 93e891d03..6aeac6c07 100644
--- a/plinth/modules/email_server/audit/tls.py
+++ b/plinth/modules/email/privileged/tls.py
@@ -1,7 +1,15 @@
-"""TLS configuration for postfix and dovecot."""
# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+TLS certificate configuration for postfix and dovecot.
-from plinth.modules.email_server import interproc, postconf
+See: https://ssl-config.mozilla.org/
+See: http://www.postfix.org/TLS_README.html
+See: https://doc.dovecot.org/configuration_manual/dovecot_ssl_configuration/
+"""
+
+import pathlib
+
+from .. import postfix
# Mozilla Guideline v5.6, Postfix 1.17.7, OpenSSL 1.1.1d, intermediate
# Generated 2021-08
@@ -41,21 +49,21 @@ _postfix_config = {
def set_postfix_config(primary_domain, all_domains):
"""Set postfix configuration for TLS certificates."""
- tls_sni_map = '/etc/postfix/freedombox-tls-sni.map'
+ items = []
+ for domain in all_domains:
+ items.append(f'{domain}=/etc/postfix/letsencrypt/{domain}/chain.pem')
+
+ domain_map = ','.join(items)
config = dict(_postfix_config)
config.update({
'tls_server_sni_maps':
- tls_sni_map,
+ f'inline:{{{domain_map}}}',
'smtpd_tls_chain_files':
- f'/etc/postfix/letsencrypt/{primary_domain}/chain.pem'
+ f'/etc/postfix/letsencrypt/{primary_domain}/chain.pem',
+ 'smtpd_tls_cert_file':
+ ''
})
- postconf.set_many_unsafe(config)
- content = '# This file is managed by FreedomBox\n'
- for domain in all_domains:
- content += f'{domain} /etc/postfix/letsencrypt/{domain}/chain.pem\n'
-
- with interproc.atomically_rewrite(tls_sni_map) as file_handle:
- file_handle.write(content)
+ postfix.set_config(config)
def set_dovecot_config(primary_domain, all_domains):
@@ -71,6 +79,5 @@ local_name {domain} {{
ssl_key =
-
-
diff --git a/plinth/modules/email/templates/email-autoconfig.xml b/plinth/modules/email/templates/email-autoconfig.xml
new file mode 100644
index 000000000..a04da80eb
--- /dev/null
+++ b/plinth/modules/email/templates/email-autoconfig.xml
@@ -0,0 +1,45 @@
+
+{% comment %}
+# SPDX-License-Identifier: AGPL-3.0-or-later
+{% endcomment %}
+
+{% load i18n %}
+
+
+
+ {{ host }}
+ {% trans "FreedomBox Email" %}
+ {{ box_name }}
+
+ {{ host }}
+ 993
+ SSL
+ %EMAILLOCALPART%
+ password-cleartext
+
+
+ {{ host }}
+ 995
+ SSL
+ %EMAILLOCALPART%
+ password-cleartext
+
+
+ {{ host }}
+ 465
+ SSL
+ %EMAILLOCALPART%
+ password-cleartext
+
+
+ {{ host }}
+ 587
+ SSL
+ %EMAILLOCALPART%
+ password-cleartext
+
+
+ FreedomBox Manual
+
+
+
diff --git a/plinth/modules/email/templates/email.html b/plinth/modules/email/templates/email.html
new file mode 100644
index 000000000..9af501d41
--- /dev/null
+++ b/plinth/modules/email/templates/email.html
@@ -0,0 +1,61 @@
+{% extends "app.html" %}
+{% comment %}
+# SPDX-License-Identifier: AGPL-3.0-or-later
+{% endcomment %}
+
+{% load i18n %}
+
+{% block subsubmenu %}
+
+ {% trans "Manage Spam" %}
+
+
+
+ {% trans "Manage Aliases" %}
+
+{% endblock %}
+
+{% block extra_content %}
+ {{ block.super }}
+
+ {% trans "DNS Records" %}
+
+
+ {% blocktrans trimmed %}
+ The following DNS records must be added manually on your primary domain
+ for the mail server to work properly.
+ {% endblocktrans %}
+
+
+
+
+
+
+ {% trans "Domain" %}
+ {% trans "TTL" %}
+ {% trans "Class" %}
+ {% trans "Type" %}
+ {% trans "Priority" %}
+ {% trans "Weight" %}
+ {% trans "Port" %}
+ {% trans "Host/Target/Value" %}
+
+
+
+ {% for dns_entry in dns_entries %}
+
+ {{ dns_entry.domain|default_if_none:"" }}
+ {{ dns_entry.ttl }}
+ {{ dns_entry.class_ }}
+ {{ dns_entry.type_ }}
+ {{ dns_entry.priority }}
+ {{ dns_entry.weight|default_if_none:"" }}
+ {{ dns_entry.port|default_if_none:"" }}
+ {{ dns_entry.get_split_value }}
+
+ {% endfor %}
+
+
+
+{% endblock %}
diff --git a/plinth/modules/email_server/tests/__init__.py b/plinth/modules/email/tests/__init__.py
similarity index 100%
rename from plinth/modules/email_server/tests/__init__.py
rename to plinth/modules/email/tests/__init__.py
diff --git a/plinth/modules/email/tests/test_functional.py b/plinth/modules/email/tests/test_functional.py
new file mode 100644
index 000000000..c334b9ed4
--- /dev/null
+++ b/plinth/modules/email/tests/test_functional.py
@@ -0,0 +1,27 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+Functional, browser based tests for email app.
+"""
+
+import pytest
+
+from plinth.tests import functional
+
+pytestmark = [pytest.mark.apps, pytest.mark.email]
+
+
+class TestEmailApp(functional.BaseAppTests):
+ app_name = 'email'
+ has_service = True
+ has_web = False
+ check_diagnostics = True
+
+ @pytest.fixture(autouse=True)
+ def fixture_background(self, session_browser):
+ functional.login(session_browser)
+ functional.set_advanced_mode(session_browser, True)
+ functional.install(session_browser, self.app_name)
+ functional.app_enable(session_browser, self.app_name)
+ yield
+ functional.login(session_browser)
+ functional.app_disable(session_browser, self.app_name)
diff --git a/plinth/modules/email/urls.py b/plinth/modules/email/urls.py
new file mode 100644
index 000000000..e1e919b98
--- /dev/null
+++ b/plinth/modules/email/urls.py
@@ -0,0 +1,18 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""
+URLs for the email module.
+"""
+
+from django.urls import path
+from stronghold.decorators import public
+
+from plinth.utils import non_admin_view
+
+from . import views
+
+urlpatterns = [
+ path('apps/email/', views.EmailAppView.as_view(), name='index'),
+ path('apps/email/aliases/', non_admin_view(views.AliasView.as_view()),
+ name='aliases'),
+ path('apps/email/config.xml', public(views.XmlView.as_view())),
+]
diff --git a/plinth/modules/email_server/views.py b/plinth/modules/email/views.py
similarity index 81%
rename from plinth/modules/email_server/views.py
rename to plinth/modules/email/views.py
index 6a34d89a5..70d8b4dd2 100644
--- a/plinth/modules/email_server/views.py
+++ b/plinth/modules/email/views.py
@@ -9,22 +9,29 @@ from django.utils.translation import gettext_lazy as _
from django.views.generic.base import TemplateView
from django.views.generic.edit import FormView
+from plinth.modules.email import dns
from plinth.views import AppView
from . import aliases as aliases_module
-from . import audit, forms
+from . import forms, privileged
-class EmailServerView(AppView):
- """Server configuration page"""
- app_id = 'email_server'
+class EmailAppView(AppView):
+ """Server configuration page."""
+ app_id = 'email'
form_class = forms.DomainForm
- template_name = 'email_server.html'
+ template_name = 'email.html'
+
+ def get_context_data(self, **kwargs):
+ """Add additional context data for rendering the template."""
+ context = super().get_context_data(**kwargs)
+ context['dns_entries'] = dns.get_entries()
+ return context
def get_initial(self):
"""Return the initial values to populate in the form."""
initial = super().get_initial()
- domains = audit.domain.get_domains()
+ domains = privileged.domain.get_domains()
initial['primary_domain'] = domains['primary_domain']
return initial
@@ -34,7 +41,7 @@ class EmailServerView(AppView):
new_data = form.cleaned_data
if old_data['primary_domain'] != new_data['primary_domain']:
try:
- audit.domain.set_domains(new_data['primary_domain'])
+ privileged.domain.set_domains(new_data['primary_domain'])
messages.success(self.request, _('Configuration updated'))
except Exception:
messages.error(self.request,
@@ -52,9 +59,9 @@ class AliasView(FormView):
posted is detected using hidden form values and the appropriate form is
initialized for the FormView base class to work with.
"""
- template_name = 'email_alias.html'
+ template_name = 'email-aliases.html'
form_classes = (forms.AliasCreateForm, forms.AliasListForm)
- success_url = reverse_lazy('email_server:aliases')
+ success_url = reverse_lazy('email:aliases')
def __init__(self, *args, **kwargs):
"""Initialize the view."""
@@ -109,14 +116,8 @@ class AliasView(FormView):
def _list_form_valid(self, form):
"""Handle a valid alias list form operation."""
aliases = form.cleaned_data['aliases']
- action = form.cleaned_data['action']
username = self.request.user.username
- if action == 'delete':
- aliases_module.delete(username, aliases)
- elif action == 'disable':
- aliases_module.disable(username, aliases)
- elif action == 'enable':
- aliases_module.enable(username, aliases)
+ aliases_module.delete(username, aliases)
def _create_form_valid(self, form):
"""Handle a valid create alias form operation."""
@@ -125,13 +126,15 @@ class AliasView(FormView):
class XmlView(TemplateView):
- template_name = 'email_autoconfig.xml'
+ """Serve Thunderbird auto-configuration file.
+
+ https://wiki.mozilla.org/Thunderbird:Autoconfiguration:ConfigFileFormat
+ """
+ template_name = 'email-autoconfig.xml'
def render_to_response(self, *args, **kwargs):
kwargs['content_type'] = 'text/xml; charset=utf-8'
- response = super().render_to_response(*args, **kwargs)
- response['X-Robots-Tag'] = 'noindex, nofollow, noarchive'
- return response
+ return super().render_to_response(*args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
diff --git a/plinth/modules/email_server/__init__.py b/plinth/modules/email_server/__init__.py
deleted file mode 100644
index 7b4065c41..000000000
--- a/plinth/modules/email_server/__init__.py
+++ /dev/null
@@ -1,205 +0,0 @@
-"""FreedomBox email server app"""
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-import logging
-
-from django.utils.translation import gettext_lazy as _
-
-import plinth.app
-import plinth.daemon
-import plinth.frontpage
-import plinth.menu
-from plinth import actions
-from plinth.modules.apache.components import Webserver
-from plinth.modules.config import get_domainname
-from plinth.modules.firewall.components import Firewall
-from plinth.modules.letsencrypt.components import LetsEncrypt
-from plinth.package import Packages, remove
-from plinth.signals import domain_added, domain_removed
-
-from . import audit, manifest
-
-clamav_packages = ['clamav', 'clamav-daemon']
-clamav_daemons = ['clamav-daemon', 'clamav-freshclam']
-
-port_info = {
- 'postfix': ('smtp', 25, 'smtps', 465, 'smtp-submission', 587),
- 'dovecot': ('imaps', 993, 'pop3s', 995),
-}
-
-_description = [
- _('Roundcube app provides web '
- 'interface for users to access email.'),
- _('During installation, any other email servers in the system will be '
- 'uninstalled.')
-]
-
-app = None
-logger = logging.getLogger(__name__)
-
-
-class EmailServerApp(plinth.app.App):
- """FreedomBox email server app"""
- app_id = 'email_server'
- app_name = _('Email Server')
-
- _version = 1
-
- def __init__(self):
- """The app's constructor"""
- super().__init__()
- self._add_ui_components()
-
- # Other likely install conflicts have been discarded:
- # - msmtp, nullmailer, sendmail don't cause install faults.
- # - qmail and smail are missing in Bullseye (Not tested,
- # but less likely due to that).
- packages = Packages(
- 'packages-email-server', [
- 'postfix', 'postfix-ldap', 'postfix-sqlite', 'dovecot-pop3d',
- 'dovecot-imapd', 'dovecot-ldap', 'dovecot-lmtpd',
- 'dovecot-managesieved'
- ], conflicts=['exim4-base', 'exim4-config', 'exim4-daemon-light'],
- conflicts_action=Packages.ConflictsAction.IGNORE)
- self.add(packages)
-
- packages = Packages('packages-email-server-skip-rec', ['rspamd'],
- skip_recommends=True)
- self.add(packages)
-
- self._add_daemons()
- self._add_firewall_ports()
-
- # /rspamd location
- webserver = Webserver(
- 'webserver-email', # unique id
- 'email-server-freedombox', # config file name
- urls=['https://{host}/rspamd'])
- self.add(webserver)
-
- # Let's Encrypt event hook
- letsencrypt = LetsEncrypt(
- 'letsencrypt-email-server-postfix', domains='*',
- daemons=['postfix'], should_copy_certificates=True,
- private_key_path='/etc/postfix/letsencrypt/{domain}/chain.pem',
- certificate_path='/etc/postfix/letsencrypt/{domain}/chain.pem',
- user_owner='root', group_owner='root', managing_app='email_server')
- self.add(letsencrypt)
-
- letsencrypt = LetsEncrypt(
- 'letsencrypt-email-server-dovecot', domains='*',
- daemons=['dovecot'], should_copy_certificates=True,
- private_key_path='/etc/dovecot/letsencrypt/{domain}/privkey.pem',
- certificate_path='/etc/dovecot/letsencrypt/{domain}/cert.pem',
- user_owner='root', group_owner='root', managing_app='email_server')
- self.add(letsencrypt)
-
- def _add_ui_components(self):
- info = plinth.app.Info(
- app_id=self.app_id, version=self._version, name=self.app_name,
- short_description=_('Powered by Postfix, Dovecot & Rspamd'),
- description=_description, manual_page='EmailServer',
- clients=manifest.clients,
- donation_url='https://freedomboxfoundation.org/donate/')
- self.add(info)
-
- menu_item = plinth.menu.Menu(
- 'menu_' + self.app_id, # unique id
- info.name, # app display name
- info.short_description, # app description
- 'roundcube', # icon name in `static/theme/icons/`
- 'email_server:index', # view name
- parent_url_name='apps')
- self.add(menu_item)
-
- def _add_daemons(self):
- for srvname in ['postfix', 'dovecot', 'rspamd']:
- # Construct `listen_ports` parameter for the daemon
- mixed = port_info.get(srvname, ())
- port_numbers = [v for v in mixed if isinstance(v, int)]
- listen = []
- for n in port_numbers:
- listen.append((n, 'tcp4'))
- listen.append((n, 'tcp6'))
- # Add daemon
- daemon = plinth.daemon.Daemon('daemon-' + srvname, srvname,
- listen_ports=listen)
- self.add(daemon)
-
- def _add_firewall_ports(self):
- all_port_names = []
- for mixed in port_info.values():
- port_names = [v for v in mixed if isinstance(v, str)]
- all_port_names.extend(port_names)
-
- firewall = Firewall('firewall-email', self.app_name,
- ports=all_port_names, is_external=True)
- self.add(firewall)
-
- @staticmethod
- def post_init():
- """Perform post initialization operations."""
- domain_added.connect(on_domain_added)
- domain_removed.connect(on_domain_removed)
-
- def diagnose(self):
- """Run diagnostics and return the results"""
- results = super().diagnose()
- results.extend([r.summarize() for r in audit.ldap.get()])
- results.extend([r.summarize() for r in audit.spam.get()])
- return results
-
-
-def get_domains():
- """Return the list of domains configured."""
- default_domain = get_domainname()
- return [default_domain] if default_domain else []
-
-
-def setup(helper, old_version=None):
- """Installs and configures module"""
-
- def _clear_conflicts():
- component = app.get_component('packages-email-server')
- packages_to_remove = component.find_conflicts()
- if packages_to_remove:
- logger.info('Removing conflicting packages: %s',
- packages_to_remove)
- remove(packages_to_remove)
-
- # Install
- helper.call('pre', _clear_conflicts)
- app.setup(old_version)
-
- # Setup
- helper.call('post', audit.home.repair)
- app.get_component('letsencrypt-email-server-postfix').setup_certificates()
- app.get_component('letsencrypt-email-server-dovecot').setup_certificates()
- helper.call('post', audit.domain.set_domains)
- helper.call('post', audit.ldap.repair)
- helper.call('post', audit.spam.repair)
-
- # Reload
- actions.superuser_run('service', ['reload', 'postfix'])
- actions.superuser_run('service', ['reload', 'dovecot'])
- actions.superuser_run('service', ['reload', 'rspamd'])
-
- # Expose to public internet
- helper.call('post', app.enable)
-
-
-def on_domain_added(sender, domain_type, name, description='', services=None,
- **kwargs):
- """Handle addition of a new domain."""
- if app.needs_setup():
- return
-
- audit.domain.set_domains()
-
-
-def on_domain_removed(sender, domain_type, name='', **kwargs):
- """Handle removal of a domain."""
- if app.needs_setup():
- return
-
- audit.domain.set_domains()
diff --git a/plinth/modules/email_server/audit/__init__.py b/plinth/modules/email_server/audit/__init__.py
deleted file mode 100644
index 1dc17ee18..000000000
--- a/plinth/modules/email_server/audit/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: AGPL-3.0-or-later
-"""
-Provides diagnosis and repair of email server configuration issues
-"""
-
-from . import aliases, domain, home, ldap, models, spam, tls
-
-__all__ = ['aliases', 'domain', 'home', 'ldap', 'models', 'spam', 'tls']
diff --git a/plinth/modules/email_server/audit/ldap.py b/plinth/modules/email_server/audit/ldap.py
deleted file mode 100644
index 6a727e490..000000000
--- a/plinth/modules/email_server/audit/ldap.py
+++ /dev/null
@@ -1,145 +0,0 @@
-"""Provides the diagnosis of SASL, mail submission, and user database lookup
-configurations"""
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-import logging
-
-from django.utils.translation import gettext_lazy as _
-
-import plinth.modules.email_server.aliases as aliases
-import plinth.modules.email_server.postconf as postconf
-from plinth import actions
-
-from . import models
-
-default_config = {
- 'smtpd_sasl_auth_enable':
- 'yes',
- 'smtpd_sasl_type':
- 'dovecot',
- 'smtpd_sasl_path':
- 'private/auth',
- 'mailbox_transport':
- 'lmtp:unix:private/dovecot-lmtp',
- 'virtual_transport':
- 'lmtp:unix:private/dovecot-lmtp',
- 'smtpd_relay_restrictions':
- ','.join([
- 'permit_sasl_authenticated',
- 'defer_unauth_destination',
- ])
-}
-
-submission_flags = postconf.ServiceFlags(service='submission', type='inet',
- private='n', unpriv='-', chroot='y',
- wakeup='-', maxproc='-',
- command_args='smtpd')
-
-default_submission_options = {
- 'syslog_name': 'postfix/submission',
- 'smtpd_tls_security_level': 'encrypt',
- 'smtpd_client_restrictions': 'permit_sasl_authenticated,reject',
- 'smtpd_relay_restrictions': 'permit_sasl_authenticated,reject'
-}
-
-smtps_flags = postconf.ServiceFlags(service='smtps', type='inet', private='n',
- unpriv='-', chroot='y', wakeup='-',
- maxproc='-', command_args='smtpd')
-
-default_smtps_options = {
- 'syslog_name': 'postfix/smtps',
- 'smtpd_tls_wrappermode': 'yes',
- 'smtpd_sasl_auth_enable': 'yes',
- 'smtpd_relay_restrictions': 'permit_sasl_authenticated,reject'
-}
-
-SQLITE_ALIASES = 'sqlite:/etc/postfix/freedombox-aliases.cf'
-
-logger = logging.getLogger(__name__)
-
-
-def get():
- """Compare current values with the default. Generate an audit report
-
- Recommended endpoint name:
- GET /audit/ldap
- """
- translation_table = [
- (check_sasl, _('Postfix-Dovecot SASL integration')),
- (check_alias_maps, _('Postfix alias maps')),
- ]
- results = []
- with postconf.mutex.lock_all():
- for check, title in translation_table:
- results.append(check(title))
- return results
-
-
-def repair():
- """Tries to repair SASL, mail submission, and user lookup settings
-
- Recommended endpoint name:
- POST /audit/ldap/repair
- """
- aliases.first_setup()
- actions.superuser_run('email_server', ['ldap', 'set_up'])
-
-
-def action_set_up():
- action_set_sasl()
- action_set_submission()
- action_set_ulookup()
-
-
-def check_sasl(title=''):
- diagnosis = models.MainCfDiagnosis(title)
- diagnosis.compare(default_config, postconf.get_many_unsafe)
- return diagnosis
-
-
-def fix_sasl(diagnosis):
- diagnosis.apply_changes(postconf.set_many_unsafe)
-
-
-def action_set_sasl():
- """Handles email_server -i ldap set_sasl"""
- with postconf.mutex.lock_all():
- fix_sasl(check_sasl())
-
-
-def action_set_submission():
- """Handles email_server -i ldap set_submission"""
- postconf.set_master_cf_options(service_flags=submission_flags,
- options=default_submission_options)
- postconf.set_master_cf_options(service_flags=smtps_flags,
- options=default_smtps_options)
-
-
-def check_alias_maps(title=''):
- """Check the ability to mail to usernames and user aliases"""
- diagnosis = models.MainCfDiagnosis(title)
-
- alias_maps = postconf.get_unsafe('alias_maps').replace(',', ' ').split(' ')
- if SQLITE_ALIASES not in alias_maps:
- diagnosis.flag_once('alias_maps', user=alias_maps)
- diagnosis.critical('Required maps not in list')
-
- return diagnosis
-
-
-def fix_alias_maps(diagnosis):
-
- def fix_value(alias_maps):
- if SQLITE_ALIASES not in alias_maps:
- alias_maps.append(SQLITE_ALIASES)
-
- return ' '.join(alias_maps)
-
- diagnosis.repair('alias_maps', fix_value)
- diagnosis.apply_changes(postconf.set_many_unsafe)
-
-
-def action_set_ulookup():
- """Handles email_server -i ldap set_ulookup"""
- with postconf.mutex.lock_all():
- fix_alias_maps(check_alias_maps())
diff --git a/plinth/modules/email_server/audit/models.py b/plinth/modules/email_server/audit/models.py
deleted file mode 100644
index 60083f6e9..000000000
--- a/plinth/modules/email_server/audit/models.py
+++ /dev/null
@@ -1,207 +0,0 @@
-# SPDX-License-Identifier: AGPL-3.0-or-later
-"""Models of the audit module"""
-
-import logging
-
-logger = logging.getLogger(__name__)
-
-
-class UnresolvedIssueError(AssertionError):
- pass
-
-
-class Diagnosis:
- """Records a diagnosis: what went wrong and how to fix them"""
-
- def __init__(self, title='', action=''):
- """Class constructor"""
- self.title = title
- self.action = action
- self.critical_errors = []
- self.errors = []
-
- def to_json(self):
- """Serialize object to JSON"""
- return {
- 'class': self.__class__.__name__,
- 'title': self.title,
- 'action': self.action,
- 'errors': self.errors,
- 'critical_errors': self.critical_errors
- }
-
- @classmethod
- def from_json(cls, valid_dict, translate=None):
- """Construct a Diagnosis instance from a valid JSON dictionary.
-
- :type valid_dict: dict
- :param valid_dict: a valid dictionary representation
- :type translate: str -> Union[str, None]
- :param translate: optional; if specified, should be a function that
- accepts the title and returns a new title or None.
- """
- title = valid_dict['title']
- if translate:
- title = translate(title) or title
- result = cls(title, action=valid_dict['action'])
- result.errors.extend(valid_dict['errors'])
- result.critical_errors.extend(valid_dict['critical_errors'])
- return result
-
- def critical(self, message_fmt, *args):
- """Append a message to the critical errors list"""
- if args:
- self.critical_errors.append(message_fmt % args)
- else:
- self.critical_errors.append(message_fmt)
-
- def error(self, message_fmt, *args):
- """Append a message to the errors list"""
- if args:
- self.errors.append(message_fmt % args)
- else:
- self.errors.append(message_fmt)
-
- def summarize(self, log=True):
- """Return a 2-element list for the diagnose function in AppView"""
- if log:
- self.write_logs()
-
- if self.critical_errors:
- return [self.title, 'error']
- elif self.errors:
- return [self.title, 'failed']
- else:
- return [self.title, 'passed']
-
- @property
- def has_failed(self):
- """True if the diagnosis has failed or contains an error"""
- return (self.critical_errors or self.errors)
-
- def write_logs(self):
- """Log errors and failures"""
- logger.debug('Ran audit: %s', self.title)
- for message in self.critical_errors:
- logger.critical(message)
- for message in self.errors:
- logger.error(message)
-
- def sorting_key(self):
- """The key function for list.sort"""
- return (-len(self.critical_errors), -len(self.errors), self.title)
-
-
-class MainCfDiagnosis(Diagnosis):
- """Diagnosis for a set of main.cf configuration keys"""
-
- def __init__(self, *args, **kwargs):
- """Class constructor. See :class:`.Diagnosis` for method signature"""
- super().__init__(*args, **kwargs)
- self.advice = {}
- self.user = {}
-
- def flag(self, key, corrected_value=None, user=None):
- """Flag a problematic key.
-
- If `corrected_value` is a str, the specified value is assumed to be
- correct.
-
- :type key: str
- :param key: main.cf key
- :type corrected_value: str or None
- :param corrected_value: corrected value
- :type user: Any
- :param user: customized data (see the :meth:`.repair` method)
- :raises ValueError: if the key has been flagged
- """
- if key in self.advice:
- raise ValueError('Key has been flagged')
- else:
- self.advice[key] = corrected_value
- self.user[key] = user
-
- def flag_once(self, key, **kwargs):
- """Flag a problematic key. If the key has been flagged, do nothing.
-
- See :meth:`.flag` for the function signature.
- """
- if key not in self.advice:
- self.flag(key, **kwargs)
-
- def unresolved_issues(self):
- """Return the iterator of all keys that do not have a corrected value.
-
- :return: an iterator of keys
- """
- for key, value in self.advice.items():
- if value is None:
- yield key
-
- def _compare_and_advise(self, current, default):
- if len(current) > len(default):
- raise ValueError('Sanity check failed: dictionary sizes')
- for key, value in default.items():
- if current.get(key, None) != value:
- self.flag(key, corrected_value=value)
- self.critical('%s must equal %s', key, value)
-
- def compare(self, expected, getter):
- """Check the current Postfix configuration. Flag and correct all keys
- that have an unexpected value.
-
- :type expected: dict[str, str]
- :param expected: a dictionary specifying the set of keys to be checked
- and their expected values
- :type getter: Iterator[str] -> dict[str, str]
- :param getter: a function that fetches the current postfix config; it
- takes an iterator of strings and returns a str-to-str dictionary.
- """
- current = getter(expected.keys())
- self._compare_and_advise(current, expected)
-
- def repair(self, key, repair_function):
- """Repair the key if its value has not been corrected by other means.
-
- `repair_function` will not be called if the key has had a corrected
- value or the key does not need attention.
-
- In case `repair_function` is called, we will pass in the `user` data
- associated with `key`.
-
- The job of `repair_function` is to return a corrected value. It should
- not modify any Postfix configuration in any way. It may read
- configuration files, but pending Postconf changes are not visible.
-
- If `repair_function` could not solve the problem, it may return `None`
- as an alternative to raising an exception. Using this feature, you may
- implement fallback strategies.
-
- :type key: str
- :param key: the key to be repaired
- :type repair_function: Any -> Union[str, None]
- :param repair_function: a function that returns the corrected value
- for `key`
- """
- if key in self.advice and self.advice[key] is None:
- self.advice[key] = repair_function(self.user[key])
-
- def apply_changes(self, setter):
- """Apply changes by calling the `setter` with a dictionary of corrected
- keys and values.
-
- :type setter: dict[str, str] -> None
- :param setter: configuration changing function that takes a str-to-str
- dictionary.
- :raises UnresolvedIssueError: if the diagnosis contains an uncorrected
- key
- """
- self.assert_resolved()
- logger.info('Setting postconf: %r', self.advice)
- setter(self.advice)
-
- def assert_resolved(self):
- """Raises an :class:`.UnresolvedIssueError` if the diagnosis report
- contains an unresolved issue (i.e. an uncorrected key)"""
- if None in self.advice.values():
- raise UnresolvedIssueError('Assertion failed')
diff --git a/plinth/modules/email_server/audit/spam.py b/plinth/modules/email_server/audit/spam.py
deleted file mode 100644
index d070a9f8b..000000000
--- a/plinth/modules/email_server/audit/spam.py
+++ /dev/null
@@ -1,146 +0,0 @@
-"""Configures spam filters and the virus scanner"""
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-import glob
-import logging
-import re
-import subprocess
-
-from django.utils.translation import gettext_lazy as _
-
-from plinth import actions
-from plinth.modules.email_server import interproc, lock, postconf
-from plinth.modules.email_server.modconf import ConfigInjector
-
-from . import models
-
-milter_config = {
- 'milter_mail_macros': 'i ' + ' '.join([
- '{auth_type}', '{auth_authen}', '{auth_author}',
- '{client_addr}', '{client_name}',
- '{mail_addr}', '{mail_host}', '{mail_mailer}'
- ]),
- # XXX In postconf this field is a list
- 'smtpd_milters': 'inet:127.0.0.1:11332',
- # XXX In postconf this field is a list
- 'non_smtpd_milters': 'inet:127.0.0.1:11332',
- 'milter_header_checks': 'regexp:fbx-managed/pre-queue-milter-headers',
-
- # Last-resort internal header cleanup at smtp client
- 'smtp_header_checks': 'regexp:/etc/postfix/freedombox-internal-cleanup',
- # Reserved mail transports
- # XXX This field is a list
- 'transport_maps': 'regexp:/etc/postfix/freedombox-transport-to',
- # XXX This field is a list
- 'sender_dependent_default_transport_maps': \
- 'regexp:/etc/postfix/freedombox-transport-from',
-}
-
-# FreedomBox egress filtering
-
-egress_filter = postconf.ServiceFlags(
- service='127.0.0.1:10025', type='inet', private='n', unpriv='-',
- chroot='y', wakeup='-', maxproc='-', command_args='smtpd'
-)
-
-egress_filter_options = {
- 'syslog_name': 'postfix/fbxout',
- 'cleanup_service_name': 'fbxcleanup',
- 'content_filter': '',
- 'receive_override_options': 'no_unknown_recipient_checks',
- 'smtpd_helo_restrictions': '',
- 'smtpd_client_restrictions': '',
- 'smtpd_relay_restrictions': '',
- 'smtpd_recipient_restrictions': 'permit_mynetworks,reject',
- 'mynetworks': '127.0.0.0/8,[::1]/128'
-}
-
-egress_filter_cleanup = postconf.ServiceFlags(
- service='fbxcleanup', type='unix', private='n', unpriv='-',
- chroot='y', wakeup='-', maxproc='0', command_args='cleanup'
-)
-
-egress_filter_cleanup_options = {
- 'syslog_name': 'postfix/fbxout',
- # "From" domain rewriting
- 'sender_canonical_maps': 'regexp:/etc/postfix/freedombox-rewrite-sender',
- 'local_header_rewrite_clients': 'static:all',
- # "From" domain masquerading
- 'masquerade_domains': '$mydomain',
- 'masquerade_classes': 'envelope_sender,header_sender',
- # Header privacy
- 'header_checks': 'regexp:/etc/postfix/freedombox-header-cleanup',
- 'nested_header_checks': ''
-}
-
-# Rspamd config
-
-rspamd_re = re.compile('#[ ]*--[ ]*([A-Z]{3,5})[ ]+FREEDOMBOX CONFIG$')
-rspamd_format = '#-- {} FREEDOMBOX CONFIG'
-
-rspamd_mutex = lock.Mutex('rspamd-config')
-logger = logging.getLogger(__name__)
-
-
-def get():
- translation_table = [
- (check_filter, _('Inbound and outbound mail filters')),
- ]
- results = []
- with postconf.mutex.lock_all():
- for check, title in translation_table:
- results.append(check(title))
- return results
-
-
-def repair():
- actions.superuser_run('email_server', ['spam', 'set_filter'])
-
-
-def check_filter(title=''):
- diagnosis = models.MainCfDiagnosis(title)
- diagnosis.compare(milter_config, postconf.get_many_unsafe)
- return diagnosis
-
-
-def fix_filter(diagnosis):
- diagnosis.apply_changes(postconf.set_many_unsafe)
-
-
-def action_set_filter():
- _compile_sieve()
- postconf.set_master_cf_options(egress_filter, egress_filter_options)
- postconf.set_master_cf_options(egress_filter_cleanup,
- egress_filter_cleanup_options)
-
- with postconf.mutex.lock_all():
- fix_filter(check_filter())
-
- injector = ConfigInjector(rspamd_re, rspamd_format)
- with rspamd_mutex.lock_all():
- # XXX Maybe use globbing?
- _inject_rspamd_config(injector, 'override', 'options.inc')
- _inject_rspamd_config(injector, 'local', 'milter_headers.conf')
-
-
-def _inject_rspamd_config(injector, type, name):
- template_path = '/etc/plinth/rspamd-config/%s_%s' % (type, name)
- config_path = '/etc/rspamd/%s.d/%s' % (type, name)
-
- logger.info('Opening Rspamd config file %s', config_path)
- injector.do_template_file(template_path, config_path)
-
-
-def _compile_sieve():
- sieve_list = glob.glob('/etc/dovecot/freedombox-sieve-after/*.sieve')
- for sieve_file in sieve_list:
- _run_sievec(sieve_file)
-
-
-def _run_sievec(sieve_file):
- logger.info('Compiling sieve script %s', sieve_file)
- args = ['sievec', '--', sieve_file]
- completed = subprocess.run(args, capture_output=True, check=False)
- if completed.returncode != 0:
- interproc.log_subprocess(completed)
- raise OSError('Sieve compilation failed: ' + sieve_file)
diff --git a/plinth/modules/email_server/data/etc/apache2/conf-available/email-server-freedombox.conf b/plinth/modules/email_server/data/etc/apache2/conf-available/email-server-freedombox.conf
deleted file mode 100644
index 218087e8a..000000000
--- a/plinth/modules/email_server/data/etc/apache2/conf-available/email-server-freedombox.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-
- Redirect "/rspamd/"
-
-
-
- ProxyPass http://127.0.0.1:11334/
- ProxyPassReverse http://127.0.0.1:11334/
- # Modify proxy headers
- ProxyAddHeaders off
- RequestHeader unset Forwarded
- RequestHeader unset Via
- RequestHeader unset X-Forwarded-For
- RequestHeader unset X-Forwarded-Host
- RequestHeader unset X-Forwarded-Proto
- RequestHeader unset X-Forwarded-Server
- RequestHeader unset X-Real-IP
- RequestHeader set X-Forwarded-For "127.0.0.1"
- # Modify response headers
- Header unset Set-Cookie
- # Require SSO
- Include includes/freedombox-single-sign-on.conf
-
- TKTAuthToken "admin"
-
-
-
-
-
- RewriteEngine On
- RewriteRule ^ /plinth/apps/email_server/config.xml [PT]
-
-
diff --git a/plinth/modules/email_server/data/etc/apache2/includes/freedombox-robots.conf b/plinth/modules/email_server/data/etc/apache2/includes/freedombox-robots.conf
deleted file mode 100644
index 87ef3035d..000000000
--- a/plinth/modules/email_server/data/etc/apache2/includes/freedombox-robots.conf
+++ /dev/null
@@ -1 +0,0 @@
-Header merge X-Robots-Tag "noindex, nofollow, noarchive, notranslate"
diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf b/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf
deleted file mode 100644
index a0f2a3ca4..000000000
--- a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-# Direct edits to this file will be lost!
-# Manage your settings on Plinth
-
-protocol lmtp {
- mail_plugins = $mail_plugins sieve
-}
diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf b/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf
deleted file mode 100644
index d14f70d59..000000000
--- a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf
+++ /dev/null
@@ -1,43 +0,0 @@
-# Direct edits to this file will be lost!
-# Manage your settings on Plinth
-
-namespace inbox {
- mailbox Archive {
- auto = subscribe
- special_use = \Archive
- }
- mailbox Drafts {
- auto = subscribe
- special_use = \Drafts
- }
- mailbox Junk {
- auto = subscribe
- autoexpunge = 30d
- special_use = \Junk
- }
- mailbox Trash {
- auto = subscribe
- autoexpunge = 30d
- special_use = \Trash
- }
-
- mailbox INBOX.Junk {
- auto = no
- autoexpunge = 30d
- special_use = \Junk
- }
- mailbox INBOX.Trash {
- auto = no
- autoexpunge = 30d
- special_use = \Trash
- }
-
- mailbox Sent {
- auto = subscribe
- special_use = \Sent
- }
- mailbox "Sent Messages" {
- auto = no
- special_use = \Sent
- }
-}
diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-master.conf b/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-master.conf
deleted file mode 100644
index 0b1137be7..000000000
--- a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-master.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-# Direct edits to this file will be lost!
-# Manage your settings on Plinth
-
-service auth {
- unix_listener /var/spool/postfix/private/auth {
- mode = 0600
- user = postfix
- group = postfix
- }
-}
-
-service lmtp {
- unix_listener /var/spool/postfix/private/dovecot-lmtp {
- mode = 0600
- user = postfix
- group = postfix
- }
-}
diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/95-freedombox-sieve.conf b/plinth/modules/email_server/data/etc/dovecot/conf.d/95-freedombox-sieve.conf
deleted file mode 100644
index dc34ba411..000000000
--- a/plinth/modules/email_server/data/etc/dovecot/conf.d/95-freedombox-sieve.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-# Direct edits to this file will be lost!
-# Manage your settings on Plinth
-
-plugin {
- sieve_after = /etc/dovecot/freedombox-sieve-after
-}
diff --git a/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/README.txt b/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/README.txt
deleted file mode 100644
index 17160f2fd..000000000
--- a/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-DO NOT PUT PERSONAL ITEMS HERE!
-This folder in its entirety is managed by FreedomBox.
diff --git a/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve b/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve
deleted file mode 100644
index aebaf100a..000000000
--- a/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve
+++ /dev/null
@@ -1,8 +0,0 @@
-require ["fileinto", "mailbox"];
-
-if anyof(header :contains "X-Spam" "Yes",
- header :contains "X-Spam-Status" "Yes",
- header :matches "X-Spam-Flag" "YES") {
- fileinto :create "Junk";
- stop;
-}
diff --git a/plinth/modules/email_server/data/etc/plinth/modules-enabled/email_server b/plinth/modules/email_server/data/etc/plinth/modules-enabled/email_server
deleted file mode 100644
index fb87084c0..000000000
--- a/plinth/modules/email_server/data/etc/plinth/modules-enabled/email_server
+++ /dev/null
@@ -1 +0,0 @@
-#plinth.modules.email_server
diff --git a/plinth/modules/email_server/data/etc/plinth/rspamd-config/local_milter_headers.conf b/plinth/modules/email_server/data/etc/plinth/rspamd-config/local_milter_headers.conf
deleted file mode 100644
index 8c24018cf..000000000
--- a/plinth/modules/email_server/data/etc/plinth/rspamd-config/local_milter_headers.conf
+++ /dev/null
@@ -1,39 +0,0 @@
-# The following section is managed by FreedomBox
-# Be careful not to edit
-
-use = ["x-fbx-mail-type", "authentication-results", "x-spam-level",
- "x-spam-status", "x-spamd-bar", "x-spamd-result"];
-
-routines {
- authentication-results {
- add_smtp_user = false;
- }
-}
-
-# Custom headers required by FreedomBox filtering system
-custom {
-x-fbx-mail-type = < 1:
- raise RaceCondition('setuid in a multi-threaded process')
- if not os.path.exists(self.lock_path):
- self._create_lock_file_as_plinth(og_euid)
-
- fd = None
- try:
- if og_euid == 0:
- # Temporarily run the current process as plinth
- plinth_uid = pwd.getpwnam('plinth').pw_uid
- self._checked_setresuid(og_ruid, plinth_uid, 0)
- fd = open(self.lock_path, 'w+b')
- finally:
- # Restore resuid
- if og_euid == 0:
- self._checked_setresuid(og_ruid, 0, 0)
- if og_suid != 0:
- self._checked_setresuid(og_ruid, 0, og_suid)
-
- return fd
-
- def _create_lock_file_as_plinth(self, your_euid):
- # Don't change the current processes umask
- # Do create a new process
- args = []
- if your_euid == 0:
- args.extend(['sudo', '-n', '-u', 'plinth'])
- args.extend(['/bin/sh', '-c'])
- args.append('umask 177 && > ' + self.lock_path)
-
- completed = subprocess.run(args, capture_output=True, check=False)
- if completed.returncode != 0:
- interproc.log_subprocess(completed)
- raise OSError('Could not create ' + self.lock_path)
-
- def _checked_setresuid(self, ruid, euid, suid):
- os.setresuid(ruid, euid, suid)
- if os.getresuid() != (ruid, euid, suid):
- try:
- raise SystemExit('PANIC: setresuid failed')
- except SystemExit as e:
- # Print stack trace
- logger.exception(e)
- # Force exit
- exit(1)
diff --git a/plinth/modules/email_server/modconf.py b/plinth/modules/email_server/modconf.py
deleted file mode 100644
index d78f9b194..000000000
--- a/plinth/modules/email_server/modconf.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# SPDX-License-Identifier: AGPL-3.0-or-later
-"""Generic config modifying utilities"""
-
-import contextlib
-import io
-import re
-
-from . import interproc
-
-
-class ConfigInjector:
- def __init__(self, match, generate):
- self.re_pattern = re.compile(match)
- self.boundary_fmt = generate + '\n'
-
- def do_file_des(self, template, config, scratch):
- """Write modified config to the `scratch` stream"""
- if not isinstance(template, io.TextIOBase):
- raise TypeError('Not a text IO stream: template')
- self._inject_config3(template, config, scratch)
-
- def _inject_config3(self, template, config, scratch):
- # Copy the original config up to header line
- for line in config:
- match = self.re_pattern.match(line.strip())
- if match and match.group(1) == 'BEGIN':
- break
- scratch.write(line)
- if not line.endswith('\n'): # in case no new line was at the eof
- scratch.write('\n')
-
- # Write header line
- scratch.write(self.boundary_fmt.format('BEGIN'))
- # Write template to scratch
- for line in template:
- scratch.write(line)
- # in case no new line was at the eof
- if not line.endswith('\n'):
- scratch.write('\n')
- # Write footer line
- scratch.write(self.boundary_fmt.format('END'))
-
- # Find the trailer line in config
- for line in config:
- match = self.re_pattern.match(line.strip())
- if match and match.group(1) == 'END':
- break
-
- # Copy the original
- for line in config:
- scratch.write(line) # keep original file ending style
-
- def do_template_file(self, template_path, config_path):
- with open(template_path, 'r') as template:
- with self._open_config(config_path) as (config, scratch):
- self._inject_config3(template, config, scratch)
-
- def do_template_string(self, template_string, config_path):
- with self._open_config(config_path) as (config, scratch):
- self._inject_config3([template_string], config, scratch)
-
- @contextlib.contextmanager
- def _open_config(self, config_path):
- with open(config_path, 'a+') as config:
- with interproc.atomically_rewrite(config_path) as scratch:
- config.seek(0)
- yield config, scratch
-
- def has_header_line(self, config_path):
- with open(config_path, 'r') as config_fd:
- return self._has_header_line(config_fd)
-
- def _has_header_line(self, config_fd):
- for line in config_fd:
- match = self.re_pattern.match(line.strip())
- if match and match.group(1) == 'BEGIN':
- return True
- return False
diff --git a/plinth/modules/email_server/postconf.py b/plinth/modules/email_server/postconf.py
deleted file mode 100644
index 047960dea..000000000
--- a/plinth/modules/email_server/postconf.py
+++ /dev/null
@@ -1,192 +0,0 @@
-"""Postconf wrapper providing thread-safe operations"""
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-import logging
-import re
-import subprocess
-from dataclasses import dataclass
-from typing import ClassVar
-
-from . import interproc
-from .lock import Mutex
-
-logger = logging.getLogger(__name__)
-mutex = Mutex('email-postconf')
-
-
-@dataclass
-class ServiceFlags:
- service: str
- type: str
- private: str
- unpriv: str
- chroot: str
- wakeup: str
- maxproc: str
- command_args: str
-
- crash_handler: ClassVar[str] = '/dev/null/plinth-crash'
-
- def _get_flags_ordered(self):
- return [self.service, self.type, self.private, self.unpriv,
- self.chroot, self.wakeup, self.maxproc, self.command_args]
-
- def serialize(self) -> str:
- ordered = self._get_flags_ordered()
- return ' '.join(ordered)
-
- def serialize_temp(self) -> str:
- ordered = self._get_flags_ordered()
- ordered[-1] = self.crash_handler
- return ' '.join(ordered)
-
- def try_remove_crash_handler(self, line) -> str:
- pattern = re.compile('([^ \\t]+)[ \\t]+([a-z]+)[ \\t]+')
- match = pattern.match(line)
- if match is None:
- return None
- if match.group(1) != self.service or match.group(2) != self.type:
- return None
- if not line.rstrip().endswith(self.crash_handler):
- return None
- return line.replace(self.crash_handler, self.command_args)
-
-
-def get_many(key_list):
- """Acquire resource lock. Get the list of postconf values as specified.
- Return a key-value map"""
- for key in key_list:
- validate_key(key)
- with mutex.lock_all():
- return get_many_unsafe(key_list)
-
-
-def get_many_unsafe(key_iterator, flag=''):
- result = {}
- args = ['/sbin/postconf']
- if flag:
- args.append(flag)
-
- number_of_keys = 0
- for key in key_iterator:
- args.append(key)
- number_of_keys += 1
-
- stdout = _run(args)
- for line in filter(None, stdout.split('\n')):
- key, sep, value = line.partition('=')
- if not sep:
- raise ValueError('Invalid output detected')
- result[key.strip()] = value.strip()
-
- if len(result) != number_of_keys:
- raise ValueError('Some keys were missing from the output')
- return result
-
-
-def set_many(kv_map):
- """Acquire resource lock. Set the list of postconf values as specified"""
- for key, value in kv_map.items():
- validate_key(key)
- validate_value(value)
-
- with mutex.lock_all():
- set_many_unsafe(kv_map)
-
-
-def set_many_unsafe(kv_map, flag=''):
- args = ['/sbin/postconf']
-
- if not kv_map:
- return
- if flag:
- args.append(flag)
- for key, value in kv_map.items():
- args.append('{}={}'.format(key, value))
- _run(args)
-
-
-def set_master_cf_options(service_flags, options={}):
- """Acquire resource lock. Set master.cf service options"""
- if not isinstance(service_flags, ServiceFlags):
- raise TypeError('service_flags')
- for key, value in options.items():
- validate_key(key)
- validate_value(value)
-
- service_key = service_flags.service + '/' + service_flags.type
- long_opts = {service_key + '/' + k: v for (k, v) in options.items()}
-
- logger.info('Setting %s service: %r', service_flags.service, options)
-
- # Crash resistant config setting:
- # /sbin/postconf -M "service/type="
- # /sbin/postconf -P "service/type/k=v" ...
- # Delete placeholder string /dev/null/plinth-crash
- with mutex.lock_all():
- set_unsafe(service_key, service_flags.serialize_temp(), '-M')
- set_many_unsafe(long_opts, '-P')
- _master_remove_crash_handler(service_flags)
-
-
-def get_unsafe(key):
- """Get postconf value (no locking, no sanitization)"""
- result = _run(['/sbin/postconf', key])
- match = key + ' ='
- if not result.startswith(match):
- raise KeyError(key)
- return result[len(match):].strip()
-
-
-def set_unsafe(key, value, flag=''):
- """Set postconf value (assuming root, no locking, no sanitization)"""
- if flag:
- _run(['/sbin/postconf', flag, '{}={}'.format(key, value)])
- else:
- _run(['/sbin/postconf', '{}={}'.format(key, value)])
-
-
-def parse_maps(raw_value):
- if '{' in raw_value or '}' in raw_value:
- raise ValueError('Unsupported map list format')
-
- value_list = []
- for segment in raw_value.split(','):
- for sub_segment in segment.strip().split(' '):
- sub_segment = sub_segment.strip()
- if sub_segment:
- value_list.append(sub_segment)
- return value_list
-
-
-def _run(args):
- """Run process. Capture and return standard output as a string. Raise a
- RuntimeError on non-zero exit codes"""
- try:
- result = subprocess.run(args, check=True, capture_output=True)
- return result.stdout.decode('utf-8')
- except subprocess.SubprocessError as subprocess_error:
- raise RuntimeError('Subprocess failed') from subprocess_error
- except UnicodeDecodeError as unicode_error:
- raise RuntimeError('Unicode decoding failed') from unicode_error
-
-
-def _master_remove_crash_handler(service_flags):
- with interproc.atomically_rewrite('/etc/postfix/master.cf') as writer:
- with open('/etc/postfix/master.cf') as reader:
- for line in reader:
- cleaned = service_flags.try_remove_crash_handler(line)
- writer.write(line if cleaned is None else cleaned)
-
-
-def validate_key(key):
- """Validate postconf key format. Raises ValueError"""
- if not re.match('^[a-zA-Z][a-zA-Z0-9_]*$', key):
- raise ValueError('Invalid postconf key format')
-
-
-def validate_value(value):
- """Validate postconf value format. Raises ValueError"""
- for c in value:
- if ord(c) < 32:
- raise ValueError('Value contains control characters')
diff --git a/plinth/modules/email_server/templates/email_autoconfig.xml b/plinth/modules/email_server/templates/email_autoconfig.xml
deleted file mode 100644
index 4573d5339..000000000
--- a/plinth/modules/email_server/templates/email_autoconfig.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- {{ host }}
- FreedomBox Mail
- FBXMail
-
- {{ host }}
- 993
- SSL
- %EMAILLOCALPART%
- password-cleartext
-
-
- {{ host }}
- 465
- SSL
- %EMAILLOCALPART%
- password-cleartext
-
-
-
diff --git a/plinth/modules/email_server/templates/email_server.html b/plinth/modules/email_server/templates/email_server.html
deleted file mode 100644
index b18fdaa54..000000000
--- a/plinth/modules/email_server/templates/email_server.html
+++ /dev/null
@@ -1,17 +0,0 @@
-{% extends "app.html" %}
-{% comment %}
-# SPDX-License-Identifier: AGPL-3.0-or-later
-{% endcomment %}
-
-{% load i18n %}
-
-{% block subsubmenu %}
-
- {% trans "Manage Spam" %}
-
-
-
- {% trans "Manage Aliases" %}
-
-{% endblock %}
diff --git a/plinth/modules/email_server/urls.py b/plinth/modules/email_server/urls.py
deleted file mode 100644
index cd56f03c8..000000000
--- a/plinth/modules/email_server/urls.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# SPDX-License-Identifier: AGPL-3.0-or-later
-from django.urls import path
-from stronghold.decorators import public
-
-from plinth.utils import non_admin_view
-
-from . import views
-
-urlpatterns = [
- path('apps/email_server/', views.EmailServerView.as_view(), name='index'),
- path('apps/email_server/my_aliases',
- non_admin_view(views.AliasView.as_view()), name='aliases'),
- path('apps/email_server/config.xml', public(views.XmlView.as_view())),
-]
diff --git a/plinth/modules/minidlna/manifest.py b/plinth/modules/minidlna/manifest.py
index c7e6e45c5..5f62d84a1 100644
--- a/plinth/modules/minidlna/manifest.py
+++ b/plinth/modules/minidlna/manifest.py
@@ -36,6 +36,11 @@ clients = [
'os': 'android',
'store_name': 'f-droid',
'url': store_url('f-droid', 'org.videolan.vlc')
+ }, {
+ 'type': 'store',
+ 'os': 'ios',
+ 'store_name': 'app-store',
+ 'url': 'https://apps.apple.com/app/apple-store/id650377962'
}]
},
{
diff --git a/plinth/modules/samba/manifest.py b/plinth/modules/samba/manifest.py
index 5532b6bf6..9f5526c61 100644
--- a/plinth/modules/samba/manifest.py
+++ b/plinth/modules/samba/manifest.py
@@ -49,6 +49,11 @@ clients = [{
'os': 'android',
'store_name': 'google-play',
'url': store_url('google-play', 'org.videolan.vlc')
+ }, {
+ 'type': 'store',
+ 'os': 'ios',
+ 'store_name': 'app-store',
+ 'url': 'https://apps.apple.com/app/apple-store/id650377962'
}]
}, {
'name':
diff --git a/pyproject.toml b/pyproject.toml
index 79690006f..43b6fe51a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -30,6 +30,7 @@ markers = [
"domain",
"dynamicdns",
"ejabberd",
+ "email",
"gitweb",
"help",
"i2p",
diff --git a/static/themes/default/icons/email.png b/static/themes/default/icons/email.png
new file mode 100644
index 000000000..dcfb177cc
Binary files /dev/null and b/static/themes/default/icons/email.png differ
diff --git a/static/themes/default/icons/email.svg b/static/themes/default/icons/email.svg
new file mode 100644
index 000000000..1ace77746
--- /dev/null
+++ b/static/themes/default/icons/email.svg
@@ -0,0 +1,259 @@
+
+