tera-system-ui 0.1.18 → 0.1.30

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 (708) hide show
  1. package/README.md +58 -58
  2. package/dist/components/accordion/Accordion.d.ts +1 -1
  3. package/dist/components/accordion/components/Accordion.svelte +16 -0
  4. package/dist/components/accordion/components/Accordion.svelte.d.ts +4 -0
  5. package/dist/components/accordion/components/AccordionContent.svelte +23 -23
  6. package/dist/components/accordion/components/AccordionItem.svelte +11 -11
  7. package/dist/components/accordion/components/AccordionTrigger.svelte +28 -28
  8. package/dist/components/accordion/index.d.ts +1 -3
  9. package/dist/components/accordion/index.js +1 -3
  10. package/dist/components/avatar/Avatar.d.ts +2 -42
  11. package/dist/components/avatar/Avatar.svelte +44 -44
  12. package/dist/components/brand-logo/BrandLogo.d.ts +2 -38
  13. package/dist/components/brand-logo/BrandLogo.svelte +33 -33
  14. package/dist/components/button/Button.d.ts +2 -82
  15. package/dist/components/button/Button.svelte +49 -49
  16. package/dist/components/checkbox/Checkbox.d.ts +1 -1
  17. package/dist/components/checkbox/Checkbox.svelte +34 -34
  18. package/dist/components/combobox/Combobox.d.ts +1 -1
  19. package/dist/components/combobox/Combobox.svelte +8 -8
  20. package/dist/components/command/command.scss +88 -88
  21. package/dist/components/command/components/Command.svelte +120 -120
  22. package/dist/components/command/components/CommandEmpty.svelte +30 -30
  23. package/dist/components/command/components/CommandGroup.svelte +110 -110
  24. package/dist/components/command/components/CommandInput.svelte +91 -91
  25. package/dist/components/command/components/CommandItem.svelte +110 -110
  26. package/dist/components/command/components/CommandList.svelte +56 -56
  27. package/dist/components/command/components/CommandLoading.svelte +28 -28
  28. package/dist/components/command/components/CommandSeparator.svelte +21 -21
  29. package/dist/components/dialog/Dialog.d.ts +2 -110
  30. package/dist/components/dialog/Dialog.svelte +112 -112
  31. package/dist/components/dialog/dialog.scss +186 -186
  32. package/dist/components/dropdown-menu/DropdownMenu.d.ts +1 -1
  33. package/dist/components/dropdown-menu/components/DropdownMenu.svelte +33 -33
  34. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte +11 -11
  35. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte +11 -11
  36. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte +30 -30
  37. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte +10 -10
  38. package/dist/components/fonts/TeraFontMono.svelte +3 -3
  39. package/dist/components/fonts/TeraFontSansSerif.svelte +3 -3
  40. package/dist/components/header/Header.d.ts +1 -1
  41. package/dist/components/header/Header.svelte +36 -36
  42. package/dist/components/header/header.scss +19 -19
  43. package/dist/components/header/package.json +14 -14
  44. package/dist/components/icons/IconArrowBigRightFilled.svelte +11 -11
  45. package/dist/components/icons/IconBook.svelte +10 -10
  46. package/dist/components/icons/IconBookmarkPlus.svelte +10 -10
  47. package/dist/components/icons/IconCalculator.svelte +10 -10
  48. package/dist/components/icons/IconCheck.svelte +10 -10
  49. package/dist/components/icons/IconChevronDown.svelte +10 -10
  50. package/dist/components/icons/IconCoin.svelte +10 -10
  51. package/dist/components/icons/IconCoinConvert.svelte +19 -19
  52. package/dist/components/icons/IconCopy.svelte +10 -10
  53. package/dist/components/icons/IconCopyCheckFilled.svelte +10 -10
  54. package/dist/components/icons/IconHamburger.svelte +10 -10
  55. package/dist/components/icons/IconLanguage.svelte +10 -10
  56. package/dist/components/icons/IconLoader2.svelte +10 -10
  57. package/dist/components/icons/IconLogout.svelte +10 -10
  58. package/dist/components/icons/IconMoon.svelte +10 -10
  59. package/dist/components/icons/IconPointFilled.svelte +10 -10
  60. package/dist/components/icons/IconSearch.svelte +10 -10
  61. package/dist/components/icons/IconSettings.svelte +10 -10
  62. package/dist/components/icons/IconSun.svelte +10 -10
  63. package/dist/components/icons/IconSwitchHorizontal.svelte +10 -10
  64. package/dist/components/icons/IconSwitchVertical.svelte +10 -10
  65. package/dist/components/icons/IconTransform.svelte +10 -10
  66. package/dist/components/icons/IconX.svelte +10 -10
  67. package/dist/components/icons/Icons.d.ts +2 -22
  68. package/dist/components/input/Input.d.ts +2 -62
  69. package/dist/components/input/Input.svelte +24 -24
  70. package/dist/components/label/Label.d.ts +1 -1
  71. package/dist/components/label/Label.svelte +18 -18
  72. package/dist/components/language-picker-button/LanguagePickerButton.d.ts +1 -1
  73. package/dist/components/language-picker-button/LanguagePickerButton.svelte +80 -80
  74. package/dist/components/light-dark-toggle/LightDarkToggle.d.ts +1 -1
  75. package/dist/components/light-dark-toggle/LightDarkToggle.svelte +38 -38
  76. package/dist/components/popover/Popover.d.ts +1 -1
  77. package/dist/components/popover/Popover.svelte +158 -158
  78. package/dist/components/popover-responsive/PopoverResponsive.d.ts +1 -1
  79. package/dist/components/popover-responsive/PopoverResponsive.svelte +86 -86
  80. package/dist/components/select/Select.d.ts +2 -62
  81. package/dist/components/select/Select.svelte +14 -14
  82. package/dist/components/select/select.scss +5 -5
  83. package/dist/components/side-navigation/SideNavigation.d.ts +2 -1
  84. package/dist/components/side-navigation/SideNavigation.svelte +131 -127
  85. package/dist/components/side-navigation/SideNavigationItem.svelte +17 -17
  86. package/dist/components/side-navigation/SideNavigationLayout.svelte +21 -21
  87. package/dist/components/side-navigation/SideNavigationLayout.svelte.d.ts +1 -0
  88. package/dist/components/side-navigation/sidenav.scss +161 -161
  89. package/dist/components/slider/Slider.d.ts +1 -1
  90. package/dist/components/slider/Slider.svelte +189 -189
  91. package/dist/components/star-rating/StarRating.d.ts +2 -26
  92. package/dist/components/star-rating/StarRating.svelte +81 -81
  93. package/dist/components/switch/Switch.d.ts +1 -1
  94. package/dist/components/switch/Switch.svelte +35 -35
  95. package/dist/components/tabs/Tabs.svelte.d.ts +9 -11
  96. package/dist/components/tabs/Tabs.svelte.js +10 -17
  97. package/dist/components/tabs/components/Tabs.svelte +32 -32
  98. package/dist/components/tabs/components/TabsContent.svelte +36 -36
  99. package/dist/components/tabs/components/TabsItem.svelte +31 -31
  100. package/dist/components/tabs/components/TabsList.svelte +57 -57
  101. package/dist/components/tera-ui-context/TeraUiContext.svelte +28 -28
  102. package/dist/components/text-area/TextArea.d.ts +2 -74
  103. package/dist/components/text-area/TextArea.svelte +88 -88
  104. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.d.ts +1 -1
  105. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte +68 -67
  106. package/dist/index.d.ts +1 -1
  107. package/dist/index.js +1 -1
  108. package/dist/paraglide/messages/_index.d.ts +7 -0
  109. package/dist/paraglide/messages/_index.js +8 -0
  110. package/dist/paraglide/messages/text_account_settings.d.ts +3 -0
  111. package/dist/paraglide/messages/text_account_settings.js +238 -0
  112. package/dist/paraglide/messages/text_calces_documentation.d.ts +3 -0
  113. package/dist/paraglide/messages/text_calces_documentation.js +238 -0
  114. package/dist/paraglide/messages/text_calces_scientific_calculator.d.ts +3 -0
  115. package/dist/paraglide/messages/text_calces_scientific_calculator.js +238 -0
  116. package/dist/paraglide/messages/text_currency_converter.d.ts +3 -0
  117. package/dist/paraglide/messages/text_currency_converter.js +238 -0
  118. package/dist/paraglide/messages/text_logout.d.ts +3 -0
  119. package/dist/paraglide/messages/text_logout.js +238 -0
  120. package/dist/paraglide/messages/text_select_language.d.ts +3 -0
  121. package/dist/paraglide/messages/text_select_language.js +238 -0
  122. package/dist/paraglide/messages/text_unit_converter.d.ts +3 -0
  123. package/dist/paraglide/messages/text_unit_converter.js +238 -0
  124. package/dist/paraglide/messages.d.ts +2 -21
  125. package/dist/paraglide/messages.js +4 -486
  126. package/dist/paraglide/registry.d.ts +21 -0
  127. package/dist/paraglide/registry.js +31 -0
  128. package/dist/paraglide/runtime.d.ts +442 -29
  129. package/dist/paraglide/runtime.js +1292 -80
  130. package/dist/paraglide/server.d.ts +67 -0
  131. package/dist/paraglide/server.js +188 -0
  132. package/dist/tera-i18n/README.md +105 -105
  133. package/dist/tera-i18n/assets/world-flags/Algeria.svg +13 -13
  134. package/dist/tera-i18n/assets/world-flags/East Timor.svg +13 -13
  135. package/dist/tera-i18n/assets/world-flags/Rapa Nui.svg +11 -11
  136. package/dist/tera-i18n/assets/world-flags/abkhazia.svg +23 -23
  137. package/dist/tera-i18n/assets/world-flags/afghanistan.svg +14 -14
  138. package/dist/tera-i18n/assets/world-flags/aland islands.svg +15 -15
  139. package/dist/tera-i18n/assets/world-flags/albania.svg +11 -11
  140. package/dist/tera-i18n/assets/world-flags/american samoa.svg +15 -15
  141. package/dist/tera-i18n/assets/world-flags/andorra.svg +15 -15
  142. package/dist/tera-i18n/assets/world-flags/angola.svg +14 -14
  143. package/dist/tera-i18n/assets/world-flags/anguilla.svg +19 -19
  144. package/dist/tera-i18n/assets/world-flags/antigua and barbuda.svg +15 -15
  145. package/dist/tera-i18n/assets/world-flags/argentina.svg +13 -13
  146. package/dist/tera-i18n/assets/world-flags/armenia.svg +12 -12
  147. package/dist/tera-i18n/assets/world-flags/aruba.svg +15 -15
  148. package/dist/tera-i18n/assets/world-flags/australia.svg +21 -21
  149. package/dist/tera-i18n/assets/world-flags/austria.svg +12 -12
  150. package/dist/tera-i18n/assets/world-flags/azerbaijan.svg +14 -14
  151. package/dist/tera-i18n/assets/world-flags/azores islands.svg +21 -21
  152. package/dist/tera-i18n/assets/world-flags/bahamas.svg +13 -13
  153. package/dist/tera-i18n/assets/world-flags/bahrain.svg +11 -11
  154. package/dist/tera-i18n/assets/world-flags/balearic islands.svg +16 -16
  155. package/dist/tera-i18n/assets/world-flags/bangladesh.svg +11 -11
  156. package/dist/tera-i18n/assets/world-flags/barbados.svg +13 -13
  157. package/dist/tera-i18n/assets/world-flags/basque country.svg +20 -20
  158. package/dist/tera-i18n/assets/world-flags/belarus.svg +18 -18
  159. package/dist/tera-i18n/assets/world-flags/belgium.svg +12 -12
  160. package/dist/tera-i18n/assets/world-flags/belize.svg +17 -17
  161. package/dist/tera-i18n/assets/world-flags/benin.svg +12 -12
  162. package/dist/tera-i18n/assets/world-flags/bermuda.svg +20 -20
  163. package/dist/tera-i18n/assets/world-flags/bhutan.svg +13 -13
  164. package/dist/tera-i18n/assets/world-flags/bolivia.svg +12 -12
  165. package/dist/tera-i18n/assets/world-flags/bonaire.svg +14 -14
  166. package/dist/tera-i18n/assets/world-flags/bosnia and herzegovina.svg +13 -13
  167. package/dist/tera-i18n/assets/world-flags/botswana.svg +13 -13
  168. package/dist/tera-i18n/assets/world-flags/brazil.svg +14 -14
  169. package/dist/tera-i18n/assets/world-flags/british columbia.svg +31 -31
  170. package/dist/tera-i18n/assets/world-flags/british indian ocean territory.svg +29 -29
  171. package/dist/tera-i18n/assets/world-flags/british virgin islands.svg +24 -24
  172. package/dist/tera-i18n/assets/world-flags/brunei.svg +19 -19
  173. package/dist/tera-i18n/assets/world-flags/bulgaria.svg +12 -12
  174. package/dist/tera-i18n/assets/world-flags/burkina faso.svg +12 -12
  175. package/dist/tera-i18n/assets/world-flags/burundi.svg +18 -18
  176. package/dist/tera-i18n/assets/world-flags/cambodia.svg +13 -13
  177. package/dist/tera-i18n/assets/world-flags/cameroon.svg +13 -13
  178. package/dist/tera-i18n/assets/world-flags/canada.svg +13 -13
  179. package/dist/tera-i18n/assets/world-flags/canary islands.svg +12 -12
  180. package/dist/tera-i18n/assets/world-flags/cape verde.svg +23 -23
  181. package/dist/tera-i18n/assets/world-flags/catalonia.svg +7 -7
  182. package/dist/tera-i18n/assets/world-flags/cayman islands.svg +20 -20
  183. package/dist/tera-i18n/assets/world-flags/central african republic.svg +20 -20
  184. package/dist/tera-i18n/assets/world-flags/ceuta.svg +29 -29
  185. package/dist/tera-i18n/assets/world-flags/chad.svg +12 -12
  186. package/dist/tera-i18n/assets/world-flags/chile.svg +13 -13
  187. package/dist/tera-i18n/assets/world-flags/china.svg +15 -15
  188. package/dist/tera-i18n/assets/world-flags/cocos island.svg +19 -19
  189. package/dist/tera-i18n/assets/world-flags/colombia.svg +12 -12
  190. package/dist/tera-i18n/assets/world-flags/comoros.svg +19 -19
  191. package/dist/tera-i18n/assets/world-flags/cook islands.svg +22 -22
  192. package/dist/tera-i18n/assets/world-flags/corsica.svg +12 -12
  193. package/dist/tera-i18n/assets/world-flags/costa rica.svg +13 -13
  194. package/dist/tera-i18n/assets/world-flags/croatia.svg +31 -31
  195. package/dist/tera-i18n/assets/world-flags/cuba.svg +16 -16
  196. package/dist/tera-i18n/assets/world-flags/curacao.svg +14 -14
  197. package/dist/tera-i18n/assets/world-flags/cyprus.svg +12 -12
  198. package/dist/tera-i18n/assets/world-flags/czech republic.svg +12 -12
  199. package/dist/tera-i18n/assets/world-flags/democratic republic of congo.svg +14 -14
  200. package/dist/tera-i18n/assets/world-flags/denmark.svg +14 -14
  201. package/dist/tera-i18n/assets/world-flags/djibouti.svg +13 -13
  202. package/dist/tera-i18n/assets/world-flags/dominica.svg +34 -34
  203. package/dist/tera-i18n/assets/world-flags/dominican republic.svg +17 -17
  204. package/dist/tera-i18n/assets/world-flags/ecuador.svg +15 -15
  205. package/dist/tera-i18n/assets/world-flags/egypt.svg +13 -13
  206. package/dist/tera-i18n/assets/world-flags/el salvador.svg +15 -15
  207. package/dist/tera-i18n/assets/world-flags/england.svg +11 -11
  208. package/dist/tera-i18n/assets/world-flags/equatorial guinea.svg +16 -16
  209. package/dist/tera-i18n/assets/world-flags/eritrea.svg +13 -13
  210. package/dist/tera-i18n/assets/world-flags/estonia.svg +12 -12
  211. package/dist/tera-i18n/assets/world-flags/ethiopia.svg +15 -15
  212. package/dist/tera-i18n/assets/world-flags/european union.svg +18 -18
  213. package/dist/tera-i18n/assets/world-flags/falkland islands.svg +18 -18
  214. package/dist/tera-i18n/assets/world-flags/faroe islands.svg +12 -12
  215. package/dist/tera-i18n/assets/world-flags/fiji.svg +18 -18
  216. package/dist/tera-i18n/assets/world-flags/finland.svg +11 -11
  217. package/dist/tera-i18n/assets/world-flags/france.svg +12 -12
  218. package/dist/tera-i18n/assets/world-flags/french polynesia.svg +17 -17
  219. package/dist/tera-i18n/assets/world-flags/gabon.svg +12 -12
  220. package/dist/tera-i18n/assets/world-flags/galapagos islands.svg +12 -12
  221. package/dist/tera-i18n/assets/world-flags/gambia.svg +13 -13
  222. package/dist/tera-i18n/assets/world-flags/georgia.svg +15 -15
  223. package/dist/tera-i18n/assets/world-flags/germany.svg +12 -12
  224. package/dist/tera-i18n/assets/world-flags/ghana.svg +13 -13
  225. package/dist/tera-i18n/assets/world-flags/gibraltar.svg +13 -13
  226. package/dist/tera-i18n/assets/world-flags/greece.svg +15 -15
  227. package/dist/tera-i18n/assets/world-flags/greenland.svg +13 -13
  228. package/dist/tera-i18n/assets/world-flags/grenada.svg +27 -27
  229. package/dist/tera-i18n/assets/world-flags/guam.svg +18 -18
  230. package/dist/tera-i18n/assets/world-flags/guatemala.svg +14 -14
  231. package/dist/tera-i18n/assets/world-flags/guernsey.svg +12 -12
  232. package/dist/tera-i18n/assets/world-flags/guinea bissau.svg +14 -14
  233. package/dist/tera-i18n/assets/world-flags/guinea.svg +12 -12
  234. package/dist/tera-i18n/assets/world-flags/guyana.svg +15 -15
  235. package/dist/tera-i18n/assets/world-flags/haiti.svg +17 -17
  236. package/dist/tera-i18n/assets/world-flags/hawaii.svg +15 -15
  237. package/dist/tera-i18n/assets/world-flags/honduras.svg +17 -17
  238. package/dist/tera-i18n/assets/world-flags/hong kong.svg +15 -15
  239. package/dist/tera-i18n/assets/world-flags/hungary.svg +12 -12
  240. package/dist/tera-i18n/assets/world-flags/iceland.svg +15 -15
  241. package/dist/tera-i18n/assets/world-flags/india.svg +15 -15
  242. package/dist/tera-i18n/assets/world-flags/indonesia.svg +11 -11
  243. package/dist/tera-i18n/assets/world-flags/iran.svg +13 -13
  244. package/dist/tera-i18n/assets/world-flags/iraq.svg +15 -15
  245. package/dist/tera-i18n/assets/world-flags/ireland.svg +12 -12
  246. package/dist/tera-i18n/assets/world-flags/isle of man.svg +11 -11
  247. package/dist/tera-i18n/assets/world-flags/israel.svg +13 -13
  248. package/dist/tera-i18n/assets/world-flags/italy.svg +12 -12
  249. package/dist/tera-i18n/assets/world-flags/ivory coast.svg +12 -12
  250. package/dist/tera-i18n/assets/world-flags/jamaica.svg +14 -14
  251. package/dist/tera-i18n/assets/world-flags/japan.svg +11 -11
  252. package/dist/tera-i18n/assets/world-flags/jersey.svg +13 -13
  253. package/dist/tera-i18n/assets/world-flags/jordan.svg +14 -14
  254. package/dist/tera-i18n/assets/world-flags/kazakhstan.svg +13 -13
  255. package/dist/tera-i18n/assets/world-flags/kenya.svg +19 -19
  256. package/dist/tera-i18n/assets/world-flags/kiribati.svg +17 -17
  257. package/dist/tera-i18n/assets/world-flags/kosovo.svg +17 -17
  258. package/dist/tera-i18n/assets/world-flags/kuwait.svg +13 -13
  259. package/dist/tera-i18n/assets/world-flags/kyrgyzstan.svg +16 -16
  260. package/dist/tera-i18n/assets/world-flags/laos.svg +13 -13
  261. package/dist/tera-i18n/assets/world-flags/latvia.svg +12 -12
  262. package/dist/tera-i18n/assets/world-flags/lebanon.svg +13 -13
  263. package/dist/tera-i18n/assets/world-flags/lesotho.svg +13 -13
  264. package/dist/tera-i18n/assets/world-flags/liberia.svg +23 -23
  265. package/dist/tera-i18n/assets/world-flags/libya.svg +14 -14
  266. package/dist/tera-i18n/assets/world-flags/liechtenstein.svg +12 -12
  267. package/dist/tera-i18n/assets/world-flags/lithuania.svg +12 -12
  268. package/dist/tera-i18n/assets/world-flags/luxembourg.svg +12 -12
  269. package/dist/tera-i18n/assets/world-flags/macao.svg +18 -18
  270. package/dist/tera-i18n/assets/world-flags/madagascar.svg +12 -12
  271. package/dist/tera-i18n/assets/world-flags/madeira.svg +14 -14
  272. package/dist/tera-i18n/assets/world-flags/malawi.svg +13 -13
  273. package/dist/tera-i18n/assets/world-flags/malaysia.svg +17 -17
  274. package/dist/tera-i18n/assets/world-flags/maldives.svg +12 -12
  275. package/dist/tera-i18n/assets/world-flags/mali.svg +12 -12
  276. package/dist/tera-i18n/assets/world-flags/malta.svg +12 -12
  277. package/dist/tera-i18n/assets/world-flags/marshall island.svg +13 -13
  278. package/dist/tera-i18n/assets/world-flags/martinique.svg +18 -18
  279. package/dist/tera-i18n/assets/world-flags/mauritania.svg +12 -12
  280. package/dist/tera-i18n/assets/world-flags/mauritius.svg +13 -13
  281. package/dist/tera-i18n/assets/world-flags/melilla.svg +25 -25
  282. package/dist/tera-i18n/assets/world-flags/mexico.svg +14 -14
  283. package/dist/tera-i18n/assets/world-flags/micronesia.svg +14 -14
  284. package/dist/tera-i18n/assets/world-flags/moldova.svg +15 -15
  285. package/dist/tera-i18n/assets/world-flags/monaco.svg +11 -11
  286. package/dist/tera-i18n/assets/world-flags/mongolia.svg +19 -19
  287. package/dist/tera-i18n/assets/world-flags/montenegro.svg +15 -15
  288. package/dist/tera-i18n/assets/world-flags/montserrat.svg +17 -17
  289. package/dist/tera-i18n/assets/world-flags/morocco.svg +11 -11
  290. package/dist/tera-i18n/assets/world-flags/mozambique.svg +17 -17
  291. package/dist/tera-i18n/assets/world-flags/myanmar.svg +13 -13
  292. package/dist/tera-i18n/assets/world-flags/namibia.svg +14 -14
  293. package/dist/tera-i18n/assets/world-flags/nato.svg +19 -19
  294. package/dist/tera-i18n/assets/world-flags/nauru.svg +14 -14
  295. package/dist/tera-i18n/assets/world-flags/nepal.svg +16 -16
  296. package/dist/tera-i18n/assets/world-flags/netherlands.svg +12 -12
  297. package/dist/tera-i18n/assets/world-flags/new zealand.svg +18 -18
  298. package/dist/tera-i18n/assets/world-flags/nicaragua.svg +16 -16
  299. package/dist/tera-i18n/assets/world-flags/niger.svg +13 -13
  300. package/dist/tera-i18n/assets/world-flags/nigeria.svg +12 -12
  301. package/dist/tera-i18n/assets/world-flags/niue.svg +20 -20
  302. package/dist/tera-i18n/assets/world-flags/norfolk island.svg +13 -13
  303. package/dist/tera-i18n/assets/world-flags/north korea.svg +15 -15
  304. package/dist/tera-i18n/assets/world-flags/northern cyprus.svg +14 -14
  305. package/dist/tera-i18n/assets/world-flags/northern marianas islands.svg +14 -14
  306. package/dist/tera-i18n/assets/world-flags/norway.svg +15 -15
  307. package/dist/tera-i18n/assets/world-flags/oman.svg +15 -15
  308. package/dist/tera-i18n/assets/world-flags/orkney islands.svg +15 -15
  309. package/dist/tera-i18n/assets/world-flags/ossetia.svg +12 -12
  310. package/dist/tera-i18n/assets/world-flags/pakistan.svg +14 -14
  311. package/dist/tera-i18n/assets/world-flags/palau.svg +11 -11
  312. package/dist/tera-i18n/assets/world-flags/palestine.svg +13 -13
  313. package/dist/tera-i18n/assets/world-flags/panama.svg +14 -14
  314. package/dist/tera-i18n/assets/world-flags/papua new guinea.svg +17 -17
  315. package/dist/tera-i18n/assets/world-flags/paraguay.svg +14 -14
  316. package/dist/tera-i18n/assets/world-flags/peru.svg +12 -12
  317. package/dist/tera-i18n/assets/world-flags/philippines.svg +16 -16
  318. package/dist/tera-i18n/assets/world-flags/pitcairn islands.svg +18 -18
  319. package/dist/tera-i18n/assets/world-flags/poland.svg +11 -11
  320. package/dist/tera-i18n/assets/world-flags/portugal.svg +14 -14
  321. package/dist/tera-i18n/assets/world-flags/puerto rico.svg +15 -15
  322. package/dist/tera-i18n/assets/world-flags/qatar.svg +11 -11
  323. package/dist/tera-i18n/assets/world-flags/republic of macedonia.svg +20 -20
  324. package/dist/tera-i18n/assets/world-flags/republic of the congo.svg +12 -12
  325. package/dist/tera-i18n/assets/world-flags/romania.svg +12 -12
  326. package/dist/tera-i18n/assets/world-flags/russia.svg +12 -12
  327. package/dist/tera-i18n/assets/world-flags/rwanda.svg +13 -13
  328. package/dist/tera-i18n/assets/world-flags/saba island.svg +15 -15
  329. package/dist/tera-i18n/assets/world-flags/sahrawi arab democratic republic.svg +15 -15
  330. package/dist/tera-i18n/assets/world-flags/samoa.svg +16 -16
  331. package/dist/tera-i18n/assets/world-flags/san marino.svg +16 -16
  332. package/dist/tera-i18n/assets/world-flags/sao tome and prince.svg +15 -15
  333. package/dist/tera-i18n/assets/world-flags/sardinia.svg +23 -23
  334. package/dist/tera-i18n/assets/world-flags/saudi arabia.svg +16 -16
  335. package/dist/tera-i18n/assets/world-flags/scotland.svg +14 -14
  336. package/dist/tera-i18n/assets/world-flags/senegal.svg +13 -13
  337. package/dist/tera-i18n/assets/world-flags/serbia.svg +16 -16
  338. package/dist/tera-i18n/assets/world-flags/seychelles.svg +14 -14
  339. package/dist/tera-i18n/assets/world-flags/sierra leone.svg +12 -12
  340. package/dist/tera-i18n/assets/world-flags/singapore.svg +17 -17
  341. package/dist/tera-i18n/assets/world-flags/sint eustatius.svg +20 -20
  342. package/dist/tera-i18n/assets/world-flags/sint maarten.svg +17 -17
  343. package/dist/tera-i18n/assets/world-flags/slovakia.svg +16 -16
  344. package/dist/tera-i18n/assets/world-flags/slovenia.svg +13 -13
  345. package/dist/tera-i18n/assets/world-flags/solomon islands.svg +17 -17
  346. package/dist/tera-i18n/assets/world-flags/somalia.svg +11 -11
  347. package/dist/tera-i18n/assets/world-flags/somaliland.svg +18 -18
  348. package/dist/tera-i18n/assets/world-flags/south africa.svg +15 -15
  349. package/dist/tera-i18n/assets/world-flags/south korea.svg +30 -30
  350. package/dist/tera-i18n/assets/world-flags/south sudan.svg +15 -15
  351. package/dist/tera-i18n/assets/world-flags/spain.svg +676 -676
  352. package/dist/tera-i18n/assets/world-flags/sri lanka.svg +15 -15
  353. package/dist/tera-i18n/assets/world-flags/st barts.svg +16 -16
  354. package/dist/tera-i18n/assets/world-flags/st lucia.svg +13 -13
  355. package/dist/tera-i18n/assets/world-flags/st vincent and the grenadines.svg +15 -15
  356. package/dist/tera-i18n/assets/world-flags/sudan.svg +13 -13
  357. package/dist/tera-i18n/assets/world-flags/suriname.svg +14 -14
  358. package/dist/tera-i18n/assets/world-flags/swaziland.svg +21 -21
  359. package/dist/tera-i18n/assets/world-flags/sweden.svg +14 -14
  360. package/dist/tera-i18n/assets/world-flags/switzerland.svg +11 -11
  361. package/dist/tera-i18n/assets/world-flags/syria.svg +14 -14
  362. package/dist/tera-i18n/assets/world-flags/taiwan.svg +14 -14
  363. package/dist/tera-i18n/assets/world-flags/tajikistan.svg +20 -20
  364. package/dist/tera-i18n/assets/world-flags/tanzania.svg +13 -13
  365. package/dist/tera-i18n/assets/world-flags/thailand.svg +13 -13
  366. package/dist/tera-i18n/assets/world-flags/tibet.svg +22 -22
  367. package/dist/tera-i18n/assets/world-flags/togo.svg +15 -15
  368. package/dist/tera-i18n/assets/world-flags/tokelau.svg +15 -15
  369. package/dist/tera-i18n/assets/world-flags/tonga.svg +12 -12
  370. package/dist/tera-i18n/assets/world-flags/transnistria.svg +12 -12
  371. package/dist/tera-i18n/assets/world-flags/trinidad and tobago.svg +13 -13
  372. package/dist/tera-i18n/assets/world-flags/tunisia.svg +13 -13
  373. package/dist/tera-i18n/assets/world-flags/turkey.svg +12 -12
  374. package/dist/tera-i18n/assets/world-flags/turkmenistan.svg +30 -30
  375. package/dist/tera-i18n/assets/world-flags/turks and caicos.svg +19 -19
  376. package/dist/tera-i18n/assets/world-flags/tuvalu.svg +25 -25
  377. package/dist/tera-i18n/assets/world-flags/uganda.svg +16 -16
  378. package/dist/tera-i18n/assets/world-flags/ukraine.svg +11 -11
  379. package/dist/tera-i18n/assets/world-flags/united arab emirates.svg +13 -13
  380. package/dist/tera-i18n/assets/world-flags/united kingdom.svg +23 -23
  381. package/dist/tera-i18n/assets/world-flags/united nations.svg +12 -12
  382. package/dist/tera-i18n/assets/world-flags/united states.svg +15 -15
  383. package/dist/tera-i18n/assets/world-flags/uruguay.svg +16 -16
  384. package/dist/tera-i18n/assets/world-flags/uzbekista/314/201n.svg +27 -27
  385. package/dist/tera-i18n/assets/world-flags/uzbekist/303/241n.svg +27 -0
  386. package/dist/tera-i18n/assets/world-flags/vanuatu.svg +32 -32
  387. package/dist/tera-i18n/assets/world-flags/vatican city.svg +13 -13
  388. package/dist/tera-i18n/assets/world-flags/venezuela.svg +20 -20
  389. package/dist/tera-i18n/assets/world-flags/vietnam.svg +11 -11
  390. package/dist/tera-i18n/assets/world-flags/virgin islands.svg +18 -18
  391. package/dist/tera-i18n/assets/world-flags/wales.svg +12 -12
  392. package/dist/tera-i18n/assets/world-flags/yemen.svg +12 -12
  393. package/dist/tera-i18n/assets/world-flags/zambia.svg +14 -14
  394. package/dist/tera-i18n/assets/world-flags/zimbabwe.svg +20 -20
  395. package/dist/tera-i18n/dev-tools/translator/.env +1 -1
  396. package/dist/tera-i18n/dev-tools/translator/gpt-translator-i18n-message.js +32 -8
  397. package/dist/tera-i18n/dev-tools/translator/package-lock.json +990 -990
  398. package/dist/tera-i18n/dev-tools/translator/package.json +20 -20
  399. package/dist/tera-i18n/dev-tools/translator/prompt/i18n-message-translate-prompt-cv-maker.txt +18 -0
  400. package/dist/tera-i18n/dev-tools/translator/prompt/i18n-message-translate-prompt-system.txt +1 -0
  401. package/dist/tera-i18n/dev-tools/translator/prompt/i18n-message-translate-prompt.txt +14 -8
  402. package/dist/tera-i18n/dev-tools/translator/tsconfig.json +16 -16
  403. package/dist/tera-i18n/projects/common/all-language-data.d.ts +3 -3
  404. package/dist/tera-i18n/projects/common/all-language-data.js +21 -0
  405. package/dist/tera-i18n/projects/common/types/language.d.ts +6 -6
  406. package/dist/tera-i18n/projects/cv-maker/messages/ar.json +49 -0
  407. package/dist/tera-i18n/projects/cv-maker/messages/bg.json +49 -0
  408. package/dist/tera-i18n/projects/cv-maker/messages/bn.json +49 -0
  409. package/dist/tera-i18n/projects/cv-maker/messages/ca.json +49 -0
  410. package/dist/tera-i18n/projects/cv-maker/messages/cs.json +49 -0
  411. package/dist/tera-i18n/projects/cv-maker/messages/da.json +49 -0
  412. package/dist/tera-i18n/projects/cv-maker/messages/de.json +49 -0
  413. package/dist/tera-i18n/projects/cv-maker/messages/el.json +49 -0
  414. package/dist/tera-i18n/projects/cv-maker/messages/en.json +60 -0
  415. package/dist/tera-i18n/projects/cv-maker/messages/es.json +49 -0
  416. package/dist/tera-i18n/projects/cv-maker/messages/fi.json +49 -0
  417. package/dist/tera-i18n/projects/cv-maker/messages/fr.json +49 -0
  418. package/dist/tera-i18n/projects/cv-maker/messages/he.json +49 -0
  419. package/dist/tera-i18n/projects/cv-maker/messages/hi.json +49 -0
  420. package/dist/tera-i18n/projects/cv-maker/messages/hu.json +49 -0
  421. package/dist/tera-i18n/projects/cv-maker/messages/id.json +49 -0
  422. package/dist/tera-i18n/projects/cv-maker/messages/it.json +49 -0
  423. package/dist/tera-i18n/projects/cv-maker/messages/ja.json +49 -0
  424. package/dist/tera-i18n/projects/cv-maker/messages/ko.json +49 -0
  425. package/dist/tera-i18n/projects/cv-maker/messages/lt.json +49 -0
  426. package/dist/tera-i18n/projects/cv-maker/messages/lv.json +49 -0
  427. package/dist/tera-i18n/projects/cv-maker/messages/ms.json +49 -0
  428. package/dist/tera-i18n/projects/cv-maker/messages/nl.json +49 -0
  429. package/dist/tera-i18n/projects/cv-maker/messages/no.json +49 -0
  430. package/dist/tera-i18n/projects/cv-maker/messages/pl.json +49 -0
  431. package/dist/tera-i18n/projects/cv-maker/messages/pt.json +49 -0
  432. package/dist/tera-i18n/projects/cv-maker/messages/ro.json +49 -0
  433. package/dist/tera-i18n/projects/cv-maker/messages/ru.json +49 -0
  434. package/dist/tera-i18n/projects/cv-maker/messages/sk.json +49 -0
  435. package/dist/tera-i18n/projects/cv-maker/messages/sl.json +49 -0
  436. package/dist/tera-i18n/projects/cv-maker/messages/sq.json +49 -0
  437. package/dist/tera-i18n/projects/cv-maker/messages/sr.json +49 -0
  438. package/dist/tera-i18n/projects/cv-maker/messages/sv.json +49 -0
  439. package/dist/tera-i18n/projects/cv-maker/messages/sw.json +49 -0
  440. package/dist/tera-i18n/projects/cv-maker/messages/ta.json +49 -0
  441. package/dist/tera-i18n/projects/cv-maker/messages/te.json +49 -0
  442. package/dist/tera-i18n/projects/cv-maker/messages/th.json +49 -0
  443. package/dist/tera-i18n/projects/cv-maker/messages/tl.json +49 -0
  444. package/dist/tera-i18n/projects/cv-maker/messages/tr.json +49 -0
  445. package/dist/tera-i18n/projects/cv-maker/messages/uk.json +49 -0
  446. package/dist/tera-i18n/projects/cv-maker/messages/vi.json +49 -0
  447. package/dist/tera-i18n/projects/cv-maker/messages/zh-CN.json +49 -0
  448. package/dist/tera-i18n/projects/cv-maker/messages/zh-TW.json +49 -0
  449. package/dist/tera-i18n/projects/cv-maker/project.inlang/project_id +1 -0
  450. package/dist/tera-i18n/projects/cv-maker/project.inlang/settings.json +61 -0
  451. package/dist/tera-i18n/projects/cv-maker/supported-language.d.ts +1 -0
  452. package/dist/tera-i18n/projects/cv-maker/supported-language.js +45 -0
  453. package/dist/tera-i18n/projects/tera-calculator/messages/ar.json +105 -105
  454. package/dist/tera-i18n/projects/tera-calculator/messages/bg.json +105 -105
  455. package/dist/tera-i18n/projects/tera-calculator/messages/bn.json +105 -105
  456. package/dist/tera-i18n/projects/tera-calculator/messages/ca.json +105 -105
  457. package/dist/tera-i18n/projects/tera-calculator/messages/cs.json +105 -105
  458. package/dist/tera-i18n/projects/tera-calculator/messages/da.json +105 -105
  459. package/dist/tera-i18n/projects/tera-calculator/messages/de.json +105 -105
  460. package/dist/tera-i18n/projects/tera-calculator/messages/el.json +105 -105
  461. package/dist/tera-i18n/projects/tera-calculator/messages/en.json +105 -105
  462. package/dist/tera-i18n/projects/tera-calculator/messages/es.json +105 -105
  463. package/dist/tera-i18n/projects/tera-calculator/messages/fi.json +105 -105
  464. package/dist/tera-i18n/projects/tera-calculator/messages/fr.json +105 -105
  465. package/dist/tera-i18n/projects/tera-calculator/messages/he.json +105 -105
  466. package/dist/tera-i18n/projects/tera-calculator/messages/hi.json +105 -105
  467. package/dist/tera-i18n/projects/tera-calculator/messages/hu.json +105 -105
  468. package/dist/tera-i18n/projects/tera-calculator/messages/id.json +105 -105
  469. package/dist/tera-i18n/projects/tera-calculator/messages/it.json +105 -105
  470. package/dist/tera-i18n/projects/tera-calculator/messages/ja.json +105 -105
  471. package/dist/tera-i18n/projects/tera-calculator/messages/ko.json +105 -105
  472. package/dist/tera-i18n/projects/tera-calculator/messages/lt.json +105 -105
  473. package/dist/tera-i18n/projects/tera-calculator/messages/lv.json +105 -105
  474. package/dist/tera-i18n/projects/tera-calculator/messages/ms.json +105 -105
  475. package/dist/tera-i18n/projects/tera-calculator/messages/nl.json +105 -105
  476. package/dist/tera-i18n/projects/tera-calculator/messages/no.json +105 -105
  477. package/dist/tera-i18n/projects/tera-calculator/messages/pl.json +105 -105
  478. package/dist/tera-i18n/projects/tera-calculator/messages/pt.json +105 -105
  479. package/dist/tera-i18n/projects/tera-calculator/messages/ro.json +105 -105
  480. package/dist/tera-i18n/projects/tera-calculator/messages/ru.json +105 -105
  481. package/dist/tera-i18n/projects/tera-calculator/messages/sk.json +105 -105
  482. package/dist/tera-i18n/projects/tera-calculator/messages/sl.json +105 -105
  483. package/dist/tera-i18n/projects/tera-calculator/messages/sq.json +105 -105
  484. package/dist/tera-i18n/projects/tera-calculator/messages/sr.json +105 -105
  485. package/dist/tera-i18n/projects/tera-calculator/messages/sv.json +105 -105
  486. package/dist/tera-i18n/projects/tera-calculator/messages/sw.json +105 -105
  487. package/dist/tera-i18n/projects/tera-calculator/messages/ta.json +105 -105
  488. package/dist/tera-i18n/projects/tera-calculator/messages/te.json +105 -105
  489. package/dist/tera-i18n/projects/tera-calculator/messages/th.json +105 -105
  490. package/dist/tera-i18n/projects/tera-calculator/messages/tl.json +105 -105
  491. package/dist/tera-i18n/projects/tera-calculator/messages/tr.json +105 -105
  492. package/dist/tera-i18n/projects/tera-calculator/messages/uk.json +105 -105
  493. package/dist/tera-i18n/projects/tera-calculator/messages/vi.json +105 -105
  494. package/dist/tera-i18n/projects/tera-calculator/messages/zh-CN.json +105 -105
  495. package/dist/tera-i18n/projects/tera-calculator/messages/zh-TW.json +105 -105
  496. package/dist/tera-i18n/projects/tera-calculator/project.inlang/settings.json +58 -58
  497. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/de.json +1875 -1875
  498. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/en.json +1875 -1875
  499. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/es.json +1875 -1875
  500. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/fr.json +1875 -1875
  501. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/it.json +1875 -1875
  502. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/ja.json +1875 -1875
  503. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/ko.json +1875 -1875
  504. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/pt.json +1875 -1875
  505. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/ru.json +1875 -1875
  506. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/vi.json +1875 -1875
  507. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/zh-CN.json +1875 -1875
  508. package/dist/tera-i18n/projects/tera-converter/messages/de.json +40 -40
  509. package/dist/tera-i18n/projects/tera-converter/messages/en.json +42 -42
  510. package/dist/tera-i18n/projects/tera-converter/messages/es.json +40 -40
  511. package/dist/tera-i18n/projects/tera-converter/messages/fr.json +40 -40
  512. package/dist/tera-i18n/projects/tera-converter/messages/it.json +40 -40
  513. package/dist/tera-i18n/projects/tera-converter/messages/ja.json +40 -40
  514. package/dist/tera-i18n/projects/tera-converter/messages/ko.json +40 -40
  515. package/dist/tera-i18n/projects/tera-converter/messages/pt.json +40 -40
  516. package/dist/tera-i18n/projects/tera-converter/messages/ru.json +40 -40
  517. package/dist/tera-i18n/projects/tera-converter/messages/vi.json +40 -40
  518. package/dist/tera-i18n/projects/tera-converter/messages/zh-CN.json +40 -40
  519. package/dist/tera-i18n/projects/tera-converter/project.inlang/settings.json +26 -26
  520. package/dist/tera-i18n/projects/tera-system-ui/messages/ar.json +9 -9
  521. package/dist/tera-i18n/projects/tera-system-ui/messages/bg.json +9 -9
  522. package/dist/tera-i18n/projects/tera-system-ui/messages/bn.json +9 -9
  523. package/dist/tera-i18n/projects/tera-system-ui/messages/ca.json +9 -9
  524. package/dist/tera-i18n/projects/tera-system-ui/messages/cs.json +9 -9
  525. package/dist/tera-i18n/projects/tera-system-ui/messages/da.json +9 -9
  526. package/dist/tera-i18n/projects/tera-system-ui/messages/de.json +9 -9
  527. package/dist/tera-i18n/projects/tera-system-ui/messages/el.json +9 -9
  528. package/dist/tera-i18n/projects/tera-system-ui/messages/en.json +9 -9
  529. package/dist/tera-i18n/projects/tera-system-ui/messages/es.json +9 -9
  530. package/dist/tera-i18n/projects/tera-system-ui/messages/fi.json +9 -9
  531. package/dist/tera-i18n/projects/tera-system-ui/messages/fr.json +9 -9
  532. package/dist/tera-i18n/projects/tera-system-ui/messages/he.json +9 -9
  533. package/dist/tera-i18n/projects/tera-system-ui/messages/hi.json +9 -9
  534. package/dist/tera-i18n/projects/tera-system-ui/messages/hu.json +9 -9
  535. package/dist/tera-i18n/projects/tera-system-ui/messages/id.json +9 -9
  536. package/dist/tera-i18n/projects/tera-system-ui/messages/it.json +9 -9
  537. package/dist/tera-i18n/projects/tera-system-ui/messages/ja.json +9 -9
  538. package/dist/tera-i18n/projects/tera-system-ui/messages/ko.json +9 -9
  539. package/dist/tera-i18n/projects/tera-system-ui/messages/lt.json +9 -9
  540. package/dist/tera-i18n/projects/tera-system-ui/messages/lv.json +9 -9
  541. package/dist/tera-i18n/projects/tera-system-ui/messages/ms.json +9 -9
  542. package/dist/tera-i18n/projects/tera-system-ui/messages/nl.json +9 -9
  543. package/dist/tera-i18n/projects/tera-system-ui/messages/no.json +9 -9
  544. package/dist/tera-i18n/projects/tera-system-ui/messages/pl.json +9 -9
  545. package/dist/tera-i18n/projects/tera-system-ui/messages/pt.json +9 -9
  546. package/dist/tera-i18n/projects/tera-system-ui/messages/ro.json +9 -9
  547. package/dist/tera-i18n/projects/tera-system-ui/messages/ru.json +9 -9
  548. package/dist/tera-i18n/projects/tera-system-ui/messages/sk.json +9 -9
  549. package/dist/tera-i18n/projects/tera-system-ui/messages/sl.json +9 -9
  550. package/dist/tera-i18n/projects/tera-system-ui/messages/sq.json +9 -9
  551. package/dist/tera-i18n/projects/tera-system-ui/messages/sr.json +9 -9
  552. package/dist/tera-i18n/projects/tera-system-ui/messages/sv.json +9 -9
  553. package/dist/tera-i18n/projects/tera-system-ui/messages/sw.json +9 -9
  554. package/dist/tera-i18n/projects/tera-system-ui/messages/ta.json +9 -9
  555. package/dist/tera-i18n/projects/tera-system-ui/messages/te.json +9 -9
  556. package/dist/tera-i18n/projects/tera-system-ui/messages/th.json +9 -9
  557. package/dist/tera-i18n/projects/tera-system-ui/messages/tl.json +9 -9
  558. package/dist/tera-i18n/projects/tera-system-ui/messages/tr.json +9 -9
  559. package/dist/tera-i18n/projects/tera-system-ui/messages/uk.json +9 -9
  560. package/dist/tera-i18n/projects/tera-system-ui/messages/vi.json +9 -9
  561. package/dist/tera-i18n/projects/tera-system-ui/messages/zh-CN.json +9 -9
  562. package/dist/tera-i18n/projects/tera-system-ui/messages/zh-TW.json +9 -9
  563. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/settings.json +64 -64
  564. package/dist/tera-i18n/projects/tera-tools/messages/ar.json +69 -69
  565. package/dist/tera-i18n/projects/tera-tools/messages/bg.json +69 -69
  566. package/dist/tera-i18n/projects/tera-tools/messages/bn.json +69 -69
  567. package/dist/tera-i18n/projects/tera-tools/messages/ca.json +69 -69
  568. package/dist/tera-i18n/projects/tera-tools/messages/cs.json +69 -69
  569. package/dist/tera-i18n/projects/tera-tools/messages/da.json +69 -69
  570. package/dist/tera-i18n/projects/tera-tools/messages/de.json +69 -69
  571. package/dist/tera-i18n/projects/tera-tools/messages/el.json +69 -69
  572. package/dist/tera-i18n/projects/tera-tools/messages/en.json +96 -96
  573. package/dist/tera-i18n/projects/tera-tools/messages/es.json +69 -69
  574. package/dist/tera-i18n/projects/tera-tools/messages/fi.json +69 -69
  575. package/dist/tera-i18n/projects/tera-tools/messages/fr.json +69 -69
  576. package/dist/tera-i18n/projects/tera-tools/messages/he.json +69 -69
  577. package/dist/tera-i18n/projects/tera-tools/messages/hi.json +69 -69
  578. package/dist/tera-i18n/projects/tera-tools/messages/hu.json +69 -69
  579. package/dist/tera-i18n/projects/tera-tools/messages/id.json +69 -69
  580. package/dist/tera-i18n/projects/tera-tools/messages/it.json +69 -69
  581. package/dist/tera-i18n/projects/tera-tools/messages/ja.json +69 -69
  582. package/dist/tera-i18n/projects/tera-tools/messages/ko.json +69 -69
  583. package/dist/tera-i18n/projects/tera-tools/messages/lt.json +69 -69
  584. package/dist/tera-i18n/projects/tera-tools/messages/lv.json +69 -69
  585. package/dist/tera-i18n/projects/tera-tools/messages/ms.json +69 -69
  586. package/dist/tera-i18n/projects/tera-tools/messages/nl.json +69 -69
  587. package/dist/tera-i18n/projects/tera-tools/messages/no.json +69 -69
  588. package/dist/tera-i18n/projects/tera-tools/messages/pl.json +69 -69
  589. package/dist/tera-i18n/projects/tera-tools/messages/pt.json +69 -69
  590. package/dist/tera-i18n/projects/tera-tools/messages/ro.json +69 -69
  591. package/dist/tera-i18n/projects/tera-tools/messages/ru.json +69 -69
  592. package/dist/tera-i18n/projects/tera-tools/messages/sk.json +69 -69
  593. package/dist/tera-i18n/projects/tera-tools/messages/sl.json +69 -69
  594. package/dist/tera-i18n/projects/tera-tools/messages/sq.json +69 -69
  595. package/dist/tera-i18n/projects/tera-tools/messages/sr.json +69 -69
  596. package/dist/tera-i18n/projects/tera-tools/messages/sv.json +69 -69
  597. package/dist/tera-i18n/projects/tera-tools/messages/sw.json +69 -69
  598. package/dist/tera-i18n/projects/tera-tools/messages/ta.json +69 -69
  599. package/dist/tera-i18n/projects/tera-tools/messages/te.json +69 -69
  600. package/dist/tera-i18n/projects/tera-tools/messages/th.json +69 -69
  601. package/dist/tera-i18n/projects/tera-tools/messages/tl.json +69 -69
  602. package/dist/tera-i18n/projects/tera-tools/messages/tr.json +69 -69
  603. package/dist/tera-i18n/projects/tera-tools/messages/uk.json +69 -69
  604. package/dist/tera-i18n/projects/tera-tools/messages/vi.json +69 -69
  605. package/dist/tera-i18n/projects/tera-tools/messages/zh-CN.json +69 -69
  606. package/dist/tera-i18n/projects/tera-tools/messages/zh-TW.json +69 -69
  607. package/dist/tera-i18n/projects/tera-tools/project.inlang/settings.json +61 -61
  608. package/dist/themes/scrollbar.scss +37 -37
  609. package/dist/themes/tera-ui-base.css +406 -404
  610. package/dist/themes/tw-preset.cjs +159 -159
  611. package/package.json +114 -120
  612. package/scripts/add-component-template.js +121 -121
  613. package/scripts/generate-ts-index.js +139 -138
  614. package/dist/astro/index.d.ts +0 -3
  615. package/dist/astro/index.js +0 -3
  616. package/dist/components/dialog/Dialog.astro +0 -64
  617. package/dist/components/fonts/TeraFontMono.astro +0 -4
  618. package/dist/components/fonts/TeraFontSansSerif.astro +0 -4
  619. package/dist/components/tabs/tabs.svelte.d.ts +0 -3
  620. package/dist/components/tabs/tabs.svelte.js +0 -11
  621. package/dist/i18n.d.ts +0 -1
  622. package/dist/i18n.js +0 -4
  623. package/dist/paraglide/messages/ar.d.ts +0 -7
  624. package/dist/paraglide/messages/ar.js +0 -66
  625. package/dist/paraglide/messages/bg.d.ts +0 -7
  626. package/dist/paraglide/messages/bg.js +0 -66
  627. package/dist/paraglide/messages/bn.d.ts +0 -7
  628. package/dist/paraglide/messages/bn.js +0 -66
  629. package/dist/paraglide/messages/ca.d.ts +0 -7
  630. package/dist/paraglide/messages/ca.js +0 -66
  631. package/dist/paraglide/messages/cs.d.ts +0 -7
  632. package/dist/paraglide/messages/cs.js +0 -66
  633. package/dist/paraglide/messages/da.d.ts +0 -7
  634. package/dist/paraglide/messages/da.js +0 -66
  635. package/dist/paraglide/messages/de.d.ts +0 -7
  636. package/dist/paraglide/messages/de.js +0 -66
  637. package/dist/paraglide/messages/el.d.ts +0 -7
  638. package/dist/paraglide/messages/el.js +0 -66
  639. package/dist/paraglide/messages/en.d.ts +0 -7
  640. package/dist/paraglide/messages/en.js +0 -66
  641. package/dist/paraglide/messages/es.d.ts +0 -7
  642. package/dist/paraglide/messages/es.js +0 -66
  643. package/dist/paraglide/messages/fi.d.ts +0 -7
  644. package/dist/paraglide/messages/fi.js +0 -66
  645. package/dist/paraglide/messages/fr.d.ts +0 -7
  646. package/dist/paraglide/messages/fr.js +0 -66
  647. package/dist/paraglide/messages/he.d.ts +0 -7
  648. package/dist/paraglide/messages/he.js +0 -66
  649. package/dist/paraglide/messages/hi.d.ts +0 -7
  650. package/dist/paraglide/messages/hi.js +0 -66
  651. package/dist/paraglide/messages/hu.d.ts +0 -7
  652. package/dist/paraglide/messages/hu.js +0 -66
  653. package/dist/paraglide/messages/id.d.ts +0 -7
  654. package/dist/paraglide/messages/id.js +0 -66
  655. package/dist/paraglide/messages/it.d.ts +0 -7
  656. package/dist/paraglide/messages/it.js +0 -66
  657. package/dist/paraglide/messages/ja.d.ts +0 -7
  658. package/dist/paraglide/messages/ja.js +0 -66
  659. package/dist/paraglide/messages/ko.d.ts +0 -7
  660. package/dist/paraglide/messages/ko.js +0 -66
  661. package/dist/paraglide/messages/lt.d.ts +0 -7
  662. package/dist/paraglide/messages/lt.js +0 -66
  663. package/dist/paraglide/messages/lv.d.ts +0 -7
  664. package/dist/paraglide/messages/lv.js +0 -66
  665. package/dist/paraglide/messages/ms.d.ts +0 -7
  666. package/dist/paraglide/messages/ms.js +0 -66
  667. package/dist/paraglide/messages/nl.d.ts +0 -7
  668. package/dist/paraglide/messages/nl.js +0 -66
  669. package/dist/paraglide/messages/no.d.ts +0 -7
  670. package/dist/paraglide/messages/no.js +0 -66
  671. package/dist/paraglide/messages/pl.d.ts +0 -7
  672. package/dist/paraglide/messages/pl.js +0 -66
  673. package/dist/paraglide/messages/pt.d.ts +0 -7
  674. package/dist/paraglide/messages/pt.js +0 -66
  675. package/dist/paraglide/messages/ro.d.ts +0 -7
  676. package/dist/paraglide/messages/ro.js +0 -66
  677. package/dist/paraglide/messages/ru.d.ts +0 -7
  678. package/dist/paraglide/messages/ru.js +0 -66
  679. package/dist/paraglide/messages/sk.d.ts +0 -7
  680. package/dist/paraglide/messages/sk.js +0 -66
  681. package/dist/paraglide/messages/sl.d.ts +0 -7
  682. package/dist/paraglide/messages/sl.js +0 -66
  683. package/dist/paraglide/messages/sq.d.ts +0 -7
  684. package/dist/paraglide/messages/sq.js +0 -66
  685. package/dist/paraglide/messages/sr.d.ts +0 -7
  686. package/dist/paraglide/messages/sr.js +0 -66
  687. package/dist/paraglide/messages/sv.d.ts +0 -7
  688. package/dist/paraglide/messages/sv.js +0 -66
  689. package/dist/paraglide/messages/sw.d.ts +0 -7
  690. package/dist/paraglide/messages/sw.js +0 -66
  691. package/dist/paraglide/messages/ta.d.ts +0 -7
  692. package/dist/paraglide/messages/ta.js +0 -66
  693. package/dist/paraglide/messages/te.d.ts +0 -7
  694. package/dist/paraglide/messages/te.js +0 -66
  695. package/dist/paraglide/messages/th.d.ts +0 -7
  696. package/dist/paraglide/messages/th.js +0 -66
  697. package/dist/paraglide/messages/tl.d.ts +0 -7
  698. package/dist/paraglide/messages/tl.js +0 -66
  699. package/dist/paraglide/messages/tr.d.ts +0 -7
  700. package/dist/paraglide/messages/tr.js +0 -66
  701. package/dist/paraglide/messages/uk.d.ts +0 -7
  702. package/dist/paraglide/messages/uk.js +0 -66
  703. package/dist/paraglide/messages/vi.d.ts +0 -7
  704. package/dist/paraglide/messages/vi.js +0 -66
  705. package/dist/paraglide/messages/zh-CN.d.ts +0 -7
  706. package/dist/paraglide/messages/zh-CN.js +0 -66
  707. package/dist/paraglide/messages/zh-TW.d.ts +0 -7
  708. package/dist/paraglide/messages/zh-TW.js +0 -66
