feat(mobile): mobile app navigation rework and beta-feedback closeout (#2561)

Navigation model rebuilt around two full-width drawers and a minimal
header (sessions / title-switcher / usage ring / workspace):

- Left sessions drawer: cross-project tree with live status indicators,
  swipe actions on sessions (rename/archive/delete) and on group headers
  (project edit / two-step close, worktree delete), reorder-only edit
  mode with collapsible project cards and draggable worktrees, app-level
  footer (connected instance, settings, pending web update).
- Right workspace drawer: Changes / Files / Terminal / Notes / MCP as
  pill tabs (inactive tabs icon-only); panes stay mounted once visited.
  The full desktop file editor serves the Files tab; read/skill tool taps
  in chat open the file there at the requested line.
- Header session switcher on title tap: 10 cross-project recents with
  live busy/attention indicators and project · branch metadata; the
  usage ring opens a metadata overlay with an explicit loading state.
- The overflow menu is gone on phones (its destinations moved into the
  drawers); iPad keeps it until its dedicated layout pass.

Correctness and continuity:

- /auth/session answers bearer-first, so a stale WebView cookie can no
  longer mask a revoked device token; cold launches classify failures
  fast and land on an explicit connect screen.
- Authoritative session snapshots raise frozen ordering baselines and
  stale live ranks — recents stay truthful after the app slept.
- Cold launches reopen the last active session per instance (persisted
  pointer, confirmed against a sessions snapshot; a user-opened draft
  clears it), with a logo hold instead of a draft flash.

Also: collapsed pill composer gains the stop control; chat tool rows
share one 36px rhythm; Task subtool rows truncate; larger bottom safe
area so the composer clears big-screen corner radii; Capacitor build
hides About/Update (store updates apply there); widgets link to the
sessions drawer with a list icon; MobileApp split into focused modules;
five mobile-surface detectors unified; translucent borders normalized to
70%; all new strings translated across the 10 locales.

iPad and foldable layouts are intentionally untouched - separate next version PR.
This commit is contained in:
Bohdan Triapitsyn
2026-08-01 21:16:36 +03:00
committed by GitHub
parent ea8cc5d7b0
commit 86ef96302d
69 changed files with 5006 additions and 4291 deletions
+11 -19
View File
@@ -52,6 +52,9 @@ export const dict = {
'mobile.connect.unlockButton': 'Unlock and connect',
'mobile.connect.cancelPassword': 'Use another server',
'mobile.connect.connecting': 'Connecting...',
'mobile.connect.notice.unreachable': 'Couldn\'t reach {label}. Check that the server is running.',
'mobile.connect.notice.authExpired': 'Access to {label} has expired or was revoked. Sign in again.',
'mobile.connect.recovery.description': 'Could not connect to the saved server. Check that it is running, or pick another instance.',
'mobile.connect.scanQr': 'Scan QR code',
'mobile.connect.welcome.scanHint': 'On your computer, open «Add a device» to show a QR code, then scan it here.',
'mobile.connect.advanced': 'Advanced',
@@ -88,9 +91,9 @@ export const dict = {
'mobile.nav.settings': 'Settings',
'mobile.surface.closeAria': 'Close',
'mobile.header.openMenuAria': 'Open menu',
'mobile.header.openWorkspaceAria': 'Open workspace panel',
'mobile.header.openMetadataAria': 'Open session metadata',
'mobile.header.metadata.context': 'Context',
'mobile.header.metadata.branch': 'Branch',
'mobile.header.metadata.usage': 'Usage',
'mobile.menu.titleAria': 'Workspace tools',
'mobile.menu.files': 'Files',
@@ -122,18 +125,20 @@ export const dict = {
'mobile.sessions.newChat': 'New chat',
'mobile.sessions.editOrder': 'Reorder projects',
'mobile.sessions.doneEditing': 'Done',
'mobile.sessions.editOrderHint': 'Drag the handle to reorder projects. Tap the check to finish.',
'mobile.sessions.editOrderHint': 'Drag the handle to reorder projects. Tap a project to show its worktrees and drag those too. Tap the check to finish.',
'mobile.sessions.editProjectAria': 'Edit {label}',
'mobile.sessions.dragHandleAria': 'Drag {label} to reorder',
'mobile.sessions.moveUpAria': 'Move {label} up',
'mobile.sessions.moveDownAria': 'Move {label} down',
'mobile.sessions.removeProjectAria': 'Remove {label}',
'mobile.sessions.cancelRemoveProjectAria': 'Cancel removing {label}',
'mobile.sessions.confirmRemoveProject': 'Close',
'mobile.sessions.confirmRemoveProjectAria': 'Confirm removing {label}',
'mobile.sessions.toast.projectRemoved': 'Removed {label}',
'mobile.sessions.archiveSessionAria': 'Archive {title}',
'mobile.sessions.cancelArchiveAria': 'Cancel archiving {title}',
'mobile.sessions.renameSessionAria': 'Rename {title}',
'mobile.sessions.renameError': 'Failed to rename session',
'mobile.sessions.deleteSessionAria': 'Delete {title}',
'mobile.sessions.confirmDeleteSessionAria': 'Confirm deleting {title}',
'mobile.projectEdit.worktreesTitle': 'Worktrees',
'mobile.projectEdit.worktreesEmpty': 'No worktrees in this project yet.',
'mobile.projectEdit.reorderHint': 'Drag to reorder worktrees.',
@@ -179,6 +184,8 @@ export const dict = {
'mobile.files.copyPathAria': 'Copy file path',
'mobile.files.copyContent': 'Copy content',
'mobile.files.copyContentAria': 'Copy file content',
'mobile.files.editAria': 'Edit file',
'mobile.files.doneEditingAria': 'Done editing',
'mobile.files.toast.pathCopied': 'Path copied',
'mobile.files.toast.contentCopied': 'Content copied',
'mobile.files.toast.copyFailed': 'Copy failed',
@@ -2074,21 +2081,6 @@ export const dict = {
'chat.chatInput.drop.insertMention': 'Drop to insert as mention',
'chat.chatInput.drop.attachFiles': 'Drop files here to attach',
'chat.chatInput.fileFallback': 'file',
'chat.mobileStatus.editProjects.title': 'Edit Projects',
'chat.mobileStatus.editProjects.footer': 'Drag items to reorder, or use arrows to move. Tap edit to change details.',
'chat.mobileStatus.editProjects.empty': 'No projects to edit',
'chat.mobileStatus.projects.empty': 'No projects',
'chat.mobileStatus.projects.addAria': 'Add project',
'chat.mobileStatus.projects.removeTitle': 'Remove Project',
'chat.mobileStatus.projects.removeDescriptionPrefix': 'Are you sure you want to remove',
'chat.mobileStatus.projects.cancel': 'Cancel',
'chat.mobileStatus.projects.remove': 'Remove',
'chat.mobileStatus.new': 'New',
'chat.mobileStatus.noSessionsInProject': 'No sessions in this project',
'chat.mobileStatus.swipeHint': '← Swipe here to open sidebars →',
'chat.mobileStatus.toast.addProjectFailed': 'Failed to add project',
'chat.mobileStatus.toast.selectValidDirectory': 'Please select a valid directory.',
'chat.mobileStatus.toast.selectDirectoryFailed': 'Failed to select directory',
'chat.toolOutputDialog.image.previousAria': 'Previous image',
'chat.toolOutputDialog.image.nextAria': 'Next image',
'chat.toolOutputDialog.image.closeAria': 'Close image preview',
+11 -19
View File
@@ -53,6 +53,9 @@ export const dict: Record<I18nKey, string> = {
"mobile.connect.unlockButton": "Desbloquear y conectar",
"mobile.connect.cancelPassword": "Usar otro servidor",
"mobile.connect.connecting": "Conectando...",
"mobile.connect.notice.unreachable": "No se pudo conectar con {label}. Comprueba que el servidor esté en marcha.",
"mobile.connect.notice.authExpired": "El acceso a {label} caducó o fue revocado. Inicia sesión de nuevo.",
"mobile.connect.recovery.description": "No se pudo conectar con el servidor guardado. Comprueba que esté en marcha o elige otra instancia.",
"mobile.connect.scanQr": "Escanear código QR",
"mobile.connect.welcome.scanHint": "En tu ordenador, abre «Añadir un dispositivo» para mostrar un código QR y escanéalo aquí.",
"mobile.connect.advanced": "Avanzado",
@@ -89,9 +92,9 @@ export const dict: Record<I18nKey, string> = {
"mobile.nav.settings": "Ajustes",
"mobile.surface.closeAria": "Cerrar",
"mobile.header.openMenuAria": "Abrir menú",
"mobile.header.openWorkspaceAria": "Abrir panel de trabajo",
"mobile.header.openMetadataAria": "Abrir metadatos de la sesión",
"mobile.header.metadata.context": "Contexto",
"mobile.header.metadata.branch": "Rama",
"mobile.header.metadata.usage": "Uso",
"mobile.menu.titleAria": "Herramientas del espacio de trabajo",
"mobile.menu.files": "Archivos",
@@ -123,17 +126,19 @@ export const dict: Record<I18nKey, string> = {
"mobile.sessions.newChat": "Nuevo chat",
"mobile.sessions.editOrder": "Reordenar proyectos",
"mobile.sessions.doneEditing": "Listo",
"mobile.sessions.editOrderHint": "Arrastra el asa o usa las flechas para reordenar los proyectos. Toca la marca para finalizar.",
"mobile.sessions.editOrderHint": "Arrastra el asa para reordenar los proyectos. Toca un proyecto para mostrar sus worktrees y arrástralos también. Toca la marca para terminar.",
"mobile.sessions.dragHandleAria": "Arrastra {label} para reordenar",
"mobile.sessions.moveUpAria": "Mover {label} arriba",
"mobile.sessions.moveDownAria": "Mover {label} abajo",
"mobile.sessions.removeProjectAria": "Eliminar {label}",
"mobile.sessions.cancelRemoveProjectAria": "Cancelar eliminación de {label}",
"mobile.sessions.confirmRemoveProject": "Cerrar",
"mobile.sessions.confirmRemoveProjectAria": "Confirmar eliminación de {label}",
"mobile.sessions.toast.projectRemoved": "Se eliminó {label}",
"mobile.sessions.archiveSessionAria": "Archivar {title}",
"mobile.sessions.cancelArchiveAria": "Cancelar archivar {title}",
"mobile.sessions.renameSessionAria": "Renombrar {title}",
"mobile.sessions.renameError": "No se pudo renombrar la sesión",
"mobile.sessions.deleteSessionAria": "Eliminar {title}",
"mobile.sessions.confirmDeleteSessionAria": "Confirmar eliminación de {title}",
"mobile.sessions.editProjectAria": "Editar {label}",
"mobile.projectEdit.worktreesTitle": "Worktrees",
"mobile.projectEdit.worktreesEmpty": "Este proyecto aún no tiene worktrees.",
@@ -180,6 +185,8 @@ export const dict: Record<I18nKey, string> = {
"mobile.files.copyPathAria": "Copiar ruta del archivo",
"mobile.files.copyContent": "Copiar contenido",
"mobile.files.copyContentAria": "Copiar contenido del archivo",
"mobile.files.editAria": "Editar archivo",
"mobile.files.doneEditingAria": "Terminar edición",
"mobile.files.toast.pathCopied": "Ruta copiada",
"mobile.files.toast.contentCopied": "Contenido copiado",
"mobile.files.toast.copyFailed": "No se pudo copiar",
@@ -2040,21 +2047,6 @@ export const dict: Record<I18nKey, string> = {
"chat.chatInput.drop.insertMention": "Suelta para insertar como mención",
"chat.chatInput.drop.attachFiles": "Suelta archivos aquí para adjuntar",
"chat.chatInput.fileFallback": "archivo",
"chat.mobileStatus.editProjects.title": "Editar proyectos",
"chat.mobileStatus.editProjects.footer": "Arrastra los elementos para reordenar, o use flechas para mover. Toca editar para cambiar los detalles.",
"chat.mobileStatus.editProjects.empty": "No hay proyectos para editar",
"chat.mobileStatus.projects.empty": "No hay proyectos",
"chat.mobileStatus.projects.addAria": "Añadir proyecto",
"chat.mobileStatus.projects.removeTitle": "Eliminar proyecto",
"chat.mobileStatus.projects.removeDescriptionPrefix": "¿Estás seguro de que quieres eliminar",
"chat.mobileStatus.projects.cancel": "Cancelar",
"chat.mobileStatus.projects.remove": "Eliminar",
"chat.mobileStatus.new": "Nuevo",
"chat.mobileStatus.noSessionsInProject": "No hay sesiones en este proyecto",
"chat.mobileStatus.swipeHint": "← Desliza aquí para abrir los paneles laterales →",
"chat.mobileStatus.toast.addProjectFailed": "No se pudo añadir el proyecto",
"chat.mobileStatus.toast.selectValidDirectory": "Selecciona un directorio válido.",
"chat.mobileStatus.toast.selectDirectoryFailed": "No se pudo seleccionar el directorio",
"chat.toolOutputDialog.image.previousAria": "Imagen anterior",
"chat.toolOutputDialog.image.nextAria": "Imagen siguiente",
"chat.toolOutputDialog.image.closeAria": "Cerrar vista previa de imagen",
+11 -19
View File
@@ -1848,21 +1848,6 @@ export const dict = {
'chat.chatInput.drop.insertMention': 'Déposer pour insérer comme mention',
'chat.chatInput.drop.attachFiles': 'Déposez les fichiers ici pour les joindre',
'chat.chatInput.fileFallback': 'déposer',
'chat.mobileStatus.editProjects.title': 'Modifier des projets',
'chat.mobileStatus.editProjects.footer': 'Faites glisser les éléments pour les réorganiser ou utilisez les flèches pour les déplacer. Appuyez sur modifier pour modifier les détails.',
'chat.mobileStatus.editProjects.empty': 'Aucun projet à modifier',
'chat.mobileStatus.projects.empty': 'Aucun projet',
'chat.mobileStatus.projects.addAria': 'Ajouter un projet',
'chat.mobileStatus.projects.removeTitle': 'Supprimer le projet',
'chat.mobileStatus.projects.removeDescriptionPrefix': 'Etes-vous sûr de vouloir supprimer',
'chat.mobileStatus.projects.cancel': 'Annuler',
'chat.mobileStatus.projects.remove': 'Retirer',
'chat.mobileStatus.new': 'Nouveau',
'chat.mobileStatus.noSessionsInProject': 'Aucune session dans ce projet',
'chat.mobileStatus.swipeHint': '← Glissez ici pour ouvrir les barres latérales →',
'chat.mobileStatus.toast.addProjectFailed': 'Échec de l\'ajout du projet',
'chat.mobileStatus.toast.selectValidDirectory': 'Veuillez sélectionner un répertoire valide.',
'chat.mobileStatus.toast.selectDirectoryFailed': 'Échec de la sélection du répertoire',
'chat.toolOutputDialog.image.previousAria': 'Image précédente',
'chat.toolOutputDialog.image.nextAria': 'Image suivante',
'chat.toolOutputDialog.image.closeAria': 'Fermer l\'aperçu de l\'image',
@@ -2626,6 +2611,9 @@ export const dict = {
'mobile.connect.unlockButton': 'Déverrouiller et se connecter',
'mobile.connect.cancelPassword': 'Utiliser un autre serveur',
'mobile.connect.connecting': 'Connexion...',
'mobile.connect.notice.unreachable': 'Impossible de joindre {label}. Vérifiez que le serveur est en marche.',
'mobile.connect.notice.authExpired': 'L\'accès à {label} a expiré ou a été révoqué. Reconnectez-vous.',
'mobile.connect.recovery.description': 'Connexion au serveur enregistré impossible. Vérifiez qu\'il est en marche ou choisissez une autre instance.',
'mobile.connect.scanQr': 'Scanner le code QR',
'mobile.connect.welcome.scanHint': 'Sur votre ordinateur, ouvrez « Ajouter un appareil » pour afficher un code QR, puis scannez-le ici.',
'mobile.connect.advanced': 'Avancé',
@@ -2662,9 +2650,9 @@ export const dict = {
'mobile.nav.settings': 'Paramètres',
'mobile.surface.closeAria': 'Fermer',
'mobile.header.openMenuAria': 'Ouvrir le menu',
'mobile.header.openWorkspaceAria': 'Ouvrir le panneau de travail',
'mobile.header.openMetadataAria': 'Ouvrir les métadonnées de session',
'mobile.header.metadata.context': 'Contexte',
'mobile.header.metadata.branch': 'Branche',
'mobile.header.metadata.usage': 'Utilisation',
'mobile.menu.titleAria': 'Outils de lespace de travail',
'mobile.menu.files': 'Fichiers',
@@ -2696,18 +2684,20 @@ export const dict = {
'mobile.sessions.newChat': 'Nouveau chat',
'mobile.sessions.editOrder': 'Réordonner les projets',
'mobile.sessions.doneEditing': 'Terminé',
'mobile.sessions.editOrderHint': 'Faites glisser la poignée pour réordonner les projets. Touchez la coche pour terminer.',
'mobile.sessions.editOrderHint': 'Faites glisser la poignée pour réorganiser les projets. Touchez un projet pour afficher ses worktrees et les faire glisser aussi. Touchez la coche pour terminer.',
'mobile.sessions.editProjectAria': 'Modifier {label}',
'mobile.sessions.dragHandleAria': 'Faire glisser {label} pour réordonner',
'mobile.sessions.moveUpAria': 'Déplacer {label} vers le haut',
'mobile.sessions.moveDownAria': 'Déplacer {label} vers le bas',
'mobile.sessions.removeProjectAria': 'Supprimer {label}',
'mobile.sessions.cancelRemoveProjectAria': 'Annuler la suppression de {label}',
'mobile.sessions.confirmRemoveProject': 'Fermer',
'mobile.sessions.confirmRemoveProjectAria': 'Confirmer la suppression de {label}',
'mobile.sessions.toast.projectRemoved': '{label} supprimé',
'mobile.sessions.archiveSessionAria': 'Archiver {title}',
'mobile.sessions.cancelArchiveAria': 'Annuler larchivage de {title}',
'mobile.sessions.renameSessionAria': 'Renommer {title}',
'mobile.sessions.renameError': 'Échec du renommage de la session',
'mobile.sessions.deleteSessionAria': 'Supprimer {title}',
'mobile.sessions.confirmDeleteSessionAria': 'Confirmer la suppression de {title}',
'mobile.projectEdit.worktreesTitle': 'Worktrees',
'mobile.projectEdit.worktreesEmpty': 'Aucun worktree dans ce projet pour le moment.',
'mobile.projectEdit.reorderHint': 'Faites glisser pour réordonner les worktrees.',
@@ -2753,6 +2743,8 @@ export const dict = {
'mobile.files.copyPathAria': 'Copier le chemin du fichier',
'mobile.files.copyContent': 'Copier le contenu',
'mobile.files.copyContentAria': 'Copier le contenu du fichier',
'mobile.files.editAria': 'Modifier le fichier',
'mobile.files.doneEditingAria': 'Terminer la modification',
'mobile.files.toast.pathCopied': 'Chemin copié',
'mobile.files.toast.contentCopied': 'Contenu copié',
'mobile.files.toast.copyFailed': 'Échec de la copie',
+11 -19
View File
@@ -56,6 +56,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.connect.token.hint': 'サーバーがパスワードの代わりにトークンを必要とする場合のみ必要です。',
'mobile.connect.connectButton': '接続',
'mobile.connect.connecting': '接続中...',
'mobile.connect.notice.unreachable': '{label}に接続できませんでした。サーバーが起動しているか確認してください。',
'mobile.connect.notice.authExpired': '{label}へのアクセスは期限切れか取り消されました。再度サインインしてください。',
'mobile.connect.recovery.description': '保存済みサーバーに接続できませんでした。サーバーが起動しているか確認するか、別のインスタンスを選んでください。',
'mobile.connect.password.label': 'パスワード',
'mobile.connect.password.placeholder': 'OpenChamber のパスワード',
'mobile.connect.unlockButton': 'ロックを解除して接続',
@@ -90,9 +93,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.instances.cancelDeleteAria': '{label} を残す',
'mobile.surface.closeAria': '閉じる',
'mobile.header.openMenuAria': 'メニューを開く',
'mobile.header.openWorkspaceAria': 'ワークスペースパネルを開く',
'mobile.header.openMetadataAria': 'セッションメタデータを開く',
'mobile.header.metadata.context': 'コンテキスト',
'mobile.header.metadata.branch': 'ブランチ',
'mobile.header.metadata.usage': '使用量',
'mobile.menu.titleAria': 'ワークスペースツール',
'mobile.menu.files': 'ファイル',
@@ -123,18 +126,20 @@ export const dict: Record<I18nKey, string> = {
'mobile.sessions.newChat': '新しいチャット',
'mobile.sessions.editOrder': 'プロジェクトの並び替え',
'mobile.sessions.doneEditing': '完了',
'mobile.sessions.editOrderHint': 'ハンドルをドラッグしてプロジェクトを並替えます。チェックをタップして完了します。',
'mobile.sessions.editOrderHint': 'ハンドルをドラッグしてプロジェクトを並替えます。プロジェクトをタップするとワークツリーが表示され、同様にドラッグできます。チェックをタップして完了します。',
'mobile.sessions.editProjectAria': '{label}を編集',
'mobile.sessions.dragHandleAria': '{label}をドラッグして並び替え',
'mobile.sessions.moveUpAria': '{label}を上に移動',
'mobile.sessions.moveDownAria': '{label}を下に移動',
'mobile.sessions.removeProjectAria': '{label}を削除',
'mobile.sessions.cancelRemoveProjectAria': '{label}の削除をキャンセル',
'mobile.sessions.confirmRemoveProject': '閉じる',
'mobile.sessions.confirmRemoveProjectAria': '{label}の削除を確認',
'mobile.sessions.toast.projectRemoved': '{label}を削除しました',
'mobile.sessions.archiveSessionAria': '{title}をアーカイブ',
'mobile.sessions.cancelArchiveAria': '{title}のアーカイブをキャンセル',
'mobile.sessions.renameSessionAria': '{title}の名前を変更',
'mobile.sessions.renameError': 'セッション名の変更に失敗しました',
'mobile.sessions.deleteSessionAria': '{title}を削除',
'mobile.sessions.confirmDeleteSessionAria': '{title}の削除を確認',
'mobile.projectEdit.worktreesTitle': 'ワークツリー',
'mobile.projectEdit.worktreesEmpty': 'このプロジェクトにはまだワークツリーがありません。',
'mobile.projectEdit.reorderHint': 'ドラッグしてワークツリーを並び替え。',
@@ -180,6 +185,8 @@ export const dict: Record<I18nKey, string> = {
'mobile.files.copyPathAria': 'ファイルパスをコピー',
'mobile.files.copyContent': '内容をコピー',
'mobile.files.copyContentAria': 'ファイル内容をコピー',
'mobile.files.editAria': 'ファイルを編集',
'mobile.files.doneEditingAria': '編集を終了',
'mobile.files.toast.pathCopied': 'パスをコピーしました',
'mobile.files.toast.contentCopied': '内容をコピーしました',
'mobile.files.toast.copyFailed': 'コピーに失敗しました',
@@ -2073,21 +2080,6 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.drop.insertMention': 'ドロップしてメンションとして挿入',
'chat.chatInput.drop.attachFiles': 'ここにファイルをドロップして添付',
'chat.chatInput.fileFallback': 'ファイル',
'chat.mobileStatus.editProjects.title': 'プロジェクトを編集',
'chat.mobileStatus.editProjects.footer': '項目をドラッグして並び替え、または矢印で移動。編集をタップして詳細を変更します。',
'chat.mobileStatus.editProjects.empty': '編集するプロジェクトがありません',
'chat.mobileStatus.projects.empty': 'プロジェクトがありません',
'chat.mobileStatus.projects.addAria': 'プロジェクトを追加',
'chat.mobileStatus.projects.removeTitle': 'プロジェクトを削除',
'chat.mobileStatus.projects.removeDescriptionPrefix': '本当に削除しますか?',
'chat.mobileStatus.projects.cancel': 'キャンセル',
'chat.mobileStatus.projects.remove': '削除',
'chat.mobileStatus.new': '新規',
'chat.mobileStatus.noSessionsInProject': 'このプロジェクトにセッションはありません',
'chat.mobileStatus.swipeHint': '← ここをスワイプでサイドバーを開く →',
'chat.mobileStatus.toast.addProjectFailed': 'プロジェクトの追加に失敗しました',
'chat.mobileStatus.toast.selectValidDirectory': '有効なディレクトリを選択してください。',
'chat.mobileStatus.toast.selectDirectoryFailed': 'ディレクトリの選択に失敗しました',
'chat.toolOutputDialog.image.previousAria': '前の画像',
'chat.toolOutputDialog.image.nextAria': '次の画像',
'chat.toolOutputDialog.image.closeAria': '画像プレビューを閉じる',
+11 -19
View File
@@ -53,6 +53,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.connect.unlockButton': '잠금 해제 후 연결',
'mobile.connect.cancelPassword': '다른 서버 사용',
'mobile.connect.connecting': '연결 중...',
'mobile.connect.notice.unreachable': '{label}에 연결할 수 없습니다. 서버가 실행 중인지 확인하세요.',
'mobile.connect.notice.authExpired': '{label} 액세스가 만료되었거나 취소되었습니다. 다시 로그인하세요.',
'mobile.connect.recovery.description': '저장된 서버에 연결할 수 없습니다. 서버가 실행 중인지 확인하거나 다른 인스턴스를 선택하세요.',
'mobile.connect.scanQr': 'QR 코드 스캔',
'mobile.connect.welcome.scanHint': '컴퓨터에서 「기기 추가」를 열어 QR 코드를 표시한 뒤 여기에서 스캔하세요.',
'mobile.connect.advanced': '고급',
@@ -89,9 +92,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.nav.settings': '설정',
'mobile.surface.closeAria': '닫기',
'mobile.header.openMenuAria': '메뉴 열기',
'mobile.header.openWorkspaceAria': '작업 공간 패널 열기',
'mobile.header.openMetadataAria': '세션 메타데이터 열기',
'mobile.header.metadata.context': '컨텍스트',
'mobile.header.metadata.branch': '브랜치',
'mobile.header.metadata.usage': '사용량',
'mobile.menu.titleAria': '작업 공간 도구',
'mobile.menu.files': '파일',
@@ -123,17 +126,19 @@ export const dict: Record<I18nKey, string> = {
'mobile.sessions.newChat': '새 채팅',
'mobile.sessions.editOrder': '프로젝트 순서 변경',
'mobile.sessions.doneEditing': '완료',
'mobile.sessions.editOrderHint': '핸들을 드래그하거나 화살표로 프로젝트 순서를 변경하세요. 완료하려면 체크를 누르세요.',
'mobile.sessions.editOrderHint': '핸들을 드래그하 프로젝트 순서를 변경하세요. 프로젝트를 탭하면 워크트리가 표시되며 같은 방식으로 드래그할 수 있습니다. 체크를 탭하면 완료됩니다.',
'mobile.sessions.dragHandleAria': '{label} 드래그하여 순서 변경',
'mobile.sessions.moveUpAria': '{label} 위로 이동',
'mobile.sessions.moveDownAria': '{label} 아래로 이동',
'mobile.sessions.removeProjectAria': '{label} 제거',
'mobile.sessions.cancelRemoveProjectAria': '{label} 제거 취소',
'mobile.sessions.confirmRemoveProject': '닫기',
'mobile.sessions.confirmRemoveProjectAria': '{label} 제거 확인',
'mobile.sessions.toast.projectRemoved': '{label} 제거됨',
'mobile.sessions.archiveSessionAria': '{title} 보관',
'mobile.sessions.cancelArchiveAria': '{title} 보관 취소',
'mobile.sessions.renameSessionAria': '{title} 이름 바꾸기',
'mobile.sessions.renameError': '세션 이름 변경에 실패했습니다',
'mobile.sessions.deleteSessionAria': '{title} 삭제',
'mobile.sessions.confirmDeleteSessionAria': '{title} 삭제 확인',
'mobile.sessions.editProjectAria': '{label} 편집',
'mobile.projectEdit.worktreesTitle': '워크트리',
'mobile.projectEdit.worktreesEmpty': '이 프로젝트에는 아직 워크트리가 없습니다.',
@@ -180,6 +185,8 @@ export const dict: Record<I18nKey, string> = {
'mobile.files.copyPathAria': '파일 경로 복사',
'mobile.files.copyContent': '내용 복사',
'mobile.files.copyContentAria': '파일 내용 복사',
'mobile.files.editAria': '파일 편집',
'mobile.files.doneEditingAria': '편집 완료',
'mobile.files.toast.pathCopied': '경로가 복사되었습니다',
'mobile.files.toast.contentCopied': '내용이 복사되었습니다',
'mobile.files.toast.copyFailed': '복사하지 못했습니다',
@@ -2074,21 +2081,6 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.drop.insertMention': '여기에 놓아 멘션으로 추가',
'chat.chatInput.drop.attachFiles': '여기에 놓아 파일 첨부',
'chat.chatInput.fileFallback': '파일',
'chat.mobileStatus.editProjects.title': '편집 프로젝트',
'chat.mobileStatus.editProjects.footer': '항목을 드래그하여 순서를 바꾸거나 화살표로 이동하세요. 세부 정보는 편집을 탭해 변경하세요.',
'chat.mobileStatus.editProjects.empty': '편집할 프로젝트 없음',
'chat.mobileStatus.projects.empty': '프로젝트 없음',
'chat.mobileStatus.projects.addAria': '프로젝트 추가',
'chat.mobileStatus.projects.removeTitle': '프로젝트 제거',
'chat.mobileStatus.projects.removeDescriptionPrefix': '다음을 제거하시겠습니까:',
'chat.mobileStatus.projects.cancel': '취소',
'chat.mobileStatus.projects.remove': '제거',
'chat.mobileStatus.new': '새로 만들기',
'chat.mobileStatus.noSessionsInProject': '이 프로젝트에 세션 없음',
'chat.mobileStatus.swipeHint': '← 여기서 스와이프해 사이드바 열기 →',
'chat.mobileStatus.toast.addProjectFailed': '프로젝트 추가 실패',
'chat.mobileStatus.toast.selectValidDirectory': '유효한 디렉터리를 선택하세요.',
'chat.mobileStatus.toast.selectDirectoryFailed': '디렉터리 선택 실패',
'chat.toolOutputDialog.image.previousAria': '이전 이미지',
'chat.toolOutputDialog.image.nextAria': '다음 이미지',
'chat.toolOutputDialog.image.closeAria': '이미지 미리보기 닫기',
+11 -19
View File
@@ -54,6 +54,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.connect.unlockButton': 'Odblokuj i połącz',
'mobile.connect.cancelPassword': 'Użyj innego serwera',
'mobile.connect.connecting': 'Łączenie...',
'mobile.connect.notice.unreachable': 'Nie udało się połączyć z {label}. Sprawdź, czy serwer działa.',
'mobile.connect.notice.authExpired': 'Dostęp do {label} wygasł lub został cofnięty. Zaloguj się ponownie.',
'mobile.connect.recovery.description': 'Nie udało się połączyć z zapisanym serwerem. Sprawdź, czy działa, albo wybierz inną instancję.',
'mobile.connect.scanQr': 'Skanuj kod QR',
'mobile.connect.welcome.scanHint': 'Na komputerze otwórz «Dodaj urządzenie», aby wyświetlić kod QR, i zeskanuj go tutaj.',
'mobile.connect.advanced': 'Zaawansowane',
@@ -90,9 +93,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.nav.settings': 'Ustawienia',
'mobile.surface.closeAria': 'Zamknij',
'mobile.header.openMenuAria': 'Otwórz menu',
'mobile.header.openWorkspaceAria': 'Otwórz panel roboczy',
'mobile.header.openMetadataAria': 'Otwórz metadane sesji',
'mobile.header.metadata.context': 'Kontekst',
'mobile.header.metadata.branch': 'Gałąź',
'mobile.header.metadata.usage': 'Użycie',
'mobile.menu.titleAria': 'Narzędzia obszaru roboczego',
'mobile.menu.files': 'Pliki',
@@ -124,17 +127,19 @@ export const dict: Record<I18nKey, string> = {
'mobile.sessions.newChat': 'Nowy czat',
'mobile.sessions.editOrder': 'Zmień kolejność projektów',
'mobile.sessions.doneEditing': 'Gotowe',
'mobile.sessions.editOrderHint': 'Przeciągnij uchwyt lub użyj strzałek, aby zmienić kolejność. Naciśnij znacznik, aby zakończyć.',
'mobile.sessions.editOrderHint': 'Przeciągnij uchwyt, aby zmienić kolejność projektów. Stuknij projekt, aby pokazać jego worktree i również je przeciągać. Stuknij znacznik, aby zakończyć.',
'mobile.sessions.dragHandleAria': 'Przeciągnij {label}, aby zmienić kolejność',
'mobile.sessions.moveUpAria': 'Przenieś {label} w górę',
'mobile.sessions.moveDownAria': 'Przenieś {label} w dół',
'mobile.sessions.removeProjectAria': 'Usuń {label}',
'mobile.sessions.cancelRemoveProjectAria': 'Anuluj usuwanie {label}',
'mobile.sessions.confirmRemoveProject': 'Zamknij',
'mobile.sessions.confirmRemoveProjectAria': 'Potwierdź usunięcie {label}',
'mobile.sessions.toast.projectRemoved': 'Usunięto {label}',
'mobile.sessions.archiveSessionAria': 'Zarchiwizuj {title}',
'mobile.sessions.cancelArchiveAria': 'Anuluj archiwizację {title}',
'mobile.sessions.renameSessionAria': 'Zmień nazwę {title}',
'mobile.sessions.renameError': 'Nie udało się zmienić nazwy sesji',
'mobile.sessions.deleteSessionAria': 'Usuń {title}',
'mobile.sessions.confirmDeleteSessionAria': 'Potwierdź usunięcie {title}',
'mobile.sessions.editProjectAria': 'Edytuj {label}',
'mobile.projectEdit.worktreesTitle': 'Worktree',
'mobile.projectEdit.worktreesEmpty': 'Ten projekt nie ma jeszcze worktree.',
@@ -181,6 +186,8 @@ export const dict: Record<I18nKey, string> = {
'mobile.files.copyPathAria': 'Kopiuj ścieżkę pliku',
'mobile.files.copyContent': 'Kopiuj zawartość',
'mobile.files.copyContentAria': 'Kopiuj zawartość pliku',
'mobile.files.editAria': 'Edytuj plik',
'mobile.files.doneEditingAria': 'Zakończ edycję',
'mobile.files.toast.pathCopied': 'Ścieżka skopiowana',
'mobile.files.toast.contentCopied': 'Zawartość skopiowana',
'mobile.files.toast.copyFailed': 'Kopiowanie nie powiodło się',
@@ -1238,21 +1245,6 @@ export const dict: Record<I18nKey, string> = {
'chat.reasoningTrace.expandAria': 'Rozwiń ślad rozumowania',
'chat.reasoningTrace.collapseAria': 'Zwiń ślad rozumowania',
'chat.reasoningTrace.thought': 'Przemyślał',
'chat.mobileStatus.editProjects.empty': 'Brak projektów do edycji',
'chat.mobileStatus.editProjects.footer': 'Przeciągnij elementy, aby zmienić kolejność, lub użyj strzałek do przesuwania. Dotknij „edytuj”, aby zmienić szczegóły.',
'chat.mobileStatus.editProjects.title': 'Edytuj projekty',
'chat.mobileStatus.new': 'Nowy',
'chat.mobileStatus.noSessionsInProject': 'Brak sesji w tym projekcie',
'chat.mobileStatus.projects.addAria': 'Dodaj projekt',
'chat.mobileStatus.projects.cancel': 'Anuluj',
'chat.mobileStatus.projects.empty': 'Brak projektów',
'chat.mobileStatus.projects.remove': 'Usuń',
'chat.mobileStatus.projects.removeDescriptionPrefix': 'Czy na pewno chcesz usunąć',
'chat.mobileStatus.projects.removeTitle': 'Usuń projekt',
'chat.mobileStatus.swipeHint': '← Przesuń tutaj, aby otworzyć paski boczne →',
'chat.mobileStatus.toast.addProjectFailed': 'Nie udało się dodać projektu',
'chat.mobileStatus.toast.selectDirectoryFailed': 'Nie udało się wybrać katalogu',
'chat.mobileStatus.toast.selectValidDirectory': 'Wybierz prawidłowy katalog.',
'chat.modelControls.addNewProvider': 'Dodaj nowego dostawcę',
'chat.modelControls.addToFavorites': 'Dodaj do ulubionych',
'chat.modelControls.bash': 'Bash',
+11 -19
View File
@@ -53,6 +53,9 @@ export const dict: Record<I18nKey, string> = {
"mobile.connect.unlockButton": "Desbloquear e conectar",
"mobile.connect.cancelPassword": "Usar outro servidor",
"mobile.connect.connecting": "Conectando...",
"mobile.connect.notice.unreachable": "Não foi possível conectar a {label}. Verifique se o servidor está em execução.",
"mobile.connect.notice.authExpired": "O acesso a {label} expirou ou foi revogado. Entre novamente.",
"mobile.connect.recovery.description": "Não foi possível conectar ao servidor salvo. Verifique se ele está em execução ou escolha outra instância.",
"mobile.connect.scanQr": "Ler código QR",
"mobile.connect.welcome.scanHint": "No seu computador, abra «Adicionar um dispositivo» para mostrar um código QR e escaneie aqui.",
"mobile.connect.advanced": "Avançado",
@@ -89,9 +92,9 @@ export const dict: Record<I18nKey, string> = {
"mobile.nav.settings": "Configurações",
"mobile.surface.closeAria": "Fechar",
"mobile.header.openMenuAria": "Abrir menu",
"mobile.header.openWorkspaceAria": "Abrir painel de trabalho",
"mobile.header.openMetadataAria": "Abrir metadados da sessão",
"mobile.header.metadata.context": "Contexto",
"mobile.header.metadata.branch": "Branch",
"mobile.header.metadata.usage": "Uso",
"mobile.menu.titleAria": "Ferramentas do espaço de trabalho",
"mobile.menu.files": "Arquivos",
@@ -123,17 +126,19 @@ export const dict: Record<I18nKey, string> = {
"mobile.sessions.newChat": "Novo chat",
"mobile.sessions.editOrder": "Reordenar projetos",
"mobile.sessions.doneEditing": "Concluído",
"mobile.sessions.editOrderHint": "Arraste a alça ou use as setas para reordenar os projetos. Toque na marca para finalizar.",
"mobile.sessions.editOrderHint": "Arraste a alça para reordenar os projetos. Toque em um projeto para mostrar seus worktrees e arraste-os também. Toque na marca para concluir.",
"mobile.sessions.dragHandleAria": "Arrastar {label} para reordenar",
"mobile.sessions.moveUpAria": "Mover {label} para cima",
"mobile.sessions.moveDownAria": "Mover {label} para baixo",
"mobile.sessions.removeProjectAria": "Remover {label}",
"mobile.sessions.cancelRemoveProjectAria": "Cancelar remoção de {label}",
"mobile.sessions.confirmRemoveProject": "Fechar",
"mobile.sessions.confirmRemoveProjectAria": "Confirmar remoção de {label}",
"mobile.sessions.toast.projectRemoved": "Removido {label}",
"mobile.sessions.archiveSessionAria": "Arquivar {title}",
"mobile.sessions.cancelArchiveAria": "Cancelar arquivamento de {title}",
"mobile.sessions.renameSessionAria": "Renomear {title}",
"mobile.sessions.renameError": "Falha ao renomear a sessão",
"mobile.sessions.deleteSessionAria": "Excluir {title}",
"mobile.sessions.confirmDeleteSessionAria": "Confirmar exclusão de {title}",
"mobile.sessions.editProjectAria": "Editar {label}",
"mobile.projectEdit.worktreesTitle": "Worktrees",
"mobile.projectEdit.worktreesEmpty": "Este projeto ainda não tem worktrees.",
@@ -180,6 +185,8 @@ export const dict: Record<I18nKey, string> = {
"mobile.files.copyPathAria": "Copiar caminho do arquivo",
"mobile.files.copyContent": "Copiar conteúdo",
"mobile.files.copyContentAria": "Copiar conteúdo do arquivo",
"mobile.files.editAria": "Editar arquivo",
"mobile.files.doneEditingAria": "Concluir edição",
"mobile.files.toast.pathCopied": "Caminho copiado",
"mobile.files.toast.contentCopied": "Conteúdo copiado",
"mobile.files.toast.copyFailed": "Falha ao copiar",
@@ -2040,21 +2047,6 @@ export const dict: Record<I18nKey, string> = {
"chat.chatInput.drop.insertMention": "Solte para inserir como menção",
"chat.chatInput.drop.attachFiles": "Solte arquivos aqui para anexar",
"chat.chatInput.fileFallback": "arquivo",
"chat.mobileStatus.editProjects.title": "Editar projetos",
"chat.mobileStatus.editProjects.footer": "Arraste os itens para reordenar ou use as setas para mover. Toque em editar para alterar os detalhes.",
"chat.mobileStatus.editProjects.empty": "Não há projetos para editar",
"chat.mobileStatus.projects.empty": "Não há projetos",
"chat.mobileStatus.projects.addAria": "Adicionar projeto",
"chat.mobileStatus.projects.removeTitle": "Excluir projeto",
"chat.mobileStatus.projects.removeDescriptionPrefix": "Tem certeza de que deseja excluir",
"chat.mobileStatus.projects.cancel": "Cancelar",
"chat.mobileStatus.projects.remove": "Excluir",
"chat.mobileStatus.new": "Novo",
"chat.mobileStatus.noSessionsInProject": "Não há sessões neste projeto",
"chat.mobileStatus.swipeHint": "← Deslize aqui para abrir os painéis laterais →",
"chat.mobileStatus.toast.addProjectFailed": "Não foi possível adicionar o projeto",
"chat.mobileStatus.toast.selectValidDirectory": "Selecione um diretório válido.",
"chat.mobileStatus.toast.selectDirectoryFailed": "Não foi possível selecionar o diretório",
"chat.toolOutputDialog.image.previousAria": "Imagem anterior",
"chat.toolOutputDialog.image.nextAria": "Próxima imagem",
"chat.toolOutputDialog.image.closeAria": "Fechar prévia de imagem",
+11 -19
View File
@@ -53,6 +53,9 @@ export const dict: Record<I18nKey, string> = {
"mobile.connect.unlockButton": "Розблокувати і підключити",
"mobile.connect.cancelPassword": "Інший сервер",
"mobile.connect.connecting": "Підключення...",
"mobile.connect.notice.unreachable": "Не вдалося з'єднатися з {label}. Перевірте, що сервер запущено.",
"mobile.connect.notice.authExpired": "Доступ до {label} протух або був відкликаний. Увійдіть знову.",
"mobile.connect.recovery.description": "Не вдалося з'єднатися зі збереженим сервером. Перевірте, що він запущений, або оберіть інший інстанс.",
"mobile.connect.scanQr": "Сканувати QR-код",
"mobile.connect.welcome.scanHint": "На компʼютері відкрийте «Додати пристрій», щоб показати QR-код, і відскануйте його тут.",
"mobile.connect.advanced": "Додатково",
@@ -89,9 +92,9 @@ export const dict: Record<I18nKey, string> = {
"mobile.nav.settings": "Налаштування",
"mobile.surface.closeAria": "Закрити",
"mobile.header.openMenuAria": "Відкрити меню",
"mobile.header.openWorkspaceAria": "Відкрити робочу панель",
"mobile.header.openMetadataAria": "Відкрити метадані сесії",
"mobile.header.metadata.context": "Контекст",
"mobile.header.metadata.branch": "Гілка",
"mobile.header.metadata.usage": "Використання",
"mobile.menu.titleAria": "Інструменти робочого простору",
"mobile.menu.files": "Файли",
@@ -123,17 +126,19 @@ export const dict: Record<I18nKey, string> = {
"mobile.sessions.newChat": "Новий чат",
"mobile.sessions.editOrder": "Змінити порядок проєктів",
"mobile.sessions.doneEditing": "Готово",
"mobile.sessions.editOrderHint": "Перетягни ручку або скористайся стрілками, щоб змінити порядок проєктів. Натисни галочку щоб завершити.",
"mobile.sessions.editOrderHint": "Перетягни ручку, щоб змінити порядок проєктів. Торкнись проєкту, щоб показати його worktree, і перетягуй їх так само. Натисни галочку, щоб завершити.",
"mobile.sessions.dragHandleAria": "Перетягни {label}, щоб змінити порядок",
"mobile.sessions.moveUpAria": "Перемістити {label} вгору",
"mobile.sessions.moveDownAria": "Перемістити {label} вниз",
"mobile.sessions.removeProjectAria": "Видалити {label}",
"mobile.sessions.cancelRemoveProjectAria": "Скасувати видалення {label}",
"mobile.sessions.confirmRemoveProject": "Закрити",
"mobile.sessions.confirmRemoveProjectAria": "Підтвердити видалення {label}",
"mobile.sessions.toast.projectRemoved": "Видалено {label}",
"mobile.sessions.archiveSessionAria": "Архівувати {title}",
"mobile.sessions.cancelArchiveAria": "Скасувати архівування {title}",
"mobile.sessions.renameSessionAria": "Перейменувати {title}",
"mobile.sessions.renameError": "Не вдалося перейменувати сесію",
"mobile.sessions.deleteSessionAria": "Видалити {title}",
"mobile.sessions.confirmDeleteSessionAria": "Підтвердити видалення {title}",
"mobile.sessions.editProjectAria": "Редагувати {label}",
"mobile.projectEdit.worktreesTitle": "Ворктрі",
"mobile.projectEdit.worktreesEmpty": "У цьому проєкті ще немає ворктрі.",
@@ -180,6 +185,8 @@ export const dict: Record<I18nKey, string> = {
"mobile.files.copyPathAria": "Скопіювати шлях до файлу",
"mobile.files.copyContent": "Скопіювати вміст",
"mobile.files.copyContentAria": "Скопіювати вміст файлу",
"mobile.files.editAria": "Редагувати файл",
"mobile.files.doneEditingAria": "Завершити редагування",
"mobile.files.toast.pathCopied": "Шлях скопійовано",
"mobile.files.toast.contentCopied": "Вміст скопійовано",
"mobile.files.toast.copyFailed": "Не вдалося скопіювати",
@@ -2040,21 +2047,6 @@ export const dict: Record<I18nKey, string> = {
"chat.chatInput.drop.insertMention": "Відпустіть, щоб вставити як згадку",
"chat.chatInput.drop.attachFiles": "Перетягніть файли сюди, щоб прикріпити",
"chat.chatInput.fileFallback": "файл",
"chat.mobileStatus.editProjects.title": "Редагувати проєкти",
"chat.mobileStatus.editProjects.footer": "Перетягніть елементи, щоб змінити порядок, або використовуйте стрілки, щоб перемістити. Натисніть «Редагувати», щоб змінити деталі.",
"chat.mobileStatus.editProjects.empty": "Немає проєктів для редагування",
"chat.mobileStatus.projects.empty": "Жодних проєктів",
"chat.mobileStatus.projects.addAria": "Додати проєкт",
"chat.mobileStatus.projects.removeTitle": "Видалити проєкт",
"chat.mobileStatus.projects.removeDescriptionPrefix": "Ви впевнені, що хочете видалити",
"chat.mobileStatus.projects.cancel": "Скасувати",
"chat.mobileStatus.projects.remove": "Видалити",
"chat.mobileStatus.new": "Новий",
"chat.mobileStatus.noSessionsInProject": "У цьому проєкті немає сесій",
"chat.mobileStatus.swipeHint": "← Проведіть пальцем тут, щоб відкрити бічні панелі →",
"chat.mobileStatus.toast.addProjectFailed": "Не вдалося додати проєкт",
"chat.mobileStatus.toast.selectValidDirectory": "Виберіть правильний каталог.",
"chat.mobileStatus.toast.selectDirectoryFailed": "Не вдалося вибрати каталог",
"chat.toolOutputDialog.image.previousAria": "Попереднє зображення",
"chat.toolOutputDialog.image.nextAria": "Наступне зображення",
"chat.toolOutputDialog.image.closeAria": "Закрити попередній перегляд зображення",
+11 -19
View File
@@ -53,6 +53,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.connect.unlockButton': '解锁并连接',
'mobile.connect.cancelPassword': '使用其他服务器',
'mobile.connect.connecting': '连接中...',
'mobile.connect.notice.unreachable': '无法连接到 {label}。请确认服务器正在运行。',
'mobile.connect.notice.authExpired': '对 {label} 的访问已过期或被撤销。请重新登录。',
'mobile.connect.recovery.description': '无法连接到已保存的服务器。请确认它正在运行,或选择其他实例。',
'mobile.connect.scanQr': '扫描二维码',
'mobile.connect.welcome.scanHint': '在电脑上打开「添加设备」显示二维码,然后在这里扫描。',
'mobile.connect.advanced': '高级',
@@ -89,9 +92,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.nav.settings': '设置',
'mobile.surface.closeAria': '关闭',
'mobile.header.openMenuAria': '打开菜单',
'mobile.header.openWorkspaceAria': '打开工作区面板',
'mobile.header.openMetadataAria': '打开会话元数据',
'mobile.header.metadata.context': '上下文',
'mobile.header.metadata.branch': '分支',
'mobile.header.metadata.usage': '用量',
'mobile.menu.titleAria': '工作区工具',
'mobile.menu.files': '文件',
@@ -123,17 +126,19 @@ export const dict: Record<I18nKey, string> = {
'mobile.sessions.newChat': '新会话',
'mobile.sessions.editOrder': '重新排序项目',
'mobile.sessions.doneEditing': '完成',
'mobile.sessions.editOrderHint': '拖动手柄或使用箭头重新排序。点击对勾完成。',
'mobile.sessions.editOrderHint': '拖动手柄以重新排序项目。点按项目可显示其工作树并同样拖动排序。点按对勾完成。',
'mobile.sessions.dragHandleAria': '拖动 {label} 以重新排序',
'mobile.sessions.moveUpAria': '将 {label} 上移',
'mobile.sessions.moveDownAria': '将 {label} 下移',
'mobile.sessions.removeProjectAria': '移除 {label}',
'mobile.sessions.cancelRemoveProjectAria': '取消移除 {label}',
'mobile.sessions.confirmRemoveProject': '关闭',
'mobile.sessions.confirmRemoveProjectAria': '确认移除 {label}',
'mobile.sessions.toast.projectRemoved': '已移除 {label}',
'mobile.sessions.archiveSessionAria': '归档 {title}',
'mobile.sessions.cancelArchiveAria': '取消归档 {title}',
'mobile.sessions.renameSessionAria': '重命名 {title}',
'mobile.sessions.renameError': '重命名会话失败',
'mobile.sessions.deleteSessionAria': '删除 {title}',
'mobile.sessions.confirmDeleteSessionAria': '确认删除 {title}',
'mobile.sessions.editProjectAria': '编辑 {label}',
'mobile.projectEdit.worktreesTitle': '工作树',
'mobile.projectEdit.worktreesEmpty': '此项目还没有工作树。',
@@ -180,6 +185,8 @@ export const dict: Record<I18nKey, string> = {
'mobile.files.copyPathAria': '复制文件路径',
'mobile.files.copyContent': '复制内容',
'mobile.files.copyContentAria': '复制文件内容',
'mobile.files.editAria': '编辑文件',
'mobile.files.doneEditingAria': '完成编辑',
'mobile.files.toast.pathCopied': '路径已复制',
'mobile.files.toast.contentCopied': '内容已复制',
'mobile.files.toast.copyFailed': '复制失败',
@@ -2040,21 +2047,6 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.drop.insertMention': '释放以插入为提及',
'chat.chatInput.drop.attachFiles': '将文件拖放到此处以附加',
'chat.chatInput.fileFallback': '文件',
'chat.mobileStatus.editProjects.title': '编辑项目',
'chat.mobileStatus.editProjects.footer': '拖动可重新排序,或使用箭头移动。点击编辑可修改详情。',
'chat.mobileStatus.editProjects.empty': '没有可编辑的项目',
'chat.mobileStatus.projects.empty': '没有项目',
'chat.mobileStatus.projects.addAria': '添加项目',
'chat.mobileStatus.projects.removeTitle': '移除项目',
'chat.mobileStatus.projects.removeDescriptionPrefix': '确定要移除',
'chat.mobileStatus.projects.cancel': '取消',
'chat.mobileStatus.projects.remove': '移除',
'chat.mobileStatus.new': '新建',
'chat.mobileStatus.noSessionsInProject': '该项目中没有会话',
'chat.mobileStatus.swipeHint': '← 在此滑动以打开侧边栏 →',
'chat.mobileStatus.toast.addProjectFailed': '添加项目失败',
'chat.mobileStatus.toast.selectValidDirectory': '请选择有效目录。',
'chat.mobileStatus.toast.selectDirectoryFailed': '选择目录失败',
'chat.toolOutputDialog.image.previousAria': '上一张图片',
'chat.toolOutputDialog.image.nextAria': '下一张图片',
'chat.toolOutputDialog.image.closeAria': '关闭图片预览',
+11 -19
View File
@@ -53,6 +53,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.connect.unlockButton': '解鎖並連線',
'mobile.connect.cancelPassword': '使用其他伺服器',
'mobile.connect.connecting': '連線中...',
'mobile.connect.notice.unreachable': '無法連線至 {label}。請確認伺服器正在執行。',
'mobile.connect.notice.authExpired': '對 {label} 的存取已過期或被撤銷。請重新登入。',
'mobile.connect.recovery.description': '無法連線至已儲存的伺服器。請確認它正在執行,或選擇其他執行個體。',
'mobile.connect.scanQr': '掃描 QR code',
'mobile.connect.welcome.scanHint': '在電腦上開啟「新增裝置」顯示 QR 代碼,然後在這裡掃描。',
'mobile.connect.advanced': '進階',
@@ -89,9 +92,9 @@ export const dict: Record<I18nKey, string> = {
'mobile.nav.settings': '設定',
'mobile.surface.closeAria': '關閉',
'mobile.header.openMenuAria': '開啟選單',
'mobile.header.openWorkspaceAria': '開啟工作區面板',
'mobile.header.openMetadataAria': '開啟工作階段中繼資料',
'mobile.header.metadata.context': '上下文',
'mobile.header.metadata.branch': '分支',
'mobile.header.metadata.usage': '用量',
'mobile.menu.titleAria': '工作區工具',
'mobile.menu.files': '檔案',
@@ -123,17 +126,19 @@ export const dict: Record<I18nKey, string> = {
'mobile.sessions.newChat': '新聊天',
'mobile.sessions.editOrder': '重新排序專案',
'mobile.sessions.doneEditing': '完成',
'mobile.sessions.editOrderHint': '拖曳把手或使用箭頭重新排序專案。點勾號完成。',
'mobile.sessions.editOrderHint': '拖曳手柄以重新排序專案。點按專案可顯示其工作樹並同樣拖曳排序。點按勾號完成。',
'mobile.sessions.dragHandleAria': '拖曳 {label} 以重新排序',
'mobile.sessions.moveUpAria': '將 {label} 上移',
'mobile.sessions.moveDownAria': '將 {label} 下移',
'mobile.sessions.removeProjectAria': '移除 {label}',
'mobile.sessions.cancelRemoveProjectAria': '取消移除 {label}',
'mobile.sessions.confirmRemoveProject': '關閉',
'mobile.sessions.confirmRemoveProjectAria': '確認移除 {label}',
'mobile.sessions.toast.projectRemoved': '已移除 {label}',
'mobile.sessions.archiveSessionAria': '封存 {title}',
'mobile.sessions.cancelArchiveAria': '取消封存 {title}',
'mobile.sessions.renameSessionAria': '重新命名 {title}',
'mobile.sessions.renameError': '重新命名工作階段失敗',
'mobile.sessions.deleteSessionAria': '刪除 {title}',
'mobile.sessions.confirmDeleteSessionAria': '確認刪除 {title}',
'mobile.sessions.editProjectAria': '編輯 {label}',
'mobile.projectEdit.worktreesTitle': '工作樹',
'mobile.projectEdit.worktreesEmpty': '此專案還沒有工作樹。',
@@ -180,6 +185,8 @@ export const dict: Record<I18nKey, string> = {
'mobile.files.copyPathAria': '複製檔案路徑',
'mobile.files.copyContent': '複製內容',
'mobile.files.copyContentAria': '複製檔案內容',
'mobile.files.editAria': '編輯檔案',
'mobile.files.doneEditingAria': '完成編輯',
'mobile.files.toast.pathCopied': '路徑已複製',
'mobile.files.toast.contentCopied': '內容已複製',
'mobile.files.toast.copyFailed': '複製失敗',
@@ -2044,21 +2051,6 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.drop.insertMention': '放開以插入為提及',
'chat.chatInput.drop.attachFiles': '將檔案拖放至此處以附加',
'chat.chatInput.fileFallback': '檔案',
'chat.mobileStatus.editProjects.title': '編輯專案',
'chat.mobileStatus.editProjects.footer': '拖曳可重新排序,或使用箭頭移動。點擊編輯可修改詳情。',
'chat.mobileStatus.editProjects.empty': '沒有可編輯的專案',
'chat.mobileStatus.projects.empty': '沒有專案',
'chat.mobileStatus.projects.addAria': '新增專案',
'chat.mobileStatus.projects.removeTitle': '移除專案',
'chat.mobileStatus.projects.removeDescriptionPrefix': '確定要移除',
'chat.mobileStatus.projects.cancel': '取消',
'chat.mobileStatus.projects.remove': '移除',
'chat.mobileStatus.new': '新增',
'chat.mobileStatus.noSessionsInProject': '該專案中沒有會話',
'chat.mobileStatus.swipeHint': '← 在此滑動以開啟側邊欄 →',
'chat.mobileStatus.toast.addProjectFailed': '新增專案失敗',
'chat.mobileStatus.toast.selectValidDirectory': '請選擇有效目錄。',
'chat.mobileStatus.toast.selectDirectoryFailed': '選擇目錄失敗',
'chat.toolOutputDialog.image.previousAria': '上一張圖片',
'chat.toolOutputDialog.image.nextAria': '下一張圖片',
'chat.toolOutputDialog.image.closeAria': '關閉圖片預覽',