glotto 2.9.0 → 3.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 +150 -54
- package/esm/cli.js +155 -43
- package/esm/deno.d.ts +5 -1
- package/esm/deno.js +18 -7
- package/esm/src/config.d.ts +4 -0
- package/esm/src/config.d.ts.map +1 -0
- package/esm/src/config.js +95 -0
- package/esm/src/contants.d.ts +6 -2
- package/esm/src/contants.d.ts.map +1 -1
- package/esm/src/contants.js +34 -15
- package/esm/src/diff.d.ts +4 -0
- package/esm/src/diff.d.ts.map +1 -0
- package/esm/src/diff.js +53 -0
- package/esm/src/file.d.ts +5 -9
- package/esm/src/file.d.ts.map +1 -1
- package/esm/src/file.js +14 -103
- package/esm/src/providers/anthropic.d.ts +6 -11
- package/esm/src/providers/anthropic.d.ts.map +1 -1
- package/esm/src/providers/anthropic.js +21 -107
- package/esm/src/providers/gemini.d.ts +6 -11
- package/esm/src/providers/gemini.d.ts.map +1 -1
- package/esm/src/providers/gemini.js +20 -113
- package/esm/src/providers/openai.d.ts +6 -11
- package/esm/src/providers/openai.d.ts.map +1 -1
- package/esm/src/providers/openai.js +17 -108
- package/esm/src/translator.d.ts +15 -0
- package/esm/src/translator.d.ts.map +1 -0
- package/esm/src/translator.js +284 -0
- package/esm/src/types.d.ts +58 -13
- package/esm/src/types.d.ts.map +1 -1
- package/esm/src/utilites.d.ts +3 -10
- package/esm/src/utilites.d.ts.map +1 -1
- package/esm/src/utilites.js +41 -131
- package/package.json +20 -6
- package/schema/glotto.schema.json +87 -0
- package/script/cli.js +153 -41
- package/script/deno.d.ts +5 -1
- package/script/deno.js +18 -7
- package/script/src/config.d.ts +4 -0
- package/script/src/config.d.ts.map +1 -0
- package/script/src/config.js +132 -0
- package/script/src/contants.d.ts +6 -2
- package/script/src/contants.d.ts.map +1 -1
- package/script/src/contants.js +35 -16
- package/script/src/diff.d.ts +4 -0
- package/script/src/diff.d.ts.map +1 -0
- package/script/src/diff.js +57 -0
- package/script/src/file.d.ts +5 -9
- package/script/src/file.d.ts.map +1 -1
- package/script/src/file.js +19 -113
- package/script/src/providers/anthropic.d.ts +6 -11
- package/script/src/providers/anthropic.d.ts.map +1 -1
- package/script/src/providers/anthropic.js +20 -106
- package/script/src/providers/gemini.d.ts +6 -11
- package/script/src/providers/gemini.d.ts.map +1 -1
- package/script/src/providers/gemini.js +19 -112
- package/script/src/providers/openai.d.ts +6 -11
- package/script/src/providers/openai.d.ts.map +1 -1
- package/script/src/providers/openai.js +16 -107
- package/script/src/translator.d.ts +15 -0
- package/script/src/translator.d.ts.map +1 -0
- package/script/src/translator.js +294 -0
- package/script/src/types.d.ts +58 -13
- package/script/src/types.d.ts.map +1 -1
- package/script/src/utilites.d.ts +3 -10
- package/script/src/utilites.d.ts.map +1 -1
- package/script/src/utilites.js +44 -138
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -51
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts +0 -35
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.js +0 -192
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts +0 -35
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.js +0 -113
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -13
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -2
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts +0 -2
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.js +0 -26
- package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts +0 -61
- package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.js +0 -152
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts +0 -40
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.js +0 -87
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts +0 -40
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.js +0 -131
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts +0 -40
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.js +0 -82
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts +0 -40
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.js +0 -72
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -87
- package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts +0 -98
- package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.js +0 -99
- package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts +0 -120
- package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.js +0 -205
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -57
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts +0 -35
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.js +0 -198
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts +0 -35
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.js +0 -119
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -16
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -3
- package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts +0 -2
- package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.js +0 -29
- package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts +0 -61
- package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.js +0 -156
- package/script/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts +0 -40
- package/script/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/base32.js +0 -91
- package/script/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts +0 -40
- package/script/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/base58.js +0 -135
- package/script/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts +0 -40
- package/script/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/base64.js +0 -86
- package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts +0 -40
- package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.js +0 -76
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -91
- package/script/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts +0 -98
- package/script/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/mod.js +0 -115
- package/script/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts +0 -120
- package/script/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/varint.js +0 -211
package/esm/src/types.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export type Provider = 'gemini' | 'openai' | 'anthropic';
|
|
2
|
+
export type TranslateOptions = {
|
|
3
|
+
noLimit: boolean;
|
|
4
|
+
noTimeout: boolean;
|
|
5
|
+
};
|
|
2
6
|
export type TranslateArgs = {
|
|
3
7
|
key?: string;
|
|
4
8
|
provider?: string;
|
|
@@ -8,29 +12,70 @@ export type TranslateArgs = {
|
|
|
8
12
|
from?: string;
|
|
9
13
|
to?: string;
|
|
10
14
|
url?: string;
|
|
15
|
+
config?: string;
|
|
16
|
+
stats?: boolean;
|
|
17
|
+
incremental?: boolean;
|
|
18
|
+
'no-limit'?: boolean;
|
|
19
|
+
'no-timeout'?: boolean;
|
|
20
|
+
'max-batch-size'?: string;
|
|
11
21
|
};
|
|
12
22
|
export type ValidatedTranslateArgs = {
|
|
13
23
|
key: string;
|
|
14
24
|
provider: Provider;
|
|
15
25
|
model?: string;
|
|
16
26
|
input: string;
|
|
17
|
-
output: string;
|
|
27
|
+
output: string[];
|
|
18
28
|
from: string;
|
|
19
|
-
to: string;
|
|
29
|
+
to: string[];
|
|
20
30
|
url?: string;
|
|
31
|
+
noLimit: boolean;
|
|
32
|
+
noTimeout: boolean;
|
|
33
|
+
maxBatchBytes: number;
|
|
34
|
+
stats: boolean;
|
|
35
|
+
incremental: boolean;
|
|
21
36
|
};
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
37
|
+
export type GlottoConfig = {
|
|
38
|
+
key?: string;
|
|
39
|
+
provider?: Provider;
|
|
40
|
+
model?: string;
|
|
41
|
+
input?: string;
|
|
42
|
+
output?: string | string[];
|
|
43
|
+
from?: string;
|
|
44
|
+
to?: string | string[];
|
|
45
|
+
url?: string;
|
|
46
|
+
noLimit?: boolean;
|
|
47
|
+
noTimeout?: boolean;
|
|
48
|
+
maxBatchSize?: number;
|
|
49
|
+
stats?: boolean;
|
|
50
|
+
incremental?: boolean;
|
|
51
|
+
};
|
|
52
|
+
export type JsonValue = string | number | boolean | null | JsonObject | JsonArray;
|
|
53
|
+
export interface JsonObject {
|
|
54
|
+
[key: string]: JsonValue;
|
|
27
55
|
}
|
|
28
|
-
export type
|
|
29
|
-
export type
|
|
30
|
-
export type
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
56
|
+
export type JsonArray = JsonValue[];
|
|
57
|
+
export type PathSegment = string | number;
|
|
58
|
+
export type Path = PathSegment[];
|
|
59
|
+
export type Leaf = {
|
|
60
|
+
id: number;
|
|
61
|
+
path: Path;
|
|
62
|
+
value: JsonValue;
|
|
63
|
+
translatable: boolean;
|
|
64
|
+
};
|
|
65
|
+
export type Batch = {
|
|
34
66
|
index: number;
|
|
67
|
+
leaves: Leaf[];
|
|
68
|
+
byteSize: number;
|
|
35
69
|
};
|
|
70
|
+
export type TranslateUsage = {
|
|
71
|
+
inputTokens: number;
|
|
72
|
+
outputTokens: number;
|
|
73
|
+
};
|
|
74
|
+
export type TranslateResult = {
|
|
75
|
+
text: string;
|
|
76
|
+
usage?: TranslateUsage;
|
|
77
|
+
};
|
|
78
|
+
export interface TextTranslator {
|
|
79
|
+
translate(prompt: string): Promise<TranslateResult>;
|
|
80
|
+
}
|
|
36
81
|
//# sourceMappingURL=types.d.ts.map
|
package/esm/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/src/types.ts"],"names":[],"mappings":"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"}
|
package/esm/src/utilites.d.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import type { TranslateArgs, ValidatedTranslateArgs } from './types.js';
|
|
2
|
-
|
|
3
|
-
export declare
|
|
4
|
-
export declare
|
|
5
|
-
systemPrompt: string;
|
|
6
|
-
userPrompt: string;
|
|
7
|
-
};
|
|
8
|
-
export declare const stripJsonMarkdown: (text: string) => string;
|
|
9
|
-
export declare const isValidJson: (value: string) => boolean;
|
|
10
|
-
export declare const formatBytes: (bytes: number) => string;
|
|
11
|
-
export declare const delay: (ms: number) => Promise<void>;
|
|
2
|
+
export declare function validateArgs(args: TranslateArgs): ValidatedTranslateArgs;
|
|
3
|
+
export declare function formatBytes(bytes: number): string;
|
|
4
|
+
export declare function delay(ms: number): Promise<void>;
|
|
12
5
|
//# sourceMappingURL=utilites.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilites.d.ts","sourceRoot":"","sources":["../../src/src/utilites.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"utilites.d.ts","sourceRoot":"","sources":["../../src/src/utilites.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAOlF,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,sBAAsB,CA0DxE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
|
package/esm/src/utilites.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { DEFAULT_MAX_BATCH_BYTES } from './contants.js';
|
|
2
|
+
function splitCsv(value) {
|
|
3
|
+
return value.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
|
|
4
|
+
}
|
|
5
|
+
export function validateArgs(args) {
|
|
2
6
|
if (!args.key) {
|
|
3
7
|
throw new Error('AI Key is required');
|
|
4
8
|
}
|
|
@@ -17,145 +21,51 @@ export const validateArgs = (args) => {
|
|
|
17
21
|
if (!args.to) {
|
|
18
22
|
throw new Error('Target language (to) parameter is required');
|
|
19
23
|
}
|
|
24
|
+
const toList = splitCsv(args.to);
|
|
25
|
+
const outputList = splitCsv(args.output);
|
|
26
|
+
if (toList.length === 0) {
|
|
27
|
+
throw new Error('Target language (to) must contain at least one value');
|
|
28
|
+
}
|
|
29
|
+
if (outputList.length === 0) {
|
|
30
|
+
throw new Error('Output must contain at least one value');
|
|
31
|
+
}
|
|
32
|
+
if (toList.length !== outputList.length) {
|
|
33
|
+
throw new Error(`--to (${toList.length}) and --output (${outputList.length}) must have the same number of values`);
|
|
34
|
+
}
|
|
35
|
+
let maxBatchBytes = DEFAULT_MAX_BATCH_BYTES;
|
|
36
|
+
const rawMaxBatchSize = args['max-batch-size'];
|
|
37
|
+
if (rawMaxBatchSize !== undefined) {
|
|
38
|
+
const parsed = parseInt(rawMaxBatchSize, 10);
|
|
39
|
+
if (isNaN(parsed) || parsed <= 0) {
|
|
40
|
+
throw new Error('--max-batch-size must be a positive integer (value in KB, e.g. --max-batch-size 8)');
|
|
41
|
+
}
|
|
42
|
+
maxBatchBytes = parsed * 1024;
|
|
43
|
+
}
|
|
20
44
|
return {
|
|
21
45
|
key: args.key,
|
|
22
46
|
provider: args.provider,
|
|
23
47
|
model: args.model,
|
|
24
48
|
input: args.input,
|
|
25
|
-
output:
|
|
49
|
+
output: outputList,
|
|
26
50
|
from: args.from,
|
|
27
|
-
to:
|
|
51
|
+
to: toList,
|
|
28
52
|
url: args.url,
|
|
53
|
+
noLimit: args['no-limit'] ?? false,
|
|
54
|
+
noTimeout: args['no-timeout'] ?? false,
|
|
55
|
+
maxBatchBytes,
|
|
56
|
+
stats: args.stats ?? false,
|
|
57
|
+
incremental: args.incremental ?? false,
|
|
29
58
|
};
|
|
30
|
-
}
|
|
31
|
-
export
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
1. COMPLETE TRANSLATION:
|
|
35
|
-
- Translate ALL text values comprehensively
|
|
36
|
-
- Double-check to ensure no text is left untranslated
|
|
37
|
-
- Pay special attention to arrays and nested objects to ensure everything is translated
|
|
38
|
-
- If unsure about any translation, provide the most accurate and natural translation possible
|
|
39
|
-
|
|
40
|
-
2. TRANSLATION QUALITY:
|
|
41
|
-
- Use natural, context-appropriate language
|
|
42
|
-
- Maintain consistent terminology throughout the translation
|
|
43
|
-
- Use formal language unless the source is clearly casual
|
|
44
|
-
- Preserve the exact meaning and tone of the original text
|
|
45
|
-
- For UI elements, use standard localized terms common in ${to} applications
|
|
46
|
-
|
|
47
|
-
3. STRUCTURAL PRESERVATION:
|
|
48
|
-
- Keep all JSON structure and keys exactly as they are
|
|
49
|
-
- Maintain all variables and interpolation patterns ({{name}}, __VARIABLE__, $t(), etc.)
|
|
50
|
-
- Preserve all HTML tags and markdown formatting
|
|
51
|
-
- Keep all whitespace, nesting, and formatting intact
|
|
52
|
-
|
|
53
|
-
4. VALIDATION:
|
|
54
|
-
- Return only valid JSON
|
|
55
|
-
- Verify that all text is translated
|
|
56
|
-
- Ensure no source language text remains
|
|
57
|
-
- Confirm all arrays and nested objects are fully translated`;
|
|
58
|
-
const userPrompt = `Please translate this i18next JSON file with these specific requirements:
|
|
59
|
-
|
|
60
|
-
1. THOROUGH TRANSLATION:
|
|
61
|
-
- Translate every single text value from ${from} to ${to}
|
|
62
|
-
- Pay special attention to arrays and nested objects
|
|
63
|
-
- Verify no text is left in ${from}
|
|
64
|
-
- Double-check all translations for completeness
|
|
65
|
-
|
|
66
|
-
2. PRESERVE STRUCTURE:
|
|
67
|
-
- Keep all keys unchanged (e.g. "button.submit")
|
|
68
|
-
- Maintain all variables: {{name}}, __VAR__, $t()
|
|
69
|
-
- Preserve HTML tags and markdown
|
|
70
|
-
- Keep all special characters
|
|
71
|
-
- Maintain exact JSON structure
|
|
72
|
-
|
|
73
|
-
3. QUALITY REQUIREMENTS:
|
|
74
|
-
- Use natural ${to} language
|
|
75
|
-
- Maintain consistent terminology
|
|
76
|
-
- Use formal language unless source is casual
|
|
77
|
-
- Ensure translations match the context
|
|
78
|
-
- Use standard ${to} UI terminology for interface elements
|
|
79
|
-
|
|
80
|
-
4. OUTPUT:
|
|
81
|
-
- Return only the translated JSON
|
|
82
|
-
- No explanations or comments
|
|
83
|
-
- No additional text
|
|
84
|
-
- No formatting changes
|
|
85
|
-
- Must be valid JSON`;
|
|
86
|
-
return { systemPrompt, userPrompt };
|
|
87
|
-
};
|
|
88
|
-
export const stripJsonMarkdown = (text) => {
|
|
89
|
-
const trimmed = text.trim();
|
|
90
|
-
// Extract from code fence if present (handles surrounding text too)
|
|
91
|
-
const fenceMatch = trimmed.match(/```(?:\w+)?\s*\n?([\s\S]*?)\n?```/);
|
|
92
|
-
if (fenceMatch) {
|
|
93
|
-
const candidate = fenceMatch[1].trim();
|
|
94
|
-
if (candidate.startsWith('{') || candidate.startsWith('[')) {
|
|
95
|
-
return candidate;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
// Find outermost JSON structure by tracking bracket depth,
|
|
99
|
-
// correctly ignoring brackets inside strings and escape sequences
|
|
100
|
-
const firstBrace = trimmed.indexOf('{');
|
|
101
|
-
const firstBracket = trimmed.indexOf('[');
|
|
102
|
-
if (firstBrace === -1 && firstBracket === -1)
|
|
103
|
-
return trimmed;
|
|
104
|
-
let startIndex;
|
|
105
|
-
let openChar;
|
|
106
|
-
let closeChar;
|
|
107
|
-
if (firstBrace === -1 || (firstBracket !== -1 && firstBracket < firstBrace)) {
|
|
108
|
-
startIndex = firstBracket;
|
|
109
|
-
openChar = '[';
|
|
110
|
-
closeChar = ']';
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
startIndex = firstBrace;
|
|
114
|
-
openChar = '{';
|
|
115
|
-
closeChar = '}';
|
|
116
|
-
}
|
|
117
|
-
let depth = 0;
|
|
118
|
-
let inString = false;
|
|
119
|
-
let escaped = false;
|
|
120
|
-
for (let i = startIndex; i < trimmed.length; i++) {
|
|
121
|
-
const char = trimmed[i];
|
|
122
|
-
if (escaped) {
|
|
123
|
-
escaped = false;
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
if (char === '\\' && inString) {
|
|
127
|
-
escaped = true;
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
if (char === '"') {
|
|
131
|
-
inString = !inString;
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
if (inString)
|
|
135
|
-
continue;
|
|
136
|
-
if (char === openChar)
|
|
137
|
-
depth++;
|
|
138
|
-
else if (char === closeChar && --depth === 0)
|
|
139
|
-
return trimmed.slice(startIndex, i + 1);
|
|
140
|
-
}
|
|
141
|
-
return trimmed;
|
|
142
|
-
};
|
|
143
|
-
export const isValidJson = (value) => {
|
|
144
|
-
try {
|
|
145
|
-
JSON.parse(value);
|
|
146
|
-
return true;
|
|
147
|
-
}
|
|
148
|
-
catch {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
export const formatBytes = (bytes) => {
|
|
153
|
-
if (bytes < 1024)
|
|
59
|
+
}
|
|
60
|
+
export function formatBytes(bytes) {
|
|
61
|
+
if (bytes < 1024) {
|
|
154
62
|
return `${bytes} B`;
|
|
155
|
-
|
|
63
|
+
}
|
|
64
|
+
if (bytes < 1024 * 1024) {
|
|
156
65
|
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
66
|
+
}
|
|
157
67
|
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
158
|
-
}
|
|
159
|
-
export
|
|
68
|
+
}
|
|
69
|
+
export function delay(ms) {
|
|
160
70
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
161
|
-
}
|
|
71
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "glotto",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
|
+
"description": "AI-powered i18n JSON translator. Multi-target, incremental, provider-agnostic (OpenAI, Anthropic, Gemini).",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"i18n",
|
|
7
|
+
"translation",
|
|
8
|
+
"translator",
|
|
9
|
+
"ai",
|
|
10
|
+
"openai",
|
|
11
|
+
"anthropic",
|
|
12
|
+
"gemini",
|
|
13
|
+
"localization",
|
|
14
|
+
"l10n",
|
|
15
|
+
"json",
|
|
16
|
+
"cli"
|
|
17
|
+
],
|
|
5
18
|
"author": "Ibrahim Odev <me@ibrahimo.dev>",
|
|
19
|
+
"homepage": "https://github.com/ibodev1/glotto#readme",
|
|
6
20
|
"repository": {
|
|
7
21
|
"type": "git",
|
|
8
22
|
"url": "git+https://github.com/ibodev1/glotto.git"
|
|
@@ -19,13 +33,13 @@
|
|
|
19
33
|
"access": "public"
|
|
20
34
|
},
|
|
21
35
|
"engines": {
|
|
22
|
-
"node": ">=20.
|
|
36
|
+
"node": ">=20.10.0"
|
|
23
37
|
},
|
|
24
38
|
"dependencies": {
|
|
25
|
-
"@anthropic-ai/sdk": "^0.95.
|
|
26
|
-
"@google/genai": "^
|
|
39
|
+
"@anthropic-ai/sdk": "^0.95.1",
|
|
40
|
+
"@google/genai": "^2.0.0",
|
|
27
41
|
"consola": "^3.4.2",
|
|
28
|
-
"openai": "^6.
|
|
42
|
+
"openai": "^6.37.0",
|
|
29
43
|
"@deno/shim-deno": "~0.18.0"
|
|
30
44
|
},
|
|
31
45
|
"devDependencies": {
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/ibodev1/glotto/main/schema/glotto.schema.json",
|
|
4
|
+
"title": "Glotto config",
|
|
5
|
+
"description": "Configuration for the Glotto AI translator. CLI flags override values defined here.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "JSON Schema reference for editor autocomplete."
|
|
12
|
+
},
|
|
13
|
+
"key": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "API key for the AI provider."
|
|
16
|
+
},
|
|
17
|
+
"provider": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"enum": ["openai", "gemini", "anthropic"],
|
|
20
|
+
"description": "AI translation provider."
|
|
21
|
+
},
|
|
22
|
+
"model": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "Model name for the selected provider."
|
|
25
|
+
},
|
|
26
|
+
"input": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"description": "Path to source JSON file."
|
|
29
|
+
},
|
|
30
|
+
"output": {
|
|
31
|
+
"description": "Single target file path or array of paths (one per target language).",
|
|
32
|
+
"oneOf": [
|
|
33
|
+
{ "type": "string" },
|
|
34
|
+
{
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": { "type": "string" },
|
|
37
|
+
"minItems": 1
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"from": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "Source language name."
|
|
44
|
+
},
|
|
45
|
+
"to": {
|
|
46
|
+
"description": "Target language name or array of names. Length must match output array.",
|
|
47
|
+
"oneOf": [
|
|
48
|
+
{ "type": "string" },
|
|
49
|
+
{
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": { "type": "string" },
|
|
52
|
+
"minItems": 1
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"url": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "Custom base URL for OpenAI/Anthropic providers."
|
|
59
|
+
},
|
|
60
|
+
"noLimit": {
|
|
61
|
+
"type": "boolean",
|
|
62
|
+
"description": "Disable inter-batch rate-limit delay.",
|
|
63
|
+
"default": false
|
|
64
|
+
},
|
|
65
|
+
"noTimeout": {
|
|
66
|
+
"type": "boolean",
|
|
67
|
+
"description": "Disable request timeout.",
|
|
68
|
+
"default": false
|
|
69
|
+
},
|
|
70
|
+
"maxBatchSize": {
|
|
71
|
+
"type": "integer",
|
|
72
|
+
"minimum": 1,
|
|
73
|
+
"description": "Maximum source size per batch in KB.",
|
|
74
|
+
"default": 12
|
|
75
|
+
},
|
|
76
|
+
"stats": {
|
|
77
|
+
"type": "boolean",
|
|
78
|
+
"description": "Print AI usage statistics at the end of the run.",
|
|
79
|
+
"default": false
|
|
80
|
+
},
|
|
81
|
+
"incremental": {
|
|
82
|
+
"type": "boolean",
|
|
83
|
+
"description": "Translate only missing or empty keys when target file already exists.",
|
|
84
|
+
"default": false
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|