@agent-native/core 0.76.10 → 0.76.12

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 (130) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +13 -0
  3. package/corpus/core/docs/content/locales/ar-SA/actions.md +7 -7
  4. package/corpus/core/docs/content/locales/ar-SA/template-plan.md +6 -4
  5. package/corpus/core/docs/content/locales/de-DE/actions.md +9 -9
  6. package/corpus/core/docs/content/locales/de-DE/template-plan.md +6 -4
  7. package/corpus/core/docs/content/locales/es-ES/actions.md +9 -9
  8. package/corpus/core/docs/content/locales/es-ES/template-plan.md +6 -4
  9. package/corpus/core/docs/content/locales/fr-FR/actions.md +9 -9
  10. package/corpus/core/docs/content/locales/fr-FR/template-plan.md +6 -4
  11. package/corpus/core/docs/content/locales/hi-IN/actions.md +9 -9
  12. package/corpus/core/docs/content/locales/hi-IN/template-plan.md +4 -4
  13. package/corpus/core/docs/content/locales/ja-JP/actions.md +9 -9
  14. package/corpus/core/docs/content/locales/ja-JP/template-plan.md +4 -4
  15. package/corpus/core/docs/content/locales/ko-KR/actions.md +9 -9
  16. package/corpus/core/docs/content/locales/ko-KR/template-plan.md +4 -4
  17. package/corpus/core/docs/content/locales/pt-BR/actions.md +9 -9
  18. package/corpus/core/docs/content/locales/pt-BR/template-plan.md +6 -4
  19. package/corpus/core/docs/content/locales/zh-CN/actions.md +9 -9
  20. package/corpus/core/docs/content/locales/zh-CN/template-plan.md +4 -4
  21. package/corpus/core/package.json +1 -1
  22. package/corpus/core/src/client/ErrorBoundary.tsx +151 -10
  23. package/corpus/core/src/client/FeedbackButton.tsx +162 -18
  24. package/corpus/core/src/client/blocks/library/AnnotatedCodeBlock.tsx +11 -2
  25. package/corpus/core/src/client/blocks/library/ApiEndpointBlock.tsx +46 -19
  26. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +7 -5
  27. package/corpus/core/src/client/blocks/library/block-copy.ts +367 -0
  28. package/corpus/core/src/client/blocks/library/diagram.tsx +8 -6
  29. package/corpus/core/src/client/blocks/library/wireframe.tsx +7 -2
  30. package/corpus/core/src/client/i18n.tsx +4 -0
  31. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +51 -31
  32. package/corpus/templates/analytics/app/components/layout/DashboardHeader.tsx +26 -16
  33. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -2
  34. package/corpus/templates/analytics/app/components/layout/HeaderActions.tsx +8 -1
  35. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -5
  36. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +172 -107
  37. package/corpus/templates/analytics/app/i18n-data.ts +1076 -5
  38. package/corpus/templates/analytics/app/pages/Settings.tsx +2 -2
  39. package/corpus/templates/analytics/changelog/2026-06-24-analytics-navigation-command-palette-and-settings-now-honor-.md +6 -0
  40. package/corpus/templates/assets/app/components/layout/Header.tsx +0 -2
  41. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +0 -2
  42. package/corpus/templates/calendar/app/pages/CalendarView.tsx +0 -2
  43. package/corpus/templates/chat/app/components/layout/Header.tsx +1 -6
  44. package/corpus/templates/clips/app/components/layout/Header.tsx +1 -6
  45. package/corpus/templates/clips/app/hooks/use-library.ts +2 -0
  46. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +3 -1
  47. package/corpus/templates/clips/changelog/2026-06-24-archive-and-spaces-navigation-is-more-resilient-when-sidebar.md +6 -0
  48. package/corpus/templates/content/app/components/layout/Header.tsx +0 -2
  49. package/corpus/templates/design/app/components/layout/Header.tsx +1 -6
  50. package/corpus/templates/forms/app/components/layout/Header.tsx +1 -6
  51. package/corpus/templates/macros/app/components/layout/Header.tsx +1 -6
  52. package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +4 -2
  53. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +18 -12
  54. package/corpus/templates/mail/app/components/email/ComposeEditor.tsx +9 -5
  55. package/corpus/templates/mail/app/components/email/ComposeModal.tsx +36 -19
  56. package/corpus/templates/mail/app/components/email/EmailList.tsx +59 -55
  57. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +7 -3
  58. package/corpus/templates/mail/app/components/email/EmailThread.tsx +25 -16
  59. package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +25 -19
  60. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +32 -17
  61. package/corpus/templates/mail/app/components/email/RecipientInput.tsx +26 -10
  62. package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +5 -3
  63. package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +4 -2
  64. package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +9 -5
  65. package/corpus/templates/mail/app/components/email/extensions/ComposeImageBlock.tsx +4 -2
  66. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +168 -86
  67. package/corpus/templates/mail/app/components/layout/SearchBar.tsx +4 -2
  68. package/corpus/templates/mail/app/i18n/ar-SA.ts +212 -0
  69. package/corpus/templates/mail/app/i18n/de-DE.ts +212 -0
  70. package/corpus/templates/mail/app/i18n/en-US.ts +212 -0
  71. package/corpus/templates/mail/app/i18n/es-ES.ts +212 -0
  72. package/corpus/templates/mail/app/i18n/fr-FR.ts +212 -0
  73. package/corpus/templates/mail/app/i18n/hi-IN.ts +212 -0
  74. package/corpus/templates/mail/app/i18n/ja-JP.ts +212 -0
  75. package/corpus/templates/mail/app/i18n/ko-KR.ts +212 -0
  76. package/corpus/templates/mail/app/i18n/pt-BR.ts +212 -0
  77. package/corpus/templates/mail/app/i18n/zh-CN.ts +211 -0
  78. package/corpus/templates/mail/app/root.tsx +90 -6
  79. package/corpus/templates/mail/changelog/2026-06-24-interface-language-support-now-covers-more-mail-controls-and.md +6 -0
  80. package/corpus/templates/plan/app/components/layout/Header.tsx +1 -6
  81. package/corpus/templates/slides/app/components/layout/Header.tsx +1 -6
  82. package/corpus/templates/videos/app/components/layout/Header.tsx +1 -6
  83. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  84. package/dist/client/ErrorBoundary.js +128 -7
  85. package/dist/client/ErrorBoundary.js.map +1 -1
  86. package/dist/client/FeedbackButton.d.ts.map +1 -1
  87. package/dist/client/FeedbackButton.js +142 -14
  88. package/dist/client/FeedbackButton.js.map +1 -1
  89. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
  90. package/dist/client/blocks/library/AnnotatedCodeBlock.js +6 -2
  91. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
  92. package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -1
  93. package/dist/client/blocks/library/ApiEndpointBlock.js +14 -6
  94. package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -1
  95. package/dist/client/blocks/library/MermaidBlock.d.ts.map +1 -1
  96. package/dist/client/blocks/library/MermaidBlock.js +6 -4
  97. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  98. package/dist/client/blocks/library/block-copy.d.ts +33 -0
  99. package/dist/client/blocks/library/block-copy.d.ts.map +1 -0
  100. package/dist/client/blocks/library/block-copy.js +329 -0
  101. package/dist/client/blocks/library/block-copy.js.map +1 -0
  102. package/dist/client/blocks/library/diagram.d.ts.map +1 -1
  103. package/dist/client/blocks/library/diagram.js +7 -5
  104. package/dist/client/blocks/library/diagram.js.map +1 -1
  105. package/dist/client/blocks/library/wireframe.d.ts.map +1 -1
  106. package/dist/client/blocks/library/wireframe.js +4 -2
  107. package/dist/client/blocks/library/wireframe.js.map +1 -1
  108. package/dist/client/i18n.d.ts +1 -0
  109. package/dist/client/i18n.d.ts.map +1 -1
  110. package/dist/client/i18n.js +3 -0
  111. package/dist/client/i18n.js.map +1 -1
  112. package/docs/content/locales/ar-SA/actions.md +7 -7
  113. package/docs/content/locales/ar-SA/template-plan.md +6 -4
  114. package/docs/content/locales/de-DE/actions.md +9 -9
  115. package/docs/content/locales/de-DE/template-plan.md +6 -4
  116. package/docs/content/locales/es-ES/actions.md +9 -9
  117. package/docs/content/locales/es-ES/template-plan.md +6 -4
  118. package/docs/content/locales/fr-FR/actions.md +9 -9
  119. package/docs/content/locales/fr-FR/template-plan.md +6 -4
  120. package/docs/content/locales/hi-IN/actions.md +9 -9
  121. package/docs/content/locales/hi-IN/template-plan.md +4 -4
  122. package/docs/content/locales/ja-JP/actions.md +9 -9
  123. package/docs/content/locales/ja-JP/template-plan.md +4 -4
  124. package/docs/content/locales/ko-KR/actions.md +9 -9
  125. package/docs/content/locales/ko-KR/template-plan.md +4 -4
  126. package/docs/content/locales/pt-BR/actions.md +9 -9
  127. package/docs/content/locales/pt-BR/template-plan.md +6 -4
  128. package/docs/content/locales/zh-CN/actions.md +9 -9
  129. package/docs/content/locales/zh-CN/template-plan.md +4 -4
  130. package/package.json +1 -1
