@agent-native/core 0.75.5 → 0.76.0

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 (427) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +7 -0
  3. package/corpus/core/docs/AGENTS.md +1 -0
  4. package/corpus/core/docs/content/client.md +15 -0
  5. package/corpus/core/docs/content/internationalization.md +145 -0
  6. package/corpus/core/docs/content/locales/ar-SA/internationalization.md +102 -0
  7. package/corpus/core/docs/content/locales/de-DE/internationalization.md +102 -0
  8. package/corpus/core/docs/content/locales/es-ES/internationalization.md +102 -0
  9. package/corpus/core/docs/content/locales/fr-FR/internationalization.md +102 -0
  10. package/corpus/core/docs/content/locales/hi-IN/internationalization.md +102 -0
  11. package/corpus/core/docs/content/locales/ja-JP/internationalization.md +114 -0
  12. package/corpus/core/docs/content/locales/ko-KR/internationalization.md +102 -0
  13. package/corpus/core/docs/content/locales/pt-BR/internationalization.md +102 -0
  14. package/corpus/core/docs/content/locales/zh-CN/internationalization.md +102 -0
  15. package/corpus/core/docs/content/skills-guide.md +19 -18
  16. package/corpus/core/package.json +7 -1
  17. package/corpus/core/src/client/CommandMenu.tsx +16 -0
  18. package/corpus/core/src/client/app-providers.tsx +26 -1
  19. package/corpus/core/src/client/i18n.tsx +605 -0
  20. package/corpus/core/src/client/index.ts +28 -0
  21. package/corpus/core/src/index.browser.ts +25 -0
  22. package/corpus/core/src/localization/actions/get-localization-preference.ts +23 -0
  23. package/corpus/core/src/localization/actions/set-localization-preference.ts +30 -0
  24. package/corpus/core/src/localization/index.ts +2 -0
  25. package/corpus/core/src/localization/server.ts +131 -0
  26. package/corpus/core/src/localization/shared.ts +163 -0
  27. package/corpus/core/src/server/action-discovery.ts +8 -0
  28. package/corpus/core/src/server/index.ts +8 -0
  29. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  30. package/corpus/core/src/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
  31. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
  32. package/corpus/core/src/templates/default/AGENTS.md +16 -15
  33. package/corpus/core/src/templates/default/app/i18n/en-US.ts +29 -0
  34. package/corpus/core/src/templates/default/app/i18n/index.ts +13 -0
  35. package/corpus/core/src/templates/default/app/root.tsx +20 -1
  36. package/corpus/core/src/templates/default/app/routes/_index.tsx +24 -9
  37. package/corpus/core/src/templates/default/app/routes/settings.tsx +67 -0
  38. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  39. package/corpus/core/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
  40. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
  41. package/corpus/core/src/vite/action-types-plugin.ts +10 -0
  42. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +6 -0
  43. package/corpus/templates/analytics/app/components/layout/Header.tsx +18 -15
  44. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
  45. package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +9 -3
  46. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +5 -3
  47. package/corpus/templates/analytics/app/i18n/ar-SA.ts +3 -0
  48. package/corpus/templates/analytics/app/i18n/de-DE.ts +3 -0
  49. package/corpus/templates/analytics/app/i18n/en-US.ts +3 -0
  50. package/corpus/templates/analytics/app/i18n/es-ES.ts +3 -0
  51. package/corpus/templates/analytics/app/i18n/fr-FR.ts +3 -0
  52. package/corpus/templates/analytics/app/i18n/hi-IN.ts +3 -0
  53. package/corpus/templates/analytics/app/i18n/index.ts +31 -0
  54. package/corpus/templates/analytics/app/i18n/ja-JP.ts +3 -0
  55. package/corpus/templates/analytics/app/i18n/ko-KR.ts +3 -0
  56. package/corpus/templates/analytics/app/i18n/pt-BR.ts +3 -0
  57. package/corpus/templates/analytics/app/i18n/zh-CN.ts +3 -0
  58. package/corpus/templates/analytics/app/i18n-data.ts +433 -0
  59. package/corpus/templates/analytics/app/pages/Settings.tsx +50 -16
  60. package/corpus/templates/analytics/app/root.tsx +14 -1
  61. package/corpus/templates/analytics/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  62. package/corpus/templates/analytics/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  63. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +6 -0
  64. package/corpus/templates/assets/app/components/layout/Header.tsx +17 -8
  65. package/corpus/templates/assets/app/components/layout/Layout.tsx +10 -6
  66. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +40 -23
  67. package/corpus/templates/assets/app/i18n/ar-SA.ts +3 -0
  68. package/corpus/templates/assets/app/i18n/de-DE.ts +3 -0
  69. package/corpus/templates/assets/app/i18n/en-US.ts +3 -0
  70. package/corpus/templates/assets/app/i18n/es-ES.ts +3 -0
  71. package/corpus/templates/assets/app/i18n/fr-FR.ts +3 -0
  72. package/corpus/templates/assets/app/i18n/hi-IN.ts +3 -0
  73. package/corpus/templates/assets/app/i18n/index.ts +31 -0
  74. package/corpus/templates/assets/app/i18n/ja-JP.ts +3 -0
  75. package/corpus/templates/assets/app/i18n/ko-KR.ts +3 -0
  76. package/corpus/templates/assets/app/i18n/pt-BR.ts +3 -0
  77. package/corpus/templates/assets/app/i18n/zh-CN.ts +3 -0
  78. package/corpus/templates/assets/app/i18n-data.ts +668 -0
  79. package/corpus/templates/assets/app/root.tsx +40 -15
  80. package/corpus/templates/assets/app/routes/_index.tsx +9 -10
  81. package/corpus/templates/assets/app/routes/settings.tsx +37 -6
  82. package/corpus/templates/assets/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  83. package/corpus/templates/assets/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  84. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  85. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +6 -0
  86. package/corpus/templates/brain/app/components/layout/Layout.tsx +12 -8
  87. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +23 -12
  88. package/corpus/templates/brain/app/i18n/ar-SA.ts +3 -0
  89. package/corpus/templates/brain/app/i18n/de-DE.ts +3 -0
  90. package/corpus/templates/brain/app/i18n/en-US.ts +3 -0
  91. package/corpus/templates/brain/app/i18n/es-ES.ts +3 -0
  92. package/corpus/templates/brain/app/i18n/fr-FR.ts +3 -0
  93. package/corpus/templates/brain/app/i18n/hi-IN.ts +3 -0
  94. package/corpus/templates/brain/app/i18n/index.ts +31 -0
  95. package/corpus/templates/brain/app/i18n/ja-JP.ts +3 -0
  96. package/corpus/templates/brain/app/i18n/ko-KR.ts +3 -0
  97. package/corpus/templates/brain/app/i18n/pt-BR.ts +3 -0
  98. package/corpus/templates/brain/app/i18n/zh-CN.ts +3 -0
  99. package/corpus/templates/brain/app/i18n-data.ts +624 -0
  100. package/corpus/templates/brain/app/root.tsx +27 -12
  101. package/corpus/templates/brain/app/routes/settings.tsx +45 -8
  102. package/corpus/templates/brain/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  103. package/corpus/templates/brain/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  104. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +6 -0
  105. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +2 -0
  106. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +16 -9
  107. package/corpus/templates/calendar/app/i18n/ar-SA.ts +57 -0
  108. package/corpus/templates/calendar/app/i18n/de-DE.ts +58 -0
  109. package/corpus/templates/calendar/app/i18n/en-US.ts +57 -0
  110. package/corpus/templates/calendar/app/i18n/es-ES.ts +58 -0
  111. package/corpus/templates/calendar/app/i18n/fr-FR.ts +58 -0
  112. package/corpus/templates/calendar/app/i18n/hi-IN.ts +57 -0
  113. package/corpus/templates/calendar/app/i18n/index.ts +31 -0
  114. package/corpus/templates/calendar/app/i18n/ja-JP.ts +58 -0
  115. package/corpus/templates/calendar/app/i18n/ko-KR.ts +57 -0
  116. package/corpus/templates/calendar/app/i18n/pt-BR.ts +57 -0
  117. package/corpus/templates/calendar/app/i18n/zh-CN.ts +57 -0
  118. package/corpus/templates/calendar/app/i18n-data.ts +516 -0
  119. package/corpus/templates/calendar/app/pages/CalendarView.tsx +2 -0
  120. package/corpus/templates/calendar/app/pages/Settings.tsx +63 -28
  121. package/corpus/templates/calendar/app/root.tsx +78 -7
  122. package/corpus/templates/calendar/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  123. package/corpus/templates/calendar/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  124. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  125. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +6 -0
  126. package/corpus/templates/chat/app/components/layout/Header.tsx +17 -11
  127. package/corpus/templates/chat/app/components/layout/Layout.tsx +12 -8
  128. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +47 -18
  129. package/corpus/templates/chat/app/i18n/ar-SA.ts +62 -0
  130. package/corpus/templates/chat/app/i18n/de-DE.ts +63 -0
  131. package/corpus/templates/chat/app/i18n/en-US.ts +63 -0
  132. package/corpus/templates/chat/app/i18n/es-ES.ts +63 -0
  133. package/corpus/templates/chat/app/i18n/fr-FR.ts +63 -0
  134. package/corpus/templates/chat/app/i18n/hi-IN.ts +63 -0
  135. package/corpus/templates/chat/app/i18n/index.ts +31 -0
  136. package/corpus/templates/chat/app/i18n/ja-JP.ts +63 -0
  137. package/corpus/templates/chat/app/i18n/ko-KR.ts +63 -0
  138. package/corpus/templates/chat/app/i18n/pt-BR.ts +63 -0
  139. package/corpus/templates/chat/app/i18n/zh-CN.ts +61 -0
  140. package/corpus/templates/chat/app/i18n-data.ts +475 -0
  141. package/corpus/templates/chat/app/root.tsx +18 -5
  142. package/corpus/templates/chat/app/routes/_index.tsx +9 -8
  143. package/corpus/templates/chat/app/routes/settings.tsx +86 -0
  144. package/corpus/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  145. package/corpus/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  146. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +6 -0
  147. package/corpus/templates/clips/app/components/layout/Header.tsx +23 -17
  148. package/corpus/templates/clips/app/components/library/empty-state.tsx +10 -34
  149. package/corpus/templates/clips/app/components/library/library-layout.tsx +45 -34
  150. package/corpus/templates/clips/app/i18n/ar-SA.ts +182 -0
  151. package/corpus/templates/clips/app/i18n/de-DE.ts +184 -0
  152. package/corpus/templates/clips/app/i18n/en-US.ts +179 -0
  153. package/corpus/templates/clips/app/i18n/es-ES.ts +183 -0
  154. package/corpus/templates/clips/app/i18n/fr-FR.ts +184 -0
  155. package/corpus/templates/clips/app/i18n/hi-IN.ts +180 -0
  156. package/corpus/templates/clips/app/i18n/index.ts +41 -0
  157. package/corpus/templates/clips/app/i18n/ja-JP.ts +180 -0
  158. package/corpus/templates/clips/app/i18n/ko-KR.ts +178 -0
  159. package/corpus/templates/clips/app/i18n/pt-BR.ts +183 -0
  160. package/corpus/templates/clips/app/i18n/zh-CN.ts +173 -0
  161. package/corpus/templates/clips/app/root.tsx +104 -10
  162. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +154 -95
  163. package/corpus/templates/clips/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  164. package/corpus/templates/clips/changelog/2026-06-24-clips-now-includes-a-language-picker-and-simplified-chinese-ui.md +6 -0
  165. package/corpus/templates/clips/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  166. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +6 -0
  167. package/corpus/templates/content/app/components/EmptyState.tsx +7 -5
  168. package/corpus/templates/content/app/components/ThemeToggle.tsx +4 -2
  169. package/corpus/templates/content/app/components/layout/Header.tsx +2 -0
  170. package/corpus/templates/content/app/components/layout/Layout.tsx +8 -7
  171. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +41 -1
  172. package/corpus/templates/content/app/i18n/ar-SA.ts +3 -0
  173. package/corpus/templates/content/app/i18n/de-DE.ts +3 -0
  174. package/corpus/templates/content/app/i18n/en-US.ts +3 -0
  175. package/corpus/templates/content/app/i18n/es-ES.ts +3 -0
  176. package/corpus/templates/content/app/i18n/fr-FR.ts +3 -0
  177. package/corpus/templates/content/app/i18n/hi-IN.ts +3 -0
  178. package/corpus/templates/content/app/i18n/index.ts +31 -0
  179. package/corpus/templates/content/app/i18n/ja-JP.ts +3 -0
  180. package/corpus/templates/content/app/i18n/ko-KR.ts +3 -0
  181. package/corpus/templates/content/app/i18n/pt-BR.ts +3 -0
  182. package/corpus/templates/content/app/i18n/zh-CN.ts +3 -0
  183. package/corpus/templates/content/app/i18n-data.ts +490 -0
  184. package/corpus/templates/content/app/root.tsx +110 -23
  185. package/corpus/templates/content/app/routes/_app.settings.tsx +84 -0
  186. package/corpus/templates/content/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  187. package/corpus/templates/content/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  188. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +6 -0
  189. package/corpus/templates/design/app/components/layout/Header.tsx +16 -8
  190. package/corpus/templates/design/app/components/layout/Layout.tsx +8 -6
  191. package/corpus/templates/design/app/components/layout/Sidebar.tsx +25 -9
  192. package/corpus/templates/design/app/i18n/ar-SA.ts +3 -0
  193. package/corpus/templates/design/app/i18n/de-DE.ts +3 -0
  194. package/corpus/templates/design/app/i18n/en-US.ts +3 -0
  195. package/corpus/templates/design/app/i18n/es-ES.ts +3 -0
  196. package/corpus/templates/design/app/i18n/fr-FR.ts +3 -0
  197. package/corpus/templates/design/app/i18n/hi-IN.ts +3 -0
  198. package/corpus/templates/design/app/i18n/index.ts +31 -0
  199. package/corpus/templates/design/app/i18n/ja-JP.ts +3 -0
  200. package/corpus/templates/design/app/i18n/ko-KR.ts +3 -0
  201. package/corpus/templates/design/app/i18n/pt-BR.ts +3 -0
  202. package/corpus/templates/design/app/i18n/zh-CN.ts +3 -0
  203. package/corpus/templates/design/app/i18n-data.ts +350 -0
  204. package/corpus/templates/design/app/root.tsx +40 -15
  205. package/corpus/templates/design/app/routes/settings.tsx +43 -0
  206. package/corpus/templates/design/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  207. package/corpus/templates/design/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  208. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +6 -0
  209. package/corpus/templates/dispatch/app/i18n/ar-SA.ts +3 -0
  210. package/corpus/templates/dispatch/app/i18n/de-DE.ts +3 -0
  211. package/corpus/templates/dispatch/app/i18n/en-US.ts +3 -0
  212. package/corpus/templates/dispatch/app/i18n/es-ES.ts +3 -0
  213. package/corpus/templates/dispatch/app/i18n/fr-FR.ts +3 -0
  214. package/corpus/templates/dispatch/app/i18n/hi-IN.ts +3 -0
  215. package/corpus/templates/dispatch/app/i18n/index.ts +31 -0
  216. package/corpus/templates/dispatch/app/i18n/ja-JP.ts +3 -0
  217. package/corpus/templates/dispatch/app/i18n/ko-KR.ts +3 -0
  218. package/corpus/templates/dispatch/app/i18n/pt-BR.ts +3 -0
  219. package/corpus/templates/dispatch/app/i18n/zh-CN.ts +3 -0
  220. package/corpus/templates/dispatch/app/i18n-data.ts +267 -0
  221. package/corpus/templates/dispatch/app/root.tsx +18 -4
  222. package/corpus/templates/dispatch/app/routes/settings.tsx +86 -0
  223. package/corpus/templates/dispatch/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  224. package/corpus/templates/dispatch/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  225. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +6 -0
  226. package/corpus/templates/forms/app/components/layout/Header.tsx +16 -9
  227. package/corpus/templates/forms/app/components/layout/Layout.tsx +6 -4
  228. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +34 -17
  229. package/corpus/templates/forms/app/i18n/ar-SA.ts +58 -0
  230. package/corpus/templates/forms/app/i18n/de-DE.ts +59 -0
  231. package/corpus/templates/forms/app/i18n/en-US.ts +59 -0
  232. package/corpus/templates/forms/app/i18n/es-ES.ts +59 -0
  233. package/corpus/templates/forms/app/i18n/fr-FR.ts +59 -0
  234. package/corpus/templates/forms/app/i18n/hi-IN.ts +59 -0
  235. package/corpus/templates/forms/app/i18n/index.ts +31 -0
  236. package/corpus/templates/forms/app/i18n/ja-JP.ts +59 -0
  237. package/corpus/templates/forms/app/i18n/ko-KR.ts +59 -0
  238. package/corpus/templates/forms/app/i18n/pt-BR.ts +59 -0
  239. package/corpus/templates/forms/app/i18n/zh-CN.ts +56 -0
  240. package/corpus/templates/forms/app/root.tsx +65 -16
  241. package/corpus/templates/forms/app/routes/_app.settings.tsx +85 -0
  242. package/corpus/templates/forms/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  243. package/corpus/templates/forms/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  244. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +29 -17
  245. package/corpus/templates/macros/app/components/layout/Header.tsx +16 -10
  246. package/corpus/templates/macros/app/i18n/ar-SA.ts +54 -0
  247. package/corpus/templates/macros/app/i18n/de-DE.ts +55 -0
  248. package/corpus/templates/macros/app/i18n/en-US.ts +55 -0
  249. package/corpus/templates/macros/app/i18n/es-ES.ts +55 -0
  250. package/corpus/templates/macros/app/i18n/fr-FR.ts +55 -0
  251. package/corpus/templates/macros/app/i18n/hi-IN.ts +55 -0
  252. package/corpus/templates/macros/app/i18n/index.ts +31 -0
  253. package/corpus/templates/macros/app/i18n/ja-JP.ts +55 -0
  254. package/corpus/templates/macros/app/i18n/ko-KR.ts +55 -0
  255. package/corpus/templates/macros/app/i18n/pt-BR.ts +55 -0
  256. package/corpus/templates/macros/app/i18n/zh-CN.ts +53 -0
  257. package/corpus/templates/macros/app/root.tsx +65 -15
  258. package/corpus/templates/macros/app/routes/settings.tsx +85 -0
  259. package/corpus/templates/macros/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  260. package/corpus/templates/macros/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  261. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +6 -0
  262. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +9 -4
  263. package/corpus/templates/mail/app/i18n/ar-SA.ts +33 -0
  264. package/corpus/templates/mail/app/i18n/de-DE.ts +33 -0
  265. package/corpus/templates/mail/app/i18n/en-US.ts +32 -0
  266. package/corpus/templates/mail/app/i18n/es-ES.ts +33 -0
  267. package/corpus/templates/mail/app/i18n/fr-FR.ts +33 -0
  268. package/corpus/templates/mail/app/i18n/hi-IN.ts +32 -0
  269. package/corpus/templates/mail/app/i18n/index.ts +31 -0
  270. package/corpus/templates/mail/app/i18n/ja-JP.ts +32 -0
  271. package/corpus/templates/mail/app/i18n/ko-KR.ts +33 -0
  272. package/corpus/templates/mail/app/i18n/pt-BR.ts +34 -0
  273. package/corpus/templates/mail/app/i18n/zh-CN.ts +32 -0
  274. package/corpus/templates/mail/app/pages/SettingsPage.tsx +67 -13
  275. package/corpus/templates/mail/app/root.tsx +20 -0
  276. package/corpus/templates/mail/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  277. package/corpus/templates/mail/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  278. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  279. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +6 -0
  280. package/corpus/templates/plan/app/components/layout/Header.tsx +19 -12
  281. package/corpus/templates/plan/app/components/layout/Layout.tsx +11 -7
  282. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +41 -28
  283. package/corpus/templates/plan/app/i18n/ar-SA.ts +77 -0
  284. package/corpus/templates/plan/app/i18n/de-DE.ts +78 -0
  285. package/corpus/templates/plan/app/i18n/en-US.ts +78 -0
  286. package/corpus/templates/plan/app/i18n/es-ES.ts +78 -0
  287. package/corpus/templates/plan/app/i18n/fr-FR.ts +78 -0
  288. package/corpus/templates/plan/app/i18n/hi-IN.ts +78 -0
  289. package/corpus/templates/plan/app/i18n/index.ts +31 -0
  290. package/corpus/templates/plan/app/i18n/ja-JP.ts +79 -0
  291. package/corpus/templates/plan/app/i18n/ko-KR.ts +77 -0
  292. package/corpus/templates/plan/app/i18n/pt-BR.ts +78 -0
  293. package/corpus/templates/plan/app/i18n/zh-CN.ts +74 -0
  294. package/corpus/templates/plan/app/root.tsx +45 -8
  295. package/corpus/templates/plan/app/routes/settings.tsx +86 -0
  296. package/corpus/templates/plan/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  297. package/corpus/templates/plan/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  298. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +6 -0
  299. package/corpus/templates/slides/app/components/layout/Header.tsx +23 -11
  300. package/corpus/templates/slides/app/components/layout/Layout.tsx +7 -6
  301. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +23 -11
  302. package/corpus/templates/slides/app/i18n/ar-SA.ts +54 -0
  303. package/corpus/templates/slides/app/i18n/de-DE.ts +56 -0
  304. package/corpus/templates/slides/app/i18n/en-US.ts +55 -0
  305. package/corpus/templates/slides/app/i18n/es-ES.ts +55 -0
  306. package/corpus/templates/slides/app/i18n/fr-FR.ts +55 -0
  307. package/corpus/templates/slides/app/i18n/hi-IN.ts +55 -0
  308. package/corpus/templates/slides/app/i18n/index.ts +31 -0
  309. package/corpus/templates/slides/app/i18n/ja-JP.ts +55 -0
  310. package/corpus/templates/slides/app/i18n/ko-KR.ts +55 -0
  311. package/corpus/templates/slides/app/i18n/pt-BR.ts +55 -0
  312. package/corpus/templates/slides/app/i18n/zh-CN.ts +53 -0
  313. package/corpus/templates/slides/app/root.tsx +50 -8
  314. package/corpus/templates/slides/app/routes/settings.tsx +85 -0
  315. package/corpus/templates/slides/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  316. package/corpus/templates/slides/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  317. package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +6 -0
  318. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +14 -9
  319. package/corpus/templates/videos/app/components/Sidebar.tsx +16 -9
  320. package/corpus/templates/videos/app/components/StudioHeader.tsx +12 -8
  321. package/corpus/templates/videos/app/components/layout/Header.tsx +21 -15
  322. package/corpus/templates/videos/app/components/layout/Layout.tsx +10 -7
  323. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +21 -6
  324. package/corpus/templates/videos/app/i18n/ar-SA.ts +73 -0
  325. package/corpus/templates/videos/app/i18n/de-DE.ts +75 -0
  326. package/corpus/templates/videos/app/i18n/en-US.ts +74 -0
  327. package/corpus/templates/videos/app/i18n/es-ES.ts +75 -0
  328. package/corpus/templates/videos/app/i18n/fr-FR.ts +75 -0
  329. package/corpus/templates/videos/app/i18n/hi-IN.ts +74 -0
  330. package/corpus/templates/videos/app/i18n/index.ts +31 -0
  331. package/corpus/templates/videos/app/i18n/ja-JP.ts +74 -0
  332. package/corpus/templates/videos/app/i18n/ko-KR.ts +74 -0
  333. package/corpus/templates/videos/app/i18n/pt-BR.ts +75 -0
  334. package/corpus/templates/videos/app/i18n/zh-CN.ts +72 -0
  335. package/corpus/templates/videos/app/pages/Index.tsx +11 -9
  336. package/corpus/templates/videos/app/root.tsx +45 -7
  337. package/corpus/templates/videos/app/routes/settings.tsx +85 -0
  338. package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  339. package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  340. package/dist/client/CommandMenu.d.ts +3 -0
  341. package/dist/client/CommandMenu.d.ts.map +1 -1
  342. package/dist/client/CommandMenu.js +9 -0
  343. package/dist/client/CommandMenu.js.map +1 -1
  344. package/dist/client/app-providers.d.ts +8 -1
  345. package/dist/client/app-providers.d.ts.map +1 -1
  346. package/dist/client/app-providers.js +7 -5
  347. package/dist/client/app-providers.js.map +1 -1
  348. package/dist/client/i18n.d.ts +54 -0
  349. package/dist/client/i18n.d.ts.map +1 -0
  350. package/dist/client/i18n.js +354 -0
  351. package/dist/client/i18n.js.map +1 -0
  352. package/dist/client/index.d.ts +2 -1
  353. package/dist/client/index.d.ts.map +1 -1
  354. package/dist/client/index.js +2 -1
  355. package/dist/client/index.js.map +1 -1
  356. package/dist/index.browser.d.ts +1 -1
  357. package/dist/index.browser.d.ts.map +1 -1
  358. package/dist/index.browser.js +1 -1
  359. package/dist/index.browser.js.map +1 -1
  360. package/dist/localization/actions/get-localization-preference.d.ts +4 -0
  361. package/dist/localization/actions/get-localization-preference.d.ts.map +1 -0
  362. package/dist/localization/actions/get-localization-preference.js +16 -0
  363. package/dist/localization/actions/get-localization-preference.js.map +1 -0
  364. package/dist/localization/actions/set-localization-preference.d.ts +6 -0
  365. package/dist/localization/actions/set-localization-preference.d.ts.map +1 -0
  366. package/dist/localization/actions/set-localization-preference.js +24 -0
  367. package/dist/localization/actions/set-localization-preference.js.map +1 -0
  368. package/dist/localization/index.d.ts +3 -0
  369. package/dist/localization/index.d.ts.map +1 -0
  370. package/dist/localization/index.js +3 -0
  371. package/dist/localization/index.js.map +1 -0
  372. package/dist/localization/server.d.ts +25 -0
  373. package/dist/localization/server.d.ts.map +1 -0
  374. package/dist/localization/server.js +69 -0
  375. package/dist/localization/server.js.map +1 -0
  376. package/dist/localization/shared.d.ts +25 -0
  377. package/dist/localization/shared.d.ts.map +1 -0
  378. package/dist/localization/shared.js +134 -0
  379. package/dist/localization/shared.js.map +1 -0
  380. package/dist/server/action-discovery.d.ts.map +1 -1
  381. package/dist/server/action-discovery.js +8 -0
  382. package/dist/server/action-discovery.js.map +1 -1
  383. package/dist/server/index.d.ts +1 -0
  384. package/dist/server/index.d.ts.map +1 -1
  385. package/dist/server/index.js +1 -0
  386. package/dist/server/index.js.map +1 -1
  387. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  388. package/dist/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
  389. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
  390. package/dist/templates/default/AGENTS.md +16 -15
  391. package/dist/templates/default/app/i18n/en-US.ts +29 -0
  392. package/dist/templates/default/app/i18n/index.ts +13 -0
  393. package/dist/templates/default/app/root.tsx +20 -1
  394. package/dist/templates/default/app/routes/_index.tsx +24 -9
  395. package/dist/templates/default/app/routes/settings.tsx +67 -0
  396. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  397. package/dist/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
  398. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
  399. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  400. package/dist/vite/action-types-plugin.js +8 -0
  401. package/dist/vite/action-types-plugin.js.map +1 -1
  402. package/docs/AGENTS.md +1 -0
  403. package/docs/content/client.md +15 -0
  404. package/docs/content/internationalization.md +145 -0
  405. package/docs/content/locales/ar-SA/internationalization.md +102 -0
  406. package/docs/content/locales/de-DE/internationalization.md +102 -0
  407. package/docs/content/locales/es-ES/internationalization.md +102 -0
  408. package/docs/content/locales/fr-FR/internationalization.md +102 -0
  409. package/docs/content/locales/hi-IN/internationalization.md +102 -0
  410. package/docs/content/locales/ja-JP/internationalization.md +114 -0
  411. package/docs/content/locales/ko-KR/internationalization.md +102 -0
  412. package/docs/content/locales/pt-BR/internationalization.md +102 -0
  413. package/docs/content/locales/zh-CN/internationalization.md +102 -0
  414. package/docs/content/skills-guide.md +19 -18
  415. package/package.json +7 -1
  416. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  417. package/src/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
  418. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
  419. package/src/templates/default/AGENTS.md +16 -15
  420. package/src/templates/default/app/i18n/en-US.ts +29 -0
  421. package/src/templates/default/app/i18n/index.ts +13 -0
  422. package/src/templates/default/app/root.tsx +20 -1
  423. package/src/templates/default/app/routes/_index.tsx +24 -9
  424. package/src/templates/default/app/routes/settings.tsx +67 -0
  425. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  426. package/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
  427. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
