Skip to content

Commit 7ee2147

Browse files
fix(dashboard): i18n aria-labels and title attributes for 3 pages (#3195)
Replace hardcoded English strings in aria-label and title attributes with t() calls for SessionDetailPage (12), AuthKeysPage (3), and PipelineDetailPage (1). Adds translation keys to both en.ts and it.ts catalogs. Closes #3194 — Daedalus 🏛️ Co-authored-by: aegis-gh-agent[bot] <272581873+aegis-gh-agent[bot]@users.noreply.github.com>
1 parent b2ee966 commit 7ee2147

5 files changed

Lines changed: 46 additions & 19 deletions

File tree

dashboard/src/i18n/en.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export const en = {
7070
noSteps: 'No steps yet',
7171
loadingPipeline: 'Loading pipeline…',
7272
failedFetch: 'Failed to fetch pipeline',
73+
pipelineBreadcrumb: 'Pipeline breadcrumb',
7374
statusLabel: 'Status',
7475
sessionLabel: 'Session',
7576
createdLabel: 'Created',
@@ -163,6 +164,9 @@ export const en = {
163164
hideSecret: 'Hide secret',
164165
revealSecret: 'Reveal secret',
165166
copySecret: 'Copy secret',
167+
authDismissBanner: 'Dismiss banner',
168+
authToggleSecret: 'Toggle secret visibility',
169+
authCopySecret: 'Copy secret to clipboard',
166170
existingKeys: 'Existing Keys',
167171
keysConfigured: '{count} key(s) configured',
168172
noAuthKeysYet: 'No auth keys yet',
@@ -386,6 +390,16 @@ export const en = {
386390
approveFailed: 'Approve failed',
387391
rejectFailed: 'Reject failed',
388392
interruptFailed: 'Interrupt failed',
393+
// Session action aria-labels
394+
sessionSlashCommand: 'Slash command',
395+
sessionCaptureScreenshot: 'Capture screenshot',
396+
sessionSendEscape: 'Send Escape to session',
397+
sessionInterruptCtrlC: 'Interrupt session with Ctrl+C',
398+
sessionSendMessage: 'Send message',
399+
sessionSendMessageCmd: 'Send message (⌘↵)',
400+
sessionInsertSlashCommand: 'Insert slash command',
401+
sessionInsertSlashCommandInput: 'Insert selected slash command into the message input',
402+
sessionSendSlashCommand: 'Send selected slash command immediately',
389403
escapeFailed: 'Escape failed',
390404
sendFailed: 'Failed to send message',
391405
sendSlashFailed: 'Failed to send slash command',

dashboard/src/i18n/it.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export const it = {
7272
noSteps: 'Nessun passo ancora',
7373
loadingPipeline: 'Caricamento pipeline…',
7474
failedFetch: 'Impossibile recuperare la pipeline',
75+
pipelineBreadcrumb: 'Navigazione pipeline',
7576
statusLabel: 'Stato',
7677
sessionLabel: 'Sessione',
7778
createdLabel: 'Creata',
@@ -166,6 +167,9 @@ export const it = {
166167
hideSecret: 'Nascondi segreto',
167168
revealSecret: 'Rivela segreto',
168169
copySecret: 'Copia segreto',
170+
authDismissBanner: 'Chiudi banner',
171+
authToggleSecret: 'Mostra/nascondi chiave segreta',
172+
authCopySecret: 'Copia chiave segreta negli appunti',
169173
existingKeys: 'Chiavi Esistenti',
170174
keysConfigured: '{count} chiave/i configurata/e',
171175
noAuthKeysYet: 'Nessuna chiave API ancora',
@@ -389,6 +393,15 @@ export const it = {
389393
approveFailed: 'Approvazione fallita',
390394
rejectFailed: 'Rifiuto fallito',
391395
interruptFailed: 'Interruzione fallita',
396+
sessionSlashCommand: 'Comando slash',
397+
sessionCaptureScreenshot: 'Cattura screenshot',
398+
sessionSendEscape: 'Invia Escape alla sessione',
399+
sessionInterruptCtrlC: 'Interrompi sessione con Ctrl+C',
400+
sessionSendMessage: 'Invia messaggio',
401+
sessionSendMessageCmd: 'Invia messaggio (⌘↵)',
402+
sessionInsertSlashCommand: 'Inserisci comando slash',
403+
sessionInsertSlashCommandInput: 'Inserisci il comando slash selezionato nel campo messaggio',
404+
sessionSendSlashCommand: 'Invia il comando slash selezionato immediatamente',
392405
escapeFailed: 'Escape fallito',
393406
sendFailed: 'Impossibile inviare il messaggio',
394407
sendSlashFailed: 'Impossibile inviare il comando slash',

dashboard/src/pages/AuthKeysPage.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ export default function AuthKeysPage() {
222222
<button
223223
type="button"
224224
onClick={dismissUsersBanner}
225-
aria-label="Dismiss banner"
225+
aria-label={t('authKeys.authDismissBanner')}
226226
className="shrink-0 rounded p-1 text-slate-400 transition-colors hover:bg-slate-700/40 hover:text-slate-200"
227227
>
228228
<X className="h-3.5 w-3.5" />
@@ -330,7 +330,7 @@ export default function AuthKeysPage() {
330330
type="button"
331331
onClick={() => setSecretVisible((current) => !current)}
332332
className="flex min-h-[40px] items-center gap-2 rounded border border-[var(--color-void-lighter)] bg-[var(--color-void)] px-3 py-2 text-xs font-medium text-[var(--color-text-primary)] transition-colors hover:border-[var(--color-accent-cyan)]/30 hover:text-[var(--color-accent-cyan)]"
333-
aria-label="Toggle secret visibility"
333+
aria-label={t('authKeys.authToggleSecret')}
334334
>
335335
{secretVisible ? <EyeOff className="h-3.5 w-3.5" /> : <Eye className="h-3.5 w-3.5" />}
336336
{secretVisible ? t('authKeys.hideSecret') : t('authKeys.revealSecret')}
@@ -339,7 +339,7 @@ export default function AuthKeysPage() {
339339
type="button"
340340
onClick={() => void handleCopySecret()}
341341
className="flex min-h-[40px] items-center gap-2 rounded border border-[var(--color-void-lighter)] bg-[var(--color-void)] px-3 py-2 text-xs font-medium text-[var(--color-text-primary)] transition-colors hover:border-[var(--color-accent-cyan)]/30 hover:text-[var(--color-accent-cyan)]"
342-
aria-label="Copy secret to clipboard"
342+
aria-label={t('authKeys.authCopySecret')}
343343
>
344344
<Copy className="h-3.5 w-3.5" />
345345
{t('authKeys.copySecret')}

dashboard/src/pages/PipelineDetailPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ export default function PipelineDetailPage() {
120120
return (
121121
<div className="flex flex-col gap-6">
122122
{/* Breadcrumb */}
123-
<nav className="text-xs text-[var(--color-text-muted)] flex items-center gap-1" aria-label="Pipeline breadcrumb">
123+
<nav className="text-xs text-[var(--color-text-muted)] flex items-center gap-1" aria-label={t('pipelines.pipelineBreadcrumb')}>
124124
<Link to="/pipelines" className="hover:text-[var(--color-accent-cyan)] transition-colors">
125125
{t('pipelines.title')}
126126
</Link>

dashboard/src/pages/SessionDetailPage.tsx

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ export default function SessionDetailPage() {
498498
onClick={handleInsertSlashCommand}
499499
disabled={slashSending || !h.alive}
500500
className={buttonClass}
501-
title="Insert selected slash command into the message input"
501+
title={t('sessionDetail.sessionInsertSlashCommandInput')}
502502
>
503503
{t('sessionDetail.insertSlash')}
504504
</button>
@@ -508,7 +508,7 @@ export default function SessionDetailPage() {
508508
onClick={handleSendSlashCommand}
509509
disabled={slashSending || !h.alive}
510510
className={accentButtonClass}
511-
title="Send selected slash command immediately"
511+
title={t('sessionDetail.sessionSendSlashCommand')}
512512
>
513513
{slashSending ? t('sessionDetail.sendingSlash') : t('sessionDetail.runSlash')}
514514
</button>
@@ -519,7 +519,7 @@ export default function SessionDetailPage() {
519519
onClick={handleCaptureScreenshot}
520520
disabled={capturingScreenshot || !h.alive}
521521
className={buttonClass}
522-
title="Capture screenshot"
522+
title={t('sessionDetail.sessionCaptureScreenshot')}
523523
>
524524
{capturingScreenshot ? t('sessionDetail.capturing') : t('sessionDetail.screenshot')}
525525
</button>
@@ -532,7 +532,7 @@ export default function SessionDetailPage() {
532532
onClick={handleInterrupt}
533533
aria-label={t('sessionDetail.interrupt')}
534534
className={buttonClass}
535-
title="Interrupt (Ctrl+C)"
535+
title={t('sessionDetail.sessionInterruptCtrlC')}
536536
>
537537
{t('sessionDetail.interrupt')}
538538
</button>
@@ -541,7 +541,7 @@ export default function SessionDetailPage() {
541541
onClick={handleEscape}
542542
aria-label={t('sessionDetail.escape')}
543543
className={buttonClass}
544-
title="Send Escape"
544+
title={t('sessionDetail.sessionSendEscape')}
545545
>
546546
{t('sessionDetail.escape')}
547547
</button>
@@ -820,43 +820,43 @@ export default function SessionDetailPage() {
820820
<div className="flex items-center gap-1">
821821
<button
822822
type="button"
823-
title="Insert slash command"
823+
title={t('sessionDetail.sessionInsertSlashCommand')}
824824
onClick={() => { setMsgInput((v) => v || '/'); getVisibleMessageInput()?.focus(); }}
825825
disabled={!h.alive}
826826
className="inline-flex h-8 w-8 items-center justify-center rounded text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-void-lighter)] hover:text-[var(--color-text-primary)] disabled:opacity-30"
827-
aria-label="Slash command"
827+
aria-label={t('sessionDetail.sessionSlashCommand')}
828828
>
829829
<span className="text-sm font-mono font-bold">/</span>
830830
</button>
831831
{!screenshotUnsupported && (
832832
<button
833833
type="button"
834-
title="Capture screenshot"
834+
title={t('sessionDetail.sessionCaptureScreenshot')}
835835
onClick={handleCaptureScreenshot}
836836
disabled={capturingScreenshot || !h.alive}
837837
className="inline-flex h-8 w-8 items-center justify-center rounded text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-void-lighter)] hover:text-[var(--color-text-primary)] disabled:opacity-30"
838-
aria-label="Capture screenshot"
838+
aria-label={t('sessionDetail.sessionCaptureScreenshot')}
839839
>
840840
<span className="text-xs"></span>
841841
</button>
842842
)}
843843
<button
844844
type="button"
845-
title="Send Escape"
845+
title={t('sessionDetail.sessionSendEscape')}
846846
onClick={handleEscape}
847847
disabled={!h.alive}
848848
className="inline-flex h-8 items-center justify-center rounded px-1.5 text-[10px] font-mono text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-void-lighter)] hover:text-[var(--color-text-primary)] disabled:opacity-30"
849-
aria-label="Send Escape to session"
849+
aria-label={t('sessionDetail.sessionSendEscape')}
850850
>
851851
Esc
852852
</button>
853853
<button
854854
type="button"
855-
title="Interrupt (Ctrl+C)"
855+
title={t('sessionDetail.sessionInterruptCtrlC')}
856856
onClick={handleInterrupt}
857857
disabled={!h.alive}
858858
className="inline-flex h-8 items-center justify-center rounded px-1.5 text-[10px] font-mono text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-void-lighter)] hover:text-[var(--color-text-primary)] disabled:opacity-30"
859-
aria-label="Interrupt session with Ctrl+C"
859+
aria-label={t('sessionDetail.sessionInterruptCtrlC')}
860860
>
861861
^C
862862
</button>
@@ -882,7 +882,7 @@ export default function SessionDetailPage() {
882882
onClick={handleSend}
883883
disabled={sending || !msgInput.trim() || !h.alive}
884884
className="flex min-h-[44px] min-w-[44px] items-center justify-center rounded border border-[var(--color-cta-bg)]/50 bg-[var(--color-cta-bg)]/15 p-2.5 text-[var(--color-cta-bg)] transition-all hover:bg-[var(--color-cta-bg)]/30 disabled:cursor-not-allowed disabled:opacity-30"
885-
aria-label="Send message (⌘↵)"
885+
aria-label={t('sessionDetail.sessionSendMessageCmd')}
886886
>
887887
<Send className="h-4 w-4" />
888888
</button>
@@ -1014,7 +1014,7 @@ export default function SessionDetailPage() {
10141014
onClick={handleSend}
10151015
disabled={sending || !msgInput.trim() || !h.alive}
10161016
className="flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl border border-[var(--color-accent-cyan)]/30 bg-[var(--color-accent-cyan)]/10 p-3 text-[var(--color-accent-cyan)] transition-colors hover:bg-[var(--color-accent-cyan)]/20 disabled:cursor-not-allowed disabled:opacity-30"
1017-
aria-label="Send message"
1017+
aria-label={t('sessionDetail.sessionSendMessage')}
10181018
>
10191019
<Send className="h-4 w-4" />
10201020
</button>

0 commit comments

Comments
 (0)