i18n(dashboard): translate OAuth copy-code strings in all locales

The new oauth.copyCode/copyFailed keys existed only in en.ts, with
optional types and English literal fallbacks in OAuthLoginModal — so
non-English users got English strings on the device-code copy button.

Backfill translations in all 16 non-English locales, refresh the
updated oauth.description/notConnected copy (dashboard Login flow
mention) to match en.ts, make the two keys required in the
Translations interface, and drop the English fallbacks from the modal.
Verified with web tsc --noEmit (required keys enforce locale
completeness), vitest, and a web build.
This commit is contained in:
Shannon Sands 2026-07-09 14:39:03 +10:00 committed by kshitij
parent 3e24b16f56
commit ad8f103048
17 changed files with 80 additions and 38 deletions

View file

@ -300,17 +300,14 @@ export function OAuthLoginModal({ provider, onClose, onSuccess }: Props) {
<Copy className="h-4 w-4" />
)
}
aria-label={t.oauth.copyCode ?? "Copy code"}
aria-label={t.oauth.copyCode}
>
{copyStatus === "copied"
? t.oauth.copied
: (t.oauth.copyCode ?? "Copy code")}
{copyStatus === "copied" ? t.oauth.copied : t.oauth.copyCode}
</Button>
</div>
{copyStatus === "failed" && (
<p className="text-xs text-destructive">
{t.oauth.copyFailed ??
"Could not copy automatically. Select the code and copy it manually."}
{t.oauth.copyFailed}
</p>
)}
<a

View file