@@ -0,0 +1,367 @@
1
+ import { useOptionalLocale } from "../../i18n.js";
2
+ import {
3
+ DEFAULT_LOCALE,
4
+ type LocaleCode,
5
+ } from "../../../localization/shared.js";
6
+
7
+ const BLOCK_COPY: Record<
8
+ LocaleCode,
9
+ {
10
+ added: string;
11
+ modified: string;
12
+ removed: string;
13
+ renamed: string;
14
+ deprecated: string;
15
+ requiresAuthentication: string;
16
+ auth: string;
17
+ parameters: string;
18
+ name: string;
19
+ in: string;
20
+ type: string;
21
+ requiredColumn: string;
22
+ description: string;
23
+ required: string;
24
+ optional: string;
25
+ requestBody: string;
26
+ responses: string;
27
+ expandDiagram: string;
28
+ loadingDiagram: string;
29
+ couldNotRenderDiagram: string;
30
+ addDiagramDefinition: string;
31
+ switchToCleanDiagrams: string;
32
+ switchToHandDrawnDiagrams: string;
33
+ cleanDiagramsSwitch: string;
34
+ handDrawnDiagramsSwitch: string;
35
+ clean: string;
36
+ sketchy: string;
37
+ switchVisualStyle: string;
38
+ lineAnnotation: string;
39
+ hiddenLinesExpand: string;
40
+ }
41
+ > = {
42
+ "en-US": {
43
+ added: "Added",
44
+ modified: "Modified",
45
+ removed: "Removed",
46
+ renamed: "Renamed",
47
+ deprecated: "Deprecated",
48
+ requiresAuthentication: "Requires authentication",
49
+ auth: "Auth",
50
+ parameters: "Parameters",
51
+ name: "Name",
52
+ in: "In",
53
+ type: "Type",
54
+ requiredColumn: "Required",
55
+ description: "Description",
56
+ required: "required",
57
+ optional: "optional",
58
+ requestBody: "Request body",
59
+ responses: "Responses",
60
+ expandDiagram: "Expand diagram",
61
+ loadingDiagram: "Loading diagram...",
62
+ couldNotRenderDiagram: "Could not render diagram",
63
+ addDiagramDefinition: "Add a diagram definition to render it.",
64
+ switchToCleanDiagrams: "Switch to clean diagrams",
65
+ switchToHandDrawnDiagrams: "Switch to hand-drawn diagrams",
66
+ cleanDiagramsSwitch: "Clean diagrams - switch to hand-drawn",
67
+ handDrawnDiagramsSwitch: "Hand-drawn diagrams - switch to clean",
68
+ clean: "Clean",
69
+ sketchy: "Sketchy",
70
+ switchVisualStyle: "Switch to {{style}} visual style",
71
+ lineAnnotation: "Line {{line}} annotation",
72
+ hiddenLinesExpand: "{{count}} lines - click to expand",
73
+ },
74
+ "zh-CN": {
75
+ added: "已添加",
76
+ modified: "已修改",
77
+ removed: "已移除",
78
+ renamed: "已重命名",
79
+ deprecated: "已弃用",
80
+ requiresAuthentication: "需要身份验证",
81
+ auth: "身份验证",
82
+ parameters: "参数",
83
+ name: "名称",
84
+ in: "位置",
85
+ type: "类型",
86
+ requiredColumn: "必填",
87
+ description: "描述",
88
+ required: "必填",
89
+ optional: "可选",
90
+ requestBody: "请求体",
91
+ responses: "响应",
92
+ expandDiagram: "展开图表",
93
+ loadingDiagram: "正在加载图表...",
94
+ couldNotRenderDiagram: "无法渲染图表",
95
+ addDiagramDefinition: "添加图表定义以渲染。",
96
+ switchToCleanDiagrams: "切换到简洁图表",
97
+ switchToHandDrawnDiagrams: "切换到手绘图表",
98
+ cleanDiagramsSwitch: "简洁图表 - 切换到手绘",
99
+ handDrawnDiagramsSwitch: "手绘图表 - 切换到简洁",
100
+ clean: "简洁",
101
+ sketchy: "手绘",
102
+ switchVisualStyle: "切换到{{style}}视觉样式",
103
+ lineAnnotation: "第 {{line}} 行注释",
104
+ hiddenLinesExpand: "{{count}} 行 - 点击展开",
105
+ },
106
+ "es-ES": {
107
+ added: "Añadido",
108
+ modified: "Modificado",
109
+ removed: "Eliminado",
110
+ renamed: "Renombrado",
111
+ deprecated: "Obsoleto",
112
+ requiresAuthentication: "Requiere autenticación",
113
+ auth: "Autenticación",
114
+ parameters: "Parámetros",
115
+ name: "Nombre",
116
+ in: "En",
117
+ type: "Tipo",
118
+ requiredColumn: "Obligatorio",
119
+ description: "Descripción",
120
+ required: "obligatorio",
121
+ optional: "opcional",
122
+ requestBody: "Cuerpo de la solicitud",
123
+ responses: "Respuestas",
124
+ expandDiagram: "Ampliar diagrama",
125
+ loadingDiagram: "Cargando diagrama...",
126
+ couldNotRenderDiagram: "No se pudo renderizar el diagrama",
127
+ addDiagramDefinition: "Añade una definición para renderizarlo.",
128
+ switchToCleanDiagrams: "Cambiar a diagramas limpios",
129
+ switchToHandDrawnDiagrams: "Cambiar a diagramas dibujados",
130
+ cleanDiagramsSwitch: "Diagramas limpios - cambiar a dibujados",
131
+ handDrawnDiagramsSwitch: "Diagramas dibujados - cambiar a limpios",
132
+ clean: "Limpio",
133
+ sketchy: "Boceto",
134
+ switchVisualStyle: "Cambiar al estilo visual {{style}}",
135
+ lineAnnotation: "Anotación de la línea {{line}}",
136
+ hiddenLinesExpand: "{{count}} líneas - clic para expandir",
137
+ },
138
+ "fr-FR": {
139
+ added: "Ajouté",
140
+ modified: "Modifié",
141
+ removed: "Supprimé",
142
+ renamed: "Renommé",
143
+ deprecated: "Obsolète",
144
+ requiresAuthentication: "Authentification requise",
145
+ auth: "Auth",
146
+ parameters: "Paramètres",
147
+ name: "Nom",
148
+ in: "Dans",
149
+ type: "Type",
150
+ requiredColumn: "Requis",
151
+ description: "Description",
152
+ required: "requis",
153
+ optional: "facultatif",
154
+ requestBody: "Corps de requête",
155
+ responses: "Réponses",
156
+ expandDiagram: "Agrandir le diagramme",
157
+ loadingDiagram: "Chargement du diagramme...",
158
+ couldNotRenderDiagram: "Impossible de rendre le diagramme",
159
+ addDiagramDefinition: "Ajoutez une définition pour le rendre.",
160
+ switchToCleanDiagrams: "Passer aux diagrammes nets",
161
+ switchToHandDrawnDiagrams: "Passer aux diagrammes dessinés",
162
+ cleanDiagramsSwitch: "Diagrammes nets - passer au dessin",
163
+ handDrawnDiagramsSwitch: "Diagrammes dessinés - passer au net",
164
+ clean: "Net",
165
+ sketchy: "Croquis",
166
+ switchVisualStyle: "Passer au style visuel {{style}}",
167
+ lineAnnotation: "Annotation de la ligne {{line}}",
168
+ hiddenLinesExpand: "{{count}} lignes - cliquer pour développer",
169
+ },
170
+ "de-DE": {
171
+ added: "Hinzugefügt",
172
+ modified: "Geändert",
173
+ removed: "Entfernt",
174
+ renamed: "Umbenannt",
175
+ deprecated: "Veraltet",
176
+ requiresAuthentication: "Authentifizierung erforderlich",
177
+ auth: "Auth",
178
+ parameters: "Parameter",
179
+ name: "Name",
180
+ in: "In",
181
+ type: "Typ",
182
+ requiredColumn: "Erforderlich",
183
+ description: "Beschreibung",
184
+ required: "erforderlich",
185
+ optional: "optional",
186
+ requestBody: "Anfragetext",
187
+ responses: "Antworten",
188
+ expandDiagram: "Diagramm vergrößern",
189
+ loadingDiagram: "Diagramm wird geladen...",
190
+ couldNotRenderDiagram: "Diagramm konnte nicht gerendert werden",
191
+ addDiagramDefinition: "Füge eine Diagrammdefinition hinzu.",
192
+ switchToCleanDiagrams: "Zu klaren Diagrammen wechseln",
193
+ switchToHandDrawnDiagrams: "Zu handgezeichneten Diagrammen wechseln",
194
+ cleanDiagramsSwitch: "Klare Diagramme - zu handgezeichnet wechseln",
195
+ handDrawnDiagramsSwitch: "Handgezeichnet - zu klar wechseln",
196
+ clean: "Klar",
197
+ sketchy: "Skizze",
198
+ switchVisualStyle: "Zum visuellen Stil {{style}} wechseln",
199
+ lineAnnotation: "Annotation für Zeile {{line}}",
200
+ hiddenLinesExpand: "{{count}} Zeilen - zum Erweitern klicken",
201
+ },
202
+ "ja-JP": {
203
+ added: "追加",
204
+ modified: "変更",
205
+ removed: "削除",
206
+ renamed: "名前変更",
207
+ deprecated: "非推奨",
208
+ requiresAuthentication: "認証が必要です",
209
+ auth: "認証",
210
+ parameters: "パラメーター",
211
+ name: "名前",
212
+ in: "場所",
213
+ type: "型",
214
+ requiredColumn: "必須",
215
+ description: "説明",
216
+ required: "必須",
217
+ optional: "任意",
218
+ requestBody: "リクエスト本文",
219
+ responses: "レスポンス",
220
+ expandDiagram: "図を拡大",
221
+ loadingDiagram: "図を読み込み中...",
222
+ couldNotRenderDiagram: "図を表示できませんでした",
223
+ addDiagramDefinition: "表示する図の定義を追加してください。",
224
+ switchToCleanDiagrams: "クリーン表示に切り替え",
225
+ switchToHandDrawnDiagrams: "手描き表示に切り替え",
226
+ cleanDiagramsSwitch: "クリーン表示 - 手描きに切り替え",
227
+ handDrawnDiagramsSwitch: "手描き表示 - クリーンに切り替え",
228
+ clean: "クリーン",
229
+ sketchy: "手描き",
230
+ switchVisualStyle: "{{style}}表示に切り替え",
231
+ lineAnnotation: "{{line}} 行目の注釈",
232
+ hiddenLinesExpand: "{{count}} 行 - クリックして展開",
233
+ },
234
+ "ko-KR": {
235
+ added: "추가됨",
236
+ modified: "수정됨",
237
+ removed: "제거됨",
238
+ renamed: "이름 변경됨",
239
+ deprecated: "사용 중단됨",
240
+ requiresAuthentication: "인증 필요",
241
+ auth: "인증",
242
+ parameters: "매개변수",
243
+ name: "이름",
244
+ in: "위치",
245
+ type: "유형",
246
+ requiredColumn: "필수",
247
+ description: "설명",
248
+ required: "필수",
249
+ optional: "선택",
250
+ requestBody: "요청 본문",
251
+ responses: "응답",
252
+ expandDiagram: "다이어그램 확대",
253
+ loadingDiagram: "다이어그램 로드 중...",
254
+ couldNotRenderDiagram: "다이어그램을 렌더링할 수 없음",
255
+ addDiagramDefinition: "렌더링할 다이어그램 정의를 추가하세요.",
256
+ switchToCleanDiagrams: "깔끔한 다이어그램으로 전환",
257
+ switchToHandDrawnDiagrams: "손그림 다이어그램으로 전환",
258
+ cleanDiagramsSwitch: "깔끔한 다이어그램 - 손그림으로 전환",
259
+ handDrawnDiagramsSwitch: "손그림 다이어그램 - 깔끔하게 전환",
260
+ clean: "깔끔함",
261
+ sketchy: "손그림",
262
+ switchVisualStyle: "{{style}} 시각 스타일로 전환",
263
+ lineAnnotation: "{{line}}번 줄 주석",
264
+ hiddenLinesExpand: "{{count}}줄 - 클릭하여 펼치기",
265
+ },
266
+ "pt-BR": {
267
+ added: "Adicionado",
268
+ modified: "Modificado",
269
+ removed: "Removido",
270
+ renamed: "Renomeado",
271
+ deprecated: "Obsoleto",
272
+ requiresAuthentication: "Requer autenticação",
273
+ auth: "Autenticação",
274
+ parameters: "Parâmetros",
275
+ name: "Nome",
276
+ in: "Em",
277
+ type: "Tipo",
278
+ requiredColumn: "Obrigatório",
279
+ description: "Descrição",
280
+ required: "obrigatório",
281
+ optional: "opcional",
282
+ requestBody: "Corpo da requisição",
283
+ responses: "Respostas",
284
+ expandDiagram: "Expandir diagrama",
285
+ loadingDiagram: "Carregando diagrama...",
286
+ couldNotRenderDiagram: "Não foi possível renderizar o diagrama",
287
+ addDiagramDefinition: "Adicione uma definição para renderizar.",
288
+ switchToCleanDiagrams: "Alternar para diagramas limpos",
289
+ switchToHandDrawnDiagrams: "Alternar para diagramas desenhados",
290
+ cleanDiagramsSwitch: "Diagramas limpos - alternar para desenhados",
291
+ handDrawnDiagramsSwitch: "Diagramas desenhados - alternar para limpos",
292
+ clean: "Limpo",
293
+ sketchy: "Esboço",
294
+ switchVisualStyle: "Alternar para o estilo visual {{style}}",
295
+ lineAnnotation: "Anotação da linha {{line}}",
296
+ hiddenLinesExpand: "{{count}} linhas - clique para expandir",
297
+ },
298
+ "hi-IN": {
299
+ added: "जोड़ा गया",
300
+ modified: "बदला गया",
301
+ removed: "हटाया गया",
302
+ renamed: "नाम बदला गया",
303
+ deprecated: "अप्रचलित",
304
+ requiresAuthentication: "प्रमाणीकरण आवश्यक",
305
+ auth: "प्रमाणीकरण",
306
+ parameters: "पैरामीटर",
307
+ name: "नाम",
308
+ in: "स्थान",
309
+ type: "प्रकार",
310
+ requiredColumn: "आवश्यक",
311
+ description: "विवरण",
312
+ required: "आवश्यक",
313
+ optional: "वैकल्पिक",
314
+ requestBody: "अनुरोध बॉडी",
315
+ responses: "प्रतिक्रियाएँ",
316
+ expandDiagram: "डायग्राम बड़ा करें",
317
+ loadingDiagram: "डायग्राम लोड हो रहा है...",
318
+ couldNotRenderDiagram: "डायग्राम रेंडर नहीं हो सका",
319
+ addDiagramDefinition: "रेंडर करने के लिए डायग्राम परिभाषा जोड़ें।",
320
+ switchToCleanDiagrams: "साफ़ डायग्राम पर स्विच करें",
321
+ switchToHandDrawnDiagrams: "हाथ से बने डायग्राम पर स्विच करें",
322
+ cleanDiagramsSwitch: "साफ़ डायग्राम - हाथ से बने पर स्विच करें",
323
+ handDrawnDiagramsSwitch: "हाथ से बने डायग्राम - साफ़ पर स्विच करें",
324
+ clean: "साफ़",
325
+ sketchy: "स्केच",
326
+ switchVisualStyle: "{{style}} दृश्य शैली पर स्विच करें",
327
+ lineAnnotation: "लाइन {{line}} एनोटेशन",
328
+ hiddenLinesExpand: "{{count}} लाइनें - विस्तार के लिए क्लिक करें",
329
+ },
330
+ "ar-SA": {
331
+ added: "مضاف",
332
+ modified: "معدل",
333
+ removed: "محذوف",
334
+ renamed: "أعيدت تسميته",
335
+ deprecated: "مهمل",
336
+ requiresAuthentication: "يتطلب المصادقة",
337
+ auth: "المصادقة",
338
+ parameters: "المعاملات",
339
+ name: "الاسم",
340
+ in: "في",
341
+ type: "النوع",
342
+ requiredColumn: "مطلوب",
343
+ description: "الوصف",
344
+ required: "مطلوب",
345
+ optional: "اختياري",
346
+ requestBody: "نص الطلب",
347
+ responses: "الاستجابات",
348
+ expandDiagram: "توسيع الرسم",
349
+ loadingDiagram: "جار تحميل الرسم...",
350
+ couldNotRenderDiagram: "تعذر عرض الرسم",
351
+ addDiagramDefinition: "أضف تعريف رسم لعرضه.",
352
+ switchToCleanDiagrams: "التبديل إلى رسوم نظيفة",
353
+ switchToHandDrawnDiagrams: "التبديل إلى رسوم مرسومة يدويا",
354
+ cleanDiagramsSwitch: "رسوم نظيفة - التبديل إلى مرسومة يدويا",
355
+ handDrawnDiagramsSwitch: "رسوم مرسومة يدويا - التبديل إلى نظيفة",
356
+ clean: "نظيف",
357
+ sketchy: "مرسوم",
358
+ switchVisualStyle: "التبديل إلى نمط {{style}} المرئي",
359
+ lineAnnotation: "تعليق السطر {{line}}",
360
+ hiddenLinesExpand: "{{count}} أسطر - انقر للتوسيع",
361
+ },
362
+ };
363
+
364
+ export function useBlockCopy() {
365
+ const locale = useOptionalLocale()?.locale ?? DEFAULT_LOCALE;
366
+ return BLOCK_COPY[locale] ?? BLOCK_COPY[DEFAULT_LOCALE];
367
+ }
@@ -31,6 +31,7 @@ import {
31
31
  sanitizeWireframeCss,
32
32
  scopeDesignCss,
33
33
  } from "./sanitize-html.js";
