@opencode-ai/ui 1.18.12 → 1.18.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/context/i18n.d.ts +10 -1
  2. package/dist/context/marked-parser.d.ts +2 -0
  3. package/dist/context/marked-theme-register.d.ts +1 -0
  4. package/dist/context/marked-theme.d.ts +2 -0
  5. package/dist/context/marked.d.ts +2 -9
  6. package/dist/i18n/ar.d.ts +38 -0
  7. package/dist/i18n/az.d.ts +1 -0
  8. package/dist/i18n/br.d.ts +26 -0
  9. package/dist/i18n/bs.d.ts +26 -0
  10. package/dist/i18n/da.d.ts +22 -0
  11. package/dist/i18n/de.d.ts +22 -0
  12. package/dist/i18n/es.d.ts +26 -0
  13. package/dist/i18n/fi.d.ts +1 -0
  14. package/dist/i18n/fr.d.ts +26 -0
  15. package/dist/i18n/hi.d.ts +1 -0
  16. package/dist/i18n/id.d.ts +1 -0
  17. package/dist/i18n/it.d.ts +1 -0
  18. package/dist/i18n/ja.d.ts +22 -0
  19. package/dist/i18n/ko.d.ts +22 -0
  20. package/dist/i18n/nl.d.ts +1 -0
  21. package/dist/i18n/pa.d.ts +1 -0
  22. package/dist/i18n/pl.d.ts +30 -0
  23. package/dist/i18n/ru.d.ts +30 -0
  24. package/dist/i18n/sv.d.ts +1 -0
  25. package/dist/i18n/th.d.ts +22 -0
  26. package/dist/i18n/tr.d.ts +22 -0
  27. package/dist/i18n/ur.d.ts +1 -0
  28. package/dist/i18n/vi.d.ts +1 -0
  29. package/dist/i18n/zh.d.ts +22 -0
  30. package/dist/i18n/zht.d.ts +22 -0
  31. package/package.json +2 -3
  32. package/src/components/diff-changes.css +2 -0
  33. package/src/components/dropdown-menu.css +2 -2
  34. package/src/components/icon.css +5 -0
  35. package/src/components/icon.tsx +12 -1
  36. package/src/components/resize-handle.css +14 -2
  37. package/src/components/resize-handle.tsx +5 -1
  38. package/src/components/scroll-view.css +1 -1
  39. package/src/components/select.css +5 -3
  40. package/src/components/switch.css +4 -0
  41. package/src/components/tabs.css +54 -26
  42. package/src/components/tabs.tsx +1 -0
  43. package/src/components/text-field.css +2 -2
  44. package/src/components/toast.css +1 -1
  45. package/src/context/i18n.tsx +38 -2
  46. package/src/context/marked-parser.tsx +68 -0
  47. package/src/context/marked-theme-register.tsx +10 -0
  48. package/src/context/marked-theme.tsx +372 -0
  49. package/src/context/marked.tsx +20 -562
  50. package/src/i18n/ar.ts +62 -22
  51. package/src/i18n/az.ts +197 -0
  52. package/src/i18n/br.ts +34 -6
  53. package/src/i18n/bs.ts +51 -23
  54. package/src/i18n/da.ts +36 -12
  55. package/src/i18n/de.ts +58 -36
  56. package/src/i18n/en.ts +24 -0
  57. package/src/i18n/es.ts +45 -17
  58. package/src/i18n/fi.ts +197 -0
  59. package/src/i18n/fr.ts +51 -21
  60. package/src/i18n/hi.ts +199 -0
  61. package/src/i18n/id.ts +219 -0
  62. package/src/i18n/it.ts +202 -0
  63. package/src/i18n/ja.ts +29 -5
  64. package/src/i18n/ko.ts +36 -12
  65. package/src/i18n/nl.ts +197 -0
  66. package/src/i18n/no.ts +47 -23
  67. package/src/i18n/pa.ts +198 -0
  68. package/src/i18n/pl.ts +57 -24
  69. package/src/i18n/ru.ts +55 -23
  70. package/src/i18n/sv.ts +197 -0
  71. package/src/i18n/th.ts +44 -21
  72. package/src/i18n/tr.ts +49 -25
  73. package/src/i18n/uk.ts +47 -15
  74. package/src/i18n/ur.ts +198 -0
  75. package/src/i18n/vi.ts +197 -0
  76. package/src/i18n/zh.ts +52 -29
  77. package/src/i18n/zht.ts +45 -22
  78. package/src/v2/components/dialog-v2.css +2 -2
  79. package/src/v2/components/dialog-v2.tsx +3 -1
  80. package/src/v2/components/diff-changes-v2.css +2 -0
  81. package/src/v2/components/file-tree-v2.css +6 -2
  82. package/src/v2/components/inline-input-v2.tsx +3 -1
  83. package/src/v2/components/line-comment-v2.css +1 -1
  84. package/src/v2/components/line-comment-v2.tsx +6 -4
  85. package/src/v2/components/select-v2.css +16 -5
  86. package/src/v2/components/switch-v2.css +8 -0
  87. package/src/v2/components/tabs-v2.css +4 -4
  88. package/src/v2/components/tabs-v2.tsx +4 -2
  89. package/src/v2/components/text-input-v2.css +7 -5
  90. package/src/v2/components/text-input-v2.tsx +7 -1
  91. package/src/v2/components/toast-v2.tsx +8 -4
  92. package/dist/context/marked-code-span.d.ts +0 -10
  93. package/src/context/marked-code-span.ts +0 -17
