Browse Source

fix(app): a11y translations

Adam 1 month ago
parent
commit
d9b9485019
39 changed files with 213 additions and 28 deletions
  1. 9 1
      packages/app/src/components/dialog-connect-provider.tsx
  2. 1 1
      packages/app/src/components/dialog-edit-project.tsx
  3. 1 1
      packages/app/src/components/dialog-select-server.tsx
  4. 10 6
      packages/app/src/components/prompt-input.tsx
  5. 7 1
      packages/app/src/components/session-context-usage.tsx
  6. 9 4
      packages/app/src/components/session/session-header.tsx
  7. 1 1
      packages/app/src/components/session/session-sortable-tab.tsx
  8. 1 1
      packages/app/src/components/session/session-sortable-terminal-tab.tsx
  9. 11 0
      packages/app/src/i18n/ar.ts
  10. 11 0
      packages/app/src/i18n/da.ts
  11. 11 0
      packages/app/src/i18n/de.ts
  12. 11 0
      packages/app/src/i18n/en.ts
  13. 11 0
      packages/app/src/i18n/es.ts
  14. 11 0
      packages/app/src/i18n/fr.ts
  15. 11 0
      packages/app/src/i18n/ja.ts
  16. 11 0
      packages/app/src/i18n/ko.ts
  17. 11 0
      packages/app/src/i18n/pl.ts
  18. 11 0
      packages/app/src/i18n/ru.ts
  19. 11 0
      packages/app/src/i18n/zh.ts
  20. 11 0
      packages/app/src/i18n/zht.ts
  21. 2 2
      packages/app/src/pages/layout.tsx
  22. 5 5
      packages/app/src/pages/session.tsx
  23. 3 1
      packages/ui/src/components/dialog.tsx
  24. 1 1
      packages/ui/src/components/image-preview.tsx
  25. 1 1
      packages/ui/src/components/list.tsx
  26. 3 1
      packages/ui/src/components/popover.tsx
  27. 3 1
      packages/ui/src/components/toast.tsx
  28. 2 0
      packages/ui/src/i18n/ar.ts
  29. 2 0
      packages/ui/src/i18n/da.ts
  30. 2 0
      packages/ui/src/i18n/de.ts
  31. 2 0
      packages/ui/src/i18n/en.ts
  32. 2 0
      packages/ui/src/i18n/es.ts
  33. 2 0
      packages/ui/src/i18n/fr.ts
  34. 2 0
      packages/ui/src/i18n/ja.ts
  35. 2 0
      packages/ui/src/i18n/ko.ts
  36. 2 0
      packages/ui/src/i18n/pl.ts
  37. 2 0
      packages/ui/src/i18n/ru.ts
  38. 2 0
      packages/ui/src/i18n/zh.ts
  39. 2 0
      packages/ui/src/i18n/zht.ts

+ 9 - 1
packages/app/src/components/dialog-connect-provider.tsx

