@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,114 @@
1
+ ---
2
+ title: "国際化"
3
+ description: "共有 locale カタログ、言語ピッカー、ブラウザー言語フォールバック、locale 対応 docs コンテンツで Agent Native アプリをローカライズします。"
4
+ ---
5
+
6
+ # 国際化
7
+
8
+ Agent Native アプリは共有ランタイム `@agent-native/core/client/i18n` を通じて、フレームワークとテンプレートの UI をローカライズできます。フレームワークはユーザーの言語選択を SQL settings に保存し、それを actions として公開し、アプリがまだ翻訳していない文字列は English にフォールバックします。
9
+
10
+ ## ランタイム {#runtime}
11
+
12
+ `AppProviders` から provider を使います。
13
+
14
+ ```tsx
15
+ import { AppProviders, getLocaleInitScript } from "@agent-native/core/client";
16
+ import { i18nCatalog } from "./i18n";
17
+
18
+ const LOCALE_INIT_SCRIPT = getLocaleInitScript();
19
+
20
+ <script
21
+ data-agent-native-locale-init
22
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
23
+ />;
24
+
25
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
26
+ <Outlet />
27
+ </AppProviders>;
28
+ ```
29
+
30
+ `getLocaleInitScript()` は React の hydration 前に初期 `lang`、`dir`、`window.__AGENT_NATIVE_LOCALE__` を設定します。公開 SSR ルートでは `@agent-native/core/server` の `resolveLocaleFromRequest()` を呼び、解決された locale/catalog をこの script に渡すことで hydration mismatch を避けられます。
31
+
32
+ ## カタログ {#catalogs}
33
+
34
+ ローカライズされた各テンプレートは `app/i18n/` にカタログを置きます。
35
+
36
+ ```ts
37
+ // app/i18n/index.ts
38
+ import enUS from "./en-US";
39
+ import type { AgentNativeI18nCatalog } from "@agent-native/core/client";
40
+
41
+ export const i18nCatalog = {
42
+ sourceLocale: "en-US",
43
+ messages: enUS,
44
+ loadMessages: async (locale) => {
45
+ switch (locale) {
46
+ case "zh-CN":
47
+ return (await import("./zh-CN")).default;
48
+ default:
49
+ return null;
50
+ }
51
+ },
52
+ } satisfies AgentNativeI18nCatalog;
53
+ ```
54
+
55
+ `en-US` は必ずバンドルします。English 以外のカタログは動的 import にして、ユーザーが現在の locale だけをダウンロードするようにします。対応する locale codes は `en-US`、`zh-CN`、`es-ES`、`fr-FR`、`de-DE`、`ja-JP`、`ko-KR`、`pt-BR`、`hi-IN`、`ar-SA` です。
56
+
57
+ ## UI {#ui}
58
+
59
+ インターフェイス文字列には `useT()` を使い、アプリの `/settings` ページに `<LanguagePicker />` を置きます。サイドバーを持つアプリは、アプリのサイドバーに **Settings** を表示してください。ヘッダーの言語アイコンはショートカットです。
60
+
61
+ ```tsx
62
+ import {
63
+ LanguagePicker,
64
+ openAgentSettings,
65
+ useT,
66
+ } from "@agent-native/core/client";
67
+
68
+ function SettingsPage() {
69
+ const t = useT();
70
+ return (
71
+ <>
72
+ <h2>{t("settings.languageTitle")}</h2>
73
+ <LanguagePicker label={t("settings.languageLabel")} />
74
+
75
+ <h2>{t("settings.agentTitle")}</h2>
76
+ <p>{t("settings.agentDescription")}</p>
77
+ <button type="button" onClick={() => openAgentSettings()}>
78
+ {t("settings.openAgentSettings")}
79
+ </button>
80
+ </>
81
+ );
82
+ }
83
+ ```
84
+
85
+ 「Agent settings」コントロールは、モデル、API キー、自動化、音声などの framework-level controls のために、右側の agent sidebar の Settings tab を開くべきです。その設定がアプリの中心的な体験なら、アプリ自身の settings page に重要な framework 設定を重複表示してもかまいません。ただし source of truth は sidebar settings tab です。
86
+
87
+ 日付、数値、相対時間、リストには `useFormatters()` を使います。locale に依存する日付や数値の整形を翻訳文字列の中に入れないでください。
88
+
89
+ ## Docs サイトのコンテンツ {#docs-site-content}
90
+
91
+ 公開 docs ページは同じ core provider を使いますが、`persistPreference={false}` にして匿名 docs トラフィックが SQL settings actions ではなく localStorage とブラウザー言語を使うようにします。English のソースは `packages/core/docs/content/*.md` に残ります。ローカライズされたページ override は `packages/core/docs/content/locales/<locale>/<slug>.md` に置きます。
92
+
93
+ アプリのカタログと同じ BCP-47 locale codes を使ってください。English ソースと同じ slug を維持し、翻訳された見出しでは `{#anchor}` で安定したアンカーを保ち、routes、action names、protocol fields、env vars、provider names は翻訳しません。ある locale に翻訳 Markdown がないページは English にフォールバックしつつ、ナビゲーションと chrome はローカライズされます。
94
+
95
+ ## Actions と永続化 {#actions-and-persistence}
96
+
97
+ すべてのアプリは以下を継承します。
98
+
99
+ - `get-localization-preference` — 現在のユーザーの `{ locale }` を読む
100
+ - `set-localization-preference` — `"system"` または対応 locale を設定する
101
+
102
+ 永続値はユーザー単位の SQL settings の `localization` に保存されます。`localStorage` は pre-hydration と匿名フォールバックにだけ使います。アクティブな locale は application state に環境コンテキストとして反映されるため、agents は現在の UI 言語を確認できます。
103
+
104
+ ## Guard {#guard}
105
+
106
+ 実行:
107
+
108
+ ```bash
109
+ pnpm guard:i18n-catalogs
110
+ ```
111
+
112
+ guard は対応 locale ファイル名、key parity、placeholder parity、stale keys、`Intl.PluralRules` による CLDR plural categories を検証します。構造を検証するもので、翻訳品質は検証しません。目立つ文字列は人によるレビューが必要です。
113
+
114
+ action names、routes、enum values、app-state keys、database values、protocol fields、env var names、provider names などの安定した識別子は翻訳しないでください。
@@ -0,0 +1,102 @@
1
+ ---
2
+ title: "국제화"
3
+ description: "공유 locale 카탈로그, 언어 선택기, 브라우저 언어 fallback, locale-aware docs 콘텐츠로 Agent Native 앱을 현지화합니다."
4
+ ---
5
+
6
+ # 국제화
7
+
8
+ Agent Native 앱은 공유 `@agent-native/core/client/i18n` 런타임으로 framework 및 template UI를 현지화할 수 있습니다. framework는 사용자의 언어 선택을 SQL settings에 저장하고 actions로 노출하며, 앱에 번역되지 않은 문자열이 있으면 English로 fallback합니다.
9
+
10
+ ## 런타임 {#runtime}
11
+
12
+ `AppProviders`를 통해 provider를 사용합니다.
13
+
14
+ ```tsx
15
+ import { AppProviders, getLocaleInitScript } from "@agent-native/core/client";
16
+ import { i18nCatalog } from "./i18n";
17
+
18
+ const LOCALE_INIT_SCRIPT = getLocaleInitScript();
19
+
20
+ <script
21
+ data-agent-native-locale-init
22
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
23
+ />;
24
+
25
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
26
+ <Outlet />
27
+ </AppProviders>;
28
+ ```
29
+
30
+ `getLocaleInitScript()`는 React hydration 전에 초기 `lang`, `dir`, `window.__AGENT_NATIVE_LOCALE__`를 설정합니다. 공개 SSR route는 `@agent-native/core/server`에서 `resolveLocaleFromRequest()`를 호출하고 해결된 locale/catalog를 script에 전달해 hydration mismatch를 피할 수 있습니다.
31
+
32
+ ## 카탈로그 {#catalogs}
33
+
34
+ 현지화된 각 template은 `app/i18n/` 아래에 카탈로그를 둡니다.
35
+
36
+ ```ts
37
+ // app/i18n/index.ts
38
+ import enUS from "./en-US";
39
+ import type { AgentNativeI18nCatalog } from "@agent-native/core/client";
40
+
41
+ export const i18nCatalog = {
42
+ sourceLocale: "en-US",
43
+ messages: enUS,
44
+ loadMessages: async (locale) => {
45
+ switch (locale) {
46
+ case "zh-CN":
47
+ return (await import("./zh-CN")).default;
48
+ default:
49
+ return null;
50
+ }
51
+ },
52
+ } satisfies AgentNativeI18nCatalog;
53
+ ```
54
+
55
+ 항상 `en-US`를 bundle에 포함하세요. English가 아닌 카탈로그는 dynamic import로 불러와 사용자가 활성 locale만 다운로드하게 합니다. 지원 locale codes는 `en-US`, `zh-CN`, `es-ES`, `fr-FR`, `de-DE`, `ja-JP`, `ko-KR`, `pt-BR`, `hi-IN`, `ar-SA`입니다.
56
+
57
+ ## UI {#ui}
58
+
59
+ 인터페이스 문자열에는 `useT()`를 사용하고 settings에는 `<LanguagePicker />`를 둡니다.
60
+
61
+ ```tsx
62
+ import { LanguagePicker, useT } from "@agent-native/core/client";
63
+
64
+ function SettingsLanguageCard() {
65
+ const t = useT();
66
+ return (
67
+ <>
68
+ <h2>{t("settings.languageTitle")}</h2>
69
+ <LanguagePicker label={t("settings.languageLabel")} />
70
+ </>
71
+ );
72
+ }
73
+ ```
74
+
75
+ 날짜, 숫자, 상대 시간, 목록에는 `useFormatters()`를 사용하세요. locale에 민감한 날짜나 숫자 formatting을 번역 문자열 안에 넣지 마세요.
76
+
77
+ ## Docs 사이트 콘텐츠 {#docs-site-content}
78
+
79
+ 공개 docs 페이지는 같은 core provider를 사용하지만 `persistPreference={false}`로 설정해 익명 docs 트래픽이 SQL settings actions가 아니라 localStorage와 브라우저 언어를 사용하게 합니다. English 원본은 `packages/core/docs/content/*.md`에 남습니다. 현지화된 페이지 override는 `packages/core/docs/content/locales/<locale>/<slug>.md`에 둡니다.
80
+
81
+ 앱 카탈로그와 같은 BCP-47 locale codes를 사용하세요. English 원본과 같은 slug를 유지하고, 번역된 heading에는 `{#anchor}`로 안정적인 anchor를 보존하며, routes, action names, protocol fields, env vars, provider names는 번역하지 마세요. 특정 locale에 번역 Markdown이 없으면 그 페이지는 English로 fallback하고 navigation과 chrome은 계속 현지화됩니다.
82
+
83
+ ## Actions 및 지속성 {#actions-and-persistence}
84
+
85
+ 모든 앱은 다음을 상속합니다.
86
+
87
+ - `get-localization-preference` — 현재 사용자의 `{ locale }` 읽기
88
+ - `set-localization-preference` — `"system"` 또는 지원 locale 설정
89
+
90
+ 지속 값은 user-scoped SQL settings의 `localization`에 저장됩니다. `localStorage`는 pre-hydration과 익명 fallback에만 사용됩니다. 활성 locale은 ambient context로 application state에 반영되어 agents가 현재 UI 언어를 볼 수 있습니다.
91
+
92
+ ## Guard {#guard}
93
+
94
+ 실행:
95
+
96
+ ```bash
97
+ pnpm guard:i18n-catalogs
98
+ ```
99
+
100
+ guard는 지원 locale filename, key parity, placeholder parity, stale keys, 그리고 `Intl.PluralRules`를 통한 CLDR plural categories를 검증합니다. 구조만 확인하며 번역 품질은 확인하지 않습니다. 노출도가 높은 문자열은 사람의 검토가 필요합니다.
101
+
102
+ action names, routes, enum values, app-state keys, database values, protocol fields, env var names, provider names 같은 안정적인 식별자는 번역하지 마세요.
@@ -0,0 +1,102 @@
1
+ ---
2
+ title: "Internacionalização"
3
+ description: "Localize apps Agent Native com catálogos compartilhados, seletor de idioma, fallback do navegador e conteúdo de docs por locale."
4
+ ---
5
+
6
+ # Internacionalização
7
+
8
+ Apps Agent Native podem localizar a UI do framework e dos templates com o runtime compartilhado `@agent-native/core/client/i18n`. O framework armazena a escolha de idioma do usuário em settings SQL, expõe essa preferência como actions e volta para English quando uma app ainda não traduziu uma string.
9
+
10
+ ## Runtime {#runtime}
11
+
12
+ Use o provider por meio de `AppProviders`:
13
+
14
+ ```tsx
15
+ import { AppProviders, getLocaleInitScript } from "@agent-native/core/client";
16
+ import { i18nCatalog } from "./i18n";
17
+
18
+ const LOCALE_INIT_SCRIPT = getLocaleInitScript();
19
+
20
+ <script
21
+ data-agent-native-locale-init
22
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
23
+ />;
24
+
25
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
26
+ <Outlet />
27
+ </AppProviders>;
28
+ ```
29
+
30
+ `getLocaleInitScript()` define o `lang`, `dir` e `window.__AGENT_NATIVE_LOCALE__` iniciais antes da hydration do React. Rotas SSR públicas podem chamar `resolveLocaleFromRequest()` de `@agent-native/core/server` e passar o locale/catalog resolvido para o script, evitando divergências de hydration.
31
+
32
+ ## Catálogos {#catalogs}
33
+
34
+ Cada template localizado mantém catálogos em `app/i18n/`:
35
+
36
+ ```ts
37
+ // app/i18n/index.ts
38
+ import enUS from "./en-US";
39
+ import type { AgentNativeI18nCatalog } from "@agent-native/core/client";
40
+
41
+ export const i18nCatalog = {
42
+ sourceLocale: "en-US",
43
+ messages: enUS,
44
+ loadMessages: async (locale) => {
45
+ switch (locale) {
46
+ case "zh-CN":
47
+ return (await import("./zh-CN")).default;
48
+ default:
49
+ return null;
50
+ }
51
+ },
52
+ } satisfies AgentNativeI18nCatalog;
53
+ ```
54
+
55
+ Sempre inclua `en-US` no bundle. Importe dinamicamente catálogos que não sejam English para que usuários baixem apenas o locale ativo. Os locale codes suportados são `en-US`, `zh-CN`, `es-ES`, `fr-FR`, `de-DE`, `ja-JP`, `ko-KR`, `pt-BR`, `hi-IN` e `ar-SA`.
56
+
57
+ ## UI {#ui}
58
+
59
+ Use `useT()` para textos de interface e `<LanguagePicker />` em settings:
60
+
61
+ ```tsx
62
+ import { LanguagePicker, useT } from "@agent-native/core/client";
63
+
64
+ function SettingsLanguageCard() {
65
+ const t = useT();
66
+ return (
67
+ <>
68
+ <h2>{t("settings.languageTitle")}</h2>
69
+ <LanguagePicker label={t("settings.languageLabel")} />
70
+ </>
71
+ );
72
+ }
73
+ ```
74
+
75
+ Use `useFormatters()` para datas, números, tempo relativo e listas. Não coloque formatação sensível a locale dentro de strings traduzidas.
76
+
77
+ ## Conteúdo do site de docs {#docs-site-content}
78
+
79
+ Páginas públicas de docs usam o mesmo core provider, mas com `persistPreference={false}` para que tráfego anônimo use localStorage e o idioma do navegador em vez de actions de settings SQL. A fonte English continua em `packages/core/docs/content/*.md`. Overrides localizados ficam em `packages/core/docs/content/locales/<locale>/<slug>.md`.
80
+
81
+ Use os mesmos BCP-47 locale codes dos catálogos de app. Mantenha o mesmo slug da fonte English, preserve anchors estáveis com `{#anchor}` em headings traduzidos e não traduza routes, action names, protocol fields, env vars ou provider names. Se um locale não tiver Markdown traduzido para uma página, o site cai para English nessa página enquanto continua localizando navegação e chrome.
82
+
83
+ ## Actions e persistência {#actions-and-persistence}
84
+
85
+ Toda app herda:
86
+
87
+ - `get-localization-preference` — lê o `{ locale }` do usuário atual
88
+ - `set-localization-preference` — define `"system"` ou um locale suportado
89
+
90
+ O valor durável fica em settings SQL com escopo de usuário sob `localization`. `localStorage` só é usado para pre-hydration e fallback anônimo. O locale ativo é espelhado no application state como contexto ambiente para que agents vejam o idioma atual da interface.
91
+
92
+ ## Guard {#guard}
93
+
94
+ Rode:
95
+
96
+ ```bash
97
+ pnpm guard:i18n-catalogs
98
+ ```
99
+
100
+ O guard verifica nomes de arquivos locale suportados, key parity, placeholder parity, stale keys e categorias plurais CLDR via `Intl.PluralRules`. Ele verifica estrutura, não qualidade de tradução; strings de alta visibilidade ainda precisam de revisão humana.
101
+
102
+ Não traduza identificadores estáveis como action names, routes, enum values, app-state keys, database values, protocol fields, env var names ou provider names.
@@ -0,0 +1,102 @@
1
+ ---
2
+ title: "国际化"
3
+ description: "使用共享语言目录、语言选择器、浏览器语言回退和按语言区分的文档内容来本地化 Agent Native 应用。"
4
+ ---
5
+
6
+ # 国际化
7
+
8
+ Agent Native 应用可以通过共享的 `@agent-native/core/client/i18n` 运行时来本地化框架和模板 UI。框架把用户的语言选择存储在 SQL 设置中,将它暴露为 actions,并在应用尚未翻译某个字符串时回退到 English。
9
+
10
+ ## 运行时 {#runtime}
11
+
12
+ 通过 `AppProviders` 使用 provider:
13
+
14
+ ```tsx
15
+ import { AppProviders, getLocaleInitScript } from "@agent-native/core/client";
16
+ import { i18nCatalog } from "./i18n";
17
+
18
+ const LOCALE_INIT_SCRIPT = getLocaleInitScript();
19
+
20
+ <script
21
+ data-agent-native-locale-init
22
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
23
+ />;
24
+
25
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
26
+ <Outlet />
27
+ </AppProviders>;
28
+ ```
29
+
30
+ `getLocaleInitScript()` 会在 React hydration 之前设置初始的 `lang`、`dir` 和 `window.__AGENT_NATIVE_LOCALE__`。公共 SSR 路由可以从 `@agent-native/core/server` 调用 `resolveLocaleFromRequest()`,并把解析出的 locale/catalog 传入脚本,避免 hydration 不一致。
31
+
32
+ ## 目录 {#catalogs}
33
+
34
+ 每个本地化模板都把目录放在 `app/i18n/` 下:
35
+
36
+ ```ts
37
+ // app/i18n/index.ts
38
+ import enUS from "./en-US";
39
+ import type { AgentNativeI18nCatalog } from "@agent-native/core/client";
40
+
41
+ export const i18nCatalog = {
42
+ sourceLocale: "en-US",
43
+ messages: enUS,
44
+ loadMessages: async (locale) => {
45
+ switch (locale) {
46
+ case "zh-CN":
47
+ return (await import("./zh-CN")).default;
48
+ default:
49
+ return null;
50
+ }
51
+ },
52
+ } satisfies AgentNativeI18nCatalog;
53
+ ```
54
+
55
+ 始终打包 `en-US`。非 English 目录使用动态导入,这样用户只下载当前语言。支持的 locale codes 是 `en-US`、`zh-CN`、`es-ES`、`fr-FR`、`de-DE`、`ja-JP`、`ko-KR`、`pt-BR`、`hi-IN` 和 `ar-SA`。
56
+
57
+ ## UI {#ui}
58
+
59
+ 界面字符串使用 `useT()`,设置页使用 `<LanguagePicker />`:
60
+
61
+ ```tsx
62
+ import { LanguagePicker, useT } from "@agent-native/core/client";
63
+
64
+ function SettingsLanguageCard() {
65
+ const t = useT();
66
+ return (
67
+ <>
68
+ <h2>{t("settings.languageTitle")}</h2>
69
+ <LanguagePicker label={t("settings.languageLabel")} />
70
+ </>
71
+ );
72
+ }
73
+ ```
74
+
75
+ 日期、数字、相对时间和列表使用 `useFormatters()`。不要把依赖 locale 的日期或数字格式直接放进翻译字符串。
76
+
77
+ ## 文档站点内容 {#docs-site-content}
78
+
79
+ 公共文档页使用同一个 core provider,但设置 `persistPreference={false}`,因此匿名文档流量使用 localStorage 和浏览器语言,而不是 SQL 设置 actions。English 源文件仍在 `packages/core/docs/content/*.md`。本地化页面覆盖文件放在 `packages/core/docs/content/locales/<locale>/<slug>.md`。
80
+
81
+ 使用与应用目录相同的 BCP-47 locale codes。文件 slug 要与 English 源保持一致,翻译后的标题要用 `{#anchor}` 保留稳定锚点,并且不要翻译 routes、action names、protocol fields、env vars 或 provider names。如果某个 locale 没有某页 Markdown,文档站点会对该页回退到 English,同时继续本地化导航和 chrome。
82
+
83
+ ## Actions 与持久化 {#actions-and-persistence}
84
+
85
+ 每个应用都会继承:
86
+
87
+ - `get-localization-preference` — 读取当前用户的 `{ locale }`
88
+ - `set-localization-preference` — 设置 `"system"` 或支持的 locale
89
+
90
+ 持久值存储在用户作用域 SQL 设置的 `localization` 下。`localStorage` 只用于 hydration 前和匿名回退。当前 locale 会同步到 application state,作为环境上下文,让 agents 能看到当前界面语言。
91
+
92
+ ## Guard {#guard}
93
+
94
+ 运行:
95
+
96
+ ```bash
97
+ pnpm guard:i18n-catalogs
98
+ ```
99
+
100
+ guard 会通过 `Intl.PluralRules` 验证支持的 locale 文件名、key parity、placeholder parity、stale keys 和 CLDR plural categories。它检查结构,不检查翻译质量;高可见度字符串仍需要人工审校。
101
+
102
+ 不要翻译稳定标识符,例如 action names、routes、enum values、app-state keys、database values、protocol fields、env var names 或 provider names。
@@ -24,24 +24,25 @@ Every skill's frontmatter `name` and `description` are always injected into the
24
24
 
