@taon-dev/i18n 21.0.50 → 21.0.53

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.
Files changed (119) hide show
  1. package/VERIFIED-BUILD-DATA.jsonc +3 -3
  2. package/browser/fesm2022/i18n-browser.mjs +91 -6
  3. package/browser/fesm2022/i18n-browser.mjs.map +1 -1
  4. package/browser/package.json +1 -1
  5. package/browser/types/i18n-browser.d.ts +11 -26
  6. package/browser-prod/fesm2022/i18n-browser-prod.mjs +91 -6
  7. package/browser-prod/fesm2022/i18n-browser-prod.mjs.map +1 -1
  8. package/browser-prod/package.json +1 -1
  9. package/browser-prod/types/i18n-browser-prod.d.ts +11 -26
  10. package/full-dts/build-info._auto-generated_.d.ts +1 -1
  11. package/full-dts/index._auto-generated_.d.ts +1 -2
  12. package/full-dts/local-translation.d.ts +8 -1
  13. package/lib/build-info._auto-generated_.d.ts +1 -1
  14. package/lib/build-info._auto-generated_.js +1 -1
  15. package/lib/index._auto-generated_.d.ts +0 -1
  16. package/lib/index._auto-generated_.js +0 -1
  17. package/lib/index._auto-generated_.js.map +1 -1
  18. package/lib/local-translation.d.ts +8 -1
  19. package/lib/local-translation.js +93 -6
  20. package/lib/local-translation.js.map +1 -1
  21. package/lib/package.json +1 -1
  22. package/lib-esm/lib/build-info._auto-generated_.d.ts +1 -1
  23. package/lib-esm/lib/build-info._auto-generated_.js +1 -1
  24. package/lib-esm/lib/index._auto-generated_.d.ts +0 -1
  25. package/lib-esm/lib/index._auto-generated_.js +0 -1
  26. package/lib-esm/lib/index._auto-generated_.js.map +1 -1
  27. package/lib-esm/lib/local-translation.d.ts +8 -1
  28. package/lib-esm/lib/local-translation.js +93 -8
  29. package/lib-esm/lib/local-translation.js.map +1 -1
  30. package/lib-prod/build-info._auto-generated_.d.ts +1 -1
  31. package/lib-prod/build-info._auto-generated_.js +1 -1
  32. package/lib-prod/index._auto-generated_.d.ts +0 -1
  33. package/lib-prod/index._auto-generated_.js +0 -1
  34. package/lib-prod/index._auto-generated_.js.map +1 -1
  35. package/lib-prod/local-translation.d.ts +8 -1
  36. package/lib-prod/local-translation.js +93 -6
  37. package/lib-prod/local-translation.js.map +1 -1
  38. package/lib-prod/package.json +1 -1
  39. package/package.json +1 -1
  40. package/ts-source/browser-code/build-info._auto-generated_.ts +2 -2
  41. package/ts-source/browser-code/i18n/lib.translation.ts +1 -1
  42. package/ts-source/browser-code/i18n/translation.ts.en-US.i18n.data.ts +1 -1
  43. package/ts-source/browser-code/i18n/translation.ts.pl-PL.i18n.data.ts +1 -1
  44. package/ts-source/browser-code/index._auto-generated_.ts +1 -2
  45. package/ts-source/browser-code/index.scss +1 -1
  46. package/ts-source/browser-code/index.ts +1 -1
  47. package/ts-source/browser-code/local-translation.ts +36 -1
  48. package/ts-source/browser-code/start-cli.ts +1 -1
  49. package/ts-source/browser-code/translate.directive.ts +1 -1
  50. package/ts-source/browser-code/translate.pipe.ts +1 -1
  51. package/ts-source/browser-code/translate.service.ts +1 -1
  52. package/ts-source/browser-code/translation-manager.ts +1 -1
  53. package/ts-source/browser-code/translation.models.ts +1 -1
  54. package/ts-source/browser-code/translation.ts +1 -1
  55. package/ts-source/browser-code/utils-i18n-extract-gettext-translate-from-html.ts +1 -1
  56. package/ts-source/browser-code/utils-i18n-html.ts +1 -1
  57. package/ts-source/browser-code/utils-po-file.ts +1 -1
  58. package/ts-source/browser-code-prod/build-info._auto-generated_.ts +2 -2
  59. package/ts-source/browser-code-prod/i18n/lib.translation.ts +1 -1
  60. package/ts-source/browser-code-prod/i18n/translation.ts.en-US.i18n.data.ts +1 -1
  61. package/ts-source/browser-code-prod/i18n/translation.ts.pl-PL.i18n.data.ts +1 -1
  62. package/ts-source/browser-code-prod/index._auto-generated_.ts +1 -2
  63. package/ts-source/browser-code-prod/index.scss +1 -1
  64. package/ts-source/browser-code-prod/index.ts +1 -1
  65. package/ts-source/browser-code-prod/local-translation.ts +36 -1
  66. package/ts-source/browser-code-prod/start-cli.ts +1 -1
  67. package/ts-source/browser-code-prod/translate.directive.ts +1 -1
  68. package/ts-source/browser-code-prod/translate.pipe.ts +1 -1
  69. package/ts-source/browser-code-prod/translate.service.ts +1 -1
  70. package/ts-source/browser-code-prod/translation-manager.ts +1 -1
  71. package/ts-source/browser-code-prod/translation.models.ts +1 -1
  72. package/ts-source/browser-code-prod/translation.ts +1 -1
  73. package/ts-source/browser-code-prod/utils-i18n-extract-gettext-translate-from-html.ts +1 -1
  74. package/ts-source/browser-code-prod/utils-i18n-html.ts +1 -1
  75. package/ts-source/browser-code-prod/utils-po-file.ts +1 -1
  76. package/ts-source/websql-code/build-info._auto-generated_.ts +2 -2
  77. package/ts-source/websql-code/i18n/lib.translation.ts +1 -1
  78. package/ts-source/websql-code/i18n/translation.ts.en-US.i18n.data.ts +1 -1
  79. package/ts-source/websql-code/i18n/translation.ts.pl-PL.i18n.data.ts +1 -1
  80. package/ts-source/websql-code/index._auto-generated_.ts +1 -2
  81. package/ts-source/websql-code/index.scss +1 -1
  82. package/ts-source/websql-code/index.ts +1 -1
  83. package/ts-source/websql-code/local-translation.ts +36 -1
  84. package/ts-source/websql-code/start-cli.ts +1 -1
  85. package/ts-source/websql-code/translate.directive.ts +1 -1
  86. package/ts-source/websql-code/translate.pipe.ts +1 -1
  87. package/ts-source/websql-code/translate.service.ts +1 -1
  88. package/ts-source/websql-code/translation-manager.ts +1 -1
  89. package/ts-source/websql-code/translation.models.ts +1 -1
  90. package/ts-source/websql-code/translation.ts +1 -1
  91. package/ts-source/websql-code/utils-i18n-extract-gettext-translate-from-html.ts +1 -1
  92. package/ts-source/websql-code/utils-i18n-html.ts +1 -1
  93. package/ts-source/websql-code/utils-po-file.ts +1 -1
  94. package/ts-source/websql-code-prod/build-info._auto-generated_.ts +2 -2
  95. package/ts-source/websql-code-prod/i18n/lib.translation.ts +1 -1
  96. package/ts-source/websql-code-prod/i18n/translation.ts.en-US.i18n.data.ts +1 -1
  97. package/ts-source/websql-code-prod/i18n/translation.ts.pl-PL.i18n.data.ts +1 -1
  98. package/ts-source/websql-code-prod/index._auto-generated_.ts +1 -2
  99. package/ts-source/websql-code-prod/index.scss +1 -1
  100. package/ts-source/websql-code-prod/index.ts +1 -1
  101. package/ts-source/websql-code-prod/local-translation.ts +36 -1
  102. package/ts-source/websql-code-prod/start-cli.ts +1 -1
  103. package/ts-source/websql-code-prod/translate.directive.ts +1 -1
  104. package/ts-source/websql-code-prod/translate.pipe.ts +1 -1
  105. package/ts-source/websql-code-prod/translate.service.ts +1 -1
  106. package/ts-source/websql-code-prod/translation-manager.ts +1 -1
  107. package/ts-source/websql-code-prod/translation.models.ts +1 -1
  108. package/ts-source/websql-code-prod/translation.ts +1 -1
  109. package/ts-source/websql-code-prod/utils-i18n-extract-gettext-translate-from-html.ts +1 -1
  110. package/ts-source/websql-code-prod/utils-i18n-html.ts +1 -1
  111. package/ts-source/websql-code-prod/utils-po-file.ts +1 -1
  112. package/websql/fesm2022/i18n-websql.mjs +91 -6
  113. package/websql/fesm2022/i18n-websql.mjs.map +1 -1
  114. package/websql/package.json +1 -1
  115. package/websql/types/i18n-websql.d.ts +11 -26
  116. package/websql-prod/fesm2022/i18n-websql-prod.mjs +91 -6
  117. package/websql-prod/fesm2022/i18n-websql-prod.mjs.map +1 -1
  118. package/websql-prod/package.json +1 -1
  119. package/websql-prod/types/i18n-websql-prod.d.ts +11 -26
