glotto 2.9.0 → 3.0.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.
Files changed (138) hide show
  1. package/README.md +86 -55
  2. package/esm/cli.js +47 -39
  3. package/esm/deno.d.ts +0 -1
  4. package/esm/deno.js +1 -2
  5. package/esm/src/contants.d.ts +2 -2
  6. package/esm/src/contants.d.ts.map +1 -1
  7. package/esm/src/contants.js +22 -12
  8. package/esm/src/file.d.ts +2 -7
  9. package/esm/src/file.d.ts.map +1 -1
  10. package/esm/src/file.js +1 -108
  11. package/esm/src/providers/anthropic.d.ts +6 -11
  12. package/esm/src/providers/anthropic.d.ts.map +1 -1
  13. package/esm/src/providers/anthropic.js +14 -108
  14. package/esm/src/providers/gemini.d.ts +6 -11
  15. package/esm/src/providers/gemini.d.ts.map +1 -1
  16. package/esm/src/providers/gemini.js +13 -114
  17. package/esm/src/providers/openai.d.ts +6 -11
  18. package/esm/src/providers/openai.d.ts.map +1 -1
  19. package/esm/src/providers/openai.js +10 -109
  20. package/esm/src/translator.d.ts +8 -0
  21. package/esm/src/translator.d.ts.map +1 -0
  22. package/esm/src/translator.js +200 -0
  23. package/esm/src/types.d.ts +28 -11
  24. package/esm/src/types.d.ts.map +1 -1
  25. package/esm/src/utilites.d.ts +0 -6
  26. package/esm/src/utilites.d.ts.map +1 -1
  27. package/esm/src/utilites.js +18 -132
  28. package/package.json +1 -1
  29. package/script/cli.js +45 -37
  30. package/script/deno.d.ts +0 -1
  31. package/script/deno.js +1 -2
  32. package/script/src/contants.d.ts +2 -2
  33. package/script/src/contants.d.ts.map +1 -1
  34. package/script/src/contants.js +23 -13
  35. package/script/src/file.d.ts +2 -7
  36. package/script/src/file.d.ts.map +1 -1
  37. package/script/src/file.js +2 -114
  38. package/script/src/providers/anthropic.d.ts +6 -11
  39. package/script/src/providers/anthropic.d.ts.map +1 -1
  40. package/script/src/providers/anthropic.js +13 -107
  41. package/script/src/providers/gemini.d.ts +6 -11
  42. package/script/src/providers/gemini.d.ts.map +1 -1
  43. package/script/src/providers/gemini.js +12 -113
  44. package/script/src/providers/openai.d.ts +6 -11
  45. package/script/src/providers/openai.d.ts.map +1 -1
  46. package/script/src/providers/openai.js +9 -108
  47. package/script/src/translator.d.ts +8 -0
  48. package/script/src/translator.d.ts.map +1 -0
  49. package/script/src/translator.js +209 -0
  50. package/script/src/types.d.ts +28 -11
  51. package/script/src/types.d.ts.map +1 -1
  52. package/script/src/utilites.d.ts +0 -6
  53. package/script/src/utilites.d.ts.map +1 -1
  54. package/script/src/utilites.js +19 -136
  55. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
  56. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
  57. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -51
  58. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts +0 -35
  59. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts.map +0 -1
  60. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.js +0 -192
  61. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts +0 -35
  62. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts.map +0 -1
  63. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.js +0 -113
  64. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
  65. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
  66. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -13
  67. package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
  68. package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
  69. package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -2
  70. package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts +0 -2
  71. package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts.map +0 -1
  72. package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.js +0 -26
  73. package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts +0 -61
  74. package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts.map +0 -1
  75. package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.js +0 -152
  76. package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts +0 -40
  77. package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts.map +0 -1
  78. package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.js +0 -87
  79. package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts +0 -40
  80. package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts.map +0 -1
  81. package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.js +0 -131
  82. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts +0 -40
  83. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts.map +0 -1
  84. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.js +0 -82
  85. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts +0 -40
  86. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts.map +0 -1
  87. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.js +0 -72
  88. package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
  89. package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
  90. package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -87
  91. package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts +0 -98
  92. package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts.map +0 -1
  93. package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.js +0 -99
  94. package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts +0 -120
  95. package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts.map +0 -1
  96. package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.js +0 -205
  97. package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
  98. package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
  99. package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -57
  100. package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts +0 -35
  101. package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts.map +0 -1
  102. package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.js +0 -198
  103. package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts +0 -35
  104. package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts.map +0 -1
  105. package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.js +0 -119
  106. package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
  107. package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
  108. package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -16
  109. package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
  110. package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
  111. package/script/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -3
  112. package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts +0 -2
  113. package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts.map +0 -1
  114. package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.js +0 -29
  115. package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts +0 -61
  116. package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts.map +0 -1
  117. package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.js +0 -156
  118. package/script/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts +0 -40
  119. package/script/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts.map +0 -1
  120. package/script/deps/jsr.io/@std/encoding/1.0.10/base32.js +0 -91
  121. package/script/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts +0 -40
  122. package/script/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts.map +0 -1
  123. package/script/deps/jsr.io/@std/encoding/1.0.10/base58.js +0 -135
  124. package/script/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts +0 -40
  125. package/script/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts.map +0 -1
  126. package/script/deps/jsr.io/@std/encoding/1.0.10/base64.js +0 -86
  127. package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts +0 -40
  128. package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts.map +0 -1
  129. package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.js +0 -76
  130. package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
  131. package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
  132. package/script/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -91
  133. package/script/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts +0 -98
  134. package/script/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts.map +0 -1
  135. package/script/deps/jsr.io/@std/encoding/1.0.10/mod.js +0 -115
  136. package/script/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts +0 -120
  137. package/script/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts.map +0 -1
  138. package/script/deps/jsr.io/@std/encoding/1.0.10/varint.js +0 -211
