@hkonda/loco-translate 1.0.7 → 1.0.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../server/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAsB9B,wBAAsB,QAAQ,CAAC,OAAO,EAAE,GAAG,oUA6K1C"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../server/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAuB9B,wBAAsB,QAAQ,CAAC,OAAO,EAAE,GAAG,oUA6K1C"}
@@ -6,6 +6,7 @@ import fastifySwaggerUi from '@fastify/swagger-ui';
6
6
  import { join } from 'path';
7
7
  import { existsSync, readFileSync } from 'fs';
8
8
  import { PROJECT_ROOT, BASE_PATH } from './config.js';
9
+ import { APP_VERSION } from './utils/version.js';
9
10
  // Route plugins
10
11
  import projectRoutes from './routes/project.js';
11
12
  import textnodesRoutes from './routes/textnodes.js';
@@ -41,7 +42,7 @@ export async function buildApp(project) {
41
42
  info: {
42
43
  title: 'Loco Translation API',
43
44
  description: 'API for the Loco translation management system',
44
- version: '1.0.0',
45
+ version: APP_VERSION,
45
46
  },
46
47
  components: {
47
48
  securitySchemes: {
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../server/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../server/app.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chrome-extension.d.ts","sourceRoot":"","sources":["../../server/routes/chrome-extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAY1C,wBAA8B,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,GAAG,CAAA;CAAE,iBAkP/F"}
1
+ {"version":3,"file":"chrome-extension.d.ts","sourceRoot":"","sources":["../../server/routes/chrome-extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAc1C,wBAA8B,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,GAAG,CAAA;CAAE,iBAiX/F"}
@@ -1,4 +1,6 @@
1
1
  import { rawDb } from '../db/index.js';
2
+ import { jobManager } from '../services/job-manager.js';
3
+ import { processTranslations } from '../services/ai-translation.js';
2
4
  function cleanUrl(raw) {
3
5
  try {
4
6
  const u = new URL(raw);
@@ -231,5 +233,105 @@ export default async function chromeExtensionRoutes(app, opts) {
231
233
  .map(r => ({ key: r.key, var_slots: r.var_slots || null }));
232
234
  return filtered;
233
235
  });
236
+ // ── POST /api/ext/quick-translate
237
+ // One-click translate: registers phrases, auto-approves, starts AI job.
238
+ // Returns jobId so client can poll progress.
239
+ app.post('/api/ext/quick-translate', {
240
+ schema: {
241
+ tags: ['Chrome Extension'],
242
+ summary: 'Register phrases, auto-approve, and start AI translation job',
243
+ body: {
244
+ type: 'object',
245
+ required: ['phrases', 'lang'],
246
+ properties: {
247
+ phrases: {
248
+ type: 'array',
249
+ items: {
250
+ type: 'object',
251
+ required: ['key'],
252
+ properties: {
253
+ key: { type: 'string' },
254
+ context: { type: 'string' },
255
+ },
256
+ },
257
+ },
258
+ lang: { type: 'string' },
259
+ url: { type: 'string' },
260
+ },
261
+ },
262
+ response: {
263
+ 200: {
264
+ type: 'object',
265
+ properties: {
266
+ jobId: { type: 'string', nullable: true },
267
+ total: { type: 'number' },
268
+ alreadyTranslated: { type: 'number' },
269
+ error: { type: 'string' },
270
+ },
271
+ },
272
+ },
273
+ },
274
+ }, async (req) => {
275
+ const { project } = opts;
276
+ const { phrases, lang, url } = req.body;
277
+ if (!Array.isArray(phrases) || phrases.length === 0)
278
+ return { error: 'No phrases provided' };
279
+ if (!lang)
280
+ return { error: 'lang is required' };
281
+ const normalizedUrl = url ? cleanUrl(url) : '';
282
+ // 1. Register all phrases (upsert)
283
+ const upsert = rawDb.prepare(`
284
+ INSERT INTO textnodes (project_id, key, context, url, status, var_slots)
285
+ VALUES (?, ?, ?, ?, 'pending', '[]')
286
+ ON CONFLICT (project_id, key, context) DO UPDATE SET
287
+ url = CASE WHEN textnodes.url = '' THEN excluded.url ELSE textnodes.url END
288
+ `);
289
+ const upsertAll = rawDb.transaction(() => {
290
+ for (const p of phrases) {
291
+ const key = (p.key || '').trim();
292
+ if (!key)
293
+ continue;
294
+ const context = (p.context || '').trim();
295
+ upsert.run(project.id, key, context, normalizedUrl);
296
+ }
297
+ });
298
+ upsertAll();
299
+ // 2. Get all textnode IDs for these phrases
300
+ const keys = [...new Set(phrases.map(p => (p.key || '').trim()).filter(Boolean))];
301
+ if (keys.length === 0)
302
+ return { error: 'No valid phrases' };
303
+ const placeholders = keys.map(() => '?').join(',');
304
+ const textnodes = rawDb.prepare(`SELECT id, key, context, url FROM textnodes WHERE project_id = ? AND key IN (${placeholders})`).all(project.id, ...keys);
305
+ if (textnodes.length === 0)
306
+ return { error: 'No textnodes found' };
307
+ // 3. Auto-approve all (set status to 'approved')
308
+ const ids = textnodes.map(t => t.id);
309
+ const approveplaceholders = ids.map(() => '?').join(',');
310
+ rawDb.prepare(`UPDATE textnodes SET status = 'approved' WHERE id IN (${approveplaceholders}) AND project_id = ?`).run(...ids, project.id);
311
+ // 4. Find which ones still need translation
312
+ const alreadyTranslated = rawDb.prepare(`SELECT DISTINCT t.key, t.context FROM translations t
313
+ WHERE t.project_id = ? AND t.lang = ? AND t.key IN (${placeholders})`).all(project.id, lang, ...keys);
314
+ const translatedSet = new Set(alreadyTranslated.map(t => t.key + '\x00' + (t.context || '')));
315
+ const needsTranslation = textnodes.filter(t => !translatedSet.has(t.key + '\x00' + (t.context || '')));
316
+ if (needsTranslation.length === 0) {
317
+ return { jobId: null, total: 0, alreadyTranslated: textnodes.length };
318
+ }
319
+ // 5. Get default prompt template
320
+ const promptTemplate = rawDb.prepare('SELECT * FROM prompt_templates WHERE project_id = ? ORDER BY created_at ASC LIMIT 1').get(project.id);
321
+ if (!promptTemplate) {
322
+ return { error: 'No prompt template configured. Create one in Dashboard > Settings.' };
323
+ }
324
+ // 6. Create and start the AI job
325
+ const job = jobManager.createJob({
326
+ langCode: lang,
327
+ promptId: promptTemplate.id,
328
+ promptName: promptTemplate.name,
329
+ total: needsTranslation.length,
330
+ });
331
+ rawDb.prepare('INSERT INTO ai_job_log (project_id, job_id, prompt_id, prompt_name, lang, total, status) VALUES (?, ?, ?, ?, ?, ?, ?)').run(project.id, job.id, promptTemplate.id, promptTemplate.name, lang, needsTranslation.length, 'pending');
332
+ // Process in background
333
+ processTranslations(job.id, needsTranslation, lang, promptTemplate, project.id, false, project.settings || '{}');
334
+ return { jobId: job.id, total: needsTranslation.length, alreadyTranslated: alreadyTranslated.length };
335
+ });
234
336
  }
235
337
  //# sourceMappingURL=chrome-extension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chrome-extension.js","sourceRoot":"","sources":["../../server/routes/chrome-extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chrome-extension.js","sourceRoot":"","sources":["../../server/routes/chrome-extension.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAoB,EAAE,IAAsB;IAE9F,0BAA0B;IAC1B,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE;QAC1B,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,kBAAkB,CAAC;YAC1B,OAAO,EAAE,4CAA4C;YACrD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACvB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;oBAClE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;iBACpD;gBACD,QAAQ,EAAE,CAAC,KAAK,CAAC;aAClB;YACD,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;iBACtD;aACF;SACF;KACF,EAAE,CAAC,GAAQ,EAAE,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAC5D,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;QAE1D,MAAM,UAAU,GAAG,IAAI,IAAI,SAAS,CAAC;QACrC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5F,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,GAAG,GAAG;;;;;;8CAMgC,CAAC;QAC3C,MAAM,MAAM,GAAU,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAE7D,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,GAAG,IAAI,4CAA4C,CAAC;QACtD,CAAC;aAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC/B,GAAG,IAAI,wCAAwC,CAAC;QAClD,CAAC;QAED,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1D,GAAG,IAAI,uDAAuD,CAAC;YAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,GAAG,IAAI,6BAA6B,CAAC;QAErC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAU,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,CAAC;QACrF,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,iCAAiC;IACjC,GAAG,CAAC,GAAG,CAAC,yBAAyB,EAAE;QACjC,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,kBAAkB,CAAC;YAC1B,OAAO,EAAE,6CAA6C;YACtD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACvC,QAAQ,EAAE,CAAC,KAAK,CAAC;aAClB;YACD,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC5B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC1B;iBACF;aACF;SACF;KACF,EAAE,CAAC,GAAQ,EAAE,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAC3B,wDAAwD,CACzD,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAsC,CAAC;QACvD,MAAM,MAAM,GAA2B,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,aAAa,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClF,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,kCAAkC;IAClC,iDAAiD;IACjD,sFAAsF;IACtF,4EAA4E;IAC5E,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE;QAClC,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,kBAAkB,CAAC;YAC1B,OAAO,EAAE,uEAAuE;YAChF,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,SAAS,CAAC;gBACrB,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,CAAC,KAAK,CAAC;4BACjB,UAAU,EAAE;gCACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACvB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BAC5B;yBACF;qBACF;oBACD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACxB;aACF;YACD,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE;wBAC9E,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC/B;iBACF;aACF;SACF;KACF,EAAE,CAAC,GAAQ,EAAE,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAIlC,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QAExF,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/C,wEAAwE;QACxE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;YACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,CAAC,GAAG;oBAAE,SAAS;gBACnB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,CAAQ,CAAC;gBAC1E,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC;oBAAE,UAAU,EAAE,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,SAAS,EAAE,CAAC;QAEZ,8EAA8E;QAC9E,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;QAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,IAAW,CAAC;QAChB,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;;;;;;;;;+CASoB,YAAY;;OAEpD,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAU,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,8DAA8D;YAC9D,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;;;;+CAIoB,YAAY;;OAEpD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAU,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAC/B,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE;QAC/B,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,kBAAkB,CAAC;YAC1B,OAAO,EAAE,2DAA2D;YACpE,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACvC,QAAQ,EAAE,CAAC,KAAK,CAAC;aAClB;YACD,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACvB,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;yBACxC;qBACF;iBACF;aACF;SACF;KACF,EAAE,CAAC,GAAQ,EAAE,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;QAE1D,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAC9B,sFAAsF,CACvF,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAsD,CAAC;QAEvE,MAAM,QAAQ,GAAG,UAAU;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC;aACvD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,wEAAwE;IACxE,6CAA6C;IAC7C,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE;QACnC,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,kBAAkB,CAAC;YAC1B,OAAO,EAAE,8DAA8D;YACvE,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;gBAC7B,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,CAAC,KAAK,CAAC;4BACjB,UAAU,EAAE;gCACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACvB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BAC5B;yBACF;qBACF;oBACD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACxB;aACF;YACD,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACzC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,iBAAiB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC1B;iBACF;aACF;SACF;KACF,EAAE,KAAK,EAAE,GAAQ,EAAE,EAAE;QACpB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAIlC,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;QAC7F,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAEhD,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/C,mCAAmC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;YACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,CAAC,GAAG;oBAAE,SAAS;gBACnB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,SAAS,EAAE,CAAC;QAEZ,4CAA4C;QAC5C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAE5D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAC7B,gFAAgF,YAAY,GAAG,CAChG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAgE,CAAC;QAE1F,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QAEnE,iDAAiD;QACjD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,mBAAmB,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,KAAK,CAAC,OAAO,CACX,yDAAyD,mBAAmB,sBAAsB,CACnG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAE1B,4CAA4C;QAC5C,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CACrC;6DACuD,YAAY,GAAG,CACvE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAuC,CAAC;QAEvE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvG,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,iBAAiB,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QACxE,CAAC;QAED,iCAAiC;QACjC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAClC,qFAAqF,CACtF,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAQ,CAAC;QAEzB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,oEAAoE,EAAE,CAAC;QACzF,CAAC;QAED,iCAAiC;QACjC,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC;YAC/B,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,cAAc,CAAC,EAAE;YAC3B,UAAU,EAAE,cAAc,CAAC,IAAI;YAC/B,KAAK,EAAE,gBAAgB,CAAC,MAAM;SAC/B,CAAC,CAAC;QAEH,KAAK,CAAC,OAAO,CACX,uHAAuH,CACxH,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE5G,wBAAwB;QACxB,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAEjH,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC;IACxG,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../../server/routes/languages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,wBAA8B,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,GAAG,CAAA;CAAE,iBA8BzF"}
1
+ {"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../../server/routes/languages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,wBAA8B,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,GAAG,CAAA;CAAE,iBAgDzF"}
@@ -30,7 +30,24 @@ export default async function languagesRoutes(app, opts) {
30
30
  const nameMap = {};
31
31
  settingsLangs.forEach((l) => { if (l.code && l.name)
32
32
  nameMap[l.code] = l.name; });
33
- return rows.map(r => ({ code: r.lang, name: nameMap[r.lang] || r.lang }));
33
+ // Include both languages with translations AND languages from project settings
34
+ const seen = new Set();
35
+ const result = [];
36
+ // Settings languages first (configured)
37
+ settingsLangs.forEach((l) => {
38
+ if (l.code && !seen.has(l.code)) {
39
+ seen.add(l.code);
40
+ result.push({ code: l.code, name: l.name || l.code });
41
+ }
42
+ });
43
+ // Then any from translations not already in settings
44
+ rows.forEach(r => {
45
+ if (!seen.has(r.lang)) {
46
+ seen.add(r.lang);
47
+ result.push({ code: r.lang, name: nameMap[r.lang] || r.lang });
48
+ }
49
+ });
50
+ return result;
34
51
  });
35
52
  }
36
53
  //# sourceMappingURL=languages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"languages.js","sourceRoot":"","sources":["../../server/routes/languages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,eAAe,CAAC,GAAoB,EAAE,IAAsB;IAExF,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE;QACxB,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,WAAW,CAAC;YACnB,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBACzB;qBACF;iBACF;aACF;SACF;KACF,EAAE,GAAG,EAAE;QACN,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK;aACf,OAAO,CAAC,2EAA2E,CAAC;aACpF,GAAG,CAAC,OAAO,CAAC,EAAE,CAAuB,CAAC;QACzC,IAAI,aAAa,GAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACtF,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,aAAa,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"languages.js","sourceRoot":"","sources":["../../server/routes/languages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,eAAe,CAAC,GAAoB,EAAE,IAAsB;IAExF,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE;QACxB,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,WAAW,CAAC;YACnB,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBACzB;qBACF;iBACF;aACF;SACF;KACF,EAAE,GAAG,EAAE;QACN,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK;aACf,OAAO,CAAC,2EAA2E,CAAC;aACpF,GAAG,CAAC,OAAO,CAAC,EAAE,CAAuB,CAAC;QACzC,IAAI,aAAa,GAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACtF,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,aAAa,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvF,+EAA+E;QAC/E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAqC,EAAE,CAAC;QACpD,wCAAwC;QACxC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;YAC/B,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,qDAAqD;QACrD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../server/routes/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM1C,wBAA8B,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,GAAG,CAAA;CAAE,iBAmJvF"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../server/routes/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO1C,wBAA8B,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,GAAG,CAAA;CAAE,iBAmJvF"}
@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto';
2
2
  import { rawDb } from '../db/index.js';
3
3
  import { reloadProject } from '../db/seed.js';
4
4
  import { LIMITS } from '../config.js';
5
+ import { APP_VERSION } from '../utils/version.js';
5
6
  export default async function projectRoutes(app, opts) {
6
7
  let { project } = opts;
7
8
  // ── Health check
@@ -21,7 +22,7 @@ export default async function projectRoutes(app, opts) {
21
22
  },
22
23
  },
23
24
  }, () => {
24
- return { name: 'loco', status: 'running', version: '1.0.0' };
25
+ return { name: 'loco', status: 'running', version: APP_VERSION };
25
26
  });
26
27
  // ── Project info
