@intlayer/core 7.1.9 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -188,6 +188,7 @@ Explore our comprehensive documentation to get started with Intlayer and learn h
188
188
  <li><a href="https://intlayer.org/doc/environment/react-native-and-expo" rel=''>React Native</a></li>
189
189
  <li><a href="https://intlayer.org/doc/environment/lynx-and-react" rel=''>Lynx + React</a></li>
190
190
  <li><a href="https://intlayer.org/doc/environment/vite-and-svelte" rel=''>Vite + Svelte</a></li>
191
+ <li><a href="https://intlayer.org/doc/environment/sveltekit" rel=''>SvelteKit</a></li>
191
192
  <li><a href="https://intlayer.org/doc/environment/vite-and-preact" rel=''>Vite + Preact</a></li>
192
193
  <li><a href="https://intlayer.org/doc/environment/vite-and-vue" rel=''>Vite + Vue</a></li>
193
194
  <li><a href="https://intlayer.org/doc/environment/vite-and-nuxt" rel=''>Vite + Nuxt</a></li>
@@ -2,110 +2,129 @@ const require_localization_localeResolver = require('./localeResolver.cjs');
2
2
 
3
3
  //#region src/localization/localeDetector.ts
4
4
  /**
5
- * Module variables.
5
+ * Constants
6
6
  */
7
- const simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;
7
+ const LANGUAGE_FORMAT_REGULAR_EXPRESSION = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;
8
+ const DEFAULT_QUALITY_SCORE = 1;
8
9
  /**
9
- * Parse the Accept-Language header.
10
+ * Enumeration for specificity weights.
11
+ * Higher values indicate a more precise match.
10
12
  */
11
- const parseAcceptLanguage = (accept) => {
12
- const rawAccepts = accept.split(",");
13
- const accepts = [];
14
- for (let i = 0; i < rawAccepts.length; i++) {
15
- const language = parseLanguage(rawAccepts[i].trim(), i);
16
- if (language) accepts.push(language);
17
- }
18
- return accepts;
19
- };
13
+ var SpecificityWeight = /* @__PURE__ */ function(SpecificityWeight$1) {
14
+ SpecificityWeight$1[SpecificityWeight$1["None"] = 0] = "None";
15
+ SpecificityWeight$1[SpecificityWeight$1["Broad"] = 1] = "Broad";
16
+ SpecificityWeight$1[SpecificityWeight$1["Prefix"] = 2] = "Prefix";
17
+ SpecificityWeight$1[SpecificityWeight$1["Exact"] = 4] = "Exact";
18
+ return SpecificityWeight$1;
19
+ }(SpecificityWeight || {});
20
20
  /**
21
- * Parse a language from the Accept-Language header.
21
+ * Parses a single language tag string from the Accept-Language header.
22
+ * Example input: "en-US;q=0.8"
22
23
  */
