@lionrapid/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -0
- package/dist/base/event-emitter.d.ts +91 -0
- package/dist/base/event-emitter.d.ts.map +1 -0
- package/dist/base/event-emitter.js +330 -0
- package/dist/base/event-emitter.js.map +1 -0
- package/dist/base/index.d.ts +5 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.js +5 -0
- package/dist/base/index.js.map +1 -0
- package/dist/browser/auto-init.d.ts +57 -0
- package/dist/browser/auto-init.d.ts.map +1 -0
- package/dist/browser/auto-init.js +304 -0
- package/dist/browser/auto-init.js.map +1 -0
- package/dist/browser/auto-translator.d.ts +98 -0
- package/dist/browser/auto-translator.d.ts.map +1 -0
- package/dist/browser/auto-translator.js +218 -0
- package/dist/browser/auto-translator.js.map +1 -0
- package/dist/browser/block-extractor.d.ts +26 -0
- package/dist/browser/block-extractor.d.ts.map +1 -0
- package/dist/browser/block-extractor.js +143 -0
- package/dist/browser/block-extractor.js.map +1 -0
- package/dist/browser/dom-observer.d.ts +42 -0
- package/dist/browser/dom-observer.d.ts.map +1 -0
- package/dist/browser/dom-observer.js +109 -0
- package/dist/browser/dom-observer.js.map +1 -0
- package/dist/browser/editor/editor-api.d.ts +67 -0
- package/dist/browser/editor/editor-api.d.ts.map +1 -0
- package/dist/browser/editor/editor-api.js +233 -0
- package/dist/browser/editor/editor-api.js.map +1 -0
- package/dist/browser/editor/editor-init.d.ts +11 -0
- package/dist/browser/editor/editor-init.d.ts.map +1 -0
- package/dist/browser/editor/editor-init.js +181 -0
- package/dist/browser/editor/editor-init.js.map +1 -0
- package/dist/browser/editor/editor-styles.d.ts +6 -0
- package/dist/browser/editor/editor-styles.d.ts.map +1 -0
- package/dist/browser/editor/editor-styles.js +419 -0
- package/dist/browser/editor/editor-styles.js.map +1 -0
- package/dist/browser/editor/inspector.d.ts +22 -0
- package/dist/browser/editor/inspector.d.ts.map +1 -0
- package/dist/browser/editor/inspector.js +125 -0
- package/dist/browser/editor/inspector.js.map +1 -0
- package/dist/browser/editor/key-resolver.d.ts +19 -0
- package/dist/browser/editor/key-resolver.d.ts.map +1 -0
- package/dist/browser/editor/key-resolver.js +49 -0
- package/dist/browser/editor/key-resolver.js.map +1 -0
- package/dist/browser/editor/live-preview.d.ts +10 -0
- package/dist/browser/editor/live-preview.d.ts.map +1 -0
- package/dist/browser/editor/live-preview.js +57 -0
- package/dist/browser/editor/live-preview.js.map +1 -0
- package/dist/browser/editor/sidebar.d.ts +50 -0
- package/dist/browser/editor/sidebar.d.ts.map +1 -0
- package/dist/browser/editor/sidebar.js +353 -0
- package/dist/browser/editor/sidebar.js.map +1 -0
- package/dist/browser/editor/toolbar.d.ts +29 -0
- package/dist/browser/editor/toolbar.d.ts.map +1 -0
- package/dist/browser/editor/toolbar.js +131 -0
- package/dist/browser/editor/toolbar.js.map +1 -0
- package/dist/browser/exclude-filter.d.ts +21 -0
- package/dist/browser/exclude-filter.d.ts.map +1 -0
- package/dist/browser/exclude-filter.js +51 -0
- package/dist/browser/exclude-filter.js.map +1 -0
- package/dist/browser/index.d.ts +32 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +28 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/language-switcher.d.ts +70 -0
- package/dist/browser/language-switcher.d.ts.map +1 -0
- package/dist/browser/language-switcher.js +339 -0
- package/dist/browser/language-switcher.js.map +1 -0
- package/dist/browser/lionrapid.auto.dev.js +5757 -0
- package/dist/browser/lionrapid.auto.dev.js.map +7 -0
- package/dist/browser/lionrapid.auto.js +5757 -0
- package/dist/browser/lionrapid.auto.js.map +7 -0
- package/dist/browser/lionrapid.auto.min.js +80 -0
- package/dist/browser/lionrapid.auto.min.js.map +7 -0
- package/dist/browser/lionrapid.editor.js +1869 -0
- package/dist/browser/lionrapid.editor.js.map +7 -0
- package/dist/browser/lionrapid.editor.min.js +415 -0
- package/dist/browser/lionrapid.editor.min.js.map +7 -0
- package/dist/browser/lionrapid.esm.js +4786 -0
- package/dist/browser/lionrapid.esm.js.map +7 -0
- package/dist/browser/lionrapid.esm.min.js +3 -0
- package/dist/browser/lionrapid.esm.min.js.map +7 -0
- package/dist/browser/lionrapid.iife.dev.js +4809 -0
- package/dist/browser/lionrapid.iife.dev.js.map +7 -0
- package/dist/browser/lionrapid.iife.js +4809 -0
- package/dist/browser/lionrapid.iife.js.map +7 -0
- package/dist/browser/lionrapid.iife.min.js +3 -0
- package/dist/browser/lionrapid.iife.min.js.map +7 -0
- package/dist/browser/lionrapid.umd.js +4822 -0
- package/dist/browser/lionrapid.umd.js.map +7 -0
- package/dist/browser/lionrapid.umd.min.js +18 -0
- package/dist/browser/lionrapid.umd.min.js.map +7 -0
- package/dist/browser/markup-parser.d.ts +13 -0
- package/dist/browser/markup-parser.d.ts.map +1 -0
- package/dist/browser/markup-parser.js +56 -0
- package/dist/browser/markup-parser.js.map +1 -0
- package/dist/browser/md5.d.ts +16 -0
- package/dist/browser/md5.d.ts.map +1 -0
- package/dist/browser/md5.js +145 -0
- package/dist/browser/md5.js.map +1 -0
- package/dist/browser/storage/cache-storage-repository.d.ts +44 -0
- package/dist/browser/storage/cache-storage-repository.d.ts.map +1 -0
- package/dist/browser/storage/cache-storage-repository.js +186 -0
- package/dist/browser/storage/cache-storage-repository.js.map +1 -0
- package/dist/browser/storage/localstorage-repository.d.ts +51 -0
- package/dist/browser/storage/localstorage-repository.d.ts.map +1 -0
- package/dist/browser/storage/localstorage-repository.js +270 -0
- package/dist/browser/storage/localstorage-repository.js.map +1 -0
- package/dist/builder.d.ts +24 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +169 -0
- package/dist/builder.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +132 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +277 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/lionrapid.config.d.ts +12 -0
- package/dist/config/lionrapid.config.d.ts.map +1 -0
- package/dist/config/lionrapid.config.js +2 -0
- package/dist/config/lionrapid.config.js.map +1 -0
- package/dist/config/logger.config.d.ts +19 -0
- package/dist/config/logger.config.d.ts.map +1 -0
- package/dist/config/logger.config.js +9 -0
- package/dist/config/logger.config.js.map +1 -0
- package/dist/config/repository.config.d.ts +87 -0
- package/dist/config/repository.config.d.ts.map +1 -0
- package/dist/config/repository.config.js +5 -0
- package/dist/config/repository.config.js.map +1 -0
- package/dist/content/index.d.ts +20 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +13 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/parser/IParser.d.ts +33 -0
- package/dist/content/parser/IParser.d.ts.map +1 -0
- package/dist/content/parser/IParser.js +6 -0
- package/dist/content/parser/IParser.js.map +1 -0
- package/dist/content/parser/MarkupParser.d.ts +67 -0
- package/dist/content/parser/MarkupParser.d.ts.map +1 -0
- package/dist/content/parser/MarkupParser.js +231 -0
- package/dist/content/parser/MarkupParser.js.map +1 -0
- package/dist/content/serializer/HTMLSerializer.d.ts +61 -0
- package/dist/content/serializer/HTMLSerializer.d.ts.map +1 -0
- package/dist/content/serializer/HTMLSerializer.js +100 -0
- package/dist/content/serializer/HTMLSerializer.js.map +1 -0
- package/dist/content/serializer/ISerializer.d.ts +33 -0
- package/dist/content/serializer/ISerializer.d.ts.map +1 -0
- package/dist/content/serializer/ISerializer.js +6 -0
- package/dist/content/serializer/ISerializer.js.map +1 -0
- package/dist/content/style-mapper/DefaultStyleMapper.d.ts +59 -0
- package/dist/content/style-mapper/DefaultStyleMapper.d.ts.map +1 -0
- package/dist/content/style-mapper/DefaultStyleMapper.js +128 -0
- package/dist/content/style-mapper/DefaultStyleMapper.js.map +1 -0
- package/dist/content/style-mapper/IStyleMapper.d.ts +50 -0
- package/dist/content/style-mapper/IStyleMapper.d.ts.map +1 -0
- package/dist/content/style-mapper/IStyleMapper.js +6 -0
- package/dist/content/style-mapper/IStyleMapper.js.map +1 -0
- package/dist/content/types.d.ts +39 -0
- package/dist/content/types.d.ts.map +1 -0
- package/dist/content/types.js +6 -0
- package/dist/content/types.js.map +1 -0
- package/dist/content/validator/ContentValidator.d.ts +57 -0
- package/dist/content/validator/ContentValidator.d.ts.map +1 -0
- package/dist/content/validator/ContentValidator.js +215 -0
- package/dist/content/validator/ContentValidator.js.map +1 -0
- package/dist/content/validator/IValidator.d.ts +82 -0
- package/dist/content/validator/IValidator.d.ts.map +1 -0
- package/dist/content/validator/IValidator.js +6 -0
- package/dist/content/validator/IValidator.js.map +1 -0
- package/dist/errors/translation-errors.d.ts +55 -0
- package/dist/errors/translation-errors.d.ts.map +1 -0
- package/dist/errors/translation-errors.js +85 -0
- package/dist/errors/translation-errors.js.map +1 -0
- package/dist/handlers/async-storage-handler.d.ts +77 -0
- package/dist/handlers/async-storage-handler.d.ts.map +1 -0
- package/dist/handlers/async-storage-handler.js +239 -0
- package/dist/handlers/async-storage-handler.js.map +1 -0
- package/dist/handlers/handler-chain.d.ts +79 -0
- package/dist/handlers/handler-chain.d.ts.map +1 -0
- package/dist/handlers/handler-chain.js +366 -0
- package/dist/handlers/handler-chain.js.map +1 -0
- package/dist/handlers/index.d.ts +7 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +7 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/network-handler.d.ts +90 -0
- package/dist/handlers/network-handler.d.ts.map +1 -0
- package/dist/handlers/network-handler.js +283 -0
- package/dist/handlers/network-handler.js.map +1 -0
- package/dist/handlers/sync-storage-handler.d.ts +88 -0
- package/dist/handlers/sync-storage-handler.d.ts.map +1 -0
- package/dist/handlers/sync-storage-handler.js +270 -0
- package/dist/handlers/sync-storage-handler.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/emitter.interface.d.ts +33 -0
- package/dist/interfaces/emitter.interface.d.ts.map +1 -0
- package/dist/interfaces/emitter.interface.js +2 -0
- package/dist/interfaces/emitter.interface.js.map +1 -0
- package/dist/interfaces/handler.interface.d.ts +50 -0
- package/dist/interfaces/handler.interface.d.ts.map +1 -0
- package/dist/interfaces/handler.interface.js +5 -0
- package/dist/interfaces/handler.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +8 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +8 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/plugin.interface.d.ts +49 -0
- package/dist/interfaces/plugin.interface.d.ts.map +1 -0
- package/dist/interfaces/plugin.interface.js +6 -0
- package/dist/interfaces/plugin.interface.js.map +1 -0
- package/dist/interfaces/repository.interface.d.ts +56 -0
- package/dist/interfaces/repository.interface.d.ts.map +1 -0
- package/dist/interfaces/repository.interface.js +2 -0
- package/dist/interfaces/repository.interface.js.map +1 -0
- package/dist/lionRapid.d.ts +225 -0
- package/dist/lionRapid.d.ts.map +1 -0
- package/dist/lionRapid.js +596 -0
- package/dist/lionRapid.js.map +1 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +3 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/memory-repository.d.ts +30 -0
- package/dist/repositories/memory-repository.d.ts.map +1 -0
- package/dist/repositories/memory-repository.js +100 -0
- package/dist/repositories/memory-repository.js.map +1 -0
- package/dist/repositories/network-repository.d.ts +138 -0
- package/dist/repositories/network-repository.d.ts.map +1 -0
- package/dist/repositories/network-repository.js +516 -0
- package/dist/repositories/network-repository.js.map +1 -0
- package/dist/sync/missing-translation-queue.d.ts +64 -0
- package/dist/sync/missing-translation-queue.d.ts.map +1 -0
- package/dist/sync/missing-translation-queue.js +184 -0
- package/dist/sync/missing-translation-queue.js.map +1 -0
- package/dist/types/cache.types.d.ts +62 -0
- package/dist/types/cache.types.d.ts.map +1 -0
- package/dist/types/cache.types.js +6 -0
- package/dist/types/cache.types.js.map +1 -0
- package/dist/types/event-payloads.types.d.ts +46 -0
- package/dist/types/event-payloads.types.d.ts.map +1 -0
- package/dist/types/event-payloads.types.js +6 -0
- package/dist/types/event-payloads.types.js.map +1 -0
- package/dist/types/generated.types.d.ts +31 -0
- package/dist/types/generated.types.d.ts.map +1 -0
- package/dist/types/generated.types.js +6 -0
- package/dist/types/generated.types.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lionRapid.types.d.ts +169 -0
- package/dist/types/lionRapid.types.d.ts.map +1 -0
- package/dist/types/lionRapid.types.js +8 -0
- package/dist/types/lionRapid.types.js.map +1 -0
- package/dist/types/parameters.types.d.ts +36 -0
- package/dist/types/parameters.types.d.ts.map +1 -0
- package/dist/types/parameters.types.js +6 -0
- package/dist/types/parameters.types.js.map +1 -0
- package/dist/types/translation-data.types.d.ts +54 -0
- package/dist/types/translation-data.types.d.ts.map +1 -0
- package/dist/types/translation-data.types.js +6 -0
- package/dist/types/translation-data.types.js.map +1 -0
- package/dist/types/translation.types.d.ts +94 -0
- package/dist/types/translation.types.d.ts.map +1 -0
- package/dist/types/translation.types.js +5 -0
- package/dist/types/translation.types.js.map +1 -0
- package/dist/utils/context-utils.d.ts +23 -0
- package/dist/utils/context-utils.d.ts.map +1 -0
- package/dist/utils/context-utils.js +36 -0
- package/dist/utils/context-utils.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +19 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +229 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +345 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/namespace-utils.d.ts +30 -0
- package/dist/utils/namespace-utils.d.ts.map +1 -0
- package/dist/utils/namespace-utils.js +56 -0
- package/dist/utils/namespace-utils.js.map +1 -0
- package/dist/utils/translation-flow.d.ts +18 -0
- package/dist/utils/translation-flow.d.ts.map +1 -0
- package/dist/utils/translation-flow.js +74 -0
- package/dist/utils/translation-flow.js.map +1 -0
- package/dist/utils/translation-value-utils.d.ts +57 -0
- package/dist/utils/translation-value-utils.d.ts.map +1 -0
- package/dist/utils/translation-value-utils.js +194 -0
- package/dist/utils/translation-value-utils.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Init for Browser Bundle
|
|
3
|
+
* Reads script tag attributes and auto-configures LionRapid
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* <script
|
|
7
|
+
* src="https://cdn.lionrapid.com/lionrapid.min.js"
|
|
8
|
+
* data-api-key="pk_live_xxx"
|
|
9
|
+
* data-default-locale="en"
|
|
10
|
+
* data-namespace="default"
|
|
11
|
+
* data-languages="en,es,fr,de"
|
|
12
|
+
* ></script>
|
|
13
|
+
*/
|
|
14
|
+
import { LionRapidBuilder } from '../builder.js';
|
|
15
|
+
import { MemoryRepository } from '../repositories/memory-repository.js';
|
|
16
|
+
import { NetworkRepository } from '../repositories/network-repository.js';
|
|
17
|
+
import { AutoTranslator } from './auto-translator.js';
|
|
18
|
+
import { LanguageSwitcher } from './language-switcher.js';
|
|
19
|
+
import { LocalStorageRepository } from './storage/localstorage-repository.js';
|
|
20
|
+
import { CacheStorageRepository } from './storage/cache-storage-repository.js';
|
|
21
|
+
/**
|
|
22
|
+
* Parse script tag attributes
|
|
23
|
+
*/
|
|
24
|
+
function parseConfig(script) {
|
|
25
|
+
const apiKey = script.dataset.apiKey || '';
|
|
26
|
+
const baseUrl = script.dataset.baseUrl || 'https://api.lionrapid.com';
|
|
27
|
+
const defaultLocale = script.dataset.defaultLocale || 'en';
|
|
28
|
+
const namespace = script.dataset.namespace || 'default';
|
|
29
|
+
const languages = (script.dataset.languages || defaultLocale)
|
|
30
|
+
.split(',')
|
|
31
|
+
.map((s) => s.trim())
|
|
32
|
+
.filter(Boolean);
|
|
33
|
+
const excludeSelectors = (script.dataset.exclude || '')
|
|
34
|
+
.split(',')
|
|
35
|
+
.map((s) => s.trim())
|
|
36
|
+
.filter(Boolean);
|
|
37
|
+
const autoDetect = script.dataset.autoDetect === 'true';
|
|
38
|
+
const mode = (script.dataset.mode === 'dynamic-only' ? 'dynamic-only' : 'full');
|
|
39
|
+
const switcherStyle = script.dataset.switcher && script.dataset.switcher !== 'false'
|
|
40
|
+
? script.dataset.switcher
|
|
41
|
+
: undefined;
|
|
42
|
+
const switcherPosition = script.dataset.switcherPosition || undefined;
|
|
43
|
+
const switcherShowFlags = script.dataset.switcherShowFlags !== 'false';
|
|
44
|
+
const switcherShowNames = script.dataset.switcherShowNames === 'true';
|
|
45
|
+
const switcherCustomCss = script.dataset.switcherCustomCss || undefined;
|
|
46
|
+
return {
|
|
47
|
+
apiKey,
|
|
48
|
+
baseUrl,
|
|
49
|
+
defaultLocale,
|
|
50
|
+
namespace,
|
|
51
|
+
languages,
|
|
52
|
+
excludeSelectors,
|
|
53
|
+
autoDetect,
|
|
54
|
+
mode,
|
|
55
|
+
switcherStyle,
|
|
56
|
+
switcherPosition,
|
|
57
|
+
switcherShowFlags,
|
|
58
|
+
switcherShowNames,
|
|
59
|
+
switcherCustomCss,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Read lionrapid_locale cookie if it matches an available language
|
|
64
|
+
*/
|
|
65
|
+
function readLocaleCookie(availableLanguages) {
|
|
66
|
+
if (typeof document === 'undefined')
|
|
67
|
+
return null;
|
|
68
|
+
const match = document.cookie.match(/lionrapid_locale=([a-z]{2})/);
|
|
69
|
+
if (!match)
|
|
70
|
+
return null;
|
|
71
|
+
return availableLanguages.includes(match[1]) ? match[1] : null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Detect browser language
|
|
75
|
+
*/
|
|
76
|
+
function detectBrowserLanguage(availableLanguages, defaultLocale) {
|
|
77
|
+
if (typeof navigator === 'undefined')
|
|
78
|
+
return defaultLocale;
|
|
79
|
+
const browserLang = navigator.language || navigator.userLanguage || '';
|
|
80
|
+
const primaryLang = browserLang.split('-')[0].toLowerCase();
|
|
81
|
+
if (availableLanguages.includes(primaryLang)) {
|
|
82
|
+
return primaryLang;
|
|
83
|
+
}
|
|
84
|
+
return defaultLocale;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Navigate to locale-prefixed URL (for dynamic-only mode)
|
|
88
|
+
*/
|
|
89
|
+
function navigateToLocale(locale, defaultLocale) {
|
|
90
|
+
const path = window.location.pathname.replace(/^\/([a-z]{2})(\/|$)/, '/');
|
|
91
|
+
const prefix = locale === defaultLocale ? '' : '/' + locale;
|
|
92
|
+
window.location.href = prefix + (path || '/') + window.location.search;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Initialize LionRapid from script tag
|
|
96
|
+
*/
|
|
97
|
+
async function autoInit() {
|
|
98
|
+
// Find the script tag
|
|
99
|
+
const scripts = document.querySelectorAll('script[data-api-key]');
|
|
100
|
+
const script = scripts[scripts.length - 1];
|
|
101
|
+
if (!script) {
|
|
102
|
+
console.warn('[LionRapid] No script tag with data-api-key found');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const config = parseConfig(script);
|
|
106
|
+
window.__lionrapidConfig = config;
|
|
107
|
+
if (!config.apiKey) {
|
|
108
|
+
console.warn('[LionRapid] Missing data-api-key attribute');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Determine initial locale
|
|
112
|
+
let initialLocale = config.defaultLocale;
|
|
113
|
+
if (config.mode === 'dynamic-only') {
|
|
114
|
+
// In dynamic-only mode, server already set <html lang="xx">
|
|
115
|
+
// Normalize "en-US" → "en" (WordPress outputs full locale codes)
|
|
116
|
+
const htmlLang = document.documentElement.lang?.split('-')[0]?.toLowerCase();
|
|
117
|
+
initialLocale = htmlLang || config.defaultLocale;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Cookie > browser detection > default
|
|
121
|
+
const cookieLocale = readLocaleCookie(config.languages);
|
|
122
|
+
if (cookieLocale) {
|
|
123
|
+
initialLocale = cookieLocale;
|
|
124
|
+
}
|
|
125
|
+
else if (config.autoDetect) {
|
|
126
|
+
initialLocale = detectBrowserLanguage(config.languages, config.defaultLocale);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Determine sync mode based on key type
|
|
130
|
+
const syncMode = config.apiKey.startsWith('pk_') ? 'report-only' : 'sync';
|
|
131
|
+
// Create language switcher immediately (no core dependency for rendering)
|
|
132
|
+
const languageSwitcher = new LanguageSwitcher();
|
|
133
|
+
languageSwitcher.setLanguages(config.languages);
|
|
134
|
+
languageSwitcher.setInitialLocale(initialLocale);
|
|
135
|
+
// Render switcher as soon as DOM is ready (don't wait for network)
|
|
136
|
+
const renderSwitcher = () => {
|
|
137
|
+
// In full mode, auto-create floating container from script tag config
|
|
138
|
+
// In dynamic-only mode, server (WP/edge) provides the container via HTML
|
|
139
|
+
if (config.mode !== 'dynamic-only') {
|
|
140
|
+
if (config.switcherStyle && !document.querySelector('[data-lionrapid-switcher]')) {
|
|
141
|
+
const container = document.createElement('div');
|
|
142
|
+
container.dataset.lionrapidSwitcher = config.switcherStyle;
|
|
143
|
+
if (config.switcherPosition) {
|
|
144
|
+
container.dataset.lionrapidSwitcherPosition = config.switcherPosition;
|
|
145
|
+
}
|
|
146
|
+
if (!config.switcherShowFlags) {
|
|
147
|
+
container.dataset.lionrapidSwitcherShowFlags = 'false';
|
|
148
|
+
}
|
|
149
|
+
if (!config.switcherShowNames) {
|
|
150
|
+
container.dataset.lionrapidSwitcherShowNames = 'false';
|
|
151
|
+
}
|
|
152
|
+
if (config.switcherCustomCss) {
|
|
153
|
+
container.dataset.lionrapidSwitcherCustomCss = config.switcherCustomCss;
|
|
154
|
+
}
|
|
155
|
+
document.body.appendChild(container);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Always init: injects CSS, hydrates any [data-lionrapid-switcher] elements
|
|
159
|
+
languageSwitcher.initAll();
|
|
160
|
+
};
|
|
161
|
+
if (document.readyState === 'loading') {
|
|
162
|
+
document.addEventListener('DOMContentLoaded', renderSwitcher);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
renderSwitcher();
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
// Build LionRapid with all cache layers
|
|
169
|
+
const core = await LionRapidBuilder.init({
|
|
170
|
+
defaultLocale: initialLocale,
|
|
171
|
+
namespace: config.namespace,
|
|
172
|
+
})
|
|
173
|
+
.use(new MemoryRepository({ enabled: true }))
|
|
174
|
+
.use(new LocalStorageRepository({ enabled: true }))
|
|
175
|
+
.use(new CacheStorageRepository({ enabled: true }))
|
|
176
|
+
.use(new NetworkRepository({
|
|
177
|
+
enabled: true,
|
|
178
|
+
options: {
|
|
179
|
+
baseUrl: config.baseUrl,
|
|
180
|
+
apiKey: config.apiKey,
|
|
181
|
+
syncMissing: {
|
|
182
|
+
enabled: syncMode === 'sync',
|
|
183
|
+
debounceMs: 500,
|
|
184
|
+
batchSize: 50,
|
|
185
|
+
},
|
|
186
|
+
preloadNamespaces: [
|
|
187
|
+
{
|
|
188
|
+
locale: initialLocale,
|
|
189
|
+
namespace: config.namespace,
|
|
190
|
+
eager: true,
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
},
|
|
194
|
+
}))
|
|
195
|
+
.build();
|
|
196
|
+
// Create auto translator
|
|
197
|
+
const autoTranslator = new AutoTranslator({
|
|
198
|
+
excludeSelectors: config.excludeSelectors,
|
|
199
|
+
});
|
|
200
|
+
autoTranslator.setCore(core);
|
|
201
|
+
autoTranslator.init({
|
|
202
|
+
namespace: config.namespace,
|
|
203
|
+
locale: initialLocale,
|
|
204
|
+
sourceLocale: config.defaultLocale,
|
|
205
|
+
});
|
|
206
|
+
// Wire up core to switcher now that it's ready
|
|
207
|
+
languageSwitcher.setCore(core);
|
|
208
|
+
languageSwitcher.setOnLanguageChange(async (locale) => {
|
|
209
|
+
document.cookie = `lionrapid_locale=${locale}; path=/; max-age=31536000; SameSite=Lax`;
|
|
210
|
+
if (config.mode === 'dynamic-only') {
|
|
211
|
+
// Server does the translation — navigate to /{locale}/path
|
|
212
|
+
navigateToLocale(locale, config.defaultLocale);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
// Full mode: retranslate in-place
|
|
216
|
+
await core.changeLanguage(locale, {
|
|
217
|
+
preloadNamespaces: [config.namespace],
|
|
218
|
+
});
|
|
219
|
+
autoTranslator.updateLocale(locale);
|
|
220
|
+
autoTranslator.retranslate();
|
|
221
|
+
});
|
|
222
|
+
// === Reactive translation reload ===
|
|
223
|
+
const RETRY_DELAYS = [2000, 8000, 30000]; // backoff: 2s, 8s, 30s
|
|
224
|
+
const REVALIDATE_STALE_MS = 60_000; // 60s before background revalidation
|
|
225
|
+
let hasPendingTranslations = false;
|
|
226
|
+
let retryTimers = [];
|
|
227
|
+
let lastRevalidatedAt = Date.now();
|
|
228
|
+
const reloadTranslations = async () => {
|
|
229
|
+
await core.reloadNamespace(config.namespace);
|
|
230
|
+
autoTranslator.translatePage();
|
|
231
|
+
lastRevalidatedAt = Date.now();
|
|
232
|
+
};
|
|
233
|
+
const cancelRetries = () => {
|
|
234
|
+
retryTimers.forEach(t => clearTimeout(t));
|
|
235
|
+
retryTimers = [];
|
|
236
|
+
};
|
|
237
|
+
// After sync: schedule backoff retries
|
|
238
|
+
core.bus.on('sync:batch:complete', () => {
|
|
239
|
+
hasPendingTranslations = true;
|
|
240
|
+
cancelRetries();
|
|
241
|
+
RETRY_DELAYS.forEach(delay => {
|
|
242
|
+
retryTimers.push(setTimeout(() => reloadTranslations().catch(() => { }), delay));
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
// On tab focus: reload if pending, or background revalidate if stale (>60s)
|
|
246
|
+
// The revalidation is cheap — server returns 304 if nothing changed
|
|
247
|
+
document.addEventListener('visibilitychange', () => {
|
|
248
|
+
if (document.visibilityState !== 'visible')
|
|
249
|
+
return;
|
|
250
|
+
if (hasPendingTranslations) {
|
|
251
|
+
hasPendingTranslations = false;
|
|
252
|
+
cancelRetries();
|
|
253
|
+
reloadTranslations().catch(() => { });
|
|
254
|
+
}
|
|
255
|
+
else if (Date.now() - lastRevalidatedAt > REVALIDATE_STALE_MS) {
|
|
256
|
+
reloadTranslations().catch(() => { });
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
// Expose global API
|
|
260
|
+
const instance = {
|
|
261
|
+
t: (key, params, defaultValue) => core.t(key, params || {}, defaultValue),
|
|
262
|
+
tHtml: (key, params, defaultValue) => core.tHtml(key, params || {}, defaultValue),
|
|
263
|
+
changeLanguage: async (locale) => {
|
|
264
|
+
await core.changeLanguage(locale, {
|
|
265
|
+
preloadNamespaces: [config.namespace],
|
|
266
|
+
});
|
|
267
|
+
autoTranslator.updateLocale(locale);
|
|
268
|
+
autoTranslator.retranslate();
|
|
269
|
+
languageSwitcher.initAll();
|
|
270
|
+
},
|
|
271
|
+
getCurrentLocale: () => core.getCurrentLocale(),
|
|
272
|
+
on: (event, callback) => core.bus.on(event, callback),
|
|
273
|
+
retranslate: () => autoTranslator.retranslate(),
|
|
274
|
+
reloadTranslations,
|
|
275
|
+
autoTranslator,
|
|
276
|
+
languageSwitcher,
|
|
277
|
+
};
|
|
278
|
+
window.LionRapid = instance;
|
|
279
|
+
// Detect editor mode (non-proxy case — edge proxy already injects the script)
|
|
280
|
+
const editorParam = new URLSearchParams(window.location.search).get('__lr_editor');
|
|
281
|
+
if (editorParam && !document.querySelector('script[data-grant]')) {
|
|
282
|
+
const editorScript = document.createElement('script');
|
|
283
|
+
editorScript.src = config.editorCdnUrl
|
|
284
|
+
|| 'https://cdn.lionrapid.com/lionrapid.editor.min.js';
|
|
285
|
+
editorScript.dataset.grant = editorParam;
|
|
286
|
+
editorScript.dataset.locale = core.getCurrentLocale();
|
|
287
|
+
editorScript.dataset.api = config.baseUrl;
|
|
288
|
+
editorScript.async = true;
|
|
289
|
+
document.body.appendChild(editorScript);
|
|
290
|
+
}
|
|
291
|
+
// Start auto-translation now that core is ready
|
|
292
|
+
if (config.mode !== 'dynamic-only') {
|
|
293
|
+
autoTranslator.translatePage();
|
|
294
|
+
}
|
|
295
|
+
autoTranslator.observe();
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
console.error('[LionRapid] Initialization failed:', error);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Auto-run on script load
|
|
302
|
+
autoInit();
|
|
303
|
+
export { autoInit, parseConfig };
|
|
304
|
+
//# sourceMappingURL=auto-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-init.js","sourceRoot":"","sources":["../../src/browser/auto-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto Translator
|
|
3
|
+
* Automatically translates block-level elements in DOM content.
|
|
4
|
+
* Uses ContentUnit model for key parity with WordPress TS, PHP, and edge proxy.
|
|
5
|
+
*
|
|
6
|
+
* Missing translations are reported via the event bus (translation:not-found),
|
|
7
|
+
* picked up by MissingTranslationQueue, and synced through NetworkRepository.
|
|
8
|
+
*/
|
|
9
|
+
import type { LionRapidCore } from '../lionRapid.js';
|
|
10
|
+
import { ExcludePatterns } from './exclude-filter.js';
|
|
11
|
+
export interface AutoTranslatorConfig {
|
|
12
|
+
excludePatterns?: Partial<ExcludePatterns>;
|
|
13
|
+
excludeSelectors?: string[];
|
|
14
|
+
minTextLength?: number;
|
|
15
|
+
debounceMs?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class AutoTranslator {
|
|
18
|
+
private core;
|
|
19
|
+
private blockExtractor;
|
|
20
|
+
private domObserver;
|
|
21
|
+
private locale;
|
|
22
|
+
private sourceLocale;
|
|
23
|
+
private namespace;
|
|
24
|
+
private debounceMs;
|
|
25
|
+
private pendingElements;
|
|
26
|
+
private debounceTimer;
|
|
27
|
+
private translatedCount;
|
|
28
|
+
constructor(config?: AutoTranslatorConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Set the core instance
|
|
31
|
+
*/
|
|
32
|
+
setCore(core: LionRapidCore): void;
|
|
33
|
+
/**
|
|
34
|
+
* Initialize locale and namespace for cache key construction
|
|
35
|
+
*/
|
|
36
|
+
init(config: {
|
|
37
|
+
namespace: string;
|
|
38
|
+
locale: string;
|
|
39
|
+
sourceLocale: string;
|
|
40
|
+
}): void;
|
|
41
|
+
/**
|
|
42
|
+
* Update locale (after language change)
|
|
43
|
+
*/
|
|
44
|
+
updateLocale(locale: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Check if ready
|
|
47
|
+
*/
|
|
48
|
+
isReady(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Generate auto key for text (exposed for testing)
|
|
51
|
+
*/
|
|
52
|
+
generateAutoKey(text: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Queue an element for translation (debounced)
|
|
55
|
+
*/
|
|
56
|
+
queueElement(element: Element): void;
|
|
57
|
+
/**
|
|
58
|
+
* Translate an element immediately
|
|
59
|
+
*/
|
|
60
|
+
translateElement(element: Element): number;
|
|
61
|
+
/**
|
|
62
|
+
* Translate the entire page
|
|
63
|
+
*/
|
|
64
|
+
translatePage(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Start observing DOM for dynamic content
|
|
67
|
+
*/
|
|
68
|
+
observe(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Stop observing DOM
|
|
71
|
+
*/
|
|
72
|
+
stopObserving(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Schedule debounced processing
|
|
75
|
+
*/
|
|
76
|
+
private scheduleProcessing;
|
|
77
|
+
/**
|
|
78
|
+
* Process all pending elements
|
|
79
|
+
*/
|
|
80
|
+
private processPendingElements;
|
|
81
|
+
/**
|
|
82
|
+
* Translate extracted blocks using ContentUnit model
|
|
83
|
+
*/
|
|
84
|
+
private translateBlocks;
|
|
85
|
+
/**
|
|
86
|
+
* Get translated count
|
|
87
|
+
*/
|
|
88
|
+
getTranslatedCount(): number;
|
|
89
|
+
/**
|
|
90
|
+
* Re-translate a single element (for editor live preview reset)
|
|
91
|
+
*/
|
|
92
|
+
retranslateElement(element: Element): void;
|
|
93
|
+
/**
|
|
94
|
+
* Re-translate the page (after language change)
|
|
95
|
+
*/
|
|
96
|
+
retranslate(): void;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=auto-translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-translator.d.ts","sourceRoot":"","sources":["../../src/browser/auto-translator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAOtD,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,GAAE,oBAAyB;IAS7C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAM/E;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKpC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAS1C;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACH,aAAa,IAAI,IAAI;IAOrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQ1C;;OAEG;IACH,WAAW,IAAI,IAAI;CAkBpB"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto Translator
|
|
3
|
+
* Automatically translates block-level elements in DOM content.
|
|
4
|
+
* Uses ContentUnit model for key parity with WordPress TS, PHP, and edge proxy.
|
|
5
|
+
*
|
|
6
|
+
* Missing translations are reported via the event bus (translation:not-found),
|
|
7
|
+
* picked up by MissingTranslationQueue, and synced through NetworkRepository.
|
|
8
|
+
*/
|
|
9
|
+
import { BlockExtractor } from './block-extractor.js';
|
|
10
|
+
import { DOMObserver } from './dom-observer.js';
|
|
11
|
+
import { HTMLSerializer } from '../content/serializer/HTMLSerializer.js';
|
|
12
|
+
import { generateAutoKey } from './md5.js';
|
|
13
|
+
const htmlSerializer = new HTMLSerializer();
|
|
14
|
+
export class AutoTranslator {
|
|
15
|
+
core = null;
|
|
16
|
+
blockExtractor;
|
|
17
|
+
domObserver = null;
|
|
18
|
+
locale = '';
|
|
19
|
+
sourceLocale = '';
|
|
20
|
+
namespace = '';
|
|
21
|
+
debounceMs;
|
|
22
|
+
pendingElements = new Set();
|
|
23
|
+
debounceTimer = null;
|
|
24
|
+
translatedCount = 0;
|
|
25
|
+
constructor(config = {}) {
|
|
26
|
+
this.blockExtractor = new BlockExtractor(config.excludePatterns, config.excludeSelectors, config.minTextLength);
|
|
27
|
+
this.debounceMs = config.debounceMs ?? 100;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Set the core instance
|
|
31
|
+
*/
|
|
32
|
+
setCore(core) {
|
|
33
|
+
this.core = core;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize locale and namespace for cache key construction
|
|
37
|
+
*/
|
|
38
|
+
init(config) {
|
|
39
|
+
this.locale = config.locale;
|
|
40
|
+
this.sourceLocale = config.sourceLocale;
|
|
41
|
+
this.namespace = config.namespace;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Update locale (after language change)
|
|
45
|
+
*/
|
|
46
|
+
updateLocale(locale) {
|
|
47
|
+
this.locale = locale;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if ready
|
|
51
|
+
*/
|
|
52
|
+
isReady() {
|
|
53
|
+
return this.core !== null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Generate auto key for text (exposed for testing)
|
|
57
|
+
*/
|
|
58
|
+
generateAutoKey(text) {
|
|
59
|
+
return generateAutoKey(text);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Queue an element for translation (debounced)
|
|
63
|
+
*/
|
|
64
|
+
queueElement(element) {
|
|
65
|
+
this.pendingElements.add(element);
|
|
66
|
+
this.scheduleProcessing();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Translate an element immediately
|
|
70
|
+
*/
|
|
71
|
+
translateElement(element) {
|
|
72
|
+
if (!this.core) {
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
const extracted = this.blockExtractor.extract(element);
|
|
76
|
+
return this.translateBlocks(extracted);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Translate the entire page
|
|
80
|
+
*/
|
|
81
|
+
translatePage() {
|
|
82
|
+
return this.translateElement(document.body);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Start observing DOM for dynamic content
|
|
86
|
+
*/
|
|
87
|
+
observe() {
|
|
88
|
+
if (this.domObserver) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this.domObserver = new DOMObserver({
|
|
92
|
+
onNewContent: (element) => this.queueElement(element),
|
|
93
|
+
});
|
|
94
|
+
this.domObserver.start();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Stop observing DOM
|
|
98
|
+
*/
|
|
99
|
+
stopObserving() {
|
|
100
|
+
if (this.domObserver) {
|
|
101
|
+
this.domObserver.stop();
|
|
102
|
+
this.domObserver = null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Schedule debounced processing
|
|
107
|
+
*/
|
|
108
|
+
scheduleProcessing() {
|
|
109
|
+
if (this.debounceTimer) {
|
|
110
|
+
clearTimeout(this.debounceTimer);
|
|
111
|
+
}
|
|
112
|
+
this.debounceTimer = setTimeout(() => {
|
|
113
|
+
this.processPendingElements();
|
|
114
|
+
}, this.debounceMs);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Process all pending elements
|
|
118
|
+
*/
|
|
119
|
+
processPendingElements() {
|
|
120
|
+
if (!this.core || this.pendingElements.size === 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
let totalTranslated = 0;
|
|
124
|
+
for (const element of this.pendingElements) {
|
|
125
|
+
// Skip if element was removed from DOM
|
|
126
|
+
if (!document.body.contains(element)) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const count = this.translateElement(element);
|
|
130
|
+
totalTranslated += count;
|
|
131
|
+
}
|
|
132
|
+
this.pendingElements.clear();
|
|
133
|
+
this.translatedCount += totalTranslated;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Translate extracted blocks using ContentUnit model
|
|
137
|
+
*/
|
|
138
|
+
translateBlocks(extracted) {
|
|
139
|
+
if (!this.core)
|
|
140
|
+
return 0;
|
|
141
|
+
let count = 0;
|
|
142
|
+
for (const { element, unit, key } of extracted) {
|
|
143
|
+
// Construct full cache key: locale:namespace:key
|
|
144
|
+
const fullKey = `${this.locale}:${this.namespace}:${key}`;
|
|
145
|
+
// Look up translation from cache
|
|
146
|
+
const cached = this.core.cache.get(fullKey);
|
|
147
|
+
if (cached && cached.value !== unit.text && cached.value !== key) {
|
|
148
|
+
// Translation found — save original HTML before first translation
|
|
149
|
+
if (!element.hasAttribute('data-lr-original')) {
|
|
150
|
+
element.setAttribute('data-lr-original', element.innerHTML);
|
|
151
|
+
}
|
|
152
|
+
if (cached.styles && Object.keys(cached.styles).length > 0) {
|
|
153
|
+
const translatedUnit = { text: cached.value, styles: cached.styles };
|
|
154
|
+
element.innerHTML = htmlSerializer.serialize(translatedUnit);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
element.textContent = cached.value;
|
|
158
|
+
}
|
|
159
|
+
element.setAttribute('data-lr-block', key);
|
|
160
|
+
element.setAttribute('data-lionrapid-client', '1');
|
|
161
|
+
count++;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// No translation — report missing via event bus
|
|
165
|
+
// MissingTranslationQueue picks this up and syncs through NetworkRepository
|
|
166
|
+
this.core.bus.emit('translation:not-found', {
|
|
167
|
+
payload: {
|
|
168
|
+
key,
|
|
169
|
+
fallbackValue: unit.text,
|
|
170
|
+
locale: this.sourceLocale,
|
|
171
|
+
namespace: this.namespace,
|
|
172
|
+
status: 404,
|
|
173
|
+
styles: unit.styles,
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return count;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get translated count
|
|
182
|
+
*/
|
|
183
|
+
getTranslatedCount() {
|
|
184
|
+
return this.translatedCount;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Re-translate a single element (for editor live preview reset)
|
|
188
|
+
*/
|
|
189
|
+
retranslateElement(element) {
|
|
190
|
+
const original = element.getAttribute('data-lr-original');
|
|
191
|
+
if (original !== null)
|
|
192
|
+
element.innerHTML = original;
|
|
193
|
+
element.removeAttribute('data-lionrapid-client');
|
|
194
|
+
element.removeAttribute('data-lr-block');
|
|
195
|
+
this.translateElement(element);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Re-translate the page (after language change)
|
|
199
|
+
*/
|
|
200
|
+
retranslate() {
|
|
201
|
+
// Restore original HTML for all previously translated elements
|
|
202
|
+
const translated = document.querySelectorAll('[data-lionrapid-client]');
|
|
203
|
+
translated.forEach((el) => {
|
|
204
|
+
const original = el.getAttribute('data-lr-original');
|
|
205
|
+
if (original !== null) {
|
|
206
|
+
el.innerHTML = original;
|
|
207
|
+
}
|
|
208
|
+
el.removeAttribute('data-lionrapid-client');
|
|
209
|
+
el.removeAttribute('data-lr-block');
|
|
210
|
+
});
|
|
211
|
+
// Re-translate (blocks are now back to source text, so auto_keys will be correct)
|
|
212
|
+
this.translatedCount = 0;
|
|
213
|
+
if (this.locale !== this.sourceLocale) {
|
|
214
|
+
this.translatePage();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=auto-translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-translator.js","sourceRoot":"","sources":["../../src/browser/auto-translator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Block Extractor
|
|
3
|
+
* Finds translatable block elements in DOM and parses them into ContentUnit.
|
|
4
|
+
* Mirrors WordPress TS BlockExtractor and edge proxy block-level approach.
|
|
5
|
+
*/
|
|
6
|
+
import type { ContentUnit } from '../content/types.js';
|
|
7
|
+
import { ExcludePatterns } from './exclude-filter.js';
|
|
8
|
+
export interface ExtractedBlock {
|
|
9
|
+
element: Element;
|
|
10
|
+
unit: ContentUnit;
|
|
11
|
+
key: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class BlockExtractor {
|
|
14
|
+
private excludeFilter;
|
|
15
|
+
private excludeSelectors;
|
|
16
|
+
constructor(excludePatterns?: Partial<ExcludePatterns>, excludeSelectors?: string[], minTextLength?: number);
|
|
17
|
+
/**
|
|
18
|
+
* Extract all translatable block elements from a root.
|
|
19
|
+
* @param includeTranslated - If true, include elements already marked as translated (for editor mode)
|
|
20
|
+
*/
|
|
21
|
+
extract(root: Element | Document, includeTranslated?: boolean): ExtractedBlock[];
|
|
22
|
+
private isInsideSkipTag;
|
|
23
|
+
private hasSkipAttribute;
|
|
24
|
+
private matchesExcludeSelector;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=block-extractor.d.ts.map
|