25
25
  These are the skills bundled with the **default template**. The exact set available in any given app depends on the template you scaffolded from — check that template's `.agents/skills/` directory for what it actually ships.
26
26
 
27
- | Skill | When to use |
28
- | --------------------- | ------------------------------------------------------- |
29
- | `storing-data` | Adding data models, reading/writing config or state |
30
- | `real-time-sync` | Wiring polling sync, debugging UI not updating |
31
- | `delegate-to-agent` | Delegating AI work from UI or actions to the agent |
32
- | `actions` | Creating or running agent actions |
33
- | `self-modifying-code` | Editing app source, components, or styles |
34
- | `create-skill` | Adding new skills for the agent |
35
- | `capture-learnings` | Recording corrections and patterns |
36
- | `frontend-design` | Building or styling any web UI, components, or pages |
37
- | `adding-a-feature` | The four-area checklist: UI, actions, skills, app-state |
38
- | `shadcn-ui` | Using shadcn/ui primitives and components |
39
- | `security` | Auth, access control, and secret handling |
40
- | `real-time-collab` | Multi-user collaborative editing |
41
- | `agent-engines` | Swapping or configuring the underlying agent engine |
42
- | `notifications` | In-app and push notification patterns |
43
- | `progress` | Tracking and surfacing background task progress |
44
- | `inline-embeds` | Embedding apps or iframes inside the agent chat |
27
+ | Skill | When to use |
28
+ | ---------------------- | ------------------------------------------------------------------ |
29
+ | `storing-data` | Adding data models, reading/writing config or state |
30
+ | `real-time-sync` | Wiring polling sync, debugging UI not updating |
31
+ | `delegate-to-agent` | Delegating AI work from UI or actions to the agent |
32
+ | `actions` | Creating or running agent actions |
33
+ | `self-modifying-code` | Editing app source, components, or styles |
34
+ | `create-skill` | Adding new skills for the agent |
35
+ | `capture-learnings` | Recording corrections and patterns |
36
+ | `frontend-design` | Building or styling any web UI, components, or pages |
37
+ | `adding-a-feature` | The four-area checklist: UI, actions, skills, app-state |
38
+ | `internationalization` | Updating localized UI copy, language catalogs, and RTL-safe styles |
39
+ | `shadcn-ui` | Using shadcn/ui primitives and components |
40
+ | `security` | Auth, access control, and secret handling |
41
+ | `real-time-collab` | Multi-user collaborative editing |
42
+ | `agent-engines` | Swapping or configuring the underlying agent engine |
43
+ | `notifications` | In-app and push notification patterns |
44
+ | `progress` | Tracking and surfacing background task progress |
45
+ | `inline-embeds` | Embedding apps or iframes inside the agent chat |
45
46
 