@@ -1,141 +1,1353 @@
1
- /* eslint-disable */
2
- /** @type {((tag: AvailableLanguageTag) => void) | undefined} */
3
- let _onSetLanguageTag
1
+ // eslint-disable
2
+
3
+ /** @type {any} */
4
+ const URLPattern = {}
4
5
 
5
6
  /**
6
- * The project's source language tag.
7
+ * The project's base locale.
7
8
  *
8
9
  * @example
9
- * if (newlySelectedLanguageTag === sourceLanguageTag){
10
- * // do nothing as the source language tag is the default language
11
- * return
10
+ * if (locale === baseLocale) {
11
+ * // do something
12
12
  * }
13
13
  */
14
- export const sourceLanguageTag = "en"
14
+ export const baseLocale = "en";
15
+ /**
16
+ * The project's locales that have been specified in the settings.
17
+ *
18
+ * @example
19
+ * if (locales.includes(userSelectedLocale) === false) {
20
+ * throw new Error('Locale is not available');
21
+ * }
22
+ */
23
+ export const locales = /** @type {const} */ (["ar", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "fi", "fr", "he", "hi", "hu", "id", "it", "ja", "ko", "lt", "lv", "ms", "nl", "no", "pl", "pt", "ro", "ru", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "vi", "zh-CN", "zh-TW"]);
24
+ /** @type {string} */
25
+ export const cookieName = "PARAGLIDE_LOCALE";
26
+ /** @type {number} */
27
+ export const cookieMaxAge = 34560000;
28
+ /** @type {string} */
29
+ export const cookieDomain = "";
30
+ /** @type {string} */
31
+ export const localStorageKey = "PARAGLIDE_LOCALE";
32
+ /**
33
+ * @type {Array<"cookie" | "baseLocale" | "globalVariable" | "url" | "preferredLanguage" | "localStorage" | `custom-${string}`>}
34
+ */
35
+ export const strategy = [
36
+ "url",
37
+ "cookie",
38
+ "preferredLanguage",
39
+ "baseLocale"
40
+ ];
41
+ /**
42
+ * The used URL patterns.
43
+ *
44
+ * @type {Array<{ pattern: string, localized: Array<[Locale, string]> }> }
45
+ */
46
+ export const urlPatterns = [
47
+ {
48
+ "pattern": ":protocol://:domain(.*)::port?/:path(.*)?",
49
+ "localized": [
50
+ [
51
+ "ar",
52
+ ":protocol://:domain(.*)::port?/ar/:path(.*)?"
53
+ ],
54
+ [
55
+ "bg",
56
+ ":protocol://:domain(.*)::port?/bg/:path(.*)?"
57
+ ],
58
+ [
59
+ "bn",
60
+ ":protocol://:domain(.*)::port?/bn/:path(.*)?"
61
+ ],
62
+ [
63
+ "ca",
64
+ ":protocol://:domain(.*)::port?/ca/:path(.*)?"
65
+ ],
66
+ [
67
+ "cs",
68
+ ":protocol://:domain(.*)::port?/cs/:path(.*)?"
69
+ ],
70
+ [
71
+ "da",
72
+ ":protocol://:domain(.*)::port?/da/:path(.*)?"
73
+ ],
74
+ [
75
+ "de",
76
+ ":protocol://:domain(.*)::port?/de/:path(.*)?"
77
+ ],
78
+ [
79
+ "el",
80
+ ":protocol://:domain(.*)::port?/el/:path(.*)?"
81
+ ],
82
+ [
83
+ "es",
84
+ ":protocol://:domain(.*)::port?/es/:path(.*)?"
85
+ ],
86
+ [
87
+ "fi",
88
+ ":protocol://:domain(.*)::port?/fi/:path(.*)?"
89
+ ],
90
+ [
91
+ "fr",
92
+ ":protocol://:domain(.*)::port?/fr/:path(.*)?"
93
+ ],
94
+ [
95
+ "he",
96
+ ":protocol://:domain(.*)::port?/he/:path(.*)?"
97
+ ],
98
+ [
99
+ "hi",
100
+ ":protocol://:domain(.*)::port?/hi/:path(.*)?"
101
+ ],
102
+ [
103
+ "hu",
104
+ ":protocol://:domain(.*)::port?/hu/:path(.*)?"
105
+ ],
106
+ [
107
+ "id",
108
+ ":protocol://:domain(.*)::port?/id/:path(.*)?"
109
+ ],
110
+ [
111
+ "it",
112
+ ":protocol://:domain(.*)::port?/it/:path(.*)?"
113
+ ],
114
+ [
115
+ "ja",
116
+ ":protocol://:domain(.*)::port?/ja/:path(.*)?"
117
+ ],
118
+ [
119
+ "ko",
120
+ ":protocol://:domain(.*)::port?/ko/:path(.*)?"
121
+ ],
122
+ [
123
+ "lt",
124
+ ":protocol://:domain(.*)::port?/lt/:path(.*)?"
125
+ ],
126
+ [
127
+ "lv",
128
+ ":protocol://:domain(.*)::port?/lv/:path(.*)?"
129
+ ],
130
+ [
131
+ "ms",
132
+ ":protocol://:domain(.*)::port?/ms/:path(.*)?"
133
+ ],
134
+ [
135
+ "nl",
136
+ ":protocol://:domain(.*)::port?/nl/:path(.*)?"
137
+ ],
138
+ [
139
+ "no",
140
+ ":protocol://:domain(.*)::port?/no/:path(.*)?"
141
+ ],
142
+ [
143
+ "pl",
144
+ ":protocol://:domain(.*)::port?/pl/:path(.*)?"
145
+ ],
146
+ [
147
+ "pt",
148
+ ":protocol://:domain(.*)::port?/pt/:path(.*)?"
149
+ ],
150
+ [
151
+ "ro",
152
+ ":protocol://:domain(.*)::port?/ro/:path(.*)?"
153
+ ],
154
+ [
155
+ "ru",
156
+ ":protocol://:domain(.*)::port?/ru/:path(.*)?"
157
+ ],
158
+ [
159
+ "sk",
160
+ ":protocol://:domain(.*)::port?/sk/:path(.*)?"
161
+ ],
162
+ [
163
+ "sl",
164
+ ":protocol://:domain(.*)::port?/sl/:path(.*)?"
165
+ ],
166
+ [
167
+ "sq",
168
+ ":protocol://:domain(.*)::port?/sq/:path(.*)?"
169
+ ],
170
+ [
171
+ "sr",
172
+ ":protocol://:domain(.*)::port?/sr/:path(.*)?"
173
+ ],
174
+ [
175
+ "sv",
176
+ ":protocol://:domain(.*)::port?/sv/:path(.*)?"
177
+ ],
178
+ [
179
+ "sw",
180
+ ":protocol://:domain(.*)::port?/sw/:path(.*)?"
181
+ ],
182
+ [
183
+ "ta",
184
+ ":protocol://:domain(.*)::port?/ta/:path(.*)?"
185
+ ],
186
+ [
187
+ "te",
188
+ ":protocol://:domain(.*)::port?/te/:path(.*)?"
189
+ ],
190
+ [
191
+ "th",
192
+ ":protocol://:domain(.*)::port?/th/:path(.*)?"
193
+ ],
194
+ [
195
+ "tl",
196
+ ":protocol://:domain(.*)::port?/tl/:path(.*)?"
197
+ ],
198
+ [
199
+ "tr",
200
+ ":protocol://:domain(.*)::port?/tr/:path(.*)?"
201
+ ],
202
+ [
203
+ "uk",
204
+ ":protocol://:domain(.*)::port?/uk/:path(.*)?"
205
+ ],
206
+ [
207
+ "vi",
208
+ ":protocol://:domain(.*)::port?/vi/:path(.*)?"
209
+ ],
210
+ [
211
+ "zh-CN",
212
+ ":protocol://:domain(.*)::port?/zh-CN/:path(.*)?"
213
+ ],
214
+ [
215
+ "zh-TW",
216
+ ":protocol://:domain(.*)::port?/zh-TW/:path(.*)?"
217
+ ],
218
+ [
219
+ "en",
220
+ ":protocol://:domain(.*)::port?/:path(.*)?"
221
+ ]
222
+ ]
223
+ }
224
+ ];
225
+ /**
226
+ * @typedef {{
227
+ * getStore(): {
228
+ * locale?: Locale,
229
+ * origin?: string,
230
+ * messageCalls?: Set<string>
231
+ * } | undefined,
232
+ * run: (store: { locale?: Locale, origin?: string, messageCalls?: Set<string>},
233
+ * cb: any) => any
234
+ * }} ParaglideAsyncLocalStorage
235
+ */
236
+ /**
237
+ * Server side async local storage that is set by `serverMiddleware()`.
238
+ *
239
+ * The variable is used to retrieve the locale and origin in a server-side
240
+ * rendering context without effecting other requests.
241
+ *
242
+ * @type {ParaglideAsyncLocalStorage | undefined}
243
+ */
244
+ export let serverAsyncLocalStorage = undefined;
245
+ export const disableAsyncLocalStorage = false;
246
+ export const experimentalMiddlewareLocaleSplitting = false;
247
+ export const isServer = import.meta.env?.SSR ?? typeof window === 'undefined';
248
+ /**
249
+ * Sets the server side async local storage.
250
+ *
251
+ * The function is needed because the `runtime.js` file
252
+ * must define the `serverAsyncLocalStorage` variable to
253
+ * avoid a circular import between `runtime.js` and
254
+ * `server.js` files.
255
+ *
256
+ * @param {ParaglideAsyncLocalStorage | undefined} value
257
+ */
258
+ export function overwriteServerAsyncLocalStorage(value) {
259
+ serverAsyncLocalStorage = value;
260
+ }
261
+ const TREE_SHAKE_COOKIE_STRATEGY_USED = true;
262
+ const TREE_SHAKE_URL_STRATEGY_USED = true;
263
+ const TREE_SHAKE_GLOBAL_VARIABLE_STRATEGY_USED = false;
264
+ const TREE_SHAKE_PREFERRED_LANGUAGE_STRATEGY_USED = true;
265
+ const TREE_SHAKE_DEFAULT_URL_PATTERN_USED = true;
266
+ const TREE_SHAKE_LOCAL_STORAGE_STRATEGY_USED = false;
15
267
 