@@ -1,21 +1,29 @@
1
+ //#region imports
1
2
  import { crossPlatformPath, dotTaonFolder, ___NS__first, Helpers__NS__mkdirp, UtilsOs__NS__getRealHomeDir } from 'tnp-core/lib-prod';
3
+ //#endregion
4
+ //#region constants
2
5
  const MODEL_ID = 'Xenova/nllb-200-distilled-600M';
3
6
  const nllbLanguageCodes = {
4
7
  'en-US': 'eng_Latn',
5
8
  'pl-PL': 'pol_Latn',
6
9
  'de-DE': 'deu_Latn',
7
10
  };
11
+ const CONTEXT_SEPARATOR = '→';
12
+ //#endregion
8
13
  export class LocalTranslationService {
14
+ //#region fields & getters
9
15
  translatorPromise;
10
16
  aiReady = false;
11
17
  warmupPromise;
12
18
  progressListeners = new Set();
19
+ //#endregion
13
20
  /**
14
21
  * Downloads, caches and loads the translation model.
15
22
  *
16
23
  * Multiple simultaneous calls share the same initialization promise.
17
24
  * After this resolves, translate() reuses the already loaded model.
18
25
  */
26
+ //#region methods / make sure ai downloaded
19
27
  async makeSureAiDownloaded(options = {}) {
20
28
  //#region @backendFunc
21
29
  const { onProgress, warmup = false } = options;
@@ -35,12 +43,16 @@ export class LocalTranslationService {
35
43
  }
36
44
  //#endregion
37
45
  }
46
+ //#endregion
38
47
  /**
39
48
  * True only in this process after pipeline initialization succeeded.
40
49
  */
50
+ //#region methods / is ai ready
41
51
  isAiReady() {
42
52
  return this.aiReady;
43
53
  }
54
+ //#endregion
55
+ //#region methods / get translator
44
56
  getTranslator() {
45
57
  this.translatorPromise ??= this.createTranslator().catch(error => {
46
58
  // Allow a later call to retry after a network or disk failure.
@@ -50,6 +62,8 @@ export class LocalTranslationService {
50
62
  });
51
63
  return this.translatorPromise;
52
64
  }
65
+ //#endregion
66
+ //#region methods / create translator
53
67
  async createTranslator() {
54
68
  //#region @backendFunc
55
69
  //#region @esmRemove
@@ -71,6 +85,8 @@ export class LocalTranslationService {
71
85
  //#endregion
72
86
  return void 0;
73
87
  }
88
+ //#endregion
89
+ //#region methods / emit progress
74
90
  emitProgress(progress) {
75
91
  for (const listener of this.progressListeners) {
76
92
  try {
@@ -81,6 +97,8 @@ export class LocalTranslationService {
81
97
  }
82
98
  }
83
99
  }
100
+ //#endregion
101
+ //#region methods / warmup translator
84
102
  warmupTranslator(translator) {
85
103
  this.warmupPromise ??= translator('Hello.', {
86
104
  src_lang: 'eng_Latn',
@@ -94,6 +112,8 @@ export class LocalTranslationService {
94
112
  });
95
113
  return this.warmupPromise;
96
114
  }
115
+ //#endregion
116
+ //#region methods / translate
97
117
  async translate(options) {
98
118
  //#region @backendFunc
99
119
  let { text, context, from, to, glossary } = options;
@@ -112,19 +132,54 @@ export class LocalTranslationService {
112
132
  if (!tgtLang) {
113
133
  throw new Error(`Unsupported target translation locale: ${toOrg}`);
114
134
  }
115
- const input = context?.trim()
116
- ? `${context.trim()}\n\n${text.trim()}`
135
+ /**
136
+ * Context is included so NLLB can use it while translating,
137
+ * but only content after CONTEXT_SEPARATOR is returned.
138
+ */
139
+ const hasContext = !!context?.trim();
140
+ const input = hasContext
141
+ ? `${context.trim()}\n\n${CONTEXT_SEPARATOR}\n\n${text.trim()}`
117
142
  : text;
118
- const protectedInput = this.protectGlossary(input, glossary);
143
+ /**
144
+ * Protect [[ ... ]] before doing glossary substitutions.
145
+ *
146
+ * This is intentionally first so glossary entries can never
147
+ * accidentally modify interpolation expressions.
148
+ */
149
+ const protectedInterpolation = this.protectInterpolation(input);
150
+ const protectedGlossary = this.protectGlossary(protectedInterpolation.preparedText, glossary);
119
151
  const translator = await this.getTranslator();
120
- const result = await translator(protectedInput.preparedText, {
152
+ const result = await translator(protectedGlossary.preparedText, {
121
153
  src_lang: srcLang,
122
154
  tgt_lang: tgtLang,
123
155
  });
124
- const translatedText = result[0]?.translation_text ?? '';
125
- return protectedInput.restore(translatedText);
156
+ let translatedText = result[0]?.translation_text ?? '';
157
+ /**
158
+ * Restore glossary values first, then interpolation expressions.
159
+ */
160
+ translatedText = protectedGlossary.restore(translatedText);
161
+ translatedText = protectedInterpolation.restore(translatedText);
162
+ /**
163
+ * Remove translated context from the final result.
164
+ */
165
+ if (hasContext) {
166
+ const separatorIndex = translatedText.lastIndexOf('→');
167
+ if (separatorIndex !== -1) {
168
+ translatedText = translatedText.slice(separatorIndex + 1).trim();
169
+ }
170
+ else {
171
+ // separator disappeared — never return context accidentally
172
+ return this.translate({
173
+ ...options,
174
+ context: undefined,
175
+ });
176
+ }
177
+ }
178
+ return translatedText;
126
179
  //#endregion
127
180
  }
181
+ //#endregion
182
+ //#region methods / protect glossary
128
183
  protectGlossary(text, glossary) {
129
184
  if (!glossary || Object.keys(glossary).length === 0) {
130
185
  return {
@@ -155,6 +210,38 @@ export class LocalTranslationService {
155
210
  },
156
211
  };
157
212
  }
213
+ //#endregion
214
+ //#region methods / protect interpolation
215
+ protectInterpolation(text) {
216
+ const replacements = [];
217
+ const preparedText = text.replace(/\[\[[\s\S]*?\]\]/g, originalValue => {
218
+ const placeholder = `TAONINTERPOLATION${replacements.length}PLACEHOLDER`;
219
+ replacements.push({
220
+ placeholder,
221
+ originalValue,
222
+ });
223
+ return placeholder;
224
+ });
225
+ return {
226
+ preparedText,
227
+ restore(translatedText) {
228
+ let result = translatedText;
229
+ for (const replacement of replacements) {
230
+ if (!result.includes(replacement.placeholder)) {
231
+ console.error(`Translation model removed interpolation placeholder ` +
232
+ `"${replacement.placeholder}" while translating "${text}". ` +
233
+ `Appending "${replacement.originalValue}" manually.`);
234
+ result = `${result.trimEnd()} ${replacement.originalValue}`;
235
+ continue;
236
+ }
237
+ result = result.replaceAll(replacement.placeholder, replacement.originalValue);
238
+ }
239
+ return result;
240
+ },
241
+ };
242
+ }
243
+ //#endregion
244
+ //#region methods / get models cache path
158
245
  getModelsCachePath() {
159
246
  const cachePath = crossPlatformPath([
160
247
  UtilsOs__NS__getRealHomeDir(),
@@ -1 +1 @@
1
- {"version":3,"file":"local-translation.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAA+lC,YAAY,EAAg4K,mBAAmB,EAAyvD,2BAA2B,EAAgtC,MAAM,mBAAmB,CAAC;AA6DriT,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AAElD,MAAM,iBAAiB,GAEnB;IACF,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,UAAU;CACpB,CAAC;AAEF,MAAM,OAAO,uBAAuB;IAC1B,iBAAiB,CAAgB;IAEjC,OAAO,GAAG,KAAK,CAAC;IAEhB,aAAa,CAAiB;IAE9B,iBAAiB,GAAG,IAAI,GAAG,EAEhC,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,oBAAoB,CACxB,UAAuC,EAAE;QAEzC,sBAAsB;QACtB,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;QAE/C,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAE9C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,YAAY;IACd,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAC/D,+DAA+D;YAC/D,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YAErB,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,sBAAsB;QACtB,oBAAoB;QACpB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CACpC,2BAA2B,CAC5B,CAAC;QAEF,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAEzC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE;YACzD,KAAK,EAAE,IAAI;YAEX,iBAAiB,EAAE,CAAC,QAA4B,EAAE,EAAE;gBAClD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,YAAY,CAAC;YAChB,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;QAClB,YAAY;QACZ,YAAY;QACZ,OAAO,KAAK,CAAQ,CAAC;IACvB,CAAC;IAEO,YAAY,CAAC,QAA4B;QAC/C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,qDAAqD;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,UAAe;QACtC,IAAI,CAAC,aAAa,KAAK,UAAU,CAAC,QAAQ,EAAE;YAC1C,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,UAAU;YACpB,cAAc,EAAE,EAAE;SACnB,CAAC;aACC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACrB,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QAEL,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAA2B;QACzC,sBAAsB;QACtB,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,KAAK,GAAG,EAAE,CAAC;QAEjB,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAQ,CAAC;QAC5C,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAQ,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,0CAA0C,OAAO,EAAE,CACpD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,0CAA0C,KAAK,EAAE,CAClD,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE;YAC3B,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE;YACvC,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,YAAY,EAAE;YAC3D,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,MAAM,cAAc,GAClB,MAAM,CAAC,CAAC,CAAC,EAAE,gBAAgB,IAAI,EAAE,CAAC;QAEpC,OAAO,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC9C,YAAY;IACd,CAAC;IAEO,eAAe,CACrB,IAAY,EACZ,QAAiC;QAKjC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO;gBACL,YAAY,EAAE,IAAI;gBAClB,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC,cAAc;aAC1C,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAGb,EAAE,CAAC;QAER,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;aACrB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;aACrD,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE;YACjD,MAAM,WAAW,GAAG,WAAW,KAAK,aAAa,CAAC;YAElD,YAAY,GAAG,YAAY,CAAC,UAAU,CACpC,WAAW,EACX,WAAW,CACZ,CAAC;YAEF,YAAY,CAAC,IAAI,CAAC;gBAChB,WAAW;gBACX,eAAe;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEL,OAAO;YACL,YAAY;YAEZ,OAAO,CAAC,cAAsB;gBAC5B,IAAI,MAAM,GAAG,cAAc,CAAC;gBAE5B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,MAAM,GAAG,MAAM,CAAC,UAAU,CACxB,WAAW,CAAC,WAAW,EACvB,WAAW,CAAC,eAAe,CAC5B,CAAC;gBACJ,CAAC;gBAED,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,MAAM,SAAS,GAAG,iBAAiB,CAAC;YAClC,2BAA2B,EAAE;YAC7B,aAAa;YACb,iBAAiB;SAClB,CAAC,CAAC;QAEH,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAE/B,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"local-translation.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "name": "@taon-dev/i18n/lib-prod",
3
- "version": "21.0.50"
3
+ "version": "21.0.53"
4
4
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taon-dev/i18n",
3
- "version": "21.0.50",
3
+ "version": "21.0.53",
4
4
  "scripts": {
5
5
  "taon init": "taon init",
6
6
  "taon start": "taon start",
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -15,4 +15,4 @@ export const APP_ID = 'com.domain.example.i18n';
15
15
  export const BUILD_BASE_HREF = '';
16
16
  export const PROJECT_NPM_NAME = '@taon-dev/i18n';
17
17
  export const CURRENT_PACKAGE_TAON_VERSION = 'v21';
18
- export const CURRENT_PACKAGE_VERSION = '21.0.50';
18
+ export const CURRENT_PACKAGE_VERSION = '21.0.53';
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -22,4 +22,3 @@ export * from './translation';
22
22
  export * from './utils-i18n-extract-gettext-translate-from-html';
23
23
  export * from './utils-i18n-html';
24
24
  export * from './utils-po-file';
25
- export * from './i18n/lib.translation';
@@ -3,7 +3,7 @@
3
3
  - TAON READONLY SOURCE
4
4
  - DO NOT MODIFY THIS FILE.
5
5
  - Changes may be overwritten.
6
- - Use command: taon build:lib:watch
6
+ - Use command: taon build:watch:lib
7
7
  inside @taon-dev/i18n project repository
8
8
  for watch development of third party modules like this.
9
9
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -35,6 +35,7 @@ const nllbLanguageCodes: Partial<Record<UtilsI18n.CommonLocaleCode, string>> = {
35
35
  'pl-PL': 'pol_Latn',
36
36
  'de-DE': 'deu_Latn',
37
37
  };
38
+ const CONTEXT_SEPARATOR = '→';
38
39
  export class LocalTranslationService {
39
40
  private translatorPromise?: Promise<any>;
40
41
  private aiReady = false;
@@ -119,6 +120,40 @@ export class LocalTranslationService {
119
120
  },
120
121
  };
121
122
  }
123
+ private protectInterpolation(text: string): {
124
+ preparedText: string;
125
+ restore: (translatedText: string) => string;
126
+ } {
127
+ const replacements: Array<{
128
+ placeholder: string;
129
+ originalValue: string;
130
+ }> = [];
131
+ const preparedText = text.replace(/\[\[[\s\S]*?\]\]/g, originalValue => {
132
+ const placeholder = `TAONINTERPOLATION${replacements.length}PLACEHOLDER`;
133
+ replacements.push({
134
+ placeholder,
135
+ originalValue,
136
+ });
137
+ return placeholder;
138
+ });
139
+ return {
140
+ preparedText,
141
+ restore(translatedText: string): string {
142
+ let result = translatedText;
143
+ for (const replacement of replacements) {
144
+ if (!result.includes(replacement.placeholder)) {
145
+ console.error(`Translation model removed interpolation placeholder ` +
146
+ `"${replacement.placeholder}" while translating "${text}". ` +
147
+ `Appending "${replacement.originalValue}" manually.`);
148
+ result = `${result.trimEnd()} ${replacement.originalValue}`;
149
+ continue;
150
+ }
151
+ result = result.replaceAll(replacement.placeholder, replacement.originalValue);
152
+ }
153
+ return result;
154
+ },
155
+ };
156
+ }
122
157
  private getModelsCachePath(): string {
123
158
  const cachePath = crossPlatformPath([
124
159
  UtilsOs.getRealHomeDir(),
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -15,4 +15,4 @@ export const APP_ID = 'com.domain.example.i18n';
15
15
  export const BUILD_BASE_HREF = '';
16
16
  export const PROJECT_NPM_NAME = '@taon-dev/i18n';
17
17
  export const CURRENT_PACKAGE_TAON_VERSION = 'v21';
18
- export const CURRENT_PACKAGE_VERSION = '21.0.50';
18
+ export const CURRENT_PACKAGE_VERSION = '21.0.53';
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -22,4 +22,3 @@ export * from './translation';
22
22
  export * from './utils-i18n-extract-gettext-translate-from-html';
23
23
  export * from './utils-i18n-html';
24
24
  export * from './utils-po-file';
25
- export * from './i18n/lib.translation';
@@ -3,7 +3,7 @@
3
3
  - TAON READONLY SOURCE
4
4
  - DO NOT MODIFY THIS FILE.
5
5
  - Changes may be overwritten.
6
- - Use command: taon build:lib:watch
6
+ - Use command: taon build:watch:lib
7
7
  inside @taon-dev/i18n project repository
8
8
  for watch development of third party modules like this.
9
9
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -35,6 +35,7 @@ const nllbLanguageCodes: Partial<Record<UtilsI18n__NS__CommonLocaleCode, string>
35
35
  'pl-PL': 'pol_Latn',
36
36
  'de-DE': 'deu_Latn',
37
37
  };
38
+ const CONTEXT_SEPARATOR = '→';
38
39
  export class LocalTranslationService {
39
40
  private translatorPromise?: Promise<any>;
40
41
  private aiReady = false;
@@ -119,6 +120,40 @@ export class LocalTranslationService {
119
120
  },
120
121
  };
121
122
  }
123
+ private protectInterpolation(text: string): {
124
+ preparedText: string;
125
+ restore: (translatedText: string) => string;
126
+ } {
127
+ const replacements: Array<{
128
+ placeholder: string;
129
+ originalValue: string;
130
+ }> = [];
131
+ const preparedText = text.replace(/\[\[[\s\S]*?\]\]/g, originalValue => {
132
+ const placeholder = `TAONINTERPOLATION${replacements.length}PLACEHOLDER`;
133
+ replacements.push({
134
+ placeholder,
135
+ originalValue,
136
+ });
137
+ return placeholder;
138
+ });
139
+ return {
140
+ preparedText,
141
+ restore(translatedText: string): string {
142
+ let result = translatedText;
143
+ for (const replacement of replacements) {
144
+ if (!result.includes(replacement.placeholder)) {
145
+ console.error(`Translation model removed interpolation placeholder ` +
146
+ `"${replacement.placeholder}" while translating "${text}". ` +
147
+ `Appending "${replacement.originalValue}" manually.`);
148
+ result = `${result.trimEnd()} ${replacement.originalValue}`;
149
+ continue;
150
+ }
151
+ result = result.replaceAll(replacement.placeholder, replacement.originalValue);
152
+ }
153
+ return result;
154
+ },
155
+ };
156
+ }
122
157
  private getModelsCachePath(): string {
123
158
  const cachePath = crossPlatformPath([
124
159
  UtilsOs__NS__getRealHomeDir(),
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10
 
@@ -4,7 +4,7 @@
4
4
  - TAON READONLY SOURCE
5
5
  - DO NOT MODIFY THIS FILE.
6
6
  - Changes may be overwritten.
7
- - Use command: taon build:lib:watch
7
+ - Use command: taon build:watch:lib
8
8
  inside @taon-dev/i18n project repository
9
9
  for watch development of third party modules like this.
10
10