23
- const parseLanguage = (str, i) => {
24
- const match = simpleLanguageRegExp.exec(str);
24
+ const parseLanguageTag = (tagString, index) => {
25
+ const match = LANGUAGE_FORMAT_REGULAR_EXPRESSION.exec(tagString);
25
26
  if (!match) return null;
26
- const prefix = match[1];
27
- const suffix = match[2];
28
- let full = prefix;
29
- if (suffix) full = `${prefix}-${suffix}`;
30
- let q = 1;
31
- if (match[3]) {
32
- const params = match[3].split(";");
33
- for (let j = 0; j < params.length; j++) {
34
- const p = params[j].split("=");
35
- if (p[0] === "q") q = parseFloat(p[1]);
27
+ const languageCode = match[1];
28
+ const regionCode = match[2];
29
+ const parameters = match[3];
30
+ const fullLocale = regionCode ? `${languageCode}-${regionCode}` : languageCode;
31
+ let qualityScore = DEFAULT_QUALITY_SCORE;
32
+ if (parameters) {
33
+ const parameterList = parameters.split(";");
34
+ for (const parameter of parameterList) {
35
+ const [key, value] = parameter.split("=");
36
+ if (key === "q") qualityScore = parseFloat(value);
36
37
  }
37
38
  }
38
39
  return {
39
- prefix,
40
- suffix,
41
- q,
42
- i,
43
- full
40
+ languageCode,
41
+ regionCode,
42
+ qualityScore,
43
+ originalIndex: index,
44
+ fullLocale
44
45
  };
45
46
  };
46
47
  /**
47
- * Get the priority of a language.
48
+ * Parses the entire Accept-Language header string into a list of preferences.
48
49
  */
49
- const getLanguagePriority = (language, accepted, index) => {
50
- let priority = {
51
- o: -1,
52
- q: 0,
53
- s: 0,
54
- i: index
55
- };
56
- for (let i = 0; i < accepted.length; i++) {
57
- const spec = specify(language, accepted[i], index);
58
- if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) priority = spec;
50
+ const parseAcceptLanguageHeader = (headerValue) => {
51
+ const rawTags = headerValue.split(",");
52
+ const preferences = [];
53
+ for (let index = 0; index < rawTags.length; index++) {
54
+ const parsedLanguage = parseLanguageTag(rawTags[index].trim(), index);
55
+ if (parsedLanguage) preferences.push(parsedLanguage);
59
56
  }
60
- return priority;
57
+ return preferences;
61
58
  };
62
59
  /**
63
- * Get the specificity of the language.
60
+ * Calculates the specificity of a match between a provided language and a requested preference.
64
61
  */
65
- const specify = (language, spec, index) => {
66
- const p = parseLanguage(language, index);
67
- if (!p) return null;
68
- let s = 0;
69
- if (spec.full.toLowerCase() === p.full.toLowerCase()) s |= 4;
70
- else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) s |= 2;
71
- else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) s |= 1;
72
- else if (spec.full !== "*") return null;
62
+ const calculateMatchSpecificity = (providedLanguage, preference, providedIndex) => {
63
+ const parsedProvided = parseLanguageTag(providedLanguage, providedIndex);
64
+ if (!parsedProvided) return null;
65
+ let specificityScore = SpecificityWeight.None;
66
+ const preferenceFullLower = preference.fullLocale.toLowerCase();
67
+ const preferencePrefixLower = preference.languageCode.toLowerCase();
68
+ const providedFullLower = parsedProvided.fullLocale.toLowerCase();
69
+ const providedPrefixLower = parsedProvided.languageCode.toLowerCase();
70
+ if (preferenceFullLower === providedFullLower) specificityScore |= SpecificityWeight.Exact;
71
+ else if (preferencePrefixLower === providedFullLower) specificityScore |= SpecificityWeight.Prefix;
72
+ else if (preferenceFullLower === providedPrefixLower) specificityScore |= SpecificityWeight.Broad;
73
+ else if (preference.fullLocale !== "*") return null;
73
74
  return {
74
- i: index,
75
- o: spec.i,
76
- q: spec.q,
77
- s
75
+ providedIndex,
76
+ headerIndex: preference.originalIndex,
77
+ qualityScore: preference.qualityScore,
78
+ specificityScore
78
79
  };
79
80
  };
80
81
  /**
81
- * Get the preferred languages from an Accept-Language header.
82
+ * Determines the best match for a specific available language against the list of user accepted languages.
82
83
  */
83
- const preferredLanguages = (accept, provided) => {
84
- const accepts = parseAcceptLanguage(accept === void 0 ? "*" : accept ?? "");
85
- if (!provided) return accepts.filter(isQuality).sort(compareSpecs).map(getFullLanguage);
86
- const priorities = provided.map((type, index) => getLanguagePriority(type, accepts, index));
87
- return priorities.filter(isQuality).sort(compareSpecs).map((priority) => provided[priorities.indexOf(priority)]);
84
+ const getBestMatchForLanguage = (providedLanguage, acceptedPreferences, providedIndex) => {
85
+ let bestMatch = {
86
+ headerIndex: -1,
87
+ qualityScore: 0,
88
+ specificityScore: 0,
89
+ providedIndex
90
+ };
91
+ for (const preference of acceptedPreferences) {
92
+ const matchSpec = calculateMatchSpecificity(providedLanguage, preference, providedIndex);
93
+ if (matchSpec) {
94
+ if ((bestMatch.specificityScore - matchSpec.specificityScore || bestMatch.qualityScore - matchSpec.qualityScore || bestMatch.headerIndex - matchSpec.headerIndex) < 0) bestMatch = matchSpec;
95
+ }
96
+ }
97
+ return bestMatch;
88
98
  };
89
99
  /**
90
- * Compare two specs.
91
- */
92
- const compareSpecs = (a, b) => b.q - a.q || (b.s ?? 0) - (a.s ?? 0) || (a.o ?? 0) - (b.o ?? 0) || a.i - b.i || 0;
93
- /**
94
- * Get full language string.
100
+ * Comparator function to sort language matches.
101
+ * Sorting order:
102
+ * 1. Quality Score (Descending)
103
+ * 2. Specificity Score (Descending)
104
+ * 3. Order in Header (Ascending - lower index is better)
105
+ * 4. Order in Provided List (Ascending)
95
106
  */
96
- const getFullLanguage = (spec) => spec.full;
107
+ const compareMatchResults = (a, b) => {
108
+ return b.qualityScore - a.qualityScore || b.specificityScore - a.specificityScore || a.headerIndex - b.headerIndex || a.providedIndex - b.providedIndex || 0;
109
+ };
97
110
  /**
98
- * Check if a spec has any quality.
111
+ * Derives the list of preferred languages based on the Accept-Language header
112
+ * and an optional list of available languages.
99
113
  */
100
- const isQuality = (spec) => spec.q > 0;
114
+ const getPreferredLanguages = (acceptHeader, availableLanguages) => {
115
+ const acceptedPreferences = parseAcceptLanguageHeader(acceptHeader === void 0 ? "*" : acceptHeader || "");
116
+ if (!availableLanguages) return acceptedPreferences.filter((preference) => preference.qualityScore > 0).sort((a, b) => b.qualityScore - a.qualityScore).map((preference) => preference.fullLocale);
117
+ return availableLanguages.map((language, index) => getBestMatchForLanguage(language, acceptedPreferences, index)).filter((result) => result.qualityScore > 0).sort(compareMatchResults).map((result) => availableLanguages[result.providedIndex]);
118
+ };
101
119
  /**
102
- * Detects the locale from the request headers
120
+ * Detects the locale from the request headers.
103
121
  *
104
- * Headers are provided by the browser and can be used to determine the user's preferred language
122
+ * Headers are provided by the browser/client and can be used to determine the user's preferred language.
123
+ * This function intersects the user's `Accept-Language` header with the application's available locales.
105
124
  */
106
- const localeDetector = (headers, locales, defaultLocale) => {
107
- const accept = headers["accept-language"];
108
- return require_localization_localeResolver.localeResolver(preferredLanguages(accept), locales, defaultLocale);
125
+ const localeDetector = (headers, availableLocales, defaultLocale) => {
126
+ const acceptLanguageHeader = headers["accept-language"];
127
+ return require_localization_localeResolver.localeResolver(getPreferredLanguages(acceptLanguageHeader, availableLocales), availableLocales, defaultLocale);
109
128
  };
110
129
 
111
130
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"localeDetector.cjs","names":["accepts: LanguageSpec[]","priority: PrioritySpec","localeResolver"],"sources":["../../../src/localization/localeDetector.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types';\nimport { localeResolver } from './localeResolver';\n\n/**\n * Module variables.\n */\nconst simpleLanguageRegExp = /^\\s*([^\\s\\-;]+)(?:-([^\\s;]+))?\\s*(?:;(.*))?$/;\n\ntype LanguageSpec = {\n prefix: string;\n suffix?: string;\n q: number;\n i: number;\n full: string;\n};\n\ntype PrioritySpec = {\n i: number;\n o: number;\n q: number;\n s: number;\n};\n\ntype ComparableSpec = {\n q: number;\n s?: number;\n o?: number;\n i: number;\n};\n\n/**\n * Parse the Accept-Language header.\n */\nconst parseAcceptLanguage = (accept: string): LanguageSpec[] => {\n const rawAccepts = accept.split(',');\n const accepts: LanguageSpec[] = [];\n\n for (let i = 0; i < rawAccepts.length; i++) {\n const language = parseLanguage(rawAccepts[i].trim(), i);\n if (language) accepts.push(language);\n }\n\n return accepts;\n};\n\n/**\n * Parse a language from the Accept-Language header.\n */\nconst parseLanguage = (str: string, i: number): LanguageSpec | null => {\n const match = simpleLanguageRegExp.exec(str);\n if (!match) return null;\n\n const prefix = match[1];\n const suffix = match[2];\n let full = prefix;\n\n if (suffix) full = `${prefix}-${suffix}`;\n\n let q = 1;\n if (match[3]) {\n const params = match[3].split(';');\n for (let j = 0; j < params.length; j++) {\n const p = params[j].split('=');\n if (p[0] === 'q') q = parseFloat(p[1]);\n }\n }\n\n return {\n prefix,\n suffix,\n q,\n i,\n full,\n };\n};\n\n/**\n * Get the priority of a language.\n */\nconst getLanguagePriority = (\n language: string,\n accepted: LanguageSpec[],\n index: number\n): PrioritySpec => {\n let priority: PrioritySpec = { o: -1, q: 0, s: 0, i: index };\n\n for (let i = 0; i < accepted.length; i++) {\n const spec = specify(language, accepted[i], index);\n if (\n spec &&\n (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0\n ) {\n priority = spec;\n }\n }\n\n return priority;\n};\n\n/**\n * Get the specificity of the language.\n */\nconst specify = (\n language: string,\n spec: LanguageSpec,\n index: number\n): PrioritySpec | null => {\n const p = parseLanguage(language, index);\n if (!p) return null;\n let s = 0;\n if (spec.full.toLowerCase() === p.full.toLowerCase()) {\n s |= 4;\n } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) {\n s |= 2;\n } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) {\n s |= 1;\n } else if (spec.full !== '*') {\n return null;\n }\n\n return {\n i: index,\n o: spec.i,\n q: spec.q,\n s,\n };\n};\n\n/**\n * Get the preferred languages from an Accept-Language header.\n */\nconst preferredLanguages = (\n accept: string | undefined,\n provided?: string[]\n): string[] => {\n // RFC 2616 sec 14.4: no header = *\n const accepts = parseAcceptLanguage(\n accept === undefined ? '*' : (accept ?? '')\n );\n\n if (!provided) {\n return accepts.filter(isQuality).sort(compareSpecs).map(getFullLanguage);\n }\n\n const priorities = provided.map((type, index) =>\n getLanguagePriority(type, accepts, index)\n );\n\n return priorities\n .filter(isQuality)\n .sort(compareSpecs)\n .map((priority) => provided[priorities.indexOf(priority)]);\n};\n\n/**\n * Compare two specs.\n */\nconst compareSpecs = (a: ComparableSpec, b: ComparableSpec): number =>\n b.q - a.q ||\n (b.s ?? 0) - (a.s ?? 0) ||\n (a.o ?? 0) - (b.o ?? 0) ||\n a.i - b.i ||\n 0;\n\n/**\n * Get full language string.\n */\nconst getFullLanguage = (spec: LanguageSpec): string => spec.full;\n\n/**\n * Check if a spec has any quality.\n */\nconst isQuality = (spec: { q: number }): boolean => spec.q > 0;\n\n/**\n * Detects the locale from the request headers\n *\n * Headers are provided by the browser and can be used to determine the user's preferred language\n */\nexport const localeDetector = (\n headers: Record<string, string | undefined>,\n locales?: Locale[],\n defaultLocale?: Locale\n): Locale => {\n const accept = headers['accept-language'];\n const languages = preferredLanguages(accept);\n\n return localeResolver(languages as Locale[], locales, defaultLocale);\n};\n"],"mappings":";;;;;;AAMA,MAAM,uBAAuB;;;;AA2B7B,MAAM,uBAAuB,WAAmC;CAC9D,MAAM,aAAa,OAAO,MAAM,IAAI;CACpC,MAAMA,UAA0B,EAAE;AAElC,MAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC1C,MAAM,WAAW,cAAc,WAAW,GAAG,MAAM,EAAE,EAAE;AACvD,MAAI,SAAU,SAAQ,KAAK,SAAS;;AAGtC,QAAO;;;;;AAMT,MAAM,iBAAiB,KAAa,MAAmC;CACrE,MAAM,QAAQ,qBAAqB,KAAK,IAAI;AAC5C,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,SAAS,MAAM;CACrB,MAAM,SAAS,MAAM;CACrB,IAAI,OAAO;AAEX,KAAI,OAAQ,QAAO,GAAG,OAAO,GAAG;CAEhC,IAAI,IAAI;AACR,KAAI,MAAM,IAAI;EACZ,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;AAClC,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;GACtC,MAAM,IAAI,OAAO,GAAG,MAAM,IAAI;AAC9B,OAAI,EAAE,OAAO,IAAK,KAAI,WAAW,EAAE,GAAG;;;AAI1C,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;;;;AAMH,MAAM,uBACJ,UACA,UACA,UACiB;CACjB,IAAIC,WAAyB;EAAE,GAAG;EAAI,GAAG;EAAG,GAAG;EAAG,GAAG;EAAO;AAE5D,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,OAAO,QAAQ,UAAU,SAAS,IAAI,MAAM;AAClD,MACE,SACC,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAEtE,YAAW;;AAIf,QAAO;;;;;AAMT,MAAM,WACJ,UACA,MACA,UACwB;CACxB,MAAM,IAAI,cAAc,UAAU,MAAM;AACxC,KAAI,CAAC,EAAG,QAAO;CACf,IAAI,IAAI;AACR,KAAI,KAAK,KAAK,aAAa,KAAK,EAAE,KAAK,aAAa,CAClD,MAAK;UACI,KAAK,OAAO,aAAa,KAAK,EAAE,KAAK,aAAa,CAC3D,MAAK;UACI,KAAK,KAAK,aAAa,KAAK,EAAE,OAAO,aAAa,CAC3D,MAAK;UACI,KAAK,SAAS,IACvB,QAAO;AAGT,QAAO;EACL,GAAG;EACH,GAAG,KAAK;EACR,GAAG,KAAK;EACR;EACD;;;;;AAMH,MAAM,sBACJ,QACA,aACa;CAEb,MAAM,UAAU,oBACd,WAAW,SAAY,MAAO,UAAU,GACzC;AAED,KAAI,CAAC,SACH,QAAO,QAAQ,OAAO,UAAU,CAAC,KAAK,aAAa,CAAC,IAAI,gBAAgB;CAG1E,MAAM,aAAa,SAAS,KAAK,MAAM,UACrC,oBAAoB,MAAM,SAAS,MAAM,CAC1C;AAED,QAAO,WACJ,OAAO,UAAU,CACjB,KAAK,aAAa,CAClB,KAAK,aAAa,SAAS,WAAW,QAAQ,SAAS,EAAE;;;;;AAM9D,MAAM,gBAAgB,GAAmB,MACvC,EAAE,IAAI,EAAE,MACP,EAAE,KAAK,MAAM,EAAE,KAAK,OACpB,EAAE,KAAK,MAAM,EAAE,KAAK,MACrB,EAAE,IAAI,EAAE,KACR;;;;AAKF,MAAM,mBAAmB,SAA+B,KAAK;;;;AAK7D,MAAM,aAAa,SAAiC,KAAK,IAAI;;;;;;AAO7D,MAAa,kBACX,SACA,SACA,kBACW;CACX,MAAM,SAAS,QAAQ;AAGvB,QAAOC,mDAFW,mBAAmB,OAAO,EAEC,SAAS,cAAc"}
1
+ {"version":3,"file":"localeDetector.cjs","names":["preferences: LanguagePreference[]","bestMatch: MatchResult","localeResolver"],"sources":["../../../src/localization/localeDetector.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types';\nimport { localeResolver } from './localeResolver';\n\n/**\n * Constants\n */\nconst LANGUAGE_FORMAT_REGULAR_EXPRESSION =\n /^\\s*([^\\s\\-;]+)(?:-([^\\s;]+))?\\s*(?:;(.*))?$/;\nconst DEFAULT_QUALITY_SCORE = 1;\n\n/**\n * Enumeration for specificity weights.\n * Higher values indicate a more precise match.\n */\nenum SpecificityWeight {\n None = 0,\n Broad = 1, // Matches prefix (e.g., 'en' matches 'en-US')\n Prefix = 2, // Matches prefix in reverse (e.g., 'en-US' matches 'en')\n Exact = 4, // Matches exact string (e.g., 'en-US' matches 'en-US')\n}\n\n/**\n * Represents a parsed language tag from the header.\n */\ntype LanguagePreference = {\n languageCode: string;\n regionCode?: string;\n fullLocale: string;\n qualityScore: number;\n originalIndex: number;\n};\n\n/**\n * Represents the result of matching a requested language against an available language.\n */\ntype MatchResult = {\n providedIndex: number;\n headerIndex: number;\n qualityScore: number;\n specificityScore: number;\n};\n\n/**\n * Parses a single language tag string from the Accept-Language header.\n * Example input: \"en-US;q=0.8\"\n */\nconst parseLanguageTag = (\n tagString: string,\n index: number\n): LanguagePreference | null => {\n const match = LANGUAGE_FORMAT_REGULAR_EXPRESSION.exec(tagString);\n if (!match) {\n return null;\n }\n\n const languageCode = match[1];\n const regionCode = match[2];\n const parameters = match[3];\n\n // Construct the full locale string (e.g., \"en-US\" or \"en\")\n const fullLocale = regionCode\n ? `${languageCode}-${regionCode}`\n : languageCode;\n\n let qualityScore = DEFAULT_QUALITY_SCORE;\n\n // Parse parameters to find the quality score (\"q\")\n if (parameters) {\n const parameterList = parameters.split(';');\n for (const parameter of parameterList) {\n const [key, value] = parameter.split('=');\n if (key === 'q') {\n qualityScore = parseFloat(value);\n }\n }\n }\n\n return {\n languageCode,\n regionCode,\n qualityScore,\n originalIndex: index,\n fullLocale,\n };\n};\n\n/**\n * Parses the entire Accept-Language header string into a list of preferences.\n */\nconst parseAcceptLanguageHeader = (\n headerValue: string\n): LanguagePreference[] => {\n const rawTags = headerValue.split(',');\n const preferences: LanguagePreference[] = [];\n\n for (let index = 0; index < rawTags.length; index++) {\n const tag = rawTags[index].trim();\n const parsedLanguage = parseLanguageTag(tag, index);\n\n if (parsedLanguage) {\n preferences.push(parsedLanguage);\n }\n }\n\n return preferences;\n};\n\n/**\n * Calculates the specificity of a match between a provided language and a requested preference.\n */\nconst calculateMatchSpecificity = (\n providedLanguage: string,\n preference: LanguagePreference,\n providedIndex: number\n): MatchResult | null => {\n const parsedProvided = parseLanguageTag(providedLanguage, providedIndex);\n if (!parsedProvided) {\n return null;\n }\n\n let specificityScore = SpecificityWeight.None;\n\n const preferenceFullLower = preference.fullLocale.toLowerCase();\n const preferencePrefixLower = preference.languageCode.toLowerCase();\n const providedFullLower = parsedProvided.fullLocale.toLowerCase();\n const providedPrefixLower = parsedProvided.languageCode.toLowerCase();\n\n if (preferenceFullLower === providedFullLower) {\n specificityScore |= SpecificityWeight.Exact;\n } else if (preferencePrefixLower === providedFullLower) {\n specificityScore |= SpecificityWeight.Prefix;\n } else if (preferenceFullLower === providedPrefixLower) {\n specificityScore |= SpecificityWeight.Broad;\n } else if (preference.fullLocale !== '*') {\n return null;\n }\n\n return {\n providedIndex,\n headerIndex: preference.originalIndex,\n qualityScore: preference.qualityScore,\n specificityScore,\n };\n};\n\n/**\n * Determines the best match for a specific available language against the list of user accepted languages.\n */\nconst getBestMatchForLanguage = (\n providedLanguage: string,\n acceptedPreferences: LanguagePreference[],\n providedIndex: number\n): MatchResult => {\n // Initialize with a non-match priority\n let bestMatch: MatchResult = {\n headerIndex: -1,\n qualityScore: 0,\n specificityScore: 0,\n providedIndex,\n };\n\n for (const preference of acceptedPreferences) {\n const matchSpec = calculateMatchSpecificity(\n providedLanguage,\n preference,\n providedIndex\n );\n\n if (matchSpec) {\n // Compare current best match with new match\n const scoreDifference =\n bestMatch.specificityScore - matchSpec.specificityScore ||\n bestMatch.qualityScore - matchSpec.qualityScore ||\n bestMatch.headerIndex - matchSpec.headerIndex;\n\n // If the new match is better (difference < 0), update priority\n if (scoreDifference < 0) {\n bestMatch = matchSpec;\n }\n }\n }\n\n return bestMatch;\n};\n\n/**\n * Comparator function to sort language matches.\n * Sorting order:\n * 1. Quality Score (Descending)\n * 2. Specificity Score (Descending)\n * 3. Order in Header (Ascending - lower index is better)\n * 4. Order in Provided List (Ascending)\n */\nconst compareMatchResults = (a: MatchResult, b: MatchResult): number => {\n return (\n b.qualityScore - a.qualityScore ||\n b.specificityScore - a.specificityScore ||\n a.headerIndex - b.headerIndex ||\n a.providedIndex - b.providedIndex ||\n 0\n );\n};\n\n/**\n * Derives the list of preferred languages based on the Accept-Language header\n * and an optional list of available languages.\n */\nconst getPreferredLanguages = (\n acceptHeader: string | undefined,\n availableLanguages?: string[]\n): string[] => {\n // RFC 2616 sec 14.4: no header implies '*'\n const headerValue = acceptHeader === undefined ? '*' : acceptHeader || '';\n const acceptedPreferences = parseAcceptLanguageHeader(headerValue);\n\n // If no specific languages are provided to filter against, return the header languages sorted by quality\n if (!availableLanguages) {\n return acceptedPreferences\n .filter((preference) => preference.qualityScore > 0)\n .sort((a, b) => b.qualityScore - a.qualityScore) // Simple sort by quality\n .map((preference) => preference.fullLocale);\n }\n\n // Map available languages to their match priority against the header\n const matchResults = availableLanguages.map((language, index) =>\n getBestMatchForLanguage(language, acceptedPreferences, index)\n );\n\n return matchResults\n .filter((result) => result.qualityScore > 0)\n .sort(compareMatchResults)\n .map((result) => availableLanguages[result.providedIndex]);\n};\n\n/**\n * Detects the locale from the request headers.\n *\n * Headers are provided by the browser/client and can be used to determine the user's preferred language.\n * This function intersects the user's `Accept-Language` header with the application's available locales.\n */\nexport const localeDetector = (\n headers: Record<string, string | undefined>,\n availableLocales?: Locale[],\n defaultLocale?: Locale\n): Locale => {\n const acceptLanguageHeader = headers['accept-language'];\n\n const preferredLocaleStrings = getPreferredLanguages(\n acceptLanguageHeader,\n availableLocales as string[]\n );\n\n return localeResolver(\n preferredLocaleStrings as Locale[],\n availableLocales,\n defaultLocale\n );\n};\n"],"mappings":"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"}
@@ -2,110 +2,129 @@ import { localeResolver } from "./localeResolver.mjs";
2
2
 
3
3
  //#region src/localization/localeDetector.ts
4
4
  /**
5
- * Module variables.
5
+ * Constants
6
6
  */
7
- const simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;
7
+ const LANGUAGE_FORMAT_REGULAR_EXPRESSION = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;
8
+ const DEFAULT_QUALITY_SCORE = 1;
8
9
  /**
9
- * Parse the Accept-Language header.
10
+ * Enumeration for specificity weights.
11
+ * Higher values indicate a more precise match.
10
12
  */
11
- const parseAcceptLanguage = (accept) => {
12
- const rawAccepts = accept.split(",");
13
- const accepts = [];
14
- for (let i = 0; i < rawAccepts.length; i++) {
15
- const language = parseLanguage(rawAccepts[i].trim(), i);
16
- if (language) accepts.push(language);
17
- }
18
- return accepts;
19
- };
13
+ var SpecificityWeight = /* @__PURE__ */ function(SpecificityWeight$1) {
14
+ SpecificityWeight$1[SpecificityWeight$1["None"] = 0] = "None";
15
+ SpecificityWeight$1[SpecificityWeight$1["Broad"] = 1] = "Broad";
16
+ SpecificityWeight$1[SpecificityWeight$1["Prefix"] = 2] = "Prefix";
17
+ SpecificityWeight$1[SpecificityWeight$1["Exact"] = 4] = "Exact";
18
+ return SpecificityWeight$1;
19
+ }(SpecificityWeight || {});
20
20
  /**
21
- * Parse a language from the Accept-Language header.
21
+ * Parses a single language tag string from the Accept-Language header.
22
+ * Example input: "en-US;q=0.8"
22
23
  */
23
- const parseLanguage = (str, i) => {
24
- const match = simpleLanguageRegExp.exec(str);
24
+ const parseLanguageTag = (tagString, index) => {
25
+ const match = LANGUAGE_FORMAT_REGULAR_EXPRESSION.exec(tagString);
25
26
  if (!match) return null;
26
- const prefix = match[1];
27
- const suffix = match[2];
28
- let full = prefix;
29
- if (suffix) full = `${prefix}-${suffix}`;
30
- let q = 1;
31
- if (match[3]) {
32
- const params = match[3].split(";");
33
- for (let j = 0; j < params.length; j++) {
34
- const p = params[j].split("=");
35
- if (p[0] === "q") q = parseFloat(p[1]);
27
+ const languageCode = match[1];
28
+ const regionCode = match[2];
29
+ const parameters = match[3];
30
+ const fullLocale = regionCode ? `${languageCode}-${regionCode}` : languageCode;
31
+ let qualityScore = DEFAULT_QUALITY_SCORE;
32
+ if (parameters) {
33
+ const parameterList = parameters.split(";");
34
+ for (const parameter of parameterList) {
35
+ const [key, value] = parameter.split("=");
36
+ if (key === "q") qualityScore = parseFloat(value);
36
37
  }
37
38
  }
38
39
  return {
39
- prefix,
40
- suffix,
41
- q,
42
- i,
43
- full
40
+ languageCode,
41
+ regionCode,
42
+ qualityScore,
43
+ originalIndex: index,
44
+ fullLocale
44
45
  };
45
46
  };
46
47
  /**
47
- * Get the priority of a language.
48
+ * Parses the entire Accept-Language header string into a list of preferences.
48
49
  */
49
- const getLanguagePriority = (language, accepted, index) => {
50
- let priority = {
51
- o: -1,
52
- q: 0,
53
- s: 0,
54
- i: index
55
- };
56
- for (let i = 0; i < accepted.length; i++) {
57
- const spec = specify(language, accepted[i], index);
58
- if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) priority = spec;
50
+ const parseAcceptLanguageHeader = (headerValue) => {
51
+ const rawTags = headerValue.split(",");
52
+ const preferences = [];
53
+ for (let index = 0; index < rawTags.length; index++) {
54
+ const parsedLanguage = parseLanguageTag(rawTags[index].trim(), index);
55
+ if (parsedLanguage) preferences.push(parsedLanguage);
59
56
  }
60
- return priority;
57
+ return preferences;
61
58
  };
62
59
  /**
63
- * Get the specificity of the language.
60
+ * Calculates the specificity of a match between a provided language and a requested preference.
64
61
  */
65
- const specify = (language, spec, index) => {
66
- const p = parseLanguage(language, index);
67
- if (!p) return null;
68
- let s = 0;
69
- if (spec.full.toLowerCase() === p.full.toLowerCase()) s |= 4;
70
- else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) s |= 2;
71
- else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) s |= 1;
72
- else if (spec.full !== "*") return null;
62
+ const calculateMatchSpecificity = (providedLanguage, preference, providedIndex) => {
63
+ const parsedProvided = parseLanguageTag(providedLanguage, providedIndex);
64
+ if (!parsedProvided) return null;
65
+ let specificityScore = SpecificityWeight.None;
66
+ const preferenceFullLower = preference.fullLocale.toLowerCase();
67
+ const preferencePrefixLower = preference.languageCode.toLowerCase();
68
+ const providedFullLower = parsedProvided.fullLocale.toLowerCase();
69
+ const providedPrefixLower = parsedProvided.languageCode.toLowerCase();
70
+ if (preferenceFullLower === providedFullLower) specificityScore |= SpecificityWeight.Exact;
71
+ else if (preferencePrefixLower === providedFullLower) specificityScore |= SpecificityWeight.Prefix;
72
+ else if (preferenceFullLower === providedPrefixLower) specificityScore |= SpecificityWeight.Broad;
73
+ else if (preference.fullLocale !== "*") return null;
73
74
  return {
74
- i: index,
75
- o: spec.i,
76
- q: spec.q,
77
- s
75
+ providedIndex,
76
+ headerIndex: preference.originalIndex,
77
+ qualityScore: preference.qualityScore,
78
+ specificityScore
78
79
  };
79
80
  };
80
81
  /**
81
- * Get the preferred languages from an Accept-Language header.
82
+ * Determines the best match for a specific available language against the list of user accepted languages.
82
83
  */
83
- const preferredLanguages = (accept, provided) => {
84
- const accepts = parseAcceptLanguage(accept === void 0 ? "*" : accept ?? "");
85
- if (!provided) return accepts.filter(isQuality).sort(compareSpecs).map(getFullLanguage);
86
- const priorities = provided.map((type, index) => getLanguagePriority(type, accepts, index));
87
- return priorities.filter(isQuality).sort(compareSpecs).map((priority) => provided[priorities.indexOf(priority)]);
84
+ const getBestMatchForLanguage = (providedLanguage, acceptedPreferences, providedIndex) => {
85
+ let bestMatch = {
86
+ headerIndex: -1,
87
+ qualityScore: 0,
88
+ specificityScore: 0,
89
+ providedIndex
90
+ };
91
+ for (const preference of acceptedPreferences) {
92
+ const matchSpec = calculateMatchSpecificity(providedLanguage, preference, providedIndex);
93
+ if (matchSpec) {
94
+ if ((bestMatch.specificityScore - matchSpec.specificityScore || bestMatch.qualityScore - matchSpec.qualityScore || bestMatch.headerIndex - matchSpec.headerIndex) < 0) bestMatch = matchSpec;
95
+ }
96
+ }
97
+ return bestMatch;
88
98
  };
89
99
  /**
90
- * Compare two specs.
91
- */
92
- const compareSpecs = (a, b) => b.q - a.q || (b.s ?? 0) - (a.s ?? 0) || (a.o ?? 0) - (b.o ?? 0) || a.i - b.i || 0;
93
- /**
94
- * Get full language string.
100
+ * Comparator function to sort language matches.
101
+ * Sorting order:
102
+ * 1. Quality Score (Descending)
103
+ * 2. Specificity Score (Descending)
104
+ * 3. Order in Header (Ascending - lower index is better)
105
+ * 4. Order in Provided List (Ascending)
95
106
  */
96
- const getFullLanguage = (spec) => spec.full;
107
+ const compareMatchResults = (a, b) => {
108
+ return b.qualityScore - a.qualityScore || b.specificityScore - a.specificityScore || a.headerIndex - b.headerIndex || a.providedIndex - b.providedIndex || 0;
109
+ };
97
110
  /**
98
- * Check if a spec has any quality.
111
+ * Derives the list of preferred languages based on the Accept-Language header
112
+ * and an optional list of available languages.
99
113
  */
100
- const isQuality = (spec) => spec.q > 0;
114
+ const getPreferredLanguages = (acceptHeader, availableLanguages) => {
115
+ const acceptedPreferences = parseAcceptLanguageHeader(acceptHeader === void 0 ? "*" : acceptHeader || "");
116
+ if (!availableLanguages) return acceptedPreferences.filter((preference) => preference.qualityScore > 0).sort((a, b) => b.qualityScore - a.qualityScore).map((preference) => preference.fullLocale);
117
+ return availableLanguages.map((language, index) => getBestMatchForLanguage(language, acceptedPreferences, index)).filter((result) => result.qualityScore > 0).sort(compareMatchResults).map((result) => availableLanguages[result.providedIndex]);
118
+ };
101
119
  /**
102
- * Detects the locale from the request headers
120
+ * Detects the locale from the request headers.
103
121
  *
104
- * Headers are provided by the browser and can be used to determine the user's preferred language
122
+ * Headers are provided by the browser/client and can be used to determine the user's preferred language.
123
+ * This function intersects the user's `Accept-Language` header with the application's available locales.
105
124
  */
106
- const localeDetector = (headers, locales, defaultLocale) => {
107
- const accept = headers["accept-language"];
108
- return localeResolver(preferredLanguages(accept), locales, defaultLocale);
125
+ const localeDetector = (headers, availableLocales, defaultLocale) => {
126
+ const acceptLanguageHeader = headers["accept-language"];
127
+ return localeResolver(getPreferredLanguages(acceptLanguageHeader, availableLocales), availableLocales, defaultLocale);
109
128
  };
110
129
 
111
130
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"localeDetector.mjs","names":["accepts: LanguageSpec[]","priority: PrioritySpec"],"sources":["../../../src/localization/localeDetector.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types';\nimport { localeResolver } from './localeResolver';\n\n/**\n * Module variables.\n */\nconst simpleLanguageRegExp = /^\\s*([^\\s\\-;]+)(?:-([^\\s;]+))?\\s*(?:;(.*))?$/;\n\ntype LanguageSpec = {\n prefix: string;\n suffix?: string;\n q: number;\n i: number;\n full: string;\n};\n\ntype PrioritySpec = {\n i: number;\n o: number;\n q: number;\n s: number;\n};\n\ntype ComparableSpec = {\n q: number;\n s?: number;\n o?: number;\n i: number;\n};\n\n/**\n * Parse the Accept-Language header.\n */\nconst parseAcceptLanguage = (accept: string): LanguageSpec[] => {\n const rawAccepts = accept.split(',');\n const accepts: LanguageSpec[] = [];\n\n for (let i = 0; i < rawAccepts.length; i++) {\n const language = parseLanguage(rawAccepts[i].trim(), i);\n if (language) accepts.push(language);\n }\n\n return accepts;\n};\n\n/**\n * Parse a language from the Accept-Language header.\n */\nconst parseLanguage = (str: string, i: number): LanguageSpec | null => {\n const match = simpleLanguageRegExp.exec(str);\n if (!match) return null;\n\n const prefix = match[1];\n const suffix = match[2];\n let full = prefix;\n\n if (suffix) full = `${prefix}-${suffix}`;\n\n let q = 1;\n if (match[3]) {\n const params = match[3].split(';');\n for (let j = 0; j < params.length; j++) {\n const p = params[j].split('=');\n if (p[0] === 'q') q = parseFloat(p[1]);\n }\n }\n\n return {\n prefix,\n suffix,\n q,\n i,\n full,\n };\n};\n\n/**\n * Get the priority of a language.\n */\nconst getLanguagePriority = (\n language: string,\n accepted: LanguageSpec[],\n index: number\n): PrioritySpec => {\n let priority: PrioritySpec = { o: -1, q: 0, s: 0, i: index };\n\n for (let i = 0; i < accepted.length; i++) {\n const spec = specify(language, accepted[i], index);\n if (\n spec &&\n (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0\n ) {\n priority = spec;\n }\n }\n\n return priority;\n};\n\n/**\n * Get the specificity of the language.\n */\nconst specify = (\n language: string,\n spec: LanguageSpec,\n index: number\n): PrioritySpec | null => {\n const p = parseLanguage(language, index);\n if (!p) return null;\n let s = 0;\n if (spec.full.toLowerCase() === p.full.toLowerCase()) {\n s |= 4;\n } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) {\n s |= 2;\n } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) {\n s |= 1;\n } else if (spec.full !== '*') {\n return null;\n }\n\n return {\n i: index,\n o: spec.i,\n q: spec.q,\n s,\n };\n};\n\n/**\n * Get the preferred languages from an Accept-Language header.\n */\nconst preferredLanguages = (\n accept: string | undefined,\n provided?: string[]\n): string[] => {\n // RFC 2616 sec 14.4: no header = *\n const accepts = parseAcceptLanguage(\n accept === undefined ? '*' : (accept ?? '')\n );\n\n if (!provided) {\n return accepts.filter(isQuality).sort(compareSpecs).map(getFullLanguage);\n }\n\n const priorities = provided.map((type, index) =>\n getLanguagePriority(type, accepts, index)\n );\n\n return priorities\n .filter(isQuality)\n .sort(compareSpecs)\n .map((priority) => provided[priorities.indexOf(priority)]);\n};\n\n/**\n * Compare two specs.\n */\nconst compareSpecs = (a: ComparableSpec, b: ComparableSpec): number =>\n b.q - a.q ||\n (b.s ?? 0) - (a.s ?? 0) ||\n (a.o ?? 0) - (b.o ?? 0) ||\n a.i - b.i ||\n 0;\n\n/**\n * Get full language string.\n */\nconst getFullLanguage = (spec: LanguageSpec): string => spec.full;\n\n/**\n * Check if a spec has any quality.\n */\nconst isQuality = (spec: { q: number }): boolean => spec.q > 0;\n\n/**\n * Detects the locale from the request headers\n *\n * Headers are provided by the browser and can be used to determine the user's preferred language\n */\nexport const localeDetector = (\n headers: Record<string, string | undefined>,\n locales?: Locale[],\n defaultLocale?: Locale\n): Locale => {\n const accept = headers['accept-language'];\n const languages = preferredLanguages(accept);\n\n return localeResolver(languages as Locale[], locales, defaultLocale);\n};\n"],"mappings":";;;;;;AAMA,MAAM,uBAAuB;;;;AA2B7B,MAAM,uBAAuB,WAAmC;CAC9D,MAAM,aAAa,OAAO,MAAM,IAAI;CACpC,MAAMA,UAA0B,EAAE;AAElC,MAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC1C,MAAM,WAAW,cAAc,WAAW,GAAG,MAAM,EAAE,EAAE;AACvD,MAAI,SAAU,SAAQ,KAAK,SAAS;;AAGtC,QAAO;;;;;AAMT,MAAM,iBAAiB,KAAa,MAAmC;CACrE,MAAM,QAAQ,qBAAqB,KAAK,IAAI;AAC5C,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,SAAS,MAAM;CACrB,MAAM,SAAS,MAAM;CACrB,IAAI,OAAO;AAEX,KAAI,OAAQ,QAAO,GAAG,OAAO,GAAG;CAEhC,IAAI,IAAI;AACR,KAAI,MAAM,IAAI;EACZ,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;AAClC,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;GACtC,MAAM,IAAI,OAAO,GAAG,MAAM,IAAI;AAC9B,OAAI,EAAE,OAAO,IAAK,KAAI,WAAW,EAAE,GAAG;;;AAI1C,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;;;;AAMH,MAAM,uBACJ,UACA,UACA,UACiB;CACjB,IAAIC,WAAyB;EAAE,GAAG;EAAI,GAAG;EAAG,GAAG;EAAG,GAAG;EAAO;AAE5D,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,OAAO,QAAQ,UAAU,SAAS,IAAI,MAAM;AAClD,MACE,SACC,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAEtE,YAAW;;AAIf,QAAO;;;;;AAMT,MAAM,WACJ,UACA,MACA,UACwB;CACxB,MAAM,IAAI,cAAc,UAAU,MAAM;AACxC,KAAI,CAAC,EAAG,QAAO;CACf,IAAI,IAAI;AACR,KAAI,KAAK,KAAK,aAAa,KAAK,EAAE,KAAK,aAAa,CAClD,MAAK;UACI,KAAK,OAAO,aAAa,KAAK,EAAE,KAAK,aAAa,CAC3D,MAAK;UACI,KAAK,KAAK,aAAa,KAAK,EAAE,OAAO,aAAa,CAC3D,MAAK;UACI,KAAK,SAAS,IACvB,QAAO;AAGT,QAAO;EACL,GAAG;EACH,GAAG,KAAK;EACR,GAAG,KAAK;EACR;EACD;;;;;AAMH,MAAM,sBACJ,QACA,aACa;CAEb,MAAM,UAAU,oBACd,WAAW,SAAY,MAAO,UAAU,GACzC;AAED,KAAI,CAAC,SACH,QAAO,QAAQ,OAAO,UAAU,CAAC,KAAK,aAAa,CAAC,IAAI,gBAAgB;CAG1E,MAAM,aAAa,SAAS,KAAK,MAAM,UACrC,oBAAoB,MAAM,SAAS,MAAM,CAC1C;AAED,QAAO,WACJ,OAAO,UAAU,CACjB,KAAK,aAAa,CAClB,KAAK,aAAa,SAAS,WAAW,QAAQ,SAAS,EAAE;;;;;AAM9D,MAAM,gBAAgB,GAAmB,MACvC,EAAE,IAAI,EAAE,MACP,EAAE,KAAK,MAAM,EAAE,KAAK,OACpB,EAAE,KAAK,MAAM,EAAE,KAAK,MACrB,EAAE,IAAI,EAAE,KACR;;;;AAKF,MAAM,mBAAmB,SAA+B,KAAK;;;;AAK7D,MAAM,aAAa,SAAiC,KAAK,IAAI;;;;;;AAO7D,MAAa,kBACX,SACA,SACA,kBACW;CACX,MAAM,SAAS,QAAQ;AAGvB,QAAO,eAFW,mBAAmB,OAAO,EAEC,SAAS,cAAc"}
1
+ {"version":3,"file":"localeDetector.mjs","names":["preferences: LanguagePreference[]","bestMatch: MatchResult"],"sources":["../../../src/localization/localeDetector.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types';\nimport { localeResolver } from './localeResolver';\n\n/**\n * Constants\n */\nconst LANGUAGE_FORMAT_REGULAR_EXPRESSION =\n /^\\s*([^\\s\\-;]+)(?:-([^\\s;]+))?\\s*(?:;(.*))?$/;\nconst DEFAULT_QUALITY_SCORE = 1;\n\n/**\n * Enumeration for specificity weights.\n * Higher values indicate a more precise match.\n */\nenum SpecificityWeight {\n None = 0,\n Broad = 1, // Matches prefix (e.g., 'en' matches 'en-US')\n Prefix = 2, // Matches prefix in reverse (e.g., 'en-US' matches 'en')\n Exact = 4, // Matches exact string (e.g., 'en-US' matches 'en-US')\n}\n\n/**\n * Represents a parsed language tag from the header.\n */\ntype LanguagePreference = {\n languageCode: string;\n regionCode?: string;\n fullLocale: string;\n qualityScore: number;\n originalIndex: number;\n};\n\n/**\n * Represents the result of matching a requested language against an available language.\n */\ntype MatchResult = {\n providedIndex: number;\n headerIndex: number;\n qualityScore: number;\n specificityScore: number;\n};\n\n/**\n * Parses a single language tag string from the Accept-Language header.\n * Example input: \"en-US;q=0.8\"\n */\nconst parseLanguageTag = (\n tagString: string,\n index: number\n): LanguagePreference | null => {\n const match = LANGUAGE_FORMAT_REGULAR_EXPRESSION.exec(tagString);\n if (!match) {\n return null;\n }\n\n const languageCode = match[1];\n const regionCode = match[2];\n const parameters = match[3];\n\n // Construct the full locale string (e.g., \"en-US\" or \"en\")\n const fullLocale = regionCode\n ? `${languageCode}-${regionCode}`\n : languageCode;\n\n let qualityScore = DEFAULT_QUALITY_SCORE;\n\n // Parse parameters to find the quality score (\"q\")\n if (parameters) {\n const parameterList = parameters.split(';');\n for (const parameter of parameterList) {\n const [key, value] = parameter.split('=');\n if (key === 'q') {\n qualityScore = parseFloat(value);\n }\n }\n }\n\n return {\n languageCode,\n regionCode,\n qualityScore,\n originalIndex: index,\n fullLocale,\n };\n};\n\n/**\n * Parses the entire Accept-Language header string into a list of preferences.\n */\nconst parseAcceptLanguageHeader = (\n headerValue: string\n): LanguagePreference[] => {\n const rawTags = headerValue.split(',');\n const preferences: LanguagePreference[] = [];\n\n for (let index = 0; index < rawTags.length; index++) {\n const tag = rawTags[index].trim();\n const parsedLanguage = parseLanguageTag(tag, index);\n\n if (parsedLanguage) {\n preferences.push(parsedLanguage);\n }\n }\n\n return preferences;\n};\n\n/**\n * Calculates the specificity of a match between a provided language and a requested preference.\n */\nconst calculateMatchSpecificity = (\n providedLanguage: string,\n preference: LanguagePreference,\n providedIndex: number\n): MatchResult | null => {\n const parsedProvided = parseLanguageTag(providedLanguage, providedIndex);\n if (!parsedProvided) {\n return null;\n }\n\n let specificityScore = SpecificityWeight.None;\n\n const preferenceFullLower = preference.fullLocale.toLowerCase();\n const preferencePrefixLower = preference.languageCode.toLowerCase();\n const providedFullLower = parsedProvided.fullLocale.toLowerCase();\n const providedPrefixLower = parsedProvided.languageCode.toLowerCase();\n\n if (preferenceFullLower === providedFullLower) {\n specificityScore |= SpecificityWeight.Exact;\n } else if (preferencePrefixLower === providedFullLower) {\n specificityScore |= SpecificityWeight.Prefix;\n } else if (preferenceFullLower === providedPrefixLower) {\n specificityScore |= SpecificityWeight.Broad;\n } else if (preference.fullLocale !== '*') {\n return null;\n }\n\n return {\n providedIndex,\n headerIndex: preference.originalIndex,\n qualityScore: preference.qualityScore,\n specificityScore,\n };\n};\n\n/**\n * Determines the best match for a specific available language against the list of user accepted languages.\n */\nconst getBestMatchForLanguage = (\n providedLanguage: string,\n acceptedPreferences: LanguagePreference[],\n providedIndex: number\n): MatchResult => {\n // Initialize with a non-match priority\n let bestMatch: MatchResult = {\n headerIndex: -1,\n qualityScore: 0,\n specificityScore: 0,\n providedIndex,\n };\n\n for (const preference of acceptedPreferences) {\n const matchSpec = calculateMatchSpecificity(\n providedLanguage,\n preference,\n providedIndex\n );\n\n if (matchSpec) {\n // Compare current best match with new match\n const scoreDifference =\n bestMatch.specificityScore - matchSpec.specificityScore ||\n bestMatch.qualityScore - matchSpec.qualityScore ||\n bestMatch.headerIndex - matchSpec.headerIndex;\n\n // If the new match is better (difference < 0), update priority\n if (scoreDifference < 0) {\n bestMatch = matchSpec;\n }\n }\n }\n\n return bestMatch;\n};\n\n/**\n * Comparator function to sort language matches.\n * Sorting order:\n * 1. Quality Score (Descending)\n * 2. Specificity Score (Descending)\n * 3. Order in Header (Ascending - lower index is better)\n * 4. Order in Provided List (Ascending)\n */\nconst compareMatchResults = (a: MatchResult, b: MatchResult): number => {\n return (\n b.qualityScore - a.qualityScore ||\n b.specificityScore - a.specificityScore ||\n a.headerIndex - b.headerIndex ||\n a.providedIndex - b.providedIndex ||\n 0\n );\n};\n\n/**\n * Derives the list of preferred languages based on the Accept-Language header\n * and an optional list of available languages.\n */\nconst getPreferredLanguages = (\n acceptHeader: string | undefined,\n availableLanguages?: string[]\n): string[] => {\n // RFC 2616 sec 14.4: no header implies '*'\n const headerValue = acceptHeader === undefined ? '*' : acceptHeader || '';\n const acceptedPreferences = parseAcceptLanguageHeader(headerValue);\n\n // If no specific languages are provided to filter against, return the header languages sorted by quality\n if (!availableLanguages) {\n return acceptedPreferences\n .filter((preference) => preference.qualityScore > 0)\n .sort((a, b) => b.qualityScore - a.qualityScore) // Simple sort by quality\n .map((preference) => preference.fullLocale);\n }\n\n // Map available languages to their match priority against the header\n const matchResults = availableLanguages.map((language, index) =>\n getBestMatchForLanguage(language, acceptedPreferences, index)\n );\n\n return matchResults\n .filter((result) => result.qualityScore > 0)\n .sort(compareMatchResults)\n .map((result) => availableLanguages[result.providedIndex]);\n};\n\n/**\n * Detects the locale from the request headers.\n *\n * Headers are provided by the browser/client and can be used to determine the user's preferred language.\n * This function intersects the user's `Accept-Language` header with the application's available locales.\n */\nexport const localeDetector = (\n headers: Record<string, string | undefined>,\n availableLocales?: Locale[],\n defaultLocale?: Locale\n): Locale => {\n const acceptLanguageHeader = headers['accept-language'];\n\n const preferredLocaleStrings = getPreferredLanguages(\n acceptLanguageHeader,\n availableLocales as string[]\n );\n\n return localeResolver(\n preferredLocaleStrings as Locale[],\n availableLocales,\n defaultLocale\n );\n};\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { NodeProps, Plugins } from "../interpreter/getContent/plugins.js";
2
2
  import "../interpreter/index.js";
3
- import * as _intlayer_types6 from "@intlayer/types";
3
+ import * as _intlayer_types11 from "@intlayer/types";
4
4
  import { ContentNode, DeclaredLocales, Dictionary, LocalesValues } from "@intlayer/types";
5
5
 
6
6
  //#region src/deepTransformPlugins/getFilterMissingTranslationsContent.d.ts
@@ -24,11 +24,11 @@ declare const getFilterMissingTranslationsContent: <T extends ContentNode, L ext
24
24
  declare const getFilterMissingTranslationsDictionary: (dictionary: Dictionary, localeToCheck: LocalesValues) => {
25
25
  content: any;
26
26
  $schema?: string;
27
- id?: _intlayer_types6.DictionaryId;
27
+ id?: _intlayer_types11.DictionaryId;
28
28
  projectIds?: string[];
29
- localId?: _intlayer_types6.LocalDictionaryId;
30
- localIds?: _intlayer_types6.LocalDictionaryId[];
31
- key: _intlayer_types6.DictionaryKey;
29
+ localId?: _intlayer_types11.LocalDictionaryId;
30
+ localIds?: _intlayer_types11.LocalDictionaryId[];
31
+ key: _intlayer_types11.DictionaryKey;
32
32
  title?: string;
33
33
  description?: string;
34
34
  versions?: string[];
@@ -36,11 +36,11 @@ declare const getFilterMissingTranslationsDictionary: (dictionary: Dictionary, l
36
36
  filePath?: string;
37
37
  tags?: string[];
38
38
  locale?: LocalesValues;
39
- fill?: _intlayer_types6.Fill;
39
+ fill?: _intlayer_types11.Fill;
40
40
  filled?: true;
41
41
  priority?: number;
42
42
  live?: boolean;
43
- location?: _intlayer_types6.DictionaryLocation;
43
+ location?: _intlayer_types11.DictionaryLocation;
44
44
  };
45
45
  //#endregion
46
46
  export { filterMissingTranslationsOnlyPlugin, getFilterMissingTranslationsContent, getFilterMissingTranslationsDictionary };
@@ -1 +1 @@
1
- {"version":3,"file":"getFilterMissingTranslationsContent.d.ts","names":[],"sources":["../../../src/deepTransformPlugins/getFilterMissingTranslationsContent.ts"],"sourcesContent":[],"mappings":";;;;;;;cAmMa,qDACI,kBACd;;AAFH;AA8LA;;;;;;;;AA0BA;;;;cA1Ba,gDACD,uBACA,gBAAgB,uBAEpB,kBACS,cACJ;cAoBA,qDACC,2BACG;;;OAAa,gBAAA,CAAA"}
1
+ {"version":3,"file":"getFilterMissingTranslationsContent.d.ts","names":[],"sources":["../../../src/deepTransformPlugins/getFilterMissingTranslationsContent.ts"],"sourcesContent":[],"mappings":";;;;;;;cAmMa,qDACI,kBACd;;AAFH;AA8LA;;;;;;;;AA0BA;;;;cA1Ba,gDACD,uBACA,gBAAgB,uBAEpB,kBACS,cACJ;cAoBA,qDACC,2BACG;;;OAAa,iBAAA,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { DeepTransformContent, NodeProps, Plugins } from "../interpreter/getContent/plugins.js";
2
2
  import "../interpreter/index.js";
3
- import * as _intlayer_types12 from "@intlayer/types";
3
+ import * as _intlayer_types5 from "@intlayer/types";
4
4
  import { ContentNode, DeclaredLocales, Dictionary, LocalesValues } from "@intlayer/types";
5
5
 
6
6
  //#region src/deepTransformPlugins/getFilterTranslationsOnlyContent.d.ts
@@ -16,11 +16,11 @@ declare const getFilterTranslationsOnlyContent: <T extends ContentNode, L extend
16
16
  declare const getFilterTranslationsOnlyDictionary: (dictionary: Dictionary, locale?: LocalesValues, fallback?: LocalesValues) => {
17
17
  content: any;
18
18
  $schema?: string;
19
- id?: _intlayer_types12.DictionaryId;
19
+ id?: _intlayer_types5.DictionaryId;
20
20
  projectIds?: string[];
21
- localId?: _intlayer_types12.LocalDictionaryId;
22
- localIds?: _intlayer_types12.LocalDictionaryId[];
23
- key: _intlayer_types12.DictionaryKey;
21
+ localId?: _intlayer_types5.LocalDictionaryId;
22
+ localIds?: _intlayer_types5.LocalDictionaryId[];
23
+ key: _intlayer_types5.DictionaryKey;
24
24
  title?: string;
25
25
  description?: string;
26
26
  versions?: string[];
@@ -28,11 +28,11 @@ declare const getFilterTranslationsOnlyDictionary: (dictionary: Dictionary, loca
28
28
  filePath?: string;
29
29
  tags?: string[];
30
30
  locale?: LocalesValues;
31
- fill?: _intlayer_types12.Fill;
31
+ fill?: _intlayer_types5.Fill;
32
32
  filled?: true;
33
33
  priority?: number;
34
34
  live?: boolean;
35
- location?: _intlayer_types12.DictionaryLocation;
35
+ location?: _intlayer_types5.DictionaryLocation;
36
36
  };
37
37
  //#endregion
38
38
  export { filterTranslationsOnlyPlugin, getFilterTranslationsOnlyContent, getFilterTranslationsOnlyDictionary };
@@ -1 +1 @@
1
- {"version":3,"file":"getFilterTranslationsOnlyContent.d.ts","names":[],"sources":["../../../src/deepTransformPlugins/getFilterTranslationsOnlyContent.ts"],"sourcesContent":[],"mappings":";;;;;;;cAoCa,uCACH,0BACG,kBACV;;AAHH;;;;;AAuFa,cAAA,gCAkBZ,EAAA,CAAA,UAjBW,WAiBX,EAAA,UAhBW,aAgBX,GAhB2B,eAgB3B,CAAA,CAAA,IAAA,EAdO,CAcP,EAAA,MAAA,EAbS,CAaT,EAAA,SAAA,EAZY,SAYZ,EAAA,QAAA,CAAA,EAXY,aAWZ,EAAA,GADO,oBACP,CAD4B,CAC5B,CAAA;AAjBW,cAmBC,mCAnBD,EAAA,CAAA,UAAA,EAoBE,UApBF,EAAA,MAAA,CAAA,EAqBF,aArBE,EAAA,QAAA,CAAA,EAuBC,aAvBD,EAAA,GAAA;EACA,OAAA,EAAA,GAAA;EAAgB,OAAA,CAAA,EAAA,MAAA;EAEpB,EAAA,CAAA,EAoBkB,iBAAA,CAAA,YApBlB;EACE,UAAA,CAAA,EAAA,MAAA,EAAA;EACG,OAAA,CAAA,qCAAA;EACA,QAAA,CAAA,uCAAA;EAUgB,GAAA,iCAAA;EAArB,KAAA,CAAA,EAAA,MAAA;EAAoB,WAAA,CAAA,EAAA,MAAA;EAGf,QAAA,CAAA,EAAA,MAAA,EAAA;EACC,OAAA,CAAA,EAAA,MAAA;EACJ,QAAA,CAAA,EAAA,MAAA;EAEG,IAAA,CAAA,EAAA,MAAA,EAAA;EAAa,MAAA,CAAA,eAAA"}
1
+ {"version":3,"file":"getFilterTranslationsOnlyContent.d.ts","names":[],"sources":["../../../src/deepTransformPlugins/getFilterTranslationsOnlyContent.ts"],"sourcesContent":[],"mappings":";;;;;;;cAoCa,uCACH,0BACG,kBACV;;AAHH;;;;;AAuFa,cAAA,gCAkBZ,EAAA,CAAA,UAjBW,WAiBX,EAAA,UAhBW,aAgBX,GAhB2B,eAgB3B,CAAA,CAAA,IAAA,EAdO,CAcP,EAAA,MAAA,EAbS,CAaT,EAAA,SAAA,EAZY,SAYZ,EAAA,QAAA,CAAA,EAXY,aAWZ,EAAA,GADO,oBACP,CAD4B,CAC5B,CAAA;AAjBW,cAmBC,mCAnBD,EAAA,CAAA,UAAA,EAoBE,UApBF,EAAA,MAAA,CAAA,EAqBF,aArBE,EAAA,QAAA,CAAA,EAuBC,aAvBD,EAAA,GAAA;EACA,OAAA,EAAA,GAAA;EAAgB,OAAA,CAAA,EAAA,MAAA;EAEpB,EAAA,CAAA,EAoBkB,gBAAA,CAAA,YApBlB;EACE,UAAA,CAAA,EAAA,MAAA,EAAA;EACG,OAAA,CAAA,oCAAA;EACA,QAAA,CAAA,sCAAA;EAUgB,GAAA,gCAAA;EAArB,KAAA,CAAA,EAAA,MAAA;EAAoB,WAAA,CAAA,EAAA,MAAA;EAGf,QAAA,CAAA,EAAA,MAAA,EAAA;EACC,OAAA,CAAA,EAAA,MAAA;EACJ,QAAA,CAAA,EAAA,MAAA;EAEG,IAAA,CAAA,EAAA,MAAA,EAAA;EAAa,MAAA,CAAA,eAAA"}
@@ -1,4 +1,4 @@
1
- import * as _intlayer_types0 from "@intlayer/types";
1
+ import * as _intlayer_types17 from "@intlayer/types";
2
2
  import { Dictionary } from "@intlayer/types";
3
3
 
4
4
  //#region src/dictionaryManipulator/orderDictionaries.d.ts
@@ -10,7 +10,7 @@ import { Dictionary } from "@intlayer/types";
10
10
  * @param priorityStrategy - The priority strategy ('local_first' or 'distant_first')
11
11
  * @returns Ordered array of dictionaries
12
12
  */
13
- declare const orderDictionaries: (dictionaries: Dictionary[], configuration?: _intlayer_types0.IntlayerConfig) => Dictionary[];
13
+ declare const orderDictionaries: (dictionaries: Dictionary[], configuration?: _intlayer_types17.IntlayerConfig) => Dictionary[];
14
14
  //#endregion
15
15
  export { orderDictionaries };
16
16
  //# sourceMappingURL=orderDictionaries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"orderDictionaries.d.ts","names":[],"sources":["../../../src/dictionaryManipulator/orderDictionaries.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAUA;;;;AAGa,cAHA,iBAGA,EAAA,CAAA,YAAA,EAFG,UAEH,EAAA,EAAA,aAAA,CAAA,EAFa,gBAAA,CACxB,cACW,EAAA,GAAV,UAAU,EAAA"}
1
+ {"version":3,"file":"orderDictionaries.d.ts","names":[],"sources":["../../../src/dictionaryManipulator/orderDictionaries.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAUA;;;;AAGa,cAHA,iBAGA,EAAA,CAAA,YAAA,EAFG,UAEH,EAAA,EAAA,aAAA,CAAA,EAFa,iBAAA,CACxB,cACW,EAAA,GAAV,UAAU,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","names":[],"sources":["../../../../src/interpreter/getContent/plugins.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.d.ts","names":[],"sources":["../../../../src/interpreter/getContent/plugins.ts"],"sourcesContent":[],"mappings":"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"}
@@ -3,11 +3,12 @@ import { Locale } from "@intlayer/types";
3
3
  //#region src/localization/localeDetector.d.ts
4
4
 
5
5
  /**
6
- * Detects the locale from the request headers
6
+ * Detects the locale from the request headers.
7
7
  *
8
- * Headers are provided by the browser and can be used to determine the user's preferred language
8
+ * Headers are provided by the browser/client and can be used to determine the user's preferred language.
9
+ * This function intersects the user's `Accept-Language` header with the application's available locales.
9
10
  */
10
- declare const localeDetector: (headers: Record<string, string | undefined>, locales?: Locale[], defaultLocale?: Locale) => Locale;
11
+ declare const localeDetector: (headers: Record<string, string | undefined>, availableLocales?: Locale[], defaultLocale?: Locale) => Locale;
11
12
  //#endregion
12
13
  export { localeDetector };
13
14
  //# sourceMappingURL=localeDetector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"localeDetector.d.ts","names":[],"sources":["../../../src/localization/localeDetector.ts"],"sourcesContent":[],"mappings":";;;;;;AAmLA;;;AAGkB,cAHL,cAGK,EAAA,CAAA,OAAA,EAFP,MAEO,CAAA,MAAA,EAAA,MAAA,GAAA,SAAA,CAAA,EAAA,OAAA,CAAA,EADN,MACM,EAAA,EAAA,aAAA,CAAA,EAAA,MAAA,EAAA,GACf,MADe"}
1
+ {"version":3,"file":"localeDetector.d.ts","names":[],"sources":["../../../src/localization/localeDetector.ts"],"sourcesContent":[],"mappings":";;;;;;AAgPA;;;;AAIG,cAJU,cAIV,EAAA,CAAA,OAAA,EAHQ,MAGR,CAAA,MAAA,EAAA,MAAA,GAAA,SAAA,CAAA,EAAA,gBAAA,CAAA,EAFkB,MAElB,EAAA,EAAA,aAAA,CAAA,EADe,MACf,EAAA,GAAA,MAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/core",
3
- "version": "7.1.9",
3
+ "version": "7.2.0",
4
4
  "private": false,
5
5
  "description": "Includes core Intlayer functions like translation, dictionary, and utility functions shared across multiple packages.",
6
6
  "keywords": [
@@ -101,11 +101,11 @@
101
101
  "typecheck": "tsc --noEmit --project tsconfig.types.json"
102
102
  },
103
103
  "dependencies": {
104
- "@intlayer/api": "7.1.9",
105
- "@intlayer/config": "7.1.9",
106
- "@intlayer/dictionaries-entry": "7.1.9",
107
- "@intlayer/types": "7.1.9",
108
- "@intlayer/unmerged-dictionaries-entry": "7.1.9",
104
+ "@intlayer/api": "7.2.0",
105
+ "@intlayer/config": "7.2.0",
106
+ "@intlayer/dictionaries-entry": "7.2.0",
107
+ "@intlayer/types": "7.2.0",
108
+ "@intlayer/unmerged-dictionaries-entry": "7.2.0",
109
109
  "deepmerge": "4.3.1"
110
110
  },
111
111
  "devDependencies": {