lingo.dev 0.74.2 → 0.74.4
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/build/cli.cjs +37 -41
- package/build/cli.cjs.map +1 -1
- package/build/cli.mjs +24 -28
- package/build/cli.mjs.map +1 -1
- package/build/sdk.cjs +2 -7
- package/build/sdk.cjs.map +1 -1
- package/build/sdk.mjs +2 -7
- package/build/sdk.mjs.map +1 -1
- package/build/spec.cjs +2 -46
- package/build/spec.cjs.map +1 -1
- package/build/spec.mjs +2 -46
- package/build/spec.mjs.map +1 -1
- package/package.json +5 -5
- package/build/chunk-B6KMMXCA.mjs +0 -494
- package/build/chunk-B6KMMXCA.mjs.map +0 -1
- package/build/chunk-JZIJPDHI.cjs +0 -331
- package/build/chunk-JZIJPDHI.cjs.map +0 -1
- package/build/chunk-U3YIG2HS.cjs +0 -494
- package/build/chunk-U3YIG2HS.cjs.map +0 -1
- package/build/chunk-XU7ZJKQ2.mjs +0 -331
- package/build/chunk-XU7ZJKQ2.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../spec/build/index.mjs"],"sourcesContent":["// src/locales.ts\nimport Z from \"zod\";\nvar localeMap = {\n // Urdu (Pakistan)\n ur: [\"ur-PK\"],\n // Vietnamese (Vietnam)\n vi: [\"vi-VN\"],\n // Turkish (Turkey)\n tr: [\"tr-TR\"],\n // Tamil (India)\n ta: [\"ta-IN\"],\n // Serbian\n sr: [\n \"sr-RS\",\n // Serbian (Latin)\n \"sr-Latn-RS\",\n // Serbian (Latin)\n \"sr-Cyrl-RS\"\n // Serbian (Cyrillic)\n ],\n // Hungarian (Hungary)\n hu: [\"hu-HU\"],\n // Hebrew (Israel)\n he: [\"he-IL\"],\n // Estonian (Estonia)\n et: [\"et-EE\"],\n // Greek (Greece)\n el: [\"el-GR\"],\n // Danish (Denmark)\n da: [\"da-DK\"],\n // Azerbaijani (Azerbaijan)\n az: [\"az-AZ\"],\n // Thai (Thailand)\n th: [\"th-TH\"],\n // Swedish (Sweden)\n sv: [\"sv-SE\"],\n // English\n en: [\n \"en-US\",\n // United States\n \"en-GB\",\n // United Kingdom\n \"en-AU\",\n // Australia\n \"en-CA\"\n // Canada\n ],\n // Spanish\n es: [\n \"es-ES\",\n // Spain\n \"es-419\",\n // Latin America\n \"es-MX\",\n // Mexico\n \"es-AR\"\n // Argentina\n ],\n // French\n fr: [\n \"fr-FR\",\n // France\n \"fr-CA\",\n // Canada\n \"fr-BE\"\n // Belgium\n ],\n // Catalan (Spain)\n ca: [\"ca-ES\"],\n // Japanese (Japan)\n ja: [\"ja-JP\"],\n // German\n de: [\n \"de-DE\",\n // Germany\n \"de-AT\",\n // Austria\n \"de-CH\"\n // Switzerland\n ],\n // Portuguese\n pt: [\n \"pt-PT\",\n // Portugal\n \"pt-BR\"\n // Brazil\n ],\n // Italian\n it: [\n \"it-IT\",\n // Italy\n \"it-CH\"\n // Switzerland\n ],\n // Russian\n ru: [\n \"ru-RU\",\n // Russia\n \"ru-BY\"\n // Belarus\n ],\n // Ukrainian (Ukraine)\n uk: [\"uk-UA\"],\n // Belarusian (Belarus)\n be: [\"be-BY\"],\n // Hindi (India)\n hi: [\"hi-IN\"],\n // Chinese\n zh: [\n \"zh-CN\",\n // Simplified Chinese (China)\n \"zh-TW\",\n // Traditional Chinese (Taiwan)\n \"zh-HK\",\n // Traditional Chinese (Hong Kong)\n \"zh-Hans\",\n // Simplified Chinese\n \"zh-Hant\",\n // Traditional Chinese\n \"zh-Hant-HK\",\n // Traditional Chinese (Hong Kong)\n \"zh-Hant-TW\",\n // Traditional Chinese (Taiwan)\n \"zh-Hant-CN\",\n // Traditional Chinese (China)\n \"zh-Hans-HK\",\n // Simplified Chinese (Hong Kong)\n \"zh-Hans-TW\",\n // Simplified Chinese (China)\n \"zh-Hans-CN\"\n // Simplified Chinese (China)\n ],\n // Korean (South Korea)\n ko: [\"ko-KR\"],\n // Arabic\n ar: [\n \"ar-EG\",\n // Egypt\n \"ar-SA\",\n // Saudi Arabia\n \"ar-AE\",\n // United Arab Emirates\n \"ar-MA\"\n // Morocco\n ],\n // Bulgarian (Bulgaria)\n bg: [\"bg-BG\"],\n // Czech (Czech Republic)\n cs: [\"cs-CZ\"],\n // Dutch\n nl: [\n \"nl-NL\",\n // Netherlands\n \"nl-BE\"\n // Belgium\n ],\n // Polish (Poland)\n pl: [\"pl-PL\"],\n // Indonesian (Indonesia)\n id: [\"id-ID\"],\n // Malay (Malaysia)\n ms: [\"ms-MY\"],\n // Finnish (Finland)\n fi: [\"fi-FI\"],\n // Basque (Spain)\n eu: [\"eu-ES\"],\n // Croatian (Croatia)\n hr: [\"hr-HR\"],\n // Hebrew (Israel) - alternative code\n iw: [\"iw-IL\"],\n // Khmer (Cambodia)\n km: [\"km-KH\"],\n // Latvian (Latvia)\n lv: [\"lv-LV\"],\n // Lithuanian (Lithuania)\n lt: [\"lt-LT\"],\n // Norwegian (Norway)\n no: [\"no-NO\"],\n // Romanian (Romania)\n ro: [\"ro-RO\"],\n // Slovak (Slovakia)\n sk: [\"sk-SK\"],\n // Swahili\n sw: [\n \"sw-TZ\",\n // Tanzania\n \"sw-KE\"\n // Kenya\n ],\n // Persian (Iran)\n fa: [\"fa-IR\"],\n // Filipino (Philippines)\n fil: [\"fil-PH\"],\n // Punjabi\n pa: [\n \"pa-IN\",\n // India\n \"pa-PK\"\n // Pakistan\n ],\n // Bengali\n bn: [\n \"bn-BD\",\n // Bangladesh\n \"bn-IN\"\n // India\n ],\n // Irish (Ireland)\n ga: [\"ga-IE\"],\n // Maltese (Malta)\n mt: [\"mt-MT\"],\n // Slovenian (Slovenia)\n sl: [\"sl-SI\"],\n // Albanian (Albania)\n sq: [\"sq-AL\"],\n // Bavarian (Germany)\n bar: [\"bar-DE\"],\n // Neapolitan (Italy)\n nap: [\"nap-IT\"],\n // Afrikaans (South Africa)\n af: [\"af-ZA\"],\n // Somali (Somalia)\n so: [\"so-SO\"],\n // Tigrinya (Ethiopia)\n ti: [\"ti-ET\"],\n // Standard Moroccan Tamazight (Morocco)\n zgh: [\"zgh-MA\"],\n // Tagalog (Philippines)\n tl: [\"tl-PH\"],\n // Telugu (India)\n te: [\"te-IN\"]\n};\nvar localeCodesShort = Object.keys(localeMap);\nvar localeCodesFull = Object.values(localeMap).flat();\nvar localeCodesFullUnderscore = localeCodesFull.map((value) => value.replace(\"-\", \"_\"));\nvar localeCodesFullExplicitRegion = localeCodesFull.map((value) => {\n const chunks = value.split(\"-\");\n const result = [chunks[0], \"-r\", chunks.slice(1).join(\"-\")].join(\"\");\n return result;\n});\nvar localeCodes = [\n ...localeCodesShort,\n ...localeCodesFull,\n ...localeCodesFullUnderscore,\n ...localeCodesFullExplicitRegion\n];\nvar localeCodeSchema = Z.string().refine((value) => localeCodes.includes(value), {\n message: \"Invalid locale code\"\n});\nvar resolveLocaleCode = (value) => {\n const existingFullLocaleCode = Object.values(localeMap).flat().includes(value);\n if (existingFullLocaleCode) {\n return value;\n }\n const existingShortLocaleCode = Object.keys(localeMap).includes(value);\n if (existingShortLocaleCode) {\n const correspondingFullLocales = localeMap[value];\n const fallbackFullLocale = correspondingFullLocales[0];\n return fallbackFullLocale;\n }\n throw new Error(`Invalid locale code: ${value}`);\n};\nvar getAlternativeLocaleCodes = (locale) => {\n if (locale.includes(\"-\")) {\n return [locale.replace(/-/g, \"_\")];\n } else if (locale.includes(\"_\")) {\n return [locale.replace(/_/g, \"-\")];\n } else {\n return [];\n }\n};\nvar getLocaleCodeDelimiter = (locale) => {\n if (locale.includes(\"_\")) {\n return \"_\";\n } else if (locale.includes(\"-\")) {\n return \"-\";\n } else {\n return null;\n }\n};\nvar resolveOverridenLocale = (locale, delimiter) => {\n if (!delimiter) {\n return locale;\n }\n const currentDelimiter = getLocaleCodeDelimiter(locale);\n if (!currentDelimiter) {\n return locale;\n }\n return locale.replace(currentDelimiter, delimiter);\n};\n\n// src/formats.ts\nimport Z2 from \"zod\";\nvar bucketTypes = [\n \"android\",\n \"csv\",\n \"flutter\",\n \"html\",\n \"json\",\n \"markdown\",\n \"xcode-strings\",\n \"xcode-stringsdict\",\n \"xcode-xcstrings\",\n \"yaml\",\n \"yaml-root-key\",\n \"properties\",\n \"po\",\n \"xliff\",\n \"xml\",\n \"srt\",\n \"dato\",\n \"compiler\",\n \"vtt\"\n];\nvar bucketTypeSchema = Z2.enum(bucketTypes);\n\n// src/config.ts\nimport Z3 from \"zod\";\nvar localeSchema = Z3.object({\n source: localeCodeSchema,\n targets: Z3.array(localeCodeSchema)\n});\nvar createConfigDefinition = (definition) => definition;\nvar extendConfigDefinition = (definition, params) => {\n const schema = params.createSchema(definition.schema);\n const defaultValue = params.createDefaultValue(definition.defaultValue);\n const upgrader = (config) => params.createUpgrader(config, schema, defaultValue);\n return createConfigDefinition({\n schema,\n defaultValue,\n parse: (rawConfig) => {\n const safeResult = schema.safeParse(rawConfig);\n if (safeResult.success) {\n return safeResult.data;\n }\n const localeErrors = safeResult.error.errors.filter((issue) => issue.message.includes(\"Invalid locale code\")).map((issue) => {\n let unsupportedLocale = \"\";\n const path = issue.path;\n const config = rawConfig;\n if (config.locale) {\n unsupportedLocale = path.reduce((acc, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return acc[key];\n }\n return acc;\n }, config.locale);\n }\n return `Unsupported locale: ${unsupportedLocale}`;\n });\n if (localeErrors.length > 0) {\n throw new Error(`\n${localeErrors.join(\"\\n\")}`);\n }\n const baseConfig = definition.parse(rawConfig);\n const result = upgrader(baseConfig);\n return result;\n }\n });\n};\nvar configV0Schema = Z3.object({\n version: Z3.number().default(0)\n});\nvar configV0Definition = createConfigDefinition({\n schema: configV0Schema,\n defaultValue: { version: 0 },\n parse: (rawConfig) => {\n return configV0Schema.parse(rawConfig);\n }\n});\nvar configV1Definition = extendConfigDefinition(configV0Definition, {\n createSchema: (baseSchema) => baseSchema.extend({\n locale: localeSchema,\n buckets: Z3.record(Z3.string(), bucketTypeSchema).default({}).optional()\n }),\n createDefaultValue: () => ({\n version: 1,\n locale: {\n source: \"en\",\n targets: [\"es\"]\n },\n buckets: {}\n }),\n createUpgrader: () => ({\n version: 1,\n locale: {\n source: \"en\",\n targets: [\"es\"]\n },\n buckets: {}\n })\n});\nvar configV1_1Definition = extendConfigDefinition(configV1Definition, {\n createSchema: (baseSchema) => baseSchema.extend({\n buckets: Z3.record(\n bucketTypeSchema,\n Z3.object({\n include: Z3.array(Z3.string()).default([]),\n exclude: Z3.array(Z3.string()).default([]).optional()\n })\n ).default({})\n }),\n createDefaultValue: (baseDefaultValue) => ({\n ...baseDefaultValue,\n version: 1.1,\n buckets: {}\n }),\n createUpgrader: (oldConfig, schema) => {\n const upgradedConfig = {\n ...oldConfig,\n version: 1.1,\n buckets: {}\n };\n if (oldConfig.buckets) {\n for (const [bucketPath, bucketType] of Object.entries(oldConfig.buckets)) {\n if (!upgradedConfig.buckets[bucketType]) {\n upgradedConfig.buckets[bucketType] = {\n include: []\n };\n }\n upgradedConfig.buckets[bucketType]?.include.push(bucketPath);\n }\n }\n return upgradedConfig;\n }\n});\nvar configV1_2Definition = extendConfigDefinition(configV1_1Definition, {\n createSchema: (baseSchema) => baseSchema.extend({\n locale: localeSchema.extend({\n extraSource: localeCodeSchema.optional()\n })\n }),\n createDefaultValue: (baseDefaultValue) => ({\n ...baseDefaultValue,\n version: 1.2\n }),\n createUpgrader: (oldConfig) => ({\n ...oldConfig,\n version: 1.2\n })\n});\nvar bucketItemSchema = Z3.object({\n path: Z3.string(),\n delimiter: Z3.union([Z3.literal(\"-\"), Z3.literal(\"_\"), Z3.literal(null)]).optional()\n});\nvar configV1_3Definition = extendConfigDefinition(configV1_2Definition, {\n createSchema: (baseSchema) => baseSchema.extend({\n buckets: Z3.record(\n bucketTypeSchema,\n Z3.object({\n include: Z3.array(Z3.union([Z3.string(), bucketItemSchema])).default([]),\n exclude: Z3.array(Z3.union([Z3.string(), bucketItemSchema])).default([]).optional()\n })\n ).default({})\n }),\n createDefaultValue: (baseDefaultValue) => ({\n ...baseDefaultValue,\n version: 1.3\n }),\n createUpgrader: (oldConfig) => ({\n ...oldConfig,\n version: 1.3\n })\n});\nvar LATEST_CONFIG_DEFINITION = configV1_3Definition;\nfunction parseI18nConfig(rawConfig) {\n try {\n const result = LATEST_CONFIG_DEFINITION.parse(rawConfig);\n return result;\n } catch (error) {\n throw new Error(`Failed to parse config: ${error.message}`);\n }\n}\nvar defaultConfig = LATEST_CONFIG_DEFINITION.defaultValue;\nexport {\n bucketItemSchema,\n bucketTypeSchema,\n bucketTypes,\n configV0Definition,\n configV1Definition,\n configV1_1Definition,\n configV1_2Definition,\n configV1_3Definition,\n defaultConfig,\n getAlternativeLocaleCodes,\n getLocaleCodeDelimiter,\n localeCodeSchema,\n localeCodes,\n localeCodesFull,\n localeCodesFullExplicitRegion,\n localeCodesFullUnderscore,\n localeCodesShort,\n localeSchema,\n parseI18nConfig,\n resolveLocaleCode,\n resolveOverridenLocale\n};\n"],"mappings":"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","names":[]}
|
package/build/chunk-JZIJPDHI.cjs
DELETED
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
-
|
|
3
|
-
var _chunkU3YIG2HScjs = require('./chunk-U3YIG2HS.cjs');
|
|
4
|
-
|
|
5
|
-
// ../sdk/build/index.mjs
|
|
6
|
-
var _zod = require('zod'); var _zod2 = _interopRequireDefault(_zod);
|
|
7
|
-
var _cuid2 = require('@paralleldrive/cuid2');
|
|
8
|
-
var engineParamsSchema = _zod2.default.object({
|
|
9
|
-
apiKey: _zod2.default.string(),
|
|
10
|
-
apiUrl: _zod2.default.string().url().default("https://engine.lingo.dev"),
|
|
11
|
-
batchSize: _zod2.default.number().int().gt(0).lte(250).default(25),
|
|
12
|
-
idealBatchItemSize: _zod2.default.number().int().gt(0).lte(2500).default(250)
|
|
13
|
-
}).passthrough();
|
|
14
|
-
var payloadSchema = _zod2.default.record(_zod2.default.string(), _zod2.default.any());
|
|
15
|
-
var localizationParamsSchema = _zod2.default.object({
|
|
16
|
-
sourceLocale: _chunkU3YIG2HScjs.localeCodeSchema,
|
|
17
|
-
targetLocale: _chunkU3YIG2HScjs.localeCodeSchema,
|
|
18
|
-
fast: _zod2.default.boolean().optional()
|
|
19
|
-
});
|
|
20
|
-
var referenceSchema = _zod2.default.record(_chunkU3YIG2HScjs.localeCodeSchema, payloadSchema);
|
|
21
|
-
var ReplexicaEngine = class {
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Create a new ReplexicaEngine instance
|
|
25
|
-
* @param config - Configuration options for the Engine
|
|
26
|
-
*/
|
|
27
|
-
constructor(config) {
|
|
28
|
-
this.config = engineParamsSchema.parse(config);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Localize content using the Lingo.dev API
|
|
32
|
-
* @param payload - The content to be localized
|
|
33
|
-
* @param params - Localization parameters including source/target locales and fast mode option
|
|
34
|
-
* @param reference - Optional reference translations to maintain consistency
|
|
35
|
-
* @param progressCallback - Optional callback function to report progress (0-100)
|
|
36
|
-
* @returns Localized content
|
|
37
|
-
* @internal
|
|
38
|
-
*/
|
|
39
|
-
async _localizeRaw(payload, params, reference, progressCallback) {
|
|
40
|
-
const finalPayload = payloadSchema.parse(payload);
|
|
41
|
-
const finalParams = localizationParamsSchema.parse(params);
|
|
42
|
-
const chunkedPayload = this.extractPayloadChunks(finalPayload);
|
|
43
|
-
const processedPayloadChunks = [];
|
|
44
|
-
const workflowId = _cuid2.createId.call(void 0, );
|
|
45
|
-
for (let i = 0; i < chunkedPayload.length; i++) {
|
|
46
|
-
const chunk = chunkedPayload[i];
|
|
47
|
-
const percentageCompleted = Math.round((i + 1) / chunkedPayload.length * 100);
|
|
48
|
-
const processedPayloadChunk = await this.localizeChunk(
|
|
49
|
-
finalParams.sourceLocale,
|
|
50
|
-
finalParams.targetLocale,
|
|
51
|
-
{ data: chunk, reference },
|
|
52
|
-
workflowId,
|
|
53
|
-
params.fast || false
|
|
54
|
-
);
|
|
55
|
-
if (progressCallback) {
|
|
56
|
-
progressCallback(percentageCompleted, chunk, processedPayloadChunk);
|
|
57
|
-
}
|
|
58
|
-
processedPayloadChunks.push(processedPayloadChunk);
|
|
59
|
-
}
|
|
60
|
-
return Object.assign({}, ...processedPayloadChunks);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Localize a single chunk of content
|
|
64
|
-
* @param sourceLocale - Source locale
|
|
65
|
-
* @param targetLocale - Target locale
|
|
66
|
-
* @param payload - Payload containing the chunk to be localized
|
|
67
|
-
* @returns Localized chunk
|
|
68
|
-
*/
|
|
69
|
-
async localizeChunk(sourceLocale, targetLocale, payload, workflowId, fast) {
|
|
70
|
-
const res = await fetch(`${this.config.apiUrl}/i18n`, {
|
|
71
|
-
method: "POST",
|
|
72
|
-
headers: {
|
|
73
|
-
"Content-Type": "application/json",
|
|
74
|
-
Authorization: `Bearer ${this.config.apiKey}`
|
|
75
|
-
},
|
|
76
|
-
body: JSON.stringify(
|
|
77
|
-
{
|
|
78
|
-
params: { workflowId, fast },
|
|
79
|
-
locale: {
|
|
80
|
-
source: sourceLocale,
|
|
81
|
-
target: targetLocale
|
|
82
|
-
},
|
|
83
|
-
data: payload.data,
|
|
84
|
-
reference: payload.reference
|
|
85
|
-
},
|
|
86
|
-
null,
|
|
87
|
-
2
|
|
88
|
-
)
|
|
89
|
-
});
|
|
90
|
-
if (!res.ok) {
|
|
91
|
-
if (res.status === 400) {
|
|
92
|
-
throw new Error(`Invalid request: ${res.statusText}`);
|
|
93
|
-
} else {
|
|
94
|
-
const errorText = await res.text();
|
|
95
|
-
throw new Error(errorText);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const jsonResponse = await res.json();
|
|
99
|
-
return jsonResponse.data || {};
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Extract payload chunks based on the ideal chunk size
|
|
103
|
-
* @param payload - The payload to be chunked
|
|
104
|
-
* @returns An array of payload chunks
|
|
105
|
-
*/
|
|
106
|
-
extractPayloadChunks(payload) {
|
|
107
|
-
const result = [];
|
|
108
|
-
let currentChunk = {};
|
|
109
|
-
let currentChunkItemCount = 0;
|
|
110
|
-
const payloadEntries = Object.entries(payload);
|
|
111
|
-
for (let i = 0; i < payloadEntries.length; i++) {
|
|
112
|
-
const [key, value] = payloadEntries[i];
|
|
113
|
-
currentChunk[key] = value;
|
|
114
|
-
currentChunkItemCount++;
|
|
115
|
-
const currentChunkSize = this.countWordsInRecord(currentChunk);
|
|
116
|
-
if (currentChunkSize > this.config.idealBatchItemSize || currentChunkItemCount >= this.config.batchSize || i === payloadEntries.length - 1) {
|
|
117
|
-
result.push(currentChunk);
|
|
118
|
-
currentChunk = {};
|
|
119
|
-
currentChunkItemCount = 0;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return result;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Count words in a record or array
|
|
126
|
-
* @param payload - The payload to count words in
|
|
127
|
-
* @returns The total number of words
|
|
128
|
-
*/
|
|
129
|
-
countWordsInRecord(payload) {
|
|
130
|
-
if (Array.isArray(payload)) {
|
|
131
|
-
return payload.reduce((acc, item) => acc + this.countWordsInRecord(item), 0);
|
|
132
|
-
} else if (typeof payload === "object" && payload !== null) {
|
|
133
|
-
return Object.values(payload).reduce((acc, item) => acc + this.countWordsInRecord(item), 0);
|
|
134
|
-
} else if (typeof payload === "string") {
|
|
135
|
-
return payload.trim().split(/\s+/).filter(Boolean).length;
|
|
136
|
-
} else {
|
|
137
|
-
return 0;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Localize a typical JavaScript object
|
|
142
|
-
* @param obj - The object to be localized (strings will be extracted and translated)
|
|
143
|
-
* @param params - Localization parameters:
|
|
144
|
-
* - sourceLocale: The source language code (e.g., 'en')
|
|
145
|
-
* - targetLocale: The target language code (e.g., 'es')
|
|
146
|
-
* - fast: Optional boolean to enable fast mode (faster but potentially lower quality)
|
|
147
|
-
* @param progressCallback - Optional callback function to report progress (0-100)
|
|
148
|
-
* @returns A new object with the same structure but localized string values
|
|
149
|
-
*/
|
|
150
|
-
async localizeObject(obj, params, progressCallback) {
|
|
151
|
-
return this._localizeRaw(obj, params, void 0, progressCallback);
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Localize a single text string
|
|
155
|
-
* @param text - The text string to be localized
|
|
156
|
-
* @param params - Localization parameters:
|
|
157
|
-
* - sourceLocale: The source language code (e.g., 'en')
|
|
158
|
-
* - targetLocale: The target language code (e.g., 'es')
|
|
159
|
-
* - fast: Optional boolean to enable fast mode (faster for bigger batches)
|
|
160
|
-
* @param progressCallback - Optional callback function to report progress (0-100)
|
|
161
|
-
* @returns The localized text string
|
|
162
|
-
*/
|
|
163
|
-
async localizeText(text, params, progressCallback) {
|
|
164
|
-
const response = await this._localizeRaw({ text }, params, void 0, progressCallback);
|
|
165
|
-
return response.text || "";
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Localize a text string to multiple target locales
|
|
169
|
-
* @param text - The text string to be localized
|
|
170
|
-
* @param params - Localization parameters:
|
|
171
|
-
* - sourceLocale: The source language code (e.g., 'en')
|
|
172
|
-
* - targetLocales: An array of target language codes (e.g., ['es', 'fr'])
|
|
173
|
-
* - fast: Optional boolean to enable fast mode (for bigger batches)
|
|
174
|
-
* @returns An array of localized text strings
|
|
175
|
-
*/
|
|
176
|
-
async batchLocalizeText(text, params) {
|
|
177
|
-
const responses = await Promise.all(
|
|
178
|
-
params.targetLocales.map(
|
|
179
|
-
(targetLocale) => this.localizeText(text, {
|
|
180
|
-
sourceLocale: params.sourceLocale,
|
|
181
|
-
targetLocale,
|
|
182
|
-
fast: params.fast
|
|
183
|
-
})
|
|
184
|
-
)
|
|
185
|
-
);
|
|
186
|
-
return responses;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Localize a chat sequence while preserving speaker names
|
|
190
|
-
* @param chat - Array of chat messages, each with 'name' and 'text' properties
|
|
191
|
-
* @param params - Localization parameters:
|
|
192
|
-
* - sourceLocale: The source language code (e.g., 'en')
|
|
193
|
-
* - targetLocale: The target language code (e.g., 'es')
|
|
194
|
-
* - fast: Optional boolean to enable fast mode (faster but potentially lower quality)
|
|
195
|
-
* @param progressCallback - Optional callback function to report progress (0-100)
|
|
196
|
-
* @returns Array of localized chat messages with preserved structure
|
|
197
|
-
*/
|
|
198
|
-
async localizeChat(chat, params, progressCallback) {
|
|
199
|
-
const localized = await this._localizeRaw({ chat }, params, void 0, progressCallback);
|
|
200
|
-
return Object.entries(localized).map(([key, value]) => ({
|
|
201
|
-
name: chat[parseInt(key.split("_")[1])].name,
|
|
202
|
-
text: value
|
|
203
|
-
}));
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Localize an HTML document while preserving structure and formatting
|
|
207
|
-
* Handles both text content and localizable attributes (alt, title, placeholder, meta content)
|
|
208
|
-
* @param html - The HTML document string to be localized
|
|
209
|
-
* @param params - Localization parameters:
|
|
210
|
-
* - sourceLocale: The source language code (e.g., 'en')
|
|
211
|
-
* - targetLocale: The target language code (e.g., 'es')
|
|
212
|
-
* - fast: Optional boolean to enable fast mode (faster but potentially lower quality)
|
|
213
|
-
* @param progressCallback - Optional callback function to report progress (0-100)
|
|
214
|
-
* @returns The localized HTML document as a string, with updated lang attribute
|
|
215
|
-
*/
|
|
216
|
-
async localizeHtml(html, params, progressCallback) {
|
|
217
|
-
const jsdomPackage = await Promise.resolve().then(() => _interopRequireWildcard(require("jsdom")));
|
|
218
|
-
const { JSDOM } = jsdomPackage;
|
|
219
|
-
const dom = new JSDOM(html);
|
|
220
|
-
const document = dom.window.document;
|
|
221
|
-
const LOCALIZABLE_ATTRIBUTES = {
|
|
222
|
-
meta: ["content"],
|
|
223
|
-
img: ["alt"],
|
|
224
|
-
input: ["placeholder"],
|
|
225
|
-
a: ["title"]
|
|
226
|
-
};
|
|
227
|
-
const UNLOCALIZABLE_TAGS = ["script", "style"];
|
|
228
|
-
const extractedContent = {};
|
|
229
|
-
const getPath = (node, attribute) => {
|
|
230
|
-
const indices = [];
|
|
231
|
-
let current = node;
|
|
232
|
-
let rootParent = "";
|
|
233
|
-
while (current) {
|
|
234
|
-
const parent = current.parentElement;
|
|
235
|
-
if (!parent) break;
|
|
236
|
-
if (parent === document.documentElement) {
|
|
237
|
-
rootParent = current.nodeName.toLowerCase();
|
|
238
|
-
break;
|
|
239
|
-
}
|
|
240
|
-
const siblings = Array.from(parent.childNodes).filter(
|
|
241
|
-
(n) => n.nodeType === 1 || n.nodeType === 3 && _optionalChain([n, 'access', _ => _.textContent, 'optionalAccess', _2 => _2.trim, 'call', _3 => _3()])
|
|
242
|
-
);
|
|
243
|
-
const index = siblings.indexOf(current);
|
|
244
|
-
if (index !== -1) {
|
|
245
|
-
indices.unshift(index);
|
|
246
|
-
}
|
|
247
|
-
current = parent;
|
|
248
|
-
}
|
|
249
|
-
const basePath = rootParent ? `${rootParent}/${indices.join("/")}` : indices.join("/");
|
|
250
|
-
return attribute ? `${basePath}#${attribute}` : basePath;
|
|
251
|
-
};
|
|
252
|
-
const processNode = (node) => {
|
|
253
|
-
let parent = node.parentElement;
|
|
254
|
-
while (parent) {
|
|
255
|
-
if (UNLOCALIZABLE_TAGS.includes(parent.tagName.toLowerCase())) {
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
parent = parent.parentElement;
|
|
259
|
-
}
|
|
260
|
-
if (node.nodeType === 3) {
|
|
261
|
-
const text = _optionalChain([node, 'access', _4 => _4.textContent, 'optionalAccess', _5 => _5.trim, 'call', _6 => _6()]) || "";
|
|
262
|
-
if (text) {
|
|
263
|
-
extractedContent[getPath(node)] = text;
|
|
264
|
-
}
|
|
265
|
-
} else if (node.nodeType === 1) {
|
|
266
|
-
const element = node;
|
|
267
|
-
const tagName = element.tagName.toLowerCase();
|
|
268
|
-
const attributes = LOCALIZABLE_ATTRIBUTES[tagName] || [];
|
|
269
|
-
attributes.forEach((attr) => {
|
|
270
|
-
const value = element.getAttribute(attr);
|
|
271
|
-
if (value) {
|
|
272
|
-
extractedContent[getPath(element, attr)] = value;
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
Array.from(element.childNodes).filter((n) => n.nodeType === 1 || n.nodeType === 3 && _optionalChain([n, 'access', _7 => _7.textContent, 'optionalAccess', _8 => _8.trim, 'call', _9 => _9()])).forEach(processNode);
|
|
276
|
-
}
|
|
277
|
-
};
|
|
278
|
-
Array.from(document.head.childNodes).filter((n) => n.nodeType === 1 || n.nodeType === 3 && _optionalChain([n, 'access', _10 => _10.textContent, 'optionalAccess', _11 => _11.trim, 'call', _12 => _12()])).forEach(processNode);
|
|
279
|
-
Array.from(document.body.childNodes).filter((n) => n.nodeType === 1 || n.nodeType === 3 && _optionalChain([n, 'access', _13 => _13.textContent, 'optionalAccess', _14 => _14.trim, 'call', _15 => _15()])).forEach(processNode);
|
|
280
|
-
const localizedContent = await this._localizeRaw(extractedContent, params, void 0, progressCallback);
|
|
281
|
-
document.documentElement.setAttribute("lang", params.targetLocale);
|
|
282
|
-
Object.entries(localizedContent).forEach(([path, value]) => {
|
|
283
|
-
const [nodePath, attribute] = path.split("#");
|
|
284
|
-
const [rootTag, ...indices] = nodePath.split("/");
|
|
285
|
-
let parent = rootTag === "head" ? document.head : document.body;
|
|
286
|
-
let current = parent;
|
|
287
|
-
for (const index of indices) {
|
|
288
|
-
const siblings = Array.from(parent.childNodes).filter(
|
|
289
|
-
(n) => n.nodeType === 1 || n.nodeType === 3 && _optionalChain([n, 'access', _16 => _16.textContent, 'optionalAccess', _17 => _17.trim, 'call', _18 => _18()])
|
|
290
|
-
);
|
|
291
|
-
current = siblings[parseInt(index)] || null;
|
|
292
|
-
if (_optionalChain([current, 'optionalAccess', _19 => _19.nodeType]) === 1) {
|
|
293
|
-
parent = current;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
if (current) {
|
|
297
|
-
if (attribute) {
|
|
298
|
-
current.setAttribute(attribute, value);
|
|
299
|
-
} else {
|
|
300
|
-
current.textContent = value;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
return dom.serialize();
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Detect the language of a given text
|
|
308
|
-
* @param text - The text to analyze
|
|
309
|
-
* @returns Promise resolving to a locale code (e.g., 'en', 'es', 'fr')
|
|
310
|
-
*/
|
|
311
|
-
async recognizeLocale(text) {
|
|
312
|
-
const response = await fetch(`${this.config.apiUrl}/recognize`, {
|
|
313
|
-
method: "POST",
|
|
314
|
-
headers: {
|
|
315
|
-
"Content-Type": "application/json",
|
|
316
|
-
Authorization: `Bearer ${this.config.apiKey}`
|
|
317
|
-
},
|
|
318
|
-
body: JSON.stringify({ text })
|
|
319
|
-
});
|
|
320
|
-
if (!response.ok) {
|
|
321
|
-
throw new Error(`Error recognizing locale: ${response.statusText}`);
|
|
322
|
-
}
|
|
323
|
-
const jsonResponse = await response.json();
|
|
324
|
-
return jsonResponse.locale;
|
|
325
|
-
}
|
|
326
|
-
};
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
exports.ReplexicaEngine = ReplexicaEngine;
|
|
331
|
-
//# sourceMappingURL=chunk-JZIJPDHI.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/lingo.dev/lingo.dev/packages/cli/build/chunk-JZIJPDHI.cjs","../../sdk/build/index.mjs"],"names":[],"mappings":"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ACD,MAAA;AACC,QAAA;AACF,QAAA;AACE,QAAA;AACA,UAAA;AACb,UAAA;AACF,QAAA;AACiB,QAAA;AACN,UAAA;AACX,QAAA;AACc,QAAA;AACI,QAAA;AACA,UAAA;AAClB,QAAA;AACU,QAAA;AACZ,MAAA;AACiB,MAAA;AACK,MAAA;AACxB,IAAA;AACqB,IAAA;AACD,MAAA;AACH,MAAA;AACT,QAAA;AACF,UAAA;AACF,QAAA;AACgB,QAAA;AAClB,MAAA;AACsB,MAAA;AACF,QAAA;AACR,QAAA;AACS,UAAA;AACnB,QAAA;AACc,MAAA;AACE,QAAA;AACA,QAAA;AACG,QAAA;AACC,QAAA;AACJ,UAAA;AACH,UAAA;AACQ,YAAA;AACnB,UAAA;AACD,QAAA;AACkB,QAAA;AACrB,MAAA;AACF,IAAA;AACyB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACV,IAAA;AACI,MAAA;AACE,MAAA;AACN,MAAA;AACC,MAAA;AACM,MAAA;AACD,QAAA;AACN,UAAA;AACX,QAAA;AACmB,QAAA;AACN,QAAA;AACF,UAAA;AACX,QAAA;AACF,MAAA;AACa,MAAA;AACI,QAAA;AACL,UAAA;AACH,QAAA;AACG,UAAA;AACV,QAAA;AACF,MAAA;AACD,IAAA;AACoB,IAAA;AACvB,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMsB,EAAA;AACG,IAAA;AACb,MAAA;AACC,MAAA;AACS,QAAA;AACD,QAAA;AACjB,MAAA;AACuB,MAAA;AACxB,IAAA;AACiB,IAAA;AACA,MAAA;AAClB,IAAA;AACqB,IAAA;AACD,IAAA;AACtB,EAAA;AACF;ADI6B;AACA;AACA;AACA","file":"/home/runner/work/lingo.dev/lingo.dev/packages/cli/build/chunk-JZIJPDHI.cjs","sourcesContent":[null,"// src/index.ts\nimport Z from \"zod\";\nimport { localeCodeSchema } from \"@lingo.dev/_spec\";\nimport { createId } from \"@paralleldrive/cuid2\";\nvar engineParamsSchema = Z.object({\n apiKey: Z.string(),\n apiUrl: Z.string().url().default(\"https://engine.lingo.dev\"),\n batchSize: Z.number().int().gt(0).lte(250).default(25),\n idealBatchItemSize: Z.number().int().gt(0).lte(2500).default(250)\n}).passthrough();\nvar payloadSchema = Z.record(Z.string(), Z.any());\nvar localizationParamsSchema = Z.object({\n sourceLocale: localeCodeSchema,\n targetLocale: localeCodeSchema,\n fast: Z.boolean().optional()\n});\nvar referenceSchema = Z.record(localeCodeSchema, payloadSchema);\nvar ReplexicaEngine = class {\n config;\n /**\n * Create a new ReplexicaEngine instance\n * @param config - Configuration options for the Engine\n */\n constructor(config) {\n this.config = engineParamsSchema.parse(config);\n }\n /**\n * Localize content using the Lingo.dev API\n * @param payload - The content to be localized\n * @param params - Localization parameters including source/target locales and fast mode option\n * @param reference - Optional reference translations to maintain consistency\n * @param progressCallback - Optional callback function to report progress (0-100)\n * @returns Localized content\n * @internal\n */\n async _localizeRaw(payload, params, reference, progressCallback) {\n const finalPayload = payloadSchema.parse(payload);\n const finalParams = localizationParamsSchema.parse(params);\n const chunkedPayload = this.extractPayloadChunks(finalPayload);\n const processedPayloadChunks = [];\n const workflowId = createId();\n for (let i = 0; i < chunkedPayload.length; i++) {\n const chunk = chunkedPayload[i];\n const percentageCompleted = Math.round((i + 1) / chunkedPayload.length * 100);\n const processedPayloadChunk = await this.localizeChunk(\n finalParams.sourceLocale,\n finalParams.targetLocale,\n { data: chunk, reference },\n workflowId,\n params.fast || false\n );\n if (progressCallback) {\n progressCallback(percentageCompleted, chunk, processedPayloadChunk);\n }\n processedPayloadChunks.push(processedPayloadChunk);\n }\n return Object.assign({}, ...processedPayloadChunks);\n }\n /**\n * Localize a single chunk of content\n * @param sourceLocale - Source locale\n * @param targetLocale - Target locale\n * @param payload - Payload containing the chunk to be localized\n * @returns Localized chunk\n */\n async localizeChunk(sourceLocale, targetLocale, payload, workflowId, fast) {\n const res = await fetch(`${this.config.apiUrl}/i18n`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify(\n {\n params: { workflowId, fast },\n locale: {\n source: sourceLocale,\n target: targetLocale\n },\n data: payload.data,\n reference: payload.reference\n },\n null,\n 2\n )\n });\n if (!res.ok) {\n if (res.status === 400) {\n throw new Error(`Invalid request: ${res.statusText}`);\n } else {\n const errorText = await res.text();\n throw new Error(errorText);\n }\n }\n const jsonResponse = await res.json();\n return jsonResponse.data || {};\n }\n /**\n * Extract payload chunks based on the ideal chunk size\n * @param payload - The payload to be chunked\n * @returns An array of payload chunks\n */\n extractPayloadChunks(payload) {\n const result = [];\n let currentChunk = {};\n let currentChunkItemCount = 0;\n const payloadEntries = Object.entries(payload);\n for (let i = 0; i < payloadEntries.length; i++) {\n const [key, value] = payloadEntries[i];\n currentChunk[key] = value;\n currentChunkItemCount++;\n const currentChunkSize = this.countWordsInRecord(currentChunk);\n if (currentChunkSize > this.config.idealBatchItemSize || currentChunkItemCount >= this.config.batchSize || i === payloadEntries.length - 1) {\n result.push(currentChunk);\n currentChunk = {};\n currentChunkItemCount = 0;\n }\n }\n return result;\n }\n /**\n * Count words in a record or array\n * @param payload - The payload to count words in\n * @returns The total number of words\n */\n countWordsInRecord(payload) {\n if (Array.isArray(payload)) {\n return payload.reduce((acc, item) => acc + this.countWordsInRecord(item), 0);\n } else if (typeof payload === \"object\" && payload !== null) {\n return Object.values(payload).reduce((acc, item) => acc + this.countWordsInRecord(item), 0);\n } else if (typeof payload === \"string\") {\n return payload.trim().split(/\\s+/).filter(Boolean).length;\n } else {\n return 0;\n }\n }\n /**\n * Localize a typical JavaScript object\n * @param obj - The object to be localized (strings will be extracted and translated)\n * @param params - Localization parameters:\n * - sourceLocale: The source language code (e.g., 'en')\n * - targetLocale: The target language code (e.g., 'es')\n * - fast: Optional boolean to enable fast mode (faster but potentially lower quality)\n * @param progressCallback - Optional callback function to report progress (0-100)\n * @returns A new object with the same structure but localized string values\n */\n async localizeObject(obj, params, progressCallback) {\n return this._localizeRaw(obj, params, void 0, progressCallback);\n }\n /**\n * Localize a single text string\n * @param text - The text string to be localized\n * @param params - Localization parameters:\n * - sourceLocale: The source language code (e.g., 'en')\n * - targetLocale: The target language code (e.g., 'es')\n * - fast: Optional boolean to enable fast mode (faster for bigger batches)\n * @param progressCallback - Optional callback function to report progress (0-100)\n * @returns The localized text string\n */\n async localizeText(text, params, progressCallback) {\n const response = await this._localizeRaw({ text }, params, void 0, progressCallback);\n return response.text || \"\";\n }\n /**\n * Localize a text string to multiple target locales\n * @param text - The text string to be localized\n * @param params - Localization parameters:\n * - sourceLocale: The source language code (e.g., 'en')\n * - targetLocales: An array of target language codes (e.g., ['es', 'fr'])\n * - fast: Optional boolean to enable fast mode (for bigger batches)\n * @returns An array of localized text strings\n */\n async batchLocalizeText(text, params) {\n const responses = await Promise.all(\n params.targetLocales.map(\n (targetLocale) => this.localizeText(text, {\n sourceLocale: params.sourceLocale,\n targetLocale,\n fast: params.fast\n })\n )\n );\n return responses;\n }\n /**\n * Localize a chat sequence while preserving speaker names\n * @param chat - Array of chat messages, each with 'name' and 'text' properties\n * @param params - Localization parameters:\n * - sourceLocale: The source language code (e.g., 'en')\n * - targetLocale: The target language code (e.g., 'es')\n * - fast: Optional boolean to enable fast mode (faster but potentially lower quality)\n * @param progressCallback - Optional callback function to report progress (0-100)\n * @returns Array of localized chat messages with preserved structure\n */\n async localizeChat(chat, params, progressCallback) {\n const localized = await this._localizeRaw({ chat }, params, void 0, progressCallback);\n return Object.entries(localized).map(([key, value]) => ({\n name: chat[parseInt(key.split(\"_\")[1])].name,\n text: value\n }));\n }\n /**\n * Localize an HTML document while preserving structure and formatting\n * Handles both text content and localizable attributes (alt, title, placeholder, meta content)\n * @param html - The HTML document string to be localized\n * @param params - Localization parameters:\n * - sourceLocale: The source language code (e.g., 'en')\n * - targetLocale: The target language code (e.g., 'es')\n * - fast: Optional boolean to enable fast mode (faster but potentially lower quality)\n * @param progressCallback - Optional callback function to report progress (0-100)\n * @returns The localized HTML document as a string, with updated lang attribute\n */\n async localizeHtml(html, params, progressCallback) {\n const jsdomPackage = await import(\"jsdom\");\n const { JSDOM } = jsdomPackage;\n const dom = new JSDOM(html);\n const document = dom.window.document;\n const LOCALIZABLE_ATTRIBUTES = {\n meta: [\"content\"],\n img: [\"alt\"],\n input: [\"placeholder\"],\n a: [\"title\"]\n };\n const UNLOCALIZABLE_TAGS = [\"script\", \"style\"];\n const extractedContent = {};\n const getPath = (node, attribute) => {\n const indices = [];\n let current = node;\n let rootParent = \"\";\n while (current) {\n const parent = current.parentElement;\n if (!parent) break;\n if (parent === document.documentElement) {\n rootParent = current.nodeName.toLowerCase();\n break;\n }\n const siblings = Array.from(parent.childNodes).filter(\n (n) => n.nodeType === 1 || n.nodeType === 3 && n.textContent?.trim()\n );\n const index = siblings.indexOf(current);\n if (index !== -1) {\n indices.unshift(index);\n }\n current = parent;\n }\n const basePath = rootParent ? `${rootParent}/${indices.join(\"/\")}` : indices.join(\"/\");\n return attribute ? `${basePath}#${attribute}` : basePath;\n };\n const processNode = (node) => {\n let parent = node.parentElement;\n while (parent) {\n if (UNLOCALIZABLE_TAGS.includes(parent.tagName.toLowerCase())) {\n return;\n }\n parent = parent.parentElement;\n }\n if (node.nodeType === 3) {\n const text = node.textContent?.trim() || \"\";\n if (text) {\n extractedContent[getPath(node)] = text;\n }\n } else if (node.nodeType === 1) {\n const element = node;\n const tagName = element.tagName.toLowerCase();\n const attributes = LOCALIZABLE_ATTRIBUTES[tagName] || [];\n attributes.forEach((attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n extractedContent[getPath(element, attr)] = value;\n }\n });\n Array.from(element.childNodes).filter((n) => n.nodeType === 1 || n.nodeType === 3 && n.textContent?.trim()).forEach(processNode);\n }\n };\n Array.from(document.head.childNodes).filter((n) => n.nodeType === 1 || n.nodeType === 3 && n.textContent?.trim()).forEach(processNode);\n Array.from(document.body.childNodes).filter((n) => n.nodeType === 1 || n.nodeType === 3 && n.textContent?.trim()).forEach(processNode);\n const localizedContent = await this._localizeRaw(extractedContent, params, void 0, progressCallback);\n document.documentElement.setAttribute(\"lang\", params.targetLocale);\n Object.entries(localizedContent).forEach(([path, value]) => {\n const [nodePath, attribute] = path.split(\"#\");\n const [rootTag, ...indices] = nodePath.split(\"/\");\n let parent = rootTag === \"head\" ? document.head : document.body;\n let current = parent;\n for (const index of indices) {\n const siblings = Array.from(parent.childNodes).filter(\n (n) => n.nodeType === 1 || n.nodeType === 3 && n.textContent?.trim()\n );\n current = siblings[parseInt(index)] || null;\n if (current?.nodeType === 1) {\n parent = current;\n }\n }\n if (current) {\n if (attribute) {\n current.setAttribute(attribute, value);\n } else {\n current.textContent = value;\n }\n }\n });\n return dom.serialize();\n }\n /**\n * Detect the language of a given text\n * @param text - The text to analyze\n * @returns Promise resolving to a locale code (e.g., 'en', 'es', 'fr')\n */\n async recognizeLocale(text) {\n const response = await fetch(`${this.config.apiUrl}/recognize`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({ text })\n });\n if (!response.ok) {\n throw new Error(`Error recognizing locale: ${response.statusText}`);\n }\n const jsonResponse = await response.json();\n return jsonResponse.locale;\n }\n};\nexport {\n ReplexicaEngine\n};\n"]}
|