@ -446,16 +446,19 @@ export const af: Translations = {
oauth: {
title: "Verskaffer-aanmeldings (OAuth)",
providerLogins: "Verskaffer-aanmeldings (OAuth)",
description: "{connected} van {total} OAuth-verskaffers gekoppel. Aanmeldvloei loop tans via die CLI; klik Kopieer opdrag en plak in 'n terminaal om op te stel.",
description:
"{connected} van {total} OAuth-verskaffers gekoppel. Gebruik Meld aan vir vloeie wat die kontroleskerm ondersteun; CLI-opdragte bly beskikbaar vir eksterne of terugval-opstelling.",
connected: "Gekoppel",
expired: "Verval",
notConnected: "Nie gekoppel nie. Voer {command} uit in 'n terminaal.",
notConnected: "Nie gekoppel nie. Gebruik Meld aan indien beskikbaar, of voer {command} uit in 'n terminaal.",
runInTerminal: "in 'n terminaal.",
noProviders: "Geen OAuth-bekwame verskaffers opgespoor nie.",
login: "Meld aan",
disconnect: "Ontkoppel",
managedExternally: "Ekstern bestuur",
copied: "Gekopieer ✓",
copyCode: "Kopieer kode",
copyFailed: "Kon nie outomaties kopieer nie. Kies die kode en kopieer dit met die hand.",
cli: "Kopieer",
copyCliCommand: "Kopieer CLI-opdrag (vir ekstern / terugval)",
connect: "Koppel",

View file

@ -446,16 +446,19 @@ export const de: Translations = {
oauth: {
title: "Anbieter-Logins (OAuth)",
providerLogins: "Anbieter-Logins (OAuth)",
description: "{connected} von {total} OAuth-Anbietern verbunden. Login-Abläufe laufen derzeit über die CLI; klicke auf Befehl kopieren und füge ihn in ein Terminal ein, um einzurichten.",
description:
"{connected} von {total} OAuth-Anbietern verbunden. Nutze Anmelden für vom Dashboard unterstützte Abläufe; CLI-Befehle bleiben für externe oder Fallback-Einrichtung verfügbar.",
connected: "Verbunden",
expired: "Abgelaufen",
notConnected: "Nicht verbunden. Führe {command} in einem Terminal aus.",
notConnected: "Nicht verbunden. Nutze Anmelden, falls verfügbar, oder führe {command} in einem Terminal aus.",
runInTerminal: "in einem Terminal.",
noProviders: "Keine OAuth-fähigen Anbieter erkannt.",
login: "Anmelden",
disconnect: "Trennen",
managedExternally: "Extern verwaltet",
copied: "Kopiert ✓",
copyCode: "Code kopieren",
copyFailed: "Automatisches Kopieren fehlgeschlagen. Markiere den Code und kopiere ihn manuell.",
cli: "Kopieren",
copyCliCommand: "CLI-Befehl kopieren (für extern / Fallback)",
connect: "Verbinden",

View file

@ -447,16 +447,19 @@ export const es: Translations = {
oauth: {
title: "Inicios de sesión de proveedores (OAuth)",
providerLogins: "Inicios de sesión de proveedores (OAuth)",
description: "{connected} de {total} proveedores OAuth conectados. Los flujos de inicio de sesión actualmente se ejecutan a través de la CLI; haz clic en Copiar comando y pégalo en una terminal para configurar.",
description:
"{connected} de {total} proveedores OAuth conectados. Usa Iniciar sesión para los flujos compatibles con el panel; los comandos CLI siguen disponibles para configuración externa o de respaldo.",
connected: "Conectado",
expired: "Caducado",
notConnected: "No conectado. Ejecuta {command} en una terminal.",
notConnected: "No conectado. Usa Iniciar sesión si está disponible, o ejecuta {command} en una terminal.",
runInTerminal: "en una terminal.",
noProviders: "No se han detectado proveedores compatibles con OAuth.",
login: "Iniciar sesión",
disconnect: "Desconectar",
managedExternally: "Gestionado externamente",
copied: "Copiado ✓",
copyCode: "Copiar código",
copyFailed: "No se pudo copiar automáticamente. Selecciona el código y cópialo manualmente.",
cli: "Copiar",
copyCliCommand: "Copiar comando CLI (para externo / alternativa)",
connect: "Conectar",

View file

@ -447,16 +447,19 @@ export const fr: Translations = {
oauth: {
title: "Connexions fournisseurs (OAuth)",
providerLogins: "Connexions fournisseurs (OAuth)",
description: "{connected} sur {total} fournisseurs OAuth connectés. Les flux de connexion s'exécutent actuellement via le CLI ; cliquez sur Copier la commande et collez-la dans un terminal pour configurer.",
description:
"{connected} sur {total} fournisseurs OAuth connectés. Utilisez Connexion pour les flux pris en charge par le tableau de bord ; les commandes CLI restent disponibles pour une configuration externe ou de secours.",
connected: "Connecté",
expired: "Expiré",
notConnected: "Non connecté. Exécutez {command} dans un terminal.",
notConnected: "Non connecté. Utilisez Connexion si disponible, ou exécutez {command} dans un terminal.",
runInTerminal: "dans un terminal.",
noProviders: "Aucun fournisseur compatible OAuth détecté.",
login: "Connexion",
disconnect: "Déconnecter",
managedExternally: "Géré en externe",
copied: "Copié ✓",
copyCode: "Copier le code",
copyFailed: "Copie automatique impossible. Sélectionnez le code et copiez-le manuellement.",
cli: "Copier",
copyCliCommand: "Copier la commande CLI (pour externe / repli)",
connect: "Connecter",

View file

@ -454,16 +454,19 @@ export const ga: Translations = {
oauth: {
title: "Logálacha isteach soláthraí (OAuth)",
providerLogins: "Logálacha isteach soláthraí (OAuth)",
description: "{connected} as {total} soláthraí OAuth ceangailte. Reáchtáiltear sreabha logála isteach faoi láthair tríd an CLI; cliceáil Cóipeáil ordú agus greamaigh i dteirminéal chun é a shocrú.",
description:
"{connected} as {total} soláthraí OAuth ceangailte. Úsáid Logáil isteach le haghaidh sreabha a dtacaíonn an deais leo; tá orduithe CLI ar fáil i gcónaí do shocrú seachtrach nó cúltaca.",
connected: "Ceangailte",
expired: "As feidhm",
notConnected: "Gan cheangal. Rith {command} i dteirminéal.",
notConnected: "Gan cheangal. Úsáid Logáil isteach má tá sé ar fáil, nó rith {command} i dteirminéal.",
runInTerminal: "i dteirminéal.",
noProviders: "Níor aimsíodh soláthraithe a thacaíonn le OAuth.",
login: "Logáil isteach",
disconnect: "Dícheangail",
managedExternally: "Bainistithe go seachtrach",
copied: "Cóipeáilte ✓",
copyCode: "Cóipeáil an cód",
copyFailed: "Níorbh fhéidir cóipeáil go huathoibríoch. Roghnaigh an cód agus cóipeáil de láimh é.",
cli: "Cóipeáil",
copyCliCommand: "Cóipeáil ordú CLI (le haghaidh úsáide seachtraí / cúltaca)",
connect: "Ceangail",

View file

@ -446,16 +446,19 @@ export const hu: Translations = {
oauth: {
title: "Szolgáltatói bejelentkezések (OAuth)",
providerLogins: "Szolgáltatói bejelentkezések (OAuth)",
description: "{connected} / {total} OAuth-szolgáltató csatlakoztatva. A bejelentkezési folyamat jelenleg a CLI-n keresztül fut; kattintson a Parancs másolása gombra, és illessze be egy terminálba a beállításhoz.",
description:
"{connected} / {total} OAuth-szolgáltató csatlakoztatva. Használja a Bejelentkezés gombot az irányítópult által támogatott folyamatokhoz; a CLI-parancsok továbbra is elérhetők külső vagy tartalék beállításhoz.",
connected: "Csatlakoztatva",
expired: "Lejárt",
notConnected: "Nincs csatlakoztatva. Futtassa a {command} parancsot egy terminálban.",
notConnected: "Nincs csatlakoztatva. Használja a Bejelentkezés gombot, ha elérhető, vagy futtassa a {command} parancsot egy terminálban.",
runInTerminal: "egy terminálban.",
noProviders: "Nem észlelhető OAuth-képes szolgáltató.",
login: "Bejelentkezés",
disconnect: "Lecsatlakozás",
managedExternally: "Külsőleg kezelt",
copied: "Másolva ✓",
copyCode: "Kód másolása",
copyFailed: "Nem sikerült automatikusan másolni. Jelölje ki a kódot, és másolja kézzel.",
cli: "Másolás",
copyCliCommand: "CLI-parancs másolása (külső / tartalék)",
connect: "Csatlakozás",

View file

@ -446,16 +446,19 @@ export const it: Translations = {
oauth: {
title: "Accessi provider (OAuth)",
providerLogins: "Accessi provider (OAuth)",
description: "{connected} di {total} provider OAuth connessi. I flussi di accesso vengono attualmente eseguiti tramite la CLI; clicca Copia comando e incolla in un terminale per configurare.",
description:
"{connected} di {total} provider OAuth connessi. Usa Accedi per i flussi supportati dalla dashboard; i comandi CLI restano disponibili per configurazioni esterne o di riserva.",
connected: "Connesso",
expired: "Scaduto",
notConnected: "Non connesso. Esegui {command} in un terminale.",
notConnected: "Non connesso. Usa Accedi se disponibile, oppure esegui {command} in un terminale.",
runInTerminal: "in un terminale.",
noProviders: "Nessun provider compatibile con OAuth rilevato.",
login: "Accedi",
disconnect: "Disconnetti",
managedExternally: "Gestito esternamente",
copied: "Copiato ✓",
copyCode: "Copia codice",
copyFailed: "Impossibile copiare automaticamente. Seleziona il codice e copialo manualmente.",
cli: "Copia",
copyCliCommand: "Copia comando CLI (per uso esterno / fallback)",
connect: "Connetti",

View file

@ -445,16 +445,19 @@ export const ja: Translations = {
oauth: {
title: "プロバイダーログイン (OAuth)",
providerLogins: "プロバイダーログイン (OAuth)",
description: "{connected} / {total} OAuth プロバイダーが接続されています。ログインフローは現在 CLI 経由で実行されます。「コマンドをコピー」をクリックして、ターミナルに貼り付けてセットアップしてください。",
description:
"{connected} / {total} OAuth プロバイダーが接続されています。ダッシュボード対応のフローには「ログイン」を使用してください。外部またはフォールバック用のセットアップには引き続き CLI コマンドを利用できます。",
connected: "接続済み",
expired: "期限切れ",
notConnected: "未接続です。ターミナルで {command} を実行してください。",
notConnected: "未接続です。可能な場合は「ログイン」を使用するか、ターミナルで {command} を実行してください。",
runInTerminal: "ターミナルで実行してください。",
noProviders: "OAuth 対応プロバイダーは検出されませんでした。",
login: "ログイン",
disconnect: "切断",
managedExternally: "外部で管理",
copied: "コピーしました ✓",
copyCode: "コードをコピー",
copyFailed: "自動でコピーできませんでした。コードを選択して手動でコピーしてください。",
cli: "コピー",
copyCliCommand: "CLI コマンドをコピー (外部 / フォールバック用)",
connect: "接続",

View file

@ -445,16 +445,19 @@ export const ko: Translations = {
oauth: {
title: "제공자 로그인 (OAuth)",
providerLogins: "제공자 로그인 (OAuth)",
description: "{connected}/{total} OAuth 제공자가 연결되었습니다. 로그인 흐름은 현재 CLI를 통해 실행됩니다. 명령 복사를 클릭하고 터미널에 붙여넣어 설정하세요.",
description:
"{connected}/{total} OAuth 제공자가 연결되었습니다. 대시보드에서 지원되는 흐름에는 로그인을 사용하세요. 외부 또는 대체 설정에는 CLI 명령을 계속 사용할 수 있습니다.",
connected: "연결됨",
expired: "만료됨",
notConnected: "연결되지 않음. 터미널에서 {command}을(를) 실행하세요.",
notConnected: "연결되지 않음. 가능하면 로그인을 사용하거나 터미널에서 {command}을(를) 실행하세요.",
runInTerminal: "터미널에서.",
noProviders: "OAuth를 지원하는 제공자가 감지되지 않았습니다.",
login: "로그인",
disconnect: "연결 해제",
managedExternally: "외부에서 관리됨",
copied: "복사됨 ✓",
copyCode: "코드 복사",
copyFailed: "자동으로 복사할 수 없습니다. 코드를 선택하여 직접 복사하세요.",
cli: "복사",
copyCliCommand: "CLI 명령 복사 (외부 / 대체용)",
connect: "연결",

View file

@ -447,16 +447,19 @@ export const pt: Translations = {
oauth: {
title: "Inícios de sessão de fornecedor (OAuth)",
providerLogins: "Inícios de sessão de fornecedor (OAuth)",
description: "{connected} de {total} fornecedores OAuth ligados. Os fluxos de início de sessão são executados via CLI; clique em Copiar comando e cole num terminal para configurar.",
description:
"{connected} de {total} fornecedores OAuth ligados. Use Iniciar sessão para fluxos suportados pelo painel; os comandos CLI continuam disponíveis para configuração externa ou de recurso.",
connected: "Ligado",
expired: "Expirado",
notConnected: "Não ligado. Execute {command} num terminal.",
notConnected: "Não ligado. Use Iniciar sessão quando disponível, ou execute {command} num terminal.",
runInTerminal: "num terminal.",
noProviders: "Não foram detetados fornecedores compatíveis com OAuth.",
login: "Iniciar sessão",
disconnect: "Desligar",
managedExternally: "Gerido externamente",
copied: "Copiado ✓",
copyCode: "Copiar código",
copyFailed: "Não foi possível copiar automaticamente. Selecione o código e copie-o manualmente.",
cli: "Copiar",
copyCliCommand: "Copiar comando CLI (para externo / fallback)",
connect: "Ligar",

View file

@ -446,16 +446,19 @@ export const ru: Translations = {
oauth: {
title: "Входы провайдеров (OAuth)",
providerLogins: "Входы провайдеров (OAuth)",
description: "Подключено {connected} из {total} OAuth-провайдеров. Процесс входа в настоящее время выполняется через CLI; нажмите «Скопировать команду» и вставьте в терминал для настройки.",
description:
"Подключено {connected} из {total} OAuth-провайдеров. Используйте «Войти» для процессов, поддерживаемых панелью; команды CLI остаются доступными для внешней или резервной настройки.",
connected: "Подключено",
expired: "Срок истёк",
notConnected: "Не подключено. Выполните {command} в терминале.",
notConnected: "Не подключено. Используйте «Войти», если доступно, или выполните {command} в терминале.",
runInTerminal: "в терминале.",
noProviders: "OAuth-совместимые провайдеры не обнаружены.",
login: "Войти",
disconnect: "Отключить",
managedExternally: "Управляется извне",
copied: "Скопировано ✓",
copyCode: "Скопировать код",
copyFailed: "Не удалось скопировать автоматически. Выделите код и скопируйте его вручную.",
cli: "Копировать",
copyCliCommand: "Скопировать CLI-команду (для внешнего / резервного варианта)",
connect: "Подключить",

View file

@ -446,16 +446,19 @@ export const tr: Translations = {
oauth: {
title: "Sağlayıcı Girişleri (OAuth)",
providerLogins: "Sağlayıcı Girişleri (OAuth)",
description: "{connected}/{total} OAuth sağlayıcısı bağlandı. Giriş akışları şu anda CLI üzerinden çalışır; Komutu kopyala'ya tıklayın ve kurmak için bir terminale yapıştırın.",
description:
"{connected}/{total} OAuth sağlayıcısı bağlandı. Panel destekli akışlar için Giriş'i kullanın; CLI komutları harici veya yedek kurulum için kullanılabilir.",
connected: "Bağlandı",
expired: "Süresi doldu",
notConnected: "Bağlı değil. Bir terminalde {command} komutunu çalıştırın.",
notConnected: "Bağlı değil. Mümkünse Giriş'i kullanın veya bir terminalde {command} komutunu çalıştırın.",
runInTerminal: "bir terminalde.",
noProviders: "OAuth uyumlu sağlayıcı algılanmadı.",
login: "Giriş",
disconnect: "Bağlantıyı kes",
managedExternally: "Harici olarak yönetiliyor",
copied: "Kopyalandı ✓",
copyCode: "Kodu kopyala",
copyFailed: "Otomatik olarak kopyalanamadı. Kodu seçip elle kopyalayın.",
cli: "Kopyala",
copyCliCommand: "CLI komutunu kopyala (harici / yedek için)",
connect: "Bağlan",

View file

@ -530,8 +530,8 @@ export interface Translations {
disconnect: string;
managedExternally: string;
copied: string;
copyCode?: string;
copyFailed?: string;
copyCode: string;
copyFailed: string;
cli: string;
copyCliCommand: string;
connect: string;

View file

@ -447,16 +447,19 @@ export const uk: Translations = {
oauth: {
title: "Входи постачальників (OAuth)",
providerLogins: "Входи постачальників (OAuth)",
description: "Підключено {connected} з {total} постачальників OAuth. Процеси входу наразі виконуються через CLI; натисніть «Скопіювати команду» та вставте у термінал, щоб налаштувати.",
description:
"Підключено {connected} з {total} постачальників OAuth. Використовуйте «Увійти» для процесів, підтримуваних панеллю; команди CLI залишаються доступними для зовнішнього або резервного налаштування.",
connected: "Підключено",
expired: "Прострочено",
notConnected: "Не підключено. Виконайте {command} у терміналі.",
notConnected: "Не підключено. Використовуйте «Увійти», якщо доступно, або виконайте {command} у терміналі.",
runInTerminal: "у терміналі.",
noProviders: "Не виявлено постачальників із підтримкою OAuth.",
login: "Увійти",
disconnect: "Відключити",
managedExternally: "Керується ззовні",
copied: "Скопійовано ✓",
copyCode: "Скопіювати код",
copyFailed: "Не вдалося скопіювати автоматично. Виділіть код і скопіюйте його вручну.",
cli: "Копіювати",
copyCliCommand: "Скопіювати CLI-команду (для зовнішнього / резервного варіанту)",
connect: "Підключити",

View file

@ -445,16 +445,19 @@ export const zhHant: Translations = {
oauth: {
title: "提供者登入OAuth",
providerLogins: "提供者登入OAuth",
description: "已連線 {connected}/{total} 個 OAuth 提供者。登入流程目前透過 CLI 執行;請點擊「複製指令」並貼到終端機完成設定。",
description:
"已連線 {connected}/{total} 個 OAuth 提供者。儀表板支援的流程請使用「登入」CLI 指令仍可用於外部或備用設定。",
connected: "已連線",
expired: "已過期",
notConnected: "未連線。在終端機執行 {command}。",
notConnected: "未連線。可用時請使用「登入」,或在終端機執行 {command}。",
runInTerminal: "於終端機。",
noProviders: "未偵測到支援 OAuth 的提供者。",
login: "登入",
disconnect: "中斷連線",
managedExternally: "由外部管理",
copied: "已複製 ✓",
copyCode: "複製代碼",
copyFailed: "無法自動複製。請選取代碼並手動複製。",
cli: "複製",
copyCliCommand: "複製 CLI 指令(外部 / 備援用)",
connect: "連線",

View file

@ -440,16 +440,19 @@ export const zh: Translations = {
oauth: {
title: "提供商登录OAuth",
providerLogins: "提供商登录OAuth",
description: "已连接 {connected}/{total} 个 OAuth 提供商。登录流程目前通过 CLI 运行;点击「复制命令」并粘贴到终端中进行设置。",
description:
"已连接 {connected}/{total} 个 OAuth 提供商。仪表板支持的流程请使用「登录」CLI 命令仍可用于外部或备用设置。",
connected: "已连接",
expired: "已过期",
notConnected: "未连接。在终端中运行 {command}。",
notConnected: "未连接。可用时请使用「登录」,或在终端中运行 {command}。",
runInTerminal: "在终端中。",
noProviders: "未检测到支持 OAuth 的提供商。",
login: "登录",
disconnect: "断开连接",
managedExternally: "外部管理",
copied: "已复制 ✓",
copyCode: "复制代码",
copyFailed: "无法自动复制。请选中代码并手动复制。",
cli: "复制",
copyCliCommand: "复制 CLI 命令(用于外部/备用方式)",
connect: "连接",