package/src/i18n/zh.ts CHANGED
@@ -7,8 +7,8 @@ export const dict = {
7
7
  "ui.sessionReview.title.git": "Git 变更",
8
8
  "ui.sessionReview.title.branch": "分支变更",
9
9
  "ui.sessionReview.title.lastTurn": "上一轮变更",
10
- "ui.sessionReview.diffStyle.unified": "统一",
11
- "ui.sessionReview.diffStyle.split": "拆分",
10
+ "ui.sessionReview.diffStyle.unified": "统一视图",
11
+ "ui.sessionReview.diffStyle.split": "并排视图",
12
12
  "ui.sessionReview.openFile": "打开文件",
13
13
  "ui.sessionReview.selection.line": "第 {{line}} 行",
14
14
  "ui.sessionReview.selection.lines": "第 {{start}}-{{end}} 行",
@@ -26,9 +26,9 @@ export const dict = {
26
26
  "ui.sessionReviewV2.filterFiles": "筛选文件",
27
27
  "ui.sessionReviewV2.toggleSidebar": "切换文件树",
28
28
  "ui.sessionReviewV2.showAllLines": "显示所有行",
29
- "ui.sessionReviewV2.hideNonDiffLines": "隐藏非差异行",
30
- "ui.sessionReviewV2.unifiedDiff": "统一差异",
31
- "ui.sessionReviewV2.splitDiff": "拆分差异",
29
+ "ui.sessionReviewV2.hideNonDiffLines": "隐藏未更改的行",
30
+ "ui.sessionReviewV2.unifiedDiff": "统一格式差异",
31
+ "ui.sessionReviewV2.splitDiff": "并排差异",
32
32
  "ui.sessionReviewV2.previousFile": "上一个文件",
33
33
  "ui.sessionReviewV2.nextFile": "下一个文件",
34
34
  "ui.sessionReviewV2.diffView": "差异视图",
@@ -48,38 +48,38 @@ export const dict = {
48
48
  "ui.fileMedia.binary.description.path": "无法显示 {{path}},因为它是二进制文件。",
49
49
  "ui.fileMedia.binary.description.default": "无法显示此文件,因为它是二进制文件。",
50
50
 
51
- "ui.lineComment.label.prefix": "评论 ",
51
+ "ui.lineComment.label.prefix": "评论",
52
52
  "ui.lineComment.label.suffix": "",
53
- "ui.lineComment.editorLabel.prefix": "正在评论 ",
53
+ "ui.lineComment.editorLabel.prefix": "正在评论",
54
54
  "ui.lineComment.editorLabel.suffix": "",
55
55
  "ui.lineComment.placeholder": "添加评论",
56
- "ui.lineComment.submit": "评论",
56
+ "ui.lineComment.contextPlaceholder": "添加此更改的上下文",
57
+ "ui.lineComment.submit": "发布评论",
57
58
  "ui.lineComment.cancel": "取消",
58
59
 
59
60
  "ui.sessionTurn.steps.show": "显示步骤",
60
61
  "ui.sessionTurn.steps.hide": "隐藏步骤",
61
62
  "ui.sessionTurn.summary.response": "回复",
62
63
  "ui.sessionTurn.diff.showMore": "显示更多更改({{count}})",
63
- "ui.sessionTurn.diffs.changed.one": "已更改文件:{{count}} ",
64
- "ui.sessionTurn.diffs.changed.other": "已更改文件:{{count}} ",
64
+ "ui.sessionTurn.diffs.changed.one": "{{count}} 个文件已更改",
65
+ "ui.sessionTurn.diffs.changed.other": "{{count}} 个文件已更改",
65
66
  "ui.sessionTurn.diffs.showAll": "全部显示",
66
67
  "ui.sessionTurn.diffs.showLess": "收起",
67
68
  "ui.sessionTurn.diffs.more": "+{{count}} 个文件",
68
69
 
69
70
  "ui.sessionTurn.retry.retrying": "重试中",
70
71
  "ui.sessionTurn.retry.inSeconds": "{{seconds}} 秒后",
71
- "ui.sessionTurn.retry.attempt": "第 {{attempt}} ",
72
- "ui.sessionTurn.retry.attemptLine": "{{line}} - 第 {{attempt}} ",
73
- "ui.sessionTurn.retry.geminiHot": "gemini 当前过载",
72
+ "ui.sessionTurn.retry.attempt": "第 {{attempt}} 次尝试",
73
+ "ui.sessionTurn.retry.attemptLine": "{{line}} - 第 {{attempt}} 次尝试",
74
+ "ui.sessionTurn.retry.geminiHot": "Gemini 当前负载过高",
74
75
  "ui.sessionTurn.error.freeUsageExceeded": "免费使用额度已用完",
75
- "ui.sessionTurn.error.addCredits": "添加积分",
76
+ "ui.sessionTurn.error.addCredits": "充值",
76
77
 
77
78
  "dialog.usageExceeded.freeTier.title": "免费额度已用完",
78
79
  "dialog.usageExceeded.freeTier.description": "订阅 OpenCode Go,可靠地使用最佳开源模型,每月 $5 起。",
79
80
  "dialog.usageExceeded.freeTier.actionLabel": "订阅",
80
81
  "dialog.usageExceeded.accountRateLimit.title": "Go 额度已用完",
81
- "dialog.usageExceeded.accountRateLimit.description":
82
- "使用额度已达上限。如需现在继续使用此模型,请从可用余额中启用使用",
82
+ "dialog.usageExceeded.accountRateLimit.description": "使用额度已达上限。如需立即继续使用此模型,请启用余额付费",
83
83
  "dialog.usageExceeded.accountRateLimit.actionLabel": "打开设置",
84
84
 
85
85
  "ui.sessionTurn.status.delegating": "正在委派工作",
@@ -101,13 +101,13 @@ export const dict = {
101
101
  "ui.messagePart.context.read.other": "{{count}} 次读取",
102
102
  "ui.messagePart.context.search.one": "{{count}} 次搜索",
103
103
  "ui.messagePart.context.search.other": "{{count}} 次搜索",
104
- "ui.messagePart.context.list.one": "{{count}} 个列表",
105
- "ui.messagePart.context.list.other": "{{count}} 个列表",
104
+ "ui.messagePart.context.list.one": "列出 {{count}} ",
105
+ "ui.messagePart.context.list.other": "列出 {{count}} ",
106
106
  "ui.messagePart.diagnostic.error": "错误",
107
107
  "ui.messagePart.title.edit": "编辑",
108
108
  "ui.messagePart.title.write": "写入",
109
109
  "ui.messagePart.option.typeOwnAnswer": "输入自己的答案",
110
- "ui.messagePart.review.title": "检查你的答案",
110
+ "ui.messagePart.review.title": "检查你的回答",
111
111
 
112
112
  "ui.list.loading": "加载中",
113
113
  "ui.list.empty": "无结果",
@@ -117,6 +117,25 @@ export const dict = {
117
117
 
118
118
  "ui.messageNav.newMessage": "新消息",
119
119
 
120
+ "ui.promptInput.noMatchingItems": "没有匹配项",
121
+ "ui.promptInput.commands": "命令",
122
+ "ui.promptInput.dropFiles": "拖放文件以添加附件",
123
+ "ui.promptInput.removeAttachment": "移除附件",
124
+ "ui.promptInput.label": "提示词",
125
+ "ui.promptInput.placeholder.shell": "输入 shell 命令...",
126
+ "ui.promptInput.placeholder.normal": "随便问点什么, {{slash}} 可查看命令, {{at}} 可添加上下文...",
127
+ "ui.promptInput.add": "添加图片和文件",
128
+ "ui.promptInput.attachments": "图片和文件",
129
+ "ui.promptInput.context": "上下文",
130
+ "ui.promptInput.shell": "Shell 命令",
131
+ "ui.promptInput.chooseAgent": "选择智能体",
132
+ "ui.promptInput.chooseModel": "选择模型",
133
+ "ui.promptInput.chooseVariant": "选择模型变体",
134
+ "ui.promptInput.send": "发送",
135
+ "ui.promptInput.stop": "停止",
136
+
137
+ "ui.tabs.close": "关闭标签页",
138
+
120
139
  "ui.textField.copyToClipboard": "复制到剪贴板",
121
140
  "ui.textField.copyLink": "复制链接",
122
141
  "ui.textField.copied": "已复制",
@@ -126,16 +145,18 @@ export const dict = {
126
145
 
127
146
  "ui.tool.read": "读取",
128
147
  "ui.tool.loaded": "已加载",
129
- "ui.tool.list": "列表",
148
+ "ui.tool.list": "列出文件",
130
149
  "ui.tool.glob": "Glob",
131
150
  "ui.tool.grep": "Grep",
132
151
  "ui.tool.webfetch": "Webfetch",
133
- "ui.tool.websearch": "网络搜索",
152
+ "ui.tool.websearch": "网页搜索",
153
+ "ui.tool.websearch.provider": "{{provider}} 网页搜索",
134
154
  "ui.tool.shell": "Shell",
135
155
  "ui.tool.patch": "补丁",
136
156
  "ui.tool.todos": "待办",
137
157
  "ui.tool.todos.read": "读取待办",
138
158
  "ui.tool.questions": "问题",
159
+ "ui.tool.questions.numbered": "问题 {{number}}",
139
160
  "ui.tool.agent": "{{type}} 智能体",
140
161
  "ui.tool.agent.default": "智能体",
141
162
 
@@ -145,6 +166,8 @@ export const dict = {
145
166
  "ui.common.question.other": "个问题",
146
167
 
147
168
  "ui.common.add": "添加",
169
+ "ui.common.clear": "清除",
170
+ "ui.common.file": "文件",
148
171
  "ui.common.back": "返回",
149
172
  "ui.common.cancel": "取消",
150
173
  "ui.common.confirm": "确认",
@@ -162,8 +185,8 @@ export const dict = {
162
185
  "ui.message.collapse": "收起消息",
163
186
  "ui.message.copy": "复制",
164
187
  "ui.message.copyMessage": "复制消息",
165
- "ui.message.forkMessage": "分叉到新会话",
166
- "ui.message.revertMessage": "重置到此点",
188
+ "ui.message.forkMessage": "从此消息创建新会话",
189
+ "ui.message.revertMessage": "撤销此消息",
167
190
  "ui.message.copyResponse": "复制回复",
168
191
  "ui.message.copied": "已复制!",
169
192
  "ui.message.interrupted": "已中断",
@@ -175,10 +198,10 @@ export const dict = {
175
198
  "ui.patch.action.moved": "已移动",
176
199
  "ui.patch.action.patched": "已应用补丁",
177
200
 
178
- "ui.question.subtitle.answered": "{{count}} 已回答",
179
- "ui.question.answer.none": "(无答案)",
180
- "ui.question.review.notAnswered": "(未回答)",
181
- "ui.question.multiHint": "可多选",
201
+ "ui.question.subtitle.answered": "已回答 {{count}} ",
202
+ "ui.question.answer.none": "(无答案)",
203
+ "ui.question.review.notAnswered": "(未回答)",
204
+ "ui.question.multiHint": "选择所有适用的答案",
182
205
  "ui.question.singleHint": "选择一个答案",
183
206
  "ui.question.custom.placeholder": "输入你的答案...",
184
207
 
@@ -191,6 +214,6 @@ export const dict = {
191
214
  "ui.basicTool.called": "调用了 `{{tool}}`",
192
215
  "ui.toolErrorCard.failed": "失败",
193
216
  "ui.toolErrorCard.copyError": "复制错误",
194
- "ui.message.duration.seconds": "{{count}}秒",
195
- "ui.message.duration.minutesSeconds": "{{minutes}} {{seconds}}秒",
217
+ "ui.message.duration.seconds": "{{count}} 秒",
218
+ "ui.message.duration.minutesSeconds": "{{minutes}} 分钟 {{seconds}} 秒",
196
219
  } satisfies Partial<Record<Keys, string>>
package/src/i18n/zht.ts CHANGED
@@ -7,8 +7,8 @@ export const dict = {
7
7
  "ui.sessionReview.title.git": "Git 變更",
8
8
  "ui.sessionReview.title.branch": "分支變更",
9
9
  "ui.sessionReview.title.lastTurn": "上一輪變更",
10
- "ui.sessionReview.diffStyle.unified": "整合",
11
- "ui.sessionReview.diffStyle.split": "拆分",
10
+ "ui.sessionReview.diffStyle.unified": "統一",
11
+ "ui.sessionReview.diffStyle.split": "並排",
12
12
  "ui.sessionReview.openFile": "開啟檔案",
13
13
  "ui.sessionReview.selection.line": "第 {{line}} 行",
14
14
  "ui.sessionReview.selection.lines": "第 {{start}}-{{end}} 行",
@@ -19,16 +19,16 @@ export const dict = {
19
19
  "ui.sessionReview.change.modified": "已修改",
20
20
  "ui.sessionReview.image.loading": "載入中...",
21
21
  "ui.sessionReview.image.placeholder": "圖片",
22
- "ui.sessionReview.largeDiff.title": "差異過大,無法渲染",
22
+ "ui.sessionReview.largeDiff.title": "差異過大,無法顯示",
23
23
  "ui.sessionReview.largeDiff.meta": "限制:{{limit}} 行變更。目前:{{current}} 行變更。",
24
- "ui.sessionReview.largeDiff.renderAnyway": "仍然渲染",
24
+ "ui.sessionReview.largeDiff.renderAnyway": "仍要顯示",
25
25
  "ui.sessionReviewV2.expandMode": "展開或收合差異",
26
26
  "ui.sessionReviewV2.filterFiles": "篩選檔案",
27
27
  "ui.sessionReviewV2.toggleSidebar": "切換檔案樹",
28
28
  "ui.sessionReviewV2.showAllLines": "顯示所有行",
29
29
  "ui.sessionReviewV2.hideNonDiffLines": "隱藏無差異的行",
30
- "ui.sessionReviewV2.unifiedDiff": "整合差異",
31
- "ui.sessionReviewV2.splitDiff": "拆分差異",
30
+ "ui.sessionReviewV2.unifiedDiff": "統一格式差異",
31
+ "ui.sessionReviewV2.splitDiff": "並排差異",
32
32
  "ui.sessionReviewV2.previousFile": "上一個檔案",
33
33
  "ui.sessionReviewV2.nextFile": "下一個檔案",
34
34
  "ui.sessionReviewV2.diffView": "差異檢視",
@@ -48,18 +48,19 @@ export const dict = {
48
48
  "ui.fileMedia.binary.description.path": "無法顯示 {{path}},因為它是二進位檔案。",
49
49
  "ui.fileMedia.binary.description.default": "無法顯示此檔案,因為它是二進位檔案。",
50
50
 
51
- "ui.lineComment.label.prefix": "評論 ",
51
+ "ui.lineComment.label.prefix": "留言於 ",
52
52
  "ui.lineComment.label.suffix": "",
53
- "ui.lineComment.editorLabel.prefix": "正在評論 ",
53
+ "ui.lineComment.editorLabel.prefix": "正在留言於 ",
54
54
  "ui.lineComment.editorLabel.suffix": "",
55
- "ui.lineComment.placeholder": "新增評論",
56
- "ui.lineComment.submit": "評論",
55
+ "ui.lineComment.placeholder": "新增留言",
56
+ "ui.lineComment.contextPlaceholder": "新增此變更的相關資訊",
57
+ "ui.lineComment.submit": "留言",
57
58
  "ui.lineComment.cancel": "取消",
58
59
 
59
60
  "ui.sessionTurn.steps.show": "顯示步驟",
60
61
  "ui.sessionTurn.steps.hide": "隱藏步驟",
61
62
  "ui.sessionTurn.summary.response": "回覆",
62
- "ui.sessionTurn.diff.showMore": "顯示更多變更 ({{count}})",
63
+ "ui.sessionTurn.diff.showMore": "顯示更多變更({{count}}",
63
64
  "ui.sessionTurn.diffs.changed.one": "已變更檔案:{{count}} 個",
64
65
  "ui.sessionTurn.diffs.changed.other": "已變更檔案:{{count}} 個",
65
66
  "ui.sessionTurn.diffs.showAll": "全部顯示",
@@ -70,7 +71,7 @@ export const dict = {
70
71
  "ui.sessionTurn.retry.inSeconds": "{{seconds}} 秒後",
71
72
  "ui.sessionTurn.retry.attempt": "第 {{attempt}} 次",
72
73
  "ui.sessionTurn.retry.attemptLine": "{{line}} - 第 {{attempt}} 次",
73
- "ui.sessionTurn.retry.geminiHot": "gemini 目前過載",
74
+ "ui.sessionTurn.retry.geminiHot": "Gemini 目前負載過高",
74
75
  "ui.sessionTurn.error.freeUsageExceeded": "免費使用額度已用完",
75
76
  "ui.sessionTurn.error.addCredits": "新增點數",
76
77
 
@@ -78,8 +79,7 @@ export const dict = {
78
79
  "dialog.usageExceeded.freeTier.description": "訂閱 OpenCode Go,可靠地使用最佳開源模型,每月 $5 起。",
79
80
  "dialog.usageExceeded.freeTier.actionLabel": "訂閱",
80
81
  "dialog.usageExceeded.accountRateLimit.title": "已達 Go 額度上限",
81
- "dialog.usageExceeded.accountRateLimit.description":
82
- "已達使用額度上限。若要現在繼續使用此模型,請從可用餘額中啟用使用",
82
+ "dialog.usageExceeded.accountRateLimit.description": "已達使用額度上限。若要立即繼續使用此模型,請啟用可用餘額計費",
83
83
  "dialog.usageExceeded.accountRateLimit.actionLabel": "開啟設定",
84
84
 
85
85
  "ui.sessionTurn.status.delegating": "正在委派工作",
@@ -101,13 +101,13 @@ export const dict = {
101
101
  "ui.messagePart.context.read.other": "{{count}} 次讀取",
102
102
  "ui.messagePart.context.search.one": "{{count}} 次搜尋",
103
103
  "ui.messagePart.context.search.other": "{{count}} 次搜尋",
104
- "ui.messagePart.context.list.one": "{{count}} 個清單",
105
- "ui.messagePart.context.list.other": "{{count}} 個清單",
104
+ "ui.messagePart.context.list.one": "列出 {{count}} ",
105
+ "ui.messagePart.context.list.other": "列出 {{count}} ",
106
106
  "ui.messagePart.diagnostic.error": "錯誤",
107
107
  "ui.messagePart.title.edit": "編輯",
108
108
  "ui.messagePart.title.write": "寫入",
109
109
  "ui.messagePart.option.typeOwnAnswer": "輸入自己的答案",
110
- "ui.messagePart.review.title": "檢查你的答案",
110
+ "ui.messagePart.review.title": "檢閱你的答案",
111
111
 
112
112
  "ui.list.loading": "載入中",
113
113
  "ui.list.empty": "無結果",
@@ -117,6 +117,25 @@ export const dict = {
117
117
 
118
118
  "ui.messageNav.newMessage": "新訊息",
119
119
 
120
+ "ui.promptInput.noMatchingItems": "沒有符合的項目",
121
+ "ui.promptInput.commands": "命令",
122
+ "ui.promptInput.dropFiles": "拖放檔案以附加",
123
+ "ui.promptInput.removeAttachment": "移除附件",
124
+ "ui.promptInput.label": "提示詞",
125
+ "ui.promptInput.placeholder.shell": "輸入 shell 命令...",
126
+ "ui.promptInput.placeholder.normal": "想問什麼都可以, {{slash}} 可使用命令, {{at}} 可加入上下文...",
127
+ "ui.promptInput.add": "新增圖片和檔案",
128
+ "ui.promptInput.attachments": "圖片和檔案",
129
+ "ui.promptInput.context": "上下文",
130
+ "ui.promptInput.shell": "shell 命令",
131
+ "ui.promptInput.chooseAgent": "選擇代理程式",
132
+ "ui.promptInput.chooseModel": "選擇模型",
133
+ "ui.promptInput.chooseVariant": "選擇模型變體",
134
+ "ui.promptInput.send": "傳送",
135
+ "ui.promptInput.stop": "停止",
136
+
137
+ "ui.tabs.close": "關閉分頁",
138
+
120
139
  "ui.textField.copyToClipboard": "複製到剪貼簿",
121
140
  "ui.textField.copyLink": "複製連結",
122
141
  "ui.textField.copied": "已複製",
@@ -126,16 +145,18 @@ export const dict = {
126
145
 
127
146
  "ui.tool.read": "讀取",
128
147
  "ui.tool.loaded": "已載入",
129
- "ui.tool.list": "清單",
148
+ "ui.tool.list": "列出",
130
149
  "ui.tool.glob": "Glob",
131
150
  "ui.tool.grep": "Grep",
132
151
  "ui.tool.webfetch": "Webfetch",
133
152
  "ui.tool.websearch": "網頁搜尋",
153
+ "ui.tool.websearch.provider": "{{provider}} 網頁搜尋",
134
154
  "ui.tool.shell": "Shell",
135
155
  "ui.tool.patch": "修補",
136
156
  "ui.tool.todos": "待辦",
137
157
  "ui.tool.todos.read": "讀取待辦",
138
158
  "ui.tool.questions": "問題",
159
+ "ui.tool.questions.numbered": "問題 {{number}}",
139
160
  "ui.tool.agent": "{{type}} 代理程式",
140
161
  "ui.tool.agent.default": "代理程式",
141
162
 
@@ -145,6 +166,8 @@ export const dict = {
145
166
  "ui.common.question.other": "個問題",
146
167
 
147
168
  "ui.common.add": "新增",
169
+ "ui.common.clear": "清除",
170
+ "ui.common.file": "檔案",
148
171
  "ui.common.back": "返回",
149
172
  "ui.common.cancel": "取消",
150
173
  "ui.common.confirm": "確認",
@@ -167,7 +190,7 @@ export const dict = {
167
190
  "ui.message.copyResponse": "複製回覆",
168
191
  "ui.message.copied": "已複製!",
169
192
  "ui.message.interrupted": "已中斷",
170
- "ui.message.queued": "排隊中",
193
+ "ui.message.queued": "已加入佇列",
171
194
  "ui.message.attachment.alt": "附件",
172
195
 
173
196
  "ui.patch.action.deleted": "已刪除",
@@ -175,9 +198,9 @@ export const dict = {
175
198
  "ui.patch.action.moved": "已移動",
176
199
  "ui.patch.action.patched": "已套用修補",
177
200
 
178
- "ui.question.subtitle.answered": "{{count}} 已回答",
179
- "ui.question.answer.none": "(無答案)",
180
- "ui.question.review.notAnswered": "(未回答)",
201
+ "ui.question.subtitle.answered": "已回答 {{count}} ",
202
+ "ui.question.answer.none": "(無答案)",
203
+ "ui.question.review.notAnswered": "(未回答)",
181
204
  "ui.question.multiHint": "可多選",
182
205
  "ui.question.singleHint": "選擇一個答案",
183
206
  "ui.question.custom.placeholder": "輸入你的答案...",
@@ -109,8 +109,8 @@
109
109
  width: 20px;
110
110
  height: 20px;
111
111
  margin-top: -2px;
112
- margin-right: -2px;
113
- margin-left: auto;
112
+ margin-inline-end: -2px;
113
+ margin-inline-start: auto;
114
114
  border-radius: 4px;
115
115
  flex-shrink: 0;
116
116
  cursor: pointer;
@@ -1,5 +1,6 @@
1
1
  import { Dialog as Kobalte } from "@kobalte/core/dialog"
2
2
  import { type ComponentProps, type JSXElement, type ParentProps, Show, children, splitProps } from "solid-js"
3
+ import { useI18n } from "../../context/i18n"
3
4
  import "./dialog-v2.css"
4
5
 
5
6
  export interface DialogProps extends ParentProps {
@@ -51,6 +52,7 @@ export function DialogTitleGroup(props: DialogTitleGroupProps) {
51
52
  }
52
53
 
53
54
  export function DialogHeader(props: DialogHeaderProps) {
55
+ const i18n = useI18n()
54
56
  const [local] = splitProps(props, ["closeLabel", "hideClose", "children"])
55
57
  const hideClose = () => local.hideClose === true
56
58
 
@@ -58,7 +60,7 @@ export function DialogHeader(props: DialogHeaderProps) {
58
60
  <div data-slot="dialog-header" data-hide-close={hideClose() ? "" : undefined}>
59
61
  {local.children}
60
62
  {!hideClose() && (
61
- <Kobalte.CloseButton data-slot="dialog-close-button" aria-label={local.closeLabel ?? "Close"}>
63
+ <Kobalte.CloseButton data-slot="dialog-close-button" aria-label={local.closeLabel ?? i18n.t("ui.common.close")}>
62
64
  <svg
63
65
  width="16"
64
66
  height="16"
@@ -1,5 +1,7 @@
1
1
  [data-component="diff-changes"] {
2
2
  display: flex;
3
+ direction: ltr;
4
+ unicode-bidi: isolate;
3
5
  gap: 8px;
4
6
  justify-content: flex-end;
5
7
  align-items: center;
@@ -13,13 +13,13 @@
13
13
  align-items: center;
14
14
  justify-content: flex-start;
15
15
  gap: 6px;
16
- padding-right: 8px;
16
+ padding-inline-end: 8px;
17
17
  overflow: visible;
18
18
  border: none;
19
19
  border-radius: 6px;
20
20
  background-color: transparent;
21
21
  color: var(--v2-text-text-muted);
22
- text-align: left;
22
+ text-align: start;
23
23
  cursor: pointer;
24
24
  scroll-margin-block: 8px;
25
25
  transition:
@@ -87,6 +87,10 @@
87
87
  transform: rotate(-90deg);
88
88
  }
89
89
 
90
+ [data-component="file-tree-v2"]:dir(rtl) [data-slot="file-tree-v2-chevron"]:not([data-expanded]) svg {
91
+ transform: rotate(90deg);
92
+ }
93
+
90
94
  [data-component="file-tree-v2"] [data-slot="file-tree-v2-row"][data-selected] [data-slot="file-tree-v2-chevron"] {
91
95
  color: var(--v2-text-text-base);
92
96
  }
@@ -1,5 +1,6 @@
1
1
  import { type ComponentProps, type JSX, Show, splitProps } from "solid-js"
2
2
  import { Icon } from "./icon"
3
+ import { useI18n } from "../../context/i18n"
3
4
  import "./inline-input-v2.css"
4
5
 
5
6
  export interface InlineInputV2Props extends Omit<ComponentProps<"input">, "type" | "prefix"> {
@@ -22,6 +23,7 @@ export interface InlineInputV2Props extends Omit<ComponentProps<"input">, "type"
22
23
  }
23
24
 
24
25
  export function InlineInputV2(props: InlineInputV2Props) {
26
+ const i18n = useI18n()
25
27
  const [local, inputProps] = splitProps(props, [
26
28
  "class",
27
29
  "classList",
@@ -92,7 +94,7 @@ export function InlineInputV2(props: InlineInputV2Props) {
92
94
  <button
93
95
  type="button"
94
96
  data-slot="inline-input-v2-icon-button"
95
- aria-label={local.copyLabel ?? "Copy"}
97
+ aria-label={local.copyLabel ?? i18n.t("ui.message.copy")}
96
98
  disabled={local.disabled}
97
99
  onClick={local.onCopyClick}
98
100
  >
@@ -228,7 +228,7 @@
228
228
  border-radius: 4px;
229
229
  background: transparent;
230
230
  color: var(--v2-text-text-base);
231
- text-align: left;
231
+ text-align: start;
232
232
  cursor: pointer;
233
233
  }
234
234
 
@@ -1,5 +1,6 @@
1
1
  import { For, Show, createSignal, onMount, splitProps, type ComponentProps, type JSX } from "solid-js"
2
2
  import { FileIcon } from "../../components/file-icon"
3
+ import { useI18n } from "../../context/i18n"
3
4
  import { useFilteredList } from "../../hooks"
4
5
  import { ButtonV2 } from "./button-v2"
5
6
  import "./line-comment-v2.css"
@@ -86,6 +87,7 @@ function pathDirectory(path: string) {
86
87
  }
87
88
 
88
89
  export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
90
+ const i18n = useI18n()
89
91
  let textareaRef: HTMLTextAreaElement | undefined
90
92
  const [mentionOpen, setMentionOpen] = createSignal(false)
91
93
 
@@ -106,7 +108,7 @@ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
106
108
  "classList",
107
109
  ])
108
110
 
109
- const heading = () => local.heading ?? "Comment"
111
+ const heading = () => local.heading ?? i18n.t("ui.lineComment.submit")
110
112
  const canSubmit = () => local.value.trim().length > 0
111
113
 
112
114
  const closeMention = () => {
@@ -211,7 +213,7 @@ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
211
213
  }}
212
214
  data-slot="line-comment-v2-textarea"
213
215
  rows={local.rows ?? 3}
214
- placeholder={local.placeholder ?? "Add context for this change"}
216
+ placeholder={local.placeholder ?? i18n.t("ui.lineComment.contextPlaceholder")}
215
217
  value={local.value}
216
218
  onInput={(e) => {
217
219
  local.onInput(e.currentTarget.value)
@@ -291,10 +293,10 @@ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
291
293
  <div data-slot="line-comment-v2-footer-meta">{local.selection}</div>
292
294
  <div data-slot="line-comment-v2-footer-actions">
293
295
  <ButtonV2 type="button" size="normal" variant="neutral" onClick={() => local.onCancel()}>
294
- {local.cancelLabel ?? "Cancel"}
296
+ {local.cancelLabel ?? i18n.t("ui.lineComment.cancel")}
295
297
  </ButtonV2>
296
298
  <ButtonV2 type="button" size="normal" variant="contrast" disabled={!canSubmit()} onClick={submit}>
297
- {local.submitLabel ?? "Comment"}
299
+ {local.submitLabel ?? i18n.t("ui.lineComment.submit")}
298
300
  </ButtonV2>
299
301
  </div>
300
302
  </div>
@@ -52,7 +52,8 @@
52
52
  display: flex;
53
53
  flex-direction: row;
54
54
  align-items: stretch;
55
- padding: 0 6px 0 0;
55
+ padding-block: 0;
56
+ padding-inline: 0 6px;
56
57
  gap: 8px;
57
58
  width: 280px;
58
59
  height: 28px;
@@ -74,7 +75,8 @@
74
75
 
75
76
  [data-component="select-v2"][data-appearance="large"] {
76
77
  height: 32px;
77
- padding: 0 8px 0 0;
78
+ padding-block: 0;
79
+ padding-inline: 0 8px;
78
80
  }
79
81
 
80
82
  [data-component="select-v2"]:where(:hover):not([data-disabled], [data-invalid]):not(:focus-within):not(
@@ -126,12 +128,13 @@
126
128
  overflow: hidden;
127
129
  text-overflow: ellipsis;
128
130
  white-space: nowrap;
129
- padding: 0 0 0 8px;
131
+ padding-block: 0;
132
+ padding-inline: 8px 0;
130
133
  margin: 0;
131
134
  border: 0;
132
135
  background: transparent;
133
136
  outline: none;
134
- text-align: left;
137
+ text-align: start;
135
138
  font-style: normal;
136
139
  font-weight: 440;
137
140
  font-size: 13px;
@@ -188,7 +191,8 @@
188
191
  width: fit-content;
189
192
  max-width: 100%;
190
193
  height: 24px;
191
- padding: 4px 4px 4px 8px;
194
+ padding-block: 4px;
195
+ padding-inline: 8px 4px;
192
196
  gap: 4px;
193
197
  border-radius: 4px;
194
198
  background: transparent;
@@ -278,6 +282,13 @@
278
282
  color: var(--menu-v2-accent);
279
283
  }
280
284
 
285
+ [data-slot="select-v2-listbox"]
286
+ [data-component="menu-v2-item"][data-selected]
287
+ [data-slot="menu-v2-item-indicator"]
288
+ svg {
289
+ visibility: visible;
290
+ }
291
+
281
292
  [data-slot="select-v2-listbox"]
282
293
  [data-component="menu-v2-item"]:not([data-selected])
283
294
  [data-slot="menu-v2-item-indicator"]
@@ -121,6 +121,10 @@
121
121
  var(--v2-grey-300);
122
122
  }
123
123
 
124
+ &:dir(rtl)[data-checked] [data-slot="switch-thumb"] {
125
+ transform: translateX(-8px);
126
+ }
127
+
124
128
  &[data-checked]:hover:not([data-disabled], [data-readonly]) [data-slot="switch-control"] {
125
129
  background:
126
130
  linear-gradient(
@@ -135,6 +139,10 @@
135
139
  transform: translateX(7px);
136
140
  }
137
141
 
142
+ &:dir(rtl)[data-checked]:hover:not([data-disabled], [data-readonly]) [data-slot="switch-thumb"] {
143
+ transform: translateX(-7px);
144
+ }
145
+
138
146
  &[data-disabled] {
139
147
  cursor: not-allowed;
140
148
  }
@@ -71,7 +71,7 @@
71
71
  [data-component="tabs-v2"] [data-slot="tabs-v2-close-button"] {
72
72
  width: 20px;
73
73
  height: 20px;
74
- margin-left: -5px;
74
+ margin-inline-start: -5px;
75
75
  flex: none;
76
76
  display: flex;
77
77
  align-items: center;
@@ -109,7 +109,7 @@
109
109
  background-color: var(--v2-border-border-base);
110
110
  position: absolute;
111
111
  bottom: 0px;
112
- left: -8px;
112
+ inset-inline-start: -8px;
113
113
  }
114
114
 
115
115
  [data-component="tabs-v2"][data-variant="pill"][data-orientation="horizontal"] [data-slot="tabs-v2-list"] {
@@ -183,12 +183,12 @@
183
183
  padding: 12px;
184
184
  gap: 4px;
185
185
  overflow-y: auto;
186
- border-right: 1px solid var(--v2-border-border-base);
186
+ border-inline-end: 1px solid var(--v2-border-border-base);
187
187
  }
188
188
 
189
189
  [data-component="tabs-v2"][data-variant="settings"][data-orientation="vertical"] [data-slot="tabs-v2-section-title"] {
190
190
  width: 100%;
191
- padding-left: 4px;
191
+ padding-inline-start: 4px;
192
192
  color: var(--v2-text-text-muted);
193
193
  font-size: 12px;
194
194
  font-weight: 500;
@@ -1,6 +1,7 @@
1
1
  import { Tabs as Kobalte } from "@kobalte/core/tabs"
2
2
  import { Show, splitProps, type JSX } from "solid-js"
3
3
  import type { ComponentProps, ParentProps, Component } from "solid-js"
4
+ import { useI18n } from "../../context/i18n"
4
5
  import "./tabs-v2.css"
5
6
 
6
7
  export interface TabsV2Props extends ComponentProps<typeof Kobalte> {
@@ -74,7 +75,7 @@ function TabsV2Trigger(props: ParentProps<TabsV2TriggerProps>) {
74
75
  {split.children}
75
76
  <Show when={split.subtext}>
76
77
  {(subtext) => (
77
- <span data-slot="tabs-v2-subtext" class="ml-2 text-xs text-text-weak">
78
+ <span data-slot="tabs-v2-subtext" class="ms-2 text-xs text-text-weak">
78
79
  {subtext()}
79
80
  </span>
80
81
  )}
@@ -86,12 +87,13 @@ function TabsV2Trigger(props: ParentProps<TabsV2TriggerProps>) {
86
87
  }
87
88
 
88
89
  function TabsV2CloseButton(props: TabsV2CloseButtonProps) {
90
+ const i18n = useI18n()
89
91
  const [split, rest] = splitProps(props, ["class", "classList", "onClick"])
90
92
  return (
91
93
  <div
92
94
  role="button"
93
95
  tabindex={0}
94
- aria-label="Close tab"
96
+ aria-label={i18n.t("ui.tabs.close")}
95
97
  data-slot="tabs-v2-close-button"
96
98
  {...rest}
97
99
  classList={{