@hanzo/cms-translations 3.85.2

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 (235) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +162 -0
  3. package/dist/clientKeys.d.ts +2 -0
  4. package/dist/clientKeys.d.ts.map +1 -0
  5. package/dist/clientKeys.js +540 -0
  6. package/dist/clientKeys.js.map +1 -0
  7. package/dist/exports/all.d.ts +3 -0
  8. package/dist/exports/all.d.ts.map +1 -0
  9. package/dist/exports/all.js +92 -0
  10. package/dist/exports/all.js.map +1 -0
  11. package/dist/exports/index.d.ts +6 -0
  12. package/dist/exports/index.d.ts.map +1 -0
  13. package/dist/exports/index.js +6 -0
  14. package/dist/exports/index.js.map +1 -0
  15. package/dist/exports/utilities.d.ts +2 -0
  16. package/dist/exports/utilities.d.ts.map +1 -0
  17. package/dist/exports/utilities.js +3 -0
  18. package/dist/exports/utilities.js.map +1 -0
  19. package/dist/importDateFNSLocale.d.ts +3 -0
  20. package/dist/importDateFNSLocale.d.ts.map +1 -0
  21. package/dist/importDateFNSLocale.js +139 -0
  22. package/dist/importDateFNSLocale.js.map +1 -0
  23. package/dist/languages/ar.d.ts +4 -0
  24. package/dist/languages/ar.d.ts.map +1 -0
  25. package/dist/languages/ar.js +616 -0
  26. package/dist/languages/ar.js.map +1 -0
  27. package/dist/languages/az.d.ts +4 -0
  28. package/dist/languages/az.d.ts.map +1 -0
  29. package/dist/languages/az.js +616 -0
  30. package/dist/languages/az.js.map +1 -0
  31. package/dist/languages/bg.d.ts +4 -0
  32. package/dist/languages/bg.d.ts.map +1 -0
  33. package/dist/languages/bg.js +616 -0
  34. package/dist/languages/bg.js.map +1 -0
  35. package/dist/languages/bnBd.d.ts +4 -0
  36. package/dist/languages/bnBd.d.ts.map +1 -0
  37. package/dist/languages/bnBd.js +616 -0
  38. package/dist/languages/bnBd.js.map +1 -0
  39. package/dist/languages/bnIn.d.ts +4 -0
  40. package/dist/languages/bnIn.d.ts.map +1 -0
  41. package/dist/languages/bnIn.js +616 -0
  42. package/dist/languages/bnIn.js.map +1 -0
  43. package/dist/languages/ca.d.ts +4 -0
  44. package/dist/languages/ca.d.ts.map +1 -0
  45. package/dist/languages/ca.js +616 -0
  46. package/dist/languages/ca.js.map +1 -0
  47. package/dist/languages/cs.d.ts +4 -0
  48. package/dist/languages/cs.d.ts.map +1 -0
  49. package/dist/languages/cs.js +616 -0
  50. package/dist/languages/cs.js.map +1 -0
  51. package/dist/languages/da.d.ts +4 -0
  52. package/dist/languages/da.d.ts.map +1 -0
  53. package/dist/languages/da.js +616 -0
  54. package/dist/languages/da.js.map +1 -0
  55. package/dist/languages/de.d.ts +4 -0
  56. package/dist/languages/de.d.ts.map +1 -0
  57. package/dist/languages/de.js +616 -0
  58. package/dist/languages/de.js.map +1 -0
  59. package/dist/languages/en.d.ts +613 -0
  60. package/dist/languages/en.d.ts.map +1 -0
  61. package/dist/languages/en.js +616 -0
  62. package/dist/languages/en.js.map +1 -0
  63. package/dist/languages/es.d.ts +4 -0
  64. package/dist/languages/es.d.ts.map +1 -0
  65. package/dist/languages/es.js +616 -0
  66. package/dist/languages/es.js.map +1 -0
  67. package/dist/languages/et.d.ts +4 -0
  68. package/dist/languages/et.d.ts.map +1 -0
  69. package/dist/languages/et.js +616 -0
  70. package/dist/languages/et.js.map +1 -0
  71. package/dist/languages/fa.d.ts +4 -0
  72. package/dist/languages/fa.d.ts.map +1 -0
  73. package/dist/languages/fa.js +616 -0
  74. package/dist/languages/fa.js.map +1 -0
  75. package/dist/languages/fr.d.ts +4 -0
  76. package/dist/languages/fr.d.ts.map +1 -0
  77. package/dist/languages/fr.js +616 -0
  78. package/dist/languages/fr.js.map +1 -0
  79. package/dist/languages/he.d.ts +4 -0
  80. package/dist/languages/he.d.ts.map +1 -0
  81. package/dist/languages/he.js +616 -0
  82. package/dist/languages/he.js.map +1 -0
  83. package/dist/languages/hr.d.ts +4 -0
  84. package/dist/languages/hr.d.ts.map +1 -0
  85. package/dist/languages/hr.js +616 -0
  86. package/dist/languages/hr.js.map +1 -0
  87. package/dist/languages/hu.d.ts +4 -0
  88. package/dist/languages/hu.d.ts.map +1 -0
  89. package/dist/languages/hu.js +616 -0
  90. package/dist/languages/hu.js.map +1 -0
  91. package/dist/languages/hy.d.ts +4 -0
  92. package/dist/languages/hy.d.ts.map +1 -0
  93. package/dist/languages/hy.js +616 -0
  94. package/dist/languages/hy.js.map +1 -0
  95. package/dist/languages/id.d.ts +4 -0
  96. package/dist/languages/id.d.ts.map +1 -0
  97. package/dist/languages/id.js +616 -0
  98. package/dist/languages/id.js.map +1 -0
  99. package/dist/languages/is.d.ts +4 -0
  100. package/dist/languages/is.d.ts.map +1 -0
  101. package/dist/languages/is.js +616 -0
  102. package/dist/languages/is.js.map +1 -0
  103. package/dist/languages/it.d.ts +4 -0
  104. package/dist/languages/it.d.ts.map +1 -0
  105. package/dist/languages/it.js +616 -0
  106. package/dist/languages/it.js.map +1 -0
  107. package/dist/languages/ja.d.ts +4 -0
  108. package/dist/languages/ja.d.ts.map +1 -0
  109. package/dist/languages/ja.js +616 -0
  110. package/dist/languages/ja.js.map +1 -0
  111. package/dist/languages/ko.d.ts +4 -0
  112. package/dist/languages/ko.d.ts.map +1 -0
  113. package/dist/languages/ko.js +616 -0
  114. package/dist/languages/ko.js.map +1 -0
  115. package/dist/languages/lt.d.ts +4 -0
  116. package/dist/languages/lt.d.ts.map +1 -0
  117. package/dist/languages/lt.js +616 -0
  118. package/dist/languages/lt.js.map +1 -0
  119. package/dist/languages/lv.d.ts +4 -0
  120. package/dist/languages/lv.d.ts.map +1 -0
  121. package/dist/languages/lv.js +616 -0
  122. package/dist/languages/lv.js.map +1 -0
  123. package/dist/languages/my.d.ts +4 -0
  124. package/dist/languages/my.d.ts.map +1 -0
  125. package/dist/languages/my.js +616 -0
  126. package/dist/languages/my.js.map +1 -0
  127. package/dist/languages/nb.d.ts +4 -0
  128. package/dist/languages/nb.d.ts.map +1 -0
  129. package/dist/languages/nb.js +616 -0
  130. package/dist/languages/nb.js.map +1 -0
  131. package/dist/languages/nl.d.ts +4 -0
  132. package/dist/languages/nl.d.ts.map +1 -0
  133. package/dist/languages/nl.js +616 -0
  134. package/dist/languages/nl.js.map +1 -0
  135. package/dist/languages/pl.d.ts +4 -0
  136. package/dist/languages/pl.d.ts.map +1 -0
  137. package/dist/languages/pl.js +616 -0
  138. package/dist/languages/pl.js.map +1 -0
  139. package/dist/languages/pt.d.ts +4 -0
  140. package/dist/languages/pt.d.ts.map +1 -0
  141. package/dist/languages/pt.js +616 -0
  142. package/dist/languages/pt.js.map +1 -0
  143. package/dist/languages/ro.d.ts +4 -0
  144. package/dist/languages/ro.d.ts.map +1 -0
  145. package/dist/languages/ro.js +616 -0
  146. package/dist/languages/ro.js.map +1 -0
  147. package/dist/languages/rs.d.ts +4 -0
  148. package/dist/languages/rs.d.ts.map +1 -0
  149. package/dist/languages/rs.js +616 -0
  150. package/dist/languages/rs.js.map +1 -0
  151. package/dist/languages/rsLatin.d.ts +4 -0
  152. package/dist/languages/rsLatin.d.ts.map +1 -0
  153. package/dist/languages/rsLatin.js +616 -0
  154. package/dist/languages/rsLatin.js.map +1 -0
  155. package/dist/languages/ru.d.ts +4 -0
  156. package/dist/languages/ru.d.ts.map +1 -0
  157. package/dist/languages/ru.js +616 -0
  158. package/dist/languages/ru.js.map +1 -0
  159. package/dist/languages/sk.d.ts +4 -0
  160. package/dist/languages/sk.d.ts.map +1 -0
  161. package/dist/languages/sk.js +616 -0
  162. package/dist/languages/sk.js.map +1 -0
  163. package/dist/languages/sl.d.ts +4 -0
  164. package/dist/languages/sl.d.ts.map +1 -0
  165. package/dist/languages/sl.js +616 -0
  166. package/dist/languages/sl.js.map +1 -0
  167. package/dist/languages/sv.d.ts +4 -0
  168. package/dist/languages/sv.d.ts.map +1 -0
  169. package/dist/languages/sv.js +616 -0
  170. package/dist/languages/sv.js.map +1 -0
  171. package/dist/languages/ta.d.ts +4 -0
  172. package/dist/languages/ta.d.ts.map +1 -0
  173. package/dist/languages/ta.js +616 -0
  174. package/dist/languages/ta.js.map +1 -0
  175. package/dist/languages/th.d.ts +4 -0
  176. package/dist/languages/th.d.ts.map +1 -0
  177. package/dist/languages/th.js +616 -0
  178. package/dist/languages/th.js.map +1 -0
  179. package/dist/languages/tr.d.ts +4 -0
  180. package/dist/languages/tr.d.ts.map +1 -0
  181. package/dist/languages/tr.js +616 -0
  182. package/dist/languages/tr.js.map +1 -0
  183. package/dist/languages/uk.d.ts +4 -0
  184. package/dist/languages/uk.d.ts.map +1 -0
  185. package/dist/languages/uk.js +616 -0
  186. package/dist/languages/uk.js.map +1 -0
  187. package/dist/languages/vi.d.ts +4 -0
  188. package/dist/languages/vi.d.ts.map +1 -0
  189. package/dist/languages/vi.js +616 -0
  190. package/dist/languages/vi.js.map +1 -0
  191. package/dist/languages/zh.d.ts +4 -0
  192. package/dist/languages/zh.d.ts.map +1 -0
  193. package/dist/languages/zh.js +616 -0
  194. package/dist/languages/zh.js.map +1 -0
  195. package/dist/languages/zhTw.d.ts +4 -0
  196. package/dist/languages/zhTw.d.ts.map +1 -0
  197. package/dist/languages/zhTw.js +616 -0
  198. package/dist/languages/zhTw.js.map +1 -0
  199. package/dist/types.d.ts +97 -0
  200. package/dist/types.d.ts.map +1 -0
  201. package/dist/types.js +3 -0
  202. package/dist/types.js.map +1 -0
  203. package/dist/utilities/copyFile.d.ts +2 -0
  204. package/dist/utilities/copyFile.d.ts.map +1 -0
  205. package/dist/utilities/copyFile.js +13 -0
  206. package/dist/utilities/copyFile.js.map +1 -0
  207. package/dist/utilities/deepMergeSimple.d.ts +12 -0
  208. package/dist/utilities/deepMergeSimple.d.ts.map +1 -0
  209. package/dist/utilities/deepMergeSimple.js +32 -0
  210. package/dist/utilities/deepMergeSimple.js.map +1 -0
  211. package/dist/utilities/deepMergeSimple.spec.js +81 -0
  212. package/dist/utilities/deepMergeSimple.spec.js.map +1 -0
  213. package/dist/utilities/ensureDirExists.d.ts +2 -0
  214. package/dist/utilities/ensureDirExists.d.ts.map +1 -0
  215. package/dist/utilities/ensureDirExists.js +16 -0
  216. package/dist/utilities/ensureDirExists.js.map +1 -0
  217. package/dist/utilities/getTranslation.d.ts +9 -0
  218. package/dist/utilities/getTranslation.d.ts.map +1 -0
  219. package/dist/utilities/getTranslation.js +33 -0
  220. package/dist/utilities/getTranslation.js.map +1 -0
  221. package/dist/utilities/getTranslationsByContext.d.ts +612 -0
  222. package/dist/utilities/getTranslationsByContext.d.ts.map +1 -0
  223. package/dist/utilities/getTranslationsByContext.js +61 -0
  224. package/dist/utilities/getTranslationsByContext.js.map +1 -0
  225. package/dist/utilities/init.d.ts +645 -0
  226. package/dist/utilities/init.d.ts.map +1 -0
  227. package/dist/utilities/init.js +140 -0
  228. package/dist/utilities/init.js.map +1 -0
  229. package/dist/utilities/languages.d.ts +5 -0
  230. package/dist/utilities/languages.d.ts.map +1 -0
  231. package/dist/utilities/languages.js +84 -0
  232. package/dist/utilities/languages.js.map +1 -0
  233. package/dist/utilities/languages.spec.js +42 -0
  234. package/dist/utilities/languages.spec.js.map +1 -0
  235. package/package.json +68 -0
