@linguanahq/cli 0.1.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 (412) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +43 -0
  3. package/dist/index.js +1543 -0
  4. package/dist/templates/blog/react/.env.example +15 -0
  5. package/dist/templates/blog/react/ASSETS.md +1 -0
  6. package/dist/templates/blog/react/DEPLOY.md +23 -0
  7. package/dist/templates/blog/react/LICENSE +21 -0
  8. package/dist/templates/blog/react/README.md +36 -0
  9. package/dist/templates/blog/react/_gitignore +11 -0
  10. package/dist/templates/blog/react/index.html +2 -0
  11. package/dist/templates/blog/react/linguana.json +10 -0
  12. package/dist/templates/blog/react/package.json +34 -0
  13. package/dist/templates/blog/react/public/assets/scene-1.svg +1 -0
  14. package/dist/templates/blog/react/public/assets/scene-2.svg +1 -0
  15. package/dist/templates/blog/react/public/assets/scene-3.svg +1 -0
  16. package/dist/templates/blog/react/public/assets/scene-4.svg +1 -0
  17. package/dist/templates/blog/react/public/assets/scene-5.svg +1 -0
  18. package/dist/templates/blog/react/public/assets/scene-6.svg +1 -0
  19. package/dist/templates/blog/react/src/App.tsx +465 -0
  20. package/dist/templates/blog/react/src/Copy.tsx +322 -0
  21. package/dist/templates/blog/react/src/demo-messages.ts +221 -0
  22. package/dist/templates/blog/react/src/i18n.ts +62 -0
  23. package/dist/templates/blog/react/src/main.tsx +11 -0
  24. package/dist/templates/blog/react/src/messages.ts +71 -0
  25. package/dist/templates/blog/react/src/model.ts +128 -0
  26. package/dist/templates/blog/react/src/styles.css +1159 -0
  27. package/dist/templates/blog/react/src/vite-env.d.ts +1 -0
  28. package/dist/templates/blog/react/tsconfig.json +23 -0
  29. package/dist/templates/blog/react/vite.config.ts +36 -0
  30. package/dist/templates/blog/react/wrangler.jsonc +8 -0
  31. package/dist/templates/blog/solidjs/.env.example +15 -0
  32. package/dist/templates/blog/solidjs/ASSETS.md +1 -0
  33. package/dist/templates/blog/solidjs/DEPLOY.md +23 -0
  34. package/dist/templates/blog/solidjs/LICENSE +21 -0
  35. package/dist/templates/blog/solidjs/README.md +36 -0
  36. package/dist/templates/blog/solidjs/_gitignore +11 -0
  37. package/dist/templates/blog/solidjs/index.html +2 -0
  38. package/dist/templates/blog/solidjs/linguana.json +10 -0
  39. package/dist/templates/blog/solidjs/package.json +31 -0
  40. package/dist/templates/blog/solidjs/public/assets/scene-1.svg +1 -0
  41. package/dist/templates/blog/solidjs/public/assets/scene-2.svg +1 -0
  42. package/dist/templates/blog/solidjs/public/assets/scene-3.svg +1 -0
  43. package/dist/templates/blog/solidjs/public/assets/scene-4.svg +1 -0
  44. package/dist/templates/blog/solidjs/public/assets/scene-5.svg +1 -0
  45. package/dist/templates/blog/solidjs/public/assets/scene-6.svg +1 -0
  46. package/dist/templates/blog/solidjs/src/App.tsx +457 -0
  47. package/dist/templates/blog/solidjs/src/Copy.tsx +322 -0
  48. package/dist/templates/blog/solidjs/src/demo-messages.ts +221 -0
  49. package/dist/templates/blog/solidjs/src/i18n.ts +62 -0
  50. package/dist/templates/blog/solidjs/src/main.tsx +14 -0
  51. package/dist/templates/blog/solidjs/src/messages.ts +71 -0
  52. package/dist/templates/blog/solidjs/src/model.ts +128 -0
  53. package/dist/templates/blog/solidjs/src/styles.css +1159 -0
  54. package/dist/templates/blog/solidjs/src/vite-env.d.ts +1 -0
  55. package/dist/templates/blog/solidjs/tsconfig.json +24 -0
  56. package/dist/templates/blog/solidjs/vite.config.ts +36 -0
  57. package/dist/templates/blog/solidjs/wrangler.jsonc +8 -0
  58. package/dist/templates/blog/svelte/.env.example +15 -0
  59. package/dist/templates/blog/svelte/ASSETS.md +1 -0
  60. package/dist/templates/blog/svelte/DEPLOY.md +23 -0
  61. package/dist/templates/blog/svelte/LICENSE +21 -0
  62. package/dist/templates/blog/svelte/README.md +36 -0
  63. package/dist/templates/blog/svelte/_gitignore +11 -0
  64. package/dist/templates/blog/svelte/index.html +2 -0
  65. package/dist/templates/blog/svelte/linguana.json +10 -0
  66. package/dist/templates/blog/svelte/package.json +32 -0
  67. package/dist/templates/blog/svelte/public/assets/scene-1.svg +1 -0
  68. package/dist/templates/blog/svelte/public/assets/scene-2.svg +1 -0
  69. package/dist/templates/blog/svelte/public/assets/scene-3.svg +1 -0
  70. package/dist/templates/blog/svelte/public/assets/scene-4.svg +1 -0
  71. package/dist/templates/blog/svelte/public/assets/scene-5.svg +1 -0
  72. package/dist/templates/blog/svelte/public/assets/scene-6.svg +1 -0
  73. package/dist/templates/blog/svelte/src/App.svelte +196 -0
  74. package/dist/templates/blog/svelte/src/Copy.svelte +60 -0
  75. package/dist/templates/blog/svelte/src/Root.svelte +11 -0
  76. package/dist/templates/blog/svelte/src/demo-messages.ts +221 -0
  77. package/dist/templates/blog/svelte/src/i18n.ts +62 -0
  78. package/dist/templates/blog/svelte/src/main.ts +5 -0
  79. package/dist/templates/blog/svelte/src/messages.ts +71 -0
  80. package/dist/templates/blog/svelte/src/model.ts +128 -0
  81. package/dist/templates/blog/svelte/src/styles.css +1159 -0
  82. package/dist/templates/blog/svelte/src/vite-env.d.ts +1 -0
  83. package/dist/templates/blog/svelte/svelte.config.js +2 -0
  84. package/dist/templates/blog/svelte/tsconfig.json +23 -0
  85. package/dist/templates/blog/svelte/vite.config.ts +36 -0
  86. package/dist/templates/blog/svelte/wrangler.jsonc +8 -0
  87. package/dist/templates/blog/tanstack-start/.env.example +15 -0
  88. package/dist/templates/blog/tanstack-start/ASSETS.md +1 -0
  89. package/dist/templates/blog/tanstack-start/DEPLOY.md +23 -0
  90. package/dist/templates/blog/tanstack-start/LICENSE +21 -0
  91. package/dist/templates/blog/tanstack-start/README.md +36 -0
  92. package/dist/templates/blog/tanstack-start/_gitignore +11 -0
  93. package/dist/templates/blog/tanstack-start/linguana.json +10 -0
  94. package/dist/templates/blog/tanstack-start/nitro.config.ts +2 -0
  95. package/dist/templates/blog/tanstack-start/package.json +42 -0
  96. package/dist/templates/blog/tanstack-start/public/assets/scene-1.svg +1 -0
  97. package/dist/templates/blog/tanstack-start/public/assets/scene-2.svg +1 -0
  98. package/dist/templates/blog/tanstack-start/public/assets/scene-3.svg +1 -0
  99. package/dist/templates/blog/tanstack-start/public/assets/scene-4.svg +1 -0
  100. package/dist/templates/blog/tanstack-start/public/assets/scene-5.svg +1 -0
  101. package/dist/templates/blog/tanstack-start/public/assets/scene-6.svg +1 -0
  102. package/dist/templates/blog/tanstack-start/src/App.tsx +450 -0
  103. package/dist/templates/blog/tanstack-start/src/Copy.tsx +322 -0
  104. package/dist/templates/blog/tanstack-start/src/demo-messages.ts +221 -0
  105. package/dist/templates/blog/tanstack-start/src/i18n.ts +62 -0
  106. package/dist/templates/blog/tanstack-start/src/locale-server.ts +54 -0
  107. package/dist/templates/blog/tanstack-start/src/messages.ts +71 -0
  108. package/dist/templates/blog/tanstack-start/src/model.ts +128 -0
  109. package/dist/templates/blog/tanstack-start/src/router.tsx +10 -0
  110. package/dist/templates/blog/tanstack-start/src/routes/$.tsx +7 -0
  111. package/dist/templates/blog/tanstack-start/src/routes/__root.tsx +50 -0
  112. package/dist/templates/blog/tanstack-start/src/routes/index.tsx +5 -0
  113. package/dist/templates/blog/tanstack-start/src/styles.css +1159 -0
  114. package/dist/templates/blog/tanstack-start/src/vite-env.d.ts +1 -0
  115. package/dist/templates/blog/tanstack-start/tsconfig.json +23 -0
  116. package/dist/templates/blog/tanstack-start/vite.config.ts +50 -0
  117. package/dist/templates/blog/tanstack-start/wrangler.jsonc +12 -0
  118. package/dist/templates/blog/vue/.env.example +15 -0
  119. package/dist/templates/blog/vue/ASSETS.md +1 -0
  120. package/dist/templates/blog/vue/DEPLOY.md +23 -0
  121. package/dist/templates/blog/vue/LICENSE +21 -0
  122. package/dist/templates/blog/vue/README.md +36 -0
  123. package/dist/templates/blog/vue/_gitignore +11 -0
  124. package/dist/templates/blog/vue/index.html +2 -0
  125. package/dist/templates/blog/vue/linguana.json +10 -0
  126. package/dist/templates/blog/vue/package.json +34 -0
  127. package/dist/templates/blog/vue/public/assets/scene-1.svg +1 -0
  128. package/dist/templates/blog/vue/public/assets/scene-2.svg +1 -0
  129. package/dist/templates/blog/vue/public/assets/scene-3.svg +1 -0
  130. package/dist/templates/blog/vue/public/assets/scene-4.svg +1 -0
  131. package/dist/templates/blog/vue/public/assets/scene-5.svg +1 -0
  132. package/dist/templates/blog/vue/public/assets/scene-6.svg +1 -0
  133. package/dist/templates/blog/vue/src/App.vue +188 -0
  134. package/dist/templates/blog/vue/src/Copy.vue +59 -0
  135. package/dist/templates/blog/vue/src/demo-messages.ts +221 -0
  136. package/dist/templates/blog/vue/src/i18n.ts +62 -0
  137. package/dist/templates/blog/vue/src/main.ts +7 -0
  138. package/dist/templates/blog/vue/src/messages.ts +71 -0
  139. package/dist/templates/blog/vue/src/model.ts +128 -0
  140. package/dist/templates/blog/vue/src/styles.css +1159 -0
  141. package/dist/templates/blog/vue/src/vite-env.d.ts +1 -0
  142. package/dist/templates/blog/vue/tsconfig.json +23 -0
  143. package/dist/templates/blog/vue/vite.config.ts +36 -0
  144. package/dist/templates/blog/vue/wrangler.jsonc +8 -0
  145. package/dist/templates/saas/react/.env.example +15 -0
  146. package/dist/templates/saas/react/ASSETS.md +1 -0
  147. package/dist/templates/saas/react/DEPLOY.md +23 -0
  148. package/dist/templates/saas/react/LICENSE +21 -0
  149. package/dist/templates/saas/react/README.md +36 -0
  150. package/dist/templates/saas/react/_gitignore +11 -0
  151. package/dist/templates/saas/react/index.html +2 -0
  152. package/dist/templates/saas/react/linguana.json +10 -0
  153. package/dist/templates/saas/react/package.json +34 -0
  154. package/dist/templates/saas/react/src/App.tsx +631 -0
  155. package/dist/templates/saas/react/src/Copy.tsx +380 -0
  156. package/dist/templates/saas/react/src/demo-messages.ts +228 -0
  157. package/dist/templates/saas/react/src/i18n.ts +62 -0
  158. package/dist/templates/saas/react/src/main.tsx +11 -0
  159. package/dist/templates/saas/react/src/messages.ts +77 -0
  160. package/dist/templates/saas/react/src/model.ts +73 -0
  161. package/dist/templates/saas/react/src/styles.css +1159 -0
  162. package/dist/templates/saas/react/src/vite-env.d.ts +1 -0
  163. package/dist/templates/saas/react/tsconfig.json +23 -0
  164. package/dist/templates/saas/react/vite.config.ts +36 -0
  165. package/dist/templates/saas/react/wrangler.jsonc +8 -0
  166. package/dist/templates/saas/solidjs/.env.example +15 -0
  167. package/dist/templates/saas/solidjs/ASSETS.md +1 -0
  168. package/dist/templates/saas/solidjs/DEPLOY.md +23 -0
  169. package/dist/templates/saas/solidjs/LICENSE +21 -0
  170. package/dist/templates/saas/solidjs/README.md +36 -0
  171. package/dist/templates/saas/solidjs/_gitignore +11 -0
  172. package/dist/templates/saas/solidjs/index.html +2 -0
  173. package/dist/templates/saas/solidjs/linguana.json +10 -0
  174. package/dist/templates/saas/solidjs/package.json +31 -0
  175. package/dist/templates/saas/solidjs/src/App.tsx +629 -0
  176. package/dist/templates/saas/solidjs/src/Copy.tsx +380 -0
  177. package/dist/templates/saas/solidjs/src/demo-messages.ts +228 -0
  178. package/dist/templates/saas/solidjs/src/i18n.ts +62 -0
  179. package/dist/templates/saas/solidjs/src/main.tsx +14 -0
  180. package/dist/templates/saas/solidjs/src/messages.ts +77 -0
  181. package/dist/templates/saas/solidjs/src/model.ts +73 -0
  182. package/dist/templates/saas/solidjs/src/styles.css +1159 -0
  183. package/dist/templates/saas/solidjs/src/vite-env.d.ts +1 -0
  184. package/dist/templates/saas/solidjs/tsconfig.json +24 -0
  185. package/dist/templates/saas/solidjs/vite.config.ts +36 -0
  186. package/dist/templates/saas/solidjs/wrangler.jsonc +8 -0
  187. package/dist/templates/saas/svelte/.env.example +15 -0
  188. package/dist/templates/saas/svelte/ASSETS.md +1 -0
  189. package/dist/templates/saas/svelte/DEPLOY.md +23 -0
  190. package/dist/templates/saas/svelte/LICENSE +21 -0
  191. package/dist/templates/saas/svelte/README.md +36 -0
  192. package/dist/templates/saas/svelte/_gitignore +11 -0
  193. package/dist/templates/saas/svelte/index.html +2 -0
  194. package/dist/templates/saas/svelte/linguana.json +10 -0
  195. package/dist/templates/saas/svelte/package.json +32 -0
  196. package/dist/templates/saas/svelte/src/App.svelte +252 -0
  197. package/dist/templates/saas/svelte/src/Copy.svelte +74 -0
  198. package/dist/templates/saas/svelte/src/Root.svelte +11 -0
  199. package/dist/templates/saas/svelte/src/demo-messages.ts +228 -0
  200. package/dist/templates/saas/svelte/src/i18n.ts +62 -0
  201. package/dist/templates/saas/svelte/src/main.ts +5 -0
  202. package/dist/templates/saas/svelte/src/messages.ts +77 -0
  203. package/dist/templates/saas/svelte/src/model.ts +73 -0
  204. package/dist/templates/saas/svelte/src/styles.css +1159 -0
  205. package/dist/templates/saas/svelte/src/vite-env.d.ts +1 -0
  206. package/dist/templates/saas/svelte/svelte.config.js +2 -0
  207. package/dist/templates/saas/svelte/tsconfig.json +23 -0
  208. package/dist/templates/saas/svelte/vite.config.ts +36 -0
  209. package/dist/templates/saas/svelte/wrangler.jsonc +8 -0
  210. package/dist/templates/saas/tanstack-start/.env.example +15 -0
  211. package/dist/templates/saas/tanstack-start/ASSETS.md +1 -0
  212. package/dist/templates/saas/tanstack-start/DEPLOY.md +23 -0
  213. package/dist/templates/saas/tanstack-start/LICENSE +21 -0
  214. package/dist/templates/saas/tanstack-start/README.md +36 -0
  215. package/dist/templates/saas/tanstack-start/_gitignore +11 -0
  216. package/dist/templates/saas/tanstack-start/linguana.json +10 -0
  217. package/dist/templates/saas/tanstack-start/nitro.config.ts +2 -0
  218. package/dist/templates/saas/tanstack-start/package.json +42 -0
  219. package/dist/templates/saas/tanstack-start/src/App.tsx +616 -0
  220. package/dist/templates/saas/tanstack-start/src/Copy.tsx +380 -0
  221. package/dist/templates/saas/tanstack-start/src/demo-messages.ts +228 -0
  222. package/dist/templates/saas/tanstack-start/src/i18n.ts +62 -0
  223. package/dist/templates/saas/tanstack-start/src/locale-server.ts +54 -0
  224. package/dist/templates/saas/tanstack-start/src/messages.ts +77 -0
  225. package/dist/templates/saas/tanstack-start/src/model.ts +73 -0
  226. package/dist/templates/saas/tanstack-start/src/router.tsx +10 -0
  227. package/dist/templates/saas/tanstack-start/src/routes/$.tsx +7 -0
  228. package/dist/templates/saas/tanstack-start/src/routes/__root.tsx +50 -0
  229. package/dist/templates/saas/tanstack-start/src/routes/index.tsx +5 -0
  230. package/dist/templates/saas/tanstack-start/src/styles.css +1159 -0
  231. package/dist/templates/saas/tanstack-start/src/vite-env.d.ts +1 -0
  232. package/dist/templates/saas/tanstack-start/tsconfig.json +23 -0
  233. package/dist/templates/saas/tanstack-start/vite.config.ts +50 -0
  234. package/dist/templates/saas/tanstack-start/wrangler.jsonc +12 -0
  235. package/dist/templates/saas/vue/.env.example +15 -0
  236. package/dist/templates/saas/vue/ASSETS.md +1 -0
  237. package/dist/templates/saas/vue/DEPLOY.md +23 -0
  238. package/dist/templates/saas/vue/LICENSE +21 -0
  239. package/dist/templates/saas/vue/README.md +36 -0
  240. package/dist/templates/saas/vue/_gitignore +11 -0
  241. package/dist/templates/saas/vue/index.html +2 -0
  242. package/dist/templates/saas/vue/linguana.json +10 -0
  243. package/dist/templates/saas/vue/package.json +34 -0
  244. package/dist/templates/saas/vue/src/App.vue +244 -0
  245. package/dist/templates/saas/vue/src/Copy.vue +73 -0
  246. package/dist/templates/saas/vue/src/demo-messages.ts +228 -0
  247. package/dist/templates/saas/vue/src/i18n.ts +62 -0
  248. package/dist/templates/saas/vue/src/main.ts +7 -0
  249. package/dist/templates/saas/vue/src/messages.ts +77 -0
  250. package/dist/templates/saas/vue/src/model.ts +73 -0
  251. package/dist/templates/saas/vue/src/styles.css +1159 -0
  252. package/dist/templates/saas/vue/src/vite-env.d.ts +1 -0
  253. package/dist/templates/saas/vue/tsconfig.json +23 -0
  254. package/dist/templates/saas/vue/vite.config.ts +36 -0
  255. package/dist/templates/saas/vue/wrangler.jsonc +8 -0
  256. package/dist/templates/storefront/react/.env.example +15 -0
  257. package/dist/templates/storefront/react/ASSETS.md +1 -0
  258. package/dist/templates/storefront/react/DEPLOY.md +23 -0
  259. package/dist/templates/storefront/react/LICENSE +21 -0
  260. package/dist/templates/storefront/react/README.md +36 -0
  261. package/dist/templates/storefront/react/_gitignore +11 -0
  262. package/dist/templates/storefront/react/index.html +2 -0
  263. package/dist/templates/storefront/react/linguana.json +10 -0
  264. package/dist/templates/storefront/react/package.json +34 -0
  265. package/dist/templates/storefront/react/public/assets/collection.svg +1 -0
  266. package/dist/templates/storefront/react/public/assets/product-1.svg +1 -0
  267. package/dist/templates/storefront/react/public/assets/product-2.svg +1 -0
  268. package/dist/templates/storefront/react/public/assets/product-3.svg +1 -0
  269. package/dist/templates/storefront/react/public/assets/product-4.svg +1 -0
  270. package/dist/templates/storefront/react/public/assets/product-5.svg +1 -0
  271. package/dist/templates/storefront/react/public/assets/product-6.svg +1 -0
  272. package/dist/templates/storefront/react/public/assets/product-7.svg +1 -0
  273. package/dist/templates/storefront/react/public/assets/product-8.svg +1 -0
  274. package/dist/templates/storefront/react/src/App.tsx +616 -0
  275. package/dist/templates/storefront/react/src/Copy.tsx +304 -0
  276. package/dist/templates/storefront/react/src/demo-messages.ts +205 -0
  277. package/dist/templates/storefront/react/src/i18n.ts +64 -0
  278. package/dist/templates/storefront/react/src/main.tsx +11 -0
  279. package/dist/templates/storefront/react/src/messages.ts +71 -0
  280. package/dist/templates/storefront/react/src/model.ts +146 -0
  281. package/dist/templates/storefront/react/src/styles.css +1159 -0
  282. package/dist/templates/storefront/react/src/vite-env.d.ts +1 -0
  283. package/dist/templates/storefront/react/tsconfig.json +23 -0
  284. package/dist/templates/storefront/react/vite.config.ts +36 -0
  285. package/dist/templates/storefront/react/wrangler.jsonc +8 -0
  286. package/dist/templates/storefront/solidjs/.env.example +15 -0
  287. package/dist/templates/storefront/solidjs/ASSETS.md +1 -0
  288. package/dist/templates/storefront/solidjs/DEPLOY.md +23 -0
  289. package/dist/templates/storefront/solidjs/LICENSE +21 -0
  290. package/dist/templates/storefront/solidjs/README.md +36 -0
  291. package/dist/templates/storefront/solidjs/_gitignore +11 -0
  292. package/dist/templates/storefront/solidjs/index.html +2 -0
  293. package/dist/templates/storefront/solidjs/linguana.json +10 -0
  294. package/dist/templates/storefront/solidjs/package.json +31 -0
  295. package/dist/templates/storefront/solidjs/public/assets/collection.svg +1 -0
  296. package/dist/templates/storefront/solidjs/public/assets/product-1.svg +1 -0
  297. package/dist/templates/storefront/solidjs/public/assets/product-2.svg +1 -0
  298. package/dist/templates/storefront/solidjs/public/assets/product-3.svg +1 -0
  299. package/dist/templates/storefront/solidjs/public/assets/product-4.svg +1 -0
  300. package/dist/templates/storefront/solidjs/public/assets/product-5.svg +1 -0
  301. package/dist/templates/storefront/solidjs/public/assets/product-6.svg +1 -0
  302. package/dist/templates/storefront/solidjs/public/assets/product-7.svg +1 -0
  303. package/dist/templates/storefront/solidjs/public/assets/product-8.svg +1 -0
  304. package/dist/templates/storefront/solidjs/src/App.tsx +612 -0
  305. package/dist/templates/storefront/solidjs/src/Copy.tsx +304 -0
  306. package/dist/templates/storefront/solidjs/src/demo-messages.ts +205 -0
  307. package/dist/templates/storefront/solidjs/src/i18n.ts +64 -0
  308. package/dist/templates/storefront/solidjs/src/main.tsx +14 -0
  309. package/dist/templates/storefront/solidjs/src/messages.ts +71 -0
  310. package/dist/templates/storefront/solidjs/src/model.ts +146 -0
  311. package/dist/templates/storefront/solidjs/src/styles.css +1159 -0
  312. package/dist/templates/storefront/solidjs/src/vite-env.d.ts +1 -0
  313. package/dist/templates/storefront/solidjs/tsconfig.json +24 -0
  314. package/dist/templates/storefront/solidjs/vite.config.ts +36 -0
  315. package/dist/templates/storefront/solidjs/wrangler.jsonc +8 -0
  316. package/dist/templates/storefront/svelte/.env.example +15 -0
  317. package/dist/templates/storefront/svelte/ASSETS.md +1 -0
  318. package/dist/templates/storefront/svelte/DEPLOY.md +23 -0
  319. package/dist/templates/storefront/svelte/LICENSE +21 -0
  320. package/dist/templates/storefront/svelte/README.md +36 -0
  321. package/dist/templates/storefront/svelte/_gitignore +11 -0
  322. package/dist/templates/storefront/svelte/index.html +2 -0
  323. package/dist/templates/storefront/svelte/linguana.json +10 -0
  324. package/dist/templates/storefront/svelte/package.json +32 -0
  325. package/dist/templates/storefront/svelte/public/assets/collection.svg +1 -0
  326. package/dist/templates/storefront/svelte/public/assets/product-1.svg +1 -0
  327. package/dist/templates/storefront/svelte/public/assets/product-2.svg +1 -0
  328. package/dist/templates/storefront/svelte/public/assets/product-3.svg +1 -0
  329. package/dist/templates/storefront/svelte/public/assets/product-4.svg +1 -0
  330. package/dist/templates/storefront/svelte/public/assets/product-5.svg +1 -0
  331. package/dist/templates/storefront/svelte/public/assets/product-6.svg +1 -0
  332. package/dist/templates/storefront/svelte/public/assets/product-7.svg +1 -0
  333. package/dist/templates/storefront/svelte/public/assets/product-8.svg +1 -0
  334. package/dist/templates/storefront/svelte/src/App.svelte +218 -0
  335. package/dist/templates/storefront/svelte/src/Copy.svelte +66 -0
  336. package/dist/templates/storefront/svelte/src/Root.svelte +11 -0
  337. package/dist/templates/storefront/svelte/src/demo-messages.ts +205 -0
  338. package/dist/templates/storefront/svelte/src/i18n.ts +64 -0
  339. package/dist/templates/storefront/svelte/src/main.ts +5 -0
  340. package/dist/templates/storefront/svelte/src/messages.ts +71 -0
  341. package/dist/templates/storefront/svelte/src/model.ts +146 -0
  342. package/dist/templates/storefront/svelte/src/styles.css +1159 -0
  343. package/dist/templates/storefront/svelte/src/vite-env.d.ts +1 -0
  344. package/dist/templates/storefront/svelte/svelte.config.js +2 -0
  345. package/dist/templates/storefront/svelte/tsconfig.json +23 -0
  346. package/dist/templates/storefront/svelte/vite.config.ts +36 -0
  347. package/dist/templates/storefront/svelte/wrangler.jsonc +8 -0
  348. package/dist/templates/storefront/tanstack-start/.env.example +15 -0
  349. package/dist/templates/storefront/tanstack-start/ASSETS.md +1 -0
  350. package/dist/templates/storefront/tanstack-start/DEPLOY.md +23 -0
  351. package/dist/templates/storefront/tanstack-start/LICENSE +21 -0
  352. package/dist/templates/storefront/tanstack-start/README.md +36 -0
  353. package/dist/templates/storefront/tanstack-start/_gitignore +11 -0
  354. package/dist/templates/storefront/tanstack-start/linguana.json +10 -0
  355. package/dist/templates/storefront/tanstack-start/nitro.config.ts +2 -0
  356. package/dist/templates/storefront/tanstack-start/package.json +42 -0
  357. package/dist/templates/storefront/tanstack-start/public/assets/collection.svg +1 -0
  358. package/dist/templates/storefront/tanstack-start/public/assets/product-1.svg +1 -0
  359. package/dist/templates/storefront/tanstack-start/public/assets/product-2.svg +1 -0
  360. package/dist/templates/storefront/tanstack-start/public/assets/product-3.svg +1 -0
  361. package/dist/templates/storefront/tanstack-start/public/assets/product-4.svg +1 -0
  362. package/dist/templates/storefront/tanstack-start/public/assets/product-5.svg +1 -0
  363. package/dist/templates/storefront/tanstack-start/public/assets/product-6.svg +1 -0
  364. package/dist/templates/storefront/tanstack-start/public/assets/product-7.svg +1 -0
  365. package/dist/templates/storefront/tanstack-start/public/assets/product-8.svg +1 -0
  366. package/dist/templates/storefront/tanstack-start/src/App.tsx +601 -0
  367. package/dist/templates/storefront/tanstack-start/src/Copy.tsx +304 -0
  368. package/dist/templates/storefront/tanstack-start/src/demo-messages.ts +205 -0
  369. package/dist/templates/storefront/tanstack-start/src/i18n.ts +64 -0
  370. package/dist/templates/storefront/tanstack-start/src/locale-server.ts +54 -0
  371. package/dist/templates/storefront/tanstack-start/src/messages.ts +71 -0
  372. package/dist/templates/storefront/tanstack-start/src/model.ts +146 -0
  373. package/dist/templates/storefront/tanstack-start/src/router.tsx +10 -0
  374. package/dist/templates/storefront/tanstack-start/src/routes/$.tsx +7 -0
  375. package/dist/templates/storefront/tanstack-start/src/routes/__root.tsx +50 -0
  376. package/dist/templates/storefront/tanstack-start/src/routes/index.tsx +5 -0
  377. package/dist/templates/storefront/tanstack-start/src/styles.css +1159 -0
  378. package/dist/templates/storefront/tanstack-start/src/vite-env.d.ts +1 -0
  379. package/dist/templates/storefront/tanstack-start/tsconfig.json +23 -0
  380. package/dist/templates/storefront/tanstack-start/vite.config.ts +50 -0
  381. package/dist/templates/storefront/tanstack-start/wrangler.jsonc +12 -0
  382. package/dist/templates/storefront/vue/.env.example +15 -0
  383. package/dist/templates/storefront/vue/ASSETS.md +1 -0
  384. package/dist/templates/storefront/vue/DEPLOY.md +23 -0
  385. package/dist/templates/storefront/vue/LICENSE +21 -0
  386. package/dist/templates/storefront/vue/README.md +36 -0
  387. package/dist/templates/storefront/vue/_gitignore +11 -0
  388. package/dist/templates/storefront/vue/index.html +2 -0
  389. package/dist/templates/storefront/vue/linguana.json +10 -0
  390. package/dist/templates/storefront/vue/package.json +34 -0
  391. package/dist/templates/storefront/vue/public/assets/collection.svg +1 -0
  392. package/dist/templates/storefront/vue/public/assets/product-1.svg +1 -0
  393. package/dist/templates/storefront/vue/public/assets/product-2.svg +1 -0
  394. package/dist/templates/storefront/vue/public/assets/product-3.svg +1 -0
  395. package/dist/templates/storefront/vue/public/assets/product-4.svg +1 -0
  396. package/dist/templates/storefront/vue/public/assets/product-5.svg +1 -0
  397. package/dist/templates/storefront/vue/public/assets/product-6.svg +1 -0
  398. package/dist/templates/storefront/vue/public/assets/product-7.svg +1 -0
  399. package/dist/templates/storefront/vue/public/assets/product-8.svg +1 -0
  400. package/dist/templates/storefront/vue/src/App.vue +210 -0
  401. package/dist/templates/storefront/vue/src/Copy.vue +65 -0
  402. package/dist/templates/storefront/vue/src/demo-messages.ts +205 -0
  403. package/dist/templates/storefront/vue/src/i18n.ts +64 -0
  404. package/dist/templates/storefront/vue/src/main.ts +7 -0
  405. package/dist/templates/storefront/vue/src/messages.ts +71 -0
  406. package/dist/templates/storefront/vue/src/model.ts +146 -0
  407. package/dist/templates/storefront/vue/src/styles.css +1159 -0
  408. package/dist/templates/storefront/vue/src/vite-env.d.ts +1 -0
  409. package/dist/templates/storefront/vue/tsconfig.json +23 -0
  410. package/dist/templates/storefront/vue/vite.config.ts +36 -0
  411. package/dist/templates/storefront/vue/wrangler.jsonc +8 -0
  412. package/package.json +38 -0