@@ -1,36 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HELP_TEXT = exports.INTER_CHUNK_DELAY_MS = exports.BASE_RETRY_DELAY_MS = exports.MAX_RETRIES = exports.DEFAULT_MAX_CHUNK_BYTES = exports.DEFAULT_MODELS = exports.DEFAULT_PROVIDER = void 0;
3
+ exports.HELP_TEXT = exports.INTER_BATCH_DELAY_MS = exports.BASE_RETRY_DELAY_MS = exports.MAX_RETRIES = exports.DEFAULT_MAX_BATCH_BYTES = exports.DEFAULT_MODELS = exports.DEFAULT_PROVIDER = void 0;
4
4
  exports.DEFAULT_PROVIDER = 'gemini';
5
5
  exports.DEFAULT_MODELS = {
6
6
  gemini: 'gemini-2.5-flash',
7
7
  openai: 'gpt-4.1-mini',
8
8
  anthropic: 'claude-3-5-haiku-latest',
9
9
  };
10
- exports.DEFAULT_MAX_CHUNK_BYTES = 30_000;
10
+ exports.DEFAULT_MAX_BATCH_BYTES = 12_000;
11
11
  exports.MAX_RETRIES = 3;
12
12
  exports.BASE_RETRY_DELAY_MS = 2_000;
13
- exports.INTER_CHUNK_DELAY_MS = 1_500;
13
+ exports.INTER_BATCH_DELAY_MS = 1_500;
14
14
  exports.HELP_TEXT = `
15
15
  Glotto AI Translator
16
16
  -------------------
17
17
  A tool for translating i18n JSON files using AI services.
18
18
 
19
+ Glotto walks the input JSON, extracts every string leaf with its path, sends them to the
20
+ chosen provider as plain-text batches (using ≪id≫value≪/id≫ tagged entries), and
21
+ reconstructs the JSON from the responses. JSON structure, keys, variables and HTML tags
22
+ are preserved by the tool itself — the model only sees and produces text.
23
+
19
24
  Options:
20
- --key API key for the AI service (required)
21
- -p, --provider AI translation provider to use (default: ${exports.DEFAULT_PROVIDER})
22
- -m, --model Model name for the selected provider (optional)
23
- -i, --input Path to source JSON file (required)
24
- -o, --output Path to target JSON file (required)
25
- -f, --from Source language (required)
26
- -t, --to Target language (required)
27
- --url Custom base URL for OpenAI/Anthropic (optional)
28
- -h, --help Display this help message
29
- -v, --version Display version
25
+ --key API key for the AI service (required)
26
+ -p, --provider AI translation provider to use (default: ${exports.DEFAULT_PROVIDER})
27
+ -m, --model Model name for the selected provider (optional)
28
+ -i, --input Path to source JSON file (required)
29
+ -o, --output Path to target JSON file (required)
30
+ -f, --from Source language (required)
31
+ -t, --to Target language (required)
32
+ --url Custom base URL for OpenAI/Anthropic (optional)
33
+ --no-limit Disable rate limit delay between batches
34
+ --no-timeout Disable request timeout (wait indefinitely for AI response)
35
+ --max-batch-size Maximum source size per batch, in KB (default: ${exports.DEFAULT_MAX_BATCH_BYTES / 1024} KB)
36
+ -h, --help Display this help message
37
+ -v, --version Display version
30
38
 
31
39
  Examples:
32
40
  glotto --key {{key}} --input=en.json --output=tr.json --from=english --to=turkish
33
41
  glotto --key {{key}} -i en.json -o tr.json -f english -t turkish -p gemini
34
42
  glotto --key {{key}} -i en.json -o tr.json -f english -t turkish -p openai
35
43
  glotto --key {{key}} -i en.json -o tr.json -f english -t turkish -p anthropic
44
+ glotto --key {{key}} -i en.json -o tr.json -f english -t turkish --no-limit --no-timeout
45
+ glotto --key {{key}} -i en.json -o tr.json -f english -t turkish --max-batch-size 8
36
46
  `;