268
+ globalThis.__paraglide = {}
269
+
270
+ /**
271
+ * This is a fallback to get started with a custom
272
+ * strategy and avoid type errors.
273
+ *
274
+ * The implementation is overwritten
275
+ * by \`overwriteGetLocale()\` and \`defineSetLocale()\`.
276
+ *
277
+ * @type {Locale|undefined}
278
+ */
279
+ let _locale;
280
+ let localeInitiallySet = false;
281
+ /**
282
+ * Get the current locale.
283
+ *
284
+ * @example
285
+ * if (getLocale() === 'de') {
286
+ * console.log('Germany 🇩🇪');
287
+ * } else if (getLocale() === 'nl') {
288
+ * console.log('Netherlands 🇳🇱');
289
+ * }
290
+ *
291
+ * @type {() => Locale}
292
+ */
293
+ export let getLocale = () => {
294
+ /** @type {string | undefined} */
295
+ let locale;
296
+ // if running in a server-side rendering context
297
+ // retrieve the locale from the async local storage
298
+ if (serverAsyncLocalStorage) {
299
+ const locale = serverAsyncLocalStorage?.getStore()?.locale;
300
+ if (locale) {
301
+ return locale;
302
+ }
303
+ }
304
+ for (const strat of strategy) {
305
+ if (TREE_SHAKE_COOKIE_STRATEGY_USED && strat === "cookie") {
306
+ locale = extractLocaleFromCookie();
307
+ }
308
+ else if (strat === "baseLocale") {
309
+ locale = baseLocale;
310
+ }
311
+ else if (TREE_SHAKE_URL_STRATEGY_USED &&
312
+ strat === "url" &&
313
+ !isServer &&
314
+ typeof window !== "undefined") {
315
+ locale = extractLocaleFromUrl(window.location.href);
316
+ }
317
+ else if (TREE_SHAKE_GLOBAL_VARIABLE_STRATEGY_USED &&
318
+ strat === "globalVariable" &&
319
+ _locale !== undefined) {
320
+ locale = _locale;
321
+ }
322
+ else if (TREE_SHAKE_PREFERRED_LANGUAGE_STRATEGY_USED &&
323
+ strat === "preferredLanguage" &&
324
+ !isServer) {
325
+ locale = extractLocaleFromNavigator();
326
+ }
327
+ else if (TREE_SHAKE_LOCAL_STORAGE_STRATEGY_USED &&
328
+ strat === "localStorage" &&
329
+ !isServer) {
330
+ locale = localStorage.getItem(localStorageKey) ?? undefined;
331
+ }
332
+ else if (isCustomStrategy(strat) && customClientStrategies.has(strat)) {
333
+ const handler = customClientStrategies.get(strat);
334
+ locale = handler.getLocale();
335
+ }
336
+ // check if match, else continue loop
337
+ if (locale !== undefined) {
338
+ const asserted = assertIsLocale(locale);
339
+ if (!localeInitiallySet) {
340
+ _locale = asserted;
341
+ // https://github.com/opral/inlang-paraglide-js/issues/455
342
+ localeInitiallySet = true;
343
+ setLocale(asserted, { reload: false });
344
+ }
345
+ return asserted;
346
+ }
347
+ }
348
+ throw new Error("No locale found. Read the docs https://inlang.com/m/gerre34r/library-inlang-paraglideJs/errors#no-locale-found");
349
+ };
16
350
  /**
17
- * The project's available language tags.
351
+ * Overwrite the \`getLocale()\` function.
352
+ *
353
+ * Use this function to overwrite how the locale is resolved. For example,
354
+ * you can resolve the locale from the browser's preferred language,
355
+ * a cookie, env variable, or a user's preference.
18
356
  *
19
357
  * @example
20
- * if (availableLanguageTags.includes(userSelectedLanguageTag) === false){
21
- * throw new Error("Language tag not available")
358
+ * overwriteGetLocale(() => {
359
+ * // resolve the locale from a cookie. fallback to the base locale.
360
+ * return Cookies.get('locale') ?? baseLocale
22
361
  * }
362
+ *
363
+ * @type {(fn: () => Locale) => void}
23
364
  */