@@ -0,0 +1,322 @@
1
+ import { T } from "@linguanahq/react";
2
+ export default function Copy(props: {
3
+ name: string;
4
+ values?: Record<string, string | number>;
5
+ }) {
6
+ return (
7
+ <>
8
+ {props.name === "language" && (
9
+ <T id="language" defaultMessage="Language" values={props.values} />
10
+ )}
11
+ {props.name === "skip" && (
12
+ <T id="skip" defaultMessage="Skip to content" values={props.values} />
13
+ )}
14
+ {props.name === "home" && (
15
+ <T id="home" defaultMessage="Home" values={props.values} />
16
+ )}
17
+ {props.name === "search" && (
18
+ <T id="search" defaultMessage="Search" values={props.values} />
19
+ )}
20
+ {props.name === "all" && (
21
+ <T id="all" defaultMessage="All" values={props.values} />
22
+ )}
23
+ {props.name === "empty" && (
24
+ <T
25
+ id="empty"
26
+ defaultMessage="Nothing here yet."
27
+ values={props.values}
28
+ />
29
+ )}
30
+ {props.name === "emptyHint" && (
31
+ <T
32
+ id="emptyHint"
33
+ defaultMessage="Try another search or clear your filters."
34
+ values={props.values}
35
+ />
36
+ )}
37
+ {props.name === "clear" && (
38
+ <T id="clear" defaultMessage="Clear filters" values={props.values} />
39
+ )}
40
+ {props.name === "missing" && (
41
+ <T
42
+ id="missing"
43
+ defaultMessage="This page took a different path."
44
+ values={props.values}
45
+ />
46
+ )}
47
+ {props.name === "missingHint" && (
48
+ <T
49
+ id="missingHint"
50
+ defaultMessage="We could not find that page. There is plenty to discover back home."
51
+ values={props.values}
52
+ />
53
+ )}
54
+ {props.name === "back" && (
55
+ <T id="back" defaultMessage="Back to home" values={props.values} />
56
+ )}
57
+ {props.name === "demo" && (
58
+ <T
59
+ id="demo"
60
+ defaultMessage="A multilingual demo, made with Linguana."
61
+ values={props.values}
62
+ />
63
+ )}
64
+ {props.name === "email" && (
65
+ <T id="email" defaultMessage="Email address" values={props.values} />
66
+ )}
67
+ {props.name === "name" && (
68
+ <T id="name" defaultMessage="Your name" values={props.values} />
69
+ )}
70
+ {props.name === "simulated" && (
71
+ <T
72
+ id="simulated"
73
+ defaultMessage="Demo only. Your information stays in this browser."
74
+ values={props.values}
75
+ />
76
+ )}
77
+ {props.name === "sent" && (
78
+ <T
79
+ id="sent"
80
+ defaultMessage="Thank you, {name}! This was a demo; nothing was sent."
81
+ values={props.values}
82
+ />
83
+ )}
84
+ {props.name === "formError" && (
85
+ <T
86
+ id="formError"
87
+ defaultMessage="Please enter your name and a valid email address."
88
+ values={props.values}
89
+ />
90
+ )}
91
+ {props.name === "eyebrow" && (
92
+ <T
93
+ id="eyebrow"
94
+ defaultMessage="A journal of slower journeys"
95
+ values={props.values}
96
+ />
97
+ )}
98
+ {props.name === "headline" && (
99
+ <T
100
+ id="headline"
101
+ defaultMessage="Somewhere new. A little more you."
102
+ values={props.values}
103
+ />
104
+ )}
105
+ {props.name === "intro" && (
106
+ <T
107
+ id="intro"
108
+ defaultMessage="Stories from the long way round. Good coffee, unfamiliar streets, and the people who make a place."
109
+ values={props.values}
110
+ />
111
+ )}
112
+ {props.name === "latest" && (
113
+ <T
114
+ id="latest"
115
+ defaultMessage="The latest field notes"
116
+ values={props.values}
117
+ />
118
+ )}
119
+ {props.name === "read" && (
120
+ <T id="read" defaultMessage="Read the story" values={props.values} />
121
+ )}
122
+ {props.name === "cities" && (
123
+ <T id="cities" defaultMessage="City walks" values={props.values} />
124
+ )}
125
+ {props.name === "nature" && (
126
+ <T id="nature" defaultMessage="In the wild" values={props.values} />
127
+ )}
128
+ {props.name === "coast" && (
129
+ <T id="coast" defaultMessage="By the water" values={props.values} />
130
+ )}
131
+ {props.name === "minutes" && (
132
+ <T
133
+ id="minutes"
134
+ defaultMessage="{count, plural, one {# minute read} other {# minutes read}}"
135
+ values={props.values}
136
+ />
137
+ )}
138
+ {props.name === "notes" && (
139
+ <T
140
+ id="notes"
141
+ defaultMessage="Small observations. Lasting memories."
142
+ values={props.values}
143
+ />
144
+ )}
145
+ {props.name === "about" && (
146
+ <T
147
+ id="about"
148
+ defaultMessage="Elsewhere is an independent journal about travelling with curiosity and leaving room for the unexpected."
149
+ values={props.values}
150
+ />
151
+ )}
152
+ {props.name === "p1Title" && (
153
+ <T
154
+ id="p1Title"
155
+ defaultMessage="Lisbon, before the city wakes"
156
+ values={props.values}
157
+ />
158
+ )}
159
+ {props.name === "p1Summary" && (
160
+ <T
161
+ id="p1Summary"
162
+ defaultMessage="A morning of tiled doorways, warm pastries, and no particular destination."
163
+ values={props.values}
164
+ />
165
+ )}
166
+ {props.name === "p1Body" && (
167
+ <T
168
+ id="p1Body"
169
+ defaultMessage="At seven, the tram tracks are still quiet. We follow them uphill, past a florist arranging buckets on the pavement. A baker opens his window and the smell of cinnamon settles over the street. We order two coffees and a pastry, then another pastry. There is no reason to hurry."
170
+ values={props.values}
171
+ />
172
+ )}
173
+ {props.name === "p1End" && (
174
+ <T
175
+ id="p1End"
176
+ defaultMessage="By the river the light turns silver. An older couple share a newspaper on a bench, folding it between stories. We take the long route home through streets we cannot name. The best thing we found today was an hour with no plans. Come early, wear comfortable shoes, and let the hills choose your route."
177
+ values={props.values}
178
+ />
179
+ )}
180
+ {props.name === "p2Title" && (
181
+ <T
182
+ id="p2Title"
183
+ defaultMessage="A quieter side of Kyoto"
184
+ values={props.values}
185
+ />
186
+ )}
187
+ {props.name === "p2Summary" && (
188
+ <T
189
+ id="p2Summary"
190
+ defaultMessage="Beyond the busy gates, a walking route lined with small gardens."
191
+ values={props.values}
192
+ />
193
+ )}
194
+ {props.name === "p2Body" && (
195
+ <T
196
+ id="p2Body"
197
+ defaultMessage="Rain softens the sound of our footsteps along the canal. We pass a gardener sweeping leaves into a careful pile. She points us towards a small tea room with room for four people. Inside, a kettle sings and the windows fog at the edges. We warm our hands around the cups and watch the garden change colour."
198
+ values={props.values}
199
+ />
200
+ )}
201
+ {props.name === "p2End" && (
202
+ <T
203
+ id="p2End"
204
+ defaultMessage="We leave with a hand-drawn map and a recommendation to return in autumn. The canal is easy to follow, so put your phone away for a while. Keep your voice low near the houses and give the narrow paths to the people who live here. A good journey also makes room for someone else’s ordinary day."
205
+ values={props.values}
206
+ />
207
+ )}
208
+ {props.name === "p3Title" && (
209
+ <T
210
+ id="p3Title"
211
+ defaultMessage="The coastal road to nowhere"
212
+ values={props.values}
213
+ />
214
+ )}
215
+ {props.name === "p3Summary" && (
216
+ <T
217
+ id="p3Summary"
218
+ defaultMessage="Salt air and a picnic on the Atlantic edge of Portugal."
219
+ values={props.values}
220
+ />
221
+ )}
222
+ {props.name === "p3Body" && (
223
+ <T
224
+ id="p3Body"
225
+ defaultMessage="We stop the car whenever the sea disappears, just to find it again. A narrow track leads through rosemary to a beach without a sign. The sand is cool beneath our feet. Lunch is bread, tomatoes, and cheese from the last village, eaten from the paper they came wrapped in."
226
+ values={props.values}
227
+ />
228
+ )}
229
+ {props.name === "p3End" && (
230
+ <T
231
+ id="p3End"
232
+ defaultMessage="The tide comes in slowly. We pack every scrap of paper and follow our own footprints back. Check the tide before you explore, keep clear of the cliff edges, and bring more water than you think you need. The road will still be there when you are ready to leave."
233
+ values={props.values}
234
+ />
235
+ )}
236
+ {props.name === "p4Title" && (
237
+ <T
238
+ id="p4Title"
239
+ defaultMessage="Walking into the Dolomites"
240
+ values={props.values}
241
+ />
242
+ )}
243
+ {props.name === "p4Summary" && (
244
+ <T
245
+ id="p4Summary"
246
+ defaultMessage="A simple mountain hut, a shared table, and an early start."
247
+ values={props.values}
248
+ />
249
+ )}
250
+ {props.name === "p4Body" && (
251
+ <T
252
+ id="p4Body"
253
+ defaultMessage="The path begins behind a wooden barn and climbs steadily through the trees. We walk in the cool morning, stopping to hear the cowbells below. Above the tree line the mountains seem impossibly close. At the hut, soup arrives in deep bowls and strangers slide along the bench to make room."
254
+ values={props.values}
255
+ />
256
+ )}
257
+ {props.name === "p4End" && (
258
+ <T
259
+ id="p4End"
260
+ defaultMessage="Clouds gather after lunch, so we take the shorter path down. Knowing when to turn around is part of being outdoors. Ask the hut keeper about the weather, carry a proper map, and choose a trail that matches your experience. We reach the village tired, happy, and already talking about next time."
261
+ values={props.values}
262
+ />
263
+ )}
264
+ {props.name === "p5Title" && (
265
+ <T
266
+ id="p5Title"
267
+ defaultMessage="Copenhagen by bicycle"
268
+ values={props.values}
269
+ />
270
+ )}
271
+ {props.name === "p5Summary" && (
272
+ <T
273
+ id="p5Summary"
274
+ defaultMessage="Harbour dips, generous bakeries, and the city at cycling speed."
275
+ values={props.values}
276
+ />
277
+ )}
278
+ {props.name === "p5Body" && (
279
+ <T
280
+ id="p5Body"
281
+ defaultMessage="Our rented bicycles have baskets large enough for a day’s supplies. We follow the harbour, keeping to the right and letting commuters pass. The city feels different at this pace: close enough to notice a painted doorway, quick enough to follow a sudden idea across a bridge."
282
+ values={props.values}
283
+ />
284
+ )}
285
+ {props.name === "p5End" && (
286
+ <T
287
+ id="p5End"
288
+ defaultMessage="At a waterside bakery we share a cinnamon bun and mark our favourite places on a paper map. Signal before turning, lock your bicycle even for a quick stop, and leave the cycle lane clear when you pause. The best souvenir is a route you could happily ride again."
289
+ values={props.values}
290
+ />
291
+ )}
292
+ {props.name === "p6Title" && (
293
+ <T
294
+ id="p6Title"
295
+ defaultMessage="A cabin beside the lake"
296
+ values={props.values}
297
+ />
298
+ )}
299
+ {props.name === "p6Summary" && (
300
+ <T
301
+ id="p6Summary"
302
+ defaultMessage="Three days in Finland with very little on the itinerary."
303
+ values={props.values}
304
+ />
305
+ )}
306
+ {props.name === "p6Body" && (
307
+ <T
308
+ id="p6Body"
309
+ defaultMessage="The cabin key waits beneath a flowerpot. Inside there is a stove, a small shelf of books, and a window facing the lake. We fill the kettle and unpack slowly. The first afternoon passes without an event worth recording, which turns out to be exactly what we needed."
310
+ values={props.values}
311
+ />
312
+ )}
313
+ {props.name === "p6End" && (
314
+ <T
315
+ id="p6End"
316
+ defaultMessage="On the last morning we sweep the floor and leave dry wood beside the stove. There are no recommendations to collect here, just a little space to think. Bring groceries before you arrive, respect the quiet, and leave the cabin ready for the next visitor. Some places ask for less, not more."
317
+ values={props.values}
318
+ />
319
+ )}
320
+ </>
321
+ );
322
+ }
@@ -0,0 +1,221 @@
1
+ // These catalogs are only used when linguana.json selects demo mode.
2
+ export const demoMessages = {
3
+ fr: {
4
+ language: "Langue",
5
+ skip: "Aller au contenu",
6
+ home: "Accueil",
7
+ search: "Rechercher",
8
+ all: "Tout",
9
+ empty: "Aucun résultat pour le moment.",
10
+ emptyHint: "Essayez une autre recherche ou effacez les filtres.",
11
+ clear: "Effacer les filtres",
12
+ missing: "Cette page a pris un autre chemin.",
13
+ missingHint:
14
+ "Cette page est introuvable. Il reste beaucoup à découvrir à l’accueil.",
15
+ back: "Retour à l’accueil",
16
+ demo: "Une démo multilingue, créée avec Linguana.",
17
+ email: "Adresse e-mail",
18
+ name: "Votre nom",
19
+ simulated:
20
+ "Démonstration uniquement. Vos informations restent dans ce navigateur.",
21
+ sent: "Merci, {name} ! C’était une démo ; rien n’a été envoyé.",
22
+ formError: "Veuillez saisir votre nom et une adresse e-mail valide.",
23
+ eyebrow: "Le carnet des voyages au ralenti",
24
+ headline: "Ailleurs, un peu plus près de vous.",
25
+ intro:
26
+ "Des récits qui prennent les chemins de traverse. Un bon café, des rues inconnues et les gens qui font un lieu.",
27
+ latest: "Les derniers carnets",
28
+ read: "Lire le récit",
29
+ cities: "Balades urbaines",
30
+ nature: "En pleine nature",
31
+ coast: "Au bord de l’eau",
32
+ minutes:
33
+ "{count, plural, one {# minute de lecture} other {# minutes de lecture}}",
34
+ notes: "Petites observations. Grands souvenirs.",
35
+ about:
36
+ "Elsewhere est un carnet indépendant pour voyager avec curiosité et laisser une place à l’inattendu.",
37
+ p1Title: "Lisbonne, avant le réveil de la ville",
38
+ p1Summary:
39
+ "Une matinée de portes carrelées, de pâtisseries chaudes et de détours heureux.",
40
+ p1Body:
41
+ "À sept heures, les rails du tram sont encore silencieux. Nous les suivons en montant, devant une fleuriste qui dispose ses seaux sur le trottoir. Un boulanger ouvre sa fenêtre et un parfum de cannelle envahit la rue. Nous commandons deux cafés et une pâtisserie, puis une autre. Rien ne presse.",
42
+ p1End:
43
+ "Près du fleuve, la lumière devient argentée. Un couple partage un journal sur un banc, le pliant entre deux articles. Nous rentrons par des rues dont nous ignorons les noms. Notre plus belle découverte est une heure sans programme. Venez tôt, chaussez-vous confortablement et laissez les collines vous guider.",
44
+ p2Title: "Un autre calme à Kyoto",
45
+ p2Summary:
46
+ "Au-delà des portes animées, une promenade bordée de petits jardins.",
47
+ p2Body:
48
+ "La pluie adoucit nos pas le long du canal. Une jardinière balaie les feuilles en un tas soigné. Elle nous indique un salon de thé de quatre places. À l’intérieur, une bouilloire chante et les vitres se couvrent de buée. Nous réchauffons nos mains autour des tasses et regardons le jardin changer de couleur.",
49
+ p2End:
50
+ "Nous repartons avec un plan dessiné à la main et le conseil de revenir en automne. Le canal est facile à suivre : rangez votre téléphone. Parlez doucement près des maisons et cédez le passage aux habitants. Un beau voyage laisse aussi de la place au quotidien des autres.",
51
+ p3Title: "La route côtière sans destination",
52
+ p3Summary:
53
+ "L’air salé et un pique-nique au bord de l’Atlantique portugais.",
54
+ p3Body:
55
+ "Nous arrêtons la voiture quand la mer disparaît, juste pour la retrouver. Un sentier traverse le romarin jusqu’à une plage sans panneau. Le sable est frais sous nos pieds. Le déjeuner : du pain, des tomates et du fromage du dernier village, dégustés dans leur papier d’emballage.",
56
+ p3End:
57
+ "La marée monte lentement. Nous ramassons chaque papier et suivons nos traces. Consultez les marées, restez loin des falaises et emportez plus d’eau que prévu. La route sera encore là quand vous voudrez repartir.",
58
+ p4Title: "À pied dans les Dolomites",
59
+ p4Summary: "Un refuge simple, une table partagée et un départ matinal.",
60
+ p4Body:
61
+ "Le sentier part derrière une grange et monte dans les arbres. Nous marchons dans la fraîcheur matinale, nous arrêtant pour écouter les cloches en contrebas. Plus haut, les montagnes paraissent tout proches. Au refuge, la soupe arrive dans de grands bols et les inconnus se serrent sur le banc.",
62
+ p4End:
63
+ "Les nuages arrivent après le déjeuner : nous prenons le chemin court. Savoir faire demi-tour fait partie de la montagne. Renseignez-vous sur la météo, prenez une carte et choisissez un sentier adapté. Nous rentrons fatigués, heureux, parlant déjà de la prochaine fois.",
64
+ p5Title: "Copenhague à vélo",
65
+ p5Summary:
66
+ "Baignades au port, boulangeries généreuses et la ville au rythme du vélo.",
67
+ p5Body:
68
+ "Nos vélos loués ont des paniers assez grands pour la journée. Nous longeons le port, gardant la droite pour laisser passer les habitués. À cette allure, la ville change : assez lentement pour voir une porte peinte, assez vite pour suivre une idée de l’autre côté d’un pont.",
69
+ p5End:
70
+ "Dans une boulangerie au bord de l’eau, nous partageons une brioche et marquons nos lieux préférés sur un plan. Signalez vos virages, attachez le vélo même brièvement et libérez la piste à l’arrêt. Le meilleur souvenir est un itinéraire à refaire.",
71
+ p6Title: "Une cabane au bord du lac",
72
+ p6Summary: "Trois jours en Finlande avec très peu au programme.",
73
+ p6Body:
74
+ "La clé attend sous un pot de fleurs. À l’intérieur : un poêle, quelques livres et une fenêtre sur le lac. Nous remplissons la bouilloire et défaisons les sacs lentement. Le premier après-midi passe sans événement à noter, exactement ce qu’il nous fallait.",
75
+ p6End:
76
+ "Le dernier matin, nous balayons et laissons du bois sec près du poêle. Rien à collectionner ici, seulement de l’espace pour penser. Faites les courses avant d’arriver, respectez le calme et préparez la cabane pour les suivants. Certains lieux demandent simplement moins.",
77
+ },
78
+ es: {
79
+ language: "Idioma",
80
+ skip: "Saltar al contenido",
81
+ home: "Inicio",
82
+ search: "Buscar",
83
+ all: "Todo",
84
+ empty: "Todavía no hay resultados.",
85
+ emptyHint: "Prueba otra búsqueda o borra los filtros.",
86
+ clear: "Borrar filtros",
87
+ missing: "Esta página tomó otro camino.",
88
+ missingHint:
89
+ "No encontramos esta página. Hay mucho por descubrir en el inicio.",
90
+ back: "Volver al inicio",
91
+ demo: "Una demo multilingüe, creada con Linguana.",
92
+ email: "Correo electrónico",
93
+ name: "Tu nombre",
94
+ simulated: "Solo una demo. Tu información permanece en este navegador.",
95
+ sent: "¡Gracias, {name}! Era una demo; no se envió nada.",
96
+ formError: "Introduce tu nombre y un correo válido.",
97
+ eyebrow: "Un diario de viajes sin prisa",
98
+ headline: "Un lugar nuevo. Un poco más tú.",
99
+ intro:
100
+ "Historias del camino largo. Buen café, calles desconocidas y las personas que dan vida a un lugar.",
101
+ latest: "Las últimas notas de viaje",
102
+ read: "Leer la historia",
103
+ cities: "Paseos urbanos",
104
+ nature: "En la naturaleza",
105
+ coast: "Junto al agua",
106
+ minutes:
107
+ "{count, plural, one {# minuto de lectura} other {# minutos de lectura}}",
108
+ notes: "Pequeñas observaciones. Recuerdos duraderos.",
109
+ about:
110
+ "Elsewhere es un diario independiente para viajar con curiosidad y dejar espacio a lo inesperado.",
111
+ p1Title: "Lisboa, antes de que despierte",
112
+ p1Summary:
113
+ "Una mañana de azulejos, pasteles calientes y ningún destino concreto.",
114
+ p1Body:
115
+ "A las siete, las vías del tranvía siguen en silencio. Las seguimos cuesta arriba, pasando ante una florista que coloca sus cubos en la acera. Un panadero abre la ventana y la canela perfuma la calle. Pedimos dos cafés y un pastel, y luego otro pastel. No hay prisa.",
116
+ p1End:
117
+ "Junto al río, la luz se vuelve plateada. Una pareja comparte un periódico en un banco, doblándolo entre artículos. Volvemos por calles cuyos nombres no conocemos. Lo mejor del día fue una hora sin planes. Ven temprano, lleva zapatos cómodos y deja que las colinas elijan el camino.",
118
+ p2Title: "El lado tranquilo de Kioto",
119
+ p2Summary:
120
+ "Más allá de las puertas concurridas, un paseo entre pequeños jardines.",
121
+ p2Body:
122
+ "La lluvia suaviza nuestros pasos junto al canal. Una jardinera reúne las hojas en un montón cuidado. Nos señala una pequeña casa de té para cuatro personas. Dentro, canta una tetera y se empañan los bordes de las ventanas. Nos calentamos las manos con las tazas y vemos cambiar el color del jardín.",
123
+ p2End:
124
+ "Salimos con un mapa dibujado a mano y la recomendación de volver en otoño. El canal es fácil de seguir: guarda el teléfono un rato. Habla bajo junto a las casas y cede los senderos estrechos a sus vecinos. Un buen viaje deja espacio para el día cotidiano de los demás.",
125
+ p3Title: "La carretera costera sin destino",
126
+ p3Summary: "Aire salado y un pícnic junto al Atlántico portugués.",
127
+ p3Body:
128
+ "Paramos el coche cuando desaparece el mar, solo para encontrarlo de nuevo. Un sendero entre romero lleva a una playa sin letrero. La arena está fresca. Comemos pan, tomates y queso del último pueblo, sobre el mismo papel en el que venían envueltos.",
129
+ p3End:
130
+ "La marea sube despacio. Recogemos cada papel y volvemos siguiendo nuestras huellas. Consulta las mareas, aléjate de los acantilados y lleva agua de sobra. La carretera seguirá ahí cuando quieras marcharte.",
131
+ p4Title: "Caminando por los Dolomitas",
132
+ p4Summary:
133
+ "Un refugio sencillo, una mesa compartida y un comienzo temprano.",
134
+ p4Body:
135
+ "El sendero empieza detrás de un granero y asciende entre árboles. Caminamos al fresco, parando para escuchar los cencerros. Sobre el bosque, las montañas parecen increíblemente cercanas. En el refugio, llega sopa en cuencos hondos y los desconocidos hacen sitio en el banco.",
136
+ p4End:
137
+ "Tras el almuerzo llegan nubes y bajamos por el camino corto. Saber volver también es parte de la montaña. Pregunta por el tiempo, lleva un mapa y elige una ruta adecuada. Llegamos cansados, felices y hablando de la próxima vez.",
138
+ p5Title: "Copenhague en bicicleta",
139
+ p5Summary:
140
+ "Baños en el puerto, buenas panaderías y la ciudad a ritmo de pedales.",
141
+ p5Body:
142
+ "Las bicicletas de alquiler tienen cestas para todo el día. Seguimos el puerto, a la derecha, dejando pasar a quienes van al trabajo. A este ritmo la ciudad cambia: cerca para ver una puerta pintada, rápido para seguir una idea al otro lado de un puente.",
143
+ p5End:
144
+ "En una panadería junto al agua compartimos un bollo y marcamos favoritos en un mapa. Señala los giros, candá la bicicleta incluso en paradas cortas y deja libre el carril. El mejor recuerdo es una ruta que querrías repetir.",
145
+ p6Title: "Una cabaña junto al lago",
146
+ p6Summary: "Tres días en Finlandia con muy pocos planes.",
147
+ p6Body:
148
+ "La llave espera bajo una maceta. Dentro hay una estufa, unos libros y una ventana al lago. Llenamos la tetera y deshacemos las maletas despacio. La primera tarde pasa sin nada que contar, justo lo que necesitábamos.",
149
+ p6End:
150
+ "La última mañana barremos y dejamos leña seca junto a la estufa. Aquí no hay recomendaciones que coleccionar, solo espacio para pensar. Compra provisiones antes, respeta el silencio y deja la cabaña lista para el siguiente visitante. Algunos lugares piden menos.",
151
+ },
152
+ ar: {
153
+ language: "اللغة",
154
+ skip: "انتقل إلى المحتوى",
155
+ home: "الرئيسية",
156
+ search: "بحث",
157
+ all: "الكل",
158
+ empty: "لا توجد نتائج بعد.",
159
+ emptyHint: "جرّب بحثًا آخر أو امسح عوامل التصفية.",
160
+ clear: "مسح عوامل التصفية",
161
+ missing: "سلكت هذه الصفحة طريقًا آخر.",
162
+ missingHint: "لم نجد هذه الصفحة. هناك الكثير لاكتشافه في الصفحة الرئيسية.",
163
+ back: "العودة إلى الرئيسية",
164
+ demo: "تجربة متعددة اللغات، صُنعت باستخدام Linguana.",
165
+ email: "البريد الإلكتروني",
166
+ name: "اسمك",
167
+ simulated: "تجربة فقط. تبقى معلوماتك في هذا المتصفح.",
168
+ sent: "شكرًا لك يا {name}! هذه تجربة؛ لم يُرسل أي شيء.",
169
+ formError: "أدخل اسمك وبريدًا إلكترونيًا صالحًا.",
170
+ eyebrow: "يوميات رحلات على مهل",
171
+ headline: "مكان جديد. أقرب إلى نفسك.",
172
+ intro:
173
+ "حكايات من الطرق الطويلة. قهوة طيبة، وشوارع غير مألوفة، وأناس يمنحون المكان روحه.",
174
+ latest: "أحدث ملاحظات الرحلة",
175
+ read: "اقرأ الحكاية",
176
+ cities: "جولات المدن",
177
+ nature: "في الطبيعة",
178
+ coast: "قرب الماء",
179
+ minutes:
180
+ "{count, plural, zero {قراءة سريعة} one {دقيقة قراءة} two {دقيقتا قراءة} few {# دقائق قراءة} many {# دقيقة قراءة} other {# دقيقة قراءة}}",
181
+ notes: "ملاحظات صغيرة. ذكريات باقية.",
182
+ about: "Elsewhere مجلة مستقلة عن السفر بفضول وترك مساحة لما هو غير متوقع.",
183
+ p1Title: "لشبونة قبل أن تستيقظ المدينة",
184
+ p1Summary:
185
+ "صباح من الأبواب المزينة بالبلاط والمعجنات الدافئة دون وجهة محددة.",
186
+ p1Body:
187
+ "عند السابعة، ما زالت سكك الترام هادئة. نتبعها صعودًا، ونعبر أمام بائعة زهور ترتب دلاءها على الرصيف. يفتح خباز نافذته فتملأ رائحة القرفة الشارع. نطلب قهوتين وقطعة حلوى، ثم قطعة أخرى. لا داعي للعجلة.",
188
+ p1End:
189
+ "قرب النهر، يصير الضوء فضيًا. يتشارك زوجان صحيفة على مقعد ويطويانها بين الحكايات. نعود عبر شوارع لا نعرف أسماءها. أجمل ما وجدناه اليوم ساعة بلا خطط. تعال مبكرًا، وارتدِ حذاءً مريحًا، ودع التلال تختار طريقك.",
190
+ p2Title: "جانب أكثر هدوءًا من كيوتو",
191
+ p2Summary: "خلف البوابات المزدحمة، طريق مشي تحيط به حدائق صغيرة.",
192
+ p2Body:
193
+ "يخفف المطر وقع خطواتنا بمحاذاة القناة. نمر ببستانية تجمع الأوراق بعناية وتشير إلى بيت شاي صغير يتسع لأربعة أشخاص. في الداخل تغني غلاية ويتكاثف البخار على أطراف النوافذ. ندفئ أيدينا حول الأكواب ونراقب ألوان الحديقة وهي تتغير.",
194
+ p2End:
195
+ "نغادر بخريطة مرسومة يدويًا ونصيحة بالعودة في الخريف. يسهل تتبع القناة، لذا ضع هاتفك جانبًا قليلًا. اخفض صوتك قرب البيوت وافسح الممرات الضيقة لأهل المكان. الرحلة الجميلة تترك مساحة أيضًا ليوم الآخرين العادي.",
196
+ p3Title: "طريق ساحلي بلا وجهة",
197
+ p3Summary: "هواء مالح ونزهة على حافة الأطلسي في البرتغال.",
198
+ p3Body:
199
+ "نوقف السيارة كلما غاب البحر لنبحث عنه مجددًا. يقود ممر ضيق بين إكليل الجبل إلى شاطئ بلا لافتة. الرمل بارد تحت أقدامنا. غداؤنا خبز وطماطم وجبن من آخر قرية، نأكلها من الورق الذي لُفت فيه.",
200
+ p3End:
201
+ "يرتفع المد ببطء. نجمع كل قصاصة ونتبع آثار خطواتنا عائدين. تحقق من المد قبل الاستكشاف، وابتعد عن حواف الجروف، واحمل ماءً أكثر مما تظن أنك تحتاج. سيبقى الطريق حين تستعد للرحيل.",
202
+ p4Title: "المشي في جبال الدولوميت",
203
+ p4Summary: "كوخ جبلي بسيط ومائدة مشتركة وبداية مبكرة.",
204
+ p4Body:
205
+ "يبدأ الممر خلف حظيرة خشبية ويصعد بثبات بين الأشجار. نمشي في برودة الصباح ونتوقف لنسمع أجراس الأبقار أسفلنا. فوق خط الأشجار تبدو الجبال قريبة بشكل مدهش. في الكوخ يصل الحساء في أوعية عميقة ويفسح الغرباء لنا مكانًا على المقعد.",
206
+ p4End:
207
+ "تتجمع الغيوم بعد الغداء فنختار الطريق الأقصر للنزول. معرفة موعد الرجوع جزء من الرحلة. اسأل صاحب الكوخ عن الطقس، واحمل خريطة، واختر مسارًا يناسب خبرتك. نصل القرية متعبين وسعداء ونتحدث عن المرة المقبلة.",
208
+ p5Title: "كوبنهاغن بالدراجة",
209
+ p5Summary: "سباحة في الميناء ومخابز سخية ومدينة بإيقاع الدراجات.",
210
+ p5Body:
211
+ "لدراجاتنا المستأجرة سلال تتسع لمؤونة يوم كامل. نتبع الميناء ملتزمين باليمين ونفسح الطريق للمسرعين إلى العمل. تبدو المدينة مختلفة بهذا الإيقاع: قريبة بما يكفي لملاحظة باب ملون، وسريعة بما يكفي لاتباع فكرة عبر جسر.",
212
+ p5End:
213
+ "نتشارك لفافة قرفة في مخبز قرب الماء ونسجل أماكننا المفضلة على خريطة ورقية. أشر قبل الانعطاف، واقفل الدراجة حتى في الوقفات القصيرة، واترك مسار الدراجات خاليًا حين تتوقف. أجمل تذكار طريق تود أن تسلكه مجددًا.",
214
+ p6Title: "كوخ بجانب البحيرة",
215
+ p6Summary: "ثلاثة أيام في فنلندا بجدول شبه فارغ.",
216
+ p6Body:
217
+ "ينتظر المفتاح تحت أصيص زهور. في الداخل موقد ورف كتب صغير ونافذة تطل على البحيرة. نملأ الغلاية ونفرغ حقائبنا على مهل. يمر العصر الأول دون حدث يستحق التدوين، وهو بالضبط ما كنا نحتاجه.",
218
+ p6End:
219
+ "في الصباح الأخير نكنس الأرض ونترك حطبًا جافًا قرب الموقد. لا توصيات لنجمعها هنا، بل مساحة صغيرة للتفكير. أحضر المؤن قبل الوصول، واحترم الهدوء، واترك الكوخ جاهزًا للزائر التالي. بعض الأماكن تطلب أقل، لا أكثر.",
220
+ },
221
+ };
@@ -0,0 +1,62 @@
1
+ import { createCatalog } from "@linguanahq/catalog";
2
+ import config from "../linguana.json";
3
+ import { demoMessages } from "./demo-messages";
4
+ export const demoLocales = [
5
+ { code: "en", displayName: "English", nativeName: "English" },
6
+ { code: "fr", displayName: "French", nativeName: "Français" },
7
+ { code: "es", displayName: "Spanish", nativeName: "Español" },
8
+ { code: "ar", displayName: "Arabic", nativeName: "العربية" },
9
+ ];
10
+ export const demo = config.mode === "demo";
11
+ export function cookieLocale(
12
+ cookie = typeof document === "undefined" ? "" : document.cookie,
13
+ ) {
14
+ try {
15
+ const value = decodeURIComponent(
16
+ cookie
17
+ .split(";")
18
+ .find((item) => item.trim().startsWith("linguana_locale="))
19
+ ?.split("=")[1] ?? "en",
20
+ );
21
+ return /^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$/.test(value) &&
22
+ (!demo || demoLocales.some((item) => item.code === value))
23
+ ? value
24
+ : "en";
25
+ } catch {
26
+ return "en";
27
+ }
28
+ }
29
+ export const demoCatalogs = demo
30
+ ? Object.entries(demoMessages).map(([locale, messages]) =>
31
+ createCatalog({
32
+ schemaVersion: "1.0",
33
+ projectId: "demo-blog",
34
+ environment: "development",
35
+ sourceLocale: "en",
36
+ locale,
37
+ manifestHash: "0".repeat(64),
38
+ version: 1,
39
+ messages,
40
+ }),
41
+ )
42
+ : [];
43
+ export function optionsFor(
44
+ locale = cookieLocale(),
45
+ ): import("@linguanahq/core").LinguanaClientOptions {
46
+ return {
47
+ projectId: demo ? "demo-blog" : import.meta.env.VITE_LINGUANA_PROJECT_ID,
48
+ environment: demo
49
+ ? "development"
50
+ : import.meta.env.VITE_LINGUANA_ENVIRONMENT,
51
+ initialLocale: locale,
52
+ fallbackLocale: config.sourceLocale,
53
+ catalogs: demoCatalogs,
54
+ ...(demo
55
+ ? { availableLocales: demoLocales }
56
+ : {
57
+ publishableKey: import.meta.env.VITE_LINGUANA_PUBLISHABLE_KEY,
58
+ catalogEndpoint: import.meta.env.VITE_LINGUANA_API_URL,
59
+ configEndpoint: import.meta.env.VITE_LINGUANA_API_URL,
60
+ }),
61
+ };
62
+ }
@@ -0,0 +1,11 @@
1
+ import { LocaleProvider } from "@linguanahq/react";
2
+ import { createRoot } from "react-dom/client";
3
+ import App from "./App";
4
+ import { optionsFor } from "./i18n";
5
+ import "./styles.css";
6
+
7
+ createRoot(document.getElementById("app")!).render(
8
+ <LocaleProvider {...optionsFor()}>
9
+ <App />
10
+ </LocaleProvider>,
11
+ );