@@ -1,10 +1,5 @@
1
- import type { ChunkInfo, JsonObject } from './types.js';
1
+ import type { JsonValue } from './types.js';
2
2
  export declare const resolvePath: (...paths: string[]) => string;
3
- export declare const getImportJson: <T = JsonObject>(input: string) => Promise<T>;
3
+ export declare const getImportJson: <T = JsonValue>(input: string) => Promise<T>;
4
4
  export declare const writeOutput: (outputPath: string, content: string) => Promise<void>;
5
- export declare const existsFile: (path: string) => Promise<boolean>;
6
- export declare const ensureDirectoryExists: (directory: string) => Promise<void>;
7
- export declare const splitJson: (data: JsonObject, maxChunkBytes?: number) => ChunkInfo[];
8
- export declare const mergeInputs: (inputs: JsonObject[]) => JsonObject;
9
- export declare const writeTemp: (targetLanguage: string, tempJsonFileName: string, content: string) => Promise<void>;
10
5
  //# sourceMappingURL=file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/src/file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD,eAAO,MAAM,WAAW,GAAI,GAAG,OAAO,MAAM,EAAE,WAE7C,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,CAAC,GAAG,UAAU,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,CAAC,CAS5E,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,YAAY,MAAM,EAAE,SAAS,MAAM,kBAEpE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,MAAM,MAAM,qBAW5C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,IAAI,CAK3E,CAAC;AAeF,eAAO,MAAM,SAAS,GAAI,MAAM,UAAU,EAAE,gBAAe,MAAe,KAAG,SAAS,EA4DrF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,UAAU,EAAE,KAAG,UAElD,CAAC;AAkBF,eAAO,MAAM,SAAS,GAAU,gBAAgB,MAAM,EAAE,kBAAkB,MAAM,EAAE,SAAS,MAAM,kBAKhG,CAAC"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/src/file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,WAAW,GAAI,GAAG,OAAO,MAAM,EAAE,KAAG,MAA4C,CAAC;AAE9F,eAAO,MAAM,aAAa,GAAU,CAAC,GAAG,SAAS,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,CAAC,CAO3E,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,YAAY,MAAM,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,IAAI,CAEnF,CAAC"}
@@ -33,13 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.writeTemp = exports.mergeInputs = exports.splitJson = exports.ensureDirectoryExists = exports.existsFile = exports.writeOutput = exports.getImportJson = exports.resolvePath = void 0;
36
+ exports.writeOutput = exports.getImportJson = exports.resolvePath = void 0;
37
37
  const dntShim = __importStar(require("../_dnt.shims.js"));
38
38
  const mod_js_1 = require("../deps/jsr.io/@std/path/1.1.4/mod.js");
39
- const logger_js_1 = require("./logger.js");
40
- const resolvePath = (...paths) => {
41
- return (0, mod_js_1.join)(dntShim.Deno.cwd(), ...paths);
42
- };
39
+ const resolvePath = (...paths) => (0, mod_js_1.join)(dntShim.Deno.cwd(), ...paths);
43
40
  exports.resolvePath = resolvePath;
