diff --git a/dashboard/TRANSLATIONS.md b/dashboard/TRANSLATIONS.md index 7d6405203..a2da40ac2 100644 --- a/dashboard/TRANSLATIONS.md +++ b/dashboard/TRANSLATIONS.md @@ -48,11 +48,19 @@ Hints in brackets are small case. Like "(comma separated)". Sentence fragments like form hints and tooltips (which are always visible) do not need a full stop. All other full sentences do. -description has a full stop unless it's a hint/phrase. +Description has a full stop unless it's a hint/phrase. + +instructional heading in dialogs (like the object being configured) should not have a full stop. Switch UI description does not have a fullstop. -Checkbox labels do not have a full stop at the end +Setting item description does not need a fullstop (usually). + +Checkbox labels do not have a full stop at the end. + +No full stop → short labels, commands, headings, or action text (“Configure Service {{serviceName}}”). + +Full stop → descriptive text or sentences explaining a setting (“The IPv4 address used for DNS A records.”). ### Dialog Buttons @@ -79,7 +87,7 @@ Description = context (to whom it applies) | Context | Verb form | Example | | --------------------------------- | ------------------------ | ---------------------------------------------------------------------- | | **Action / Button / Instruction** | **Imperative** → “Add” | Button: **Add**, Tooltip: “Add a new link” | -| **Section / View description** | **Descriptive** → “Adds” | Description: **Adds shortcuts to external services on the dashboard.** | +| **Section / View description** | **Imperative** → “Add” | Description: **Adds shortcuts to external services on the dashboard.** | We use plural when possible. "Admins can ..." , "Operators can ..." diff --git a/dashboard/public/translation/da.json b/dashboard/public/translation/da.json index 353f3cb46..73f74906a 100644 --- a/dashboard/public/translation/da.json +++ b/dashboard/public/translation/da.json @@ -538,7 +538,6 @@ }, "services": { "configure": { - "recoveryModeDescription": "Hvis tjenesten konstant genstartes eller ikke reagerer på grund af datakorruption, skal du sætte tjenesten i genoprettelsestilstand. Brug følgende instruktioner for at få tjenesten til at køre igen.", "title": "Konfigurer {{ name }}", "resetToDefaults": "Nulstil til standard", "enableRecoveryMode": "Aktiver genoprettelsestilstand" diff --git a/dashboard/public/translation/de.json b/dashboard/public/translation/de.json index 796ab9278..bc9ef84f1 100644 --- a/dashboard/public/translation/de.json +++ b/dashboard/public/translation/de.json @@ -824,8 +824,7 @@ "configure": { "title": "{{ name }} konfigurieren", "resetToDefaults": "Auf Standardwert zurücksetzen", - "enableRecoveryMode": "Wiederherstellungsmodus aktivieren", - "recoveryModeDescription": "Wenn eine App ständig neu gestartet wird oder aufgrund einer Datenbeschädigung nicht reagiert, schalten Sie die App in den Wiederherstellungsmodus. Verwenden Sie die folgenden Anweisungen, um die App wieder zum Laufen zu bringen." + "enableRecoveryMode": "Wiederherstellungsmodus aktivieren" }, "restartActionTooltip": "Neustart" }, diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json index a1e78efba..fe1bbae09 100644 --- a/dashboard/public/translation/en.json +++ b/dashboard/public/translation/en.json @@ -49,7 +49,7 @@ }, "rebootDialog": { "title": "Reboot Server", - "description": "Reboots the server to apply updates or fix unexpected behavior. All apps and services restart automatically afterward.", + "description": "All apps and services will restart automatically.