27
28
  app.get('/api/project', {
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../server/routes/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../server/routes/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const APP_VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../server/utils/version.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,WAAW,QAAgB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { PROJECT_ROOT } from '../config.js';
4
+ // Falls back to 'unknown' rather than a stale hardcoded number so it is
5
+ // immediately obvious if versions.json is absent from an installed package.
6
+ const DEFAULT_APP_VERSION = 'unknown';
7
+ function loadVersion() {
8
+ const versionsPath = join(PROJECT_ROOT, 'versions.json');
9
+ if (!existsSync(versionsPath))
10
+ return DEFAULT_APP_VERSION;
11
+ try {
12
+ const parsed = JSON.parse(readFileSync(versionsPath, 'utf8'));
13
+ return typeof parsed.version === 'string' && parsed.version.trim()
14
+ ? parsed.version.trim()
15
+ : DEFAULT_APP_VERSION;
16
+ }
17
+ catch {
18
+ return DEFAULT_APP_VERSION;
19
+ }
20
+ }
21
+ export const APP_VERSION = loadVersion();
22
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../server/utils/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,wEAAwE;AACxE,4EAA4E;AAC5E,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAEtC,SAAS,WAAW;IAClB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,mBAAmB,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAA0B,CAAC;QACvF,OAAO,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;YAChE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;YACvB,CAAC,CAAC,mBAAmB,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hkonda/loco-translate",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Self-hosted translation manager — auto-discovers text, AI translations, Svelte dashboard, CDN client.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,7 +15,8 @@
15
15
  "docs/",
16
16
  "assets/",
17
17
  "public/",
18
- "README.md"
18
+ "README.md",
19
+ "versions.json"
19
20
  ],
20
21
  "keywords": [
21
22
  "translation",
package/public/loco.js CHANGED
@@ -141,7 +141,7 @@ var Loco = function() {
141
141
  var _a;
142
142
  if (!el || el.nodeType !== 1) return false;
143
143
  const tag = (_a = el.tagName) == null ? void 0 : _a.toUpperCase();
144
- return BLOCKED_TAGS.has(tag) || el.hasAttribute("notranslate") || el.hasAttribute("data-notranslate") || el.getAttribute("translate") === "no" || el.isContentEditable;
144
+ return BLOCKED_TAGS.has(tag) || el.hasAttribute("notranslate") || el.hasAttribute("data-notranslate") || el.hasAttribute("data-loco-translated") || el.getAttribute("translate") === "no" || el.isContentEditable;
145
145
  }
146
146
  function isAncestorBlocked(node) {
147
147
  let el = node.parentElement;
@@ -1021,6 +1021,7 @@ var Loco = function() {
1021
1021
  if (p.type === "input-value" && p.element) {
1022
1022
  try {
1023
1023
  p.element.value = translation;
1024
+ p.element.setAttribute("data-loco-translated", "");
1024
1025
  applied++;
1025
1026
  return;
1026
1027
  } catch (e) {
@@ -1032,6 +1033,7 @@ var Loco = function() {
1032
1033
  if (p.type === "input-attr" && p.element && p.attr) {
1033
1034
  try {
1034
1035
  p.element.setAttribute(p.attr, translation);
1036
+ p.element.setAttribute("data-loco-translated", "");
1035
1037
  applied++;
1036
1038
  return;
1037
1039
  } catch (e) {
@@ -1056,6 +1058,7 @@ var Loco = function() {
1056
1058
  }
1057
1059
  translated = translated.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g, "");
1058
1060
  p.textNode.nodeValue = translated;
1061
+ if (p.textNode.parentElement) p.textNode.parentElement.setAttribute("data-loco-translated", "");
1059
1062
  applied++;
1060
1063
  return;
1061
1064
  } catch (e) {
@@ -1101,6 +1104,7 @@ var Loco = function() {
1101
1104
  return escapeHTML(part);
1102
1105
  }).join("");
1103
1106
  p.element.innerHTML = html;
1107
+ p.element.setAttribute("data-loco-translated", "");
1104
1108
  applied++;
1105
1109
  } catch (e) {
1106
1110
  console.warn("[translate] Could not apply mixed translation", e);
@@ -1135,12 +1139,15 @@ var Loco = function() {
1135
1139
  try {
1136
1140
  if (p.type === "input-value" && p.element) {
1137
1141
  p.element.value = p.original;
1142
+ p.element.removeAttribute("data-loco-translated");
1138
1143
  restored++;
1139
1144
  } else if (p.type === "input-attr" && p.element && p.attr) {
1140
1145
  p.element.setAttribute(p.attr, p.original);
1146
+ p.element.removeAttribute("data-loco-translated");
1141
1147
  restored++;
1142
1148
  } else if (p.type === "text" && p.textNode) {
1143
1149
  p.textNode.nodeValue = p.original;
1150
+ if (p.textNode.parentElement) p.textNode.parentElement.removeAttribute("data-loco-translated");
1144
1151
  restored++;
1145
1152
  }
1146
1153
  } catch (e) {
@@ -1152,6 +1159,7 @@ var Loco = function() {
1152
1159
  try {
1153
1160
  if (p.element && p.originalHTML !== void 0) {
1154
1161
  p.element.innerHTML = p.originalHTML;
1162
+ p.element.removeAttribute("data-loco-translated");
1155
1163
  restored++;
1156
1164
  }
1157
1165
  } catch (e) {
@@ -1953,6 +1961,9 @@ var Loco = function() {
1953
1961
  });
1954
1962
  }
1955
1963
  var Loco2 = {
1964
+ // Version is injected by Vite at build time from versions.json.
1965
+ // In-browser: Loco.version → e.g. "1.0.8"
1966
+ version: "1.0.9",
1956
1967
  init: function(config) {
1957
1968
  if (!config) {
1958
1969
  console.warn("[loco] Loco.init() requires a config object");
@@ -1,4 +1,4 @@
1
- var Loco=function(){"use strict";var i={apiKey:null,apiBase:null,phrases:[],translations:{},observer:null,fileMode:!1,fileData:null,fileReadyResolve:null,fileReady:null,fileUrl:null,fileUrls:[],scanStopped:!1,loadedFromCache:!1,screenshotsEnabled:!0,widgetPosition:null},we=["SCRIPT","STYLE","NOSCRIPT","IFRAME","CODE","SVG","AUDIO","VIDEO","LINK"],Le=["VAR","STRONG","EM","B","I","SPAN","A","ABBR","MARK","SMALL","SUB","SUP","U","S","TIME"],Se=["h1","h2","h3","h4","h5","h6","label","legend","caption","figcaption","nav","header","footer","main","section","article","form"],F=new Set(we),D=new Set(Le),he=[].concat(Se),pe=0,ge=!0,k=1e3,G=1e4,ve="loco-lang";function U(){try{return localStorage.getItem(ve)}catch{return null}}function J(e){try{e?localStorage.setItem(ve,e):localStorage.removeItem(ve)}catch{}}function Be(e){if(e.blockedTags){var r=e.blockedTags.disabled||[],t=e.blockedTags.custom||[];F=new Set(we.filter(function(n){return r.indexOf(n)<0})),t.forEach(function(n){F.add(n.toUpperCase())})}if(e.inlineTags){var r=e.inlineTags.disabled||[],t=e.inlineTags.custom||[];D=new Set(Le.filter(function(o){return r.indexOf(o)<0})),t.forEach(function(o){D.add(o.toUpperCase())})}if(e.domContextSelectors){var r=e.domContextSelectors.disabled||[],t=e.domContextSelectors.custom||[];he=Se.filter(function(o){return r.indexOf(o)<0}).concat(t)}e.screenshotsEnabled===!1&&(i.screenshotsEnabled=!1),typeof e.contextDepth=="number"&&(pe=e.contextDepth),e.domContextEnabled===!1&&(ge=!1)}function N(e){return e.trim().replace(/\s+/g," ")}function E(e){return!/[a-zA-Z\u00C0-\u024F\u0900-\u097F\u0600-\u06FF]/.test(e)}function Z(e){var r=e.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g,"");return!r.trim()||E(r)}function Fe(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function B(e){var t;if(!e||e.nodeType!==1)return!1;const r=(t=e.tagName)==null?void 0:t.toUpperCase();return F.has(r)||e.hasAttribute("notranslate")||e.hasAttribute("data-notranslate")||e.getAttribute("translate")==="no"||e.isContentEditable}function Ae(e){let r=e.parentElement;for(;r&&r!==document.body;){if(B(r))return!0;r=r.parentElement}return!1}const ke=new Set(["H1","H2","H3","H4","H5","H6"]),He=new Set(["SCRIPT","STYLE","NOSCRIPT","CODE"]);let me=new WeakMap,P=new WeakMap,I=null;function Ce(){if(ge){I=new Set;var e=he.slice();try{var r=e.join(",");document.querySelectorAll(r).forEach(function(t){I.add(t)})}catch{e.forEach(function(n){try{document.querySelectorAll(n).forEach(function(a){I.add(a)})}catch{}})}I.forEach(function(t){P.has(t)||H(t)})}}function z(e){return I?I.has(e):ke.has(e.tagName)?!0:he.some(function(r){try{return e.matches(r)}catch{return!1}})}function je(e){let r="";for(const t of e.childNodes)if(t.nodeType===Node.TEXT_NODE){const n=t.textContent.trim();n&&(r+=(r?" ":"")+n)}return r}function Xe(e,r){for(var t="",n=document.createTreeWalker(e,NodeFilter.SHOW_ALL,{acceptNode:function(o){return o.nodeType===Node.ELEMENT_NODE?He.has(o.tagName)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT}}),a;(a=n.nextNode())&&!(a.nodeType===Node.TEXT_NODE&&(t+=a.textContent,t.length>=r)););return t.trim()}function H(e){if(P.has(e))return P.get(e);let r=null;const t=je(e);if(t)return r=t.substring(0,60),P.set(e,r),r;if(ke.has(e.tagName)){const a=(e.textContent||"").trim().replace(/\s+/g," ");if(a)return r=a.substring(0,60),P.set(e,r),r}var n=Xe(e,200);if(n){const a=n.split(/\n/)[0].trim().replace(/\s+/g," ");a.length>=2&&!E(a)&&(r=a.substring(0,60))}return P.set(e,r),r}function L(e){if(!e||!ge)return"";if(me.has(e))return me.get(e);const r=[],t=new Set;let n=e,a=0;if(e&&e.tagName==="TD"){var o=e.closest("table");if(o){var s=o.querySelector("thead tr th:nth-child("+(e.cellIndex+1)+")");if(s){var h=H(s);h&&(t.add(h),r.push(h))}}}for(;n&&n!==document.body&&!(pe>0&&a>=pe);){a++;let d=n.previousElementSibling;for(;d;){var v=d.tagName.toUpperCase();if(F.has(v)){d=d.previousElementSibling;continue}if(v==="ARTICLE"||v==="MAIN"){d=d.previousElementSibling;continue}if(z(d)){const f=H(d);f&&!t.has(f)&&(t.add(f),r.unshift(f));break}let p=null;for(const f of d.children)if(z(f)){p=f;break}if(!p)for(const f of d.children){for(const l of f.children)if(z(l)){p=l;break}if(p)break}if(p){const f=H(p);f&&!t.has(f)&&(t.add(f),r.unshift(f));break}d=d.previousElementSibling}if(z(n)){const p=H(n);p&&!t.has(p)&&(t.add(p),r.unshift(p))}var c=n.tagName;if(c==="ARTICLE"||c==="MAIN")break;n=n.parentElement}const u=r.join(" > ");return me.set(e,u),u}function Qe(e){return/^\d+$/.test(e)?"number":/^\d+\.\d+$/.test(e)?"decimal":"text"}function We(e,r){for(var t=r.split(/(\{\{(?:text|number|decimal|date):\d+\}\})/),n=[],a=e,o=0;o<t.length;o++){var s=t[o],h=s.match(/^\{\{(text|number|decimal|date):(\d+)\}\}$/);if(h)if(a.indexOf(s)===0)n.push({type:h[1],index:parseInt(h[2]),originalText:s}),a=a.substring(s.length);else{for(var v="",c=o+1;c<t.length;c++){var u=t[c];if(/^\{\{(?:text|number|decimal|date):\d+\}\}$/.test(u)){if(a.indexOf(u)>=0){v=u;break}}else if(u!==""){v=u;break}}var d;if(v==="")d=a,a="";else{var p=a.indexOf(v);p>=0?(d=a.substring(0,p),a=a.substring(p)):(d=a,a="")}n.push({type:h[1],index:parseInt(h[2]),originalText:d})}else a.indexOf(s)===0&&(a=a.substring(s.length))}return n}function Y(e,r){e.forEach(function(t){if(!(t.varSlots&&t.varSlots.length>0)){var n=r[t.key];n&&(t.varSlots=We(t.key,n),t.key=n)}})}function $e(e,r){for(var t=r.split(/\{\{(?:text|number|decimal|date):\d+\}\}/g),n=e,a=[],o=0;o<t.length;o++)if(o===0)n.indexOf(t[o])===0&&(n=n.substring(t[o].length));else if(t[o]===""&&o===t.length-1)a.push(n),n="";else{var s=n.indexOf(t[o]);s>=0&&(a.push(n.substring(0,s)),n=n.substring(s+t[o].length))}return a.length>0&&a.every(function(h){return/^[a-zA-Z\s]+$/.test(h.trim())})}function Ve(e){for(var r=0,t=/\{\{(text|number|decimal|date):\d+\}\}/g,n;(n=t.exec(e))!==null;)switch(n[1]){case"number":r+=3;break;case"decimal":r+=3;break;case"date":r+=2;break;default:r+=1;break}return r}function R(e,r){for(var t=[],n=0;n<r.length;n++){var a=r[n];if(!(a.indexOf("{{text:")<0&&a.indexOf("{{number:")<0&&a.indexOf("{{decimal:")<0&&a.indexOf("{{date:")<0)){for(var o=[],s=[],h=0,v=/\{\{(text|number|decimal|date):\d+\}\}/g,c;(c=v.exec(a))!==null;)o.push(a.substring(h,c.index)),s.push(c[1]),h=v.lastIndex;o.push(a.substring(h));for(var u="",d=0;d<o.length;d++)if(u+=o[d].replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d<s.length)switch(s[d]){case"number":u+="\\d+";break;case"decimal":u+="\\d+\\.\\d+";break;default:u+=".+";break}t.push({pattern:a,regex:new RegExp("^"+u+"$"),specificity:Ve(a)})}}if(t.length!==0){t.sort(function(l,g){return g.specificity-l.specificity});for(var p={},f={},n=0;n<r.length;n++)f[r[n]]=!0;return e.forEach(function(l){if(!f[l.key]&&!(l.key.length>k)){for(var g=0;g<t.length;g++)if(t[g].regex.test(l.key)&&!$e(l.key,t[g].pattern)){p[l.key]=t[g].pattern;break}}}),Y(e,p),p}}function A(e){let r=!1,t=!1;for(const n of e.childNodes)if(n.nodeType===Node.TEXT_NODE&&n.textContent.trim()&&(r=!0),n.nodeType===Node.ELEMENT_NODE){const a=n.tagName.toUpperCase();if(a==="BR")return!1;(a==="VAR"||a==="TIME"&&n.hasAttribute("datetime")||D.has(a))&&(t=!0)}return r&&t}function ee(e){let r="";const t=[];for(const n of e.childNodes){if(n.nodeType===Node.TEXT_NODE){const a=N(n.textContent);a&&(r+=a);continue}if(n.nodeType===Node.ELEMENT_NODE){const a=n.tagName.toUpperCase();if(a==="TIME"&&n.hasAttribute("datetime")){const o=t.length;t.push({type:"date",index:o,raw:n.getAttribute("datetime"),display:n.textContent,node:n}),r+=`{{date:${o}}}`;continue}if(a==="VAR"||D.has(a)){const o=N(n.textContent);if(o){const s=t.length,h=Qe(o);t.push({type:h,index:s,tag:a,value:o,node:n}),r+=`{{${h}:${s}}}`}continue}}}return{key:N(r),slots:t}}var te=["title","placeholder","aria-label"];function Oe(e){const r=[],t=new Set;if(e.nodeType===Node.ELEMENT_NODE&&!B(e)&&A(e)){const{key:c,slots:u}=ee(e);if(c&&c.length<=k)if(Z(c))u.forEach(function(d){if(d.type==="text"&&d.value&&d.value.length>=2&&!E(d.value)){var p=L(d.node||e),f=d.value+"\0"+p;t.has(f)||(t.add(f),r.push({type:"text",key:d.value,slots:[],textNode:d.node?d.node.firstChild:null,element:d.node||e,context:p,original:d.value}))}});else{var n=L(e),a=c+"\0"+n;t.has(a)||t.add(a);const d=u.some(p=>p.type==="date")?"mixed-date":u.some(p=>p.type==="text")?"mixed-text":"mixed";r.push({type:d,key:c,slots:u,element:e,context:n,original:c,originalHTML:e.innerHTML})}}const o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode(c){var g,m,x;if(c.nodeType===Node.TEXT_NODE){const y=N(c.textContent);if(!y||y.length<2||y.length>k||E(y)||/\{\{(?:text|number|decimal|date):\d+\}\}/.test(y)||Ae(c))return NodeFilter.FILTER_SKIP;const b=(m=(g=c.parentElement)==null?void 0:g.tagName)==null?void 0:m.toUpperCase();if(F.has(b)||A(c.parentElement))return NodeFilter.FILTER_SKIP;for(var u=c.parentElement;u;){var d=(x=u.tagName)==null?void 0:x.toUpperCase();if((d==="VAR"||d==="TIME"||D.has(d))&&u.parentElement&&A(u.parentElement))return NodeFilter.FILTER_SKIP;u=u.parentElement}return NodeFilter.FILTER_ACCEPT}if(c.nodeType===Node.ELEMENT_NODE){const y=c.tagName.toUpperCase();if(F.has(y)||B(c))return NodeFilter.FILTER_REJECT;if(y==="INPUT"){var p=(c.getAttribute("type")||"").toLowerCase();if(p==="button"||p==="submit"||p==="reset"){var f=N(c.value);if(f&&f.length>=2&&!E(f))return NodeFilter.FILTER_ACCEPT}var l=te.some(function(b){var T=N(c.getAttribute(b)||"");return T&&T.length>=2&&!E(T)});return l?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return A(c)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}});let s;for(;s=o.nextNode();){if(s.nodeType===Node.TEXT_NODE){const c=N(s.textContent);if(!c)continue;var n=L(s.parentElement),a=c+"\0"+n;t.has(a)||t.add(a),r.push({type:"text",key:c,slots:[],textNode:s,element:s.parentElement,context:n,original:c});continue}if(s.nodeType===Node.ELEMENT_NODE&&s.tagName.toUpperCase()==="INPUT"){var h=(s.getAttribute("type")||"").toLowerCase(),n=L(s);if(h==="button"||h==="submit"||h==="reset"){var v=N(s.value);if(v&&v.length>=2&&!E(v)){var a=v+"\0"+n;t.has(a)||t.add(a),r.push({type:"input-value",key:v,slots:[],element:s,context:n,original:v})}}te.forEach(function(u){var d=N(s.getAttribute(u)||"");if(!(!d||d.length<2||E(d))){var p=d+"\0"+n+"\0"+u;t.has(p)||(t.add(p),r.push({type:"input-attr",key:d,attr:u,slots:[],element:s,context:n,original:d}))}});continue}if(s.nodeType===Node.ELEMENT_NODE){const{key:c,slots:u}=ee(s);if(!c||c.length>k)continue;if(Z(c)){u.forEach(function(l){if(l.type==="text"&&l.value&&l.value.length>=2&&!E(l.value)){var g=L(l.node||s),m=l.value+"\0"+g;t.has(m)||(t.add(m),r.push({type:"text",key:l.value,slots:[],textNode:l.node?l.node.firstChild:null,element:l.node||s,context:g,original:l.value}))}});continue}var n=L(s),a=c+"\0"+n;t.has(a)||t.add(a);const f=u.some(l=>l.type==="date")?"mixed-date":u.some(l=>l.type==="text")?"mixed-text":"mixed";r.push({type:f,key:c,slots:u,element:s,context:n,original:c,originalHTML:s.innerHTML})}}return r}async function j(e,r){r||(r=100);const t=[],n=new Set;if(e.nodeType===Node.ELEMENT_NODE&&!B(e)&&A(e)){const{key:f,slots:l}=ee(e);if(f&&f.length<=k)if(Z(f))l.forEach(function(g){if(g.type==="text"&&g.value&&g.value.length>=2&&!E(g.value)){var m=L(g.node||e),x=g.value+"\0"+m;n.has(x)||(n.add(x),t.push({type:"text",key:g.value,slots:[],textNode:g.node?g.node.firstChild:null,element:g.node||e,context:m,original:g.value}))}});else{var a=L(e),o=f+"\0"+a;n.has(o)||n.add(o);const g=l.some(m=>m.type==="date")?"mixed-date":l.some(m=>m.type==="text")?"mixed-text":"mixed";t.push({type:g,key:f,slots:l,element:e,context:a,original:f,originalHTML:e.innerHTML})}}const s=[],h=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode(f){var b,T,S;if(f.nodeType===Node.TEXT_NODE){const w=N(f.textContent);if(!w||w.length<2||w.length>k||E(w)||/\{\{(?:text|number|decimal|date):\d+\}\}/.test(w)||Ae(f))return NodeFilter.FILTER_SKIP;const K=(T=(b=f.parentElement)==null?void 0:b.tagName)==null?void 0:T.toUpperCase();if(F.has(K)||A(f.parentElement))return NodeFilter.FILTER_SKIP;for(var l=f.parentElement;l;){var g=(S=l.tagName)==null?void 0:S.toUpperCase();if((g==="VAR"||g==="TIME"||D.has(g))&&l.parentElement&&A(l.parentElement))return NodeFilter.FILTER_SKIP;l=l.parentElement}return NodeFilter.FILTER_ACCEPT}if(f.nodeType===Node.ELEMENT_NODE){const w=f.tagName.toUpperCase();if(F.has(w)||B(f))return NodeFilter.FILTER_REJECT;if(w==="INPUT"){var m=(f.getAttribute("type")||"").toLowerCase();if(m==="button"||m==="submit"||m==="reset"){var x=N(f.value);if(x&&x.length>=2&&!E(x))return NodeFilter.FILTER_ACCEPT}var y=te.some(function(K){var O=N(f.getAttribute(K)||"");return O&&O.length>=2&&!E(O)});return y?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return A(f)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}});for(var v;v=h.nextNode();)s.push(v);for(var c=0;c<s.length;c++){c>0&&c%r===0&&await new Promise(function(f){setTimeout(f,0)});var u=s[c];if(u.nodeType===Node.TEXT_NODE){const f=N(u.textContent);if(!f)continue;var a=L(u.parentElement),o=f+"\0"+a;n.has(o)||n.add(o),t.push({type:"text",key:f,slots:[],textNode:u,element:u.parentElement,context:a,original:f});continue}if(u.nodeType===Node.ELEMENT_NODE&&u.tagName.toUpperCase()==="INPUT"){var d=(u.getAttribute("type")||"").toLowerCase(),a=L(u);if(d==="button"||d==="submit"||d==="reset"){var p=N(u.value);if(p&&p.length>=2&&!E(p)){var o=p+"\0"+a;n.has(o)||n.add(o),t.push({type:"input-value",key:p,slots:[],element:u,context:a,original:p})}}te.forEach(function(l){var g=N(u.getAttribute(l)||"");if(!(!g||g.length<2||E(g))){var m=g+"\0"+a+"\0"+l;n.has(m)||(n.add(m),t.push({type:"input-attr",key:g,attr:l,slots:[],element:u,context:a,original:g}))}});continue}if(u.nodeType===Node.ELEMENT_NODE){const{key:f,slots:l}=ee(u);if(!f||f.length>k)continue;if(Z(f)){l.forEach(function(y){if(y.type==="text"&&y.value&&y.value.length>=2&&!E(y.value)){var b=L(y.node||u),T=y.value+"\0"+b;n.has(T)||(n.add(T),t.push({type:"text",key:y.value,slots:[],textNode:y.node?y.node.firstChild:null,element:y.node||u,context:b,original:y.value}))}});continue}var a=L(u),o=f+"\0"+a;n.has(o)||n.add(o);const x=l.some(y=>y.type==="date")?"mixed-date":l.some(y=>y.type==="text")?"mixed-text":"mixed";t.push({type:x,key:f,slots:l,element:u,context:a,original:f,originalHTML:u.innerHTML})}}return t}function ne(e){if(i.scanStopped)return Promise.resolve({ok:!0,registered:0,keyMap:{}});var r=new Set,t=[];return e.forEach(function(n){var a=n.key+"\0"+(n.context||"");r.has(a)||n.varSlots&&n.varSlots.length>0&&/\{\{(?:text|number|decimal|date):\d+\}\}/.test(n.key)||(r.add(a),t.push({key:n.key,context:n.context||""}),n.slots&&n.slots.length>0&&n.slots.forEach(function(o){if(o.type==="text"&&o.value&&!E(o.value)){var s=o.value+"\0";r.has(s)||(r.add(s),t.push({key:o.value,context:""}))}}))}),fetch(i.apiBase+"/api/textnodes",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":i.apiKey},body:JSON.stringify({keys:t,url:window.location.href})}).then(function(n){return n.json()})}function qe(e){var r=i.apiBase+"/api/translations?lang="+encodeURIComponent(e);return fetch(r,{headers:{"X-API-Key":i.apiKey}}).then(function(t){return t.json()}).then(function(t){var n={};return Array.isArray(t)?t.forEach(function(a){n[a.key+"\0"+(a.context||"")]=a.value,n.hasOwnProperty(a.key)||(n[a.key]=a.value)}):n=t,n})}function Ge(){if(!(i.fileMode||!i.screenshotsEnabled)){var e=document.createElement("script");e.src=i.apiBase+"/cdn/html2canvas.min.js",e.onload=function(){typeof html2canvas=="function"&&html2canvas(document.body,{scale:.35,logging:!1,useCORS:!0,allowTaint:!0,width:window.innerWidth,height:window.innerHeight,windowWidth:window.innerWidth,windowHeight:window.innerHeight}).then(function(r){var t=r.toDataURL("image/jpeg",.5),n=t.split(",")[1];!n||n.length>5e5||fetch(i.apiBase+"/api/screenshots",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":i.apiKey},body:JSON.stringify({url:window.location.href,screenshot:n})}).catch(function(){})}).catch(function(){})},e.onerror=function(){},document.head.appendChild(e)}}function Je(e,r){return e.replace(/\{\{(text|number|decimal|date):(\d+)\}\}/g,(t,n,a)=>{const o=r[parseInt(a)];return o?n==="date"?o.display:o.value:t})}function De(e){if(!Array.isArray(e))return e;var r={};return e.forEach(function(t){r[t.key+"\0"+(t.context||"")]=t.value,r.hasOwnProperty(t.key)||(r[t.key]=t.value)}),r}function ye(e,r){let t=0,n=0;return e.forEach(a=>{const o=a.key+"\0"+(a.context||"");var s=r[o]||r[a.key];if(!s&&a.slots&&a.slots.length>0){var h=a.slots.some(function(d){if(d.type!=="text"||!d.value)return!1;var p=d.value+"\0"+(a.context||""),f=d.value+"\0";return r.hasOwnProperty(p)||r.hasOwnProperty(f)||r.hasOwnProperty(d.value)});h&&(s=a.key)}if(!s){n++;return}if(a.type==="input-value"&&a.element)try{a.element.value=s,t++;return}catch(d){console.warn("[translate] Could not write to input value",d),n++;return}if(a.type==="input-attr"&&a.element&&a.attr)try{a.element.setAttribute(a.attr,s),t++;return}catch(d){console.warn("[translate] Could not write to input attr",d),n++;return}if(a.type==="text"&&a.textNode)try{var v=s;a.varSlots&&a.varSlots.length>0&&(v=v.replace(/\{\{(text|number|decimal|date):(\d+)\}\}/g,function(d,p,f){var l=a.varSlots.find(function(g){return(g.type||"text")===p&&g.index===+f});return l||(l=a.varSlots[+f]),l?l.originalText:d})),v=v.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g,""),a.textNode.nodeValue=v,t++;return}catch(d){console.warn("[translate] Could not write to text node",d),n++;return}if(a.element){try{const d=Je(s,a.slots);let p=s;var c={};a.slots.forEach(f=>{const l=`{{${f.type}:${f.index}}}`;if(f.type==="date"&&f.node)f.node.textContent=f.display,c[l]=f.node.outerHTML;else if(f.node){if(f.type==="text"&&f.value){var g=f.value+"\0"+(a.context||""),m=f.value+"\0",x=r[g]||r[m]||r[f.value];x&&(f.node.textContent=x)}c[l]=f.node.outerHTML}}),a.varSlots&&a.varSlots.length>0&&a.varSlots.forEach(function(f){var l="{{"+f.type+":"+f.index+"}}";c.hasOwnProperty(l)||(c[l]=Fe(f.originalText))});var u=p.split(/(\{\{(?:text|number|decimal|date):\d+\}\})/g);p=u.map(function(f){return c.hasOwnProperty(f)?c[f]:/^\{\{(?:text|number|decimal|date):\d+\}\}$/.test(f)?"":Fe(f)}).join(""),a.element.innerHTML=p,t++}catch(d){console.warn("[translate] Could not apply mixed translation",d),n++}return}n++}),{applied:t,skipped:n}}async function re(e,r,t){t||(t=100);for(var n=0,a=0,o=0;o<e.length;o+=t){o>0&&await new Promise(function(v){setTimeout(v,0)});var s=e.slice(o,o+t),h=ye(s,r);n+=h.applied,a+=h.skipped}return{applied:n,skipped:a}}function C(e){let r=0;e.forEach(t=>{try{t.type==="input-value"&&t.element?(t.element.value=t.original,r++):t.type==="input-attr"&&t.element&&t.attr?(t.element.setAttribute(t.attr,t.original),r++):t.type==="text"&&t.textNode&&(t.textNode.nodeValue=t.original,r++)}catch(n){console.warn("[translate] Could not restore text node",n)}}),e.forEach(t=>{if(t.type!=="text")try{t.element&&t.originalHTML!==void 0&&(t.element.innerHTML=t.originalHTML,r++)}catch(n){console.warn("[translate] Could not restore node",n)}}),console.log("[loco] untranslated "+r+" phrase(s)")}function ae(e,r){const t=new Set(e),n=[];Object.values(r).forEach(function(l){if(l&&(t.add(l),/\{\{(text|number|decimal|date):\d+\}\}/.test(l))){var g=l.split(/\{\{(?:text|number|decimal|date):\d+\}\}/g),m=g.map(function(x){return x.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")});n.push(new RegExp("^"+m.join(".+")+"$"))}});function a(l){if(t.has(l))return!0;for(var g=0;g<n.length;g++)if(n[g].test(l))return!0;return!1}let o=[],s=null,h=null,v=new Set,c=null,u=!1;function d(){if(o.length!==0){var l=o.splice(0);i.fileMode||ne(l).then(function(g){g&&g.keyMap&&(Y(l,g.keyMap),u=!0,ye(l,r),c&&c.takeRecords(),u=!1)}).catch(function(){})}}function p(l){const g=Oe(l);g.forEach(m=>{var x=m.key+"\0"+(m.context||"");a(m.key)||t.has(x)||(t.add(x),t.add(m.key),o.push(m),i.phrases.push(m))}),R(g,Object.keys(r)),u=!0,ye(g,r),c&&c.takeRecords(),u=!1,i.fileMode||(clearTimeout(s),s=setTimeout(d,500))}function f(l){v.add(l),h||(h=requestAnimationFrame(function(){h=null;var g=Array.from(v);v.clear(),g.forEach(function(m){m.isConnected&&p(m)})}))}return c=new MutationObserver(l=>{if(!u){var g=[],m=new Set;for(const y of l)for(const b of y.addedNodes)if(b.nodeType===Node.ELEMENT_NODE)g.push(b);else if(b.nodeType===Node.TEXT_NODE){var x=b.parentElement;x&&x.isConnected&&m.add(x)}g.forEach(function(y){p(y)}),m.forEach(function(y){f(y)})}}),c.observe(document.body,{childList:!0,subtree:!0}),c}var Pe="loco",Ze=2;function X(){return new Promise(function(e,r){try{var t=indexedDB.open(Pe,Ze);t.onupgradeneeded=function(n){var a=n.target.result;a.objectStoreNames.contains("meta")&&n.oldVersion<2&&a.deleteObjectStore("meta"),a.objectStoreNames.contains("meta")||a.createObjectStore("meta",{keyPath:"key"}),a.objectStoreNames.contains("translations")||a.createObjectStore("translations",{keyPath:"lang"})},t.onsuccess=function(n){e(n.target.result)},t.onerror=function(){r(t.error)}}catch(n){r(n)}})}function ie(){return X().then(function(e){return new Promise(function(r,t){var n=e.transaction("meta","readonly"),a=n.objectStore("meta").get("registry");a.onsuccess=function(){e.close();var o=a.result;r(o?{languages:o.languages||[],languageNames:o.languageNames||{}}:null)},a.onerror=function(){e.close(),t(a.error)}})})}function Ie(e){var r="source:"+e;return X().then(function(t){return new Promise(function(n,a){var o=t.transaction("meta","readonly"),s=o.objectStore("meta").get(r);s.onsuccess=function(){t.close();var h=s.result;n(h?{url:h.url,timestamp:h.timestamp,storedAt:h.storedAt}:null)},s.onerror=function(){t.close(),a(s.error)}})})}function ze(e){return X().then(function(r){return new Promise(function(t,n){var a=r.transaction("translations","readonly"),o=a.objectStore("translations").get(e);o.onsuccess=function(){r.close();var s=o.result;t(s?s.data:null)},o.onerror=function(){r.close(),n(o.error)}})})}function Ye(){return X().then(function(e){return new Promise(function(r,t){var n=e.transaction(["meta","translations"],"readonly"),a=n.objectStore("meta"),o=a.get("registry");o.onsuccess=function(){var s=o.result;if(!s||!s.languages||s.languages.length===0){e.close(),r(null);return}var h=U(),v=h||s.languages[0],c=n.objectStore("translations").get(v);c.onsuccess=function(){e.close();var u=c.result;if(!u||!u.data){r(null);return}var d={};d[v]=u.data,r({languages:s.languages,languageNames:s.languageNames||{},translations:d})},c.onerror=function(){e.close(),t(c.error)}},o.onerror=function(){e.close(),t(o.error)}})})}function oe(e,r,t){var n=r.languages||[],a=r.languageNames||{},o=r.translations||{},s=r.timestamp||0;return X().then(function(h){return new Promise(function(v,c){var u=h.transaction(["meta","translations"],"readwrite"),d=u.objectStore("meta"),p=u.objectStore("translations"),f=d.get("registry");f.onsuccess=function(){var l=f.result,g,m;if(t&&l){var x=l.languages||[];g=x.slice();for(var y=0;y<n.length;y++)g.indexOf(n[y])===-1&&g.push(n[y]);m={};var b=l.languageNames||{},T;for(T in b)m[T]=b[T];for(T in a)m[T]=a[T]}else g=n,m=a;d.put({key:"registry",languages:g,languageNames:m}),d.put({key:"source:"+e,url:e,timestamp:s,storedAt:Date.now()});for(var S=0;S<n.length;S++)o[n[S]]&&(t&&Array.isArray(o[n[S]])?function(w){var K=p.get(w);K.onsuccess=function(){var O=K.result,Q=O&&Array.isArray(O.data)?O.data:null,W=o[w];if(Q){for(var Ke="\0",$={},de=[],V=0;V<Q.length;V++){var be=Q[V].key+Ke+(Q[V].context||"");$.hasOwnProperty(be)||de.push(be),$[be]=Q[V]}for(var q=0;q<W.length;q++){var Te=W[q].key+Ke+(W[q].context||"");$.hasOwnProperty(Te)||de.push(Te),$[Te]=W[q]}for(var Ue=[],Ne=0;Ne<de.length;Ne++)Ue.push($[de[Ne]]);p.put({lang:w,data:Ue})}else p.put({lang:w,data:W})}}(n[S]):p.put({lang:n[S],data:o[n[S]]}))},u.oncomplete=function(){h.close(),v()},u.onerror=function(){h.close(),c(u.error)}})})}function et(){return new Promise(function(e){var r=indexedDB.deleteDatabase(Pe);r.onsuccess=function(){e()},r.onerror=function(){e()},r.onblocked=function(){e()}})}var tt='<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><clipPath id="loco-wc"><circle cx="100" cy="100" r="90"/></clipPath></defs><circle cx="100" cy="100" r="90" fill="#1a1f2e"/><g clip-path="url(#loco-wc)"><g transform="translate(100,108) scale(0.72) translate(-334,-198)"><ellipse cx="310" cy="318" rx="10" ry="38" fill="#2ECC88" transform="rotate(-18 310 318)"/><ellipse cx="326" cy="326" rx="9" ry="42" fill="#34D99A" transform="rotate(-6 326 326)"/><ellipse cx="342" cy="328" rx="9" ry="42" fill="#7BC74A" transform="rotate(6 342 328)"/><ellipse cx="357" cy="320" rx="9" ry="36" fill="#F07040" transform="rotate(18 357 320)"/><ellipse cx="334" cy="240" rx="62" ry="80" fill="#2ECC88"/><ellipse cx="334" cy="252" rx="36" ry="52" fill="#D4F4B0"/><path d="M275 220 Q228 190 232 265 Q248 295 280 285 Q268 255 275 220Z" fill="#3A8FE0"/><path d="M277 225 Q238 208 240 262 Q252 285 278 277 Q268 252 277 225Z" fill="#6BB3FF" opacity="0.7"/><path d="M393 220 Q440 190 436 265 Q420 295 388 285 Q400 255 393 220Z" fill="#3A8FE0"/><path d="M391 225 Q430 208 428 262 Q416 285 390 277 Q400 252 391 225Z" fill="#6BB3FF" opacity="0.7"/><ellipse cx="334" cy="172" rx="38" ry="30" fill="#2ECC88"/><circle cx="334" cy="148" r="52" fill="#2ECC88"/><ellipse cx="334" cy="118" rx="30" ry="18" fill="#FFB833"/><circle cx="312" cy="138" r="14" fill="white"/><circle cx="315" cy="140" r="9" fill="#2C2C2A"/><circle cx="315" cy="140" r="4" fill="#04342C"/><circle cx="319" cy="136" r="3.5" fill="white"/><circle cx="356" cy="138" r="14" fill="white"/><circle cx="353" cy="140" r="9" fill="#2C2C2A"/><circle cx="353" cy="140" r="4" fill="#04342C"/><circle cx="357" cy="136" r="3.5" fill="white"/><path d="M326 155 Q334 144 342 155 Q342 170 334 173 Q326 170 326 155Z" fill="#E8A020"/><path d="M328 165 Q334 158 340 165 Q340 174 334 176 Q328 174 328 165Z" fill="#A06010"/><ellipse cx="302" cy="152" rx="12" ry="8" fill="#F07040" opacity="0.8"/><ellipse cx="366" cy="152" rx="12" ry="8" fill="#F07040" opacity="0.8"/><path d="M320 100 Q316 68 308 52" stroke="#FFB833" stroke-width="6" fill="none" stroke-linecap="round"/><path d="M334 97 Q334 64 334 46" stroke="#7BC74A" stroke-width="6" fill="none" stroke-linecap="round"/><path d="M348 100 Q352 68 360 52" stroke="#F07040" stroke-width="6" fill="none" stroke-linecap="round"/><circle cx="308" cy="50" r="8" fill="#FFB833"/><circle cx="334" cy="44" r="8" fill="#7BC74A"/><circle cx="360" cy="50" r="8" fill="#F07040"/><rect x="260" y="330" width="168" height="10" rx="5" fill="#8B5E20"/><path d="M310 330 L300 350 M310 330 L315 352 M310 330 L325 348" stroke="#A07030" stroke-width="4" fill="none" stroke-linecap="round"/><path d="M360 330 L350 350 M360 330 L365 352 M360 330 L375 348" stroke="#A07030" stroke-width="4" fill="none" stroke-linecap="round"/></g></g></svg>',xe=null;function se(e,r){xe=r;var t=document.getElementById("loco-lang-widget");t&&t.remove();var n={},a=e.map(function(l){return typeof l=="object"&&l.code?(l.name&&(n[l.code]=l.name),l.code):l});function o(l){return n[l]||l}var s=U()||null,h=document.createElement("div");h.id="loco-lang-widget",h.setAttribute("data-notranslate","");var v={"bottom-right":"bottom:20px;right:20px;","bottom-left":"bottom:20px;left:20px;","top-right":"top:20px;right:20px;","top-left":"top:20px;left:20px;"};h.style.cssText='position:fixed;z-index:2147483647;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:14px;'+(v[r]||v["bottom-right"]);var c=document.createElement("button");c.innerHTML=tt,c.style.cssText="width:52px;height:52px;border-radius:50%;border:none;background:#1a1f2e;color:#fff;font-size:22px;cursor:pointer;box-shadow:0 4px 14px rgba(0,0,0,0.25);display:flex;align-items:center;justify-content:center;transition:transform 0.2s,box-shadow 0.2s;overflow:hidden;padding:0;",c.onmouseenter=function(){c.style.transform="scale(1.1)",c.style.boxShadow="0 6px 20px rgba(0,0,0,0.35)"},c.onmouseleave=function(){c.style.transform="scale(1)",c.style.boxShadow="0 4px 14px rgba(0,0,0,0.25)"};var u=document.createElement("div");u.style.cssText="display:none;position:absolute;"+(r.indexOf("bottom")===0?"bottom:56px;":"top:56px;")+(r.indexOf("right")>=0?"right:0;":"left:0;")+"background:#fff;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,0.18);min-width:200px;max-height:320px;overflow-y:auto;padding:6px 0;";var d=document.createElement("div");d.textContent="Original",d.style.cssText="padding:10px 16px;cursor:pointer;color:#333;transition:background 0.15s;font-weight:600;border-bottom:1px solid #eee;",d.onmouseenter=function(){d.style.background="#f5f5f5"},d.onmouseleave=function(){d.style.background="transparent"},d.onclick=function(){s=null,window.Loco.restore(),f(),u.style.display="none"},u.appendChild(d);var p=[];a.forEach(function(l){var g=document.createElement("div");g.textContent=o(l),g.setAttribute("data-lang",l),g.style.cssText="padding:10px 16px;cursor:pointer;color:#333;transition:background 0.15s;",g.onmouseenter=function(){g.style.background="#f5f5f5"},g.onmouseleave=function(){g.style.background=s===l?"#e8f0fe":"transparent"},g.onclick=function(){s=l,window.Loco.apply(l),f(),u.style.display="none"},u.appendChild(g),p.push({el:g,code:l})});function f(){d.style.background=s===null?"#e8f0fe":"transparent",d.style.fontWeight=s===null?"600":"400",p.forEach(function(l){l.el.style.background=s===l.code?"#e8f0fe":"transparent",l.el.style.fontWeight=s===l.code?"600":"400"})}c.onclick=function(l){l.stopPropagation(),u.style.display=u.style.display==="none"?"block":"none"},document.addEventListener("click",function(l){h.contains(l.target)||(u.style.display="none")}),f(),h.appendChild(u),h.appendChild(c),document.body.appendChild(h)}function nt(e){xe&&(!e||e.length===0||se(e,xe))}var _={__proto__:1,constructor:1,prototype:1};function Re(e){if(!e||typeof e!="string")return!1;if(e.charAt(0)==="/"||e.charAt(0)===".")return!0;try{var r=new URL(e,window.location.origin);return r.protocol==="http:"||r.protocol==="https:"}catch{return!1}}function le(e){if(!e||typeof e!="object"||Array.isArray(e))return null;if(Array.isArray(e._raw)){for(var r={},t={},n=0;n<e._raw.length;n++){var a=e._raw[n];!a||typeof a.l!="string"||typeof a.k!="string"||typeof a.v!="string"||(r[a.l]||(r[a.l]=!0,t[a.l]=[]),t[a.l].push({key:a.k,context:typeof a.c=="string"?a.c:"",value:a.v}))}e={languages:Object.keys(r).sort(),languageNames:{},translations:t,timestamp:0}}var o={};if(!Array.isArray(e.languages))return null;o.languages=[];for(var s=0;s<e.languages.length;s++){if(typeof e.languages[s]!="string"||e.languages[s].length>20)return null;o.languages.push(e.languages[s])}if(o.timestamp=typeof e.timestamp=="number"&&isFinite(e.timestamp)?e.timestamp:0,o.languageNames={},e.languageNames&&typeof e.languageNames=="object"&&!Array.isArray(e.languageNames))for(var h in e.languageNames)!e.languageNames.hasOwnProperty(h)||_[h]||typeof e.languageNames[h]=="string"&&e.languageNames[h].length<=100&&(o.languageNames[h]=e.languageNames[h]);if(o.translations={},e.translations&&typeof e.translations=="object"&&!Array.isArray(e.translations)){for(var v in e.translations)if(!(!e.translations.hasOwnProperty(v)||_[v])&&o.languages.indexOf(v)!==-1){var c=e.translations[v];if(Array.isArray(c)){for(var u=[],d=0;d<c.length;d++){var p=c[d];!p||typeof p!="object"||typeof p.key!="string"||typeof p.value!="string"||p.key.length>G||p.value.length>G||_[p.key]||u.push({key:p.key,value:p.value,context:typeof p.context=="string"?p.context:""})}o.translations[v]=u}else if(typeof c=="object"){var f={};for(var l in c)!c.hasOwnProperty(l)||_[l]||typeof c[l]=="string"&&(l.length>G||c[l].length>G||(f[l]=c[l]));o.translations[v]=f}}}return o}async function _e(){try{var e=await fetch(i.apiBase+"/api/project/crawler-config",{headers:{"X-API-Key":i.apiKey}});e.ok&&Be(await e.json())}catch{}Ce(),i.phrases=await j(document.body),ne(i.phrases).then(function(t){t&&t.keyMap&&Y(i.phrases,t.keyMap)}).catch(function(t){console.warn("[loco] Failed to register keys:",t)}),!i.scanStopped&&i.screenshotsEnabled&&setTimeout(Ge,3e3),console.log("[loco] "+i.phrases.length+" text nodes discovered"),console.log(` Loco.textnodes() — list all discovered text nodes
1
+ var Loco=function(){"use strict";var i={apiKey:null,apiBase:null,phrases:[],translations:{},observer:null,fileMode:!1,fileData:null,fileReadyResolve:null,fileReady:null,fileUrl:null,fileUrls:[],scanStopped:!1,loadedFromCache:!1,screenshotsEnabled:!0,widgetPosition:null},we=["SCRIPT","STYLE","NOSCRIPT","IFRAME","CODE","SVG","AUDIO","VIDEO","LINK"],Le=["VAR","STRONG","EM","B","I","SPAN","A","ABBR","MARK","SMALL","SUB","SUP","U","S","TIME"],Se=["h1","h2","h3","h4","h5","h6","label","legend","caption","figcaption","nav","header","footer","main","section","article","form"],A=new Set(we),D=new Set(Le),he=[].concat(Se),pe=0,ge=!0,k=1e3,G=1e4,me="loco-lang";function U(){try{return localStorage.getItem(me)}catch{return null}}function J(e){try{e?localStorage.setItem(me,e):localStorage.removeItem(me)}catch{}}function Be(e){if(e.blockedTags){var r=e.blockedTags.disabled||[],t=e.blockedTags.custom||[];A=new Set(we.filter(function(n){return r.indexOf(n)<0})),t.forEach(function(n){A.add(n.toUpperCase())})}if(e.inlineTags){var r=e.inlineTags.disabled||[],t=e.inlineTags.custom||[];D=new Set(Le.filter(function(o){return r.indexOf(o)<0})),t.forEach(function(o){D.add(o.toUpperCase())})}if(e.domContextSelectors){var r=e.domContextSelectors.disabled||[],t=e.domContextSelectors.custom||[];he=Se.filter(function(o){return r.indexOf(o)<0}).concat(t)}e.screenshotsEnabled===!1&&(i.screenshotsEnabled=!1),typeof e.contextDepth=="number"&&(pe=e.contextDepth),e.domContextEnabled===!1&&(ge=!1)}function N(e){return e.trim().replace(/\s+/g," ")}function E(e){return!/[a-zA-Z\u00C0-\u024F\u0900-\u097F\u0600-\u06FF]/.test(e)}function Z(e){var r=e.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g,"");return!r.trim()||E(r)}function Ae(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function B(e){var t;if(!e||e.nodeType!==1)return!1;const r=(t=e.tagName)==null?void 0:t.toUpperCase();return A.has(r)||e.hasAttribute("notranslate")||e.hasAttribute("data-notranslate")||e.hasAttribute("data-loco-translated")||e.getAttribute("translate")==="no"||e.isContentEditable}function Fe(e){let r=e.parentElement;for(;r&&r!==document.body;){if(B(r))return!0;r=r.parentElement}return!1}const ke=new Set(["H1","H2","H3","H4","H5","H6"]),He=new Set(["SCRIPT","STYLE","NOSCRIPT","CODE"]);let ve=new WeakMap,P=new WeakMap,I=null;function Ce(){if(ge){I=new Set;var e=he.slice();try{var r=e.join(",");document.querySelectorAll(r).forEach(function(t){I.add(t)})}catch{e.forEach(function(n){try{document.querySelectorAll(n).forEach(function(a){I.add(a)})}catch{}})}I.forEach(function(t){P.has(t)||H(t)})}}function z(e){return I?I.has(e):ke.has(e.tagName)?!0:he.some(function(r){try{return e.matches(r)}catch{return!1}})}function je(e){let r="";for(const t of e.childNodes)if(t.nodeType===Node.TEXT_NODE){const n=t.textContent.trim();n&&(r+=(r?" ":"")+n)}return r}function Xe(e,r){for(var t="",n=document.createTreeWalker(e,NodeFilter.SHOW_ALL,{acceptNode:function(o){return o.nodeType===Node.ELEMENT_NODE?He.has(o.tagName)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT}}),a;(a=n.nextNode())&&!(a.nodeType===Node.TEXT_NODE&&(t+=a.textContent,t.length>=r)););return t.trim()}function H(e){if(P.has(e))return P.get(e);let r=null;const t=je(e);if(t)return r=t.substring(0,60),P.set(e,r),r;if(ke.has(e.tagName)){const a=(e.textContent||"").trim().replace(/\s+/g," ");if(a)return r=a.substring(0,60),P.set(e,r),r}var n=Xe(e,200);if(n){const a=n.split(/\n/)[0].trim().replace(/\s+/g," ");a.length>=2&&!E(a)&&(r=a.substring(0,60))}return P.set(e,r),r}function L(e){if(!e||!ge)return"";if(ve.has(e))return ve.get(e);const r=[],t=new Set;let n=e,a=0;if(e&&e.tagName==="TD"){var o=e.closest("table");if(o){var s=o.querySelector("thead tr th:nth-child("+(e.cellIndex+1)+")");if(s){var h=H(s);h&&(t.add(h),r.push(h))}}}for(;n&&n!==document.body&&!(pe>0&&a>=pe);){a++;let d=n.previousElementSibling;for(;d;){var m=d.tagName.toUpperCase();if(A.has(m)){d=d.previousElementSibling;continue}if(m==="ARTICLE"||m==="MAIN"){d=d.previousElementSibling;continue}if(z(d)){const f=H(d);f&&!t.has(f)&&(t.add(f),r.unshift(f));break}let p=null;for(const f of d.children)if(z(f)){p=f;break}if(!p)for(const f of d.children){for(const l of f.children)if(z(l)){p=l;break}if(p)break}if(p){const f=H(p);f&&!t.has(f)&&(t.add(f),r.unshift(f));break}d=d.previousElementSibling}if(z(n)){const p=H(n);p&&!t.has(p)&&(t.add(p),r.unshift(p))}var c=n.tagName;if(c==="ARTICLE"||c==="MAIN")break;n=n.parentElement}const u=r.join(" > ");return ve.set(e,u),u}function Qe(e){return/^\d+$/.test(e)?"number":/^\d+\.\d+$/.test(e)?"decimal":"text"}function We(e,r){for(var t=r.split(/(\{\{(?:text|number|decimal|date):\d+\}\})/),n=[],a=e,o=0;o<t.length;o++){var s=t[o],h=s.match(/^\{\{(text|number|decimal|date):(\d+)\}\}$/);if(h)if(a.indexOf(s)===0)n.push({type:h[1],index:parseInt(h[2]),originalText:s}),a=a.substring(s.length);else{for(var m="",c=o+1;c<t.length;c++){var u=t[c];if(/^\{\{(?:text|number|decimal|date):\d+\}\}$/.test(u)){if(a.indexOf(u)>=0){m=u;break}}else if(u!==""){m=u;break}}var d;if(m==="")d=a,a="";else{var p=a.indexOf(m);p>=0?(d=a.substring(0,p),a=a.substring(p)):(d=a,a="")}n.push({type:h[1],index:parseInt(h[2]),originalText:d})}else a.indexOf(s)===0&&(a=a.substring(s.length))}return n}function Y(e,r){e.forEach(function(t){if(!(t.varSlots&&t.varSlots.length>0)){var n=r[t.key];n&&(t.varSlots=We(t.key,n),t.key=n)}})}function $e(e,r){for(var t=r.split(/\{\{(?:text|number|decimal|date):\d+\}\}/g),n=e,a=[],o=0;o<t.length;o++)if(o===0)n.indexOf(t[o])===0&&(n=n.substring(t[o].length));else if(t[o]===""&&o===t.length-1)a.push(n),n="";else{var s=n.indexOf(t[o]);s>=0&&(a.push(n.substring(0,s)),n=n.substring(s+t[o].length))}return a.length>0&&a.every(function(h){return/^[a-zA-Z\s]+$/.test(h.trim())})}function Ve(e){for(var r=0,t=/\{\{(text|number|decimal|date):\d+\}\}/g,n;(n=t.exec(e))!==null;)switch(n[1]){case"number":r+=3;break;case"decimal":r+=3;break;case"date":r+=2;break;default:r+=1;break}return r}function R(e,r){for(var t=[],n=0;n<r.length;n++){var a=r[n];if(!(a.indexOf("{{text:")<0&&a.indexOf("{{number:")<0&&a.indexOf("{{decimal:")<0&&a.indexOf("{{date:")<0)){for(var o=[],s=[],h=0,m=/\{\{(text|number|decimal|date):\d+\}\}/g,c;(c=m.exec(a))!==null;)o.push(a.substring(h,c.index)),s.push(c[1]),h=m.lastIndex;o.push(a.substring(h));for(var u="",d=0;d<o.length;d++)if(u+=o[d].replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d<s.length)switch(s[d]){case"number":u+="\\d+";break;case"decimal":u+="\\d+\\.\\d+";break;default:u+=".+";break}t.push({pattern:a,regex:new RegExp("^"+u+"$"),specificity:Ve(a)})}}if(t.length!==0){t.sort(function(l,g){return g.specificity-l.specificity});for(var p={},f={},n=0;n<r.length;n++)f[r[n]]=!0;return e.forEach(function(l){if(!f[l.key]&&!(l.key.length>k)){for(var g=0;g<t.length;g++)if(t[g].regex.test(l.key)&&!$e(l.key,t[g].pattern)){p[l.key]=t[g].pattern;break}}}),Y(e,p),p}}function F(e){let r=!1,t=!1;for(const n of e.childNodes)if(n.nodeType===Node.TEXT_NODE&&n.textContent.trim()&&(r=!0),n.nodeType===Node.ELEMENT_NODE){const a=n.tagName.toUpperCase();if(a==="BR")return!1;(a==="VAR"||a==="TIME"&&n.hasAttribute("datetime")||D.has(a))&&(t=!0)}return r&&t}function ee(e){let r="";const t=[];for(const n of e.childNodes){if(n.nodeType===Node.TEXT_NODE){const a=N(n.textContent);a&&(r+=a);continue}if(n.nodeType===Node.ELEMENT_NODE){const a=n.tagName.toUpperCase();if(a==="TIME"&&n.hasAttribute("datetime")){const o=t.length;t.push({type:"date",index:o,raw:n.getAttribute("datetime"),display:n.textContent,node:n}),r+=`{{date:${o}}}`;continue}if(a==="VAR"||D.has(a)){const o=N(n.textContent);if(o){const s=t.length,h=Qe(o);t.push({type:h,index:s,tag:a,value:o,node:n}),r+=`{{${h}:${s}}}`}continue}}}return{key:N(r),slots:t}}var te=["title","placeholder","aria-label"];function Oe(e){const r=[],t=new Set;if(e.nodeType===Node.ELEMENT_NODE&&!B(e)&&F(e)){const{key:c,slots:u}=ee(e);if(c&&c.length<=k)if(Z(c))u.forEach(function(d){if(d.type==="text"&&d.value&&d.value.length>=2&&!E(d.value)){var p=L(d.node||e),f=d.value+"\0"+p;t.has(f)||(t.add(f),r.push({type:"text",key:d.value,slots:[],textNode:d.node?d.node.firstChild:null,element:d.node||e,context:p,original:d.value}))}});else{var n=L(e),a=c+"\0"+n;t.has(a)||t.add(a);const d=u.some(p=>p.type==="date")?"mixed-date":u.some(p=>p.type==="text")?"mixed-text":"mixed";r.push({type:d,key:c,slots:u,element:e,context:n,original:c,originalHTML:e.innerHTML})}}const o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode(c){var g,v,x;if(c.nodeType===Node.TEXT_NODE){const y=N(c.textContent);if(!y||y.length<2||y.length>k||E(y)||/\{\{(?:text|number|decimal|date):\d+\}\}/.test(y)||Fe(c))return NodeFilter.FILTER_SKIP;const b=(v=(g=c.parentElement)==null?void 0:g.tagName)==null?void 0:v.toUpperCase();if(A.has(b)||F(c.parentElement))return NodeFilter.FILTER_SKIP;for(var u=c.parentElement;u;){var d=(x=u.tagName)==null?void 0:x.toUpperCase();if((d==="VAR"||d==="TIME"||D.has(d))&&u.parentElement&&F(u.parentElement))return NodeFilter.FILTER_SKIP;u=u.parentElement}return NodeFilter.FILTER_ACCEPT}if(c.nodeType===Node.ELEMENT_NODE){const y=c.tagName.toUpperCase();if(A.has(y)||B(c))return NodeFilter.FILTER_REJECT;if(y==="INPUT"){var p=(c.getAttribute("type")||"").toLowerCase();if(p==="button"||p==="submit"||p==="reset"){var f=N(c.value);if(f&&f.length>=2&&!E(f))return NodeFilter.FILTER_ACCEPT}var l=te.some(function(b){var T=N(c.getAttribute(b)||"");return T&&T.length>=2&&!E(T)});return l?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return F(c)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}});let s;for(;s=o.nextNode();){if(s.nodeType===Node.TEXT_NODE){const c=N(s.textContent);if(!c)continue;var n=L(s.parentElement),a=c+"\0"+n;t.has(a)||t.add(a),r.push({type:"text",key:c,slots:[],textNode:s,element:s.parentElement,context:n,original:c});continue}if(s.nodeType===Node.ELEMENT_NODE&&s.tagName.toUpperCase()==="INPUT"){var h=(s.getAttribute("type")||"").toLowerCase(),n=L(s);if(h==="button"||h==="submit"||h==="reset"){var m=N(s.value);if(m&&m.length>=2&&!E(m)){var a=m+"\0"+n;t.has(a)||t.add(a),r.push({type:"input-value",key:m,slots:[],element:s,context:n,original:m})}}te.forEach(function(u){var d=N(s.getAttribute(u)||"");if(!(!d||d.length<2||E(d))){var p=d+"\0"+n+"\0"+u;t.has(p)||(t.add(p),r.push({type:"input-attr",key:d,attr:u,slots:[],element:s,context:n,original:d}))}});continue}if(s.nodeType===Node.ELEMENT_NODE){const{key:c,slots:u}=ee(s);if(!c||c.length>k)continue;if(Z(c)){u.forEach(function(l){if(l.type==="text"&&l.value&&l.value.length>=2&&!E(l.value)){var g=L(l.node||s),v=l.value+"\0"+g;t.has(v)||(t.add(v),r.push({type:"text",key:l.value,slots:[],textNode:l.node?l.node.firstChild:null,element:l.node||s,context:g,original:l.value}))}});continue}var n=L(s),a=c+"\0"+n;t.has(a)||t.add(a);const f=u.some(l=>l.type==="date")?"mixed-date":u.some(l=>l.type==="text")?"mixed-text":"mixed";r.push({type:f,key:c,slots:u,element:s,context:n,original:c,originalHTML:s.innerHTML})}}return r}async function j(e,r){r||(r=100);const t=[],n=new Set;if(e.nodeType===Node.ELEMENT_NODE&&!B(e)&&F(e)){const{key:f,slots:l}=ee(e);if(f&&f.length<=k)if(Z(f))l.forEach(function(g){if(g.type==="text"&&g.value&&g.value.length>=2&&!E(g.value)){var v=L(g.node||e),x=g.value+"\0"+v;n.has(x)||(n.add(x),t.push({type:"text",key:g.value,slots:[],textNode:g.node?g.node.firstChild:null,element:g.node||e,context:v,original:g.value}))}});else{var a=L(e),o=f+"\0"+a;n.has(o)||n.add(o);const g=l.some(v=>v.type==="date")?"mixed-date":l.some(v=>v.type==="text")?"mixed-text":"mixed";t.push({type:g,key:f,slots:l,element:e,context:a,original:f,originalHTML:e.innerHTML})}}const s=[],h=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode(f){var b,T,S;if(f.nodeType===Node.TEXT_NODE){const w=N(f.textContent);if(!w||w.length<2||w.length>k||E(w)||/\{\{(?:text|number|decimal|date):\d+\}\}/.test(w)||Fe(f))return NodeFilter.FILTER_SKIP;const K=(T=(b=f.parentElement)==null?void 0:b.tagName)==null?void 0:T.toUpperCase();if(A.has(K)||F(f.parentElement))return NodeFilter.FILTER_SKIP;for(var l=f.parentElement;l;){var g=(S=l.tagName)==null?void 0:S.toUpperCase();if((g==="VAR"||g==="TIME"||D.has(g))&&l.parentElement&&F(l.parentElement))return NodeFilter.FILTER_SKIP;l=l.parentElement}return NodeFilter.FILTER_ACCEPT}if(f.nodeType===Node.ELEMENT_NODE){const w=f.tagName.toUpperCase();if(A.has(w)||B(f))return NodeFilter.FILTER_REJECT;if(w==="INPUT"){var v=(f.getAttribute("type")||"").toLowerCase();if(v==="button"||v==="submit"||v==="reset"){var x=N(f.value);if(x&&x.length>=2&&!E(x))return NodeFilter.FILTER_ACCEPT}var y=te.some(function(K){var O=N(f.getAttribute(K)||"");return O&&O.length>=2&&!E(O)});return y?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return F(f)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}});for(var m;m=h.nextNode();)s.push(m);for(var c=0;c<s.length;c++){c>0&&c%r===0&&await new Promise(function(f){setTimeout(f,0)});var u=s[c];if(u.nodeType===Node.TEXT_NODE){const f=N(u.textContent);if(!f)continue;var a=L(u.parentElement),o=f+"\0"+a;n.has(o)||n.add(o),t.push({type:"text",key:f,slots:[],textNode:u,element:u.parentElement,context:a,original:f});continue}if(u.nodeType===Node.ELEMENT_NODE&&u.tagName.toUpperCase()==="INPUT"){var d=(u.getAttribute("type")||"").toLowerCase(),a=L(u);if(d==="button"||d==="submit"||d==="reset"){var p=N(u.value);if(p&&p.length>=2&&!E(p)){var o=p+"\0"+a;n.has(o)||n.add(o),t.push({type:"input-value",key:p,slots:[],element:u,context:a,original:p})}}te.forEach(function(l){var g=N(u.getAttribute(l)||"");if(!(!g||g.length<2||E(g))){var v=g+"\0"+a+"\0"+l;n.has(v)||(n.add(v),t.push({type:"input-attr",key:g,attr:l,slots:[],element:u,context:a,original:g}))}});continue}if(u.nodeType===Node.ELEMENT_NODE){const{key:f,slots:l}=ee(u);if(!f||f.length>k)continue;if(Z(f)){l.forEach(function(y){if(y.type==="text"&&y.value&&y.value.length>=2&&!E(y.value)){var b=L(y.node||u),T=y.value+"\0"+b;n.has(T)||(n.add(T),t.push({type:"text",key:y.value,slots:[],textNode:y.node?y.node.firstChild:null,element:y.node||u,context:b,original:y.value}))}});continue}var a=L(u),o=f+"\0"+a;n.has(o)||n.add(o);const x=l.some(y=>y.type==="date")?"mixed-date":l.some(y=>y.type==="text")?"mixed-text":"mixed";t.push({type:x,key:f,slots:l,element:u,context:a,original:f,originalHTML:u.innerHTML})}}return t}function ne(e){if(i.scanStopped)return Promise.resolve({ok:!0,registered:0,keyMap:{}});var r=new Set,t=[];return e.forEach(function(n){var a=n.key+"\0"+(n.context||"");r.has(a)||n.varSlots&&n.varSlots.length>0&&/\{\{(?:text|number|decimal|date):\d+\}\}/.test(n.key)||(r.add(a),t.push({key:n.key,context:n.context||""}),n.slots&&n.slots.length>0&&n.slots.forEach(function(o){if(o.type==="text"&&o.value&&!E(o.value)){var s=o.value+"\0";r.has(s)||(r.add(s),t.push({key:o.value,context:""}))}}))}),fetch(i.apiBase+"/api/textnodes",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":i.apiKey},body:JSON.stringify({keys:t,url:window.location.href})}).then(function(n){return n.json()})}function qe(e){var r=i.apiBase+"/api/translations?lang="+encodeURIComponent(e);return fetch(r,{headers:{"X-API-Key":i.apiKey}}).then(function(t){return t.json()}).then(function(t){var n={};return Array.isArray(t)?t.forEach(function(a){n[a.key+"\0"+(a.context||"")]=a.value,n.hasOwnProperty(a.key)||(n[a.key]=a.value)}):n=t,n})}function Ge(){if(!(i.fileMode||!i.screenshotsEnabled)){var e=document.createElement("script");e.src=i.apiBase+"/cdn/html2canvas.min.js",e.onload=function(){typeof html2canvas=="function"&&html2canvas(document.body,{scale:.35,logging:!1,useCORS:!0,allowTaint:!0,width:window.innerWidth,height:window.innerHeight,windowWidth:window.innerWidth,windowHeight:window.innerHeight}).then(function(r){var t=r.toDataURL("image/jpeg",.5),n=t.split(",")[1];!n||n.length>5e5||fetch(i.apiBase+"/api/screenshots",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":i.apiKey},body:JSON.stringify({url:window.location.href,screenshot:n})}).catch(function(){})}).catch(function(){})},e.onerror=function(){},document.head.appendChild(e)}}function Je(e,r){return e.replace(/\{\{(text|number|decimal|date):(\d+)\}\}/g,(t,n,a)=>{const o=r[parseInt(a)];return o?n==="date"?o.display:o.value:t})}function De(e){if(!Array.isArray(e))return e;var r={};return e.forEach(function(t){r[t.key+"\0"+(t.context||"")]=t.value,r.hasOwnProperty(t.key)||(r[t.key]=t.value)}),r}function ye(e,r){let t=0,n=0;return e.forEach(a=>{const o=a.key+"\0"+(a.context||"");var s=r[o]||r[a.key];if(!s&&a.slots&&a.slots.length>0){var h=a.slots.some(function(d){if(d.type!=="text"||!d.value)return!1;var p=d.value+"\0"+(a.context||""),f=d.value+"\0";return r.hasOwnProperty(p)||r.hasOwnProperty(f)||r.hasOwnProperty(d.value)});h&&(s=a.key)}if(!s){n++;return}if(a.type==="input-value"&&a.element)try{a.element.value=s,a.element.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to input value",d),n++;return}if(a.type==="input-attr"&&a.element&&a.attr)try{a.element.setAttribute(a.attr,s),a.element.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to input attr",d),n++;return}if(a.type==="text"&&a.textNode)try{var m=s;a.varSlots&&a.varSlots.length>0&&(m=m.replace(/\{\{(text|number|decimal|date):(\d+)\}\}/g,function(d,p,f){var l=a.varSlots.find(function(g){return(g.type||"text")===p&&g.index===+f});return l||(l=a.varSlots[+f]),l?l.originalText:d})),m=m.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g,""),a.textNode.nodeValue=m,a.textNode.parentElement&&a.textNode.parentElement.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to text node",d),n++;return}if(a.element){try{const d=Je(s,a.slots);let p=s;var c={};a.slots.forEach(f=>{const l=`{{${f.type}:${f.index}}}`;if(f.type==="date"&&f.node)f.node.textContent=f.display,c[l]=f.node.outerHTML;else if(f.node){if(f.type==="text"&&f.value){var g=f.value+"\0"+(a.context||""),v=f.value+"\0",x=r[g]||r[v]||r[f.value];x&&(f.node.textContent=x)}c[l]=f.node.outerHTML}}),a.varSlots&&a.varSlots.length>0&&a.varSlots.forEach(function(f){var l="{{"+f.type+":"+f.index+"}}";c.hasOwnProperty(l)||(c[l]=Ae(f.originalText))});var u=p.split(/(\{\{(?:text|number|decimal|date):\d+\}\})/g);p=u.map(function(f){return c.hasOwnProperty(f)?c[f]:/^\{\{(?:text|number|decimal|date):\d+\}\}$/.test(f)?"":Ae(f)}).join(""),a.element.innerHTML=p,a.element.setAttribute("data-loco-translated",""),t++}catch(d){console.warn("[translate] Could not apply mixed translation",d),n++}return}n++}),{applied:t,skipped:n}}async function re(e,r,t){t||(t=100);for(var n=0,a=0,o=0;o<e.length;o+=t){o>0&&await new Promise(function(m){setTimeout(m,0)});var s=e.slice(o,o+t),h=ye(s,r);n+=h.applied,a+=h.skipped}return{applied:n,skipped:a}}function C(e){let r=0;e.forEach(t=>{try{t.type==="input-value"&&t.element?(t.element.value=t.original,t.element.removeAttribute("data-loco-translated"),r++):t.type==="input-attr"&&t.element&&t.attr?(t.element.setAttribute(t.attr,t.original),t.element.removeAttribute("data-loco-translated"),r++):t.type==="text"&&t.textNode&&(t.textNode.nodeValue=t.original,t.textNode.parentElement&&t.textNode.parentElement.removeAttribute("data-loco-translated"),r++)}catch(n){console.warn("[translate] Could not restore text node",n)}}),e.forEach(t=>{if(t.type!=="text")try{t.element&&t.originalHTML!==void 0&&(t.element.innerHTML=t.originalHTML,t.element.removeAttribute("data-loco-translated"),r++)}catch(n){console.warn("[translate] Could not restore node",n)}}),console.log("[loco] untranslated "+r+" phrase(s)")}function ae(e,r){const t=new Set(e),n=[];Object.values(r).forEach(function(l){if(l&&(t.add(l),/\{\{(text|number|decimal|date):\d+\}\}/.test(l))){var g=l.split(/\{\{(?:text|number|decimal|date):\d+\}\}/g),v=g.map(function(x){return x.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")});n.push(new RegExp("^"+v.join(".+")+"$"))}});function a(l){if(t.has(l))return!0;for(var g=0;g<n.length;g++)if(n[g].test(l))return!0;return!1}let o=[],s=null,h=null,m=new Set,c=null,u=!1;function d(){if(o.length!==0){var l=o.splice(0);i.fileMode||ne(l).then(function(g){g&&g.keyMap&&(Y(l,g.keyMap),u=!0,ye(l,r),c&&c.takeRecords(),u=!1)}).catch(function(){})}}function p(l){const g=Oe(l);g.forEach(v=>{var x=v.key+"\0"+(v.context||"");a(v.key)||t.has(x)||(t.add(x),t.add(v.key),o.push(v),i.phrases.push(v))}),R(g,Object.keys(r)),u=!0,ye(g,r),c&&c.takeRecords(),u=!1,i.fileMode||(clearTimeout(s),s=setTimeout(d,500))}function f(l){m.add(l),h||(h=requestAnimationFrame(function(){h=null;var g=Array.from(m);m.clear(),g.forEach(function(v){v.isConnected&&p(v)})}))}return c=new MutationObserver(l=>{if(!u){var g=[],v=new Set;for(const y of l)for(const b of y.addedNodes)if(b.nodeType===Node.ELEMENT_NODE)g.push(b);else if(b.nodeType===Node.TEXT_NODE){var x=b.parentElement;x&&x.isConnected&&v.add(x)}g.forEach(function(y){p(y)}),v.forEach(function(y){f(y)})}}),c.observe(document.body,{childList:!0,subtree:!0}),c}var Pe="loco",Ze=2;function X(){return new Promise(function(e,r){try{var t=indexedDB.open(Pe,Ze);t.onupgradeneeded=function(n){var a=n.target.result;a.objectStoreNames.contains("meta")&&n.oldVersion<2&&a.deleteObjectStore("meta"),a.objectStoreNames.contains("meta")||a.createObjectStore("meta",{keyPath:"key"}),a.objectStoreNames.contains("translations")||a.createObjectStore("translations",{keyPath:"lang"})},t.onsuccess=function(n){e(n.target.result)},t.onerror=function(){r(t.error)}}catch(n){r(n)}})}function ie(){return X().then(function(e){return new Promise(function(r,t){var n=e.transaction("meta","readonly"),a=n.objectStore("meta").get("registry");a.onsuccess=function(){e.close();var o=a.result;r(o?{languages:o.languages||[],languageNames:o.languageNames||{}}:null)},a.onerror=function(){e.close(),t(a.error)}})})}function Ie(e){var r="source:"+e;return X().then(function(t){return new Promise(function(n,a){var o=t.transaction("meta","readonly"),s=o.objectStore("meta").get(r);s.onsuccess=function(){t.close();var h=s.result;n(h?{url:h.url,timestamp:h.timestamp,storedAt:h.storedAt}:null)},s.onerror=function(){t.close(),a(s.error)}})})}function ze(e){return X().then(function(r){return new Promise(function(t,n){var a=r.transaction("translations","readonly"),o=a.objectStore("translations").get(e);o.onsuccess=function(){r.close();var s=o.result;t(s?s.data:null)},o.onerror=function(){r.close(),n(o.error)}})})}function Ye(){return X().then(function(e){return new Promise(function(r,t){var n=e.transaction(["meta","translations"],"readonly"),a=n.objectStore("meta"),o=a.get("registry");o.onsuccess=function(){var s=o.result;if(!s||!s.languages||s.languages.length===0){e.close(),r(null);return}var h=U(),m=h||s.languages[0],c=n.objectStore("translations").get(m);c.onsuccess=function(){e.close();var u=c.result;if(!u||!u.data){r(null);return}var d={};d[m]=u.data,r({languages:s.languages,languageNames:s.languageNames||{},translations:d})},c.onerror=function(){e.close(),t(c.error)}},o.onerror=function(){e.close(),t(o.error)}})})}function oe(e,r,t){var n=r.languages||[],a=r.languageNames||{},o=r.translations||{},s=r.timestamp||0;return X().then(function(h){return new Promise(function(m,c){var u=h.transaction(["meta","translations"],"readwrite"),d=u.objectStore("meta"),p=u.objectStore("translations"),f=d.get("registry");f.onsuccess=function(){var l=f.result,g,v;if(t&&l){var x=l.languages||[];g=x.slice();for(var y=0;y<n.length;y++)g.indexOf(n[y])===-1&&g.push(n[y]);v={};var b=l.languageNames||{},T;for(T in b)v[T]=b[T];for(T in a)v[T]=a[T]}else g=n,v=a;d.put({key:"registry",languages:g,languageNames:v}),d.put({key:"source:"+e,url:e,timestamp:s,storedAt:Date.now()});for(var S=0;S<n.length;S++)o[n[S]]&&(t&&Array.isArray(o[n[S]])?function(w){var K=p.get(w);K.onsuccess=function(){var O=K.result,Q=O&&Array.isArray(O.data)?O.data:null,W=o[w];if(Q){for(var Ke="\0",$={},de=[],V=0;V<Q.length;V++){var be=Q[V].key+Ke+(Q[V].context||"");$.hasOwnProperty(be)||de.push(be),$[be]=Q[V]}for(var q=0;q<W.length;q++){var Te=W[q].key+Ke+(W[q].context||"");$.hasOwnProperty(Te)||de.push(Te),$[Te]=W[q]}for(var Ue=[],Ne=0;Ne<de.length;Ne++)Ue.push($[de[Ne]]);p.put({lang:w,data:Ue})}else p.put({lang:w,data:W})}}(n[S]):p.put({lang:n[S],data:o[n[S]]}))},u.oncomplete=function(){h.close(),m()},u.onerror=function(){h.close(),c(u.error)}})})}function et(){return new Promise(function(e){var r=indexedDB.deleteDatabase(Pe);r.onsuccess=function(){e()},r.onerror=function(){e()},r.onblocked=function(){e()}})}var tt='<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><clipPath id="loco-wc"><circle cx="100" cy="100" r="90"/></clipPath></defs><circle cx="100" cy="100" r="90" fill="#1a1f2e"/><g clip-path="url(#loco-wc)"><g transform="translate(100,108) scale(0.72) translate(-334,-198)"><ellipse cx="310" cy="318" rx="10" ry="38" fill="#2ECC88" transform="rotate(-18 310 318)"/><ellipse cx="326" cy="326" rx="9" ry="42" fill="#34D99A" transform="rotate(-6 326 326)"/><ellipse cx="342" cy="328" rx="9" ry="42" fill="#7BC74A" transform="rotate(6 342 328)"/><ellipse cx="357" cy="320" rx="9" ry="36" fill="#F07040" transform="rotate(18 357 320)"/><ellipse cx="334" cy="240" rx="62" ry="80" fill="#2ECC88"/><ellipse cx="334" cy="252" rx="36" ry="52" fill="#D4F4B0"/><path d="M275 220 Q228 190 232 265 Q248 295 280 285 Q268 255 275 220Z" fill="#3A8FE0"/><path d="M277 225 Q238 208 240 262 Q252 285 278 277 Q268 252 277 225Z" fill="#6BB3FF" opacity="0.7"/><path d="M393 220 Q440 190 436 265 Q420 295 388 285 Q400 255 393 220Z" fill="#3A8FE0"/><path d="M391 225 Q430 208 428 262 Q416 285 390 277 Q400 252 391 225Z" fill="#6BB3FF" opacity="0.7"/><ellipse cx="334" cy="172" rx="38" ry="30" fill="#2ECC88"/><circle cx="334" cy="148" r="52" fill="#2ECC88"/><ellipse cx="334" cy="118" rx="30" ry="18" fill="#FFB833"/><circle cx="312" cy="138" r="14" fill="white"/><circle cx="315" cy="140" r="9" fill="#2C2C2A"/><circle cx="315" cy="140" r="4" fill="#04342C"/><circle cx="319" cy="136" r="3.5" fill="white"/><circle cx="356" cy="138" r="14" fill="white"/><circle cx="353" cy="140" r="9" fill="#2C2C2A"/><circle cx="353" cy="140" r="4" fill="#04342C"/><circle cx="357" cy="136" r="3.5" fill="white"/><path d="M326 155 Q334 144 342 155 Q342 170 334 173 Q326 170 326 155Z" fill="#E8A020"/><path d="M328 165 Q334 158 340 165 Q340 174 334 176 Q328 174 328 165Z" fill="#A06010"/><ellipse cx="302" cy="152" rx="12" ry="8" fill="#F07040" opacity="0.8"/><ellipse cx="366" cy="152" rx="12" ry="8" fill="#F07040" opacity="0.8"/><path d="M320 100 Q316 68 308 52" stroke="#FFB833" stroke-width="6" fill="none" stroke-linecap="round"/><path d="M334 97 Q334 64 334 46" stroke="#7BC74A" stroke-width="6" fill="none" stroke-linecap="round"/><path d="M348 100 Q352 68 360 52" stroke="#F07040" stroke-width="6" fill="none" stroke-linecap="round"/><circle cx="308" cy="50" r="8" fill="#FFB833"/><circle cx="334" cy="44" r="8" fill="#7BC74A"/><circle cx="360" cy="50" r="8" fill="#F07040"/><rect x="260" y="330" width="168" height="10" rx="5" fill="#8B5E20"/><path d="M310 330 L300 350 M310 330 L315 352 M310 330 L325 348" stroke="#A07030" stroke-width="4" fill="none" stroke-linecap="round"/><path d="M360 330 L350 350 M360 330 L365 352 M360 330 L375 348" stroke="#A07030" stroke-width="4" fill="none" stroke-linecap="round"/></g></g></svg>',xe=null;function se(e,r){xe=r;var t=document.getElementById("loco-lang-widget");t&&t.remove();var n={},a=e.map(function(l){return typeof l=="object"&&l.code?(l.name&&(n[l.code]=l.name),l.code):l});function o(l){return n[l]||l}var s=U()||null,h=document.createElement("div");h.id="loco-lang-widget",h.setAttribute("data-notranslate","");var m={"bottom-right":"bottom:20px;right:20px;","bottom-left":"bottom:20px;left:20px;","top-right":"top:20px;right:20px;","top-left":"top:20px;left:20px;"};h.style.cssText='position:fixed;z-index:2147483647;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:14px;'+(m[r]||m["bottom-right"]);var c=document.createElement("button");c.innerHTML=tt,c.style.cssText="width:52px;height:52px;border-radius:50%;border:none;background:#1a1f2e;color:#fff;font-size:22px;cursor:pointer;box-shadow:0 4px 14px rgba(0,0,0,0.25);display:flex;align-items:center;justify-content:center;transition:transform 0.2s,box-shadow 0.2s;overflow:hidden;padding:0;",c.onmouseenter=function(){c.style.transform="scale(1.1)",c.style.boxShadow="0 6px 20px rgba(0,0,0,0.35)"},c.onmouseleave=function(){c.style.transform="scale(1)",c.style.boxShadow="0 4px 14px rgba(0,0,0,0.25)"};var u=document.createElement("div");u.style.cssText="display:none;position:absolute;"+(r.indexOf("bottom")===0?"bottom:56px;":"top:56px;")+(r.indexOf("right")>=0?"right:0;":"left:0;")+"background:#fff;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,0.18);min-width:200px;max-height:320px;overflow-y:auto;padding:6px 0;";var d=document.createElement("div");d.textContent="Original",d.style.cssText="padding:10px 16px;cursor:pointer;color:#333;transition:background 0.15s;font-weight:600;border-bottom:1px solid #eee;",d.onmouseenter=function(){d.style.background="#f5f5f5"},d.onmouseleave=function(){d.style.background="transparent"},d.onclick=function(){s=null,window.Loco.restore(),f(),u.style.display="none"},u.appendChild(d);var p=[];a.forEach(function(l){var g=document.createElement("div");g.textContent=o(l),g.setAttribute("data-lang",l),g.style.cssText="padding:10px 16px;cursor:pointer;color:#333;transition:background 0.15s;",g.onmouseenter=function(){g.style.background="#f5f5f5"},g.onmouseleave=function(){g.style.background=s===l?"#e8f0fe":"transparent"},g.onclick=function(){s=l,window.Loco.apply(l),f(),u.style.display="none"},u.appendChild(g),p.push({el:g,code:l})});function f(){d.style.background=s===null?"#e8f0fe":"transparent",d.style.fontWeight=s===null?"600":"400",p.forEach(function(l){l.el.style.background=s===l.code?"#e8f0fe":"transparent",l.el.style.fontWeight=s===l.code?"600":"400"})}c.onclick=function(l){l.stopPropagation(),u.style.display=u.style.display==="none"?"block":"none"},document.addEventListener("click",function(l){h.contains(l.target)||(u.style.display="none")}),f(),h.appendChild(u),h.appendChild(c),document.body.appendChild(h)}function nt(e){xe&&(!e||e.length===0||se(e,xe))}var _={__proto__:1,constructor:1,prototype:1};function Re(e){if(!e||typeof e!="string")return!1;if(e.charAt(0)==="/"||e.charAt(0)===".")return!0;try{var r=new URL(e,window.location.origin);return r.protocol==="http:"||r.protocol==="https:"}catch{return!1}}function le(e){if(!e||typeof e!="object"||Array.isArray(e))return null;if(Array.isArray(e._raw)){for(var r={},t={},n=0;n<e._raw.length;n++){var a=e._raw[n];!a||typeof a.l!="string"||typeof a.k!="string"||typeof a.v!="string"||(r[a.l]||(r[a.l]=!0,t[a.l]=[]),t[a.l].push({key:a.k,context:typeof a.c=="string"?a.c:"",value:a.v}))}e={languages:Object.keys(r).sort(),languageNames:{},translations:t,timestamp:0}}var o={};if(!Array.isArray(e.languages))return null;o.languages=[];for(var s=0;s<e.languages.length;s++){if(typeof e.languages[s]!="string"||e.languages[s].length>20)return null;o.languages.push(e.languages[s])}if(o.timestamp=typeof e.timestamp=="number"&&isFinite(e.timestamp)?e.timestamp:0,o.languageNames={},e.languageNames&&typeof e.languageNames=="object"&&!Array.isArray(e.languageNames))for(var h in e.languageNames)!e.languageNames.hasOwnProperty(h)||_[h]||typeof e.languageNames[h]=="string"&&e.languageNames[h].length<=100&&(o.languageNames[h]=e.languageNames[h]);if(o.translations={},e.translations&&typeof e.translations=="object"&&!Array.isArray(e.translations)){for(var m in e.translations)if(!(!e.translations.hasOwnProperty(m)||_[m])&&o.languages.indexOf(m)!==-1){var c=e.translations[m];if(Array.isArray(c)){for(var u=[],d=0;d<c.length;d++){var p=c[d];!p||typeof p!="object"||typeof p.key!="string"||typeof p.value!="string"||p.key.length>G||p.value.length>G||_[p.key]||u.push({key:p.key,value:p.value,context:typeof p.context=="string"?p.context:""})}o.translations[m]=u}else if(typeof c=="object"){var f={};for(var l in c)!c.hasOwnProperty(l)||_[l]||typeof c[l]=="string"&&(l.length>G||c[l].length>G||(f[l]=c[l]));o.translations[m]=f}}}return o}async function _e(){try{var e=await fetch(i.apiBase+"/api/project/crawler-config",{headers:{"X-API-Key":i.apiKey}});e.ok&&Be(await e.json())}catch{}Ce(),i.phrases=await j(document.body),ne(i.phrases).then(function(t){t&&t.keyMap&&Y(i.phrases,t.keyMap)}).catch(function(t){console.warn("[loco] Failed to register keys:",t)}),!i.scanStopped&&i.screenshotsEnabled&&setTimeout(Ge,3e3),console.log("[loco] "+i.phrases.length+" text nodes discovered"),console.log(` Loco.textnodes() — list all discovered text nodes
2
2
  Loco.apply("zh-Hans") — apply translations for a language
3
3
  Loco.restore() — revert to original text
4
- Loco.rescan() — re-scan DOM for new nodes`);var r=U();r?M.apply(r):i.observer=ae(i.phrases.map(function(t){return t.key+"\0"+(t.context||"")}),{})}function rt(e,r){for(var t="\0",n={},a=[],o=0;o<e.length;o++){var s=e[o],h=s.key+t+(s.context||"");n.hasOwnProperty(h)||a.push(h),n[h]=s}for(var v=0;v<r.length;v++){var c=r[v],u=c.key+t+(c.context||"");n.hasOwnProperty(u)||a.push(u),n[u]=c}for(var d=[],p=0;p<a.length;p++)d.push(n[a[p]]);return d}async function ce(e){i.screenshotsEnabled=!1,Ce(),i.phrases=await j(document.body);var r=[],t=i.fileData.translations||{},n=(i.fileData.languages||[])[0];n&&t[n]&&(t[n]=De(t[n]),r=Object.keys(t[n]));var a=R(i.phrases,r),o=a?Object.keys(a).length:0,s=(i.fileData.languages||[]).length;console.log("[loco] (file mode) "+i.phrases.length+" text nodes discovered, "+s+" language(s) available"+(o?", "+o+" var-remapped":"")+" ["+e+"]"),console.log(" Languages: "+(i.fileData.languages||[]).join(", "));var h=U();h?M.apply(h):i.observer=ae(i.phrases.map(function(v){return v.key+"\0"+(v.context||"")}),{})}async function Me(e){try{indexedDB.deleteDatabase("loco-translations")}catch{}try{indexedDB.deleteDatabase("loco-meta")}catch{}try{indexedDB.databases&&indexedDB.databases().then(function(t){t.forEach(function(n){if(n.name&&n.name.indexOf("loco-tr-")===0)try{indexedDB.deleteDatabase(n.name)}catch{}})}).catch(function(){})}catch{}i.fileUrls=e;var r=null;try{r=await Ye()}catch{}r&&r.translations?(i.fileData={languages:r.languages,languageNames:r.languageNames||{},translations:r.translations,timestamp:0},i.loadedFromCache=!0,await ce("cache"),i.fileReadyResolve&&(i.fileReadyResolve(),i.fileReadyResolve=null),it(e)):(await at(e),await ce("network"),i.fileReadyResolve&&(i.fileReadyResolve(),i.fileReadyResolve=null))}async function at(e){for(var r=e.map(function(v){return fetch(v).then(function(c){if(!c.ok)throw new Error("HTTP "+c.status+" for "+v);return c.text()}).then(function(c){if(!c||!c.trim())return null;var u;try{u=JSON.parse(c)}catch{return null}var d=le(u);return d?{url:v,data:d}:(console.warn("[loco] File rejected (invalid schema): "+v),null)}).catch(function(c){return console.warn("[loco] Failed to load "+v+":",c),null})}),t=await Promise.all(r),n=!0,a=0;a<t.length;a++)if(t[a]){var o=t[a].url,s=t[a].data,h=!n||(s.languages||[]).length===1;ue(s,n),n=!1;try{await oe(o,s,h)}catch{}}i.loadedFromCache=!1}function ue(e,r){if(!i.fileData||r){i.fileData={languages:(e.languages||[]).slice(),languageNames:Object.assign({},e.languageNames||{}),translations:Object.assign({},e.translations||{}),timestamp:e.timestamp||0};return}for(var t=e.languages||[],n=0;n<t.length;n++)i.fileData.languages.indexOf(t[n])===-1&&i.fileData.languages.push(t[n]);var a=e.languageNames||{};i.fileData.languageNames||(i.fileData.languageNames={});for(var o in a)!a.hasOwnProperty(o)||_[o]||(i.fileData.languageNames[o]=a[o]);var s=e.translations||{};i.fileData.translations||(i.fileData.translations={});for(var h in s)if(!(!s.hasOwnProperty(h)||_[h])){var v=i.fileData.translations[h],c=s[h];!v||!Array.isArray(v)||!Array.isArray(c)?i.fileData.translations[h]=c:i.fileData.translations[h]=rt(v,c)}e.timestamp&&e.timestamp>i.fileData.timestamp&&(i.fileData.timestamp=e.timestamp)}function it(e){var r=e.map(function(t){return Promise.all([Ie(t).catch(function(){return null}),fetch(t).then(function(n){return n.ok?n.text():null}).catch(function(){return null})]).then(function(n){var a=n[0],o=n[1];if(!o||!o.trim())return null;var s;try{s=JSON.parse(o)}catch{return null}if(s=le(s),!s)return null;var h=s.timestamp||0,v=a&&a.timestamp||0;if(h!==v){var c=e.length>1||(s.languages||[]).length===1;return oe(t,s,c).catch(function(){}),s}return null})});Promise.all(r).then(function(t){for(var n=!1,a=0;a<t.length;a++)t[a]&&(ue(t[a],!1),n=!0);n&&(i.loadedFromCache=!1,i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),ce("network — updated").then(function(){Ee()}),console.log("[loco] translations refreshed from file(s) (timestamp changed)"))}).catch(function(){console.log("[loco] using cached translations (network unavailable)")})}function Ee(){i.widgetPosition&&ie().then(function(e){if(e){var r=fe(e.languages,e.languageNames);nt(r)}}).catch(function(){})}function fe(e,r){return e=e||[],r=r||{},e.map(function(t){return r[t]?{code:t,name:r[t]}:t})}var M={init:function(e){if(!e){console.warn("[loco] Loco.init() requires a config object");return}if(e.file||e.files){i.fileMode=!0,i.fileReady=new Promise(function(n){i.fileReadyResolve=n});for(var r=e.files?e.files.slice():[e.file],t=0;t<r.length;t++)if(!Re(r[t])){console.warn("[loco] Blocked unsafe URL: "+r[t]);return}i.fileUrl=r[0],document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){Me(r)}):Me(r);return}if(!e.apiKey){console.warn("[loco] Loco.init() requires { apiKey } or { file }");return}if(!e.apiUrl){console.warn("[loco] Loco.init() requires { apiUrl }");return}i.apiKey=e.apiKey,i.apiBase=e.apiUrl.replace(/\/+$/,""),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",_e):_e()},apply:async function(e){if(!e){console.warn('[loco] Loco.apply() requires a language code, e.g. Loco.apply("zh-Hans")');return}if(typeof e!="string"||e.length>20||!/^[a-zA-Z0-9\-_]+$/.test(e)){console.warn("[loco] Invalid language code: "+e);return}if(i.fileMode){if(!i.fileData){console.warn("[loco] File not loaded yet. Call Loco.init({ file }) first.");return}if(!i.fileData.translations||!i.fileData.translations[e])try{var r=await ze(e);if(!r||Object.keys(r).length===0){console.warn('[loco] No translations for "'+e+'" in file data or cache');return}return i.fileData.translations||(i.fileData.translations={}),i.fileData.translations[e]=r,i.fileData.languages.indexOf(e)===-1&&i.fileData.languages.push(e),M.apply(e)}catch(o){console.warn('[loco] Failed to load translations for "'+e+'" from cache:',o);return}i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),i.translations=De(i.fileData.translations[e]),i.fileData.translations[e]=i.translations,i.phrases=await j(document.body);var t=Object.keys(i.translations);R(i.phrases,t);var n=await re(i.phrases,i.translations);return i.observer=ae(i.phrases.map(function(o){return o.key+"\0"+(o.context||"")}),i.translations),J(e),console.log("[loco] (file) applied "+n.applied+" translation(s), "+n.skipped+" pending"),n}if(!i.apiKey||!i.apiBase){console.warn("[loco] Call Loco.init() first");return}i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases);try{var a=await qe(e);i.translations=a||{},i.phrases=await j(document.body),R(i.phrases,Object.keys(i.translations)),ne(i.phrases).then(function(s){s&&s.keyMap&&(Y(i.phrases,s.keyMap),re(i.phrases,i.translations))}).catch(function(){});var n=await re(i.phrases,i.translations);return i.observer=ae(i.phrases.map(function(s){return s.key+"\0"+(s.context||"")}),i.translations),J(e),console.log("[loco] applied "+n.applied+" translation(s), "+n.skipped+" pending"),n}catch(o){console.warn("[loco] Failed to fetch translations:",o)}},restore:function(){C(i.phrases),i.observer&&i.observer.disconnect(),J(null)},rescan:async function(){var e=Object.keys(i.translations).length>0;e&&C(i.phrases),i.phrases=await j(document.body),i.fileMode||ne(i.phrases).catch(function(){}),e&&(R(i.phrases,Object.keys(i.translations)),await re(i.phrases,i.translations))},textnodes:function(){return i.phrases.map(function(e){return{key:e.key,context:e.context||"",element:e.element}})},stopScan:function(){i.scanStopped=!0,i.observer&&(i.observer.disconnect(),i.observer=null),console.log("[loco] scanning stopped, no further nodes will be sent to dashboard")},startScan:function(){i.scanStopped=!1,console.log("[loco] scanning resumed")},isFileMode:function(){return i.fileMode},languages:function(){if(i.fileMode){var e=function(){var r=i.fileData?i.fileData.languages||[]:[],t=i.fileData&&i.fileData.languageNames||{};return r.map(function(n){return{code:n,name:t[n]||n}})};return!i.fileData&&i.fileReady?i.fileReady.then(function(){return ie().then(function(r){return r&&r.languages&&r.languages.length>0?fe(r.languages,r.languageNames):e()}).catch(function(){return e()})}):ie().then(function(r){return r&&r.languages&&r.languages.length>0?fe(r.languages,r.languageNames):e()}).catch(function(){return e()})}return!i.apiKey||!i.apiBase?Promise.resolve([]):fetch(i.apiBase+"/api/languages",{headers:{"X-API-Key":i.apiKey}}).then(function(r){return r.json()}).then(function(r){return Array.isArray(r)?r:[]}).catch(function(){return[]})},widget:function(e){e=e||{};var r=e.position||"bottom-right";if(i.widgetPosition=r,i.fileMode){let t=function(){ie().then(function(a){var o;if(a&&a.languages&&a.languages.length>0?o=fe(a.languages,a.languageNames):o=n(),o.length===0){console.warn("[loco] No languages found in translation file or cache");return}se(o,r)}).catch(function(){var a=n();if(a.length===0){console.warn("[loco] No languages found in translation file");return}se(a,r)})},n=function(){var a=i.fileData?i.fileData.languages||[]:[],o=i.fileData&&i.fileData.languageNames||{};return a.map(function(s){return o[s]?{code:s,name:o[s]}:s})};if(!i.fileData&&i.fileReady){i.fileReady.then(t);return}t();return}if(!i.apiKey||!i.apiBase){console.warn("[loco] Call Loco.init() first");return}fetch(i.apiBase+"/api/languages",{headers:{"X-API-Key":i.apiKey}}).then(function(t){return t.json()}).then(function(t){if(!Array.isArray(t)||t.length===0){console.warn("[loco] No languages found — add translations in the dashboard first");return}se(t,r)}).catch(function(t){console.warn("[loco] Failed to fetch languages:",t)})},clearCache:function(){return i.fileMode?et().then(function(){i.fileData&&(i.fileData.translations={},i.fileData.timestamp=0),i.loadedFromCache=!1,J(null),C(i.phrases),i.observer&&(i.observer.disconnect(),i.observer=null),console.log("[loco] IndexedDB cache cleared — call pullLatest() to re-fetch")}).catch(function(e){console.warn("[loco] Failed to clear cache:",e)}):(console.warn("[loco] clearCache() is only available in file mode"),Promise.resolve())},addFile:function(e){return i.fileMode?e?Re(e)?(i.fileUrls.indexOf(e)===-1&&i.fileUrls.push(e),fetch(e).then(function(r){if(!r.ok)throw new Error("HTTP "+r.status);return r.text()}).then(function(r){if(!r||!r.trim())throw new Error("Empty file");var t;try{t=JSON.parse(r)}catch{throw new Error("Invalid JSON")}if(t=le(t),!t)throw new Error("Invalid file schema");var n=!i.fileData||!i.fileData.languages||i.fileData.languages.length===0,a=!n||(t.languages||[]).length===1;return ue(t,n),oe(e,t,a).catch(function(){}),Ee(),console.log("[loco] added file: "+e+" ("+(t.languages||[]).join(", ")+")"),{status:"added",languages:t.languages||[]}}).catch(function(r){return console.warn("[loco] addFile() failed:",r),{status:"error",reason:r.message}})):(console.warn("[loco] Blocked unsafe URL: "+e),Promise.resolve({status:"error",reason:"unsafe URL"})):Promise.resolve({status:"error",reason:"no URL provided"}):(console.warn("[loco] addFile() is only available in file mode"),Promise.resolve({status:"error",reason:"not in file mode"}))},pullLatest:function(){if(!i.fileMode)return console.warn("[loco] pullLatest() is only available in file mode"),Promise.resolve({status:"skipped",reason:"not in file mode"});var e=i.fileUrls.length>0?i.fileUrls:i.fileUrl?[i.fileUrl]:[];if(e.length===0)return console.warn("[loco] No file URL(s) configured. Call Loco.init({ file }) first."),Promise.resolve({status:"error",reason:"no file URLs"});var r=e.map(function(t){return Promise.all([Ie(t).catch(function(){return null}),fetch(t).then(function(n){if(!n.ok)throw new Error("HTTP "+n.status);return n.text()})]).then(function(n){var a=n[0],o=n[1];if(!o||!o.trim())return{url:t,status:"current",reason:"empty"};var s;try{s=JSON.parse(o)}catch{throw new Error("Invalid JSON in "+t)}if(s=le(s),!s)throw new Error("Invalid file schema in "+t);var h=s.timestamp||0,v=a&&a.timestamp||0;if(h===v&&v!==0){var c=i.fileData&&i.fileData.translations,u=s.languages||[],d=!c||u.some(function(l){return!i.fileData.translations[l]});if(!d)return{url:t,status:"current",timestamp:v}}var p=!i.fileData||!i.fileData.languages||i.fileData.languages.length===0,f=!p||(s.languages||[]).length===1;return ue(s,p),oe(t,s,f).catch(function(){}),{url:t,status:"updated",timestamp:h,previousTimestamp:v}}).catch(function(n){return{url:t,status:"error",reason:n.message}})});return Promise.all(r).then(async function(t){var n=t.some(function(u){return u.status==="updated"});if(n){i.loadedFromCache=!1;var a=U();if(a)i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),await ce("pullLatest");else{i.phrases=Oe(document.body);var o=i.fileData.translations||{},s=(i.fileData.languages||[])[0];s&&o[s]&&R(i.phrases,Object.keys(o[s]))}Ee()}if(t.length===1){var h=t[0];return console.log("[loco] pullLatest: "+h.status+(h.timestamp?" (timestamp: "+h.timestamp+")":"")),h}var v=t.filter(function(u){return u.status==="updated"}).map(function(u){return u.url}),c=t.filter(function(u){return u.status==="current"}).map(function(u){return u.url});return console.log("[loco] pullLatest: "+v.length+" updated, "+c.length+" current"),{status:n?"updated":"current",results:t}}).catch(function(t){return console.warn("[loco] pullLatest() failed:",t),{status:"error",reason:t.message}})}};return window.Loco=M,Object.defineProperty(M,"_state",{value:i,writable:!1,enumerable:!1,configurable:!1}),M}();
4
+ Loco.rescan() — re-scan DOM for new nodes`);var r=U();r?M.apply(r):i.observer=ae(i.phrases.map(function(t){return t.key+"\0"+(t.context||"")}),{})}function rt(e,r){for(var t="\0",n={},a=[],o=0;o<e.length;o++){var s=e[o],h=s.key+t+(s.context||"");n.hasOwnProperty(h)||a.push(h),n[h]=s}for(var m=0;m<r.length;m++){var c=r[m],u=c.key+t+(c.context||"");n.hasOwnProperty(u)||a.push(u),n[u]=c}for(var d=[],p=0;p<a.length;p++)d.push(n[a[p]]);return d}async function ce(e){i.screenshotsEnabled=!1,Ce(),i.phrases=await j(document.body);var r=[],t=i.fileData.translations||{},n=(i.fileData.languages||[])[0];n&&t[n]&&(t[n]=De(t[n]),r=Object.keys(t[n]));var a=R(i.phrases,r),o=a?Object.keys(a).length:0,s=(i.fileData.languages||[]).length;console.log("[loco] (file mode) "+i.phrases.length+" text nodes discovered, "+s+" language(s) available"+(o?", "+o+" var-remapped":"")+" ["+e+"]"),console.log(" Languages: "+(i.fileData.languages||[]).join(", "));var h=U();h?M.apply(h):i.observer=ae(i.phrases.map(function(m){return m.key+"\0"+(m.context||"")}),{})}async function Me(e){try{indexedDB.deleteDatabase("loco-translations")}catch{}try{indexedDB.deleteDatabase("loco-meta")}catch{}try{indexedDB.databases&&indexedDB.databases().then(function(t){t.forEach(function(n){if(n.name&&n.name.indexOf("loco-tr-")===0)try{indexedDB.deleteDatabase(n.name)}catch{}})}).catch(function(){})}catch{}i.fileUrls=e;var r=null;try{r=await Ye()}catch{}r&&r.translations?(i.fileData={languages:r.languages,languageNames:r.languageNames||{},translations:r.translations,timestamp:0},i.loadedFromCache=!0,await ce("cache"),i.fileReadyResolve&&(i.fileReadyResolve(),i.fileReadyResolve=null),it(e)):(await at(e),await ce("network"),i.fileReadyResolve&&(i.fileReadyResolve(),i.fileReadyResolve=null))}async function at(e){for(var r=e.map(function(m){return fetch(m).then(function(c){if(!c.ok)throw new Error("HTTP "+c.status+" for "+m);return c.text()}).then(function(c){if(!c||!c.trim())return null;var u;try{u=JSON.parse(c)}catch{return null}var d=le(u);return d?{url:m,data:d}:(console.warn("[loco] File rejected (invalid schema): "+m),null)}).catch(function(c){return console.warn("[loco] Failed to load "+m+":",c),null})}),t=await Promise.all(r),n=!0,a=0;a<t.length;a++)if(t[a]){var o=t[a].url,s=t[a].data,h=!n||(s.languages||[]).length===1;ue(s,n),n=!1;try{await oe(o,s,h)}catch{}}i.loadedFromCache=!1}function ue(e,r){if(!i.fileData||r){i.fileData={languages:(e.languages||[]).slice(),languageNames:Object.assign({},e.languageNames||{}),translations:Object.assign({},e.translations||{}),timestamp:e.timestamp||0};return}for(var t=e.languages||[],n=0;n<t.length;n++)i.fileData.languages.indexOf(t[n])===-1&&i.fileData.languages.push(t[n]);var a=e.languageNames||{};i.fileData.languageNames||(i.fileData.languageNames={});for(var o in a)!a.hasOwnProperty(o)||_[o]||(i.fileData.languageNames[o]=a[o]);var s=e.translations||{};i.fileData.translations||(i.fileData.translations={});for(var h in s)if(!(!s.hasOwnProperty(h)||_[h])){var m=i.fileData.translations[h],c=s[h];!m||!Array.isArray(m)||!Array.isArray(c)?i.fileData.translations[h]=c:i.fileData.translations[h]=rt(m,c)}e.timestamp&&e.timestamp>i.fileData.timestamp&&(i.fileData.timestamp=e.timestamp)}function it(e){var r=e.map(function(t){return Promise.all([Ie(t).catch(function(){return null}),fetch(t).then(function(n){return n.ok?n.text():null}).catch(function(){return null})]).then(function(n){var a=n[0],o=n[1];if(!o||!o.trim())return null;var s;try{s=JSON.parse(o)}catch{return null}if(s=le(s),!s)return null;var h=s.timestamp||0,m=a&&a.timestamp||0;if(h!==m){var c=e.length>1||(s.languages||[]).length===1;return oe(t,s,c).catch(function(){}),s}return null})});Promise.all(r).then(function(t){for(var n=!1,a=0;a<t.length;a++)t[a]&&(ue(t[a],!1),n=!0);n&&(i.loadedFromCache=!1,i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),ce("network — updated").then(function(){Ee()}),console.log("[loco] translations refreshed from file(s) (timestamp changed)"))}).catch(function(){console.log("[loco] using cached translations (network unavailable)")})}function Ee(){i.widgetPosition&&ie().then(function(e){if(e){var r=fe(e.languages,e.languageNames);nt(r)}}).catch(function(){})}function fe(e,r){return e=e||[],r=r||{},e.map(function(t){return r[t]?{code:t,name:r[t]}:t})}var M={version:"1.0.9",init:function(e){if(!e){console.warn("[loco] Loco.init() requires a config object");return}if(e.file||e.files){i.fileMode=!0,i.fileReady=new Promise(function(n){i.fileReadyResolve=n});for(var r=e.files?e.files.slice():[e.file],t=0;t<r.length;t++)if(!Re(r[t])){console.warn("[loco] Blocked unsafe URL: "+r[t]);return}i.fileUrl=r[0],document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){Me(r)}):Me(r);return}if(!e.apiKey){console.warn("[loco] Loco.init() requires { apiKey } or { file }");return}if(!e.apiUrl){console.warn("[loco] Loco.init() requires { apiUrl }");return}i.apiKey=e.apiKey,i.apiBase=e.apiUrl.replace(/\/+$/,""),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",_e):_e()},apply:async function(e){if(!e){console.warn('[loco] Loco.apply() requires a language code, e.g. Loco.apply("zh-Hans")');return}if(typeof e!="string"||e.length>20||!/^[a-zA-Z0-9\-_]+$/.test(e)){console.warn("[loco] Invalid language code: "+e);return}if(i.fileMode){if(!i.fileData){console.warn("[loco] File not loaded yet. Call Loco.init({ file }) first.");return}if(!i.fileData.translations||!i.fileData.translations[e])try{var r=await ze(e);if(!r||Object.keys(r).length===0){console.warn('[loco] No translations for "'+e+'" in file data or cache');return}return i.fileData.translations||(i.fileData.translations={}),i.fileData.translations[e]=r,i.fileData.languages.indexOf(e)===-1&&i.fileData.languages.push(e),M.apply(e)}catch(o){console.warn('[loco] Failed to load translations for "'+e+'" from cache:',o);return}i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),i.translations=De(i.fileData.translations[e]),i.fileData.translations[e]=i.translations,i.phrases=await j(document.body);var t=Object.keys(i.translations);R(i.phrases,t);var n=await re(i.phrases,i.translations);return i.observer=ae(i.phrases.map(function(o){return o.key+"\0"+(o.context||"")}),i.translations),J(e),console.log("[loco] (file) applied "+n.applied+" translation(s), "+n.skipped+" pending"),n}if(!i.apiKey||!i.apiBase){console.warn("[loco] Call Loco.init() first");return}i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases);try{var a=await qe(e);i.translations=a||{},i.phrases=await j(document.body),R(i.phrases,Object.keys(i.translations)),ne(i.phrases).then(function(s){s&&s.keyMap&&(Y(i.phrases,s.keyMap),re(i.phrases,i.translations))}).catch(function(){});var n=await re(i.phrases,i.translations);return i.observer=ae(i.phrases.map(function(s){return s.key+"\0"+(s.context||"")}),i.translations),J(e),console.log("[loco] applied "+n.applied+" translation(s), "+n.skipped+" pending"),n}catch(o){console.warn("[loco] Failed to fetch translations:",o)}},restore:function(){C(i.phrases),i.observer&&i.observer.disconnect(),J(null)},rescan:async function(){var e=Object.keys(i.translations).length>0;e&&C(i.phrases),i.phrases=await j(document.body),i.fileMode||ne(i.phrases).catch(function(){}),e&&(R(i.phrases,Object.keys(i.translations)),await re(i.phrases,i.translations))},textnodes:function(){return i.phrases.map(function(e){return{key:e.key,context:e.context||"",element:e.element}})},stopScan:function(){i.scanStopped=!0,i.observer&&(i.observer.disconnect(),i.observer=null),console.log("[loco] scanning stopped, no further nodes will be sent to dashboard")},startScan:function(){i.scanStopped=!1,console.log("[loco] scanning resumed")},isFileMode:function(){return i.fileMode},languages:function(){if(i.fileMode){var e=function(){var r=i.fileData?i.fileData.languages||[]:[],t=i.fileData&&i.fileData.languageNames||{};return r.map(function(n){return{code:n,name:t[n]||n}})};return!i.fileData&&i.fileReady?i.fileReady.then(function(){return ie().then(function(r){return r&&r.languages&&r.languages.length>0?fe(r.languages,r.languageNames):e()}).catch(function(){return e()})}):ie().then(function(r){return r&&r.languages&&r.languages.length>0?fe(r.languages,r.languageNames):e()}).catch(function(){return e()})}return!i.apiKey||!i.apiBase?Promise.resolve([]):fetch(i.apiBase+"/api/languages",{headers:{"X-API-Key":i.apiKey}}).then(function(r){return r.json()}).then(function(r){return Array.isArray(r)?r:[]}).catch(function(){return[]})},widget:function(e){e=e||{};var r=e.position||"bottom-right";if(i.widgetPosition=r,i.fileMode){let t=function(){ie().then(function(a){var o;if(a&&a.languages&&a.languages.length>0?o=fe(a.languages,a.languageNames):o=n(),o.length===0){console.warn("[loco] No languages found in translation file or cache");return}se(o,r)}).catch(function(){var a=n();if(a.length===0){console.warn("[loco] No languages found in translation file");return}se(a,r)})},n=function(){var a=i.fileData?i.fileData.languages||[]:[],o=i.fileData&&i.fileData.languageNames||{};return a.map(function(s){return o[s]?{code:s,name:o[s]}:s})};if(!i.fileData&&i.fileReady){i.fileReady.then(t);return}t();return}if(!i.apiKey||!i.apiBase){console.warn("[loco] Call Loco.init() first");return}fetch(i.apiBase+"/api/languages",{headers:{"X-API-Key":i.apiKey}}).then(function(t){return t.json()}).then(function(t){if(!Array.isArray(t)||t.length===0){console.warn("[loco] No languages found — add translations in the dashboard first");return}se(t,r)}).catch(function(t){console.warn("[loco] Failed to fetch languages:",t)})},clearCache:function(){return i.fileMode?et().then(function(){i.fileData&&(i.fileData.translations={},i.fileData.timestamp=0),i.loadedFromCache=!1,J(null),C(i.phrases),i.observer&&(i.observer.disconnect(),i.observer=null),console.log("[loco] IndexedDB cache cleared — call pullLatest() to re-fetch")}).catch(function(e){console.warn("[loco] Failed to clear cache:",e)}):(console.warn("[loco] clearCache() is only available in file mode"),Promise.resolve())},addFile:function(e){return i.fileMode?e?Re(e)?(i.fileUrls.indexOf(e)===-1&&i.fileUrls.push(e),fetch(e).then(function(r){if(!r.ok)throw new Error("HTTP "+r.status);return r.text()}).then(function(r){if(!r||!r.trim())throw new Error("Empty file");var t;try{t=JSON.parse(r)}catch{throw new Error("Invalid JSON")}if(t=le(t),!t)throw new Error("Invalid file schema");var n=!i.fileData||!i.fileData.languages||i.fileData.languages.length===0,a=!n||(t.languages||[]).length===1;return ue(t,n),oe(e,t,a).catch(function(){}),Ee(),console.log("[loco] added file: "+e+" ("+(t.languages||[]).join(", ")+")"),{status:"added",languages:t.languages||[]}}).catch(function(r){return console.warn("[loco] addFile() failed:",r),{status:"error",reason:r.message}})):(console.warn("[loco] Blocked unsafe URL: "+e),Promise.resolve({status:"error",reason:"unsafe URL"})):Promise.resolve({status:"error",reason:"no URL provided"}):(console.warn("[loco] addFile() is only available in file mode"),Promise.resolve({status:"error",reason:"not in file mode"}))},pullLatest:function(){if(!i.fileMode)return console.warn("[loco] pullLatest() is only available in file mode"),Promise.resolve({status:"skipped",reason:"not in file mode"});var e=i.fileUrls.length>0?i.fileUrls:i.fileUrl?[i.fileUrl]:[];if(e.length===0)return console.warn("[loco] No file URL(s) configured. Call Loco.init({ file }) first."),Promise.resolve({status:"error",reason:"no file URLs"});var r=e.map(function(t){return Promise.all([Ie(t).catch(function(){return null}),fetch(t).then(function(n){if(!n.ok)throw new Error("HTTP "+n.status);return n.text()})]).then(function(n){var a=n[0],o=n[1];if(!o||!o.trim())return{url:t,status:"current",reason:"empty"};var s;try{s=JSON.parse(o)}catch{throw new Error("Invalid JSON in "+t)}if(s=le(s),!s)throw new Error("Invalid file schema in "+t);var h=s.timestamp||0,m=a&&a.timestamp||0;if(h===m&&m!==0){var c=i.fileData&&i.fileData.translations,u=s.languages||[],d=!c||u.some(function(l){return!i.fileData.translations[l]});if(!d)return{url:t,status:"current",timestamp:m}}var p=!i.fileData||!i.fileData.languages||i.fileData.languages.length===0,f=!p||(s.languages||[]).length===1;return ue(s,p),oe(t,s,f).catch(function(){}),{url:t,status:"updated",timestamp:h,previousTimestamp:m}}).catch(function(n){return{url:t,status:"error",reason:n.message}})});return Promise.all(r).then(async function(t){var n=t.some(function(u){return u.status==="updated"});if(n){i.loadedFromCache=!1;var a=U();if(a)i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),await ce("pullLatest");else{i.phrases=Oe(document.body);var o=i.fileData.translations||{},s=(i.fileData.languages||[])[0];s&&o[s]&&R(i.phrases,Object.keys(o[s]))}Ee()}if(t.length===1){var h=t[0];return console.log("[loco] pullLatest: "+h.status+(h.timestamp?" (timestamp: "+h.timestamp+")":"")),h}var m=t.filter(function(u){return u.status==="updated"}).map(function(u){return u.url}),c=t.filter(function(u){return u.status==="current"}).map(function(u){return u.url});return console.log("[loco] pullLatest: "+m.length+" updated, "+c.length+" current"),{status:n?"updated":"current",results:t}}).catch(function(t){return console.warn("[loco] pullLatest() failed:",t),{status:"error",reason:t.message}})}};return window.Loco=M,Object.defineProperty(M,"_state",{value:i,writable:!1,enumerable:!1,configurable:!1}),M}();
package/versions.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "version": "1.0.9"
3
+ }