46
47
  `context-awareness` and `a2a-protocol` are framework-level skills available in the `.agents/skills/` directory at the repo root — see each template's own `.agents/skills/` for what it inherits.
47
48
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.75.5",
3
+ "version": "0.76.0",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -69,6 +69,7 @@
69
69
  "./client/route-state": "./dist/client/route-state.js",
70
70
  "./client/observability": "./dist/client/observability/index.js",
71
71
  "./client/onboarding": "./dist/client/onboarding/index.js",
72
+ "./client/i18n": "./dist/client/i18n.js",
72
73
  "./client/settings/useBuilderStatus": "./dist/client/settings/useBuilderStatus.js",
73
74
  "./embedding": "./dist/embedding/index.js",
74
75
  "./embedding/agent": "./dist/embedding/agent.js",
@@ -80,6 +81,9 @@
80
81
  "./scripts": "./dist/scripts/index.js",
81
82
  "./application-state": "./dist/application-state/index.js",
82
83
  "./settings": "./dist/settings/index.js",
84
+ "./localization": "./dist/localization/index.js",
85
+ "./localization/actions/get-localization-preference": "./dist/localization/actions/get-localization-preference.js",
86
+ "./localization/actions/set-localization-preference": "./dist/localization/actions/set-localization-preference.js",
83
87
  "./credentials": "./dist/credentials/index.js",
