diff --git a/dashboard/TRANSLATIONS.md b/dashboard/TRANSLATIONS.md index 2f56865a0..495616821 100644 --- a/dashboard/TRANSLATIONS.md +++ b/dashboard/TRANSLATIONS.md @@ -31,6 +31,7 @@ Only first word is capitalized. | Form Labels | Title Case | Email Address | | Buttons | Sentence Case | Save changes | | Radio Buttons | Sentence Case | Option one / Option two | +| Checkbox | Sentence Case | Use CIFS encryption | | Menu action | Sentence Case | Select all | | Switches | Sentence Case | Allow users to edit email | | Descriptions | Sentence case | Enter your password to continue. | @@ -66,3 +67,8 @@ Checkbox labels do not have a full stop at the end When asking for confirmation simply ask 'Remove app password "xxx"' . Don't use "really" or other emotional terms. Quote the password/domain name. +In general, we put just "Delete User" in Title and provide the username in the context. + +Title = action (what you’re doing) +Description = context (to whom it applies) + diff --git a/dashboard/public/translation/da.json b/dashboard/public/translation/da.json index 4adf73488..f90dba29a 100644 --- a/dashboard/public/translation/da.json +++ b/dashboard/public/translation/da.json @@ -634,7 +634,6 @@ "renewAllAction": "Forny alle certs" }, "domainDialog": { - "addDescription": "Når du tilføjer et domæne, kan du installere apps på underdomæner til dette domæne. E-mail-indstillingerne for domænet kan konfigureres i visningen Email.", "wildcardInfo": "OpsætningArecords for *.{{ domain }}.og{ domain }}.til denne servers IP.", "wellKnownDescription": "Værdierne vil blive brugt af Cloudron til at svare på /.well-known/ URL'er. Bemærk, at en app skal være tilgængelig på det nøgne domæne {{{ domæne }} for at dette kan fungere. Se docs for flere oplysninger.", "addTitle": "Tilføj domæne", diff --git a/dashboard/public/translation/de.json b/dashboard/public/translation/de.json index 4ec6c3016..794409770 100644 --- a/dashboard/public/translation/de.json +++ b/dashboard/public/translation/de.json @@ -527,7 +527,6 @@ "gcdnsServiceAccountKey": "Service-Kontoschlüssel", "cloudflareTokenTypeGlobalApiKey": "Globaler API-Schlüssel", "editTitle": "{{ domain }} konfigurieren", - "addDescription": "Durch das Hinzufügen einer Domäne können Anwendungen auf Unterdomänen dieser Domäne installiert werden. E-Mail-Einstellungen für die Domäne können in der Ansicht E-Mail konfiguriert werden.", "domain": "Domäne", "provider": "DNS-Anbieter", "gandiApiKey": "Gandi-API-Key", diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json index 234ea29eb..448aa0b52 100644 --- a/dashboard/public/translation/en.json +++ b/dashboard/public/translation/en.json @@ -152,7 +152,7 @@ }, "addUserDialog": { "title": "Add User", - "sendInviteCheckbox": "Send Invitation Email", + "sendInviteCheckbox": "Send invitation email", "addUserAction": "Add" }, "user": { @@ -165,13 +165,13 @@ "displayName": "Display Name", "primaryEmail": "Primary Email", "recoveryEmail": "Password Recovery Email", - "activeCheckbox": "Active User", + "activeCheckbox": "User is active", "displayNamePlaceholder": "Optional. If not provided, user can provide during sign up", "fallbackEmailPlaceholder": "If not specified, primary email will be used" }, "deleteUserDialog": { - "title": "Delete User {{ username }}", - "description": "After deletion, the user will not be able to access the dashboard or login to any of the apps. Note that any user data inside the apps is not removed.", + "title": "Delete User", + "description": "After deletion, the user will not be able to access the dashboard or login to any of the apps. Note that any user data inside the apps is not removed.

Delete user \"{{ username }}\" ?", "deleteAction": "Delete" }, "editUserDialog": { @@ -192,8 +192,8 @@ "externalLdapWarning": "This group is synced from the external LDAP directory." }, "deleteGroupDialog": { - "title": "Delete Group {{ name }}", - "description": "This group has {{ memberCount }} member(s). Really remove this group?", + "title": "Delete Group", + "description": "This group has {{ memberCount }} member(s).

Delete group \"{{ name }}\"?", "deleteAction": "Delete" }, "passwordResetDialog": { @@ -284,7 +284,7 @@ "apiTokens": { "title": "API Tokens", "name": "Name", - "description": "Use these personal access tokens to authenticate to the Cloudron API.", + "description": "Use these personal access tokens to authenticate with the Cloudron API.", "noTokensPlaceholder": "No API tokens", "lastUsed": "Last Used", "neverUsed": "never", @@ -418,7 +418,7 @@ "user": "User", "privateKey": "Private Key", "diskPath": "Disk Path", - "cifsSealSupport": "Use seal encryption. Requires at least SMB v3", + "cifsSealSupport": "Use seal encryption (requires at least SMB v3)", "chown": "Remote file system supports chown", "encryptFilenames": "Encrypt Filenames", "preserveAttributesLabel": "Preserve file attributes", @@ -746,18 +746,17 @@ "provider": "Provider", "renewCerts": { "title": "Renew Certificates", - "description": "Let's Encrypt certificates are renewed automatically. Use this option to trigger a renewal immediately.", + "description": "Let’s Encrypt certificates renew automatically. You can renew them manually if needed.", "renewAllAction": "Renew all certs" }, "changeDashboardDomain": { "title": "Dashboard Domain", - "description": "This will move the dashboard to the mysubdomain of the selected domain.", + "description": "Moves the dashboard to the “my” subdomain of the selected domain.", "changeAction": "Change domain" }, "domainDialog": { "addTitle": "Add Domain", "editTitle": "Configure {{ domain }}", - "addDescription": "Adding a domain lets you install apps on subdomains of this domain. Email settings can be configured in the Email view.", "domain": "Domain", "provider": "DNS Provider", "route53AccessKeyId": "Access Key Id", @@ -820,7 +819,7 @@ }, "syncDns": { "title": "Sync DNS", - "description": "This will reprovision the app and email DNS records across all domains.", + "description": "Updates app and email DNS records for all domains.", "syncAction": "Sync DNS" }, "domainWellKnown": { @@ -828,7 +827,8 @@ }, "tooltipWellKnown": "Well-Known locations", "emptyPlaceholder": "No Domains", - "noMatchesPlaceholder": "No matching domain" + "noMatchesPlaceholder": "No matching domain", + "description": "Adding a domain allows you to install apps on its subdomains." }, "notifications": { "dismissTooltip": "Dismiss", @@ -1515,7 +1515,7 @@ "removeVolumeDialog": { "removeAction": "Remove" }, - "description": "Volumes are local or remote file systems. They can be used as an app's main data storage or as a shared storage location between apps.", + "description": "Volumes are local or remote file systems. They can be used for an app’s primary data storage or shared between apps.", "mountType": "Mount Type", "localDirectory": "Local Directory", "remountActionTooltip": "Remount", @@ -1546,15 +1546,16 @@ "id": "Client ID", "secret": "Client Secret", "signingAlgorithm": "Signing Algorithm", - "loginRedirectUri": "Login Callback URLs (comma separated)" + "loginRedirectUri": "Login Callback URLs", + "loginRedirectUriPlaceholder": "Comma separated URLs" }, - "description": "The OpenID provider can be used by external applications for single sign-on.", + "description": "Cloudron’s OpenID provider can be used for single sign-on with external applications.", "editClientDialog": { - "title": "Edit Client {{ client }}" + "title": "Edit Client" }, "deleteClientDialog": { - "title": "Really delete client {{ client }}?", - "description": "Deleting this OIDC Client will invalidate any access tokens. Apps using this OIDC Client will not be able to authenticate anymore." + "title": "Delete Client", + "description": "After deletion, any access tokens issued by this client will be invalidated. Apps using it will no longer be able to authenticate.

Delete client \"{{ clientName }}\"?" }, "env": { "discoveryUrl": "Discovery URL" @@ -1562,6 +1563,10 @@ "clients": { "title": "OpenID Clients", "empty": "No OpenID clients" + }, + "clientCredentials": { + "title": "Client Credentials", + "description": "Copy the credentials for client \"{{ clientName }}\"." } }, "userdirectory": { diff --git a/dashboard/public/translation/es.json b/dashboard/public/translation/es.json index 771a47c70..7082b5a3c 100644 --- a/dashboard/public/translation/es.json +++ b/dashboard/public/translation/es.json @@ -732,7 +732,6 @@ "netcupCustomerNumber": "Número de cliente", "netcupApiKey": "Clave API", "netcupApiPassword": "Contraseña API", - "addDescription": "Añadir un dominio te permite instalar aplicaciones en sus subdominios. Puedes configurar el correo electrónico en la vista Correo electrónico.", "namecheapUsername": "Usuario de Namecheap", "namecheapInfo": "La dirección IP del servidor debe agregarse a la lista de permitidos para esta clave API", "wildcardInfo": "Configurar manualmente los registros DNS A (IPv4) y AAAA (IPv6) para *.{{ domain }}. y {{ domain }}. que apuntan a este servidor", diff --git a/dashboard/public/translation/fr.json b/dashboard/public/translation/fr.json index 74eb79d8c..b3e42260a 100644 --- a/dashboard/public/translation/fr.json +++ b/dashboard/public/translation/fr.json @@ -1021,7 +1021,6 @@ "description": "Cette action va permettre de réapprovisionner les enregistrements DNS de l'application et de la messagerie sur l'ensemble des domaines." }, "domainDialog": { - "addDescription": "L'ajout d'un domaine vous permet d'installer des applications dans des sous-domaines de ce domaine. Les paramètres de messagerie relatifs à ce domaine peuvent être paramétrés dans l'onglet Messagerie.", "netcupApiPassword": "Mot de passe API", "netcupApiKey": "Clé API", "netcupCustomerNumber": "Numéro de client", diff --git a/dashboard/public/translation/it.json b/dashboard/public/translation/it.json index dff06a750..38f07a92d 100644 --- a/dashboard/public/translation/it.json +++ b/dashboard/public/translation/it.json @@ -1000,7 +1000,6 @@ "route53AccessKeyId": "Id della chiave di accesso", "provider": "Provider DNS", "domain": "Dominio", - "addDescription": "Aggiungere un dominio ti consentirà di installare delle app sui sottodomini di questo dominio. I parametri di configurazione per le e-mail di questo dominio possono essere configurati nel menù E-mail.", "editTitle": "Configura {{ domain }}", "addTitle": "Aggiungi dominio", "matrixHostname": "Location del server matrix", diff --git a/dashboard/public/translation/nl.json b/dashboard/public/translation/nl.json index 4e19a926a..3ac24319d 100644 --- a/dashboard/public/translation/nl.json +++ b/dashboard/public/translation/nl.json @@ -2,7 +2,7 @@ "apps": { "noApps": { "title": "Nog geen apps geïnstalleerd!", - "description": "Wat dacht je ervan om er te installeren? Kijk eens in de App Store" + "description": "Zullen we wat installeren? Bekijk de App Store." }, "noAccess": { "title": "Je hebt nog geen toegang tot apps.", @@ -300,12 +300,12 @@ "logoutAll": "Overal uitloggen" }, "changeEmail": { - "title": "Primair e-mailadres aanpassen", - "email": "Nieuw e-mailadres", + "title": "Primaire e-mail aanpassen", + "email": "Nieuwe e-mail", "password": "Bevestig met wachtwoord" }, "changeFallbackEmail": { - "title": "E-mailadres voor wachtwoordherstel wijzigen" + "title": "Wijzig wachtwoordherstel e-mailadres" }, "createAppPassword": { "title": "App wachtwoord aanmaken", @@ -329,10 +329,12 @@ "body": "E-mail gestuurd naar {{ email }}" }, "removeApiToken": { - "title": "Weet je zeker dat je token {{ name }} wilt verwijderen?" + "title": "API-token verwijderen", + "description": "Verwijder API-token \"{{ name }}\" ?" }, "removeAppPassword": { - "title": "Weet je zeker dat je wachtwoord {{ name }} wilt verwijderen?" + "title": "Verwijder app-wachtwoord", + "description": "Verwijder App-wachtwoord \"{{ name }}\"?" } }, "backups": { @@ -372,7 +374,9 @@ "days": "Dagen", "hours": "Uren", "retentionPolicy": "Bewaartermijn", - "scheduleDescription": "Stel de dagen en uren voor backups in. Zorg ervoor dat deze tijden niet overlappen met de update planning." + "scheduleDescription": "Stel de dagen en uren voor backups in. Zorg ervoor dat deze tijden niet overlappen met de update planning.", + "disable": "Automatische backups uitschakelen", + "enable": "Automatische backups inschakelen" }, "configureBackupStorage": { "title": "Configureer Backup Locatie", @@ -400,7 +404,7 @@ "copyConcurrencyDescription": "Aantal externe bestandskopieën, die parallel bij het maken van een back-up gebruikt worden.", "copyConcurrencyDigitalOceanNote": "Het limiet van DigitalOcean Spaces ligt op 20.", "encryptionPasswordPlaceholder": "Wachtwoord wat gebruikt is om backups te versleutelen", - "s3AccessKeyId": "Toegangssleutel id", + "s3AccessKeyId": "Toegangssleutel ID", "s3SecretAccessKey": "Geheime toegangssleutel", "encryptionDescription": "Let op: bewaar dit wachtwoord op een veilige plaats. Cloudron bewaart dit wachtwoord niet, zonder dit wachtwoord kunnen backups niet ontsleutelt worden", "uploadPartSizeDescription": "Meerdelige uploaddeelgrootte. Er worden maximaal 3 delen parallel geüpload en vereist evenveel geheugen.", @@ -601,8 +605,7 @@ "fallbackCertCustomCertInfo": "Dit wildcardcertificaat wordt gebruikt voor alle apps van dit domein. Als dit niet het geval is, wordt een automatisch gegenereerd zelfondertekend certificaat gebruikt.", "fallbackCertKeyPlaceholder": "Sleutel", "fallbackCertCertificatePlaceholder": "Certificaat", - "letsEncryptInfo": "Let's Encrypt vereist dat deze server bereikbaar is op poort 80.", - "addDescription": "Een domein toevoegen maakt het mogelijk om apps te installeren op subdomeinen van dit domein. E-mailinstellingen kunnen in het E-mailscherm worden geconfigureerd.", + "letsEncryptInfo": "Let's Encrypt vereist dat deze server bereikbaar is op poort 80", "domain": "Domein", "gcdnsServiceAccountKey": "Service Account Sleutel", "mastodonHostname": "Mastodon Server Locatie", @@ -645,8 +648,9 @@ "description": "Hierdoor verhuist het Dashboard naar het my subdomein van het geselecteerde domein." }, "removeDialog": { - "title": "Weet je zeker dat je {{ domain }} wilt verwijderen?", - "removeAction": "Verwijder" + "title": "Verwijder domein", + "removeAction": "Verwijder", + "description": "Verwijder Domein \"{{ domain }}\"?" }, "syncDns": { "syncAction": "Sync DNS", @@ -712,8 +716,8 @@ "locationPlaceholder": "Leeg laten om hoofddomein te gebruiken", "saveAction": "Opslaan", "location": "Locatie", - "noRedirections": "Er zijn geen omleidingen ingesteld.", - "noAliases": "Er is geen alias geconfigureerd.", + "noRedirections": "Er zijn geen omleidingen ingesteld", + "noAliases": "Er is geen alias geconfigureerd", "addAliasAction": "Alias toevoegen", "aliases": "Aliassen", "dnsoverwrite": "Sommige DNS records bestaan al. Weet je zeker dat ze overschreven moeten worden?" @@ -1155,7 +1159,7 @@ "diskSpace": "Weinig diskruimte" }, "settingsDialog": { - "description": "Een e-mail wordt verstuurd voor de geselecteerde gebeurtenissen naar je primaire e-mailadres." + "description": "Een e-mail wordt verstuurd voor de geselecteerde gebeurtenissen naar je primaire e-mail." }, "allCaughtUp": "Alles bijgewerkt" }, diff --git a/dashboard/public/translation/ru.json b/dashboard/public/translation/ru.json index 16d431b6b..339b6e914 100644 --- a/dashboard/public/translation/ru.json +++ b/dashboard/public/translation/ru.json @@ -1089,7 +1089,6 @@ "advancedAction": "Расширенные настройки…", "zoneName": "Имя зоны (Необязательно)", "addTitle": "Добавить домен", - "addDescription": "Добавление домена позволяет устанавливать приложения на его поддомены. Настроить электронную почту можно разделе Электронная почта.", "linodeToken": "Токен Linode", "namecheapInfo": "IP-адрес сервера должен быть внесён в список разрешённых ключей для этого ключа API", "wildcardInfo": "Вручную настройте A (IPv4) и AAAA (IPv6) DNS записи для *.{{ domain }}. и {{ domain }}. на IP-адрес данного сервера", diff --git a/dashboard/public/translation/vi.json b/dashboard/public/translation/vi.json index 7c5d83fcb..a4fdf3d29 100644 --- a/dashboard/public/translation/vi.json +++ b/dashboard/public/translation/vi.json @@ -1012,7 +1012,6 @@ "route53AccessKeyId": "Mã access", "provider": "Nhà cung cấp DNS", "domain": "Tên miền", - "addDescription": "Thêm tên miền cho phép bạn cài đặt app trên những tên miền con. Cài đặt mail cho tên miền có thể được tuỳ chỉnh trên mục Email.", "editTitle": "Cấu hình {{ domain }}", "addTitle": "Thêm tên miền", "wellKnownDescription": "Những giá trị nhập vào này sẽ được dùng bởi Cloudron để phản hồi về những đường link /.well-known/. Lưu ý rằng một app cần được đang chạy cài đặt sẵn trên tên miền gốc {{ domain }} để tính năng này có thể hoạt động được. Xem phần hướng dẫn sử dụng để biết thêm thông tin.", diff --git a/dashboard/public/translation/zh_Hans.json b/dashboard/public/translation/zh_Hans.json index 79ed86936..4c5cb4aae 100644 --- a/dashboard/public/translation/zh_Hans.json +++ b/dashboard/public/translation/zh_Hans.json @@ -630,7 +630,6 @@ "fallbackCertCustomCertInfo": "这个泛域名证书会被用于该域名下的所有应用。如未提供,会使用一个自动生成的自签名证书。", "fallbackCertKeyPlaceholder": "密钥", "fallbackCertCertificatePlaceholder": "证书", - "addDescription": "添加一个域名后,您就可以在该域名的子域名中安装应用。域名的 Email 请在 Email 设置中配置。", "cloudflareEmail": "Cloudflare Email", "namecheapInfo": "这个服务器的 IP 需要被添加在 API Key 的白名单里。", "wildcardInfo": "将 *.{{ domain }}{{ domain }}A 记录都指向这台服务器的 IP。", diff --git a/dashboard/src/components/ApiTokens.vue b/dashboard/src/components/ApiTokens.vue index c3d5478a5..c091101d1 100644 --- a/dashboard/src/components/ApiTokens.vue +++ b/dashboard/src/components/ApiTokens.vue @@ -131,7 +131,7 @@ onMounted(async () => { :title="$t('profile.createApiToken.title')" :confirm-label="addedToken ? '' : $t('main.action.add')" confirm-style="primary" - :reject-label="$t('main.dialog.cancel')" + :reject-label="addedToken ? $t('main.dialog.close') : $t('main.dialog.cancel')" reject-style="secondary" @confirm="onSubmitAddApiToken()" @close="onReset()" diff --git a/dashboard/src/components/UserDialog.vue b/dashboard/src/components/UserDialog.vue index 8204b367b..8752d1023 100644 --- a/dashboard/src/components/UserDialog.vue +++ b/dashboard/src/components/UserDialog.vue @@ -294,8 +294,8 @@ defineExpose({ - - + + diff --git a/dashboard/src/views/GroupsView.vue b/dashboard/src/views/GroupsView.vue index 0504590fe..cf5a42e2a 100644 --- a/dashboard/src/views/GroupsView.vue +++ b/dashboard/src/views/GroupsView.vue @@ -110,11 +110,12 @@ function onEditOrAddGroup(group = null) { async function onRemoveGroup(group) { const yes = await inputDialog.value.confirm({ - title: t('users.deleteGroupDialog.title', { name: group.name }), - message: t('users.deleteGroupDialog.description', { memberCount: group.userIds.length }), + title: t('users.deleteGroupDialog.title'), + message: t('users.deleteGroupDialog.description', { name: group.name, memberCount: group.userIds.length }), confirmStyle: 'danger', confirmLabel: t('users.deleteGroupDialog.deleteAction'), - rejectLabel: t('main.dialog.cancel') + rejectLabel: t('main.dialog.cancel'), + rejectStyle: 'secondary' }); if (!yes) return; diff --git a/dashboard/src/views/OpenIdView.vue b/dashboard/src/views/OpenIdView.vue index 1c0c1c27f..ae644f3ee 100644 --- a/dashboard/src/views/OpenIdView.vue +++ b/dashboard/src/views/OpenIdView.vue @@ -121,11 +121,12 @@ async function onSubmit() { async function onRemove(client) { const yes = await inputDialog.value.confirm({ - title: t('oidc.deleteClientDialog.title', { client: client.name }), - message: t('oidc.deleteClientDialog.description'), + title: t('oidc.deleteClientDialog.title'), + message: t('oidc.deleteClientDialog.description', { clientName: client.name }), confirmStyle: 'danger', confirmLabel: t('main.dialog.delete'), - rejectLabel: t('main.dialog.cancel') + rejectLabel: t('main.dialog.cancel'), + rejectStyle: 'secondary' }); if (!yes) return; @@ -157,11 +158,13 @@ onMounted(async () => {
- -
New client credentials for {{ clientName }}
+
{{ $t('oidc.clientCredentials.description', { clientName: clientName }) }}
+
@@ -181,11 +184,11 @@ onMounted(async () => {
@@ -218,6 +221,7 @@ onMounted(async () => { + {{ $t('oidc.client.loginRedirectUriPlaceholder') }} diff --git a/dashboard/src/views/UsersView.vue b/dashboard/src/views/UsersView.vue index 7d794afe9..06dfed3b6 100644 --- a/dashboard/src/views/UsersView.vue +++ b/dashboard/src/views/UsersView.vue @@ -179,11 +179,12 @@ function onInvitation(user) { async function onRemoveUser(user) { const yes = await inputDialog.value.confirm({ - title: t('users.deleteUserDialog.title', { username: (user.username || user.email) }), - message: t('users.deleteUserDialog.description'), + title: t('users.deleteUserDialog.title'), + message: t('users.deleteUserDialog.description', { username: (user.username || user.email) }), confirmStyle: 'danger', confirmLabel: t('users.deleteUserDialog.deleteAction'), - rejectLabel: t('main.dialog.cancel') + rejectLabel: t('main.dialog.cancel'), + rejectStyle: 'secondary' }); if (!yes) return; diff --git a/dashboard/src/views/VolumesView.vue b/dashboard/src/views/VolumesView.vue index ba253dd6c..ab0c4d49a 100644 --- a/dashboard/src/views/VolumesView.vue +++ b/dashboard/src/views/VolumesView.vue @@ -278,7 +278,7 @@ onMounted(async () =>{ :title="volumeDialogData.mode === 'edit' ? $t('volumes.editVolumeDialog.title', { name: volumeDialogData.name }) : $t('volumes.addVolumeDialog.title')" :reject-label="$t('main.dialog.cancel')" reject-style="secondary" - :confirm-label="$t('main.dialog.save')" + :confirm-label="$t('main.action.add')" :confirm-active="!volumeDialogData.busy && isFormValid" :confirm-busy="volumeDialogData.busy" @confirm="onSubmit()" @@ -353,7 +353,7 @@ onMounted(async () =>{