24
- export const availableLanguageTags = /** @type {const} */ (["ar","bg","bn","ca","cs","da","de","el","en","es","fi","fr","he","hi","hu","id","it","ja","ko","lt","lv","ms","nl","no","pl","pt","ro","ru","sk","sl","sq","sr","sv","sw","ta","te","th","tl","tr","uk","vi","zh-CN","zh-TW"])
365
+ export const overwriteGetLocale = (fn) => {
366
+ getLocale = fn;
367
+ };
25
368
 
26
369
  /**
27
- * Get the current language tag.
370
+ * Set the locale.
371
+ *
372
+ * Set locale reloads the site by default on the client. Reloading
373
+ * can be disabled by passing \`reload: false\` as an option. If
374
+ * reloading is disabled, you need to ensure that the UI is updated
375
+ * to reflect the new locale.
376
+ *
377
+ * @example
378
+ * setLocale('en');
379
+ *
380
+ * @example
381
+ * setLocale('en', { reload: false });
382
+ *
383
+ * @type {(newLocale: Locale, options?: { reload?: boolean }) => void}
384
+ */
385
+ export let setLocale = (newLocale, options) => {
386
+ const optionsWithDefaults = {
387
+ reload: true,
388
+ ...options,
389
+ };
390
+ // locale is already set
391
+ // https://github.com/opral/inlang-paraglide-js/issues/430
392
+ let currentLocale;
393
+ try {
394
+ currentLocale = getLocale();
395
+ }
396
+ catch {
397
+ // do nothing, no locale has been set yet.
398
+ }
399
+ /** @type {string | undefined} */
400
+ let newLocation = undefined;
401
+ for (const strat of strategy) {
402
+ if (TREE_SHAKE_GLOBAL_VARIABLE_STRATEGY_USED &&
403
+ strat === "globalVariable") {
404
+ // a default for a custom strategy to get started quickly
405
+ // is likely overwritten by `defineSetLocale()`
406
+ _locale = newLocale;
407
+ }
408
+ else if (TREE_SHAKE_COOKIE_STRATEGY_USED && strat === "cookie") {
409
+ if (isServer ||
410
+ typeof document === "undefined" ||
411
+ typeof window === "undefined") {
412
+ continue;
413
+ }
414
+ const domain = cookieDomain || window.location.hostname;
415
+ // set the cookie
416
+ document.cookie = `${cookieName}=${newLocale}; path=/; max-age=${cookieMaxAge}; domain=${domain}`;
417
+ }
418
+ else if (strat === "baseLocale") {
419
+ // nothing to be set here. baseLocale is only a fallback
420
+ continue;
421
+ }
422
+ else if (TREE_SHAKE_URL_STRATEGY_USED &&
423
+ strat === "url" &&
424
+ typeof window !== "undefined") {
425
+ // route to the new url
426
+ //
427
+ // this triggers a page reload but a user rarely
428
+ // switches locales, so this should be fine.
429
+ //
430
+ // if the behavior is not desired, the implementation
431
+ // can be overwritten by `defineSetLocale()` to avoid
432
+ // a full page reload.
433
+ newLocation = localizeUrl(window.location.href, {
434
+ locale: newLocale,
435
+ }).href;
436
+ }
437
+ else if (TREE_SHAKE_LOCAL_STORAGE_STRATEGY_USED &&
438
+ strat === "localStorage" &&
439
+ typeof window !== "undefined") {
440
+ // set the localStorage
441
+ localStorage.setItem(localStorageKey, newLocale);
442
+ }
443
+ else if (isCustomStrategy(strat) && customClientStrategies.has(strat)) {
444
+ const handler = customClientStrategies.get(strat);
445
+ handler.setLocale(newLocale);
446
+ }
447
+ }
448
+ if (!isServer &&
449
+ optionsWithDefaults.reload &&
450
+ window.location &&
451
+ newLocale !== currentLocale) {
452
+ if (newLocation) {
453
+ // reload the page by navigating to the new url
454
+ window.location.href = newLocation;
455
+ }
456
+ else {
457
+ // reload the page to reflect the new locale
458
+ window.location.reload();
459
+ }
460
+ }
461
+ return;
462
+ };
463
+ /**
464
+ * Overwrite the \`setLocale()\` function.
465
+ *
466
+ * Use this function to overwrite how the locale is set. For example,
467
+ * modify a cookie, env variable, or a user's preference.
28
468
  *
29
469
  * @example
30
- * if (languageTag() === "de"){
31
- * console.log("Germany 🇩🇪")
32
- * } else if (languageTag() === "nl"){
33
- * console.log("Netherlands 🇳🇱")
470
+ * overwriteSetLocale((newLocale) => {
471
+ * // set the locale in a cookie
472
+ * return Cookies.set('locale', newLocale)
473
+ * });
474
+ *
475
+ * @param {(newLocale: Locale) => void} fn
476
+ */
477
+ export const overwriteSetLocale = (fn) => {
478
+ setLocale = fn;
479
+ };
480
+
481
+ /**
482
+ * The origin of the current URL.
483
+ *
484
+ * Defaults to "http://y.com" in non-browser environments. If this
485
+ * behavior is not desired, the implementation can be overwritten
486
+ * by `overwriteGetUrlOrigin()`.
487
+ *
488
+ * @type {() => string}
489
+ */
490
+ export let getUrlOrigin = () => {
491
+ if (serverAsyncLocalStorage) {
492
+ return serverAsyncLocalStorage.getStore()?.origin ?? "http://fallback.com";
493
+ }
494
+ else if (typeof window !== "undefined") {
495
+ return window.location.origin;
496
+ }
497
+ return "http://fallback.com";
498
+ };
499
+ /**
500
+ * Overwrite the getUrlOrigin function.
501
+ *
502
+ * Use this function in server environments to
503
+ * define how the URL origin is resolved.
504
+ *
505
+ * @type {(fn: () => string) => void}
506
+ */
507
+ export let overwriteGetUrlOrigin = (fn) => {
508
+ getUrlOrigin = fn;
509
+ };
510
+
511
+ /**
512
+ * Check if something is an available locale.
513
+ *
514
+ * @example
515
+ * if (isLocale(params.locale)) {
516
+ * setLocale(params.locale);
517
+ * } else {
518
+ * setLocale('en');
34
519
  * }
35
520
  *
36
- * @type {() => AvailableLanguageTag}
521
+ * @param {any} locale
522
+ * @returns {locale is Locale}
523
+ */
524
+ export function isLocale(locale) {
525
+ return !locale ? false : locales.includes(locale);
526
+ }
527
+
528
+ /**
529
+ * Asserts that the input is a locale.
530
+ *
531
+ * @param {any} input - The input to check.
532
+ * @returns {Locale} The input if it is a locale.
533
+ * @throws {Error} If the input is not a locale.
37
534
  */