34
+ import { useBlockCopy } from "./block-copy.js";
34
35
  import {
35
36
  diagramMdx,
36
37
  diagramSchema,
@@ -626,13 +627,14 @@ function ExpandableDiagramBody({
626
627
  const [expanded, setExpanded] = useState(false);
627
628
  const supportsStyleToggle = Boolean(data.html);
628
629
  const style = useWireframeStyle();
630
+ const copy = useBlockCopy();
629
631
  const sketchy = style === "sketchy";
630
632
  const styleLabel = sketchy
631
- ? "Switch to clean diagrams"
632
- : "Switch to hand-drawn diagrams";
633
+ ? copy.switchToCleanDiagrams
634
+ : copy.switchToHandDrawnDiagrams;
633
635
  const styleTooltip = sketchy
634
- ? "Hand-drawn diagrams - switch to clean"
635
- : "Clean diagrams - switch to hand-drawn";
636
+ ? copy.handDrawnDiagramsSwitch
637
+ : copy.cleanDiagramsSwitch;
636
638
  return (
637
639
  <div className="group/diagram relative">
638
640
  <DiagramBody data={data} ctx={ctx} compact={compact} />
@@ -665,13 +667,13 @@ function ExpandableDiagramBody({
665
667
  type="button"
666
668
  data-plan-interactive
667
669
  onClick={() => setExpanded(true)}
668
- aria-label="Expand diagram"
670
+ aria-label={copy.expandDiagram}
669
671
  className="an-diagram-expand-trigger flex size-7 items-center justify-center rounded-md border border-border/60 bg-background/90 text-muted-foreground opacity-0 shadow-sm backdrop-blur transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/diagram:opacity-100"
670
672
  >
671
673
  <IconArrowsMaximize className="size-4" />
672
674
  </button>
673
675
  </TooltipTrigger>
674
- <TooltipContent side="left">Expand diagram</TooltipContent>
676
+ <TooltipContent side="left">{copy.expandDiagram}</TooltipContent>
675
677
  </Tooltip>
676
678
  </div>
677
679
  </TooltipProvider>
@@ -35,6 +35,7 @@ import {
35
35
  sanitizeWireframeHtml,
36
36
  scopeDesignCss,
37
37
  } from "./sanitize-html.js";
38
+ import { useBlockCopy } from "./block-copy.js";
38
39
  import { renderWireframeIconHtml } from "./wireframe-icons.js";
39
40
 
40
41
  /**
@@ -291,9 +292,13 @@ function ArtboardFrame({
291
292
 
292
293
  function WireframeStyleToggleButton() {
293
294
  const style = useWireframeStyle();
295
+ const copy = useBlockCopy();
294
296
  const nextStyle = style === "sketchy" ? "clean" : "sketchy";
295
- const label = nextStyle === "clean" ? "Clean" : "Sketchy";
296
- const description = `Switch to ${label.toLowerCase()} visual style`;
297
+ const label = nextStyle === "clean" ? copy.clean : copy.sketchy;
298
+ const description = copy.switchVisualStyle.replace(
299
+ "{{style}}",
300
+ label.toLocaleLowerCase(),
301
+ );
297
302
 
298
303
  return (
299
304
  <button
@@ -464,6 +464,10 @@ export function useLocale(): LocaleContextValue {
464
464
  return value;
465
465
  }
466
466
 
467
+ export function useOptionalLocale(): LocaleContextValue | null {
468
+ return useContext(LocaleContext);
469
+ }
470
+
467
471
  const CORE_FALLBACK_MESSAGES: Record<string, string> = {
468
472
  "runsTray.runs": "Runs",
469
473
  "runsTray.agentRuns": "Agent runs",
@@ -27,6 +27,7 @@ import {
27
27
  callAction,
28
28
  useChangeVersions,
29
29
  ChangelogDialog,
30
+ useT,
30
31
  } from "@agent-native/core/client";
31
32
  import { extensionPath } from "@agent-native/core/client/extensions";
32
33
  import changelog from "../../../CHANGELOG.md?raw";
@@ -50,10 +51,14 @@ interface ExtensionSearchItem {
50
51
  }
51
52
 
52
53
  const defaultTools = [
53
- { id: "explorer", name: "Explorer", href: "/dashboards/explorer" },
54
+ {
55
+ id: "explorer",
56
+ nameKey: "commandPalette.toolExplorer",
57
+ href: "/dashboards/explorer",
58
+ },
54
59
  {
55
60
  id: "customer-health",
56
- name: "Customer Health",
61
+ nameKey: "commandPalette.toolCustomerHealth",
57
62
  href: "/dashboards/customer-health",
58
63
  },
59
64
  ];
@@ -126,9 +131,9 @@ async function fetchExplorerDashboards(): Promise<ExplorerDashboard[]> {
126
131
  }
127
132
  }
128
133
 
129
- async function fetchSqlDashboards(): Promise<
130
- { id: string; name: string; hiddenAt: string | null }[]
131
- > {
134
+ async function fetchSqlDashboards(
135
+ t: (key: string) => string,
136
+ ): Promise<{ id: string; name: string; hiddenAt: string | null }[]> {
132
137
  try {
133
138
  const rows = await callAction(
134
139
  "list-sql-dashboards",
@@ -142,7 +147,7 @@ async function fetchSqlDashboards(): Promise<
142
147
  name:
143
148
  typeof d.name === "string" && d.name.trim().length > 0
144
149
  ? d.name
145
- : "Untitled dashboard",
150
+ : t("commandPalette.untitledDashboard"),
146
151
  hiddenAt: typeof d.hiddenAt === "string" ? d.hiddenAt : null,
147
152
  }));
148
153
  } catch {
@@ -183,6 +188,7 @@ function persistThemePreference(theme: "light" | "dark") {
183
188
  }
184
189
 
185
190
  export function CommandPalette() {
191
+ const t = useT();
186
192
  const [open, setOpen] = useState(false);
187
193
  const [changelogOpen, setChangelogOpen] = useState(false);
188
194
  const [searchQuery, setSearchQuery] = useState("");
@@ -213,7 +219,7 @@ export function CommandPalette() {
213
219
  const { data: sqlDashboards = [], isFetching: sqlDashboardsFetching } =
214
220
  useQuery({
215
221
  queryKey: ["sql-dashboards-palette", dashboardsSync],
216
- queryFn: fetchSqlDashboards,
222
+ queryFn: () => fetchSqlDashboards(t),
217
223
  staleTime: 30_000,
218
224
  enabled: open,
219
225
  placeholderData: (prev) => prev,
@@ -276,21 +282,24 @@ export function CommandPalette() {
276
282
  }}
277
283
  >
278
284
  <CommandInput
279
- placeholder="Search dashboards, extensions, charts..."
285
+ placeholder={t("commandPalette.searchPlaceholder")}
280
286
  value={searchQuery}
281
287
  onValueChange={setSearchQuery}
282
288
  />
283
289
  <CommandList>
284
290
  {!asyncGroupsLoading && (
285
- <CommandEmpty>No results found.</CommandEmpty>
291
+ <CommandEmpty>{t("commandPalette.noResults")}</CommandEmpty>
286
292
  )}
287
293
 
288
294
  {explorerDashboardsFetching && explorerDashboards.length === 0 && (
289
- <CommandLoadingGroup heading="Explorer Dashboards" rows={2} />
295
+ <CommandLoadingGroup
296
+ heading={t("commandPalette.groupExplorerDashboards")}
297
+ rows={2}
298
+ />
290
299
  )}
291
300
 
292
301
  {visibleExplorerDashboards.length > 0 && (
293
- <CommandGroup heading="Explorer Dashboards">
302
+ <CommandGroup heading={t("commandPalette.groupExplorerDashboards")}>
294
303
  {visibleExplorerDashboards.map((d) => (
295
304
  <CommandItem
296
305
  key={`ed-${d.id}`}
@@ -307,7 +316,7 @@ export function CommandPalette() {
307
316
  <span className="truncate">{d.name}</span>
308
317
  {d.hiddenAt ? (
309
318
  <span className="ms-2 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
310
- Hidden
319
+ {t("commandPalette.hidden")}
311
320
  </span>
312
321
  ) : null}
313
322
  </CommandItem>
@@ -316,11 +325,14 @@ export function CommandPalette() {
316
325
  )}
317
326
 
318
327
  {sqlDashboardsFetching && sqlDashboards.length === 0 && (
319
- <CommandLoadingGroup heading="SQL Dashboards" rows={3} />
328
+ <CommandLoadingGroup
329
+ heading={t("commandPalette.groupSqlDashboards")}
330
+ rows={3}
331
+ />
320
332
  )}
321
333
 
322
334
  {visibleSqlDashboards.length > 0 && (
323
- <CommandGroup heading="SQL Dashboards">
335
+ <CommandGroup heading={t("commandPalette.groupSqlDashboards")}>
324
336
  {visibleSqlDashboards.map((d) => (
325
337
  <CommandItem
326
338
  key={`sql-${d.id}`}
@@ -335,7 +347,7 @@ export function CommandPalette() {
335
347
  <span className="truncate">{d.name}</span>
336
348
  {d.hiddenAt ? (
337
349
  <span className="ms-2 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
338
- Hidden
350
+ {t("commandPalette.hidden")}
339
351
  </span>
340
352
  ) : null}
341
353
  </CommandItem>
@@ -344,11 +356,14 @@ export function CommandPalette() {
344
356
  )}
345
357
 
346
358
  {extensionsFetching && extensions.length === 0 && (
347
- <CommandLoadingGroup heading="Extensions" rows={3} />
359
+ <CommandLoadingGroup
360
+ heading={t("commandPalette.groupExtensions")}
361
+ rows={3}
362
+ />
348
363
  )}
349
364
 
350
365
  {extensions.length > 0 && (
351
- <CommandGroup heading="Extensions">
366
+ <CommandGroup heading={t("commandPalette.groupExtensions")}>
352
367
  {extensions.map((extension) => (
353
368
  <CommandItem
354
369
  key={`extension-${extension.id}`}
@@ -369,7 +384,7 @@ export function CommandPalette() {
369
384
  </CommandGroup>
370
385
  )}
371
386
 
372
- <CommandGroup heading="Dashboards">
387
+ <CommandGroup heading={t("commandPalette.groupDashboards")}>
373
388
  {dashboards.map((d) => (
374
389
  <CommandItem
375
390
  key={`dash-${d.id}`}
@@ -382,20 +397,20 @@ export function CommandPalette() {
382
397
  ))}
383
398
  </CommandGroup>
384
399
 
385
- <CommandGroup heading="Tools">
386
- {defaultTools.map((t) => (
400
+ <CommandGroup heading={t("commandPalette.groupTools")}>
401
+ {defaultTools.map((tool) => (
387
402
  <CommandItem
388
- key={`tool-${t.id}`}
389
- onSelect={() => go(t.href)}
390
- keywords={commandPaletteKeywords(t.name, "tool")}
403
+ key={`tool-${tool.id}`}
404
+ onSelect={() => go(tool.href)}
405
+ keywords={commandPaletteKeywords(t(tool.nameKey), "tool")}
391
406
  >
392
407
  <IconTool className="me-2 h-4 w-4 text-muted-foreground" />
393
- {t.name}
408
+ {t(tool.nameKey)}
394
409
  </CommandItem>
395
410
  ))}
396
411
  </CommandGroup>
397
412
 
398
- <CommandGroup heading="Appearance">
413
+ <CommandGroup heading={t("commandPalette.groupAppearance")}>
399
414
  <CommandItem
400
415
  onSelect={() => {
401
416
  const nextTheme = isDark ? "light" : "dark";
@@ -409,18 +424,20 @@ export function CommandPalette() {
409
424
  ) : (
410
425
  <IconMoon className="me-2 h-4 w-4 text-muted-foreground" />
411
426
  )}
412
- Toggle {isDark ? "light" : "dark"} mode
427
+ {isDark
428
+ ? t("commandPalette.toggleLightMode")
429
+ : t("commandPalette.toggleDarkMode")}
413
430
  </CommandItem>
414
431
  </CommandGroup>
415
432
 
416
- <CommandGroup heading="Help">
433
+ <CommandGroup heading={t("commandPalette.groupHelp")}>
417
434
  <CommandItem
418
435
  onSelect={() => {
419
436
  setOpen(false);
420
437
  setChangelogOpen(true);
421
438
  }}
422
439
  keywords={commandPaletteKeywords(
423
- "What's new",
440
+ t("commandPalette.whatsNew"),
424
441
  "changelog",
425
442
  "updates",
426
443
  "release notes",
@@ -428,16 +445,19 @@ export function CommandPalette() {
428
445
  )}
429
446
  >
430
447
  <IconHistory className="me-2 h-4 w-4 text-muted-foreground" />
431
- What's new
448
+ {t("commandPalette.whatsNew")}
432
449
  </CommandItem>
433
450
  </CommandGroup>
434
451
 
435
452
  {savedChartsFetching && savedCharts.length === 0 && (
436
- <CommandLoadingGroup heading="Saved Charts" rows={2} />
453
+ <CommandLoadingGroup
454
+ heading={t("commandPalette.groupSavedCharts")}
455
+ rows={2}
456
+ />
437
457
  )}
438
458
 
439
459
  {savedCharts.length > 0 && (
440
- <CommandGroup heading="Saved Charts">
460
+ <CommandGroup heading={t("commandPalette.groupSavedCharts")}>
441
461
  {savedCharts.map((c) => (
442
462
  <CommandItem
443
463
  key={`chart-${c.id}`}