mirror of
https://github.com/vladmandic/sdnext.git
synced 2026-01-27 15:02:48 +03:00
68 lines
2.6 KiB
JavaScript
Executable File
68 lines
2.6 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
// script used to localize sdnext ui and hints to multiple languages using google gemini ai
|
|
|
|
const fs = require('node:fs');
|
|
|
|
const { GoogleGenerativeAI } = require('@google/generative-ai');
|
|
|
|
const api_key = process.env.GOOGLE_AI_API_KEY;
|
|
const model = 'gemini-2.5-flash';
|
|
const prompt = `Translate attached JSON from English to {language} using following rules: fields id, label and reload should be preserved from original, field localized should be a translated version of field label and field hint should be translated in-place.
|
|
if field is less than 3 characters, do not translate it and keep it as is.
|
|
Every JSON entry should have id, label, localized, reload and hint fields.
|
|
Output should be pure JSON without any additional text. To better match translation, context of the text is related to Stable Diffusion and topic of Generative AI.`;
|
|
const languages = {
|
|
hr: 'Croatian',
|
|
de: 'German',
|
|
es: 'Spanish',
|
|
fr: 'French',
|
|
it: 'Italian',
|
|
pt: 'Portuguese',
|
|
zh: 'Chinese',
|
|
ja: 'Japanese',
|
|
ko: 'Korean',
|
|
ru: 'Russian',
|
|
};
|
|
const chunkLines = 100;
|
|
|
|
async function localize() {
|
|
if (!api_key || api_key.length < 10) {
|
|
console.error('localize: set GOOGLE_AI_API_KEY env variable with your API key');
|
|
process.exit();
|
|
}
|
|
const genAI = new GoogleGenerativeAI(api_key);
|
|
const instance = genAI.getGenerativeModel({ model });
|
|
const raw = fs.readFileSync('html/locale_en.json');
|
|
const json = JSON.parse(raw);
|
|
for (const locale of Object.keys(languages)) {
|
|
const lang = languages[locale];
|
|
const target = prompt.replace('{language}', lang).trim();
|
|
const output = {};
|
|
const fn = `html/locale_${locale}.json`;
|
|
for (const section of Object.keys(json)) {
|
|
const data = json[section];
|
|
output[section] = [];
|
|
for (let i = 0; i < data.length; i += chunkLines) {
|
|
let markdown;
|
|
try {
|
|
const chunk = data.slice(i, i + chunkLines);
|
|
const result = await instance.generateContent([target, JSON.stringify(chunk)]);
|
|
markdown = result.response.text();
|
|
const text = markdown.replaceAll('```', '').replace(/^.*\n/, '');
|
|
const parsed = JSON.parse(text);
|
|
output[section].push(...parsed);
|
|
console.log(`localize: locale=${locale} lang=${lang} section=${section} chunk=${chunk.length} output=${output[section].length} fn=${fn}`);
|
|
} catch (err) {
|
|
console.error('localize:', err);
|
|
console.error('localize input:', { target, section, i });
|
|
console.error('localize output:', { markdown });
|
|
}
|
|
}
|
|
const txt = JSON.stringify(output, null, 2);
|
|
fs.writeFileSync(fn, txt);
|
|
}
|
|
}
|
|
}
|
|
|
|
localize();
|