44
41
  const getImportJson = async (input) => {
45
42
  const filePath = (0, exports.resolvePath)(input);
@@ -54,112 +51,3 @@ const writeOutput = async (outputPath, content) => {
54
51
  await dntShim.Deno.writeTextFile(outputPath, content, { create: true });
55
52
  };
56
53
  exports.writeOutput = writeOutput;
57
- const existsFile = async (path) => {
58
- try {
59
- await dntShim.Deno.stat(path);
60
- return true;
61
- }
62
- catch (error) {
63
- if (error instanceof dntShim.Deno.errors.NotFound) {
64
- return false;
65
- }
66
- throw error;
67
- }
68
- };
69
- exports.existsFile = existsFile;
70
- const ensureDirectoryExists = async (directory) => {
71
- const directoryExists = await (0, exports.existsFile)(directory);
72
- if (!directoryExists) {
73
- await dntShim.Deno.mkdir(directory, { recursive: true });
74
- }
75
- };
76
- exports.ensureDirectoryExists = ensureDirectoryExists;
77
- const getByteSize = (str) => {
78
- return new TextEncoder().encode(str).byteLength;
79
- };
80
- const buildChunkWithSize = (data, keys) => {
81
- const chunk = Object.create(null);
82
- for (const key of keys) {
83
- chunk[key] = data[key];
84
- }
85
- const json = JSON.stringify(chunk);
86
- return { json, size: getByteSize(json) };
87
- };
88
- const splitJson = (data, maxChunkBytes = 30_000) => {
89
- const encoder = new TextEncoder();
90
- const dataKeys = Object.keys(data);
91
- const totalKeys = dataKeys.length;
92
- const fullJson = JSON.stringify(data);
93
- const totalBytes = getByteSize(fullJson);
94
- if (totalBytes <= maxChunkBytes) {
95
- return [
96
- {
97
- data: encoder.encode(fullJson),
98
- keyCount: totalKeys,
99
- byteSize: totalBytes,
100
- index: 0,
101
- },
102
- ];
103
- }
104
- const chunks = [];
105
- let currentKeys = [];
106
- let currentSize = 2;
107
- for (let i = 0; i < totalKeys; i++) {
108
- const key = dataKeys[i];
109
- const keyValueJson = JSON.stringify({ [key]: data[key] });
110
- const entrySize = getByteSize(keyValueJson) - 2;
111
- const separatorSize = currentKeys.length > 0 ? 1 : 0;
112
- const projectedSize = currentSize + entrySize + separatorSize;
113
- if (projectedSize > maxChunkBytes && currentKeys.length > 0) {
114
- const { json, size } = buildChunkWithSize(data, currentKeys);
115
- chunks.push({
116
- data: encoder.encode(json),
117
- keyCount: currentKeys.length,
118
- byteSize: size,
119
- index: chunks.length,
120
- });
121
- currentKeys = [key];
122
- currentSize = 2 + entrySize;
123
- }
124
- else {
125
- currentKeys.push(key);
126
- currentSize = projectedSize;
127
- }
128
- }
129
- if (currentKeys.length > 0) {
130
- const { json, size } = buildChunkWithSize(data, currentKeys);
131
- chunks.push({
132
- data: encoder.encode(json),
133
- keyCount: currentKeys.length,
134
- byteSize: size,
135
- index: chunks.length,
136
- });
137
- }
138
- return chunks;
139
- };
140
- exports.splitJson = splitJson;
141
- const mergeInputs = (inputs) => {
142
- return Object.assign({}, ...inputs);
143
- };
144
- exports.mergeInputs = mergeInputs;
145
- const getOsTempDir = () => {
146
- if (dntShim.Deno.build.os === 'windows') {
147
- return dntShim.Deno.env.get('TEMP') ?? dntShim.Deno.env.get('TMP') ?? 'C:\\Windows\\Temp';
148
- }
149
- return dntShim.Deno.env.get('TMPDIR') ?? '/tmp';
150
- };
151
- const resolveTempDir = async (targetLanguage) => {
152
- const tempDir = getOsTempDir();
153
- const glottoTempDir = (0, mod_js_1.join)(tempDir, 'glotto');
154
- await (0, exports.ensureDirectoryExists)(glottoTempDir);
155
- const languageTempDir = (0, mod_js_1.join)(glottoTempDir, targetLanguage);
156
- await (0, exports.ensureDirectoryExists)(languageTempDir);
157
- return languageTempDir;
158
- };
159
- const writeTemp = async (targetLanguage, tempJsonFileName, content) => {
160
- const tempDir = await resolveTempDir(targetLanguage);
161
- const tempJsonFilePath = (0, mod_js_1.join)(tempDir, tempJsonFileName);
162
- await dntShim.Deno.writeTextFile(tempJsonFilePath, content, { create: true });
163
- logger_js_1.logger.info(`Temp saved: ${tempJsonFilePath}`);
164
- };
165
- exports.writeTemp = writeTemp;
@@ -1,14 +1,9 @@
1
- import Anthropic from '@anthropic-ai/sdk';
2
- import type { ChunkInfo, Translatable } from '../types.js';
3
- declare class AnthropicModel implements Translatable {
4
- chunks: ChunkInfo[];
5
- from: string;
6
- to: string;
7
- client: Anthropic;
8
- model: string;
9
- constructor(key: string, chunks: ChunkInfo[], from: string, to: string, baseUrl?: string, modelName?: string);
10
- private translateChunk;
11
- translate(): Promise<string>;
1
+ import type { TextTranslator, TranslateOptions } from '../types.js';
2
+ declare class AnthropicModel implements TextTranslator {
3
+ private client;
4
+ private model;
5
+ constructor(key: string, baseUrl?: string, modelName?: string, options?: TranslateOptions);
6
+ translate(prompt: string): Promise<string>;
12
7
  }
13
8
  export default AnthropicModel;
14
9
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAQvE,cAAM,cAAe,YAAW,YAAY;IAC1C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;YAW9F,cAAc;IAkEtB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;CAqCnC;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpE,cAAM,cAAe,YAAW,cAAc;IAC5C,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAGpB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAuD;IAU5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAYjD;AAED,eAAe,cAAc,CAAC"}
@@ -4,31 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
7
- const utilites_js_1 = require("../utilites.js");
8
- const logger_js_1 = require("../logger.js");
9
- const file_js_1 = require("../file.js");
10
7
  const contants_js_1 = require("../contants.js");
11
- const decoder = new TextDecoder();
12
8
  class AnthropicModel {
13
- constructor(key, chunks, from, to, baseUrl, modelName) {
14
- Object.defineProperty(this, "chunks", {
15
- enumerable: true,
16
- configurable: true,
17
- writable: true,
18
- value: void 0
19
- });
20
- Object.defineProperty(this, "from", {
21
- enumerable: true,
22
- configurable: true,
23
- writable: true,
24
- value: void 0
25
- });
26
- Object.defineProperty(this, "to", {
27
- enumerable: true,
28
- configurable: true,
29
- writable: true,
30
- value: void 0
31
- });
9
+ constructor(key, baseUrl, modelName, options = { noLimit: false, noTimeout: false }) {
32
10
  Object.defineProperty(this, "client", {
33
11
  enumerable: true,
34
12
  configurable: true,
@@ -41,96 +19,24 @@ class AnthropicModel {
41
19
  writable: true,
42
20
  value: void 0
43
21
  });
44
- this.chunks = chunks;
45
- this.from = from;
46
- this.to = to;
47
22
  this.model = modelName ?? contants_js_1.DEFAULT_MODELS.anthropic;
48
23
  this.client = new sdk_1.default({
49
24
  apiKey: key,
50
25
  baseURL: baseUrl,
26
+ timeout: options.noTimeout ? 0 : undefined,
51
27
  });
52
28
  }
53
- async translateChunk(chunk, systemPrompt, userPrompt) {
54
- const chunkLabel = `[Chunk ${chunk.index + 1}/${this.chunks.length}]`;
55
- const sourceJson = decoder.decode(chunk.data);
56
- for (let attempt = 0; attempt <= contants_js_1.MAX_RETRIES; attempt++) {
57
- try {
58
- if (attempt > 0) {
59
- const backoffMs = contants_js_1.BASE_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
60
- logger_js_1.logger.warn(`${chunkLabel} Retry ${attempt}/${contants_js_1.MAX_RETRIES} after ${backoffMs}ms backoff...`);
61
- await (0, utilites_js_1.delay)(backoffMs);
62
- }
63
- const message = await this.client.messages.create({
64
- model: this.model,
65
- max_tokens: 4096,
66
- messages: [
67
- {
68
- role: 'user',
69
- content: `${systemPrompt}\n\n${userPrompt}\n\nSOURCE_JSON:\n${sourceJson}`,
70
- },
71
- ],
72
- });
73
- const textParts = message.content
74
- .filter((part) => part.type === 'text')
75
- .map((part) => part.text);
76
- const text = textParts.join('').trim();
77
- if (!text) {
78
- logger_js_1.logger.error(`${chunkLabel} Empty response from Anthropic`);
79
- continue;
80
- }
81
- const cleanedText = (0, utilites_js_1.stripJsonMarkdown)(text);
82
- const tempJsonFileName = `chunk_${chunk.index + 1}.json`;
83
- await (0, file_js_1.writeTemp)(this.to, tempJsonFileName, cleanedText);
84
- if (!(0, utilites_js_1.isValidJson)(cleanedText)) {
85
- if (attempt === contants_js_1.MAX_RETRIES) {
86
- logger_js_1.logger.error(`${chunkLabel} Failed after ${contants_js_1.MAX_RETRIES + 1} attempts: Invalid JSON response`);
87
- return null;
88
- }
89
- logger_js_1.logger.error(`${chunkLabel} Invalid JSON response, saved to ${tempJsonFileName}`);
90
- continue;
91
- }
92
- logger_js_1.logger.info(`${chunkLabel} Translated successfully (${(0, utilites_js_1.formatBytes)(chunk.byteSize)}, ${chunk.keyCount} keys)`);
93
- return cleanedText;
94
- }
95
- catch (error) {
96
- const isLastAttempt = attempt === contants_js_1.MAX_RETRIES;
97
- const errorMessage = error instanceof Error ? error.message : String(error);
98
- if (isLastAttempt) {
99
- logger_js_1.logger.error(`${chunkLabel} Failed after ${contants_js_1.MAX_RETRIES + 1} attempts: ${errorMessage}`);
100
- return null;
101
- }
102
- logger_js_1.logger.warn(`${chunkLabel} Attempt ${attempt + 1} failed: ${errorMessage}`);
103
- }
104
- }
105
- return null;
106
- }
107
- async translate() {
108
- const { systemPrompt, userPrompt } = (0, utilites_js_1.generatePrompts)(this.from, this.to);
109
- const totalChunks = this.chunks.length;
110
- logger_js_1.logger.info(`Starting translation: ${totalChunks} chunk(s) to process`);
111
- const results = [];
112
- const failedChunks = [];
113
- for (let i = 0; i < totalChunks; i++) {
114
- const chunk = this.chunks[i];
115
- if (i > 0) {
116
- logger_js_1.logger.info(`Waiting ${contants_js_1.INTER_CHUNK_DELAY_MS}ms before next chunk (rate limit protection)...`);
117
- await (0, utilites_js_1.delay)(contants_js_1.INTER_CHUNK_DELAY_MS);
118
- }
119
- const result = await this.translateChunk(chunk, systemPrompt, userPrompt);
120
- if (result) {
121
- results.push(result);
122
- }
123
- else {
124
- failedChunks.push(chunk.index + 1);
125
- }
126
- }
127
- if (failedChunks.length > 0) {
128
- throw new Error(`Translation failed for chunk(s): ${failedChunks.join(', ')}. Check temp files for partial results.`);
129
- }
130
- logger_js_1.logger.info(`All ${totalChunks} chunk(s) translated successfully, merging results...`);
131
- const jsonInputs = results.map((r) => JSON.parse(r));
132
- const mergedContent = (0, file_js_1.mergeInputs)(jsonInputs);
133
- return JSON.stringify(mergedContent, null, 2);
29
+ async translate(prompt) {
30
+ const message = await this.client.messages.create({
31
+ model: this.model,
32
+ max_tokens: 8192,
33
+ temperature: 0.2,
34
+ messages: [{ role: 'user', content: prompt }],
35
+ });
36
+ return message.content
37
+ .filter((part) => part.type === 'text')
38
+ .map((part) => part.text)
39
+ .join('');
134
40
  }
135
41
  }
136
42
  exports.default = AnthropicModel;
@@ -1,14 +1,9 @@
1
- import { GoogleGenAI } from '@google/genai';
2
- import type { ChunkInfo, Translatable } from '../types.js';
3
- declare class Gemini implements Translatable {
4
- chunks: ChunkInfo[];
5
- from: string;
6
- to: string;
7
- genAI: GoogleGenAI;
8
- model: string;
9
- constructor(key: string, chunks: ChunkInfo[], from: string, to: string, modelName?: string);
10
- private translateChunk;
11
- translate(): Promise<string>;
1
+ import type { TextTranslator, TranslateOptions } from '../types.js';
2
+ declare class Gemini implements TextTranslator {
3
+ private genAI;
4
+ private model;
5
+ constructor(key: string, modelName?: string, options?: TranslateOptions);
6
+ translate(prompt: string): Promise<string>;
12
7
  }
13
8
  export default Gemini;
14
9
  //# sourceMappingURL=gemini.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/src/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAa,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAMvE,cAAM,MAAO,YAAW,YAAY;IAClC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;YAU5E,cAAc;IAwEtB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;CAqCnC;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/src/providers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpE,cAAM,MAAO,YAAW,cAAc;IACpC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAS;gBAGpB,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAuD;IAS5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAWjD;AAED,eAAe,MAAM,CAAC"}
@@ -1,31 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const genai_1 = require("@google/genai");
4
- const mod_js_1 = require("../../deps/jsr.io/@std/encoding/1.0.10/mod.js");
5
- const utilites_js_1 = require("../utilites.js");
6
- const logger_js_1 = require("../logger.js");
7
- const file_js_1 = require("../file.js");
8
4
  const contants_js_1 = require("../contants.js");
9
5
  class Gemini {
10
- constructor(key, chunks, from, to, modelName) {
11
- Object.defineProperty(this, "chunks", {
12
- enumerable: true,
13
- configurable: true,
14
- writable: true,
15
- value: void 0
16
- });
17
- Object.defineProperty(this, "from", {
18
- enumerable: true,
19
- configurable: true,
20
- writable: true,
21
- value: void 0
22
- });
23
- Object.defineProperty(this, "to", {
24
- enumerable: true,
25
- configurable: true,
26
- writable: true,
27
- value: void 0
28
- });
6
+ constructor(key, modelName, options = { noLimit: false, noTimeout: false }) {
29
7
  Object.defineProperty(this, "genAI", {
30
8
  enumerable: true,
31
9
  configurable: true,
@@ -38,101 +16,22 @@ class Gemini {
38
16
  writable: true,
39
17
  value: void 0
40
18
  });
41
- this.chunks = chunks;
42
- this.from = from;
43
- this.to = to;
44
19
  this.model = modelName ?? contants_js_1.DEFAULT_MODELS.gemini;
45
20
  this.genAI = new genai_1.GoogleGenAI({
46
21
  apiKey: key,
22
+ httpOptions: options.noTimeout ? { timeout: 2_147_483_647 } : undefined,
47
23
  });
48
24
  }
49
- async translateChunk(chunk, systemPrompt, userPrompt) {
50
- const chunkLabel = `[Chunk ${chunk.index + 1}/${this.chunks.length}]`;
51
- for (let attempt = 0; attempt <= contants_js_1.MAX_RETRIES; attempt++) {
52
- try {
53
- if (attempt > 0) {
54
- const backoffMs = contants_js_1.BASE_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
55
- logger_js_1.logger.warn(`${chunkLabel} Retry ${attempt}/${contants_js_1.MAX_RETRIES} after ${backoffMs}ms backoff...`);
56
- await (0, utilites_js_1.delay)(backoffMs);
57
- }
58
- const fileBase64 = (0, mod_js_1.encodeBase64)(chunk.data);
59
- const part = {
60
- inlineData: {
61
- data: fileBase64,
62
- mimeType: 'text/plain',
63
- },
64
- };
65
- const { text } = await this.genAI.models.generateContent({
66
- model: this.model,
67
- contents: [systemPrompt, userPrompt, part],
68
- config: {
69
- systemInstruction: systemPrompt,
70
- candidateCount: 1,
71
- responseMimeType: 'application/json',
72
- responseLogprobs: false,
73
- temperature: 0.3,
74
- topP: 0.7,
75
- topK: 20,
76
- maxOutputTokens: Number.POSITIVE_INFINITY,
77
- },
78
- });
79
- if (!text) {
80
- logger_js_1.logger.error(`${chunkLabel} Empty response from Gemini AI`);
81
- continue;
82
- }
83
- const cleanedText = (0, utilites_js_1.stripJsonMarkdown)(text);
84
- const tempJsonFileName = `chunk_${chunk.index + 1}.json`;
85
- await (0, file_js_1.writeTemp)(this.to, tempJsonFileName, cleanedText);
86
- if (!(0, utilites_js_1.isValidJson)(cleanedText)) {
87
- if (attempt === contants_js_1.MAX_RETRIES) {
88
- logger_js_1.logger.error(`${chunkLabel} Failed after ${contants_js_1.MAX_RETRIES + 1} attempts: Invalid JSON response`);
89
- return null;
90
- }
91
- logger_js_1.logger.error(`${chunkLabel} Invalid JSON response, saved to ${tempJsonFileName}`);
92
- continue;
93
- }
94
- logger_js_1.logger.info(`${chunkLabel} Translated successfully (${(0, utilites_js_1.formatBytes)(chunk.byteSize)}, ${chunk.keyCount} keys)`);
95
- return cleanedText;
96
- }
97
- catch (error) {
98
- const isLastAttempt = attempt === contants_js_1.MAX_RETRIES;
99
- const errorMessage = error instanceof Error ? error.message : String(error);
100
- if (isLastAttempt) {
101
- logger_js_1.logger.error(`${chunkLabel} Failed after ${contants_js_1.MAX_RETRIES + 1} attempts: ${errorMessage}`);
102
- return null;
103
- }
104
- logger_js_1.logger.warn(`${chunkLabel} Attempt ${attempt + 1} failed: ${errorMessage}`);
105
- }
106
- }
107
- return null;
108
- }
109
- async translate() {
110
- const { systemPrompt, userPrompt } = (0, utilites_js_1.generatePrompts)(this.from, this.to);
111
- const totalChunks = this.chunks.length;
112
- logger_js_1.logger.info(`Starting translation: ${totalChunks} chunk(s) to process`);
113
- const results = [];
114
- const failedChunks = [];
115
- for (let i = 0; i < totalChunks; i++) {
116
- const chunk = this.chunks[i];
117
- if (i > 0) {
118
- logger_js_1.logger.info(`Waiting ${contants_js_1.INTER_CHUNK_DELAY_MS}ms before next chunk (rate limit protection)...`);
119
- await (0, utilites_js_1.delay)(contants_js_1.INTER_CHUNK_DELAY_MS);
120
- }
121
- const result = await this.translateChunk(chunk, systemPrompt, userPrompt);
122
- if (result) {
123
- results.push(result);
124
- }
125
- else {
126
- failedChunks.push(chunk.index + 1);
127
- }
128
- }
129
- if (failedChunks.length > 0) {
130
- throw new Error(`Translation failed for chunk(s): ${failedChunks.join(', ')}. Check temp files for partial results.`);
131
- }
132
- logger_js_1.logger.info(`All ${totalChunks} chunk(s) translated successfully, merging results...`);
133
- const jsonInputs = results.map((r) => JSON.parse(r));
134
- const mergedContent = (0, file_js_1.mergeInputs)(jsonInputs);
135
- return JSON.stringify(mergedContent, null, 2);
25
+ async translate(prompt) {
26
+ const { text } = await this.genAI.models.generateContent({
27
+ model: this.model,
28
+ contents: prompt,
29
+ config: {
30
+ candidateCount: 1,
31
+ temperature: 0.2,
32
+ },
33
+ });
34
+ return text ?? '';
136
35
  }
137
36
  }
138
37
  exports.default = Gemini;
@@ -1,14 +1,9 @@
1
- import OpenAI from 'openai';
2
- import type { ChunkInfo, Translatable } from '../types.js';
3
- declare class OpenAIModel implements Translatable {
4
- chunks: ChunkInfo[];
5
- from: string;
6
- to: string;
7
- client: OpenAI;
8
- model: string;
9
- constructor(key: string, chunks: ChunkInfo[], from: string, to: string, baseUrl?: string, modelName?: string);
10
- private translateChunk;
11
- translate(): Promise<string>;
1
+ import type { TextTranslator, TranslateOptions } from '../types.js';
2
+ declare class OpenAIModel implements TextTranslator {
3
+ private client;
4
+ private model;
5
+ constructor(key: string, baseUrl?: string, modelName?: string, options?: TranslateOptions);
6
+ translate(prompt: string): Promise<string>;
12
7
  }
13
8
  export default OpenAIModel;
14
9
  //# sourceMappingURL=openai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAQvE,cAAM,WAAY,YAAW,YAAY;IACvC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;YAW9F,cAAc;IAkEtB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;CAqCnC;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpE,cAAM,WAAY,YAAW,cAAc;IACzC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAGpB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAuD;IAU5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQjD;AAED,eAAe,WAAW,CAAC"}