@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.
- package/LICENSE.md +22 -0
- package/README.md +162 -0
- package/dist/clientKeys.d.ts +2 -0
- package/dist/clientKeys.d.ts.map +1 -0
- package/dist/clientKeys.js +540 -0
- package/dist/clientKeys.js.map +1 -0
- package/dist/exports/all.d.ts +3 -0
- package/dist/exports/all.d.ts.map +1 -0
- package/dist/exports/all.js +92 -0
- package/dist/exports/all.js.map +1 -0
- package/dist/exports/index.d.ts +6 -0
- package/dist/exports/index.d.ts.map +1 -0
- package/dist/exports/index.js +6 -0
- package/dist/exports/index.js.map +1 -0
- package/dist/exports/utilities.d.ts +2 -0
- package/dist/exports/utilities.d.ts.map +1 -0
- package/dist/exports/utilities.js +3 -0
- package/dist/exports/utilities.js.map +1 -0
- package/dist/importDateFNSLocale.d.ts +3 -0
- package/dist/importDateFNSLocale.d.ts.map +1 -0
- package/dist/importDateFNSLocale.js +139 -0
- package/dist/importDateFNSLocale.js.map +1 -0
- package/dist/languages/ar.d.ts +4 -0
- package/dist/languages/ar.d.ts.map +1 -0
- package/dist/languages/ar.js +616 -0
- package/dist/languages/ar.js.map +1 -0
- package/dist/languages/az.d.ts +4 -0
- package/dist/languages/az.d.ts.map +1 -0
- package/dist/languages/az.js +616 -0
- package/dist/languages/az.js.map +1 -0
- package/dist/languages/bg.d.ts +4 -0
- package/dist/languages/bg.d.ts.map +1 -0
- package/dist/languages/bg.js +616 -0
- package/dist/languages/bg.js.map +1 -0
- package/dist/languages/bnBd.d.ts +4 -0
- package/dist/languages/bnBd.d.ts.map +1 -0
- package/dist/languages/bnBd.js +616 -0
- package/dist/languages/bnBd.js.map +1 -0
- package/dist/languages/bnIn.d.ts +4 -0
- package/dist/languages/bnIn.d.ts.map +1 -0
- package/dist/languages/bnIn.js +616 -0
- package/dist/languages/bnIn.js.map +1 -0
- package/dist/languages/ca.d.ts +4 -0
- package/dist/languages/ca.d.ts.map +1 -0
- package/dist/languages/ca.js +616 -0
- package/dist/languages/ca.js.map +1 -0
- package/dist/languages/cs.d.ts +4 -0
- package/dist/languages/cs.d.ts.map +1 -0
- package/dist/languages/cs.js +616 -0
- package/dist/languages/cs.js.map +1 -0
- package/dist/languages/da.d.ts +4 -0
- package/dist/languages/da.d.ts.map +1 -0
- package/dist/languages/da.js +616 -0
- package/dist/languages/da.js.map +1 -0
- package/dist/languages/de.d.ts +4 -0
- package/dist/languages/de.d.ts.map +1 -0
- package/dist/languages/de.js +616 -0
- package/dist/languages/de.js.map +1 -0
- package/dist/languages/en.d.ts +613 -0
- package/dist/languages/en.d.ts.map +1 -0
- package/dist/languages/en.js +616 -0
- package/dist/languages/en.js.map +1 -0
- package/dist/languages/es.d.ts +4 -0
- package/dist/languages/es.d.ts.map +1 -0
- package/dist/languages/es.js +616 -0
- package/dist/languages/es.js.map +1 -0
- package/dist/languages/et.d.ts +4 -0
- package/dist/languages/et.d.ts.map +1 -0
- package/dist/languages/et.js +616 -0
- package/dist/languages/et.js.map +1 -0
- package/dist/languages/fa.d.ts +4 -0
- package/dist/languages/fa.d.ts.map +1 -0
- package/dist/languages/fa.js +616 -0
- package/dist/languages/fa.js.map +1 -0
- package/dist/languages/fr.d.ts +4 -0
- package/dist/languages/fr.d.ts.map +1 -0
- package/dist/languages/fr.js +616 -0
- package/dist/languages/fr.js.map +1 -0
- package/dist/languages/he.d.ts +4 -0
- package/dist/languages/he.d.ts.map +1 -0
- package/dist/languages/he.js +616 -0
- package/dist/languages/he.js.map +1 -0
- package/dist/languages/hr.d.ts +4 -0
- package/dist/languages/hr.d.ts.map +1 -0
- package/dist/languages/hr.js +616 -0
- package/dist/languages/hr.js.map +1 -0
- package/dist/languages/hu.d.ts +4 -0
- package/dist/languages/hu.d.ts.map +1 -0
- package/dist/languages/hu.js +616 -0
- package/dist/languages/hu.js.map +1 -0
- package/dist/languages/hy.d.ts +4 -0
- package/dist/languages/hy.d.ts.map +1 -0
- package/dist/languages/hy.js +616 -0
- package/dist/languages/hy.js.map +1 -0
- package/dist/languages/id.d.ts +4 -0
- package/dist/languages/id.d.ts.map +1 -0
- package/dist/languages/id.js +616 -0
- package/dist/languages/id.js.map +1 -0
- package/dist/languages/is.d.ts +4 -0
- package/dist/languages/is.d.ts.map +1 -0
- package/dist/languages/is.js +616 -0
- package/dist/languages/is.js.map +1 -0
- package/dist/languages/it.d.ts +4 -0
- package/dist/languages/it.d.ts.map +1 -0
- package/dist/languages/it.js +616 -0
- package/dist/languages/it.js.map +1 -0
- package/dist/languages/ja.d.ts +4 -0
- package/dist/languages/ja.d.ts.map +1 -0
- package/dist/languages/ja.js +616 -0
- package/dist/languages/ja.js.map +1 -0
- package/dist/languages/ko.d.ts +4 -0
- package/dist/languages/ko.d.ts.map +1 -0
- package/dist/languages/ko.js +616 -0
- package/dist/languages/ko.js.map +1 -0
- package/dist/languages/lt.d.ts +4 -0
- package/dist/languages/lt.d.ts.map +1 -0
- package/dist/languages/lt.js +616 -0
- package/dist/languages/lt.js.map +1 -0
- package/dist/languages/lv.d.ts +4 -0
- package/dist/languages/lv.d.ts.map +1 -0
- package/dist/languages/lv.js +616 -0
- package/dist/languages/lv.js.map +1 -0
- package/dist/languages/my.d.ts +4 -0
- package/dist/languages/my.d.ts.map +1 -0
- package/dist/languages/my.js +616 -0
- package/dist/languages/my.js.map +1 -0
- package/dist/languages/nb.d.ts +4 -0
- package/dist/languages/nb.d.ts.map +1 -0
- package/dist/languages/nb.js +616 -0
- package/dist/languages/nb.js.map +1 -0
- package/dist/languages/nl.d.ts +4 -0
- package/dist/languages/nl.d.ts.map +1 -0
- package/dist/languages/nl.js +616 -0
- package/dist/languages/nl.js.map +1 -0
- package/dist/languages/pl.d.ts +4 -0
- package/dist/languages/pl.d.ts.map +1 -0
- package/dist/languages/pl.js +616 -0
- package/dist/languages/pl.js.map +1 -0
- package/dist/languages/pt.d.ts +4 -0
- package/dist/languages/pt.d.ts.map +1 -0
- package/dist/languages/pt.js +616 -0
- package/dist/languages/pt.js.map +1 -0
- package/dist/languages/ro.d.ts +4 -0
- package/dist/languages/ro.d.ts.map +1 -0
- package/dist/languages/ro.js +616 -0
- package/dist/languages/ro.js.map +1 -0
- package/dist/languages/rs.d.ts +4 -0
- package/dist/languages/rs.d.ts.map +1 -0
- package/dist/languages/rs.js +616 -0
- package/dist/languages/rs.js.map +1 -0
- package/dist/languages/rsLatin.d.ts +4 -0
- package/dist/languages/rsLatin.d.ts.map +1 -0
- package/dist/languages/rsLatin.js +616 -0
- package/dist/languages/rsLatin.js.map +1 -0
- package/dist/languages/ru.d.ts +4 -0
- package/dist/languages/ru.d.ts.map +1 -0
- package/dist/languages/ru.js +616 -0
- package/dist/languages/ru.js.map +1 -0
- package/dist/languages/sk.d.ts +4 -0
- package/dist/languages/sk.d.ts.map +1 -0
- package/dist/languages/sk.js +616 -0
- package/dist/languages/sk.js.map +1 -0
- package/dist/languages/sl.d.ts +4 -0
- package/dist/languages/sl.d.ts.map +1 -0
- package/dist/languages/sl.js +616 -0
- package/dist/languages/sl.js.map +1 -0
- package/dist/languages/sv.d.ts +4 -0
- package/dist/languages/sv.d.ts.map +1 -0
- package/dist/languages/sv.js +616 -0
- package/dist/languages/sv.js.map +1 -0
- package/dist/languages/ta.d.ts +4 -0
- package/dist/languages/ta.d.ts.map +1 -0
- package/dist/languages/ta.js +616 -0
- package/dist/languages/ta.js.map +1 -0
- package/dist/languages/th.d.ts +4 -0
- package/dist/languages/th.d.ts.map +1 -0
- package/dist/languages/th.js +616 -0
- package/dist/languages/th.js.map +1 -0
- package/dist/languages/tr.d.ts +4 -0
- package/dist/languages/tr.d.ts.map +1 -0
- package/dist/languages/tr.js +616 -0
- package/dist/languages/tr.js.map +1 -0
- package/dist/languages/uk.d.ts +4 -0
- package/dist/languages/uk.d.ts.map +1 -0
- package/dist/languages/uk.js +616 -0
- package/dist/languages/uk.js.map +1 -0
- package/dist/languages/vi.d.ts +4 -0
- package/dist/languages/vi.d.ts.map +1 -0
- package/dist/languages/vi.js +616 -0
- package/dist/languages/vi.js.map +1 -0
- package/dist/languages/zh.d.ts +4 -0
- package/dist/languages/zh.d.ts.map +1 -0
- package/dist/languages/zh.js +616 -0
- package/dist/languages/zh.js.map +1 -0
- package/dist/languages/zhTw.d.ts +4 -0
- package/dist/languages/zhTw.d.ts.map +1 -0
- package/dist/languages/zhTw.js +616 -0
- package/dist/languages/zhTw.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utilities/copyFile.d.ts +2 -0
- package/dist/utilities/copyFile.d.ts.map +1 -0
- package/dist/utilities/copyFile.js +13 -0
- package/dist/utilities/copyFile.js.map +1 -0
- package/dist/utilities/deepMergeSimple.d.ts +12 -0
- package/dist/utilities/deepMergeSimple.d.ts.map +1 -0
- package/dist/utilities/deepMergeSimple.js +32 -0
- package/dist/utilities/deepMergeSimple.js.map +1 -0
- package/dist/utilities/deepMergeSimple.spec.js +81 -0
- package/dist/utilities/deepMergeSimple.spec.js.map +1 -0
- package/dist/utilities/ensureDirExists.d.ts +2 -0
- package/dist/utilities/ensureDirExists.d.ts.map +1 -0
- package/dist/utilities/ensureDirExists.js +16 -0
- package/dist/utilities/ensureDirExists.js.map +1 -0
- package/dist/utilities/getTranslation.d.ts +9 -0
- package/dist/utilities/getTranslation.d.ts.map +1 -0
- package/dist/utilities/getTranslation.js +33 -0
- package/dist/utilities/getTranslation.js.map +1 -0
- package/dist/utilities/getTranslationsByContext.d.ts +612 -0
- package/dist/utilities/getTranslationsByContext.d.ts.map +1 -0
- package/dist/utilities/getTranslationsByContext.js +61 -0
- package/dist/utilities/getTranslationsByContext.js.map +1 -0
- package/dist/utilities/init.d.ts +645 -0
- package/dist/utilities/init.d.ts.map +1 -0
- package/dist/utilities/init.js +140 -0
- package/dist/utilities/init.js.map +1 -0
- package/dist/utilities/languages.d.ts +5 -0
- package/dist/utilities/languages.d.ts.map +1 -0
- package/dist/utilities/languages.js +84 -0
- package/dist/utilities/languages.js.map +1 -0
- package/dist/utilities/languages.spec.js +42 -0
- package/dist/utilities/languages.spec.js.map +1 -0
- 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
|
+
}
|