84
88
  "./event-bus": "./dist/event-bus/index.js",
85
89
  "./fetch-tool": "./dist/extensions/fetch-tool.js",
@@ -235,6 +239,7 @@
235
239
  "fzstd": "^0.1.1",
236
240
  "h3": "^2.0.1-rc.20",
237
241
  "highlight.js": "^11.11.1",
242
+ "i18next": "26.3.1",
238
243
  "isbot": "^5",
239
244
  "jiti": "^2.6.1",
240
245
  "jose": "^6.2.2",
@@ -248,6 +253,7 @@
248
253
  "p-limit": "^7.3.0",
249
254
  "pako": "^2.1.0",
250
255
  "prettier": "^3.8.3",
256
+ "react-i18next": "17.0.8",
251
257
  "react-markdown": "^10.1.0",
252
258
  "recharts": "^3.8.1",
253
259
  "remark-gfm": "^4.0.1",
@@ -86,6 +86,10 @@ Instruction examples may name secret keys like `SLACK_WEBHOOK`, but must use
86
86
  placeholders such as `${keys.SLACK_WEBHOOK}` or `<SLACK_WEBHOOK>`. Do not paste
87
87
  real keys, internal data, or customer data into instructions as examples.
88
88
 
89
+ If the feature adds or changes visible UI copy, prompts, toasts, labels, empty
90
+ states, or formatting, read `internationalization` and update the app's i18n
91
+ catalogs in the same change.
92
+
89
93
  For app-backed skills, declare skill visibility in the app-skill manifest:
