localization.ts•1.94 kB
import * as fs from "fs/promises";
import * as path from "path";
export async function translateProject(
projectPath: string,
targetLanguage: string,
apiKey?: string
): Promise<{ success: boolean; translated?: number; error?: string }> {
const key = apiKey || process.env.GEMINI_API_KEY;
if (!key) return { success: false, error: "API key missing" };
// Extract all text from data files
const texts = await extractAllText(projectPath);
let translated = 0;
// Translate each text
for (const text of texts) {
const prompt = `Translate this RPG game text to ${targetLanguage}: "${text.content}"`;
try {
const response = await fetch(
`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=${key}`,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
contents: [{ parts: [{ text: prompt }] }]
})
}
);
const data = await response.json();
const translatedText = data.candidates?.[0]?.content?.parts?.[0]?.text;
// Save translation
if (translatedText) {
text.content = translatedText;
translated++;
}
} catch {
continue;
}
}
// Write back translated texts
await saveTranslatedTexts(projectPath, texts, targetLanguage);
return { success: true, translated };
}
async function extractAllText(projectPath: string): Promise<Array<{ file: string; path: string; content: string }>> {
const texts: Array<{ file: string; path: string; content: string }> = [];
// Extract from data files, maps, events, etc.
return texts;
}
async function saveTranslatedTexts(projectPath: string, texts: any[], language: string): Promise<void> {
const langDir = path.join(projectPath, "data", "lang", language);
await fs.mkdir(langDir, { recursive: true });
// Save translated texts
}