Reboot the server now?", "rebootAction": "Reboot now" }, "searchPlaceholder": "Search", @@ -201,7 +201,7 @@ "title": "Reset password for {{ username }}", "description": "The following password reset link was sent to {{ email }}:", "reset2FAAction": "Reset 2FA", - "sendAction": "Send Mail", + "sendAction": "Send mail", "descriptionLink": "Copy password reset link", "descriptionEmail": "Send password reset link" }, @@ -218,16 +218,17 @@ "invitationDialog": { "title": "Invite {{ username }}", "description": "The following invite link was sent to {{ email }}:", - "sendAction": "Send Mail", - "descriptionLink": "Copy invite link", - "descriptionEmail": "Send invite link" + "sendAction": "Send mail", + "descriptionLink": "Invite Link", + "descriptionEmail": "Email Invite Link" }, "setGhostDialog": { - "title": "Impersonate User {{ username }}", + "title": "Impersonate User", "description": "Set a temporary password to log in on behalf of this user to apps or the dashboard. This password is valid for 6 hours.", "password": "Temporary Password", "setPassword": "Set password", - "generatePassword": "Generate Password" + "generatePassword": "Generate Password", + "context": "Impersonate user \"{{ username }}\"" }, "invitationNotification": { "body": "Email sent to {{ email }}" @@ -462,7 +463,7 @@ }, "restoreArchiveDialog": { "title": "Restore from Archive", - "description": "Restores {{appId}} to the specified location using the backup from {{creationTime}}.", + "description": "Restore \"{{appId}}\" to the specified location using the backup from {{creationTime}}", "restoreAction": "Restore", "restoreActionOverwrite": "Restore and overwrite DNS" }, @@ -540,10 +541,11 @@ "rcptTo": "To" }, "changeDomainDialog": { - "description": "This will move the IMAP and SMTP server to the specified location." + "description": "Set IMAP and SMTP server to the specified location", + "setAction": "Set location" }, "changeMailSizeDialog": { - "description": "Changing the maximum email message size requires a restart of the mail server." + "description": "Incoming emails larger than this size are rejected." }, "spamFilterDialog": { "title": "Spam Filtering", @@ -573,7 +575,7 @@ "description": "When enabled, users can share their IMAP folders with other users." }, "changeVirtualAllMailDialog": { - "description": "The \"All Mail\" folder is a single folder that contains all the mails in your Inbox. The folder can be useful in mail clients that do not support recursive folder search." + "description": "The “All Mail” folder is a single folder that contains all emails. It can be useful in mail clients that do not support recursive folder search." } }, "network": { @@ -600,7 +602,7 @@ }, "dyndns": { "title": "Dynamic DNS", - "description": "Keeps DNS records in sync with a changing public IP address. Useful when Cloudron runs on a network with a frequently changing IP, such as a home connection." + "description": "Keep DNS records in sync with a changing public IP address. Useful when Cloudron runs on a network with a frequently changing IP, such as a home connection." }, "configureIp": { "title": "Configure IPv4", @@ -635,8 +637,7 @@ "title": "Configure Service", "resetToDefaults": "Reset to default", "enableRecoveryMode": "Enable recovery mode", - "recoveryModeDescription": "To fix a failing or unresponsive service, enable recovery mode.", - "description": "Configure service \"{{ name }}\"." + "description": "Configure service \"{{ name }}\"" } }, "settings": { @@ -692,7 +693,7 @@ }, "language": { "title": "Language", - "description": "Sets the default language for Cloudron and system emails (e.g. invitations, password resets). Users can override the dashboard language in their profile." + "description": "The default language for Cloudron and system emails (e.g. invitations, password resets). Users can override the dashboard language in their profile." }, "registryConfig": { "provider": "Docker Registry Provider", @@ -753,7 +754,7 @@ }, "changeDashboardDomain": { "title": "Dashboard Domain", - "description": "Moves the dashboard to the “my” subdomain of the selected domain.", + "description": "Change the dashboard to the “my” subdomain of the selected domain", "changeAction": "Change domain" }, "domainDialog": { @@ -785,7 +786,7 @@ "zoneName": "Zone Name (Optional)", "fallbackCert": "Fallback Certificate (optional)", "fallbackCertCustomCert": "Custom Certificate", - "fallbackCertCustomCertInfo": "This wildcard certificate will be used for all apps on this domain. If not provided, a self-signed certificate will be automatically generated.", + "fallbackCertCustomCertInfo": "Provide a wildcard certificate to use for all apps on this domain. If not provided, a self-signed certificate is automatically generated.", "fallbackCertKeyPlaceholder": "Key", "fallbackCertCertificatePlaceholder": "Certificate", "matrixHostname": "Matrix Server Location", @@ -812,7 +813,7 @@ "gandiTokenTypePAT": "Personal Access Token (PAT)", "inwxUsername": "Username", "inwxPassword": "Password", - "customNameservers": "Domain Uses Custom (Vanity) Nameservers" + "customNameservers": "Domain uses custom (vanity) nameservers" }, "removeDialog": { "title": "Remove Domain", @@ -1070,40 +1071,40 @@ }, "addMailboxDialog": { "title": "Add Mailbox", - "name": "Name", + "name": "Mailbox Name", "incomingDisabledWarning": "Incoming email for this domain is not enabled." }, "editMailboxDialog": { - "title": "Edit Mailbox {{ name }}@{{ domain }}", + "title": "Edit Mailbox", "owner": "Mailbox Owner", "aliases": "Aliases", - "noAliases": "No aliases are configured.", + "noAliases": "No aliases.", "addAliasAction": "Add an alias", "addAnotherAliasAction": "Add another alias", "enableStorageQuota": "Storage Quota" }, "deleteMailboxDialog": { - "title": "Delete mailbox {{ name }}@{{ domain }}", - "description": "After deletion, emails to this mailbox will bounce. You can choose to not delete emails in this mailbox for archival purposes. Archived emails are located at /home/yellowtent/boxdata/mail/vmail on the server.", - "purgeMailboxCheckbox": "Delete All Mail and Filters in This Mailbox", + "title": "Delete Mailbox", + "description": "After deletion, emails sent to this mailbox will bounce. You can choose to not delete existing emails for archival purposes. Archived emails are located at \"/home/yellowtent/boxdata/mail/vmail\" on the server.

Delete \"{{ name }}@{{ domain }}\"?", + "purgeMailboxCheckbox": "Delete all mail and filters in this mailbox", "deleteAction": "Delete" }, "addMailinglistDialog": { - "title": "Add Mailing list", + "title": "Add Mailing List", "members": "List Members", - "membersOnlyCheckbox": "Restrict Posting to List Members", + "membersOnlyCheckbox": "Restrict posting to list members", "name": "Name" }, "editMailinglistDialog": { - "title": "Edit Mailing List {{ name }}@{{ domain }}" + "title": "Edit Mailing List" }, "deleteMailinglistDialog": { - "title": "Delete Mailing List {{ name }}@{{ domain }}", - "description": "Really delete mailinglist {{ name }}@{{ domain }}?", + "title": "Delete Mailing List", + "description": "Delete mailing list\"{{ name }}@{{ domain }}\"?", "deleteAction": "Delete" }, "updateMailinglistDialog": { - "activeCheckbox": "Active Mailing List" + "activeCheckbox": "Mailing list is active" }, "updateMailboxDialog": { "activeCheckbox": "Active Mailbox", @@ -1194,7 +1195,7 @@ "storage": { "appdata": { "title": "Data Directory", - "description": "Moves the app’s data to a volume. Any data here is included in the app’s backup.", + "description": "Move the app’s data to a volume. Any data here is included in the app’s backup.", "moveAction": "Move data", "mountTypeWarning": "The destination file system must support file permissions and ownership for the move to work" }, @@ -1226,26 +1227,29 @@ }, "email": { "from": { - "title": "Mail FROM Address", + "title": "Mail From Address", "mailboxPlaceholder": "Mailbox Name", "saveAction": "Save", - "enable": "Use Cloudron Mail to send emails", + "enable": "Use Cloudron Mail to send email", "disable": "Do not configure app's mail delivery settings", - "enableDescription": "The app is configured to send mails using the address below and {{ domain }}'s Outbound Email settings.", - "disableDescription": "The app's mail delivery settings is left alone. You can configure it inside the app.", + "enableDescription": "Configures the app to send email using the address below and outbound email settings.", + "disableDescription": "The app's mail delivery settings remain unchanged. You can configure it inside the app.", "displayName": "From Name" }, "inbox": { "disable": "Do not configure inbox", - "disableDescription": "The app's incoming mail settings is left alone. You can configure it inside the app. Select this if the domain's email is not hosted on Cloudron.", + "disableDescription": "The app's incoming mail settings is unchanged. You can configure it inside the app. Select this if the domain's email is not hosted on Cloudron.", "title": "Incoming mail", "enable": "Use Cloudron Mail to receive emails", "enableDescription": "The app is configured to receive mails using the address below. Select this option if {{ domain }}'s email is hosted on this server." + }, + "configuration": { + "title": "Email Configuration" } }, "security": { "csp": { - "description": "Overrides any CSP headers defined by the app.", + "description": "Override any CSP headers defined by the app.", "title": "Content Security Policy", "saveAction": "Save" }, @@ -1276,7 +1280,7 @@ "backups": { "backups": { "title": "Backups", - "description": "Creates a complete snapshot of the app.", + "description": "Create a complete snapshot of the app.", "time": "Created At", "downloadConfigTooltip": "Download config", "cloneTooltip": "Clone", @@ -1288,11 +1292,11 @@ }, "import": { "title": "Import", - "description": "Imports the app from an external backup." + "description": "Import the app from an external backup." }, "auto": { "title": "Automatic Backups", - "description": "Backs up the app periodically to the configured Backup Sites" + "description": "Back up the app periodically to the configured Backup Sites" } }, "repair": { @@ -1305,7 +1309,7 @@ }, "taskError": { "title": "Task Error", - "description": "Retries a failed installation, configuration, update, restore, or backup task.", + "description": "Retry a failed installation, configuration, update, restore, or backup task.", "retryAction": "Retry {{ task }} task" }, "restart": { @@ -1321,7 +1325,7 @@ }, "uninstall": { "title": "Uninstall", - "description": "Uninstalls the app and deletes its data. Backups are cleaned up according to the backup policy.", + "description": "Uninstall the app and delete its data. Backups are cleaned up according to the backup policy.", "uninstallAction": "Uninstall" } }, @@ -1405,8 +1409,8 @@ "info": "Enable this option to configure the app to use the built-in TURN server. When disabled, the app's TURN settings are left alone." }, "redis": { - "title": "Redis Configuration", - "info": "If enabled, the app will use the built-in Redis service. When disabled, the app's Redis settings are left alone." + "title": "Redis Autoconfiguration", + "info": "Uses the built-in Redis service. When disabled, the app’s Redis settings remain unchanged." }, "infoTabTitle": "Info", "info": { @@ -1416,7 +1420,7 @@ }, "archive": { "title": "Archive", - "description": "Adds the latest app backup to the App Archive and uninstalls the app.", + "description": "Add the latest app backup to the App Archive and uninstall the app.", "action": "Archive", "latestBackupInfo": "The last backup was created on {{siteName}} at {{date}}.", "noBackup": "This app has no backup. Archiving requires a recent backup." @@ -1635,7 +1639,7 @@ }, "externallinks": { "label": "External Links", - "description": "Adds shortcuts to external services on the dashboard." + "description": "Add shortcuts to external services on the dashboard" }, "server": { "title": "Server" diff --git a/dashboard/public/translation/es.json b/dashboard/public/translation/es.json index 52bf865d3..9c9f793e6 100644 --- a/dashboard/public/translation/es.json +++ b/dashboard/public/translation/es.json @@ -623,8 +623,7 @@ "configure": { "title": "Configurar {{ name }}", "resetToDefaults": "Restablecer a lo predeterminado", - "enableRecoveryMode": "Habilitar el Modo de Recuperación", - "recoveryModeDescription": "Si el servicio se reinicia constantemente o no responde debido a daños en los datos, pon el servicio en modo de recuperación. Utiliza las siguientes instrucciones para volver a ejecutar el servicio." + "enableRecoveryMode": "Habilitar el Modo de Recuperación" }, "restartActionTooltip": "Reiniciar", "memoryLimit": "Límite de Memoria", diff --git a/dashboard/public/translation/fr.json b/dashboard/public/translation/fr.json index 34732a0f8..1da539e7d 100644 --- a/dashboard/public/translation/fr.json +++ b/dashboard/public/translation/fr.json @@ -1273,7 +1273,6 @@ "configure": { "resetToDefaults": "Restaurer les paramètres par défaut", "title": "Paramétrer {{ name }}", - "recoveryModeDescription": "Si le service ne cesse de redémarrer ou s'il ne répond pas en raison d'une altération des données, activez le mode récupération. Suivez ces instructions pour remettre le service en marche.", "enableRecoveryMode": "Activer le mode récupération" }, "restartActionTooltip": "Redémarrer", diff --git a/dashboard/public/translation/nl.json b/dashboard/public/translation/nl.json index 2f1caff6d..6a8be1129 100644 --- a/dashboard/public/translation/nl.json +++ b/dashboard/public/translation/nl.json @@ -1035,7 +1035,6 @@ "configure": { "title": "Configureer {{ name }}", "resetToDefaults": "Terugstellen naar standaardwaarden", - "recoveryModeDescription": "Indien de dienst continue herstart of niet reageert vanwege datacorruptie, plaats de dienst in dan Herstelmodus. Bekijk de volgende instructies om de dienst weer werkend te krijgen.", "enableRecoveryMode": "Inschakelen Herstelmodus" }, "description": "Diensten leveren functionaliteiten zoals databases, e-mail en authenticatie." diff --git a/dashboard/public/translation/ru.json b/dashboard/public/translation/ru.json index 37d51336f..cca6f6d1f 100644 --- a/dashboard/public/translation/ru.json +++ b/dashboard/public/translation/ru.json @@ -946,8 +946,7 @@ "configure": { "title": "Настроить {{ name }}", "resetToDefaults": "Сбросить к стандартным настройкам", - "enableRecoveryMode": "Включить режим восстановления", - "recoveryModeDescription": "Если служба постоянно перезапускается или не отвечает из-за ошибки в данных, переведите её в режим восстановления. Ознакомьтесь со следующими инструкциями, чтобы восстановить работу службы." + "enableRecoveryMode": "Включить режим восстановления" } }, "settings": { diff --git a/dashboard/public/translation/vi.json b/dashboard/public/translation/vi.json index 4770a3869..0c2f069c8 100644 --- a/dashboard/public/translation/vi.json +++ b/dashboard/public/translation/vi.json @@ -825,7 +825,6 @@ "configure": { "resetToDefaults": "Chỉnh về mặc định", "title": "Cấu hình {{ name }}", - "recoveryModeDescription": "Nếu những dịch vụ đang chạy liên tục bị khởi động lại hoặc không có tín hiệu phản hồi vì gián đoạn thông tin, hãy cho dịch vụ vào chế độ phục hồi. Hãy dùng những hướng dẫn sau đây để khởi chạy dịch vụ lại lần nữa.", "enableRecoveryMode": "Bật chế độ phục hồi" }, "restartActionTooltip": "Khởi động lại", diff --git a/dashboard/src/components/ApiTokens.vue b/dashboard/src/components/ApiTokens.vue index c091101d1..b94c53df2 100644 --- a/dashboard/src/components/ApiTokens.vue +++ b/dashboard/src/components/ApiTokens.vue @@ -104,8 +104,9 @@ async function onRevokeToken(apiToken) { title: t('profile.removeApiToken.title'), message: t('profile.removeApiToken.description', { name: apiToken.name }), confirmStyle: 'danger', - confirmLabel: t('main.dialog.yes'), - rejectLabel: t('main.dialog.no') + confirmLabel: t('main.action.remove'), + rejectLabel: t('main.dialog.cancel'), + rejectStyle: 'secondary' }); if (!yes) return; diff --git a/dashboard/src/components/ApplinkDialog.vue b/dashboard/src/components/ApplinkDialog.vue index a83120299..f6917b889 100644 --- a/dashboard/src/components/ApplinkDialog.vue +++ b/dashboard/src/components/ApplinkDialog.vue @@ -98,8 +98,9 @@ async function onRemove() { const yes = await inputDialog.value.confirm({ message: `Really remove applink?`, confirmStyle: 'danger', - confirmLabel: t('main.dialog.yes'), - rejectLabel: t('main.dialog.cancel') + confirmLabel: t('main.action.remove'), + rejectLabel: t('main.dialog.cancel'), + rejectStyle: 'secondary' }); if (!yes) return; diff --git a/dashboard/src/components/DomainDialog.vue b/dashboard/src/components/DomainDialog.vue index 82cb9cc04..e639f00a4 100644 --- a/dashboard/src/components/DomainDialog.vue +++ b/dashboard/src/components/DomainDialog.vue @@ -156,14 +156,14 @@ defineExpose({
-

+
-
+
diff --git a/dashboard/src/components/ImpersonateDialog.vue b/dashboard/src/components/ImpersonateDialog.vue index 5a939f004..96f44bce0 100644 --- a/dashboard/src/components/ImpersonateDialog.vue +++ b/dashboard/src/components/ImpersonateDialog.vue @@ -56,13 +56,14 @@ defineExpose({ -
+
@@ -118,7 +118,7 @@ onMounted(async () => { - +
diff --git a/dashboard/src/components/MailboxDialog.vue b/dashboard/src/components/MailboxDialog.vue index 461ecd5e7..5557c4e1e 100644 --- a/dashboard/src/components/MailboxDialog.vue +++ b/dashboard/src/components/MailboxDialog.vue @@ -140,7 +140,7 @@ defineExpose({