Translate the volume view

This commit is contained in:
Johannes Zellner
2020-11-23 22:13:54 +01:00
parent ba59fbac48
commit dcecd166d0
4 changed files with 71 additions and 52 deletions
+1 -1
View File
@@ -179,7 +179,7 @@
<li ng-show="user.isAtLeastAdmin"><a href="#/network"><i class="fas fa-network-wired fa-fw"></i> {{ 'network.title' | tr }}</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/services"><i class="fa fa-cogs fa-fw"></i> {{ 'services.title' | tr }}</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/settings"><i class="fa fa-wrench fa-fw"></i> {{ 'settings.title' | tr }}</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/volumes"><i class="fa fa-hdd fa-fw"></i> Volumes</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/volumes"><i class="fa fa-hdd fa-fw"></i> {{ 'volumes.title' | tr }}</a></li>
<li ng-show="user.isAtLeastAdmin" class="divider"></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/support"><i class="fa fa-comment fa-fw"></i> {{ 'support.title' | tr }}</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/system"><i class="fa fa-chart-area fa-fw"></i> {{ 'system.title' | tr }}</a></li>
+33 -27
View File
@@ -56,8 +56,8 @@
"firewall": {
"configure": {
"title": "Konfiguration der Firewall",
"blocklistPlaceholder": "Zeilengetrennte IP-Adresse oder Subnetz",
"description": "Übereinstimmende Adressen können keine Verbindung zum Server herstellen, auch nicht zum Mailserver, zum Dashboard und zu allen Anwendungen. Vorsicht: Fehlkonfiguration kann den Server unerreichbar machen."
"blocklistPlaceholder": "Mehrere IP-Adressen oder Subnetze jeweils in eine neue Zeile",
"description": "Die hier aufgelisteten IP-Adressen werden durch die Firewall geblockt. Sie können keine Verbindung zum Server herstellen. Auch nicht zum Mailserver, zum Dashboard und zu allen anderen Anwendungen. Vorsicht: Fehlkonfiguration kann den Server unerreichbar machen."
},
"title": "Firewall",
"blockedIpRanges": "Gesperrte IPs und Bereiche",
@@ -267,7 +267,8 @@
"setupAction": "Abonnement einrichten",
"title": "Abonnement notwendig",
"description": "Für das Hinzufügen weiterer User ist ein Abonnement notwendig."
}
},
"searchPlaceholder": "Suche"
},
"profile": {
"title": "Profil",
@@ -437,8 +438,8 @@
"testMailDialog": {
"mailTo": "E-Mail an",
"mailToPlaceholder": "E-Mail-Adresse",
"title": "Test-E-Mail für {{ domain }} senden",
"description": "Das wird eine Test-E-Mail von <b>no-reply@{{ domain }}</b> an die unten angegebene Adresse senden.",
"title": "Test-E-Mail an {{ domain }} senden",
"description": "Dies wird eine Test-E-Mail von <b>no-reply@{{ domain }}</b> an die unten angegebene Adresse senden.",
"sendAction": "Senden"
}
},
@@ -480,7 +481,7 @@
"source": "Quelle"
},
"domains": {
"title": "Domains & Zertifikate",
"title": "Domänen & Zertifikate",
"renewCerts": {
"renewAllAction": "Alle Zertifikate erneuern",
"showLogsAction": "Logfiles anzeigen",
@@ -558,7 +559,8 @@
"diskContent": "Dieser {{ type }} Datenträger enthält",
"usageInfo": "{{ available | prettyDiskSize }}</b> von <b>{{ size | prettyDiskSize }}</b> verfügbar",
"title": "Datenträger-Nutzung",
"mountedAt": "{{ filesystem }} <small>mounted at</small> {{ mountpoint }}"
"mountedAt": "{{ filesystem }} <small>mounted at</small> {{ mountpoint }}",
"notAvailableYet": "Noch nicht verfügbar"
},
"systemMemory": {
"graphSubtext": "Anwendungswerte werden nicht gestapelt",
@@ -578,7 +580,7 @@
"advancedSettings": "Erweiterte Einstellungen.",
"encryptionDescription": "Vorsicht: Passphrase an einem sicheren Ort aufbewahren. Cloudron speichert dieses Passwort nicht. Backups können ohne die Passphrase nicht entschlüsselt werden",
"encryptionPassword": "Verschlüsselungspasswort (optional)",
"s3LikeNote": "Alle Regeln für den Ablauf des Lebenszyklus von Objekten entfernen, da dadurch rsync-Backups beschädigt werden.",
"s3LikeNote": "Bitte alle object expiration lifecycle Regeln entfernen, da dadurch rsync-Backups beschädigt werden.",
"formatChangeNote": "Frühere Backups, die das alte Speicherformat verwenden, müssen manuell entfernt werden.",
"format": "Speicherformat",
"gcsServiceKey": "Service-Kontoschlüssel",
@@ -607,13 +609,13 @@
"downloadConcurrencyDescription": "Anzahl der Dateien, die beim Wiederherstellen parallel heruntergeladen werden",
"downloadConcurrency": "Gleichzeitiges Herunterladen",
"uploadPartSizeDescription": "Paketgröße beim Hochladen. Bis zu 3 Pakete werden gleichzeitig hochgeladen. Dementsprechend wird auch Arbeitsspeicher benötigt.",
"memoryLimitDescription": "Arbeitsspeicherlimit für die Datensicherung. Erhöhe dies, wenn die Datensicherung Concurrency erhöht wird."
"memoryLimitDescription": "Arbeitsspeicherlimit für die Datensicherung. Das Limit erhöhen, wenn die Datensicherung-Concurrency erhöht wird."
},
"configureBackupSchedule": {
"retentionPolicy": "Aufbewahrungsrichtlinie",
"hours": "Stunden",
"days": "Tage",
"scheduleDescription": "Tage und Stunden auswählen, an denen Cloudron ein Backup erstellen soll. Der Zeitplan soll sich nicht mit dem <a href=\"/#/settings\">Zeitplan für Aktualisierungen</a> zu überschneiden.",
"scheduleDescription": "Tage und Stunden auswählen, an denen Cloudron ein Backup erstellen soll. Der Zeitplan soll sich nicht mit dem <a href=\"/#/settings\">Zeitplan für Aktualisierungen</a> überschneiden.",
"schedule": "Zeitplan",
"title": "Sicherungszeitplan und Aufbewahrung konfigurieren"
},
@@ -635,7 +637,7 @@
},
"logs": {
"showLogs": "Logfiles anzeigen",
"description": "Vorsicht: Die Logfiles können sensible Informationen enthalten. Öffentlich erreichbare Webserver sind kein geeigneter Speicherort.",
"description": "Vorsicht: Die Logfiles können sensible Informationen enthalten. Öffentlich erreichbare Webserver sind kein geeigneter Speicherort, um die Logfiles anderen zur Verfügung zu stellen.",
"title": "Logfiles"
},
"listing": {
@@ -654,7 +656,7 @@
"configure": "Konfigurieren",
"retentionPolicy": "Aufbewahrungsrichtlinie",
"schedule": "Zeitplan",
"description": "Cloudron erstellt ein vollständiges Backup des Systems. Es basiert auf dem konfigurierten Intervall und bewahrt die Anzahl der Backups mit der angegebenen Aufbewahrungsrichtlinie auf.",
"description": "Cloudron erstellt ein vollständiges Backup des Systems. Es basiert auf dem konfigurierten Intervall und bewahrt die Anzahl der Backups nach der angegebenen Aufbewahrungsrichtlinie auf.",
"title": "Zeitplan und Aufbewahrung"
},
"location": {
@@ -664,7 +666,7 @@
"location": "Ort",
"provider": "Anbieter",
"disabledList": "Bei folgenden Apps ist das automatische Backup deaktiviert:",
"description": "Cloudron erstellt ein komplettes Systembackup auf dem konfigurierten Standort.",
"description": "Cloudron erstellt ein komplettes Systembackup auf dem konfigurierten Ort.",
"title": "Backup-Ort"
}
},
@@ -744,7 +746,7 @@
"branding": {
"title": "Design- & Textanpassungen",
"changeLogo": {
"title": "Cloudron Avatar auswählen"
"title": "Cloudron-Avatar auswählen"
},
"footer": {
"setupSubscriptionNow": "Abonnenement jetzt abschließen",
@@ -799,12 +801,12 @@
"selfsignedCheckbox": "Selbstsignierte Zertifikate akzeptieren",
"apiTokenOrKey": "API-Token/Key",
"password": "Passwort",
"spfDocInfo": "Cloudron richtet einen SPF-Eintrag nicht automatisch ein. Für die manuelle Einrichtung, der <a href=\"{{ spfDocsLink }}\" target=\"_blank\">{{ name }} Anleitung</a> folgen.",
"spfDocInfo": "Cloudron richtet einen SPF-Eintrag nicht automatisch ein. Für die manuelle Einrichtung, bitte der <a href=\"{{ spfDocsLink }}\" target=\"_blank\">{{ name }} Anleitung</a> folgen.",
"saveSuccess": "Gespeichert"
},
"description": "Cloudron wird diesen E-Mail-Server (Smart-Host) verwenden, um die ausgehenden E-Mails der unter dieser Domäne installierten Anwendungen zu versenden.",
"noopNonAdminDomainWarning": "Wenn E-Mail deaktiviert ist, können die Anwendungen, die unter der Domäne installiert wurden, keine E-Mails versenden.",
"noopAdminDomainWarning": "Cloudron kann keine User-Einladungen, Passwort-Zurücksetzen und andere Benachrichtigungen senden, wenn E-Mail in der primären Domain deaktiviert ist",
"noopAdminDomainWarning": "Cloudron kann keine User-Einladungen, Passwort-Zurücksetzen und andere Benachrichtigungen senden, wenn E-Mail-Versand in der primären Domäne deaktiviert ist",
"tabTitle": "Ausgehend",
"title": "E-Mail-Relay"
},
@@ -822,7 +824,7 @@
"port": "Port",
"mailinglists": {
"membersOnlyTooltip": "Senden an die Liste nur Mitgliedern erlaubt",
"description": "Eine Mailing-Liste leitet alle E-Mails an ihre Mitglieder weiter.",
"description": "Eine E-Mail an eine Mailing-Liste wird an alle Listen-Mitglieder weitergeleitet.",
"members": "Listen-Mitglieder",
"everyoneTooltip": "Senden an die Liste durch Nichtmitglieder erlaubt",
"title": "Mailing-Listen",
@@ -838,19 +840,20 @@
"usage": "Benutzung",
"addAction": "Hinzufügen"
},
"description": "Mit dem Cloudron <a href=\"{{ emailDocsLink }}\" target=\"_blank\">E-Mail-Server</a> können User E-Mails für diese Domäne empfangen. <a href=\"{{ rainloopLink }}\">Rainloop</a>, <a href=\"{{ sogoLink }}\">SOGo</a>, <a href=\"{{ roundcubeLink }}\">Roundcube</a> sind für den Zugriff auf Cloudron E-Mail bereits vorkonfiguriert.",
"description": "Mit dem Cloudron <a href=\"{{ emailDocsLink }}\" target=\"_blank\">E-Mail-Server</a> können User E-Mails für diese Domäne empfangen. Die Anwendungen <a href=\"{{ rainloopLink }}\">Rainloop</a>, <a href=\"{{ sogoLink }}\">SOGo</a>, <a href=\"{{ roundcubeLink }}\">Roundcube</a> sind für den Zugriff auf Cloudron E-Mail bereits vorkonfiguriert.",
"outgointServerInfo": "Ausgehende E-Mails (SMTP)",
"sieveServerInfo": "Sieve-Filter verwalten",
"loginHelp": "<i>Postfachname</i>@{{ domain }} und das Passwort des Postfach-User verwenden, um auf die Postfächer dieser Domäne zuzugreifen"
"loginHelp": "<i>Postfachname</i>@{{ domain }} und das Passwort des Postfach-Users verwenden, um auf die Postfächer dieser Domäne zuzugreifen",
"incomingServerInfo": "Eintreffende E-Mail (IMAP)"
},
"masquerading": {
"description": "Masquerading erlaubt es Usern und Anwendungen, E-Mails mit einem beliebigen Username in der FROM-Adresse zu versenden.",
"description": "Maskierung erlaubt es Usern und Anwendungen, E-Mails mit einem beliebigen Username in der FROM-Adresse zu versenden.",
"title": "Maskierung",
"enableAction": "Aktivieren",
"disableAction": "Deaktivieren"
},
"smtpStatus": {
"notBlacklisted": "Die IP-Adresse des Servers {{ ip }} ist <b>nicht</b> auf einer Blockliste.",
"notBlacklisted": "Die IP-Adresse des Servers {{ ip }} ist <b>nicht</b> auf einer bekannten Blockliste.",
"outboudRelay": "Ausgeheneder SMTP (Relay)",
"blacklistCheck": "IP-Adressen Blocklisten-Überprüfung",
"blacklisted": "Die IP-Adresse des Servers {{ ip }} ist auf einer Blockliste.",
@@ -886,7 +889,7 @@
"title": "Mail-Liste hinzufügen",
"members": "Listen-Mitglieder",
"membersInfo": "Mehrere E-Mail-Adressen jeweils in eine neue Zeile",
"membersOnlyCheckbox": "Mailversand an Liste so einschränken, dass nur Mitglieder senden dürfen"
"membersOnlyCheckbox": "Den Mailversand an diese Liste so einschränken, dass nur Mitglieder senden dürfen."
},
"mailboxboxDialog": {
"groupsHeader": "Gruppen",
@@ -898,7 +901,7 @@
"title": "Abonnement erforderlich"
},
"config": {
"title": "E-Mail-Konfiguration {{ domain }}",
"title": "E-Mail-Konfiguration für {{ domain }}",
"connectionDetails": "Verbindungsdetails für andere E-Mail-Clients"
},
"addMailboxDialog": {
@@ -907,12 +910,12 @@
"name": "Name"
},
"editMailboxDialog": {
"title": "Postfach{{ name }}@{{ domain }} bearbeiten",
"title": "Postfach {{ name }}@{{ domain }} bearbeiten",
"owner": "Besitzer*in des Postfachs",
"addAliasAction": "Ein Alias hinzufügen",
"addAnotherAliasAction": "Ein weiteres Alias hinzufügen",
"aliases": "Aliase",
"noAliases": "Kein alias wurde konfiguriert."
"noAliases": "Bislang wurde kein Alias konfiguriert."
},
"deleteMailinglistDialog": {
"description": "Die Mail-Liste <b>{{ name }}@{{ domain }}</b> wirklich löschen?",
@@ -1124,7 +1127,8 @@
},
"robots": {
"title": "robots.txt",
"txtPlaceholder": "Leer lassen, um allen Bots zu erlauben diese Anwendung in den Index aufzunehmen"
"txtPlaceholder": "Leer lassen, um allen Bots zu erlauben diese Anwendung in den Index aufzunehmen",
"disableIndexingAction": "Indexierung deaktivieren"
}
},
"backAction": "Zurück zu den Anwendungen",
@@ -1246,7 +1250,9 @@
"volume": "Datenträger",
"noMounts": "Es sind keine Datenträger gemounted.",
"addMountAction": "Einen Datenträger mount hinzufügen",
"saveAction": "Speichern"
"saveAction": "Speichern",
"warning": "Volumes sind <i>nicht</i> Teil der Cloudron-Backups. Das Wiederherstellen einer Anwendung würde also nicht den Inhalt des Volumes wiederherstellen. Bitte sicherstellen, dass ein geeigneter Sicherungsplan für diese Datenträger existiert.",
"description": "Volumes sind auf dem Hostsystem gemountete Verzeichnisse, die von verschiedenen Anwendungen gemeinsam genutzt werden können. Dies können Netzwerk-Mounts wie NFS oder große Speicherplatten sein, die direkt an den Server angeschlossen sind."
}
},
"uninstallDialog": {
+21 -3
View File
@@ -901,7 +901,8 @@
"description": "Emails sent to non existing addresses will be forwarded to the following mailboxes.",
"subscriptionRequired": "This feature is only available in the paid plans. <a href=\"\" class=\"pull-right\" ng-click=\"openSubscriptionSetup()\">Setup Subscription Now</a>",
"saveAction": "Save"
}
},
"incomingServerInfo": "Incoming Mail (IMAP)"
},
"outbound": {
"tabTitle": "Outbound",
@@ -1019,7 +1020,6 @@
"groupsHeader": "Groups"
}
},
"incomingServerInfo": "Incoming Mail (IMAP)",
"app": {
"backAction": "Back to My Apps",
"logsActionTooltip": "Logs",
@@ -1105,7 +1105,7 @@
"addMountAction": "Add a volume mount",
"saveAction": "Save",
"description": "Volumes are directories mounted onto the host system, which can be shared between apps. This may be network mounts like NFS or large storage disks directly attached to the server.",
"warning": "Volumes are <i>not</i> part of any backups. Restoring an app would thus not restore the volume's content. Please make sure to have some suitable of backup plan for that volume."
"warning": "Volumes are <i>not</i> part of any backups. Restoring an app would not restore the volume's content. Please make sure to have some suitable backup plan for that volume."
}
},
"graphs": {
@@ -1349,5 +1349,23 @@
"de": "German",
"fr": "French",
"it": "Italian"
},
"volumes": {
"title": "Volumes",
"addVolumeAction": "Add Volume",
"hostPath": "Host Path",
"name": "Name",
"openFileManagerActionTooltip": "Open FileManager",
"removeVolumeActionTooltip": "Remove Volume",
"addVolumeDialog": {
"title": "Add Volume",
"nameWarning": "Cloudron will mount the host path into the app's container with this name under <code>/media</code>.",
"addAction": "Add"
},
"removeVolumeDialog": {
"title": "Really remove {{ volume }} ?",
"description": "This will delete the volume <code>{{ volume }}</code>. Data inside the host path will not be removed.",
"removeAction": "Remove"
}
}
}
+16 -21
View File
@@ -3,7 +3,7 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Add Volume</h4>
<h4 class="modal-title">{{ 'volumes.addVolumeDialog.title' | tr }}</h4>
</div>
<div class="modal-body">
<form name="volumeAddForm" role="form" novalidate ng-submit="volumeAdd.submit()" autocomplete="off">
@@ -11,13 +11,13 @@
<p class="has-error text-center" ng-show="volumeAdd.error">{{ volumeAdd.error }}</p>
<div class="form-group">
<label class="control-label">Volume name</label>
<p class="small text-info">Cloudron will mount the host path into the app's container with this name under <code>/media</code>.</p>
<label class="control-label">{{ 'volumes.name' | tr }}</label>
<p class="small text-info" ng-bind-html="'volumes.addVolumeDialog.nameWarning' | tr"></p>
<input type="text" class="form-control" ng-model="volumeAdd.name" name="name" ng-disabled="volumeAdd.busy" autofocus>
</div>
<div class="form-group">
<label class="control-label">Host Path</label>
<label class="control-label">{{ 'volumes.hostPath' | tr }}</label>
<input type="text" class="form-control" ng-model="volumeAdd.hostPath" name="hostPath" ng-disabled="volumeAdd.busy" autofocus>
</div>
@@ -26,10 +26,8 @@
</form>
</div>
<div class="modal-footer ">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-outline btn-success pull-right" ng-click="volumeAdd.submit()" ng-disabled="volumeAddForm.$invalid || volumeAdd.busy">
<i class="fa fa-circle-notch fa-spin" ng-show="volumeAdd.busy"></i> Add
</button>
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'main.dialog.cancel' | tr }}</button>
<button type="submit" class="btn btn-outline btn-success pull-right" ng-click="volumeAdd.submit()" ng-disabled="volumeAddForm.$invalid || volumeAdd.busy"><i class="fa fa-circle-notch fa-spin" ng-show="volumeAdd.busy"></i> {{ 'volumes.addVolumeDialog.addAction' | tr }}</button>
</div>
</div>
</div>
@@ -40,18 +38,15 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Really remove {{ volumeRemove.volume.name }} ?</h4>
<h4 class="modal-title">{{ 'volumes.removeVolumeDialog.title' | tr:{ volume:volumeRemove.volume.name } }}</h4>
</div>
<div class="modal-body">
This will delete the volume <code>{{ volumeRemove.volume.name }}</code>. Data inside the host path will not be removed.
<div>
<br/>
<span class="has-error" ng-show="volumeRemove.error">{{ volumeRemove.error }}</span>
</div>
<p ng-bind-html="{{ 'volumes.removeVolumeDialog.description' | tr:{ volume:volumeRemove.volume.name } }}"></p>
<p class="has-error" ng-show="volumeRemove.error">{{ volumeRemove.error }}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-danger" ng-click="volumeRemove.submit()" ng-disabled="volumeRemove.busy"><i class="fa fa-circle-notch fa-spin" ng-show="volumeRemove.busy"></i> Remove</button>
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'main.dialog.cancel' | tr }}</button>
<button type="button" class="btn btn-danger" ng-click="volumeRemove.submit()" ng-disabled="volumeRemove.busy"><i class="fa fa-circle-notch fa-spin" ng-show="volumeRemove.busy"></i> {{ 'volumes.removeVolumeDialog.removeAction' | tr }}</button>
</div>
</div>
</div>
@@ -59,7 +54,7 @@
<div class="content">
<div class="text-left">
<h1>Volumes <button class="btn btn-primary btn-outline pull-right" ng-click="volumeAdd.show()"><i class="fa fa-plus"></i> Add Volume</button></h1>
<h1>{{ 'volumes.title' | tr }} <button class="btn btn-primary btn-outline pull-right" ng-click="volumeAdd.show()"><i class="fa fa-plus"></i> {{ 'volumes.addVolumeAction' | tr }}</button></h1>
</div>
<div class="card card-large">
@@ -73,8 +68,8 @@
<table class="table table-hover" style="margin-top: 10px;">
<thead>
<tr>
<th class="text-left">Name</th>
<th class="text-left">Host Path</th>
<th class="text-left">{{ 'volumes.name' | tr }}</th>
<th class="text-left">{{ 'volumes.hostPath' | tr }}</th>
<th style="width: 100px" class="text-right">{{ 'main.actions' | tr }}</th>
</tr>
</thead>
@@ -87,8 +82,8 @@
{{ volume.hostPath }}
</td>
<td class="text-right no-wrap" style="vertical-align: bottom">
<a class="btn btn-xs btn-default" ng-href="{{ '/filemanager.html?volumeId=' + volume.id }}" target="_blank" uib-tooltip="File Manager"><i class="far fa-file-alt"></i></a>
<button class="btn btn-xs btn-danger" ng-click="volumeRemove.show(volume)" title="Remove Volume"><i class="far fa-trash-alt"></i></button>
<a class="btn btn-xs btn-default" ng-href="{{ '/filemanager.html?volumeId=' + volume.id }}" target="_blank" uib-tooltip="{{ 'volumes.openFileManagerActionTooltip' | tr }}"><i class="far fa-file-alt"></i></a>
<button class="btn btn-xs btn-danger" ng-click="volumeRemove.show(volume)" uib-tooltip="{{ 'volumes.removeVolumeActionTooltip' | tr }}"><i class="far fa-trash-alt"></i></button>
</td>
</tr>
</tbody>