UNPKG

i18n-ai-translate

Version:

AI-powered localization CLI, Node library, and GitHub Action. Translate i18next JSON, Gettext PO, Java .properties, and iOS .strings with ChatGPT, Claude, Gemini, or local Ollama models.

86 lines 3.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.check = check; const constants_1 = require("./constants"); const flat_1 = require("flat"); const utils_1 = require("./utils"); const chat_pool_1 = __importDefault(require("./chat_pool")); const generate_1 = __importDefault(require("./generate_json/generate")); const rate_limiter_1 = __importDefault(require("./rate_limiter")); function setDefaults(options) { if (!options.templatedStringPrefix) options.templatedStringPrefix = constants_1.DEFAULT_TEMPLATED_STRING_PREFIX; if (!options.templatedStringSuffix) options.templatedStringSuffix = constants_1.DEFAULT_TEMPLATED_STRING_SUFFIX; if (!options.batchMaxTokens) options.batchMaxTokens = constants_1.DEFAULT_REQUEST_TOKENS; if (!options.batchSize) options.batchSize = constants_1.DEFAULT_BATCH_SIZE; if (!options.verbose) options.verbose = false; if (options.continueOnError === undefined) options.continueOnError = true; } /** * Validate an already-translated target file against its source by * running the verification pipeline without the preceding translation * step. Returns a report listing every key the model flagged as * incorrect, along with a suggested correction where available. * * No files are written. */ async function check(options) { setDefaults(options); options.inputLanguageCode = (0, utils_1.resolveLanguageCode)(options.inputLanguageCode); options.outputLanguageCode = (0, utils_1.resolveLanguageCode)(options.outputLanguageCode); if (!(0, utils_1.isValidLanguageCode)(options.inputLanguageCode)) { throw new Error(`Invalid input language code: ${options.inputLanguageCode}`); } if (!(0, utils_1.isValidLanguageCode)(options.outputLanguageCode)) { throw new Error(`Invalid output language code: ${options.outputLanguageCode}`); } // Reuse caller-supplied pool/limiter when provided; see the // symmetric comment in translate.ts::getPool. const pool = options.pool ?? chat_pool_1.default.create({ apiKey: options.apiKey, chatParams: options.chatParams, concurrency: Math.max(1, options.concurrency ?? 1), engine: options.engine, host: options.host, model: options.model, rateLimiter: options.rateLimiter ?? new rate_limiter_1.default(options.rateLimitMs, options.verbose, options.tokensPerMinute), }); const flatSource = (0, flat_1.flatten)(options.inputJSON, { delimiter: constants_1.FLATTEN_DELIMITER, }); const flatTarget = (0, flat_1.flatten)(options.targetJSON, { delimiter: constants_1.FLATTEN_DELIMITER, }); if (options.verbose) { (0, utils_1.printInfo)(`Checking ${Object.keys(flatTarget).length} target keys against source...\n`); } const generator = new generate_1.default(options); const rawIssues = await generator.checkJSON({ flatSource, flatTarget, options, pool, }); return { issues: rawIssues.map((i) => ({ issue: i.issue, key: i.key, original: i.original, suggestion: i.suggestion, translated: i.translated, })), languageCode: options.outputLanguageCode, totalKeys: Object.keys(flatTarget).length, }; } //# sourceMappingURL=check.js.map