style(i18n): restore literal UTF-8 chars in lanes.json locale files

The lock-indicator commit's JSON edit re-serialized both files through
something that escaped every non-ASCII character (—, …, ·, ▶, ■) as
\uXXXX, touching ~180 unrelated lines for a two-key addition. No
functional change (JSON \u escapes are semantically identical) — just
restoring the literal-character convention every other locale file uses.
This commit is contained in:
2026-08-04 11:37:18 +07:00
parent 1f3a5ff51d
commit c068f0cac6
2 changed files with 92 additions and 92 deletions
+9 -9
View File
@@ -11,7 +11,7 @@
"add": "Add lane", "add": "Add lane",
"addLane": "Create a lane from a working directory", "addLane": "Create a lane from a working directory",
"addLaneBaseLabel": "Branch to fork from", "addLaneBaseLabel": "Branch to fork from",
"addLaneNoBranches": "This repo has no commits yet \u2014 the worktree will start empty.", "addLaneNoBranches": "This repo has no commits yet the worktree will start empty.",
"addLaneNotARepo": "Not a git repository (or no read access) yet.", "addLaneNotARepo": "Not a git repository (or no read access) yet.",
"addLaneRepoHint": "An existing git repo. The dashboard creates a new worktree for the lane, not a folder you pick.", "addLaneRepoHint": "An existing git repo. The dashboard creates a new worktree for the lane, not a folder you pick.",
"addLaneRepoLabel": "Source repository", "addLaneRepoLabel": "Source repository",
@@ -40,9 +40,9 @@
"destructive.count.unpushed": "Unpushed commits", "destructive.count.unpushed": "Unpushed commits",
"destructive.count.untracked": "Untracked files", "destructive.count.untracked": "Untracked files",
"destructive.force": "I understand these unpushed commits will be discarded.", "destructive.force": "I understand these unpushed commits will be discarded.",
"destructive.loading": "Loading current facts\u2026", "destructive.loading": "Loading current facts",
"destructive.notice.activeSessionSkipped": "One or more sessions in this lane are still active and will be kept, not purged.", "destructive.notice.activeSessionSkipped": "One or more sessions in this lane are still active and will be kept, not purged.",
"destructive.notice.adopted": "This lane points at a directory you own. Only the dashboard's record of it is dropped \u2014 the directory and its files are left untouched.", "destructive.notice.adopted": "This lane points at a directory you own. Only the dashboard's record of it is dropped the directory and its files are left untouched.",
"destructive.notice.missing": "The lane directory is already gone. Removing it drops the dashboard's record and clears Git's stale worktree entry; nothing is deleted from disk.", "destructive.notice.missing": "The lane directory is already gone. Removing it drops the dashboard's record and clears Git's stale worktree entry; nothing is deleted from disk.",
"destructive.notice.unreadable": "The lane directory cannot be read as a Git worktree. Removal is attempted; if Git itself refuses, its worktree record is cleared directly instead. Either way, the directory itself is never touched.", "destructive.notice.unreadable": "The lane directory cannot be read as a Git worktree. Removal is attempted; if Git itself refuses, its worktree record is cleared directly instead. Either way, the directory itself is never touched.",
"destructive.purge.confirm": "Purge history", "destructive.purge.confirm": "Purge history",
@@ -57,24 +57,24 @@
"destructive.reset.title": "Reset managed worktree?", "destructive.reset.title": "Reset managed worktree?",
"destructive.warning.no-remote": "No Git remote is configured, so nothing here is backed up remotely. You can still proceed.", "destructive.warning.no-remote": "No Git remote is configured, so nothing here is backed up remotely. You can still proceed.",
"emptyState": "No lanes yet. Create one from a working directory:", "emptyState": "No lanes yet. Create one from a working directory:",
"git.uncommitted": "{{dirty}} modified \u00b7 {{untracked}} untracked", "git.uncommitted": "{{dirty}} modified · {{untracked}} untracked",
"kind.adopted": "adopted", "kind.adopted": "adopted",
"kind.managed": "managed", "kind.managed": "managed",
"laneHeader": "Lane {{id}} \u00b7 {{title}} \u00b7 {{pipeline}}", "laneHeader": "Lane {{id}} · {{title}} · {{pipeline}}",
"locks.held_one": "{{count}} lock held", "locks.held_one": "{{count}} lock held",
"locks.held_other": "{{count}} locks held", "locks.held_other": "{{count}} locks held",
"moreActions": "More actions", "moreActions": "More actions",
"preflightError": "Could not load the current lane facts.", "preflightError": "Could not load the current lane facts.",
"preflightErrorWithMessage": "Could not load the current lane facts: {{message}}", "preflightErrorWithMessage": "Could not load the current lane facts: {{message}}",
"runtime.boot": "\u25b6 up", "runtime.boot": " up",
"runtime.busy.down": "stopping\u2026", "runtime.busy.down": "stopping",
"runtime.busy.up": "booting\u2026", "runtime.busy.up": "booting",
"runtime.down": "down", "runtime.down": "down",
"runtime.healthy": "healthy", "runtime.healthy": "healthy",
"runtime.partial": "partial", "runtime.partial": "partial",
"runtime.slot": "slot {{slot}}", "runtime.slot": "slot {{slot}}",
"runtime.steppedAsideTitle": "Stepped aside from {{expected}}, which was already in use", "runtime.steppedAsideTitle": "Stepped aside from {{expected}}, which was already in use",
"runtime.stop": "\u25a0 down", "runtime.stop": " down",
"runtime.toggleTitle": "Boot or stop this lane's own application stack (separate from its Claude run)", "runtime.toggleTitle": "Boot or stop this lane's own application stack (separate from its Claude run)",
"stageUndeclared": "not declared", "stageUndeclared": "not declared",
"status.failed": "failed", "status.failed": "failed",
+83 -83
View File
@@ -1,87 +1,87 @@
{ {
"action.clear": "d\u1ecdn tr\u1ea1ng th\u00e1i", "action.clear": "dọn trạng thái",
"action.forget": "x\u00f3a l\u00e0n", "action.forget": "xóa làn",
"action.purge": "x\u00f3a l\u1ecbch s\u1eed", "action.purge": "xóa lịch sử",
"action.remove": "x\u00f3a l\u00e0n + worktree", "action.remove": "xóa làn + worktree",
"action.reset": "\u0111\u1eb7t l\u1ea1i worktree", "action.reset": "đặt lại worktree",
"action.start": "b\u1eaft \u0111\u1ea7u", "action.start": "bắt đầu",
"action.stop": "d\u1eebng", "action.stop": "dng",
"actionError": "Thao t\u00e1c l\u00e0n \u0111\u01b0\u1eddng th\u1ea5t b\u1ea1i: {{message}}", "actionError": "Thao tác làn đường thất bại: {{message}}",
"actionErrorUnknown": "L\u1ed7i kh\u00f4ng x\u00e1c \u0111\u1ecbnh", "actionErrorUnknown": "Lỗi không xác định",
"add": "Th\u00eam lane", "add": "Thêm lane",
"addLane": "T\u1ea1o lane t\u1eeb m\u1ed9t th\u01b0 m\u1ee5c l\u00e0m vi\u1ec7c", "addLane": "To lane từ một thư mục làm việc",
"addLaneBaseLabel": "Nh\u00e1nh \u0111\u1ec3 t\u1ea1o nh\u00e1nh m\u1edbi", "addLaneBaseLabel": "Nhánh để tạo nhánh mới",
"addLaneNoBranches": "Repo n\u00e0y ch\u01b0a c\u00f3 commit n\u00e0o \u2014 worktree s\u1ebd b\u1eaft \u0111\u1ea7u tr\u1ed1ng.", "addLaneNoBranches": "Repo này chưa có commit nào — worktree sẽ bắt đầu trống.",
"addLaneNotARepo": "Ch\u01b0a ph\u1ea3i repo git (ho\u1eb7c kh\u00f4ng c\u00f3 quy\u1ec1n \u0111\u1ecdc).", "addLaneNotARepo": "Chưa phải repo git (hoặc không có quyền đọc).",
"addLaneRepoHint": "M\u1ed9t repo git c\u00f3 s\u1eb5n. Dashboard t\u1ef1 t\u1ea1o worktree m\u1edbi cho lane, kh\u00f4ng ph\u1ea3i th\u01b0 m\u1ee5c b\u1ea1n ch\u1ecdn.", "addLaneRepoHint": "Mt repo git có sẵn. Dashboard tự tạo worktree mi cho lane, không phải thư mục bạn chọn.",
"addLaneRepoLabel": "Repo ngu\u1ed3n", "addLaneRepoLabel": "Repo ngun",
"addLaneTitleLabel": "Ti\u00eau \u0111\u1ec1", "addLaneTitleLabel": "Tiêu đề",
"addLaneTitlePlaceholder": "Kh\u00f4ng b\u1eaft bu\u1ed9c", "addLaneTitlePlaceholder": "Không bắt buộc",
"autoStage": "t\u1ef1 \u0111\u1ed9ng: {{stage}}", "autoStage": "tự động: {{stage}}",
"cardId": "L\u00e0n \u0111\u01b0\u1eddng {{id}}", "cardId": "Làn đường {{id}}",
"confirmRemoveCancel": "H\u1ee7y", "confirmRemoveCancel": "Hy",
"confirmRemoveConfirm": "X\u00f3a", "confirmRemoveConfirm": "Xóa",
"confirmRemoveMessage": "H\u00e0nh \u0111\u1ed9ng n\u00e0y kh\u00f4ng th\u1ec3 ho\u00e0n t\u00e1c.", "confirmRemoveMessage": "Hành động này không thể hoàn tác.",
"confirmRemoveTitle": "X\u00f3a l\u00e0n \u0111\u01b0\u1eddng?", "confirmRemoveTitle": "Xóa làn đường?",
"countDead": "\u0111\u00e3 ch\u1ebft", "countDead": "đã chết",
"countNeedsYou": "c\u1ea7n b\u1ea1n", "countNeedsYou": "cần bạn",
"countRunning": "\u0111ang ch\u1ea1y", "countRunning": "đang chạy",
"countTotal": "l\u00e0n \u0111\u01b0\u1eddng", "countTotal": "làn đường",
"destructive.blocked.adopted": "\u0110\u00e2y l\u00e0 th\u01b0 m\u1ee5c \u0111\u00e3 nh\u1eadn v\u00e0 kh\u00f4ng th\u1ec3 thay \u0111\u1ed5i b\u1eb1ng thao t\u00e1c worktree.", "destructive.blocked.adopted": "Đây là thư mục đã nhận và không thể thay đổi bằng thao tác worktree.",
"destructive.blocked.missing": "Th\u01b0 m\u1ee5c l\u00e0n \u0111\u01b0\u1eddng kh\u00f4ng c\u00f2n, n\u00ean kh\u00f4ng th\u1ec3 ti\u1ebfp t\u1ee5c thao t\u00e1c n\u00e0y.", "destructive.blocked.missing": "Thư mục làn đường không còn, nên không thể tiếp tục thao tác này.",
"destructive.blocked.unreadable": "Kh\u00f4ng th\u1ec3 \u0111\u1ecdc th\u01b0 m\u1ee5c l\u00e0n \u0111\u01b0\u1eddng nh\u01b0 m\u1ed9t Git worktree, n\u00ean kh\u00f4ng th\u1ec3 ti\u1ebfp t\u1ee5c thao t\u00e1c n\u00e0y.", "destructive.blocked.unreadable": "Không thể đọc thư mục làn đường như một Git worktree, nên không thể tiếp tục thao tác này.",
"destructive.cancel": "H\u1ee7y", "destructive.cancel": "Hy",
"destructive.count.bytesEstimate": "Dung l\u01b0\u1ee3ng gi\u1ea3i ph\u00f3ng (\u01b0\u1edbc t\u00ednh)", "destructive.count.bytesEstimate": "Dung lượng giải phóng (ước tính)",
"destructive.count.dirty": "T\u1ec7p \u0111\u00e3 s\u1eeda", "destructive.count.dirty": "Tệp đã sửa",
"destructive.count.events": "S\u1ef1 ki\u1ec7n", "destructive.count.events": "Sự kiện",
"destructive.count.head": "HEAD", "destructive.count.head": "HEAD",
"destructive.count.sessions": "Phi\u00ean", "destructive.count.sessions": "Phiên",
"destructive.count.tokenRows": "D\u00f2ng token", "destructive.count.tokenRows": "Dòng token",
"destructive.count.unpushed": "Commit ch\u01b0a \u0111\u1ea9y", "destructive.count.unpushed": "Commit chưa đẩy",
"destructive.count.untracked": "T\u1ec7p ch\u01b0a theo d\u00f5i", "destructive.count.untracked": "Tệp chưa theo dõi",
"destructive.force": "T\u00f4i hi\u1ec3u c\u00e1c commit ch\u01b0a \u0111\u1ea9y n\u00e0y s\u1ebd b\u1ecb lo\u1ea1i b\u1ecf.", "destructive.force": "Tôi hiểu các commit chưa đẩy này sẽ bị loại bỏ.",
"destructive.loading": "\u0110ang t\u1ea3i tr\u1ea1ng th\u00e1i hi\u1ec7n t\u1ea1i\u2026", "destructive.loading": "Đang tải trạng thái hiện tại…",
"destructive.notice.activeSessionSkipped": "M\u1ed9t ho\u1eb7c nhi\u1ec1u phi\u00ean trong l\u00e0n \u0111\u01b0\u1eddng n\u00e0y v\u1eabn \u0111ang ho\u1ea1t \u0111\u1ed9ng v\u00e0 s\u1ebd \u0111\u01b0\u1ee3c gi\u1eef l\u1ea1i, kh\u00f4ng b\u1ecb d\u1ecdn.", "destructive.notice.activeSessionSkipped": "Một hoặc nhiều phiên trong làn đường này vẫn đang hoạt động và sẽ được giữ lại, không bị dọn.",
"destructive.notice.adopted": "L\u00e0n \u0111\u01b0\u1eddng n\u00e0y tr\u1ecf t\u1edbi th\u01b0 m\u1ee5c c\u1ee7a b\u1ea1n. Ch\u1ec9 b\u1ea3n ghi tr\u00ean b\u1ea3ng \u0111i\u1ec1u khi\u1ec3n b\u1ecb x\u00f3a \u2014 th\u01b0 m\u1ee5c v\u00e0 c\u00e1c t\u1ec7p b\u00ean trong kh\u00f4ng b\u1ecb thay \u0111\u1ed5i.", "destructive.notice.adopted": "Làn đường này trỏ tới thư mục của bạn. Chỉ bản ghi trên bảng điều khiển bị xóa — thư mục và các tệp bên trong không bị thay đổi.",
"destructive.notice.missing": "Th\u01b0 m\u1ee5c l\u00e0n \u0111\u01b0\u1eddng \u0111\u00e3 kh\u00f4ng c\u00f2n. Vi\u1ec7c x\u00f3a ch\u1ec9 b\u1ecf b\u1ea3n ghi tr\u00ean b\u1ea3ng \u0111i\u1ec1u khi\u1ec3n v\u00e0 d\u1ecdn m\u1ee5c worktree c\u0169 trong Git; kh\u00f4ng t\u1ec7p n\u00e0o b\u1ecb x\u00f3a kh\u1ecfi \u0111\u0129a.", "destructive.notice.missing": "Thư mục làn đường đã không còn. Việc xóa chỉ bỏ bản ghi trên bảng điều khiển và dọn mục worktree cũ trong Git; không tệp nào bị xóa khỏi đĩa.",
"destructive.notice.unreadable": "Kh\u00f4ng th\u1ec3 \u0111\u1ecdc th\u01b0 m\u1ee5c l\u00e0n \u0111\u01b0\u1eddng nh\u01b0 m\u1ed9t Git worktree. H\u1ec7 th\u1ed1ng s\u1ebd th\u1eed x\u00f3a; n\u1ebfu Git t\u1ef1 ch\u1ed1i, m\u1ee5c ghi worktree c\u1ee7a n\u00f3 s\u1ebd \u0111\u01b0\u1ee3c d\u1ecdn tr\u1ef1c ti\u1ebfp thay th\u1ebf. Trong m\u1ecdi tr\u01b0\u1eddng h\u1ee3p, th\u01b0 m\u1ee5c v\u1eabn kh\u00f4ng b\u1ecb thay \u0111\u1ed5i.", "destructive.notice.unreadable": "Không thể đọc thư mục làn đường như một Git worktree. Hệ thống sẽ thử xóa; nếu Git tự chối, mục ghi worktree của nó sẽ được dọn trực tiếp thay thế. Trong mọi trường hợp, thư mục vẫn không bị thay đổi.",
"destructive.purge.confirm": "X\u00f3a l\u1ecbch s\u1eed", "destructive.purge.confirm": "Xóa lịch sử",
"destructive.purge.message": "H\u00e3y x\u00e1c nh\u1eadn c\u00e1c s\u1ed1 li\u1ec7u hi\u1ec7n t\u1ea1i tr\u01b0\u1edbc khi x\u00f3a l\u1ecbch s\u1eed phi\u00ean \u0111\u00e3 l\u01b0u.", "destructive.purge.message": "Hãy xác nhận các số liệu hiện tại trước khi xóa lịch sử phiên đã lưu.",
"destructive.purge.title": "X\u00f3a l\u1ecbch s\u1eed l\u00e0n \u0111\u01b0\u1eddng?", "destructive.purge.title": "Xóa lịch sử làn đường?",
"destructive.remove.confirm": "X\u00f3a l\u00e0n \u0111\u01b0\u1eddng", "destructive.remove.confirm": "Xóa làn đường",
"destructive.remove.message": "H\u00e3y x\u00e1c nh\u1eadn c\u00e1c s\u1ed1 li\u1ec7u hi\u1ec7n t\u1ea1i tr\u01b0\u1edbc khi th\u1ef1c hi\u1ec7n thao t\u00e1c n\u00e0y.", "destructive.remove.message": "Hãy xác nhận các số liệu hiện tại trước khi thực hiện thao tác này.",
"destructive.remove.title": "X\u00f3a l\u00e0n \u0111\u01b0\u1eddng?", "destructive.remove.title": "Xóa làn đường?",
"destructive.reset.confirm": "\u0110\u1eb7t l\u1ea1i worktree", "destructive.reset.confirm": "Đặt lại worktree",
"destructive.reset.message": "H\u00e3y x\u00e1c nh\u1eadn c\u00e1c s\u1ed1 li\u1ec7u hi\u1ec7n t\u1ea1i tr\u01b0\u1edbc khi \u0111\u1eb7t l\u1ea1i worktree n\u00e0y.", "destructive.reset.message": "Hãy xác nhận các số liệu hiện tại trước khi đặt lại worktree này.",
"destructive.reset.survives": "C\u00e1c t\u1ec7p Git b\u1ecf qua nh\u01b0 node_modules v\u00e0 .env \u0111\u01b0\u1ee3c gi\u1eef l\u1ea1i; c\u00e1c t\u1ec7p ch\u01b0a theo d\u00f5i s\u1ebd b\u1ecb x\u00f3a.", "destructive.reset.survives": "Các tệp Git b qua như node_modules và .env được giữ lại; các tệp chưa theo dõi sẽ bị xóa.",
"destructive.reset.title": "\u0110\u1eb7t l\u1ea1i worktree \u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd?", "destructive.reset.title": "Đặt lại worktree được quản lý?",
"destructive.warning.no-remote": "Ch\u01b0a c\u1ea5u h\u00ecnh Git remote, n\u00ean kh\u00f4ng c\u00f3 b\u1ea3n sao l\u01b0u \u1edf xa. B\u1ea1n v\u1eabn c\u00f3 th\u1ec3 ti\u1ebfp t\u1ee5c.", "destructive.warning.no-remote": "Chưa cấu hình Git remote, nên không có bản sao lưu ở xa. Bạn vẫn có thể tiếp tục.",
"emptyState": "Ch\u01b0a c\u00f3 l\u00e0n \u0111\u01b0\u1eddng n\u00e0o. T\u1ea1o m\u1ed9t t\u1eeb th\u01b0 m\u1ee5c l\u00e0m vi\u1ec7c:", "emptyState": "Chưa có làn đường nào. Tạo một từ thư mục làm việc:",
"git.uncommitted": "{{dirty}} \u0111\u00e3 s\u1eeda \u00b7 {{untracked}} ch\u01b0a theo d\u00f5i", "git.uncommitted": "{{dirty}} đã sửa · {{untracked}} chưa theo dõi",
"kind.adopted": "\u0111\u00e3 nh\u1eadn", "kind.adopted": "đã nhận",
"kind.managed": "\u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd", "kind.managed": "được quản lý",
"laneHeader": "L\u00e0n \u0111\u01b0\u1eddng {{id}} \u00b7 {{title}} \u00b7 {{pipeline}}", "laneHeader": "Làn đường {{id}} · {{title}} · {{pipeline}}",
"locks.held_one": "\u0110ang gi\u1eef {{count}} kh\u00f3a", "locks.held_one": "Đang giữ {{count}} khóa",
"locks.held_other": "\u0110ang gi\u1eef {{count}} kh\u00f3a", "locks.held_other": "Đang giữ {{count}} khóa",
"moreActions": "Th\u00eam h\u00e0nh \u0111\u1ed9ng", "moreActions": "Thêm hành động",
"preflightError": "Kh\u00f4ng th\u1ec3 t\u1ea3i tr\u1ea1ng th\u00e1i l\u00e0n \u0111\u01b0\u1eddng hi\u1ec7n t\u1ea1i.", "preflightError": "Không thể tải trạng thái làn đường hiện tại.",
"preflightErrorWithMessage": "Kh\u00f4ng th\u1ec3 t\u1ea3i tr\u1ea1ng th\u00e1i l\u00e0n \u0111\u01b0\u1eddng hi\u1ec7n t\u1ea1i: {{message}}", "preflightErrorWithMessage": "Không thể tải trạng thái làn đường hiện tại: {{message}}",
"runtime.boot": "\u25b6 ch\u1ea1y", "runtime.boot": "▶ chạy",
"runtime.busy.down": "\u0111ang d\u1eebng\u2026", "runtime.busy.down": "đang dừng…",
"runtime.busy.up": "\u0111ang kh\u1edfi \u0111\u1ed9ng\u2026", "runtime.busy.up": "đang khởi động…",
"runtime.down": "t\u1eaft", "runtime.down": "tt",
"runtime.healthy": "kho\u1ebb", "runtime.healthy": "kho",
"runtime.partial": "m\u1ed9t ph\u1ea7n", "runtime.partial": "một phần",
"runtime.slot": "slot {{slot}}", "runtime.slot": "slot {{slot}}",
"runtime.steppedAsideTitle": "\u0110\u00e3 l\u00f9i kh\u1ecfi {{expected}} v\u00ec c\u1ed5ng \u0111\u00f3 \u0111ang b\u1eadn", "runtime.steppedAsideTitle": "Đã lùi khỏi {{expected}} vì cổng đó đang bận",
"runtime.stop": "\u25a0 d\u1eebng", "runtime.stop": "■ dừng",
"runtime.toggleTitle": "Ch\u1ea1y ho\u1eb7c d\u1eebng stack \u1ee9ng d\u1ee5ng c\u1ee7a lane n\u00e0y (kh\u00e1c v\u1edbi phi\u00ean Claude c\u1ee7a n\u00f3)", "runtime.toggleTitle": "Chạy hoặc dừng stack ứng dụng của lane này (khác với phiên Claude của nó)",
"stageUndeclared": "ch\u01b0a khai b\u00e1o", "stageUndeclared": "chưa khai báo",
"status.failed": "th\u1ea5t b\u1ea1i", "status.failed": "thất bại",
"status.idle": "r\u1ea3nh", "status.idle": "rnh",
"status.provisioning": "\u0111ang kh\u1edfi t\u1ea1o", "status.provisioning": "đang khởi tạo",
"status.running": "\u0111ang ch\u1ea1y", "status.running": "đang chạy",
"statusDead": "\u0110\u00c3 CH\u1ebeT", "statusDead": "ĐÃ CHẾT",
"title": "L\u00e0n \u0111\u01b0\u1eddng", "title": "Làn đường",
"tooltipStart": "T\u1ea1o m\u1ed9t l\u1ea7n ch\u1ea1y \u1edf ch\u1ebf \u0111\u1ed9 h\u1ed9i tho\u1ea1i m\u00e0 kh\u00f4ng c\u00f3 l\u1eddi nh\u1eafc ban \u0111\u1ea7u; \u0111\u01b0\u1ee3c \u0111i\u1ec1u khi\u1ec3n t\u1eeb CLI ho\u1eb7c qua tin nh\u1eafn" "tooltipStart": "Tạo một lần chạy ở chế độ hội thoại mà không có lời nhắc ban đầu; được điều khiển từ CLI hoc qua tin nhn"
} }