@paroicms/public-server-lib 0.37.3 → 0.38.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/dist/simple-i18n.d.ts +8 -2
- package/dist/simple-i18n.js +62 -8
- package/dist/simple-i18n.js.map +1 -1
- package/package.json +3 -3
package/dist/simple-i18n.d.ts
CHANGED
|
@@ -9,14 +9,20 @@ export interface SimpleTranslateOptions {
|
|
|
9
9
|
args?: (string | number)[];
|
|
10
10
|
defaultValue?: string;
|
|
11
11
|
}
|
|
12
|
+
export interface SimpleTranslatorConfig {
|
|
13
|
+
siteLanguages?: string[];
|
|
14
|
+
}
|
|
12
15
|
export declare function loadSimpleTranslatorFromDirectory(options: {
|
|
13
|
-
l10nDir: string;
|
|
14
|
-
languages: string[];
|
|
15
16
|
logger: Pick<AppLogger, "warn">;
|
|
17
|
+
l10nDir: string;
|
|
18
|
+
languages?: string[];
|
|
19
|
+
config?: SimpleTranslatorConfig;
|
|
16
20
|
}): Promise<SimpleTranslator>;
|
|
17
21
|
export declare function createSimpleTranslator(options: {
|
|
18
22
|
labels: {
|
|
19
23
|
[language: string]: ScTranslations;
|
|
20
24
|
} | ScSchemaLocales;
|
|
21
25
|
logger: Pick<AppLogger, "warn">;
|
|
26
|
+
config?: SimpleTranslatorConfig;
|
|
22
27
|
}): SimpleTranslator;
|
|
28
|
+
export declare function ensureLanguagesFormat(languages: string[]): string[];
|
package/dist/simple-i18n.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { coreLanguages, isDef } from "@paroicms/public-anywhere-lib";
|
|
2
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
3
|
import { join } from "node:path";
|
|
3
|
-
import { isDef } from "@paroicms/public-anywhere-lib";
|
|
4
4
|
export async function loadSimpleTranslatorFromDirectory(options) {
|
|
5
5
|
const labels = await loadLabels(options);
|
|
6
6
|
return {
|
|
7
|
-
translate: (
|
|
7
|
+
translate: (translateOptions) => translate(labels, translateOptions, options.config),
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
10
|
export function createSimpleTranslator(options) {
|
|
11
11
|
const labels = new Map(Object.entries(options.labels).map(([k, v]) => [k, flattenLocales(v)]));
|
|
12
12
|
return {
|
|
13
|
-
translate: (
|
|
13
|
+
translate: (translateOptions) => translate(labels, translateOptions, options.config),
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
|
-
function translate(labels, { args = [], key, defaultValue, language }) {
|
|
17
|
-
|
|
16
|
+
function translate(labels, { args = [], key, defaultValue, language }, config) {
|
|
17
|
+
const siteLanguages = config?.siteLanguages ?? [];
|
|
18
|
+
// Try to find the translation using fallback rules
|
|
19
|
+
let label = findTranslationWithFallback(labels, key, language, coreLanguages, siteLanguages);
|
|
18
20
|
if (label === undefined) {
|
|
19
21
|
if (isDef(defaultValue))
|
|
20
22
|
return defaultValue;
|
|
@@ -30,6 +32,33 @@ function translate(labels, { args = [], key, defaultValue, language }) {
|
|
|
30
32
|
}
|
|
31
33
|
return label;
|
|
32
34
|
}
|
|
35
|
+
function findTranslationWithFallback(labels, key, language, coreLanguages, siteLanguages) {
|
|
36
|
+
// Rule 1: If the label can be provided by the schema locales and translation exists for the user language
|
|
37
|
+
if (key.startsWith("siteSchema.")) {
|
|
38
|
+
const translation = labels.get(language)?.[key];
|
|
39
|
+
if (translation)
|
|
40
|
+
return translation;
|
|
41
|
+
}
|
|
42
|
+
// Rule 2: If the user language is supported by core packages, use core package translation
|
|
43
|
+
if (coreLanguages.includes(language)) {
|
|
44
|
+
const translation = labels.get(language)?.[key];
|
|
45
|
+
if (translation)
|
|
46
|
+
return translation;
|
|
47
|
+
}
|
|
48
|
+
// Rule 3: Fallback to the core-supported language that appears first in siteSchema.languages
|
|
49
|
+
const firstCoreSupportedSiteLanguage = siteLanguages.find((lang) => coreLanguages.includes(lang));
|
|
50
|
+
if (firstCoreSupportedSiteLanguage) {
|
|
51
|
+
const translation = labels.get(firstCoreSupportedSiteLanguage)?.[key];
|
|
52
|
+
if (translation)
|
|
53
|
+
return translation;
|
|
54
|
+
}
|
|
55
|
+
// Rule 4: If there isn't any core-supported language in the website schema, fallback to English
|
|
56
|
+
const englishTranslation = labels.get("en")?.[key];
|
|
57
|
+
if (englishTranslation)
|
|
58
|
+
return englishTranslation;
|
|
59
|
+
// Final fallback: try the original requested language
|
|
60
|
+
return labels.get(language)?.[key];
|
|
61
|
+
}
|
|
33
62
|
function findVariablesInString(str, max) {
|
|
34
63
|
const matches = [];
|
|
35
64
|
const regex = /\$[0-9]+/g;
|
|
@@ -50,9 +79,10 @@ function findVariablesInString(str, max) {
|
|
|
50
79
|
}
|
|
51
80
|
return matches;
|
|
52
81
|
}
|
|
53
|
-
async function loadLabels({ l10nDir, languages,
|
|
82
|
+
async function loadLabels({ logger, l10nDir, languages, }) {
|
|
54
83
|
const labels = new Map();
|
|
55
|
-
|
|
84
|
+
const resolvedLanguages = languages ?? (await readLocaleLanguagesFromDirectory(l10nDir));
|
|
85
|
+
for (const language of resolvedLanguages) {
|
|
56
86
|
let content;
|
|
57
87
|
try {
|
|
58
88
|
content = await readFile(join(l10nDir, `${language}.json`), "utf-8");
|
|
@@ -69,6 +99,30 @@ async function loadLabels({ l10nDir, languages, logger, }) {
|
|
|
69
99
|
}
|
|
70
100
|
return labels;
|
|
71
101
|
}
|
|
102
|
+
async function readLocaleLanguagesFromDirectory(l10nDir) {
|
|
103
|
+
const files = await readdir(l10nDir);
|
|
104
|
+
const languages = [];
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
const match = file.match(/^([a-z]{2,3}(?:-[A-Z]{2})?)\.json$/);
|
|
107
|
+
if (match) {
|
|
108
|
+
languages.push(match[1]);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return ensureLanguagesFormat(languages);
|
|
112
|
+
}
|
|
113
|
+
export function ensureLanguagesFormat(languages) {
|
|
114
|
+
const formatted = Intl.getCanonicalLocales(languages);
|
|
115
|
+
if (formatted.length !== languages.length) {
|
|
116
|
+
throw new Error(`some languages are not valid in: "${languages.join(`", "`)}"`);
|
|
117
|
+
}
|
|
118
|
+
for (let index = 0; index < languages.length; index++) {
|
|
119
|
+
const language = languages[index];
|
|
120
|
+
if (formatted[index] !== language) {
|
|
121
|
+
throw new Error(`language "${language}" is not valid, should be "${formatted[index]}"`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return formatted;
|
|
125
|
+
}
|
|
72
126
|
function flattenLocales(source, prefix = "") {
|
|
73
127
|
const result = {};
|
|
74
128
|
for (const [key, val] of Object.entries(source)) {
|
package/dist/simple-i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-i18n.js","sourceRoot":"","sources":["../src/simple-i18n.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"simple-i18n.js","sourceRoot":"","sources":["../src/simple-i18n.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paroicms/public-server-lib",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.38.0",
|
|
4
4
|
"description": "Common utilitaries for paroicms plugins (backend side).",
|
|
5
5
|
"author": "Paroi Team",
|
|
6
6
|
"repository": {
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"dev": "tsc --watch --preserveWatchOutput"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@paroicms/internal-anywhere-lib": "1.31.
|
|
24
|
-
"@paroicms/public-anywhere-lib": "0.
|
|
23
|
+
"@paroicms/internal-anywhere-lib": "1.31.5",
|
|
24
|
+
"@paroicms/public-anywhere-lib": "0.27.0",
|
|
25
25
|
"arktype": "~2.1.20"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|