@@ -0,0 +1,140 @@
1
+ import { importDateFNSLocale } from '../importDateFNSLocale.js';
2
+ import { deepMergeSimple } from './deepMergeSimple.js';
3
+ import { getTranslationsByContext } from './getTranslationsByContext.js';
4
+ /**
5
+ * @function getTranslationString
6
+ *
7
+ * Gets a translation string from a translations object
8
+ *
9
+ * @returns string
10
+ */ export const getTranslationString = ({ count, key, translations })=>{
11
+ const keys = key.split(':');
12
+ let keySuffix = '';
13
+ const translation = keys.reduce((acc, key, index)=>{
14
+ if (typeof acc === 'string') {
15
+ return acc;
16
+ }
17
+ if (typeof count === 'number') {
18
+ if (count === 0 && `${key}_zero` in acc) {
19
+ keySuffix = '_zero';
20
+ } else if (count === 1 && `${key}_one` in acc) {
21
+ keySuffix = '_one';
22
+ } else if (count === 2 && `${key}_two` in acc) {
23
+ keySuffix = '_two';
24
+ } else if (count > 5 && `${key}_many` in acc) {
25
+ keySuffix = '_many';
26
+ } else if (count > 2 && count <= 5 && `${key}_few` in acc) {
27
+ keySuffix = '_few';
28
+ } else if (`${key}_other` in acc) {
29
+ keySuffix = '_other';
30
+ }
31
+ }
32
+ let keyToUse = key;
33
+ if (index === keys.length - 1 && keySuffix) {
34
+ keyToUse = `${key}${keySuffix}`;
35
+ }
36
+ if (acc && keyToUse in acc) {
37
+ return acc[keyToUse];
38
+ }
39
+ return undefined;
40
+ }, translations);
41
+ if (!translation) {
42
+ console.log('key not found:', key);
43
+ }
44
+ return translation || key;
45
+ };
46
+ /**
47
+ * @function replaceVars
48
+ *
49
+ * Replaces variables in a translation string with values from an object
50
+ *
51
+ * @returns string
52
+ */ const replaceVars = ({ translationString, vars })=>{
53
+ const parts = translationString.split(/(\{\{.*?\}\})/);
54
+ return parts.map((part)=>{
55
+ if (part.startsWith('{{') && part.endsWith('}}')) {
56
+ const placeholder = part.substring(2, part.length - 2).trim();
57
+ const value = vars[placeholder];
58
+ return value !== undefined && value !== null ? value : part;
59
+ } else {
60
+ return part;
61
+ }
62
+ }).join('');
63
+ };
64
+ /**
65
+ * @function t
66
+ *
67
+ * Merges config defined translations with translations passed in as an argument
68
+ * returns a function that can be used to translate a string
69
+ *
70
+ * @returns string
71
+ */ export function t({ key, translations, vars }) {
72
+ let translationString = getTranslationString({
73
+ count: typeof vars?.count === 'number' ? vars.count : undefined,
74
+ key,
75
+ translations
76
+ });
77
+ if (vars) {
78
+ translationString = replaceVars({
79
+ translationString,
80
+ vars
81
+ });
82
+ }
83
+ if (!translationString) {
84
+ translationString = key;
85
+ }
86
+ return translationString;
87
+ }
88
+ const initTFunction = (args)=>{
89
+ const { config, language, translations } = args;
90
+ const mergedTranslations = language && config?.translations?.[language] ? deepMergeSimple(translations, config.translations[language]) : translations;
91
+ return {
92
+ t: (key, vars)=>{
93
+ return t({
94
+ key,
95
+ translations: mergedTranslations,
96
+ vars
97
+ });
98
+ },
99
+ translations: mergedTranslations
100
+ };
101
+ };
102
+ function memoize(fn, keys) {
103
+ const cacheMap = new Map();
104
+ const memoized = async (args)=>{
105
+ const cacheKey = keys.reduce((acc, key)=>acc + String(args[key]), '');
106
+ if (!cacheMap.has(cacheKey)) {
107
+ const result = await fn(args);
108
+ cacheMap.set(cacheKey, result);
109
+ }
110
+ return cacheMap.get(cacheKey);
111
+ };
112
+ return memoized;
113
+ }
114
+ export const initI18n = memoize(async ({ config, context, language = config.fallbackLanguage })=>{
115
+ if (!language || !config.supportedLanguages?.[language]) {
116
+ throw new Error(`Language ${language} not supported`);
117
+ }
118
+ const translations = getTranslationsByContext(config.supportedLanguages?.[language], context);
119
+ const { t, translations: mergedTranslations } = initTFunction({
120
+ config: config,
121
+ language: language || config.fallbackLanguage,
122
+ translations: translations
123
+ });
124
+ const dateFNSKey = config.supportedLanguages[language]?.dateFNSKey || 'en-US';
125
+ const dateFNS = await importDateFNSLocale(dateFNSKey);
126
+ const i18n = {
127
+ dateFNS,
128
+ dateFNSKey,
129
+ fallbackLanguage: config.fallbackLanguage,
130
+ language: language || config.fallbackLanguage,
131
+ t,
132
+ translations: mergedTranslations
133
+ };
134
+ return i18n;
135
+ }, [
136
+ 'language',
137
+ 'context'
138
+ ]);
139
+
140
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/init.ts"],"sourcesContent":["import type {\n DefaultTranslationKeys,\n DefaultTranslationsObject,\n I18n,\n InitI18n,\n InitTFunction,\n Language,\n} from '../types.js'\n\nimport { importDateFNSLocale } from '../importDateFNSLocale.js'\nimport { deepMergeSimple } from './deepMergeSimple.js'\nimport { getTranslationsByContext } from './getTranslationsByContext.js'\n\n/**\n * @function getTranslationString\n *\n * Gets a translation string from a translations object\n *\n * @returns string\n */\nexport const getTranslationString = <\n TTranslations = DefaultTranslationsObject,\n TTranslationKeys = DefaultTranslationKeys,\n>({\n count,\n key,\n translations,\n}: {\n count?: number\n key: TTranslationKeys\n translations: Language<TTranslations>['translations']\n}): string => {\n const keys = (key as DefaultTranslationKeys).split(':')\n let keySuffix = ''\n\n const translation: string = keys.reduce((acc: any, key, index) => {\n if (typeof acc === 'string') {\n return acc\n }\n\n if (typeof count === 'number') {\n if (count === 0 && `${key}_zero` in acc) {\n keySuffix = '_zero'\n } else if (count === 1 && `${key}_one` in acc) {\n keySuffix = '_one'\n } else if (count === 2 && `${key}_two` in acc) {\n keySuffix = '_two'\n } else if (count > 5 && `${key}_many` in acc) {\n keySuffix = '_many'\n } else if (count > 2 && count <= 5 && `${key}_few` in acc) {\n keySuffix = '_few'\n } else if (`${key}_other` in acc) {\n keySuffix = '_other'\n }\n }\n let keyToUse = key\n if (index === keys.length - 1 && keySuffix) {\n keyToUse = `${key}${keySuffix}`\n }\n\n if (acc && keyToUse in acc) {\n return acc[keyToUse]\n }\n\n return undefined\n }, translations)\n\n if (!translation) {\n console.log('key not found:', key)\n }\n\n return translation || (key as string)\n}\n\n/**\n * @function replaceVars\n *\n * Replaces variables in a translation string with values from an object\n *\n * @returns string\n */\nconst replaceVars = ({\n translationString,\n vars,\n}: {\n translationString: string\n vars: {\n [key: string]: any\n }\n}) => {\n const parts = translationString.split(/(\\{\\{.*?\\}\\})/)\n\n return parts\n .map((part) => {\n if (part.startsWith('{{') && part.endsWith('}}')) {\n const placeholder = part.substring(2, part.length - 2).trim()\n const value = vars[placeholder]\n return value !== undefined && value !== null ? value : part\n } else {\n return part\n }\n })\n .join('')\n}\n\n/**\n * @function t\n *\n * Merges config defined translations with translations passed in as an argument\n * returns a function that can be used to translate a string\n *\n * @returns string\n */\nexport function t<\n TTranslations = DefaultTranslationsObject,\n TTranslationKeys = DefaultTranslationKeys,\n>({\n key,\n translations,\n vars,\n}: {\n key: TTranslationKeys\n translations?: Language<TTranslations>['translations']\n vars?: Record<string, any>\n}): string {\n let translationString = getTranslationString({\n count: typeof vars?.count === 'number' ? vars.count : undefined,\n key,\n translations,\n })\n\n if (vars) {\n translationString = replaceVars({\n translationString,\n vars,\n })\n }\n\n if (!translationString) {\n translationString = key as string\n }\n\n return translationString\n}\n\nconst initTFunction: InitTFunction = (args) => {\n const { config, language, translations } = args\n const mergedTranslations =\n language && config?.translations?.[language as keyof typeof config.translations]\n ? deepMergeSimple<DefaultTranslationsObject>(\n translations,\n config.translations[language as keyof typeof config.translations]!,\n )\n : translations\n\n return {\n t: (key, vars) => {\n return t({\n key,\n translations: mergedTranslations,\n vars,\n })\n },\n translations: mergedTranslations,\n }\n}\n\nfunction memoize<T extends Parameters<InitI18n>[0], K extends keyof T>(\n fn: (args: T) => Promise<I18n>,\n keys: K[],\n): (args: T) => Promise<I18n> {\n const cacheMap = new Map<string, I18n>()\n\n const memoized = async (args: T) => {\n const cacheKey = keys.reduce((acc, key) => acc + String(args[key]), '')\n\n if (!cacheMap.has(cacheKey)) {\n const result = await fn(args)\n cacheMap.set(cacheKey, result)\n }\n\n return cacheMap.get(cacheKey)!\n }\n\n return memoized\n}\n\nexport const initI18n = memoize(\n async ({ config, context, language = config.fallbackLanguage }) => {\n if (!language || !config.supportedLanguages?.[language]) {\n throw new Error(`Language ${language} not supported`)\n }\n\n const translations = getTranslationsByContext(config.supportedLanguages?.[language], context)\n\n const { t, translations: mergedTranslations } = initTFunction({\n config: config as any,\n language: language || config.fallbackLanguage,\n translations: translations as any,\n })\n\n const dateFNSKey = config.supportedLanguages[language]?.dateFNSKey || 'en-US'\n\n const dateFNS = await importDateFNSLocale(dateFNSKey)\n\n const i18n: I18n = {\n dateFNS,\n dateFNSKey,\n fallbackLanguage: config.fallbackLanguage!,\n language: language || config.fallbackLanguage,\n t,\n translations: mergedTranslations,\n }\n\n return i18n\n },\n ['language', 'context'] satisfies Array<keyof Parameters<InitI18n>[0]>,\n)\n"],"names":["importDateFNSLocale","deepMergeSimple","getTranslationsByContext","getTranslationString","count","key","translations","keys","split","keySuffix","translation","reduce","acc","index","keyToUse","length","undefined","console","log","replaceVars","translationString","vars","parts","map","part","startsWith","endsWith","placeholder","substring","trim","value","join","t","initTFunction","args","config","language","mergedTranslations","memoize","fn","cacheMap","Map","memoized","cacheKey","String","has","result","set","get","initI18n","context","fallbackLanguage","supportedLanguages","Error","dateFNSKey","dateFNS","i18n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AcceptedLanguages } from '../types.js';
2
+ export declare const rtlLanguages: readonly ["ar", "fa", "he"];
3
+ export declare const acceptedLanguages: readonly ["ar", "az", "bg", "bn-BD", "bn-IN", "ca", "cs", "bn-BD", "bn-IN", "da", "de", "en", "es", "et", "fa", "fr", "he", "hr", "hu", "hy", "id", "is", "it", "ja", "ko", "lt", "lv", "my", "nb", "nl", "pl", "pt", "ro", "rs", "rs-latin", "ru", "sk", "sl", "sv", "ta", "th", "tr", "uk", "vi", "zh", "zh-TW"];
4
+ export declare function extractHeaderLanguage(acceptLanguageHeader: string): AcceptedLanguages | undefined;
5
+ //# sourceMappingURL=languages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../../src/utilities/languages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAA;AAExE,eAAO,MAAM,YAAY,6BAA8B,CAAA;AAEvD,eAAO,MAAM,iBAAiB,oTAmIpB,CAAA;AAkBV,wBAAgB,qBAAqB,CAAC,oBAAoB,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAuBjG"}
@@ -0,0 +1,84 @@
1
+ export const rtlLanguages = [
2
+ 'ar',
3
+ 'fa',
4
+ 'he'
5
+ ];
6
+ export const acceptedLanguages = [
7
+ 'ar',
8
+ 'az',
9
+ 'bg',
10
+ 'bn-BD',
11
+ 'bn-IN',
12
+ 'ca',
13
+ 'cs',
14
+ 'bn-BD',
15
+ 'bn-IN',
16
+ 'da',
17
+ 'de',
18
+ 'en',
19
+ 'es',
20
+ 'et',
21
+ 'fa',
22
+ 'fr',
23
+ 'he',
24
+ 'hr',
25
+ 'hu',
26
+ 'hy',
27
+ 'id',
28
+ 'is',
29
+ 'it',
30
+ 'ja',
31
+ 'ko',
32
+ 'lt',
33
+ 'lv',
34
+ 'my',
35
+ 'nb',
36
+ 'nl',
37
+ 'pl',
38
+ 'pt',
39
+ 'ro',
40
+ 'rs',
41
+ 'rs-latin',
42
+ 'ru',
43
+ 'sk',
44
+ 'sl',
45
+ 'sv',
46
+ 'ta',
47
+ 'th',
48
+ 'tr',
49
+ 'uk',
50
+ 'vi',
51
+ 'zh',
52
+ 'zh-TW'
53
+ ];
54
+ function parseAcceptLanguage(acceptLanguageHeader) {
55
+ return acceptLanguageHeader.split(',').map((lang)=>{
56
+ const [language, quality] = lang.trim().split(';q=');
57
+ return {
58
+ language,
59
+ quality: quality ? parseFloat(quality) : 1
60
+ };
61
+ }).sort((a, b)=>b.quality - a.quality) // Sort by quality, highest to lowest
62
+ ;
63
+ }
64
+ export function extractHeaderLanguage(acceptLanguageHeader) {
65
+ const parsedHeader = parseAcceptLanguage(acceptLanguageHeader);
66
+ let matchedLanguage;
67
+ for (const { language } of parsedHeader){
68
+ if (matchedLanguage) {
69
+ break;
70
+ }
71
+ if (acceptedLanguages.includes(language)) {
72
+ matchedLanguage = language;
73
+ break;
74
+ }
75
+ const baseLanguage = language.split('-')[0];
76
+ if (acceptedLanguages.includes(baseLanguage)) {
77
+ matchedLanguage = baseLanguage;
78
+ break;
79
+ }
80
+ }
81
+ return matchedLanguage;
82
+ }
83
+
84
+ //# sourceMappingURL=languages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/languages.ts"],"sourcesContent":["import type { AcceptedLanguages, LanguagePreference } from '../types.js'\n\nexport const rtlLanguages = ['ar', 'fa', 'he'] as const\n\nexport const acceptedLanguages = [\n 'ar',\n 'az',\n 'bg',\n 'bn-BD',\n 'bn-IN',\n 'ca',\n 'cs',\n 'bn-BD',\n 'bn-IN',\n 'da',\n 'de',\n 'en',\n 'es',\n 'et',\n 'fa',\n 'fr',\n 'he',\n 'hr',\n 'hu',\n 'hy',\n 'id',\n 'is',\n 'it',\n 'ja',\n 'ko',\n 'lt',\n 'lv',\n 'my',\n 'nb',\n 'nl',\n 'pl',\n 'pt',\n 'ro',\n 'rs',\n 'rs-latin',\n 'ru',\n 'sk',\n 'sl',\n 'sv',\n 'ta',\n 'th',\n 'tr',\n 'uk',\n 'vi',\n 'zh',\n 'zh-TW',\n\n /**\n * Languages not implemented:\n *\n * 'af',\n * 'am',\n * 'ar-sa',\n * 'as',\n * 'az-latin',\n * 'be',\n * 'bs',\n * 'ca-ES-valencia',\n * 'cy',\n * 'el',\n * 'en-GB',\n * 'en-US',\n * 'es-ES',\n * 'es-US',\n * 'es-MX',\n * 'eu',\n * 'fi',\n * 'fil-Latn',\n * 'fr-FR',\n * 'fr-CA',\n * 'ga',\n * 'gd-Latn',\n * 'gl',\n * 'gu',\n * 'ha-Latn',\n * 'hi',\n * 'ig-Latn',\n * 'it-it',\n * 'ka',\n * 'kk',\n * 'km',\n * 'kn',\n * 'kok',\n * 'ku-Arab',\n * 'ky-Cyrl',\n * 'lb',\n * 'mi-Latn',\n * 'mk',\n * 'ml',\n * 'mn-Cyrl',\n * 'mr',\n * 'ms',\n * 'mt',\n * 'ne',\n * 'nl-BE',\n * 'nn',\n * 'nso',\n * 'or',\n * 'pa',\n * 'pa-Arab',\n * 'prs-Arab',\n * 'pt-BR',\n * 'pt-PT',\n * 'qut-Latn',\n * 'quz',\n * 'rw',\n * 'sd-Arab',\n * 'si',\n * 'sq',\n * 'sr-Cyrl-BA',\n * 'sr-Cyrl-RS',\n * 'sr-Latn-RS',\n * 'sw',\n * 'ta',\n * 'te',\n * 'tg-Cyrl',\n * 'ti',\n * 'tk-Latn',\n * 'tn',\n * 'tt-Cyrl',\n * 'ug-Arab',\n * 'ur',\n * 'uz-Latn',\n * 'wo',\n * 'xh',\n * 'yo-Latn',\n * 'zh-Hans',\n * 'zh-Hant',\n * 'zu',\n */\n] as const\n\nfunction parseAcceptLanguage(acceptLanguageHeader: string): LanguagePreference[] {\n return acceptLanguageHeader\n .split(',')\n .map((lang) => {\n const [language, quality] = lang.trim().split(';q=') as [\n AcceptedLanguages,\n string | undefined,\n ]\n return {\n language,\n quality: quality ? parseFloat(quality) : 1,\n }\n })\n .sort((a, b) => b.quality - a.quality) // Sort by quality, highest to lowest\n}\n\nexport function extractHeaderLanguage(acceptLanguageHeader: string): AcceptedLanguages | undefined {\n const parsedHeader = parseAcceptLanguage(acceptLanguageHeader)\n\n let matchedLanguage: AcceptedLanguages | undefined\n\n for (const { language } of parsedHeader) {\n if (matchedLanguage) {\n break\n }\n\n if (acceptedLanguages.includes(language)) {\n matchedLanguage = language\n break\n }\n\n const baseLanguage = language.split('-')[0] as AcceptedLanguages\n if (acceptedLanguages.includes(baseLanguage)) {\n matchedLanguage = baseLanguage\n break\n }\n }\n\n return matchedLanguage\n}\n"],"names":["rtlLanguages","acceptedLanguages","parseAcceptLanguage","acceptLanguageHeader","split","map","lang","language","quality","trim","parseFloat","sort","a","b","extractHeaderLanguage","parsedHeader","matchedLanguage","includes","baseLanguage"],"mappings":"AAEA,OAAO,MAAMA,eAAe;IAAC;IAAM;IAAM;CAAK,CAAS;AAEvD,OAAO,MAAMC,oBAAoB;IAC/B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CAqFD,CAAS;AAEV,SAASC,oBAAoBC,oBAA4B;IACvD,OAAOA,qBACJC,KAAK,CAAC,KACNC,GAAG,CAAC,CAACC;QACJ,MAAM,CAACC,UAAUC,QAAQ,GAAGF,KAAKG,IAAI,GAAGL,KAAK,CAAC;QAI9C,OAAO;YACLG;YACAC,SAASA,UAAUE,WAAWF,WAAW;QAC3C;IACF,GACCG,IAAI,CAAC,CAACC,GAAGC,IAAMA,EAAEL,OAAO,GAAGI,EAAEJ,OAAO,EAAE,qCAAqC;;AAChF;AAEA,OAAO,SAASM,sBAAsBX,oBAA4B;IAChE,MAAMY,eAAeb,oBAAoBC;IAEzC,IAAIa;IAEJ,KAAK,MAAM,EAAET,QAAQ,EAAE,IAAIQ,aAAc;QACvC,IAAIC,iBAAiB;YACnB;QACF;QAEA,IAAIf,kBAAkBgB,QAAQ,CAACV,WAAW;YACxCS,kBAAkBT;YAClB;QACF;QAEA,MAAMW,eAAeX,SAASH,KAAK,CAAC,IAAI,CAAC,EAAE;QAC3C,IAAIH,kBAAkBgB,QAAQ,CAACC,eAAe;YAC5CF,kBAAkBE;YAClB;QACF;IACF;IAEA,OAAOF;AACT"}
@@ -0,0 +1,42 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { extractHeaderLanguage } from './languages.js';
3
+ describe('extractHeaderLanguage', ()=>{
4
+ it('should return exact match when base language tag is supported', ()=>{
5
+ expect(extractHeaderLanguage('ja')).toBe('ja');
6
+ expect(extractHeaderLanguage('en')).toBe('en');
7
+ expect(extractHeaderLanguage('de')).toBe('de');
8
+ });
9
+ it('should fall back to base tag when regional tag has no exact match', ()=>{
10
+ expect(extractHeaderLanguage('ja-JP')).toBe('ja');
11
+ expect(extractHeaderLanguage('de-AT')).toBe('de');
12
+ expect(extractHeaderLanguage('fr-BE')).toBe('fr');
13
+ });
14
+ it('should match exact regional tag when it is supported', ()=>{
15
+ // zh-TW is in acceptedLanguages, so it should match directly
16
+ expect(extractHeaderLanguage('zh-TW')).toBe('zh-TW');
17
+ // bn-BD is in acceptedLanguages
18
+ expect(extractHeaderLanguage('bn-BD')).toBe('bn-BD');
19
+ });
20
+ it('should fall back to base tag for unsupported regional variant of a supported regional language', ()=>{
21
+ // zh-CN is not in acceptedLanguages, but zh is
22
+ expect(extractHeaderLanguage('zh-CN')).toBe('zh');
23
+ });
24
+ it('should return undefined for unsupported languages', ()=>{
25
+ expect(extractHeaderLanguage('xx')).toBeUndefined();
26
+ expect(extractHeaderLanguage('xx-XX')).toBeUndefined();
27
+ });
28
+ it('should respect quality ordering and return highest quality supported language', ()=>{
29
+ expect(extractHeaderLanguage('ja-JP;q=0.9, en;q=1.0')).toBe('en');
30
+ expect(extractHeaderLanguage('ja-JP, en;q=0.9')).toBe('ja');
31
+ });
32
+ it('should skip unsupported languages and find the next supported one', ()=>{
33
+ expect(extractHeaderLanguage('xx-XX, ja-JP')).toBe('ja');
34
+ expect(extractHeaderLanguage('xx, yy, de-DE')).toBe('de');
35
+ });
36
+ it('should handle empty string', ()=>{
37
+ // empty string produces one entry with empty language, which won't match
38
+ expect(extractHeaderLanguage('')).toBeUndefined();
39
+ });
40
+ });
41
+
42
+ //# sourceMappingURL=languages.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/languages.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { extractHeaderLanguage } from './languages.js'\n\ndescribe('extractHeaderLanguage', () => {\n it('should return exact match when base language tag is supported', () => {\n expect(extractHeaderLanguage('ja')).toBe('ja')\n expect(extractHeaderLanguage('en')).toBe('en')\n expect(extractHeaderLanguage('de')).toBe('de')\n })\n\n it('should fall back to base tag when regional tag has no exact match', () => {\n expect(extractHeaderLanguage('ja-JP')).toBe('ja')\n expect(extractHeaderLanguage('de-AT')).toBe('de')\n expect(extractHeaderLanguage('fr-BE')).toBe('fr')\n })\n\n it('should match exact regional tag when it is supported', () => {\n // zh-TW is in acceptedLanguages, so it should match directly\n expect(extractHeaderLanguage('zh-TW')).toBe('zh-TW')\n // bn-BD is in acceptedLanguages\n expect(extractHeaderLanguage('bn-BD')).toBe('bn-BD')\n })\n\n it('should fall back to base tag for unsupported regional variant of a supported regional language', () => {\n // zh-CN is not in acceptedLanguages, but zh is\n expect(extractHeaderLanguage('zh-CN')).toBe('zh')\n })\n\n it('should return undefined for unsupported languages', () => {\n expect(extractHeaderLanguage('xx')).toBeUndefined()\n expect(extractHeaderLanguage('xx-XX')).toBeUndefined()\n })\n\n it('should respect quality ordering and return highest quality supported language', () => {\n expect(extractHeaderLanguage('ja-JP;q=0.9, en;q=1.0')).toBe('en')\n expect(extractHeaderLanguage('ja-JP, en;q=0.9')).toBe('ja')\n })\n\n it('should skip unsupported languages and find the next supported one', () => {\n expect(extractHeaderLanguage('xx-XX, ja-JP')).toBe('ja')\n expect(extractHeaderLanguage('xx, yy, de-DE')).toBe('de')\n })\n\n it('should handle empty string', () => {\n // empty string produces one entry with empty language, which won't match\n expect(extractHeaderLanguage('')).toBeUndefined()\n })\n})\n"],"names":["describe","expect","it","extractHeaderLanguage","toBe","toBeUndefined"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,qBAAqB,QAAQ,iBAAgB;AAEtDH,SAAS,yBAAyB;IAChCE,GAAG,iEAAiE;QAClED,OAAOE,sBAAsB,OAAOC,IAAI,CAAC;QACzCH,OAAOE,sBAAsB,OAAOC,IAAI,CAAC;QACzCH,OAAOE,sBAAsB,OAAOC,IAAI,CAAC;IAC3C;IAEAF,GAAG,qEAAqE;QACtED,OAAOE,sBAAsB,UAAUC,IAAI,CAAC;QAC5CH,OAAOE,sBAAsB,UAAUC,IAAI,CAAC;QAC5CH,OAAOE,sBAAsB,UAAUC,IAAI,CAAC;IAC9C;IAEAF,GAAG,wDAAwD;QACzD,6DAA6D;QAC7DD,OAAOE,sBAAsB,UAAUC,IAAI,CAAC;QAC5C,gCAAgC;QAChCH,OAAOE,sBAAsB,UAAUC,IAAI,CAAC;IAC9C;IAEAF,GAAG,kGAAkG;QACnG,+CAA+C;QAC/CD,OAAOE,sBAAsB,UAAUC,IAAI,CAAC;IAC9C;IAEAF,GAAG,qDAAqD;QACtDD,OAAOE,sBAAsB,OAAOE,aAAa;QACjDJ,OAAOE,sBAAsB,UAAUE,aAAa;IACtD;IAEAH,GAAG,iFAAiF;QAClFD,OAAOE,sBAAsB,0BAA0BC,IAAI,CAAC;QAC5DH,OAAOE,sBAAsB,oBAAoBC,IAAI,CAAC;IACxD;IAEAF,GAAG,qEAAqE;QACtED,OAAOE,sBAAsB,iBAAiBC,IAAI,CAAC;QACnDH,OAAOE,sBAAsB,kBAAkBC,IAAI,CAAC;IACtD;IAEAF,GAAG,8BAA8B;QAC/B,yEAAyE;QACzED,OAAOE,sBAAsB,KAAKE,aAAa;IACjD;AACF"}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@hanzo/cms-translations",
3
+ "version": "3.85.2",
4
+ "homepage": "https://payloadcms.com",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/payloadcms/payload.git",
8
+ "directory": "packages/translations"
9
+ },
10
+ "license": "MIT",
11
+ "author": "Payload <dev@payloadcms.com> (https://payloadcms.com)",
12
+ "maintainers": [
13
+ {
14
+ "name": "Payload",
15
+ "email": "info@payloadcms.com",
16
+ "url": "https://payloadcms.com"
17
+ }
18
+ ],
19
+ "sideEffects": false,
20
+ "type": "module",
21
+ "exports": {
22
+ ".": {
23
+ "import": "./dist/exports/index.js",
24
+ "types": "./dist/exports/index.d.ts",
25
+ "default": "./dist/exports/index.js"
26
+ },
27
+ "./all": {
28
+ "import": "./dist/exports/all.js",
29
+ "types": "./dist/exports/all.d.ts",
30
+ "default": "./dist/exports/all.js"
31
+ },
32
+ "./utilities": {
33
+ "import": "./dist/exports/utilities.js",
34
+ "types": "./dist/exports/utilities.d.ts",
35
+ "default": "./dist/exports/utilities.js"
36
+ },
37
+ "./languages/*": {
38
+ "import": "./dist/languages/*.js",
39
+ "types": "./dist/languages/*.d.ts",
40
+ "default": "./dist/languages/*.js"
41
+ }
42
+ },
43
+ "main": "./dist/exports/index.js",
44
+ "types": "./dist/exports/index.d.ts",
45
+ "files": [
46
+ "dist"
47
+ ],
48
+ "dependencies": {
49
+ "date-fns": "4.1.0"
50
+ },
51
+ "devDependencies": {
52
+ "@types/react": "19.2.14",
53
+ "@types/react-dom": "19.2.3",
54
+ "dotenv": "16.4.7",
55
+ "prettier": "3.5.3",
56
+ "typescript": "5.7.3",
57
+ "@hanzo/cms-eslint-config": "3.28.0"
58
+ },
59
+ "scripts": {
60
+ "build": "pnpm build:types && pnpm build:swc",
61
+ "build:debug": "pnpm build",
62
+ "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
63
+ "build:types": "tsc --emitDeclarationOnly --outDir dist",
64
+ "clean": "rimraf -g {dist,*.tsbuildinfo}",
65
+ "lint": "eslint .",
66
+ "lint:fix": "eslint . --fix"
67
+ }
68
+ }