diff --git a/dashboard/README.md b/dashboard/TRANSLATIONS.md similarity index 68% rename from dashboard/README.md rename to dashboard/TRANSLATIONS.md index 881737269..f4611a310 100644 --- a/dashboard/README.md +++ b/dashboard/TRANSLATIONS.md @@ -3,14 +3,13 @@ This documents the convention used for the text in the UI. -### Title Case +### Tale of Two Cases -All words are capitalized. +**Title Case** -In title case, articles (a/an/the) ,conjunctions (and/but/or/...) and prepositions (on/at/...) -inside a phrase are not capitalized. - -Everything else is capitalized - noun, pronoun, verb, adverb. +All words are capitalized. In title case, articles (a/an/the), conjunctions (and/but/or/...) +and prepositions (on/at/...) inside a phrase are not capitalized. Everything else is capitalized +- noun, pronoun, verb, adverb. Examples: @@ -19,11 +18,11 @@ Examples: * "Getting Started with GraphQL" * "Between You and Me" -### Sentence case +**Sentence Case** Only first word is capitalized. -### Convention +### UI Conventions | Element | Recommended Style | Example | | -------------- | ---------------------- | -------------------------------- | @@ -39,10 +38,11 @@ Only first word is capitalized. | Error Messages | Sentence case | Password is too short | | Notifications | Sentence case | Settings saved successfully. | | Legend (graph) | Sentence case | Docker volume, Box data. | +| Placeholders | Sentence case | Comma separated IPs or subnets | Hints in brackets are small case. Like "(comma separated)". -## Full stops +### Full Stops Sentence fragments like form hints and tooltips (which are always visible) do not need a full stop. All other full sentences do. @@ -51,3 +51,16 @@ description has a full stop unless it's a hint/phrase. Checkbox labels do not have a full stop at the end +### Dialog Buttons + +'Add' for addition +'Cancel' to cancel +'Save' for edit/update +'Remove' for non-destructive/less destructive things (app password remove) +'Delete' for destructive (user delete) + +### Dialog Text + +When asking for confirmation simply ask 'Remove app password "xxx"' . Don't use "really" +or other emotional terms. Quote the password/domain name. + diff --git a/dashboard/public/translation/da.json b/dashboard/public/translation/da.json index 45449db24..4adf73488 100644 --- a/dashboard/public/translation/da.json +++ b/dashboard/public/translation/da.json @@ -259,15 +259,13 @@ "title": "Opret app-adgangskode", "name": "Adgangskode Navn", "app": "APp", - "copyNow": "Kopier venligst adgangskoden nu. Det vil ikke blive vist igen af sikkerhedshensyn.", - "generatePassword": "Generer adgangskode" + "copyNow": "Kopier venligst adgangskoden nu. Det vil ikke blive vist igen af sikkerhedshensyn." }, "createApiToken": { "copyNow": "Kopier venligst API-tokenet nu. Det vil ikke blive vist igen af sikkerhedshensyn.", "title": "Opret API-token", "name": "API-token-navn", "description": "Nyt API-token:", - "generateToken": "Generer API-token", "access": "API-adgang" }, "title": "Profil", diff --git a/dashboard/public/translation/de.json b/dashboard/public/translation/de.json index 689da5f22..4ec6c3016 100644 --- a/dashboard/public/translation/de.json +++ b/dashboard/public/translation/de.json @@ -356,7 +356,6 @@ "disable2FAAction": "2FA deaktivieren", "changePasswordAction": "Passwort ändern", "createApiToken": { - "generateToken": "API-Token generieren", "copyNow": "API-Token kopieren. Hinweis: keine erneute Anzeige des API-Tokens.", "description": "Neuer API-Token:", "name": "Name des API-Token", @@ -365,7 +364,6 @@ "allowedIpRanges": "Erlaubte IP-Bereich(e)" }, "createAppPassword": { - "generatePassword": "Passwort generieren", "copyNow": "Hinweis: das Passwort wird nicht erneut angezeigt. Bitte Passwort kopieren.", "description": "Folgendes Passwort wurde generiert und ist für die App gültig:", "app": "Anwendung", diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json index 7265ea8a6..234ea29eb 100644 --- a/dashboard/public/translation/en.json +++ b/dashboard/public/translation/en.json @@ -3,7 +3,7 @@ "title": "My Apps", "noApps": { "title": "No apps installed yet!", - "description": "How about installing some? Check out the App Store" + "description": "How about installing some? Check out the App Store." }, "noAccess": { "title": "You don't have access to any apps yet.", @@ -300,27 +300,25 @@ "logoutAll": "Logout from all" }, "changeEmail": { - "title": "Change Primary Email Address", - "email": "New Email Address", + "title": "Change Primary Email", + "email": "New Email", "password": "Confirm with Password" }, "changeFallbackEmail": { - "title": "Change password recovery email address" + "title": "Change Password Recovery Email" }, "createAppPassword": { - "title": "Create App Password", + "title": "Add App Password", "name": "Password Name", "app": "App", "description": "Use the following password to authenticate against the app:", - "copyNow": "Please copy the password now. It won't be shown again for security purposes.", - "generatePassword": "Generate Password" + "copyNow": "Please copy the password now. It won't be shown again for security purposes." }, "createApiToken": { - "title": "Create API Token", + "title": "Add API Token", "name": "API Token Name", "description": "New API token:", "copyNow": "Please copy the API token now. It won't be shown again for security purposes.", - "generateToken": "Generate API Token", "access": "API Access", "allowedIpRanges": "Allowed IP Range(s)" }, @@ -331,10 +329,12 @@ "body": "Email sent to {{ email }}" }, "removeApiToken": { - "title": "Really remove token {{ name }}?" + "title": "Remove API Token", + "description": "Remove API token \"{{ name }}\" ?" }, "removeAppPassword": { - "title": "Really remove password {{ name }}?" + "title": "Remove App Password", + "description": "Remove app password \"{{ name }}\" ?" } }, "backups": { @@ -779,7 +779,7 @@ "namecheapInfo": "The server’s IP address must be added to the allowlist for this API key", "manualInfo": "All DNS records must be set up manually before installing an app", "wildcardInfo": "Manually set up A (IPv4) and AAAA (IPv6) DNS records for *.{{ domain }}. and {{ domain }}. pointing to this server", - "letsEncryptInfo": "Let's Encrypt requires your server to be reachable on port 80.", + "letsEncryptInfo": "Let's Encrypt requires your server to be reachable on port 80", "advancedAction": "Advanced settings…", "zoneName": "Zone Name (Optional)", "fallbackCert": "Fallback Certificate (optional)", @@ -814,8 +814,9 @@ "customNameservers": "Domain Uses Custom (Vanity) Nameservers" }, "removeDialog": { - "title": "Really remove {{ domain }}?", - "removeAction": "Remove" + "title": "Remove Domain", + "removeAction": "Remove", + "description": "Remove domain \"{{ domain }}\" ?" }, "syncDns": { "title": "Sync DNS", @@ -823,7 +824,7 @@ "syncAction": "Sync DNS" }, "domainWellKnown": { - "title": "Well-Known locations of {{ domain }}" + "title": "Well-Known Locations of {{ domain }}" }, "tooltipWellKnown": "Well-Known locations", "emptyPlaceholder": "No Domains", @@ -844,7 +845,7 @@ "diskSpace": "Low disk space" }, "settingsDialog": { - "description": "An email will be sent for the selected events to your primary email address." + "description": "An email will be sent for the selected events to your primary email." }, "allCaughtUp": "All caught up" }, diff --git a/dashboard/public/translation/es.json b/dashboard/public/translation/es.json index a6ff88c94..771a47c70 100644 --- a/dashboard/public/translation/es.json +++ b/dashboard/public/translation/es.json @@ -397,7 +397,6 @@ "disable2FAAction": "Deshabilita 2FA", "changePasswordAction": "Cambiar contraseña", "createApiToken": { - "generateToken": "Generar Token API", "copyNow": "Por favor copia el token API ahora. No se volverá a mostrar por motivos de seguridad.", "description": "Nuevo token API:", "name": "Nombre del Token API", @@ -406,7 +405,6 @@ "allowedIpRanges": "Rango(s) de IP permitido(s)" }, "createAppPassword": { - "generatePassword": "Generar contraseña", "copyNow": "Copia la contraseña ahora. No se volverá a mostrar por motivos de seguridad.", "description": "Utiliza la siguiente contraseña para autentificarte en la aplicación:", "app": "Aplicación", diff --git a/dashboard/public/translation/fr.json b/dashboard/public/translation/fr.json index cc21c1a44..74eb79d8c 100644 --- a/dashboard/public/translation/fr.json +++ b/dashboard/public/translation/fr.json @@ -228,7 +228,6 @@ }, "createAppPassword": { "copyNow": "Veillez à copier le mot de passe maintenant. Il ne s'affichera plus pour des raisons de sécurité.", - "generatePassword": "Générer un mot de passe", "app": "Application", "name": "Nom du mot de passe", "title": "Créer un mot de passe d'application", @@ -247,7 +246,6 @@ "createApiToken": { "name": "Nom du jeton API", "description": "Nouveau jeton API :", - "generateToken": "Générer un jeton API", "title": "Créer un jeton API", "copyNow": "Veillez à copier le jeton API maintenant. Il ne s'affichera plus pour des raisons de sécurité.", "access": "Accès API" diff --git a/dashboard/public/translation/it.json b/dashboard/public/translation/it.json index 69167e0e2..dff06a750 100644 --- a/dashboard/public/translation/it.json +++ b/dashboard/public/translation/it.json @@ -587,14 +587,12 @@ "disable2FAAction": "Disabilita 2FA", "changePasswordAction": "Cambia Password", "createApiToken": { - "generateToken": "Genera Token API", "copyNow": "Copia il token API ora. Non verrà mostrato di nuovo per motivi di sicurezza.", "description": "Nuovo token API:", "name": "Nome Token API", "title": "Crea Token API" }, "createAppPassword": { - "generatePassword": "Genera Password", "copyNow": "Copia la password adesso. Non verrà mostrata di nuovo per motivi di sicurezza.", "description": "Usa la seguente password per autenticarti con l'app:", "name": "Nome password", diff --git a/dashboard/public/translation/nl.json b/dashboard/public/translation/nl.json index 6bb157b0f..4e19a926a 100644 --- a/dashboard/public/translation/nl.json +++ b/dashboard/public/translation/nl.json @@ -311,14 +311,12 @@ "title": "App wachtwoord aanmaken", "app": "App", "description": "Het volgende wachtwoord is gegenereerd voor de app:", - "generatePassword": "Genereer wachtwoord", "name": "Beschrijving van het wachtwoord", "copyNow": "Let op: kopieer het wachtwoord nu, vanwege veiligheidsredenen wordt het nooit meer getoond." }, "createApiToken": { "title": "API Token aanmaken", "name": "API Token Naam", - "generateToken": "Genereer API Token", "description": "Nieuwe API token:", "copyNow": "Let op: kopieer de API token nu, vanwege veiligheidsredenen wordt het nooit meer getoond.", "access": "API toegang", diff --git a/dashboard/public/translation/pt.json b/dashboard/public/translation/pt.json index 4084786f6..193f0b4d9 100644 --- a/dashboard/public/translation/pt.json +++ b/dashboard/public/translation/pt.json @@ -131,7 +131,6 @@ "allowedIpRangesPlaceholder": "IPs ou sub-redes separados por vírgulas" }, "createAppPassword": { - "generatePassword": "Gerar Palavra-passe", "name": "Nome da Palavra-passe", "title": "Criar Palavra-passe da Aplicação", "app": "Aplicação", @@ -142,7 +141,6 @@ "name": "Nome do Código de API", "title": "Criar Código de API", "description": "Novo código de API:", - "generateToken": "Gerar Código de API", "access": "Acesso de API", "copyNow": "Por favor, copie o código da API agora. Este não será mostrado novamente por motivos de segurança.", "allowedIpRanges": "Intervalo(s) de IP Permitido(s)" diff --git a/dashboard/public/translation/ru.json b/dashboard/public/translation/ru.json index ccb050b87..16d431b6b 100644 --- a/dashboard/public/translation/ru.json +++ b/dashboard/public/translation/ru.json @@ -312,7 +312,6 @@ "name": "Имя пароля", "app": "Приложение", "description": "Используйте этот пароль для аутентификации в приложении:", - "generatePassword": "Сгенерировать пароль", "copyNow": "Пожалуйста, скопируйте сгенерированный пароль. Он не будет показан снова из соображений безопасности." }, "createApiToken": { @@ -320,7 +319,6 @@ "title": "Создать API Токен", "name": "Имя API Токена", "description": "Новый API Токен:", - "generateToken": "Сгенерировать API Токен", "access": "API доступ", "allowedIpRanges": "Разрешённые диапазоны IP" }, diff --git a/dashboard/public/translation/vi.json b/dashboard/public/translation/vi.json index c2f746815..7c5d83fcb 100644 --- a/dashboard/public/translation/vi.json +++ b/dashboard/public/translation/vi.json @@ -258,7 +258,6 @@ "title": "Tạo mật khẩu app", "name": "Tên cho mật khẩu", "app": "App", - "generatePassword": "Tạo mật khẩu", "copyNow": "Xin copy mật khẩu này bây giờ. Nó sẽ không được hiển thị lại vì lý do an ninh.", "description": "Sử dụng mật khẩu sau để xác minh cho app:" }, @@ -266,7 +265,6 @@ "title": "Tạo mã API", "description": "Mã API mới:", "copyNow": "Xin copy mã API này bây giờ. Nó sẽ không được hiển thị lại vì lý do an ninh.", - "generateToken": "Tạo mã API", "name": "Tên cho mã API", "access": "Truy cập API", "allowedIpRanges": "Dãy IP cho phép" diff --git a/dashboard/public/translation/zh_Hans.json b/dashboard/public/translation/zh_Hans.json index e1c86cff7..79ed86936 100644 --- a/dashboard/public/translation/zh_Hans.json +++ b/dashboard/public/translation/zh_Hans.json @@ -28,15 +28,13 @@ "name": "密码名称", "app": "应用", "description": "使用下面的密码来登录该应用:", - "copyNow": "请复制这个密码。出于安全考虑,这个密码以后无法再显示。", - "generatePassword": "生成密码" + "copyNow": "请复制这个密码。出于安全考虑,这个密码以后无法再显示。" }, "createApiToken": { "title": "创建 API Token", "name": "API Token 名称", "description": "新 API Token:", - "copyNow": "请复制 API Token。出于安全考虑,这个 API Token 未来不会再显示。", - "generateToken": "生成 API Token" + "copyNow": "请复制 API Token。出于安全考虑,这个 API Token 未来不会再显示。" }, "changePasswordAction": "修改密码", "disable2FAAction": "停用双因素验证", diff --git a/dashboard/src/components/ApiTokens.vue b/dashboard/src/components/ApiTokens.vue index cca928939..1d7a661d8 100644 --- a/dashboard/src/components/ApiTokens.vue +++ b/dashboard/src/components/ApiTokens.vue @@ -101,7 +101,8 @@ function onReset() { async function onRevokeToken(apiToken) { const yes = await inputDialog.value.confirm({ - message: t('profile.removeApiToken.title', { name: apiToken.name }), + 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') @@ -128,7 +129,7 @@ onMounted(async () => { { {
-

{{ $t('appstore.category.popular') }}

+

{{ $t('appstore.category.popular') }}

-

{{ $t('appstore.category.all') }}

+

{{ $t('appstore.category.all') }}

diff --git a/dashboard/src/views/DomainsView.vue b/dashboard/src/views/DomainsView.vue index afe169501..14371ef93 100644 --- a/dashboard/src/views/DomainsView.vue +++ b/dashboard/src/views/DomainsView.vue @@ -42,10 +42,12 @@ const inputDialog = useTemplateRef('inputDialog'); async function onRemove(domain) { const yes = await inputDialog.value.confirm({ - message: t('domains.removeDialog.title', { domain: domain.domain }), + title: t('domains.removeDialog.title'), + message: t('domains.removeDialog.description', { domain: domain.domain }), confirmStyle: 'danger', confirmLabel: t('domains.removeDialog.removeAction'), - rejectLabel: t('main.dialog.cancel') + rejectLabel: t('main.dialog.cancel'), + rejectStyle: 'secondary' }); if (!yes) return;