38
- export let languageTag = () => sourceLanguageTag
535
+ export function assertIsLocale(input) {
536
+ if (isLocale(input) === false) {
537
+ throw new Error(`Invalid locale: ${input}. Expected one of: ${locales.join(", ")}`);
538
+ }
539
+ return input;
540
+ }
39
541
 
40
542
  /**
41
- * Set the language tag.
543
+ * Extracts a locale from a request.
544
+ *
545
+ * Use the function on the server to extract the locale
546
+ * from a request.
547
+ *
548
+ * The function goes through the strategies in the order
549
+ * they are defined. If a strategy returns an invalid locale,
550
+ * it will fall back to the next strategy.
42
551
  *
43
552
  * @example
553
+ * const locale = extractLocaleFromRequest(request);
44
554
  *
45
- * // changing to language
46
- * setLanguageTag("en")
555
+ * @type {(request: Request) => Locale}
556
+ */
557
+ export const extractLocaleFromRequest = (request) => {
558
+ /** @type {string|undefined} */
559
+ let locale;
560
+ for (const strat of strategy) {
561
+ if (TREE_SHAKE_COOKIE_STRATEGY_USED && strat === "cookie") {
562
+ locale = request.headers
563
+ .get("cookie")
564
+ ?.split("; ")
565
+ .find((c) => c.startsWith(cookieName + "="))
566
+ ?.split("=")[1];
567
+ }
568
+ else if (TREE_SHAKE_URL_STRATEGY_USED && strat === "url") {
569
+ locale = extractLocaleFromUrl(request.url);
570
+ }
571
+ else if (TREE_SHAKE_PREFERRED_LANGUAGE_STRATEGY_USED &&
572
+ strat === "preferredLanguage") {
573
+ locale = extractLocaleFromHeader(request);
574
+ }
575
+ else if (strat === "globalVariable") {
576
+ locale = _locale;
577
+ }
578
+ else if (strat === "baseLocale") {
579
+ return baseLocale;
580
+ }
581
+ else if (strat === "localStorage") {
582
+ continue;
583
+ }
584
+ else if (isCustomStrategy(strat) && customServerStrategies.has(strat)) {
585
+ const handler = customServerStrategies.get(strat);
586
+ locale = handler.getLocale(request);
587
+ }
588
+ if (locale !== undefined) {
589
+ if (!isLocale(locale)) {
590
+ locale = undefined;
591
+ }
592
+ else {
593
+ return assertIsLocale(locale);
594
+ }
595
+ }
596
+ }
597
+ throw new Error("No locale found. There is an error in your strategy. Try adding 'baseLocale' as the very last strategy. Read more here https://inlang.com/m/gerre34r/library-inlang-paraglideJs/errors#no-locale-found");
598
+ };
599
+
600
+ /**
601
+ * Extracts a cookie from the document.
47
602
  *
48
- * // passing a getter function also works.
49
- * //
50
- * // a getter function is useful for resolving a language tag
51
- * // on the server where every request has a different language tag
52
- * setLanguageTag(() => {
53
- * return request.languageTag
54
- * })
603
+ * Will return undefined if the document is not available or if the cookie is not set.
604
+ * The `document` object is not available in server-side rendering, so this function should not be called in that context.
55
605
  *
56
- * @param {AvailableLanguageTag | (() => AvailableLanguageTag)} tag
606
+ * @returns {string | undefined}
57
607
  */