90
94
 
91
95
  - `internal` — only the app's own agents should use it.
@@ -177,3 +181,4 @@ TL;DR: spread `ownableColumns()` into the resource table, pair it with `createSh
177
181
  - **create-skill** — How to create skills for new patterns (area 3 in detail)
178
182
  - **storing-data** — Where to store the feature's data
179
183
  - **real-time-sync** — How the UI stays in sync when the agent writes data
184
+ - **internationalization** — How to update localized UI copy and catalogs
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: internationalization
3
+ description: >-
4
+ How to add or edit localized UI copy in agent-native apps. Use when adding,
5
+ removing, or changing user-visible interface text, prompts, toasts, labels,
6
+ empty states, or date/number/list formatting.
7
+ scope: dev
8
+ metadata:
9
+ internal: true
10
+ ---
11
+
12
+ # Internationalization
13
+
14
+ ## Rule
15
+
16
+ Visible framework/template UI copy belongs in the app's i18n catalog, not
17
+ inline in components. When you add or edit UI text, update the English source
18
+ catalog first, update existing locale catalogs, and run the i18n guard.
19
+
20
+ ## Catalogs
21
+
22
+ Templates use `app/i18n/`:
23
+
24
+ - `en-US.ts` is the canonical source tree and fallback.
25
+ - Other locale files keep the same non-plural keys and the same placeholders.
26
+ - `index.ts` exports an `AgentNativeI18nCatalog` with English bundled and
27
+ non-English catalogs loaded by dynamic import.
28
+
29
+ Use BCP-47 filenames from the supported set: `en-US`, `zh-CN`, `es-ES`,
30
+ `fr-FR`, `de-DE`, `ja-JP`, `ko-KR`, `pt-BR`, `hi-IN`, `ar-SA`.
31
+
32
+ ## UI Pattern
33
+
34
+ - Wrap apps with `AppProviders i18n={{ catalog: i18nCatalog }}`.
35
+ - Read strings with `useT()` and keep keys stable.
36
+ - Sidebar apps should expose a `/settings` route in the app sidebar. Put
37
+ `<LanguagePicker />` in that settings page, usually in a Language or General
38
+ section, and keep the header language icon only as a quick-access shortcut.
39
+ - Settings pages should include an "Agent settings" row/card that calls
40
+ `openAgentSettings()` from `@agent-native/core/client` to open the right
41
+ agent sidebar's Settings tab. Localize the title, description, and button.
42
+ - Use `useFormatters()` for dates, numbers, relative time, and lists instead
43
+ of embedding formatted values in translation strings.
44
+ - Do not translate stable identifiers: action names, route names, enum values,
45
+ app-state keys, database values, protocol fields, env var names, or provider
46
+ names.
47
+
48
+ ## Plurals And Placeholders
49
+
50
+ Plural strings use i18next/CLDR suffixes. Do not force every locale to copy
51
+ English plural categories:
52
+
53
+ - English uses `_one` and `_other`.
54
+ - Chinese and Japanese usually use `_other`.
55
+ - Arabic uses `_zero`, `_one`, `_two`, `_few`, `_many`, and `_other`.
56
+
57
+ Keep interpolation placeholders identical across locales, such as
58
+ `{{count}}`, `{{name}}`, or ICU-style `{count}` arguments.
59
+
60
+ ## RTL
61
+
62
+ New UI should be RTL-safe. Prefer logical CSS utilities/properties such as
63
+ `ms-*`, `me-*`, `ps-*`, `pe-*`, `start-*`, `end-*`, `text-start`, and
64
+ `text-end` when direction matters. Avoid hardcoded left/right positioning for
65
+ new localized UI unless it is genuinely physical.
66
+
67
+ ## Verification
68
+
69
+ Run:
70
+
71
+ ```bash
72
+ pnpm guard:i18n-catalogs
73
+ ```
74
+
75
+ For broader changes, also run the affected template tests and `pnpm typecheck`.
76
+ Machine translation is only a starting point; high-visibility strings need
77
+ human review.
@@ -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