@@ -144,7 +144,15 @@ export function DialogConnectProvider(props: { provider: string }) {
 
   return (
     <Dialog
-      title={<IconButton tabIndex={-1} icon="arrow-left" variant="ghost" onClick={goBack} aria-label="Go back" />}
+      title={
+        <IconButton
+          tabIndex={-1}
+          icon="arrow-left"
+          variant="ghost"
+          onClick={goBack}
+          aria-label={language.t("common.goBack")}
+        />
+      }
     >
       <div class="flex flex-col gap-6 px-2.5 pb-3">
         <div class="px-2.5 flex gap-4 items-center">

+ 1 - 1
packages/app/src/components/dialog-edit-project.tsx

@@ -193,7 +193,7 @@ export function DialogEditProject(props: { project: LocalProject }) {
                   {(color) => (
                     <button
                       type="button"
-                      aria-label={`Select ${color} color`}
+                      aria-label={language.t("dialog.project.edit.color.select", { color })}
                       aria-pressed={store.color === color}
                       classList={{
                         "flex items-center justify-center size-10 p-0.5 rounded-lg overflow-hidden transition-colors cursor-default": true,

+ 1 - 1
packages/app/src/components/dialog-select-server.tsx

@@ -158,7 +158,7 @@ export function DialogSelectServer() {
                   icon="circle-x"
                   variant="ghost"
                   class="bg-transparent transition-opacity shrink-0 hover:scale-110"
-                  aria-label="Remove server"
+                  aria-label={language.t("dialog.server.action.remove")}
                   onClick={(e) => {
                     e.stopPropagation()
                     handleRemove(i)

+ 10 - 6
packages/app/src/components/prompt-input.tsx

@@ -1487,7 +1487,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
                     variant="ghost"
                     class="h-6 w-6"
                     onClick={() => prompt.context.removeActive()}
-                    aria-label="Remove active file from context"
+                    aria-label={language.t("prompt.context.removeActiveFile")}
                   />
                 </div>
               )}
@@ -1525,7 +1525,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
                     variant="ghost"
                     class="h-6 w-6"
                     onClick={() => prompt.context.remove(item.key)}
-                    aria-label="Remove file from context"
+                    aria-label={language.t("prompt.context.removeFile")}
                   />
                 </div>
               )}
@@ -1558,7 +1558,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
                     type="button"
                     onClick={() => removeImageAttachment(attachment.id)}
                     class="absolute -top-1.5 -right-1.5 size-5 rounded-full bg-surface-raised-stronger-non-alpha border border-border-base flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity hover:bg-surface-raised-base-hover"
-                    aria-label="Remove attachment"
+                    aria-label={language.t("prompt.attachment.remove")}
                   >
                     <Icon name="close" class="size-3 text-text-weak" />
                   </button>
@@ -1691,7 +1691,11 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
                         "text-text-base": !permission.isAutoAccepting(params.id!, sdk.directory),
                         "hover:bg-surface-success-base": permission.isAutoAccepting(params.id!, sdk.directory),
                       }}
-                      aria-label="Toggle auto-accept permissions"
+                      aria-label={
+                        permission.isAutoAccepting(params.id!, sdk.directory)
+                          ? language.t("command.permissions.autoaccept.disable")
+                          : language.t("command.permissions.autoaccept.enable")
+                      }
                       aria-pressed={permission.isAutoAccepting(params.id!, sdk.directory)}
                     >
                       <Icon
@@ -1726,7 +1730,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
                     variant="ghost"
                     class="size-6"
                     onClick={() => fileInputRef.click()}
-                    aria-label="Attach file"
+                    aria-label={language.t("prompt.action.attachFile")}
                   >
                     <Icon name="photo" class="size-4.5" />
                   </Button>
@@ -1759,7 +1763,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
                 icon={working() ? "stop" : "arrow-up"}
                 variant="primary"
                 class="h-6 w-4.5"
-                aria-label={working() ? "Stop" : "Send message"}
+                aria-label={working() ? language.t("prompt.action.stop") : language.t("prompt.action.send")}
               />
             </Tooltip>
           </div>

+ 7 - 1
packages/app/src/components/session-context-usage.tsx

@@ -96,7 +96,13 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
         <Switch>
           <Match when={variant() === "indicator"}>{circle()}</Match>
           <Match when={true}>
-            <Button type="button" variant="ghost" class="size-6" onClick={openContext} aria-label="View context usage">
+            <Button
+              type="button"
+              variant="ghost"
+              class="size-6"
+              onClick={openContext}
+              aria-label={language.t("context.usage.view")}
+            >
               {circle()}
             </Button>
           </Match>

+ 9 - 4
packages/app/src/components/session/session-header.tsx

@@ -48,6 +48,7 @@ export function SessionHeader() {
   const currentSession = createMemo(() => sync.data.session.find((s) => s.id === params.id))
   const shareEnabled = createMemo(() => sync.data.config.share !== "disabled")
   const showShare = createMemo(() => shareEnabled() && !!currentSession())
+  const showReview = createMemo(() => !!currentSession())
   const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
   const view = createMemo(() => layout.view(sessionKey()))
 
@@ -135,7 +136,7 @@ export function SessionHeader() {
               type="button"
               class="hidden md:flex w-[320px] p-1 pl-1.5 items-center gap-2 justify-between rounded-md border border-border-weak-base bg-surface-raised-base transition-colors cursor-default hover:bg-surface-raised-base-hover focus:bg-surface-raised-base-hover active:bg-surface-raised-base-active"
               onClick={() => command.trigger("file.open")}
-              aria-label="Search files"
+              aria-label={language.t("session.header.searchFiles")}
             >
               <div class="flex min-w-0 flex-1 items-center gap-2 overflow-visible">
                 <Icon name="magnifying-glass" size="normal" class="icon-base shrink-0" />
@@ -185,7 +186,7 @@ export function SessionHeader() {
                       variant="ghost"
                       class="group/review-toggle size-6 p-0"
                       onClick={() => view().reviewPanel.toggle()}
-                      aria-label="Toggle review panel"
+                      aria-label={language.t("command.review.toggle")}
                       aria-expanded={view().reviewPanel.opened()}
                       aria-controls="review-panel"
                       tabIndex={showReview() ? 0 : -1}
@@ -219,7 +220,7 @@ export function SessionHeader() {
                     variant="ghost"
                     class="group/terminal-toggle size-6 p-0"
                     onClick={() => view().terminal.toggle()}
-                    aria-label="Toggle terminal"
+                    aria-label={language.t("command.terminal.toggle")}
                     aria-expanded={view().terminal.opened()}
                     aria-controls="terminal-panel"
                   >
@@ -323,7 +324,11 @@ export function SessionHeader() {
                         class="rounded-l-none"
                         onClick={copyLink}
                         disabled={state.unshare}
-                        aria-label="Copy share link"
+                        aria-label={
+                          state.copied
+                            ? language.t("session.share.copy.copied")
+                            : language.t("session.share.copy.copyLink")
+                        }
                       />
                     </Tooltip>
                   </Show>

+ 1 - 1
packages/app/src/components/session/session-sortable-tab.tsx

@@ -41,7 +41,7 @@ export function SortableTab(props: { tab: string; onTabClose: (tab: string) => v
                 icon="close"
                 variant="ghost"
                 onClick={() => props.onTabClose(props.tab)}
-                aria-label="Close tab"
+                aria-label={language.t("common.closeTab")}
               />
             </Tooltip>
           }

+ 1 - 1
packages/app/src/components/session/session-sortable-terminal-tab.tsx

@@ -139,7 +139,7 @@ export function SortableTerminalTab(props: { terminal: LocalPTY; onClose?: () =>
                 e.stopPropagation()
                 close()
               }}
-              aria-label="Close terminal"
+              aria-label={language.t("terminal.close")}
             />
           }
         >

+ 11 - 0
packages/app/src/i18n/ar.ts

@@ -153,6 +153,7 @@ export const dict = {
   "model.tooltip.context": "حد السياق {{limit}}",
 
   "common.search.placeholder": "بحث",
+  "common.goBack": "رجوع",
   "common.loading": "جارٍ التحميل",
   "common.loading.ellipsis": "...",
   "common.cancel": "إلغاء",
@@ -199,7 +200,10 @@ export const dict = {
   "prompt.slash.badge.custom": "مخصص",
   "prompt.context.active": "نشط",
   "prompt.context.includeActiveFile": "تضمين الملف النشط",
+  "prompt.context.removeActiveFile": "إزالة الملف النشط من السياق",
+  "prompt.context.removeFile": "إزالة الملف من السياق",
   "prompt.action.attachFile": "إرفاق ملف",
+  "prompt.attachment.remove": "إزالة المرفق",
   "prompt.action.send": "إرسال",
   "prompt.action.stop": "توقف",
 
@@ -243,6 +247,7 @@ export const dict = {
   "dialog.server.default.none": "لم يتم تحديد خادم",
   "dialog.server.default.set": "تعيين الخادم الحالي كافتراضي",
   "dialog.server.default.clear": "مسح",
+  "dialog.server.action.remove": "إزالة الخادم",
 
   "dialog.project.edit.title": "تحرير المشروع",
   "dialog.project.edit.name": "الاسم",
@@ -251,6 +256,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "انقر أو اسحب صورة",
   "dialog.project.edit.icon.recommended": "موصى به: 128x128px",
   "dialog.project.edit.color": "لون",
+  "dialog.project.edit.color.select": "اختر لون {{color}}",
 
   "context.breakdown.title": "تفصيل السياق",
   "context.breakdown.note": 'تفصيل تقريبي لرموز الإدخال. يشمل "أخرى" تعريفات الأدوات والنفقات العامة.',
@@ -284,6 +290,7 @@ export const dict = {
   "context.usage.usage": "استخدام",
   "context.usage.cost": "تكلفة",
   "context.usage.clickToView": "انقر لعرض السياق",
+  "context.usage.view": "عرض استخدام السياق",
 
   "language.en": "الإنجليزية",
   "language.zh": "الصينية (المبسطة)",
@@ -385,6 +392,7 @@ export const dict = {
   "session.tab.session": "جلسة",
   "session.tab.review": "مراجعة",
   "session.tab.context": "سياق",
+  "session.panel.reviewAndFiles": "المراجعة والملفات",
   "session.review.filesChanged": "تم تغيير {{count}} ملفات",
   "session.review.loadingChanges": "جارٍ تحميل التغييرات...",
   "session.review.empty": "لا توجد تغييرات في هذه الجلسة بعد",
@@ -402,6 +410,7 @@ export const dict = {
   "session.new.lastModified": "آخر تعديل",
 
   "session.header.search.placeholder": "بحث {{project}}",
+  "session.header.searchFiles": "بحث عن الملفات",
 
   "session.share.popover.title": "نشر على الويب",
   "session.share.popover.description.shared": "هذه الجلسة عامة على الويب. يمكن لأي شخص لديه الرابط الوصول إليها.",
@@ -422,6 +431,7 @@ export const dict = {
   "terminal.loading": "جارٍ تحميل المحطة الطرفية...",
   "terminal.title": "محطة طرفية",
   "terminal.title.numbered": "محطة طرفية {{number}}",
+  "terminal.close": "إغلاق المحطة الطرفية",
   "terminal.connectionLost.title": "فقد الاتصال",
   "terminal.connectionLost.description": "انقطع اتصال المحطة الطرفية. يمكن أن يحدث هذا عند إعادة تشغيل الخادم.",
 
@@ -439,6 +449,7 @@ export const dict = {
   "common.key.esc": "ESC",
 
   "sidebar.menu.toggle": "تبديل القائمة",
+  "sidebar.nav.projectsAndSessions": "المشاريع والجلسات",
   "sidebar.settings": "الإعدادات",
   "sidebar.help": "مساعدة",
   "sidebar.workspaces.enable": "تمكين مساحات العمل",

+ 11 - 0
packages/app/src/i18n/da.ts

@@ -136,6 +136,7 @@ export const dict = {
   "model.tag.latest": "Nyeste",
 
   "common.search.placeholder": "Søg",
+  "common.goBack": "Gå tilbage",
   "common.loading": "Indlæser",
   "common.cancel": "Annuller",
   "common.submit": "Indsend",
@@ -181,7 +182,10 @@ export const dict = {
   "prompt.slash.badge.custom": "brugerdefineret",
   "prompt.context.active": "aktiv",
   "prompt.context.includeActiveFile": "Inkluder aktiv fil",
+  "prompt.context.removeActiveFile": "Fjern aktiv fil fra kontekst",
+  "prompt.context.removeFile": "Fjern fil fra kontekst",
   "prompt.action.attachFile": "Vedhæft fil",
+  "prompt.attachment.remove": "Fjern vedhæftning",
   "prompt.action.send": "Send",
   "prompt.action.stop": "Stop",
 
@@ -225,6 +229,7 @@ export const dict = {
   "dialog.server.default.none": "Ingen server valgt",
   "dialog.server.default.set": "Sæt nuværende server som standard",
   "dialog.server.default.clear": "Ryd",
+  "dialog.server.action.remove": "Fjern server",
 
   "dialog.project.edit.title": "Rediger projekt",
   "dialog.project.edit.name": "Navn",
@@ -233,6 +238,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "Klik eller træk et billede",
   "dialog.project.edit.icon.recommended": "Anbefalet: 128x128px",
   "dialog.project.edit.color": "Farve",
+  "dialog.project.edit.color.select": "Vælg farven {{color}}",
 
   "context.breakdown.title": "Kontekstfordeling",
   "context.breakdown.note":
@@ -267,6 +273,7 @@ export const dict = {
   "context.usage.usage": "Forbrug",
   "context.usage.cost": "Omkostning",
   "context.usage.clickToView": "Klik for at se kontekst",
+  "context.usage.view": "Se kontekstforbrug",
 
   "language.en": "Engelsk",
   "language.zh": "Kinesisk (forenklet)",
@@ -369,6 +376,7 @@ export const dict = {
   "session.tab.session": "Session",
   "session.tab.review": "Gennemgang",
   "session.tab.context": "Kontekst",
+  "session.panel.reviewAndFiles": "Gennemgang og filer",
   "session.review.filesChanged": "{{count}} Filer ændret",
   "session.review.loadingChanges": "Indlæser ændringer...",
   "session.review.empty": "Ingen ændringer i denne session endnu",
@@ -385,6 +393,7 @@ export const dict = {
   "session.new.lastModified": "Sidst ændret",
 
   "session.header.search.placeholder": "Søg {{project}}",
+  "session.header.searchFiles": "Søg efter filer",
 
   "session.share.popover.title": "Udgiv på nettet",
   "session.share.popover.description.shared":
@@ -407,6 +416,7 @@ export const dict = {
   "terminal.loading": "Indlæser terminal...",
   "terminal.title": "Terminal",
   "terminal.title.numbered": "Terminal {{number}}",
+  "terminal.close": "Luk terminal",
 
   "common.closeTab": "Luk fane",
   "common.dismiss": "Afvis",
@@ -420,6 +430,7 @@ export const dict = {
   "common.edit": "Rediger",
   "common.loadMore": "Indlæs flere",
 
+  "sidebar.nav.projectsAndSessions": "Projekter og sessioner",
   "sidebar.settings": "Indstillinger",
   "sidebar.help": "Hjælp",
   "sidebar.workspaces.enable": "Aktiver arbejdsområder",

+ 11 - 0
packages/app/src/i18n/de.ts

@@ -140,6 +140,7 @@ export const dict = {
   "model.tag.latest": "Neueste",
 
   "common.search.placeholder": "Suchen",
+  "common.goBack": "Zurück",
   "common.loading": "Laden",
   "common.cancel": "Abbrechen",
   "common.submit": "Absenden",
@@ -185,7 +186,10 @@ export const dict = {
   "prompt.slash.badge.custom": "benutzerdefiniert",
   "prompt.context.active": "aktiv",
   "prompt.context.includeActiveFile": "Aktive Datei einbeziehen",
+  "prompt.context.removeActiveFile": "Aktive Datei aus dem Kontext entfernen",
+  "prompt.context.removeFile": "Datei aus dem Kontext entfernen",
   "prompt.action.attachFile": "Datei anhängen",
+  "prompt.attachment.remove": "Anhang entfernen",
   "prompt.action.send": "Senden",
   "prompt.action.stop": "Stopp",
 
@@ -230,6 +234,7 @@ export const dict = {
   "dialog.server.default.none": "Kein Server ausgewählt",
   "dialog.server.default.set": "Aktuellen Server als Standard setzen",
   "dialog.server.default.clear": "Löschen",
+  "dialog.server.action.remove": "Server entfernen",
 
   "dialog.project.edit.title": "Projekt bearbeiten",
   "dialog.project.edit.name": "Name",
@@ -238,6 +243,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "Klicken oder Bild ziehen",
   "dialog.project.edit.icon.recommended": "Empfohlen: 128x128px",
   "dialog.project.edit.color": "Farbe",
+  "dialog.project.edit.color.select": "{{color}}-Farbe auswählen",
 
   "context.breakdown.title": "Kontext-Aufschlüsselung",
   "context.breakdown.note":
@@ -272,6 +278,7 @@ export const dict = {
   "context.usage.usage": "Nutzung",
   "context.usage.cost": "Kosten",
   "context.usage.clickToView": "Klicken, um Kontext anzuzeigen",
+  "context.usage.view": "Kontextnutzung anzeigen",
 
   "language.en": "Englisch",
   "language.zh": "Chinesisch (Vereinfacht)",
@@ -376,6 +383,7 @@ export const dict = {
   "session.tab.session": "Sitzung",
   "session.tab.review": "Überprüfung",
   "session.tab.context": "Kontext",
+  "session.panel.reviewAndFiles": "Überprüfung und Dateien",
   "session.review.filesChanged": "{{count}} Dateien geändert",
   "session.review.loadingChanges": "Lade Änderungen...",
   "session.review.empty": "Noch keine Änderungen in dieser Sitzung",
@@ -392,6 +400,7 @@ export const dict = {
   "session.new.lastModified": "Zuletzt geändert",
 
   "session.header.search.placeholder": "{{project}} durchsuchen",
+  "session.header.searchFiles": "Dateien suchen",
 
   "session.share.popover.title": "Im Web veröffentlichen",
   "session.share.popover.description.shared":
@@ -414,6 +423,7 @@ export const dict = {
   "terminal.loading": "Lade Terminal...",
   "terminal.title": "Terminal",
   "terminal.title.numbered": "Terminal {{number}}",
+  "terminal.close": "Terminal schließen",
 
   "common.closeTab": "Tab schließen",
   "common.dismiss": "Verwerfen",
@@ -427,6 +437,7 @@ export const dict = {
   "common.edit": "Bearbeiten",
   "common.loadMore": "Mehr laden",
 
+  "sidebar.nav.projectsAndSessions": "Projekte und Sitzungen",
   "sidebar.settings": "Einstellungen",
   "sidebar.help": "Hilfe",
   "sidebar.workspaces.enable": "Arbeitsbereiche aktivieren",

+ 11 - 0
packages/app/src/i18n/en.ts

@@ -153,6 +153,7 @@ export const dict = {
   "model.tooltip.context": "Context limit {{limit}}",
 
   "common.search.placeholder": "Search",
+  "common.goBack": "Go back",
   "common.loading": "Loading",
   "common.loading.ellipsis": "...",
   "common.cancel": "Cancel",
@@ -199,7 +200,10 @@ export const dict = {
   "prompt.slash.badge.custom": "custom",
   "prompt.context.active": "active",
   "prompt.context.includeActiveFile": "Include active file",
+  "prompt.context.removeActiveFile": "Remove active file from context",
+  "prompt.context.removeFile": "Remove file from context",
   "prompt.action.attachFile": "Attach file",
+  "prompt.attachment.remove": "Remove attachment",
   "prompt.action.send": "Send",
   "prompt.action.stop": "Stop",
 
@@ -243,6 +247,7 @@ export const dict = {
   "dialog.server.default.none": "No server selected",
   "dialog.server.default.set": "Set current server as default",
   "dialog.server.default.clear": "Clear",
+  "dialog.server.action.remove": "Remove server",
 
   "dialog.project.edit.title": "Edit project",
   "dialog.project.edit.name": "Name",
@@ -251,6 +256,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "Click or drag an image",
   "dialog.project.edit.icon.recommended": "Recommended: 128x128px",
   "dialog.project.edit.color": "Color",
+  "dialog.project.edit.color.select": "Select {{color}} color",
 
   "context.breakdown.title": "Context Breakdown",
   "context.breakdown.note": 'Approximate breakdown of input tokens. "Other" includes tool definitions and overhead.',
@@ -284,6 +290,7 @@ export const dict = {
   "context.usage.usage": "Usage",
   "context.usage.cost": "Cost",
   "context.usage.clickToView": "Click to view context",
+  "context.usage.view": "View context usage",
 
   "language.en": "English",
   "language.zh": "Chinese (Simplified)",
@@ -386,6 +393,7 @@ export const dict = {
   "session.tab.session": "Session",
   "session.tab.review": "Review",
   "session.tab.context": "Context",
+  "session.panel.reviewAndFiles": "Review and files",
   "session.review.filesChanged": "{{count}} Files Changed",
   "session.review.loadingChanges": "Loading changes...",
   "session.review.empty": "No changes in this session yet",
@@ -403,6 +411,7 @@ export const dict = {
   "session.new.lastModified": "Last modified",
 
   "session.header.search.placeholder": "Search {{project}}",
+  "session.header.searchFiles": "Search files",
 
   "session.share.popover.title": "Publish on web",
   "session.share.popover.description.shared":
@@ -425,6 +434,7 @@ export const dict = {
   "terminal.loading": "Loading terminal...",
   "terminal.title": "Terminal",
   "terminal.title.numbered": "Terminal {{number}}",
+  "terminal.close": "Close terminal",
   "terminal.connectionLost.title": "Connection Lost",
   "terminal.connectionLost.description":
     "The terminal connection was interrupted. This can happen when the server restarts.",
@@ -443,6 +453,7 @@ export const dict = {
   "common.key.esc": "ESC",
 
   "sidebar.menu.toggle": "Toggle menu",
+  "sidebar.nav.projectsAndSessions": "Projects and sessions",
   "sidebar.settings": "Settings",
   "sidebar.help": "Help",
   "sidebar.workspaces.enable": "Enable workspaces",

+ 11 - 0
packages/app/src/i18n/es.ts

@@ -136,6 +136,7 @@ export const dict = {
   "model.tag.latest": "Último",
 
   "common.search.placeholder": "Buscar",
+  "common.goBack": "Volver",
   "common.loading": "Cargando",
   "common.cancel": "Cancelar",
   "common.submit": "Enviar",
@@ -181,7 +182,10 @@ export const dict = {
   "prompt.slash.badge.custom": "personalizado",
   "prompt.context.active": "activo",
   "prompt.context.includeActiveFile": "Incluir archivo activo",
+  "prompt.context.removeActiveFile": "Eliminar archivo activo del contexto",
+  "prompt.context.removeFile": "Eliminar archivo del contexto",
   "prompt.action.attachFile": "Adjuntar archivo",
+  "prompt.attachment.remove": "Eliminar adjunto",
   "prompt.action.send": "Enviar",
   "prompt.action.stop": "Detener",
 
@@ -225,6 +229,7 @@ export const dict = {
   "dialog.server.default.none": "Ningún servidor seleccionado",
   "dialog.server.default.set": "Establecer servidor actual como predeterminado",
   "dialog.server.default.clear": "Limpiar",
+  "dialog.server.action.remove": "Eliminar servidor",
 
   "dialog.project.edit.title": "Editar proyecto",
   "dialog.project.edit.name": "Nombre",
@@ -233,6 +238,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "Haz clic o arrastra una imagen",
   "dialog.project.edit.icon.recommended": "Recomendado: 128x128px",
   "dialog.project.edit.color": "Color",
+  "dialog.project.edit.color.select": "Seleccionar color {{color}}",
 
   "context.breakdown.title": "Desglose de Contexto",
   "context.breakdown.note":
@@ -267,6 +273,7 @@ export const dict = {
   "context.usage.usage": "Uso",
   "context.usage.cost": "Costo",
   "context.usage.clickToView": "Haz clic para ver contexto",
+  "context.usage.view": "Ver uso del contexto",
 
   "language.en": "Inglés",
   "language.zh": "Chino (simplificado)",
@@ -370,6 +377,7 @@ export const dict = {
   "session.tab.session": "Sesión",
   "session.tab.review": "Revisión",
   "session.tab.context": "Contexto",
+  "session.panel.reviewAndFiles": "Revisión y archivos",
   "session.review.filesChanged": "{{count}} Archivos Cambiados",
   "session.review.loadingChanges": "Cargando cambios...",
   "session.review.empty": "No hay cambios en esta sesión aún",
@@ -386,6 +394,7 @@ export const dict = {
   "session.new.lastModified": "Última modificación",
 
   "session.header.search.placeholder": "Buscar {{project}}",
+  "session.header.searchFiles": "Buscar archivos",
 
   "session.share.popover.title": "Publicar en web",
   "session.share.popover.description.shared":
@@ -408,6 +417,7 @@ export const dict = {
   "terminal.loading": "Cargando terminal...",
   "terminal.title": "Terminal",
   "terminal.title.numbered": "Terminal {{number}}",
+  "terminal.close": "Cerrar terminal",
 
   "common.closeTab": "Cerrar pestaña",
   "common.dismiss": "Descartar",
@@ -421,6 +431,7 @@ export const dict = {
   "common.edit": "Editar",
   "common.loadMore": "Cargar más",
 
+  "sidebar.nav.projectsAndSessions": "Proyectos y sesiones",
   "sidebar.settings": "Ajustes",
   "sidebar.help": "Ayuda",
   "sidebar.workspaces.enable": "Habilitar espacios de trabajo",

+ 11 - 0
packages/app/src/i18n/fr.ts

@@ -136,6 +136,7 @@ export const dict = {
   "model.tag.latest": "Dernier",
 
   "common.search.placeholder": "Rechercher",
+  "common.goBack": "Retour",
   "common.loading": "Chargement",
   "common.cancel": "Annuler",
   "common.submit": "Soumettre",
@@ -181,7 +182,10 @@ export const dict = {
   "prompt.slash.badge.custom": "personnalisé",
   "prompt.context.active": "actif",
   "prompt.context.includeActiveFile": "Inclure le fichier actif",
+  "prompt.context.removeActiveFile": "Retirer le fichier actif du contexte",
+  "prompt.context.removeFile": "Retirer le fichier du contexte",
   "prompt.action.attachFile": "Joindre un fichier",
+  "prompt.attachment.remove": "Supprimer la pièce jointe",
   "prompt.action.send": "Envoyer",
   "prompt.action.stop": "Arrêter",
 
@@ -225,6 +229,7 @@ export const dict = {
   "dialog.server.default.none": "Aucun serveur sélectionné",
   "dialog.server.default.set": "Définir le serveur actuel comme défaut",
   "dialog.server.default.clear": "Effacer",
+  "dialog.server.action.remove": "Supprimer le serveur",
 
   "dialog.project.edit.title": "Modifier le projet",
   "dialog.project.edit.name": "Nom",
@@ -233,6 +238,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "Cliquez ou faites glisser une image",
   "dialog.project.edit.icon.recommended": "Recommandé : 128x128px",
   "dialog.project.edit.color": "Couleur",
+  "dialog.project.edit.color.select": "Sélectionner la couleur {{color}}",
 
   "context.breakdown.title": "Répartition du contexte",
   "context.breakdown.note":
@@ -267,6 +273,7 @@ export const dict = {
   "context.usage.usage": "Utilisation",
   "context.usage.cost": "Coût",
   "context.usage.clickToView": "Cliquez pour voir le contexte",
+  "context.usage.view": "Voir l'utilisation du contexte",
 
   "language.en": "Anglais",
   "language.zh": "Chinois (simplifié)",
@@ -375,6 +382,7 @@ export const dict = {
   "session.tab.session": "Session",
   "session.tab.review": "Revue",
   "session.tab.context": "Contexte",
+  "session.panel.reviewAndFiles": "Revue et fichiers",
   "session.review.filesChanged": "{{count}} fichiers modifiés",
   "session.review.loadingChanges": "Chargement des modifications...",
   "session.review.empty": "Aucune modification dans cette session pour l'instant",
@@ -391,6 +399,7 @@ export const dict = {
   "session.new.lastModified": "Dernière modification",
 
   "session.header.search.placeholder": "Rechercher {{project}}",
+  "session.header.searchFiles": "Rechercher des fichiers",
 
   "session.share.popover.title": "Publier sur le web",
   "session.share.popover.description.shared":
@@ -413,6 +422,7 @@ export const dict = {
   "terminal.loading": "Chargement du terminal...",
   "terminal.title": "Terminal",
   "terminal.title.numbered": "Terminal {{number}}",
+  "terminal.close": "Fermer le terminal",
 
   "common.closeTab": "Fermer l'onglet",
   "common.dismiss": "Ignorer",
@@ -426,6 +436,7 @@ export const dict = {
   "common.edit": "Modifier",
   "common.loadMore": "Charger plus",
 
+  "sidebar.nav.projectsAndSessions": "Projets et sessions",
   "sidebar.settings": "Paramètres",
   "sidebar.help": "Aide",
   "sidebar.workspaces.enable": "Activer les espaces de travail",

+ 11 - 0
packages/app/src/i18n/ja.ts

@@ -135,6 +135,7 @@ export const dict = {
   "model.tag.latest": "最新",
 
   "common.search.placeholder": "検索",
+  "common.goBack": "戻る",
   "common.loading": "読み込み中",
   "common.cancel": "キャンセル",
   "common.submit": "送信",
@@ -180,7 +181,10 @@ export const dict = {
   "prompt.slash.badge.custom": "カスタム",
   "prompt.context.active": "アクティブ",
   "prompt.context.includeActiveFile": "アクティブなファイルを含める",
+  "prompt.context.removeActiveFile": "コンテキストからアクティブなファイルを削除",
+  "prompt.context.removeFile": "コンテキストからファイルを削除",
   "prompt.action.attachFile": "ファイルを添付",
+  "prompt.attachment.remove": "添付ファイルを削除",
   "prompt.action.send": "送信",
   "prompt.action.stop": "停止",
 
@@ -224,6 +228,7 @@ export const dict = {
   "dialog.server.default.none": "サーバーが選択されていません",
   "dialog.server.default.set": "現在のサーバーをデフォルトに設定",
   "dialog.server.default.clear": "クリア",
+  "dialog.server.action.remove": "サーバーを削除",
 
   "dialog.project.edit.title": "プロジェクトを編集",
   "dialog.project.edit.name": "名前",
@@ -232,6 +237,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "クリックまたは画像をドラッグ",
   "dialog.project.edit.icon.recommended": "推奨: 128x128px",
   "dialog.project.edit.color": "色",
+  "dialog.project.edit.color.select": "{{color}}の色を選択",
 
   "context.breakdown.title": "コンテキストの内訳",
   "context.breakdown.note": '入力トークンのおおよその内訳です。"その他"にはツールの定義やオーバーヘッドが含まれます。',
@@ -265,6 +271,7 @@ export const dict = {
   "context.usage.usage": "使用量",
   "context.usage.cost": "コスト",
   "context.usage.clickToView": "クリックしてコンテキストを表示",
+  "context.usage.view": "コンテキスト使用量を表示",
 
   "language.en": "英語",
   "language.zh": "中国語(簡体字)",
@@ -367,6 +374,7 @@ export const dict = {
   "session.tab.session": "セッション",
   "session.tab.review": "レビュー",
   "session.tab.context": "コンテキスト",
+  "session.panel.reviewAndFiles": "レビューとファイル",
   "session.review.filesChanged": "{{count}} ファイル変更",
   "session.review.loadingChanges": "変更を読み込み中...",
   "session.review.empty": "このセッションでの変更はまだありません",
@@ -383,6 +391,7 @@ export const dict = {
   "session.new.lastModified": "最終更新",
 
   "session.header.search.placeholder": "{{project}}を検索",
+  "session.header.searchFiles": "ファイルを検索",
 
   "session.share.popover.title": "ウェブで公開",
   "session.share.popover.description.shared":
@@ -405,6 +414,7 @@ export const dict = {
   "terminal.loading": "ターミナルを読み込み中...",
   "terminal.title": "ターミナル",
   "terminal.title.numbered": "ターミナル {{number}}",
+  "terminal.close": "ターミナルを閉じる",
 
   "common.closeTab": "タブを閉じる",
   "common.dismiss": "閉じる",
@@ -418,6 +428,7 @@ export const dict = {
   "common.edit": "編集",
   "common.loadMore": "さらに読み込む",
 
+  "sidebar.nav.projectsAndSessions": "プロジェクトとセッション",
   "sidebar.settings": "設定",
   "sidebar.help": "ヘルプ",
   "sidebar.workspaces.enable": "ワークスペースを有効化",

+ 11 - 0
packages/app/src/i18n/ko.ts

@@ -139,6 +139,7 @@ export const dict = {
   "model.tag.latest": "최신",
 
   "common.search.placeholder": "검색",
+  "common.goBack": "뒤로 가기",
   "common.loading": "로딩 중",
   "common.cancel": "취소",
   "common.submit": "제출",
@@ -184,7 +185,10 @@ export const dict = {
   "prompt.slash.badge.custom": "사용자 지정",
   "prompt.context.active": "활성",
   "prompt.context.includeActiveFile": "활성 파일 포함",
+  "prompt.context.removeActiveFile": "컨텍스트에서 활성 파일 제거",
+  "prompt.context.removeFile": "컨텍스트에서 파일 제거",
   "prompt.action.attachFile": "파일 첨부",
+  "prompt.attachment.remove": "첨부 파일 제거",
   "prompt.action.send": "전송",
   "prompt.action.stop": "중지",
 
@@ -228,6 +232,7 @@ export const dict = {
   "dialog.server.default.none": "선택된 서버 없음",
   "dialog.server.default.set": "현재 서버를 기본값으로 설정",
   "dialog.server.default.clear": "지우기",
+  "dialog.server.action.remove": "서버 제거",
 
   "dialog.project.edit.title": "프로젝트 편집",
   "dialog.project.edit.name": "이름",
@@ -236,6 +241,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "이미지를 클릭하거나 드래그하세요",
   "dialog.project.edit.icon.recommended": "권장: 128x128px",
   "dialog.project.edit.color": "색상",
+  "dialog.project.edit.color.select": "{{color}} 색상 선택",
 
   "context.breakdown.title": "컨텍스트 분석",
   "context.breakdown.note": '입력 토큰의 대략적인 분석입니다. "기타"에는 도구 정의 및 오버헤드가 포함됩니다.',
@@ -269,6 +275,7 @@ export const dict = {
   "context.usage.usage": "사용량",
   "context.usage.cost": "비용",
   "context.usage.clickToView": "컨텍스트를 보려면 클릭",
+  "context.usage.view": "컨텍스트 사용량 보기",
 
   "language.en": "영어",
   "language.zh": "중국어 (간체)",
@@ -370,6 +377,7 @@ export const dict = {
   "session.tab.session": "세션",
   "session.tab.review": "검토",
   "session.tab.context": "컨텍스트",
+  "session.panel.reviewAndFiles": "검토 및 파일",
   "session.review.filesChanged": "{{count}}개 파일 변경됨",
   "session.review.loadingChanges": "변경 사항 로드 중...",
   "session.review.empty": "이 세션에 변경 사항이 아직 없습니다",
@@ -386,6 +394,7 @@ export const dict = {
   "session.new.lastModified": "최근 수정",
 
   "session.header.search.placeholder": "{{project}} 검색",
+  "session.header.searchFiles": "파일 검색",
 
   "session.share.popover.title": "웹에 게시",
   "session.share.popover.description.shared": "이 세션은 웹에 공개되었습니다. 링크가 있는 누구나 액세스할 수 있습니다.",
@@ -407,6 +416,7 @@ export const dict = {
   "terminal.loading": "터미널 로드 중...",
   "terminal.title": "터미널",
   "terminal.title.numbered": "터미널 {{number}}",
+  "terminal.close": "터미널 닫기",
 
   "common.closeTab": "탭 닫기",
   "common.dismiss": "닫기",
@@ -420,6 +430,7 @@ export const dict = {
   "common.edit": "편집",
   "common.loadMore": "더 불러오기",
 
+  "sidebar.nav.projectsAndSessions": "프로젝트 및 세션",
   "sidebar.settings": "설정",
   "sidebar.help": "도움말",
   "sidebar.workspaces.enable": "작업 공간 활성화",

+ 11 - 0
packages/app/src/i18n/pl.ts

@@ -153,6 +153,7 @@ export const dict = {
   "model.tooltip.context": "Limit kontekstu {{limit}}",
 
   "common.search.placeholder": "Szukaj",
+  "common.goBack": "Wstecz",
   "common.loading": "Ładowanie",
   "common.loading.ellipsis": "...",
   "common.cancel": "Anuluj",
@@ -199,7 +200,10 @@ export const dict = {
   "prompt.slash.badge.custom": "własne",
   "prompt.context.active": "aktywny",
   "prompt.context.includeActiveFile": "Dołącz aktywny plik",
+  "prompt.context.removeActiveFile": "Usuń aktywny plik z kontekstu",
+  "prompt.context.removeFile": "Usuń plik z kontekstu",
   "prompt.action.attachFile": "Załącz plik",
+  "prompt.attachment.remove": "Usuń załącznik",
   "prompt.action.send": "Wyślij",
   "prompt.action.stop": "Zatrzymaj",
 
@@ -243,6 +247,7 @@ export const dict = {
   "dialog.server.default.none": "Nie wybrano serwera",
   "dialog.server.default.set": "Ustaw bieżący serwer jako domyślny",
   "dialog.server.default.clear": "Wyczyść",
+  "dialog.server.action.remove": "Usuń serwer",
 
   "dialog.project.edit.title": "Edytuj projekt",
   "dialog.project.edit.name": "Nazwa",
@@ -251,6 +256,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "Kliknij lub przeciągnij obraz",
   "dialog.project.edit.icon.recommended": "Zalecane: 128x128px",
   "dialog.project.edit.color": "Kolor",
+  "dialog.project.edit.color.select": "Wybierz kolor {{color}}",
 
   "context.breakdown.title": "Podział kontekstu",
   "context.breakdown.note": 'Przybliżony podział tokenów wejściowych. "Inne" obejmuje definicje narzędzi i narzut.',
@@ -284,6 +290,7 @@ export const dict = {
   "context.usage.usage": "Użycie",
   "context.usage.cost": "Koszt",
   "context.usage.clickToView": "Kliknij, aby zobaczyć kontekst",
+  "context.usage.view": "Pokaż użycie kontekstu",
 
   "language.en": "Angielski",
   "language.zh": "Chiński",
@@ -386,6 +393,7 @@ export const dict = {
   "session.tab.session": "Sesja",
   "session.tab.review": "Przegląd",
   "session.tab.context": "Kontekst",
+  "session.panel.reviewAndFiles": "Przegląd i pliki",
   "session.review.filesChanged": "Zmieniono {{count}} plików",
   "session.review.loadingChanges": "Ładowanie zmian...",
   "session.review.empty": "Brak zmian w tej sesji",
@@ -403,6 +411,7 @@ export const dict = {
   "session.new.lastModified": "Ostatnio zmodyfikowano",
 
   "session.header.search.placeholder": "Szukaj {{project}}",
+  "session.header.searchFiles": "Szukaj plików",
 
   "session.share.popover.title": "Opublikuj w sieci",
   "session.share.popover.description.shared":
@@ -425,6 +434,7 @@ export const dict = {
   "terminal.loading": "Ładowanie terminala...",
   "terminal.title": "Terminal",
   "terminal.title.numbered": "Terminal {{number}}",
+  "terminal.close": "Zamknij terminal",
   "terminal.connectionLost.title": "Utracono połączenie",
   "terminal.connectionLost.description":
     "Połączenie z terminalem zostało przerwane. Może się to zdarzyć przy restarcie serwera.",
@@ -443,6 +453,7 @@ export const dict = {
   "common.key.esc": "ESC",
 
   "sidebar.menu.toggle": "Przełącz menu",
+  "sidebar.nav.projectsAndSessions": "Projekty i sesje",
   "sidebar.settings": "Ustawienia",
   "sidebar.help": "Pomoc",
   "sidebar.workspaces.enable": "Włącz przestrzenie robocze",

+ 11 - 0
packages/app/src/i18n/ru.ts

@@ -153,6 +153,7 @@ export const dict = {
   "model.tooltip.context": "Лимит контекста {{limit}}",
 
   "common.search.placeholder": "Поиск",
+  "common.goBack": "Назад",
   "common.loading": "Загрузка",
   "common.loading.ellipsis": "...",
   "common.cancel": "Отмена",
@@ -199,7 +200,10 @@ export const dict = {
   "prompt.slash.badge.custom": "своё",
   "prompt.context.active": "активно",
   "prompt.context.includeActiveFile": "Включить активный файл",
+  "prompt.context.removeActiveFile": "Удалить активный файл из контекста",
+  "prompt.context.removeFile": "Удалить файл из контекста",
   "prompt.action.attachFile": "Прикрепить файл",
+  "prompt.attachment.remove": "Удалить вложение",
   "prompt.action.send": "Отправить",
   "prompt.action.stop": "Остановить",
 
@@ -243,6 +247,7 @@ export const dict = {
   "dialog.server.default.none": "Сервер не выбран",
   "dialog.server.default.set": "Установить текущий сервер по умолчанию",
   "dialog.server.default.clear": "Очистить",
+  "dialog.server.action.remove": "Удалить сервер",
 
   "dialog.project.edit.title": "Редактировать проект",
   "dialog.project.edit.name": "Название",
@@ -251,6 +256,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "Нажмите или перетащите изображение",
   "dialog.project.edit.icon.recommended": "Рекомендуется: 128x128px",
   "dialog.project.edit.color": "Цвет",
+  "dialog.project.edit.color.select": "Выбрать цвет {{color}}",
 
   "context.breakdown.title": "Разбивка контекста",
   "context.breakdown.note":
@@ -285,6 +291,7 @@ export const dict = {
   "context.usage.usage": "Использование",
   "context.usage.cost": "Стоимость",
   "context.usage.clickToView": "Нажмите для просмотра контекста",
+  "context.usage.view": "Показать использование контекста",
 
   "language.en": "Английский",
   "language.zh": "Китайский",
@@ -387,6 +394,7 @@ export const dict = {
   "session.tab.session": "Сессия",
   "session.tab.review": "Обзор",
   "session.tab.context": "Контекст",
+  "session.panel.reviewAndFiles": "Обзор и файлы",
   "session.review.filesChanged": "{{count}} файлов изменено",
   "session.review.loadingChanges": "Загрузка изменений...",
   "session.review.empty": "Изменений в этой сессии пока нет",
@@ -404,6 +412,7 @@ export const dict = {
   "session.new.lastModified": "Последнее изменение",
 
   "session.header.search.placeholder": "Поиск {{project}}",
+  "session.header.searchFiles": "Поиск файлов",
 
   "session.share.popover.title": "Опубликовать в интернете",
   "session.share.popover.description.shared":
@@ -426,6 +435,7 @@ export const dict = {
   "terminal.loading": "Загрузка терминала...",
   "terminal.title": "Терминал",
   "terminal.title.numbered": "Терминал {{number}}",
+  "terminal.close": "Закрыть терминал",
   "terminal.connectionLost.title": "Соединение потеряно",
   "terminal.connectionLost.description":
     "Соединение с терминалом прервано. Это может произойти при перезапуске сервера.",
@@ -444,6 +454,7 @@ export const dict = {
   "common.key.esc": "ESC",
 
   "sidebar.menu.toggle": "Переключить меню",
+  "sidebar.nav.projectsAndSessions": "Проекты и сессии",
   "sidebar.settings": "Настройки",
   "sidebar.help": "Помощь",
   "sidebar.workspaces.enable": "Включить рабочие пространства",

+ 11 - 0
packages/app/src/i18n/zh.ts

@@ -136,6 +136,7 @@ export const dict = {
   "model.tag.latest": "最新",
 
   "common.search.placeholder": "搜索",
+  "common.goBack": "返回",
   "common.loading": "加载中",
   "common.cancel": "取消",
   "common.submit": "提交",
@@ -181,7 +182,10 @@ export const dict = {
   "prompt.slash.badge.custom": "自定义",
   "prompt.context.active": "当前",
   "prompt.context.includeActiveFile": "包含当前文件",
+  "prompt.context.removeActiveFile": "从上下文移除活动文件",
+  "prompt.context.removeFile": "从上下文移除文件",
   "prompt.action.attachFile": "附加文件",
+  "prompt.attachment.remove": "移除附件",
   "prompt.action.send": "发送",
   "prompt.action.stop": "停止",
 
@@ -224,6 +228,7 @@ export const dict = {
   "dialog.server.default.none": "未选择服务器",
   "dialog.server.default.set": "将当前服务器设为默认",
   "dialog.server.default.clear": "清除",
+  "dialog.server.action.remove": "移除服务器",
 
   "dialog.project.edit.title": "编辑项目",
   "dialog.project.edit.name": "名称",
@@ -232,6 +237,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "点击或拖拽图片",
   "dialog.project.edit.icon.recommended": "建议:128x128px",
   "dialog.project.edit.color": "颜色",
+  "dialog.project.edit.color.select": "选择{{color}}颜色",
 
   "context.breakdown.title": "上下文拆分",
   "context.breakdown.note": "输入 token 的大致拆分。“其他”包含工具定义和开销。",
@@ -265,6 +271,7 @@ export const dict = {
   "context.usage.usage": "使用率",
   "context.usage.cost": "成本",
   "context.usage.clickToView": "点击查看上下文",
+  "context.usage.view": "查看上下文用量",
 
   "language.en": "英语",
   "language.zh": "简体中文",
@@ -365,6 +372,7 @@ export const dict = {
   "session.tab.session": "会话",
   "session.tab.review": "审查",
   "session.tab.context": "上下文",
+  "session.panel.reviewAndFiles": "审查和文件",
   "session.review.filesChanged": "{{count}} 个文件变更",
   "session.review.loadingChanges": "正在加载更改...",
   "session.review.empty": "此会话暂无更改",
@@ -381,6 +389,7 @@ export const dict = {
   "session.new.lastModified": "最后修改",
 
   "session.header.search.placeholder": "搜索 {{project}}",
+  "session.header.searchFiles": "搜索文件",
 
   "session.share.popover.title": "发布到网页",
   "session.share.popover.description.shared": "此会话已在网页上公开。任何拥有链接的人都可以访问。",
@@ -401,6 +410,7 @@ export const dict = {
   "terminal.loading": "正在加载终端...",
   "terminal.title": "终端",
   "terminal.title.numbered": "终端 {{number}}",
+  "terminal.close": "关闭终端",
 
   "common.closeTab": "关闭标签页",
   "common.dismiss": "忽略",
@@ -414,6 +424,7 @@ export const dict = {
   "common.edit": "编辑",
   "common.loadMore": "加载更多",
 
+  "sidebar.nav.projectsAndSessions": "项目和会话",
   "sidebar.settings": "设置",
   "sidebar.help": "帮助",
   "sidebar.workspaces.enable": "启用工作区",

+ 11 - 0
packages/app/src/i18n/zht.ts

@@ -138,6 +138,7 @@ export const dict = {
   "model.tag.latest": "最新",
 
   "common.search.placeholder": "搜尋",
+  "common.goBack": "返回",
   "common.loading": "載入中",
   "common.cancel": "取消",
   "common.submit": "提交",
@@ -183,7 +184,10 @@ export const dict = {
   "prompt.slash.badge.custom": "自訂",
   "prompt.context.active": "作用中",
   "prompt.context.includeActiveFile": "包含作用中檔案",
+  "prompt.context.removeActiveFile": "從上下文移除目前檔案",
+  "prompt.context.removeFile": "從上下文移除檔案",
   "prompt.action.attachFile": "附加檔案",
+  "prompt.attachment.remove": "移除附件",
   "prompt.action.send": "傳送",
   "prompt.action.stop": "停止",
 
@@ -226,6 +230,7 @@ export const dict = {
   "dialog.server.default.none": "未選擇伺服器",
   "dialog.server.default.set": "將目前伺服器設為預設",
   "dialog.server.default.clear": "清除",
+  "dialog.server.action.remove": "移除伺服器",
 
   "dialog.project.edit.title": "編輯專案",
   "dialog.project.edit.name": "名稱",
@@ -234,6 +239,7 @@ export const dict = {
   "dialog.project.edit.icon.hint": "點擊或拖曳圖片",
   "dialog.project.edit.icon.recommended": "建議:128x128px",
   "dialog.project.edit.color": "顏色",
+  "dialog.project.edit.color.select": "選擇{{color}}顏色",
 
   "context.breakdown.title": "上下文拆分",
   "context.breakdown.note": "輸入 token 的大致拆分。「其他」包含工具定義和額外開銷。",
@@ -267,6 +273,7 @@ export const dict = {
   "context.usage.usage": "使用量",
   "context.usage.cost": "成本",
   "context.usage.clickToView": "點擊查看上下文",
+  "context.usage.view": "檢視上下文用量",
 
   "language.en": "英語",
   "language.zh": "簡體中文",
@@ -361,6 +368,7 @@ export const dict = {
   "session.tab.session": "工作階段",
   "session.tab.review": "審查",
   "session.tab.context": "上下文",
+  "session.panel.reviewAndFiles": "審查與檔案",
   "session.review.filesChanged": "{{count}} 個檔案變更",
   "session.review.loadingChanges": "正在載入變更...",
   "session.review.empty": "此工作階段暫無變更",
@@ -377,6 +385,7 @@ export const dict = {
   "session.new.lastModified": "最後修改",
 
   "session.header.search.placeholder": "搜尋 {{project}}",
+  "session.header.searchFiles": "搜尋檔案",
 
   "session.share.popover.title": "發佈到網頁",
   "session.share.popover.description.shared": "此工作階段已在網頁上公開。任何擁有連結的人都可以存取。",
@@ -397,6 +406,7 @@ export const dict = {
   "terminal.loading": "正在載入終端機...",
   "terminal.title": "終端機",
   "terminal.title.numbered": "終端機 {{number}}",
+  "terminal.close": "關閉終端機",
 
   "common.closeTab": "關閉標籤頁",
   "common.dismiss": "忽略",
@@ -410,6 +420,7 @@ export const dict = {
   "common.edit": "編輯",
   "common.loadMore": "載入更多",
 
+  "sidebar.nav.projectsAndSessions": "專案與工作階段",
   "sidebar.settings": "設定",
   "sidebar.help": "說明",
   "sidebar.workspaces.enable": "啟用工作區",

+ 2 - 2
packages/app/src/pages/layout.tsx

@@ -2345,7 +2345,7 @@ export default function Layout(props: ParentProps) {
       <Titlebar />
       <div class="flex-1 min-h-0 flex">
         <nav
-          aria-label="Projects and sessions"
+          aria-label={language.t("sidebar.nav.projectsAndSessions")}
           classList={{
             "hidden xl:block": true,
             "relative shrink-0": true,
@@ -2379,7 +2379,7 @@ export default function Layout(props: ParentProps) {
             }}
           />
           <nav
-            aria-label="Projects and sessions"
+            aria-label={language.t("sidebar.nav.projectsAndSessions")}
             classList={{
               "@container fixed top-10 bottom-0 left-0 z-50 w-72 bg-background-base transition-transform duration-200 ease-out": true,
               "translate-x-0": layout.mobileSidebar.opened(),

+ 5 - 5
packages/app/src/pages/session.tsx

@@ -1555,7 +1555,7 @@ export default function Page() {
         <Show when={isDesktop() && showTabs()}>
           <aside
             id="review-panel"
-            aria-label="Review and files"
+            aria-label={language.t("session.panel.reviewAndFiles")}
             class="relative flex-1 min-w-0 h-full border-l border-border-weak-base"
           >
             <DragDropProvider
@@ -1595,7 +1595,7 @@ export default function Page() {
                               icon="close"
                               variant="ghost"
                               onClick={() => tabs().close("context")}
-                              aria-label="Close context tab"
+                              aria-label={language.t("common.closeTab")}
                             />
                           </Tooltip>
                         }
@@ -1622,7 +1622,7 @@ export default function Page() {
                           variant="ghost"
                           iconSize="large"
                           onClick={() => dialog.show(() => <DialogSelectFile />)}
-                          aria-label="Open file"
+                          aria-label={language.t("command.file.open")}
                         />
                       </TooltipKeybind>
                     </div>
@@ -1932,7 +1932,7 @@ export default function Page() {
         <div
           id="terminal-panel"
           role="region"
-          aria-label="Terminal"
+          aria-label={language.t("terminal.title")}
           class="relative w-full flex flex-col shrink-0 border-t border-border-weak-base"
           style={{ height: `${layout.terminal.height()}px` }}
         >
@@ -2009,7 +2009,7 @@ export default function Page() {
                           variant="ghost"
                           iconSize="large"
                           onClick={terminal.new}
-                          aria-label="New terminal"
+                          aria-label={language.t("command.terminal.new")}
                         />
                       </TooltipKeybind>
                     </div>

+ 3 - 1
packages/ui/src/components/dialog.tsx

@@ -1,5 +1,6 @@
 import { Dialog as Kobalte } from "@kobalte/core/dialog"
 import { ComponentProps, JSXElement, Match, ParentProps, Show, Switch } from "solid-js"
+import { useI18n } from "../context/i18n"
 import { IconButton } from "./icon-button"
 
 export interface DialogProps extends ParentProps {
@@ -13,6 +14,7 @@ export interface DialogProps extends ParentProps {
 }
 
 export function Dialog(props: DialogProps) {
+  const i18n = useI18n()
   return (
     <div data-component="dialog" data-fit={props.fit ? true : undefined} data-size={props.size || "normal"}>
       <div data-slot="dialog-container">
@@ -45,7 +47,7 @@ export function Dialog(props: DialogProps) {
                     as={IconButton}
                     icon="close"
                     variant="ghost"
-                    aria-label="Close"
+                    aria-label={i18n.t("ui.common.close")}
                   />
                 </Match>
               </Switch>

+ 1 - 1
packages/ui/src/components/image-preview.tsx

@@ -19,7 +19,7 @@ export function ImagePreview(props: ImagePreviewProps) {
               as={IconButton}
               icon="close"
               variant="ghost"
-              aria-label="Close"
+              aria-label={i18n.t("ui.common.close")}
             />
           </div>
           <div data-slot="image-preview-body">

+ 1 - 1
packages/ui/src/components/list.tsx

@@ -234,7 +234,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
                 icon="circle-x"
                 variant="ghost"
                 onClick={() => setInternalFilter("")}
-                aria-label="Clear filter"
+                aria-label={i18n.t("ui.list.clearFilter")}
               />
             </Show>
           </div>

+ 3 - 1
packages/ui/src/components/popover.tsx

@@ -1,5 +1,6 @@
 import { Popover as Kobalte } from "@kobalte/core/popover"
 import { ComponentProps, JSXElement, ParentProps, Show, splitProps, ValidComponent } from "solid-js"
+import { useI18n } from "../context/i18n"
 import { IconButton } from "./icon-button"
 
 export interface PopoverProps<T extends ValidComponent = "div">
@@ -15,6 +16,7 @@ export interface PopoverProps<T extends ValidComponent = "div">
 }
 
 export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T>) {
+  const i18n = useI18n()
   const [local, rest] = splitProps(props, [
     "trigger",
     "triggerAs",
@@ -48,7 +50,7 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T>
                 as={IconButton}
                 icon="close"
                 variant="ghost"
-                aria-label="Close"
+                aria-label={i18n.t("ui.common.close")}
               />
             </div>
           </Show>

+ 3 - 1
packages/ui/src/components/toast.tsx

@@ -3,6 +3,7 @@ import type { ToastRootProps, ToastCloseButtonProps, ToastTitleProps, ToastDescr
 import type { ComponentProps, JSX } from "solid-js"
 import { Show } from "solid-js"
 import { Portal } from "solid-js/web"
+import { useI18n } from "../context/i18n"
 import { Icon, type IconProps } from "./icon"
 import { IconButton } from "./icon-button"
 
@@ -62,13 +63,14 @@ function ToastActions(props: ComponentProps<"div">) {
 }
 
 function ToastCloseButton(props: ToastCloseButtonProps & ComponentProps<"button">) {
+  const i18n = useI18n()
   return (
     <Kobalte.CloseButton
       data-slot="toast-close-button"
       as={IconButton}
       icon="close"
       variant="ghost"
-      aria-label="Dismiss"
+      aria-label={i18n.t("ui.common.dismiss")}
       {...props}
     />
   )

+ 2 - 0
packages/ui/src/i18n/ar.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "جارٍ التحميل",
   "ui.list.empty": "لا توجد نتائج",
+  "ui.list.clearFilter": "مسح عامل التصفية",
   "ui.list.emptyWithFilter.prefix": "لا توجد نتائج لـ",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "إلغاء",
   "ui.common.confirm": "تأكيد",
   "ui.common.dismiss": "رفض",
+  "ui.common.close": "إغلاق",
   "ui.common.next": "التالي",
   "ui.common.submit": "إرسال",
 

+ 2 - 0
packages/ui/src/i18n/da.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "Indlæser",
   "ui.list.empty": "Ingen resultater",
+  "ui.list.clearFilter": "Ryd filter",
   "ui.list.emptyWithFilter.prefix": "Ingen resultater for",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "Annuller",
   "ui.common.confirm": "Bekræft",
   "ui.common.dismiss": "Afvis",
+  "ui.common.close": "Luk",
   "ui.common.next": "Næste",
   "ui.common.submit": "Indsend",
 

+ 2 - 0
packages/ui/src/i18n/de.ts

@@ -37,6 +37,7 @@ export const dict = {
 
   "ui.list.loading": "Laden",
   "ui.list.empty": "Keine Ergebnisse",
+  "ui.list.clearFilter": "Filter löschen",
   "ui.list.emptyWithFilter.prefix": "Keine Ergebnisse für",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -68,6 +69,7 @@ export const dict = {
   "ui.common.cancel": "Abbrechen",
   "ui.common.confirm": "Bestätigen",
   "ui.common.dismiss": "Verwerfen",
+  "ui.common.close": "Schließen",
   "ui.common.next": "Weiter",
   "ui.common.submit": "Absenden",
 

+ 2 - 0
packages/ui/src/i18n/en.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "Loading",
   "ui.list.empty": "No results",
+  "ui.list.clearFilter": "Clear filter",
   "ui.list.emptyWithFilter.prefix": "No results for",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "Cancel",
   "ui.common.confirm": "Confirm",
   "ui.common.dismiss": "Dismiss",
+  "ui.common.close": "Close",
   "ui.common.next": "Next",
   "ui.common.submit": "Submit",
 

+ 2 - 0
packages/ui/src/i18n/es.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "Cargando",
   "ui.list.empty": "Sin resultados",
+  "ui.list.clearFilter": "Borrar filtro",
   "ui.list.emptyWithFilter.prefix": "Sin resultados para",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "Cancelar",
   "ui.common.confirm": "Confirmar",
   "ui.common.dismiss": "Descartar",
+  "ui.common.close": "Cerrar",
   "ui.common.next": "Siguiente",
   "ui.common.submit": "Enviar",
 

+ 2 - 0
packages/ui/src/i18n/fr.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "Chargement",
   "ui.list.empty": "Aucun résultat",
+  "ui.list.clearFilter": "Effacer le filtre",
   "ui.list.emptyWithFilter.prefix": "Aucun résultat pour",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "Annuler",
   "ui.common.confirm": "Confirmer",
   "ui.common.dismiss": "Ignorer",
+  "ui.common.close": "Fermer",
   "ui.common.next": "Suivant",
   "ui.common.submit": "Soumettre",
 

+ 2 - 0
packages/ui/src/i18n/ja.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "読み込み中",
   "ui.list.empty": "結果なし",
+  "ui.list.clearFilter": "フィルターをクリア",
   "ui.list.emptyWithFilter.prefix": "次の検索結果はありません: ",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "キャンセル",
   "ui.common.confirm": "確認",
   "ui.common.dismiss": "閉じる",
+  "ui.common.close": "閉じる",
   "ui.common.next": "次へ",
   "ui.common.submit": "送信",
 

+ 2 - 0
packages/ui/src/i18n/ko.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "로딩 중",
   "ui.list.empty": "결과 없음",
+  "ui.list.clearFilter": "필터 지우기",
   "ui.list.emptyWithFilter.prefix": "다음에 대한 결과 없음: ",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "취소",
   "ui.common.confirm": "확인",
   "ui.common.dismiss": "닫기",
+  "ui.common.close": "닫기",
   "ui.common.next": "다음",
   "ui.common.submit": "제출",
 

+ 2 - 0
packages/ui/src/i18n/pl.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "Ładowanie",
   "ui.list.empty": "Brak wyników",
+  "ui.list.clearFilter": "Wyczyść filtr",
   "ui.list.emptyWithFilter.prefix": "Brak wyników dla",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "Anuluj",
   "ui.common.confirm": "Potwierdź",
   "ui.common.dismiss": "Odrzuć",
+  "ui.common.close": "Zamknij",
   "ui.common.next": "Dalej",
   "ui.common.submit": "Prześlij",
 

+ 2 - 0
packages/ui/src/i18n/ru.ts

@@ -33,6 +33,7 @@ export const dict = {
 
   "ui.list.loading": "Загрузка",
   "ui.list.empty": "Нет результатов",
+  "ui.list.clearFilter": "Очистить фильтр",
   "ui.list.emptyWithFilter.prefix": "Нет результатов для",
   "ui.list.emptyWithFilter.suffix": "",
 
@@ -64,6 +65,7 @@ export const dict = {
   "ui.common.cancel": "Отмена",
   "ui.common.confirm": "Подтвердить",
   "ui.common.dismiss": "Закрыть",
+  "ui.common.close": "Закрыть",
   "ui.common.next": "Далее",
   "ui.common.submit": "Отправить",
 

+ 2 - 0
packages/ui/src/i18n/zh.ts

@@ -37,6 +37,7 @@ export const dict = {
 
   "ui.list.loading": "加载中",
   "ui.list.empty": "无结果",
+  "ui.list.clearFilter": "清除筛选",
   "ui.list.emptyWithFilter.prefix": "没有关于",
   "ui.list.emptyWithFilter.suffix": "的结果",
 
@@ -68,6 +69,7 @@ export const dict = {
   "ui.common.cancel": "取消",
   "ui.common.confirm": "确认",
   "ui.common.dismiss": "忽略",
+  "ui.common.close": "关闭",
   "ui.common.next": "下一步",
   "ui.common.submit": "提交",
 

+ 2 - 0
packages/ui/src/i18n/zht.ts

@@ -37,6 +37,7 @@ export const dict = {
 
   "ui.list.loading": "載入中",
   "ui.list.empty": "無結果",
+  "ui.list.clearFilter": "清除篩選",
   "ui.list.emptyWithFilter.prefix": "沒有關於",
   "ui.list.emptyWithFilter.suffix": "的結果",
 
@@ -68,6 +69,7 @@ export const dict = {
   "ui.common.cancel": "取消",
   "ui.common.confirm": "確認",
   "ui.common.dismiss": "忽略",
+  "ui.common.close": "關閉",
   "ui.common.next": "下一步",
   "ui.common.submit": "提交",