58
- export const setLanguageTag = (tag) => {
59
- if (typeof tag === "function") {
60
- languageTag = enforceLanguageTag(tag)
61
- } else {
62
- languageTag = enforceLanguageTag(() => tag)
608
+ export function extractLocaleFromCookie() {
609
+ if (typeof document === "undefined" || !document.cookie) {
610
+ return;
63
611
  }
64
- // call the callback function if it has been defined
65
- if (_onSetLanguageTag !== undefined) {
66
- _onSetLanguageTag(languageTag())
612
+ const match = document.cookie.match(new RegExp(`(^| )${cookieName}=([^;]+)`));
613
+ const locale = match?.[2];
614
+ if (isLocale(locale)) {
615
+ return locale;
67
616
  }
617
+ return undefined;
68
618
  }
69
619
 
70
620
  /**
71
- * Wraps an untrusted function and enforces that it returns a language tag.
72
- * @param {() => AvailableLanguageTag} unsafeLanguageTag
73
- * @returns {() => AvailableLanguageTag}
621
+ * Extracts a locale from the accept-language header.
622
+ *
623
+ * Use the function on the server to extract the locale
624
+ * from the accept-language header that is sent by the client.
625
+ *
626
+ * @example
627
+ * const locale = extractLocaleFromHeader(request);
628
+ *
629
+ * @type {(request: Request) => Locale}
630
+ * @param {Request} request - The request object to extract the locale from.
631
+ * @returns {string|undefined} The negotiated preferred language.
74
632
  */
75
- function enforceLanguageTag(unsafeLanguageTag) {
76
- return () => {
77
- const tag = unsafeLanguageTag()
78
- if(!isAvailableLanguageTag(tag)) {
79
- throw new Error(`languageTag() didn't return a valid language tag. Check your setLanguageTag call`)
633
+ export function extractLocaleFromHeader(request) {
634
+ const acceptLanguageHeader = request.headers.get("accept-language");
635
+ if (acceptLanguageHeader) {
636
+ // Parse language preferences with their q-values and base language codes
637
+ const languages = acceptLanguageHeader
638
+ .split(",")
639
+ .map((lang) => {
640
+ const [tag, q = "1"] = lang.trim().split(";q=");
641
+ // Get both the full tag and base language code
642
+ const baseTag = tag?.split("-")[0]?.toLowerCase();
643
+ return {
644
+ fullTag: tag?.toLowerCase(),
645
+ baseTag,
646
+ q: Number(q),
647
+ };
648
+ })
649
+ .sort((a, b) => b.q - a.q);
650
+ for (const lang of languages) {
651
+ if (isLocale(lang.fullTag)) {
652
+ return lang.fullTag;
653
+ }
654
+ else if (isLocale(lang.baseTag)) {
655
+ return lang.baseTag;
656
+ }
80
657
  }
81
- return tag
658
+ return undefined;
82
659
  }
660
+ return undefined;
83
661
  }
84
662
 
85
663
  /**
86
- * Set the `onSetLanguageTag()` callback function.
664
+ * Negotiates a preferred language from navigator.languages.
87
665
  *
88
- * The function can be used to trigger client-side side-effects such as
89
- * making a new request to the server with the updated language tag,
90
- * or re-rendering the UI on the client (SPA apps).
666
+ * Use the function on the client to extract the locale
667
+ * from the navigator.languages array.
91
668
  *
92
- * - Don't use this function on the server (!).
93
- * Triggering a side-effect is only useful on the client because a server-side
94
- * environment doesn't need to re-render the UI.
669
+ * @example
670
+ * const locale = extractLocaleFromNavigator();
95
671
  *
96
- * - The `onSetLanguageTag()` callback can only be defined once to avoid unexpected behavior.
672
+ * @type {() => Locale | undefined}
673
+ * @returns {string | undefined}
674
+ */
675
+ export function extractLocaleFromNavigator() {
676
+ if (!navigator?.languages?.length) {
677
+ return undefined;
678
+ }
679
+ const languages = navigator.languages.map((lang) => ({
680
+ fullTag: lang.toLowerCase(),
681
+ baseTag: lang.split("-")[0]?.toLowerCase(),
682
+ }));
683
+ for (const lang of languages) {
684
+ if (isLocale(lang.fullTag)) {
685
+ return lang.fullTag;
686
+ }
687
+ else if (isLocale(lang.baseTag)) {
688
+ return lang.baseTag;
689
+ }
690
+ }
691
+ return undefined;
692
+ }
693
+
694
+ /**
695
+ * If extractLocaleFromUrl is called many times on the same page and the URL
696
+ * hasn't changed, we don't need to recompute it every time which can get expensive.
697
+ * We might use a LRU cache if needed, but for now storing only the last result is enough.
698
+ * https://github.com/opral/monorepo/pull/3575#discussion_r2066731243
699
+ */
700
+ /** @type {string|undefined} */
701
+ let cachedUrl;
702
+ /** @type {Locale|undefined} */
703
+ let cachedLocale;
704
+ /**
705
+ * Extracts the locale from a given URL using native URLPattern.
706
+ *
707
+ * @param {URL|string} url - The full URL from which to extract the locale.
708
+ * @returns {Locale|undefined} The extracted locale, or undefined if no locale is found.
709
+ */
710
+ export function extractLocaleFromUrl(url) {
711
+ const urlString = typeof url === "string" ? url : url.href;
712
+ if (cachedUrl === urlString) {
713
+ return cachedLocale;
714
+ }
715
+ let result;
716
+ if (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {
717
+ result = defaultUrlPatternExtractLocale(url);
718
+ }
719
+ else {
720
+ const urlObj = typeof url === "string" ? new URL(url) : url;
721
+ // Iterate over URL patterns
722
+ for (const element of urlPatterns) {
723
+ for (const [locale, localizedPattern] of element.localized) {
724
+ const match = new URLPattern(localizedPattern, urlObj.href).exec(urlObj.href);
725
+ if (!match) {
726
+ continue;
727
+ }
728
+ // Check if the locale is valid
729
+ if (assertIsLocale(locale)) {
730
+ result = locale;
731
+ break;
732
+ }
733
+ }
734
+ if (result)
735
+ break;
736
+ }
737
+ }
738
+ cachedUrl = urlString;
739
+ cachedLocale = result;
740
+ return result;
741
+ }
742
+ /**
743
+ * https://github.com/opral/inlang-paraglide-js/issues/381
744
+ *
745
+ * @param {URL|string} url - The full URL from which to extract the locale.
746
+ * @returns {Locale|undefined} The extracted locale, or undefined if no locale is found.
747
+ */
748
+ function defaultUrlPatternExtractLocale(url) {
749
+ const urlObj = new URL(url, "http://dummy.com");
750
+ const pathSegments = urlObj.pathname.split("/").filter(Boolean);
751
+ if (pathSegments.length > 0) {
752
+ const potentialLocale = pathSegments[0];
753
+ if (isLocale(potentialLocale)) {
754
+ return potentialLocale;
755
+ }
756
+ }
757
+ // everything else has to be the base locale
758
+ return baseLocale;
759
+ }
760
+
761
+ /**
762
+ * Lower-level URL localization function, primarily used in server contexts.
763
+ *
764
+ * This function is designed for server-side usage where you need precise control
765
+ * over URL localization, such as in middleware or request handlers. It works with
766
+ * URL objects and always returns absolute URLs.
767
+ *
768
+ * For client-side UI components, use `localizeHref()` instead, which provides
769
+ * a more convenient API with relative paths and automatic locale detection.
97
770
  *
98
771
  * @example
99
- * // if you use inlang paraglide on the server, make sure
100
- * // to not call `onSetLanguageTag()` on the server
101
- * if (isServer === false) {
102
- * onSetLanguageTag((tag) => {
103
- * // (for example) make a new request to the
104
- * // server with the updated language tag
105
- * window.location.href = `/${tag}/${window.location.pathname}`
106
- * })
772
+ * ```typescript
773
+ * // Server middleware example
774
+ * app.use((req, res, next) => {
775
+ * const url = new URL(req.url, `${req.protocol}://${req.headers.host}`);
776
+ * const localized = localizeUrl(url, { locale: "de" });
777
+ *
778
+ * if (localized.href !== url.href) {
779
+ * return res.redirect(localized.href);
107
780
  * }
781
+ * next();
782
+ * });
783
+ * ```
784
+ *
785
+ * @example
786
+ * ```typescript
787
+ * // Using with URL patterns
788
+ * const url = new URL("https://example.com/about");
789
+ * localizeUrl(url, { locale: "de" });
790
+ * // => URL("https://example.com/de/about")
791
+ *
792
+ * // Using with domain-based localization
793
+ * const url = new URL("https://example.com/store");
794
+ * localizeUrl(url, { locale: "de" });
795
+ * // => URL("https://de.example.com/store")
796
+ * ```
797
+ *
798
+ * @param {string | URL} url - The URL to localize. If string, must be absolute.
799
+ * @param {Object} [options] - Options for localization
800
+ * @param {string} [options.locale] - Target locale. If not provided, uses getLocale()
801
+ * @returns {URL} The localized URL, always absolute
802
+ */
803
+ export function localizeUrl(url, options) {
804
+ if (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {
805
+ return localizeUrlDefaultPattern(url, options);
806
+ }
807
+ const targetLocale = options?.locale ?? getLocale();
808
+ const urlObj = typeof url === "string" ? new URL(url) : url;
809
+ // Iterate over URL patterns
810
+ for (const element of urlPatterns) {
811
+ // match localized patterns
812
+ for (const [, localizedPattern] of element.localized) {
813
+ const match = new URLPattern(localizedPattern, urlObj.href).exec(urlObj.href);
814
+ if (!match) {
815
+ continue;
816
+ }
817
+ const targetPattern = element.localized.find(([locale]) => locale === targetLocale)?.[1];
818
+ if (!targetPattern) {
819
+ continue;
820
+ }
821
+ const localizedUrl = fillPattern(targetPattern, aggregateGroups(match), urlObj.origin);
822
+ return fillMissingUrlParts(localizedUrl, match);
823
+ }
824
+ const unlocalizedMatch = new URLPattern(element.pattern, urlObj.href).exec(urlObj.href);
825
+ if (unlocalizedMatch) {
826
+ const targetPattern = element.localized.find(([locale]) => locale === targetLocale)?.[1];
827
+ if (targetPattern) {
828
+ const localizedUrl = fillPattern(targetPattern, aggregateGroups(unlocalizedMatch), urlObj.origin);
829
+ return fillMissingUrlParts(localizedUrl, unlocalizedMatch);
830
+ }
831
+ }
832
+ }
833
+ // If no match found, return the original URL
834
+ return urlObj;
835
+ }
836
+ /**
837
+ * https://github.com/opral/inlang-paraglide-js/issues/381
838
+ *
839
+ * @param {string | URL} url
840
+ * @param {Object} [options]
841
+ * @param {string} [options.locale]
842
+ * @returns {URL}
843
+ */
844
+ function localizeUrlDefaultPattern(url, options) {
845
+ const urlObj = typeof url === "string" ? new URL(url, getUrlOrigin()) : new URL(url);
846
+ const locale = options?.locale ?? getLocale();
847
+ const currentLocale = extractLocaleFromUrl(urlObj);
848
+ // If current locale matches target locale, no change needed
849
+ if (currentLocale === locale) {
850
+ return urlObj;
851
+ }
852
+ const pathSegments = urlObj.pathname.split("/").filter(Boolean);
853
+ // If current path starts with a locale, remove it
854
+ if (pathSegments.length > 0 && isLocale(pathSegments[0])) {
855
+ pathSegments.shift();
856
+ }
857
+ // For base locale, don't add prefix
858
+ if (locale === baseLocale) {
859
+ urlObj.pathname = "/" + pathSegments.join("/");
860
+ }
861
+ else {
862
+ // For other locales, add prefix
863
+ urlObj.pathname = "/" + locale + "/" + pathSegments.join("/");
864
+ }
865
+ return urlObj;
866
+ }
867
+ /**
868
+ * Low-level URL de-localization function, primarily used in server contexts.
869
+ *
870
+ * This function is designed for server-side usage where you need precise control
871
+ * over URL de-localization, such as in middleware or request handlers. It works with
872
+ * URL objects and always returns absolute URLs.
873
+ *
874
+ * For client-side UI components, use `deLocalizeHref()` instead, which provides
875
+ * a more convenient API with relative paths.
876
+ *
877
+ * @example
878
+ * ```typescript
879
+ * // Server middleware example
880
+ * app.use((req, res, next) => {
881
+ * const url = new URL(req.url, `${req.protocol}://${req.headers.host}`);
882
+ * const baseUrl = deLocalizeUrl(url);
883
+ *
884
+ * // Store the base URL for later use
885
+ * req.baseUrl = baseUrl;
886
+ * next();
887
+ * });
888
+ * ```
889
+ *
890
+ * @example
891
+ * ```typescript
892
+ * // Using with URL patterns
893
+ * const url = new URL("https://example.com/de/about");
894
+ * deLocalizeUrl(url); // => URL("https://example.com/about")
895
+ *
896
+ * // Using with domain-based localization
897
+ * const url = new URL("https://de.example.com/store");
898
+ * deLocalizeUrl(url); // => URL("https://example.com/store")
899
+ * ```
900
+ *
901
+ * @param {string | URL} url - The URL to de-localize. If string, must be absolute.
902
+ * @returns {URL} The de-localized URL, always absolute
903
+ */
904
+ export function deLocalizeUrl(url) {
905
+ if (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {
906
+ return deLocalizeUrlDefaultPattern(url);
907
+ }
908
+ const urlObj = typeof url === "string" ? new URL(url) : url;
909
+ // Iterate over URL patterns
910
+ for (const element of urlPatterns) {
911
+ // Iterate over localized versions
912
+ for (const [, localizedPattern] of element.localized) {
913
+ const match = new URLPattern(localizedPattern, urlObj.href).exec(urlObj.href);
914
+ if (match) {
915
+ // Convert localized URL back to the base pattern
916
+ const groups = aggregateGroups(match);
917
+ const baseUrl = fillPattern(element.pattern, groups, urlObj.origin);
918
+ return fillMissingUrlParts(baseUrl, match);
919
+ }
920
+ }
921
+ // match unlocalized pattern
922
+ const unlocalizedMatch = new URLPattern(element.pattern, urlObj.href).exec(urlObj.href);
923
+ if (unlocalizedMatch) {
924
+ const baseUrl = fillPattern(element.pattern, aggregateGroups(unlocalizedMatch), urlObj.origin);
925
+ return fillMissingUrlParts(baseUrl, unlocalizedMatch);
926
+ }
927
+ }
928
+ // no match found return the original url
929
+ return urlObj;
930
+ }
931
+ /**
932
+ * De-localizes a URL using the default pattern (/:locale/*)
933
+ * @param {string|URL} url
934
+ * @returns {URL}
935
+ */
936
+ function deLocalizeUrlDefaultPattern(url) {
937
+ const urlObj = typeof url === "string" ? new URL(url, getUrlOrigin()) : new URL(url);
938
+ const pathSegments = urlObj.pathname.split("/").filter(Boolean);
939
+ // If first segment is a locale, remove it
940
+ if (pathSegments.length > 0 && isLocale(pathSegments[0])) {
941
+ urlObj.pathname = "/" + pathSegments.slice(1).join("/");
942
+ }
943
+ return urlObj;
944
+ }
945
+ /**
946
+ * Takes matches of implicit wildcards in the UrlPattern (when a part is missing
947
+ * it is equal to '*') and adds them back to the result of fillPattern.
948
+ *
949
+ * At least protocol and hostname are required to create a valid URL inside fillPattern.
950
+ *
951
+ * @param {URL} url
952
+ * @param {any} match
953
+ * @returns {URL}
954
+ */
955
+ function fillMissingUrlParts(url, match) {
956
+ if (match.protocol.groups["0"]) {
957
+ url.protocol = match.protocol.groups["0"] ?? "";
958
+ }
959
+ if (match.hostname.groups["0"]) {
960
+ url.hostname = match.hostname.groups["0"] ?? "";
961
+ }
962
+ if (match.username.groups["0"]) {
963
+ url.username = match.username.groups["0"] ?? "";
964
+ }
965
+ if (match.password.groups["0"]) {
966
+ url.password = match.password.groups["0"] ?? "";
967
+ }
968
+ if (match.port.groups["0"]) {
969
+ url.port = match.port.groups["0"] ?? "";
970
+ }
971
+ if (match.pathname.groups["0"]) {
972
+ url.pathname = match.pathname.groups["0"] ?? "";
973
+ }
974
+ if (match.search.groups["0"]) {
975
+ url.search = match.search.groups["0"] ?? "";
976
+ }
977
+ if (match.hash.groups["0"]) {
978
+ url.hash = match.hash.groups["0"] ?? "";
979
+ }
980
+ return url;
981
+ }
982
+ /**
983
+ * Fills a URL pattern with values for named groups, supporting all URLPattern-style modifiers.
984
+ *
985
+ * This function will eventually be replaced by https://github.com/whatwg/urlpattern/issues/73
986
+ *
987
+ * Matches:
988
+ * - :name -> Simple
989
+ * - :name? -> Optional
990
+ * - :name+ -> One or more
991
+ * - :name* -> Zero or more
992
+ * - :name(...) -> Regex group
993
+ * - {text} -> Group delimiter
994
+ * - {text}? -> Optional group delimiter
995
+ *
996
+ * If the value is `null`, the segment is removed.
997
+ *
998
+ * @param {string} pattern - The URL pattern containing named groups.
999
+ * @param {Record<string, string | null | undefined>} values - Object of values for named groups.
1000
+ * @param {string} origin - Base URL to use for URL construction.
1001
+ * @returns {URL} - The constructed URL with named groups filled.
1002
+ */
1003
+ function fillPattern(pattern, values, origin) {
1004
+ // Pre-process the pattern to handle explicit port numbers
1005
+ // This detects patterns like "http://localhost:5173" and protects the port number
1006
+ // from being interpreted as a parameter
1007
+ let processedPattern = pattern.replace(/(https?:\/\/[^:/]+):(\d+)(\/|$)/g, (_, protocol, port, slash) => {
1008
+ // Replace ":5173" with "#PORT-5173#" to protect it from parameter replacement
1009
+ return `${protocol}#PORT-${port}#${slash}`;
1010
+ });
1011
+ // First, handle group delimiters with curly braces
1012
+ let processedGroupDelimiters = processedPattern.replace(/\{([^{}]*)\}([?+*]?)/g, (_, content, modifier) => {
1013
+ // For optional group delimiters
1014
+ if (modifier === "?") {
1015
+ // For optional groups, we'll include the content
1016
+ return content;
1017
+ }
1018
+ // For non-optional group delimiters, always include the content
1019
+ return content;
1020
+ });
1021
+ // Then handle named groups
1022
+ let filled = processedGroupDelimiters.replace(/(\/?):([a-zA-Z0-9_]+)(\([^)]*\))?([?+*]?)/g, (_, slash, name, __, modifier) => {
1023
+ const value = values[name];
1024
+ if (value === null) {
1025
+ // If value is null, remove the entire segment including the preceding slash
1026
+ return "";
1027
+ }
1028
+ if (modifier === "?") {
1029
+ // Optional segment
1030
+ return value !== undefined ? `${slash}${value}` : "";
1031
+ }
1032
+ if (modifier === "+" || modifier === "*") {
1033
+ // Repeatable segments
1034
+ if (value === undefined && modifier === "+") {
1035
+ throw new Error(`Missing value for "${name}" (one or more required)`);
1036
+ }
1037
+ return value ? `${slash}${value}` : "";
1038
+ }
1039
+ // Simple named group (no modifier)
1040
+ if (value === undefined) {
1041
+ throw new Error(`Missing value for "${name}"`);
1042
+ }
1043
+ return `${slash}${value}`;
1044
+ });
1045
+ // Restore port numbers
1046
+ filled = filled.replace(/#PORT-(\d+)#/g, ":$1");
1047
+ return new URL(filled, origin);
1048
+ }
1049
+ /**
1050
+ * Aggregates named groups from various parts of the URLPattern match result.
108
1051
  *
109
- * @param {(languageTag: AvailableLanguageTag) => void} fn
1052
+ *
1053
+ * @type {(match: any) => Record<string, string | null | undefined>}
110
1054
  */
111
- export const onSetLanguageTag = (fn) => {
112
- _onSetLanguageTag = fn
1055
+ export function aggregateGroups(match) {
1056
+ return {
1057
+ ...match.hash.groups,
1058
+ ...match.hostname.groups,
1059
+ ...match.password.groups,
1060
+ ...match.pathname.groups,
1061
+ ...match.port.groups,
1062
+ ...match.protocol.groups,
1063
+ ...match.search.groups,
1064
+ ...match.username.groups,
1065
+ };
113
1066
  }
114
1067
 
115
1068
  /**
116
- * Check if something is an available language tag.
1069
+ * High-level URL localization function optimized for client-side UI usage.
1070
+ *
1071
+ * This is a convenience wrapper around `localizeUrl()` that provides features
1072
+ * needed in UI:
1073
+ *
1074
+ * - Accepts relative paths (e.g., "/about")
1075
+ * - Returns relative paths when possible
1076
+ * - Automatically detects current locale if not specified
1077
+ * - Handles string input/output instead of URL objects
117
1078
  *
118
1079
  * @example
119
- * if (isAvailableLanguageTag(params.locale)) {
120
- * setLanguageTag(params.locale)
121
- * } else {
122
- * setLanguageTag("en")
123
- * }
1080
+ * ```typescript
1081
+ * // In a React/Vue/Svelte component
1082
+ * const NavLink = ({ href }) => {
1083
+ * // Automatically uses current locale, keeps path relative
1084
+ * return <a href={localizeHref(href)}>...</a>;
1085
+ * };
1086
+ *
1087
+ * // Examples:
1088
+ * localizeHref("/about")
1089
+ * // => "/de/about" (if current locale is "de")
1090
+ * localizeHref("/store", { locale: "fr" })
1091
+ * // => "/fr/store" (explicit locale)
1092
+ *
1093
+ * // Cross-origin links remain absolute
1094
+ * localizeHref("https://other-site.com/about")
1095
+ * // => "https://other-site.com/de/about"
1096
+ * ```
1097
+ *
1098
+ * For server-side URL localization (e.g., in middleware), use `localizeUrl()`
1099
+ * which provides more precise control over URL handling.
1100
+ *
1101
+ * @param {string} href - The href to localize (can be relative or absolute)
1102
+ * @param {Object} [options] - Options for localization
1103
+ * @param {string} [options.locale] - Target locale. If not provided, uses `getLocale()`
1104
+ * @returns {string} The localized href, relative if input was relative
1105
+ */
1106
+ export function localizeHref(href, options) {
1107
+ const currentLocale = getLocale();
1108
+ const locale = options?.locale ?? currentLocale;
1109
+ const url = new URL(href, getUrlOrigin());
1110
+ const localized = localizeUrl(url, { locale });
1111
+ // if the origin is identical and the href is relative,
1112
+ // return the relative path
1113
+ if (href.startsWith("/") && url.origin === localized.origin) {
1114
+ // check for cross origin localization in which case an absolute URL must be returned.
1115
+ if (locale !== currentLocale) {
1116
+ const localizedCurrentLocale = localizeUrl(url, {
1117
+ locale: currentLocale,
1118
+ });
1119
+ if (localizedCurrentLocale.origin !== localized.origin) {
1120
+ return localized.href;
1121
+ }
1122
+ }
1123
+ return localized.pathname + localized.search + localized.hash;
1124
+ }
1125
+ return localized.href;
1126
+ }
1127
+ /**
1128
+ * High-level URL de-localization function optimized for client-side UI usage.
1129
+ *
1130
+ * This is a convenience wrapper around `deLocalizeUrl()` that provides features
1131
+ * needed in the UI:
1132
+ *
1133
+ * - Accepts relative paths (e.g., "/de/about")
1134
+ * - Returns relative paths when possible
1135
+ * - Handles string input/output instead of URL objects
1136
+ *
1137
+ * @example
1138
+ * ```typescript
1139
+ * // In a React/Vue/Svelte component
1140
+ * const LocaleSwitcher = ({ href }) => {
1141
+ * // Remove locale prefix before switching
1142
+ * const baseHref = deLocalizeHref(href);
1143
+ * return locales.map(locale =>
1144
+ * <a href={localizeHref(baseHref, { locale })}>
1145
+ * Switch to {locale}
1146
+ * </a>
1147
+ * );
1148
+ * };
1149
+ *
1150
+ * // Examples:
1151
+ * deLocalizeHref("/de/about") // => "/about"
1152
+ * deLocalizeHref("/fr/store") // => "/store"
124
1153
  *
125
- * @param {any} thing
126
- * @returns {thing is AvailableLanguageTag}
1154
+ * // Cross-origin links remain absolute
1155
+ * deLocalizeHref("https://example.com/de/about")
1156
+ * // => "https://example.com/about"
1157
+ * ```
1158
+ *
1159
+ * For server-side URL de-localization (e.g., in middleware), use `deLocalizeUrl()`
1160
+ * which provides more precise control over URL handling.
1161
+ *
1162
+ * @param {string} href - The href to de-localize (can be relative or absolute)
1163
+ * @returns {string} The de-localized href, relative if input was relative
1164
+ * @see deLocalizeUrl - For low-level URL de-localization in server contexts
127
1165
  */
128
- export function isAvailableLanguageTag(thing) {
129
- return availableLanguageTags.includes(thing)
1166
+ export function deLocalizeHref(href) {
1167
+ const url = new URL(href, getUrlOrigin());
1168
+ const deLocalized = deLocalizeUrl(url);
1169
+ // If the origin is identical and the href is relative,
1170
+ // return the relative path instead of the full URL.
1171
+ if (href.startsWith("/") && url.origin === deLocalized.origin) {
1172
+ return deLocalized.pathname + deLocalized.search + deLocalized.hash;
1173
+ }
1174
+ return deLocalized.href;
1175
+ }
1176
+
1177
+ /**
1178
+ * @param {string} safeModuleId
1179
+ * @param {Locale} locale
1180
+ */
1181
+ export function trackMessageCall(safeModuleId, locale) {
1182
+ if (isServer === false)
1183
+ return;
1184
+ const store = serverAsyncLocalStorage?.getStore();
1185
+ if (store) {
1186
+ store.messageCalls?.add(`${safeModuleId}:${locale}`);
1187
+ }
1188
+ }
1189
+
1190
+ /**
1191
+ * Generates a list of localized URLs for all provided URLs.
1192
+ *
1193
+ * This is useful for SSG (Static Site Generation) and sitemap generation.
1194
+ * NextJS and other frameworks use this function for SSG.
1195
+ *
1196
+ * @example
1197
+ * ```typescript
1198
+ * const urls = generateStaticLocalizedUrls([
1199
+ * "https://example.com/about",
1200
+ * "https://example.com/blog",
1201
+ * ]);
1202
+ * urls[0].href // => "https://example.com/about"
1203
+ * urls[1].href // => "https://example.com/blog"
1204
+ * urls[2].href // => "https://example.com/de/about"
1205
+ * urls[3].href // => "https://example.com/de/blog"
1206
+ * ...
1207
+ * ```
1208
+ *
1209
+ * @param {(string | URL)[]} urls - List of URLs to generate localized versions for. Can be absolute URLs or paths.
1210
+ * @returns {URL[]} List of localized URLs as URL objects
1211
+ */
1212
+ export function generateStaticLocalizedUrls(urls) {
1213
+ const localizedUrls = new Set();
1214
+ // For default URL pattern, we can optimize the generation
1215
+ if (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {
1216
+ for (const urlInput of urls) {
1217
+ const url = urlInput instanceof URL
1218
+ ? urlInput
1219
+ : new URL(urlInput, "http://localhost");
1220
+ // Base locale doesn't get a prefix
1221
+ localizedUrls.add(url);
1222
+ // Other locales get their code as prefix
1223
+ for (const locale of locales) {
1224
+ if (locale !== baseLocale) {
1225
+ const localizedPath = `/${locale}${url.pathname}${url.search}${url.hash}`;
1226
+ const localizedUrl = new URL(localizedPath, url.origin);
1227
+ localizedUrls.add(localizedUrl);
1228
+ }
1229
+ }
1230
+ }
1231
+ return Array.from(localizedUrls);
1232
+ }
1233
+ // For custom URL patterns, we need to use localizeUrl for each URL and locale
1234
+ for (const urlInput of urls) {
1235
+ const url = urlInput instanceof URL
1236
+ ? urlInput
1237
+ : new URL(urlInput, "http://localhost");
1238
+ // Try each URL pattern to find one that matches
1239
+ let patternFound = false;
1240
+ for (const pattern of urlPatterns) {
1241
+ try {
1242
+ // Try to match the unlocalized pattern
1243
+ const unlocalizedMatch = new URLPattern(pattern.pattern, url.href).exec(url.href);
1244
+ if (!unlocalizedMatch)
1245
+ continue;
1246
+ patternFound = true;
1247
+ // Track unique localized URLs to avoid duplicates when patterns are the same
1248
+ const seenUrls = new Set();
1249
+ // Generate localized URL for each locale
1250
+ for (const [locale] of pattern.localized) {
1251
+ try {
1252
+ const localizedUrl = localizeUrl(url, { locale });
1253
+ const urlString = localizedUrl.href;
1254
+ // Only add if we haven't seen this exact URL before
1255
+ if (!seenUrls.has(urlString)) {
1256
+ seenUrls.add(urlString);
1257
+ localizedUrls.add(localizedUrl);
1258
+ }
1259
+ }
1260
+ catch {
1261
+ // Skip if localization fails for this locale
1262
+ continue;
1263
+ }
1264
+ }
1265
+ break;
1266
+ }
1267
+ catch {
1268
+ // Skip if pattern matching fails
1269
+ continue;
1270
+ }
1271
+ }
1272
+ // If no pattern matched, use the URL as is
1273
+ if (!patternFound) {
1274
+ localizedUrls.add(url);
1275
+ }
1276
+ }
1277
+ return Array.from(localizedUrls);
1278
+ }
1279
+
1280
+ /**
1281
+ * @typedef {"cookie" | "baseLocale" | "globalVariable" | "url" | "preferredLanguage" | "localStorage"} BuiltInStrategy
1282
+ */
1283
+ /**
1284
+ * @typedef {`custom_${string}`} CustomStrategy
1285
+ */
1286
+ /**
1287
+ * @typedef {BuiltInStrategy | CustomStrategy} Strategy
1288
+ */
1289
+ /**
1290
+ * @typedef {Array<Strategy>} Strategies
1291
+ */
1292
+ /**
1293
+ * @typedef {{ getLocale: (request?: Request) => string | undefined }} CustomServerStrategyHandler
1294
+ */
1295
+ /**
1296
+ * @typedef {{ getLocale: () => string | undefined, setLocale: (locale: string) => void }} CustomClientStrategyHandler
1297
+ */
1298
+ export const customServerStrategies = new Map();
1299
+ export const customClientStrategies = new Map();
1300
+ /**
1301
+ * Checks if the given strategy is a custom strategy.
1302
+ *
1303
+ * @param {any} strategy The name of the custom strategy to validate.
1304
+ * Must be a string that starts with "custom-" followed by alphanumeric characters.
1305
+ * @returns {boolean} Returns true if it is a custom strategy, false otherwise.
1306
+ */
1307
+ export function isCustomStrategy(strategy) {
1308
+ return typeof strategy === "string" && /^custom-[A-Za-z0-9]+$/.test(strategy);
1309
+ }
1310
+ /**
1311
+ * Defines a custom strategy that is executed on the server.
1312
+ *
1313
+ * @param {any} strategy The name of the custom strategy to define. Must follow the pattern `custom-<name>` where
1314
+ * `<name>` contains only alphanumeric characters.
1315
+ * @param {CustomServerStrategyHandler} handler The handler for the custom strategy, which should implement
1316
+ * the method `getLocale`.
1317
+ * @returns {void}
1318
+ */
1319
+ export function defineCustomServerStrategy(strategy, handler) {
1320
+ if (!isCustomStrategy(strategy)) {
1321
+ throw new Error(`Invalid custom strategy: "${strategy}". Must be a custom strategy following the pattern custom-<name>` +
1322
+ " where <name> contains only alphanumeric characters.");
1323
+ }
1324
+ customServerStrategies.set(strategy, handler);
1325
+ }
1326
+ /**
1327
+ * Defines a custom strategy that is executed on the client.
1328
+ *
1329
+ * @param {any} strategy The name of the custom strategy to define. Must follow the pattern `custom-<name>` where
1330
+ * `<name>` contains only alphanumeric characters.
1331
+ * @param {CustomClientStrategyHandler} handler The handler for the custom strategy, which should implement the
1332
+ * methods `getLocale` and `setLocale`.
1333
+ * @returns {void}
1334
+ */
1335
+ export function defineCustomClientStrategy(strategy, handler) {
1336
+ if (!isCustomStrategy(strategy)) {
1337
+ throw new Error(`Invalid custom strategy: "${strategy}". Must be a custom strategy following the pattern custom-<name>` +
1338
+ " where <name> contains only alphanumeric characters.");
1339
+ }
1340
+ customClientStrategies.set(strategy, handler);
130
1341
  }
131
1342
 
132
1343
  // ------ TYPES ------
133
1344
 
134
1345
  /**
135
- * A language tag that is available in the project.
1346
+ * A locale that is available in the project.
136
1347
  *
137
1348
  * @example
138
- * setLanguageTag(request.languageTag as AvailableLanguageTag)
1349
+ * setLocale(request.locale as Locale)
139
1350
  *
140
- * @typedef {typeof availableLanguageTags[number]} AvailableLanguageTag
141
- */
1351
+ * @typedef {(typeof locales)[number]} Locale
1352
+ */
1353
+