@@ -0,0 +1,55 @@
1
+ const messages = {
2
+ root: {
3
+ commandPresentations: "프레젠테이션",
4
+ searchDecks: "덱 검색",
5
+ commandAppearance: "모양",
6
+ toggleTheme: "테마 전환",
7
+ },
8
+ header: {
9
+ settings: "설정",
10
+ decks: "덱",
11
+ designSystems: "디자인 시스템",
12
+ team: "팀",
13
+ extensions: "확장",
14
+ deck: "덱",
15
+ tool: "도구",
16
+ slides: "Slides",
17
+ },
18
+ navigation: {
19
+ settings: "설정",
20
+ brand: "Slides",
21
+ decks: "덱",
22
+ designSystems: "디자인 시스템",
23
+ team: "팀",
24
+ },
25
+ settings: {
26
+ title: "설정",
27
+ description: "이 앱의 언어 및 워크스페이스 환경설정입니다.",
28
+ languageTitle: "언어",
29
+ languageDescription:
30
+ "인터페이스 언어를 선택하세요. 이 기본 설정은 계정에 저장됩니다.",
31
+ languageLabel: "인터페이스 언어",
32
+ workspaceTitle: "워크스페이스",
33
+ workspaceDescription:
34
+ "팀원, 조직 접근 권한, 공유 워크스페이스 환경설정을 관리합니다.",
35
+ openTeamSettings: "팀 설정 열기",
36
+ openResourceSettings: "리소스 설정 열기",
37
+ agentTitle: "에이전트 설정",
38
+ agentDescription:
39
+ "오른쪽 사이드바의 에이전트 설정을 열어 모델, API 키, 자동화, 음성 및 기타 제어를 관리합니다.",
40
+ openAgentSettings: "에이전트 설정 열기",
41
+ },
42
+ agent: {
43
+ emptyState: "프레젠테이션에 대해 무엇이든 물어보세요",
44
+ suggestionPitch: "이 문서로 10장짜리 피치덱 만들기",
45
+ suggestionBrand: "이 덱에 우리 브랜드 적용",
46
+ suggestionHero: "이 슬라이드의 히어로 이미지 생성",
47
+ },
48
+ sidebar: {
49
+ openNavigation: "탐색 열기",
50
+ expandSidebar: "사이드바 펼치기",
51
+ collapseSidebar: "사이드바 접기",
52
+ },
53
+ };
54
+
55
+ export default messages;
@@ -0,0 +1,55 @@
1
+ const messages = {
2
+ root: {
3
+ commandPresentations: "Apresentações",
4
+ searchDecks: "Buscar decks",
5
+ commandAppearance: "Aparência",
6
+ toggleTheme: "Alternar tema",
7
+ },
8
+ header: {
9
+ settings: "Configurações",
10
+ decks: "Decks",
11
+ designSystems: "Sistemas de design",
12
+ team: "Equipe",
13
+ extensions: "Extensões",
14
+ deck: "Deck",
15
+ tool: "Ferramenta",
16
+ slides: "Slides",
17
+ },
18
+ navigation: {
19
+ settings: "Configurações",
20
+ brand: "Slides",
21
+ decks: "Decks",
22
+ designSystems: "Sistemas de design",
23
+ team: "Equipe",
24
+ },
25
+ settings: {
26
+ title: "Configurações",
27
+ description: "Preferências de idioma e espaço de trabalho deste app.",
28
+ languageTitle: "Idioma",
29
+ languageDescription:
30
+ "Escolha o idioma da interface. Essa preferência é salva na sua conta.",
31
+ languageLabel: "Idioma da interface",
32
+ workspaceTitle: "Espaço de trabalho",
33
+ workspaceDescription:
34
+ "Gerencie membros da equipe, acesso da organização e preferências compartilhadas.",
35
+ openTeamSettings: "Abrir configurações da equipe",
36
+ openResourceSettings: "Abrir configurações de recursos",
37
+ agentTitle: "Configurações do agente",
38
+ agentDescription:
39
+ "Abra as configurações do agente na barra lateral para modelos, chaves de API, automações, voz e outros controles.",
40
+ openAgentSettings: "Abrir configurações do agente",
41
+ },
42
+ agent: {
43
+ emptyState: "Pergunte qualquer coisa sobre suas apresentações",
44
+ suggestionPitch: "Crie um pitch de 10 slides a partir deste doc",
45
+ suggestionBrand: "Aplique nossa marca a este deck",
46
+ suggestionHero: "Gere uma imagem hero para este slide",
47
+ },
48
+ sidebar: {
49
+ openNavigation: "Abrir navegação",
50
+ expandSidebar: "Expandir barra lateral",
51
+ collapseSidebar: "Recolher barra lateral",
52
+ },
53
+ };
54
+
55
+ export default messages;
@@ -0,0 +1,53 @@
1
+ const messages = {
2
+ root: {
3
+ commandPresentations: "演示文稿",
4
+ searchDecks: "搜索幻灯片",
5
+ commandAppearance: "外观",
6
+ toggleTheme: "切换主题",
7
+ },
8
+ header: {
9
+ settings: "设置",
10
+ decks: "幻灯片",
11
+ designSystems: "设计系统",
12
+ team: "团队",
13
+ extensions: "扩展",
14
+ deck: "幻灯片",
15
+ tool: "工具",
16
+ slides: "Slides",
17
+ },
18
+ navigation: {
19
+ settings: "设置",
20
+ brand: "Slides",
21
+ decks: "幻灯片",
22
+ designSystems: "设计系统",
23
+ team: "团队",
24
+ },
25
+ settings: {
26
+ title: "设置",
27
+ description: "此应用的语言和工作区偏好设置。",
28
+ languageTitle: "语言",
29
+ languageDescription: "选择界面语言。此偏好会保存到你的账户。",
30
+ languageLabel: "界面语言",
31
+ workspaceTitle: "工作区",
32
+ workspaceDescription: "管理团队成员、组织访问权限和共享工作区偏好。",
33
+ openTeamSettings: "打开团队设置",
34
+ openResourceSettings: "打开资源设置",
35
+ agentTitle: "代理设置",
36
+ agentDescription:
37
+ "打开代理侧边栏设置,管理模型、API 密钥、自动化、语音和其他代理控制项。",
38
+ openAgentSettings: "打开代理设置",
39
+ },
40
+ agent: {
41
+ emptyState: "可以询问我任何关于演示文稿的问题",
42
+ suggestionPitch: "根据这份文档制作 10 页推介幻灯片",
43
+ suggestionBrand: "将我们的品牌应用到这份幻灯片",
44
+ suggestionHero: "为这页幻灯片生成主视觉图片",
45
+ },
46
+ sidebar: {
47
+ openNavigation: "打开导航",
48
+ expandSidebar: "展开侧边栏",
49
+ collapseSidebar: "折叠侧边栏",
50
+ },
51
+ };
52
+
53
+ export default messages;
@@ -20,6 +20,7 @@ import {
20
20
  exitSelectionMode as coreExitSelectionMode,
21
21
  useCommandMenuShortcut,
22
22
  useDbSync,
23
+ useT,
23
24
  } from "@agent-native/core/client";
