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
JavaScript
;
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