24
25
  import { Layout as AppLayout } from "@/components/layout/Layout";
25
26
  import { IconSun, IconMoon } from "@tabler/icons-react";
@@ -29,8 +30,12 @@ import type { LinksFunction } from "react-router";
29
30
  import stylesheet from "./global.css?url";
30
31
  import { configureTracking } from "@agent-native/core/client";
31
32
  import changelog from "../CHANGELOG.md?raw";
32
- import { getThemeInitScript } from "@agent-native/core/client";
33
+ import {
34
+ getLocaleInitScript,
35
+ getThemeInitScript,
36
+ } from "@agent-native/core/client";
33
37
  import { TAB_ID } from "@/lib/tab-id";
38
+ import { i18nCatalog } from "./i18n";
34
39
  configureTracking({
35
40
  getDefaultProps: (_name, properties) => ({
36
41
  ...properties,
@@ -90,11 +95,35 @@ function useExitSelectionOnOutsideClick() {
90
95
  }, []);
91
96
  }
92
97
 
93
- const THEME_INIT_SCRIPT = getThemeInitScript("dark", true);
98
+ const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]";
99
+ const LOCALE_INIT_SCRIPT_SELECTOR = "script[data-agent-native-locale-init]";
100
+
101
+ function getHydrationStableThemeInitScript() {
102
+ if (typeof document !== "undefined") {
103
+ const existing = document.querySelector<HTMLScriptElement>(
104
+ THEME_INIT_SCRIPT_SELECTOR,
105
+ );
106
+ if (existing?.innerHTML) return existing.innerHTML;
107
+ }
108
+ return getThemeInitScript("dark", true);
109
+ }
110
+
111
+ function getHydrationStableLocaleInitScript() {
112
+ if (typeof document !== "undefined") {
113
+ const existing = document.querySelector<HTMLScriptElement>(
114
+ LOCALE_INIT_SCRIPT_SELECTOR,
115
+ );
116
+ if (existing?.innerHTML) return existing.innerHTML;
117
+ }
118
+ return getLocaleInitScript();
119
+ }
120
+
121
+ const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
122
+ const LOCALE_INIT_SCRIPT = getHydrationStableLocaleInitScript();
94
123
 
95
124
  export function Layout({ children }: { children: React.ReactNode }) {
96
125
  return (
97
- <html lang="en" suppressHydrationWarning>
126
+ <html lang="en-US" dir="ltr" data-locale="en-US" suppressHydrationWarning>
98
127
  <head>
99
128
  <meta charSet="utf-8" />
100
129
  <meta
@@ -102,9 +131,15 @@ export function Layout({ children }: { children: React.ReactNode }) {
102
131
  content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
103
132
  />
104
133
  <script
134
+ data-agent-native-theme-init
105
135
  suppressHydrationWarning
106
136
  dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
107
137
  />
138
+ <script
139
+ data-agent-native-locale-init
140
+ suppressHydrationWarning
141
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
142
+ />
108
143
  <link rel="icon" type="image/svg+xml" href={appPath("/favicon.svg")} />
109
144
  <link rel="manifest" href={appPath("/manifest.json")} />
110
145
  <meta name="theme-color" content="#EC4899" />
@@ -145,6 +180,7 @@ function AppContent() {
145
180
  const { resolvedTheme, setTheme } = useTheme();
146
181
  const isDark = resolvedTheme === "dark";
147
182
  const [cmdkOpen, setCmdkOpen] = useState(false);
183
+ const t = useT();
148
184
  useCommandMenuShortcut(useCallback(() => setCmdkOpen(true), []));
149
185
  const location = useLocation();
150
186
 
@@ -169,16 +205,18 @@ function AppContent() {
169
205
  changelog={changelog}
170
206
  changelogKey="slides"
171
207
  >
172
- <CommandMenu.Group heading="Presentations">
173
- <CommandMenu.Item onSelect={() => {}}>Search decks</CommandMenu.Item>
208
+ <CommandMenu.Group heading={t("root.commandPresentations")}>
209
+ <CommandMenu.Item onSelect={() => {}}>
210
+ {t("root.searchDecks")}
211
+ </CommandMenu.Item>
174
212
  </CommandMenu.Group>
175
- <CommandMenu.Group heading="Appearance">
213
+ <CommandMenu.Group heading={t("root.commandAppearance")}>
176
214
  <CommandMenu.Item
177
215
  onSelect={() => setTheme(isDark ? "light" : "dark")}
178
216
  keywords={["theme", "dark", "light", "mode"]}
179
217
  >
180
218
  {isDark ? <IconSun size={16} /> : <IconMoon size={16} />}
181
- Toggle {isDark ? "light" : "dark"} mode
219
+ {t("root.toggleTheme")}
182
220
  </CommandMenu.Item>
183
221
  </CommandMenu.Group>
184
222
  </CommandMenu>
@@ -200,7 +238,11 @@ export default function Root() {
200
238
  }
201
239
 
202
240
  return (
203
- <AppProviders queryClient={queryClient} defaultTheme="dark">
241
+ <AppProviders
242
+ queryClient={queryClient}
243
+ defaultTheme="dark"
244
+ i18n={{ catalog: i18nCatalog }}
245
+ >
204
246
  <AppContent />
205
247
  {/* useToast-based Toaster — separate from AppProviders' sonner Toaster.
206
248
  Components throughout the app call toast() from @/hooks/use-toast,
@@ -0,0 +1,85 @@
1
+ import { Link } from "react-router";
2
+ import {
3
+ ChangelogSettingsCard,
4
+ LanguagePicker,
5
+ openAgentSettings,
6
+ useT,
7
+ } from "@agent-native/core/client";
8
+ import { useSetPageTitle } from "@/components/layout/HeaderActions";
9
+ import { Button } from "@/components/ui/button";
10
+ import {
11
+ Card,
12
+ CardContent,
13
+ CardDescription,
14
+ CardHeader,
15
+ CardTitle,
16
+ } from "@/components/ui/card";
17
+ import { Label } from "@/components/ui/label";
18
+ import changelog from "../../CHANGELOG.md?raw";
19
+
20
+ export function meta() {
21
+ return [{ title: "Settings - Slides" }];
22
+ }
23
+
24
+ export default function SettingsRoute() {
25
+ const t = useT();
26
+ useSetPageTitle(t("settings.title"));
27
+
28
+ return (
29
+ <main className="mx-auto w-full max-w-3xl space-y-6 px-4 py-6 sm:px-6 sm:py-10">
30
+ <div className="space-y-1">
31
+ <h1 className="text-2xl font-semibold tracking-tight">
32
+ {t("settings.title")}
33
+ </h1>
34
+ <p className="text-sm leading-6 text-muted-foreground">
35
+ {t("settings.description")}
36
+ </p>
37
+ </div>
38
+
39
+ <Card>
40
+ <CardHeader>
41
+ <CardTitle className="text-base">
42
+ {t("settings.languageTitle")}
43
+ </CardTitle>
44
+ <CardDescription>{t("settings.languageDescription")}</CardDescription>
45
+ </CardHeader>
46
+ <CardContent className="max-w-xs space-y-1.5">
47
+ <Label>{t("settings.languageLabel")}</Label>
48
+ <LanguagePicker label={t("settings.languageLabel")} />
49
+ </CardContent>
50
+ </Card>
51
+
52
+ <Card>
53
+ <CardHeader>
54
+ <CardTitle className="text-base">
55
+ {t("settings.workspaceTitle")}
56
+ </CardTitle>
57
+ <CardDescription>
58
+ {t("settings.workspaceDescription")}
59
+ </CardDescription>
60
+ </CardHeader>
61
+ <CardContent>
62
+ <Button variant="outline" asChild>
63
+ <Link to="/team">{t("settings.openTeamSettings")}</Link>
64
+ </Button>
65
+ </CardContent>
66
+ </Card>
67
+
68
+ <Card>
69
+ <CardHeader>
70
+ <CardTitle className="text-base">
71
+ {t("settings.agentTitle")}
72
+ </CardTitle>
73
+ <CardDescription>{t("settings.agentDescription")}</CardDescription>
74
+ </CardHeader>
75
+ <CardContent>
76
+ <Button variant="outline" onClick={() => openAgentSettings()}>
77
+ {t("settings.openAgentSettings")}
78
+ </Button>
79
+ </CardContent>
80
+ </Card>
81
+
82
+ <ChangelogSettingsCard markdown={changelog} />
83
+ </main>
84
+ );
85
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-06-24
4
+ ---
5
+
6
+ A new Settings page gives quick access to language, workspace, and agent preferences.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-06-24
4
+ ---
5
+
6
+ Added a language picker and localized app chrome for supported languages.
@@ -66,6 +66,11 @@ el.dataset.selectedId = selectedItem?.id || "";
66
66
 
67
67
  **Use configuration-driven rendering** — Extract visual decisions (colors, layouts, sizes) into JSON config files in `data/`. The agent can modify the config (Tier 1) instead of the component source (Tier 2).
68
68
 
69
+ **Keep localized copy in catalogs** — When editing visible UI copy, labels,
70
+ toasts, empty states, prompts, or formatting, read `internationalization` and
71
+ update `app/i18n/en-US.ts` plus existing locale catalogs instead of leaving new
72
+ inline strings in components.
73
+
69
74
  ## Don't
70
75
 
71
76
  - Don't modify `.env` files or files containing secrets
@@ -80,3 +85,4 @@ el.dataset.selectedId = selectedItem?.id || "";
80
85
  - **actions** — The agent can create or modify actions to add new capabilities
81
86
  - **delegate-to-agent** — Self-modification requests come through the agent chat
82
87
  - **real-time-sync** — Database writes trigger change events to update the UI
88
+ - **internationalization** — UI copy, language catalogs, locale switching, and RTL-safe edits
@@ -6,7 +6,11 @@ import {
6
6
  } from "@/components/ui/popover";
7
7
  import { IconPlus } from "@tabler/icons-react";
8
8
  import { cn } from "@/lib/utils";
9
- import { PromptComposer, useSendToAgentChat } from "@agent-native/core/client";
9
+ import {
10
+ PromptComposer,
11
+ useSendToAgentChat,
12
+ useT,
13
+ } from "@agent-native/core/client";
10
14
 
11
15
  type NewCompositionPopoverProps = {
12
16
  isNew: boolean;
@@ -23,6 +27,7 @@ export function NewCompositionPopover({
23
27
  const [isGenerating, setIsGenerating] = useState(false);
24
28
  const [submitError, setSubmitError] = useState<string | null>(null);
25
29
  const { send, codeRequiredDialog } = useSendToAgentChat();
30
+ const t = useT();
26
31
 
27
32
  // Auto-save after the agent finishes generating a new composition
28
33
  useEffect(() => {
@@ -58,7 +63,7 @@ export function NewCompositionPopover({
58
63
  const message =
59
64
  typeof detail?.message === "string"
60
65
  ? detail.message
61
- : "The agent run failed before the composition could be created.";
66
+ : t("newComposition.runFailed");
62
67
  sessionStorage.setItem("videos:new-composition-error", message);
63
68
  finish();
64
69
  };
@@ -69,7 +74,7 @@ export function NewCompositionPopover({
69
74
  window.removeEventListener("agentNative.chatRunning", handleChatRunning);
70
75
  window.removeEventListener("agent-chat:run-error", handleRunError);
71
76
  };
72
- }, [isGenerating, onGeneratingChange]);
77
+ }, [isGenerating, onGeneratingChange, t]);
73
78
 
74
79
  async function fileToDataUrl(file: File): Promise<string> {
75
80
  return new Promise((resolve, reject) => {
@@ -105,7 +110,7 @@ export function NewCompositionPopover({
105
110
  }
106
111
  } catch (error) {
107
112
  const message =
108
- error instanceof Error ? error.message : "Could not read attachment.";
113
+ error instanceof Error ? error.message : t("newComposition.readFailed");
109
114
  setSubmitError(message);
110
115
  setIsGenerating(false);
111
116
  onGeneratingChange?.(false);
@@ -120,7 +125,7 @@ export function NewCompositionPopover({
120
125
  newTab: true,
121
126
  });
122
127
  if (result === null) {
123
- setSubmitError("Could not start the composition request.");
128
+ setSubmitError(t("newComposition.startFailed"));
124
129
  setIsGenerating(false);
125
130
  onGeneratingChange?.(false);
126
131
  return;
@@ -152,7 +157,7 @@ export function NewCompositionPopover({
152
157
  )}
153
158
  >
154
159
  <IconPlus size={14} />
155
- New Composition
160
+ {t("newComposition.button")}
156
161
  </button>
157
162
  </PopoverTrigger>
158
163
  <PopoverContent
@@ -163,16 +168,16 @@ export function NewCompositionPopover({
163
168
  >
164
169
  <div className="mb-2 px-1">
165
170
  <h3 className="text-sm font-semibold text-foreground">
166
- New composition
171
+ {t("newComposition.title")}
167
172
  </h3>
168
173
  <p className="mt-1 text-xs text-muted-foreground">
169
- Describe the video you want to create
174
+ {t("newComposition.description")}
170
175
  </p>
171
176
  </div>
172
177
  <PromptComposer
173
178
  autoFocus
174
179
  attachmentsEnabled
175
- placeholder="Describe the video you want to create..."
180
+ placeholder={t("newComposition.placeholder")}
176
181
  draftScope="videos:new-composition"
177
182
  onSubmit={handleSubmit}
178
183
  />
@@ -31,7 +31,11 @@ import { useTimeline } from "@/contexts/TimelineContext";
31
31
  import { usePlayback } from "@/contexts/PlaybackContext";
32
32
  import { useFolders } from "@/hooks/use-folders";
33
33
  import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
34
- import { DevDatabaseLink, FeedbackButton } from "@agent-native/core/client";
34
+ import {
35
+ DevDatabaseLink,
36
+ FeedbackButton,
37
+ useT,
38
+ } from "@agent-native/core/client";
35
39
  import { OrgSwitcher } from "@agent-native/core/client/org";
36
40
  import {
37
41
  Tooltip,
@@ -75,6 +79,7 @@ export function Sidebar({
75
79
  } = useTimeline();
76
80
 
77
81
  const { currentFrame, fps, onSeek } = usePlayback();
82
+ const t = useT();
78
83
 
79
84
  const {
80
85
  folders,
@@ -228,7 +233,7 @@ export function Sidebar({
228
233
  const navItems = [
229
234
  {
230
235
  icon: IconVideo,
231
- label: "Animations",
236
+ labelKey: "navigation.animations",
232
237
  href: "/",
233
238
  active:
234
239
  !location.pathname.startsWith("/components") &&
@@ -237,19 +242,19 @@ export function Sidebar({
237
242
  },
238
243
  {
239
244
  icon: IconComponents,
240
- label: "Components",
245
+ labelKey: "navigation.components",
241
246
  href: "/components",
242
247
  active: location.pathname.startsWith("/components"),
243
248
  },
244
249
  {
245
250
  icon: IconPalette,
246
- label: "Design Systems",
251
+ labelKey: "navigation.designSystems",
247
252
  href: "/design-systems",
248
253
  active: location.pathname.startsWith("/design-systems"),
249
254
  },
250
255
  {
251
256
  icon: IconUsers,
252
- label: "Team",
257
+ labelKey: "navigation.team",
253
258
  href: "/team",
254
259
  active: location.pathname === "/team",
255
260
  },
@@ -268,7 +273,9 @@ export function Sidebar({
268
273
  <div className="w-64 lg:w-72 h-full flex flex-col">
269
274
  {/* App name */}
270
275
  <div className="flex h-10 items-center px-3 border-b border-border shrink-0">
271
- <span className="text-xs font-semibold tracking-tight">Videos</span>
276
+ <span className="text-xs font-semibold tracking-tight">
277
+ {t("navigation.brand")}
278
+ </span>
272
279
  </div>
273
280
 
274
281
  {/* Navigation */}
@@ -287,7 +294,7 @@ export function Sidebar({
287
294
  )}
288
295
  >
289
296
  <Icon className="h-3.5 w-3.5 shrink-0" />
290
- {item.label}
297
+ {t(item.labelKey)}
291
298
  </Link>
292
299
  );
293
300
  })}
@@ -303,13 +310,13 @@ export function Sidebar({
303
310
  value="compositions"
304
311
  className="flex-1 px-3 py-1.5 text-xs font-medium rounded-md text-muted-foreground data-[state=active]:bg-secondary data-[state=active]:text-foreground data-[state=active]:shadow-none"
305
312
  >
306
- Compositions
313
+ {t("studio.compositions")}
307
314
  </TabsTrigger>
308
315
  <TabsTrigger
309
316
  value="properties"
310
317
  className="flex-1 px-3 py-1.5 text-xs font-medium rounded-md text-muted-foreground data-[state=active]:bg-secondary data-[state=active]:text-foreground data-[state=active]:shadow-none"
311
318
  >
312
- Properties
319
+ {t("studio.properties")}
313
320
  {selectedTrackId && (
314
321
  <span className="ml-1 w-1.5 h-1.5 rounded-full bg-primary animate-pulse" />
315
322
  )}
@@ -8,6 +8,7 @@ import {
8
8
  AgentToggleButton,
9
9
  NotificationsBell,
10
10
  ShareButton,
11
+ useT,
11
12
  } from "@agent-native/core/client";
12
13
  import { useDbStatus } from "@/hooks/use-db-status";
13
14
  import { CloudUpgrade } from "@/components/CloudUpgrade";
@@ -33,13 +34,16 @@ export function StudioHeader({
33
34
  }: StudioHeaderProps) {
34
35
  const { isLocal } = useDbStatus();
35
36
  const [shareOpen, setShareOpen] = useState(false);
37
+ const t = useT();
36
38
 
37
39
  return (
38
40
  <header className="flex items-center justify-between px-2 sm:px-4 h-12 border-b border-border bg-card/80 backdrop-blur-xl z-10 flex-shrink-0">
39
41
  <div className="flex items-center gap-1.5 sm:gap-3 min-w-0">
40
42
  <button
41
43
  onClick={onToggleSidebar}
42
- aria-label={sidebarOpen ? "Close sidebar" : "Open sidebar"}
44
+ aria-label={
45
+ sidebarOpen ? t("studio.closeSidebar") : t("studio.openSidebar")
46
+ }
43
47
  className="p-2 sm:p-1.5 rounded-md text-muted-foreground hover:text-foreground hover:bg-secondary cursor-pointer"
44
48
  >
45
49
  {sidebarOpen ? (
@@ -52,7 +56,7 @@ export function StudioHeader({
52
56
  <div className="w-px h-5 bg-border hidden sm:block" />
53
57
 
54
58
  <h1 className="text-sm font-semibold tracking-tight hidden sm:block">
55
- Videos
59
+ {t("navigation.brand")}
56
60
  </h1>
57
61
  </div>
58
62
 
@@ -61,11 +65,11 @@ export function StudioHeader({
61
65
  <Popover open={shareOpen} onOpenChange={setShareOpen}>
62
66
  <PopoverTrigger asChild>
63
67
  <button
64
- aria-label="Share"
68
+ aria-label={t("studio.share")}
65
69
  className="p-2 sm:px-3 sm:py-1.5 text-xs font-medium rounded-md text-muted-foreground hover:text-foreground hover:bg-secondary/50 flex items-center gap-1.5 cursor-pointer"
66
70
  >
67
71
  <IconShare2 className="w-4 h-4 sm:w-3.5 sm:h-3.5" />
68
- <span className="hidden sm:inline">Share</span>
72
+ <span className="hidden sm:inline">{t("studio.share")}</span>
69
73
  </button>
70
74
  </PopoverTrigger>
71
75
  <PopoverContent
@@ -74,8 +78,8 @@ export function StudioHeader({
74
78
  className="w-auto p-0 border-none bg-transparent shadow-none"
75
79
  >
76
80
  <CloudUpgrade
77
- title="Share Videos"
78
- description="To share or export videos, connect a cloud database so your compositions can be accessed from anywhere."
81
+ title={t("studio.shareVideos")}
82
+ description={t("studio.shareVideosDescription")}
79
83
  onClose={() => setShareOpen(false)}
80
84
  />
81
85
  </PopoverContent>
@@ -88,12 +92,12 @@ export function StudioHeader({
88
92
  />
89
93
  ) : (
90
94
  <button
91
- aria-label="Share"
95
+ aria-label={t("studio.share")}
92
96
  disabled
93
97
  className="p-2 sm:px-3 sm:py-1.5 text-xs font-medium rounded-md text-muted-foreground/50 flex items-center gap-1.5 cursor-not-allowed"
94
98
  >
95
99
  <IconShare2 className="w-4 h-4 sm:w-3.5 sm:h-3.5" />
96
- <span className="hidden sm:inline">Share</span>
100
+ <span className="hidden sm:inline">{t("studio.share")}</span>
97
101
  </button>
98
102
  )}
99
103
  <NotificationsBell />