localize-ai
Advanced tools
@@ -5,3 +5,3 @@ type LanguageContextType = { | ||
| setLang: (lang: string) => void; | ||
| translations: Record<string, Record<string, string>>; | ||
| translations: Record<string, string>; | ||
| }; | ||
@@ -8,0 +8,0 @@ declare const LanguageContext: import("react").Context<LanguageContextType | null>; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"LanguageContext.d.ts","sourceRoot":"","sources":["../../src/context/LanguageContext.ts"],"names":[],"mappings":"AAEA,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAExD,CAAC;AAGF,QAAA,MAAM,eAAe,qDAAkD,CAAC;AAExE,eAAe,eAAe,CAAC"} | ||
| {"version":3,"file":"LanguageContext.d.ts","sourceRoot":"","sources":["../../src/context/LanguageContext.ts"],"names":[],"mappings":"AAEA,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAEtC,CAAC;AAGF,QAAA,MAAM,eAAe,qDAAkD,CAAC;AAExE,eAAe,eAAe,CAAC"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"LanguageContextProvider.d.ts","sourceRoot":"","sources":["../../src/context/LanguageContextProvider.tsx"],"names":[],"mappings":"AAGA,iBAAS,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,kDA6C3E;AAED,eAAe,uBAAuB,CAAC"} | ||
| {"version":3,"file":"LanguageContextProvider.d.ts","sourceRoot":"","sources":["../../src/context/LanguageContextProvider.tsx"],"names":[],"mappings":"AAGA,iBAAS,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,kDA2E3E;AAED,eAAe,uBAAuB,CAAC"} |
| import { jsx as _jsx } from "react/jsx-runtime"; | ||
| import { useEffect, useState } from "react"; | ||
| import { useEffect, useRef, useState } from "react"; | ||
| import LanguageContext from "./LanguageContext.js"; | ||
@@ -9,26 +9,51 @@ function LanguageContextProvider({ children }) { | ||
| const [isReady, setIsReady] = useState(false); | ||
| const cache = useRef({}); | ||
| // ๐น Load runtime config ONCE | ||
| useEffect(() => { | ||
| async function load() { | ||
| async function loadConfig() { | ||
| try { | ||
| const configRes = await fetch("/localize.runtime.json"); | ||
| const config = await configRes.json(); | ||
| const res = await fetch("/localize.runtime.json"); | ||
| const config = await res.json(); | ||
| setSupportedLangs(config.supportedLangs || []); | ||
| setLang(config.supportedLangs?.includes(config.sourceLanguage) | ||
| // set initial language safely | ||
| const initialLang = config.supportedLangs?.includes(config.sourceLanguage) | ||
| ? config.sourceLanguage | ||
| : "en"); | ||
| const transRes = await fetch("/translations.json"); | ||
| if (!transRes.ok) | ||
| throw new Error("No translations"); | ||
| const data = await transRes.json(); | ||
| setTranslations(data); | ||
| : "en"; | ||
| setLang(initialLang); | ||
| } | ||
| catch (err) { | ||
| console.warn("โ ๏ธ Failed to load runtime config", err); | ||
| } | ||
| finally { | ||
| setIsReady(true); | ||
| } | ||
| } | ||
| loadConfig(); | ||
| }, []); | ||
| // ๐น Load translations WHEN lang changes | ||
| useEffect(() => { | ||
| if (!lang) | ||
| return; | ||
| if (cache.current[lang]) { | ||
| setTranslations(cache.current[lang]); | ||
| return; | ||
| } | ||
| async function loadTranslations() { | ||
| try { | ||
| const res = await fetch(`/translations_${lang}.json`); | ||
| if (!res.ok) | ||
| throw new Error("Missing translation file"); | ||
| const data = await res.json(); | ||
| if (Object.keys(data).length > 0) { | ||
| cache.current[lang] = data; | ||
| } | ||
| setTranslations(data); | ||
| } | ||
| catch (err) { | ||
| console.warn("โ ๏ธ Failed to load localization", err); | ||
| console.warn(`โ ๏ธ No translations found for ${lang}`); | ||
| setTranslations({}); | ||
| setIsReady(true); | ||
| } | ||
| } | ||
| load(); | ||
| }, []); | ||
| loadTranslations(); | ||
| }, [lang]); | ||
| if (!isReady) | ||
@@ -35,0 +60,0 @@ return null; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"LanguageContextProvider.js","sourceRoot":"","sources":["../../src/context/LanguageContextProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,eAAe,MAAM,sBAAsB,CAAC;AAEnD,SAAS,uBAAuB,CAAC,EAAE,QAAQ,EAAiC;IAC1E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAS,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAM,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,UAAU,IAAI;YACjB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;gBAEtC,iBAAiB,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;gBAC/C,OAAO,CACL,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;oBACpD,CAAC,CAAC,MAAM,CAAC,cAAc;oBACvB,CAAC,CAAC,IAAI,CACT,CAAC;gBAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACnD,IAAI,CAAC,QAAQ,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAErD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAEtB,UAAU,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;gBACpD,eAAe,CAAC,EAAE,CAAC,CAAC;gBACpB,UAAU,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IACvB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAErD,QAAQ,GACgB,CAC5B,CAAC;AACJ,CAAC;AAED,eAAe,uBAAuB,CAAC"} | ||
| {"version":3,"file":"LanguageContextProvider.js","sourceRoot":"","sources":["../../src/context/LanguageContextProvider.tsx"],"names":[],"mappings":"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"} |
@@ -13,3 +13,3 @@ import { useContext } from "react"; | ||
| return key; | ||
| return entry[lang] || entry["en"] || key; | ||
| return entry; | ||
| } | ||
@@ -16,0 +16,0 @@ return { t, setLang, lang, supportedLangs }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useTranslations.js","sourceRoot":"","sources":["../../src/hooks/useTranslations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAE5D,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAEhE,SAAS,CAAC,CAAC,GAAW;QACpB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAC,KAAK;YAAE,OAAO,GAAG,CAAC;QAEvB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AAC9C,CAAC"} | ||
| {"version":3,"file":"useTranslations.js","sourceRoot":"","sources":["../../src/hooks/useTranslations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAE5D,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAEhE,SAAS,CAAC,CAAC,GAAW;QACpB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAC,KAAK;YAAE,OAAO,GAAG,CAAC;QAEvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AAC9C,CAAC"} |
@@ -20,3 +20,3 @@ import fs from "fs"; | ||
| if (!fs.existsSync(INPUT)) { | ||
| console.error("โ translations_en.json not found"); | ||
| console.error("โ extractedText.json not found"); | ||
| process.exit(1); | ||
@@ -23,0 +23,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cleanTranslations.js","sourceRoot":"","sources":["../../src/scripts/cleanTranslations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE3B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AACpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;AAEvD,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,GAAG,GAAa,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAElE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAEpC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE3D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC"} | ||
| {"version":3,"file":"cleanTranslations.js","sourceRoot":"","sources":["../../src/scripts/cleanTranslations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE3B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AACpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;AAEvD,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,GAAG,GAAa,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAElE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAEpC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE3D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC"} |
@@ -66,36 +66,44 @@ import dotenv from "dotenv"; | ||
| // ๐ฅ NEW: detect missing languages per text | ||
| function getMissingLangs(text, existing, supportedLangs) { | ||
| const existingEntry = existing[text] || {}; | ||
| return supportedLangs.filter((lang) => !existingEntry[lang]); | ||
| function getMissingLangs(text, existingLangMap, supportedLangs) { | ||
| return supportedLangs.filter((lang) => { | ||
| return !existingLangMap[lang]?.[text]; | ||
| }); | ||
| } | ||
| function buildPrompt(chunk, existing, supportedLangs) { | ||
| const instructions = chunk.map((text) => { | ||
| const missing = getMissingLangs(text, existing, supportedLangs); | ||
| return `"${text}": { | ||
| "${sourceLanguage}": "${text}", | ||
| ${missing.map((l) => `"${l}": "..."`).join(",\n ")} | ||
| }`; | ||
| }); | ||
| function escapeText(text) { | ||
| return text.replace(/"/g, '\\"'); | ||
| } | ||
| function buildPrompt(chunk, existingLangMap, supportedLangs) { | ||
| const instructions = chunk | ||
| .map((text) => { | ||
| const missing = getMissingLangs(text, existingLangMap, supportedLangs); | ||
| if (missing.length === 0) | ||
| return null; | ||
| const safeText = escapeText(text); | ||
| return `"${safeText}": { | ||
| "${sourceLanguage}": "${safeText}", | ||
| ${missing.map((l) => `"${l}": "..."`).join(",\n ")} | ||
| }`; | ||
| }) | ||
| .filter(Boolean); | ||
| return ` | ||
| You are a translation engine. | ||
| You are a localization engine for UI text. | ||
| Translate ONLY the missing languages. | ||
| ${context | ||
| ? `Context (optional, use only if helpful): | ||
| "${context}"` | ||
| : ""} | ||
| ${context ? `Context (use only if helpful): "${context}"` : ""} | ||
| Guidelines: | ||
| - Use the provided context ONLY if it improves translation quality | ||
| - Ignore the context if it is not relevant to the text | ||
| - Preserve meaning, tone, and intent of UI text | ||
| - Do NOT over-interpret context | ||
| - Keep translations natural and concise | ||
| - Preserve meaning, tone, and intent (concise, UI-friendly) | ||
| - Ignore context if not useful | ||
| - Use native script and standard formal language | ||
| - Each language must strictly follow its standard vocabulary and grammar. Do not mix with any other language, even if similar. | ||
| - Do not mix languages (strict per ISO code) | ||
| - Keep keys unchanged (exact source string) | ||
| - Keep technical/brand terms if translation is unnatural | ||
| Rules: | ||
| - Return ONLY valid JSON | ||
| - No explanation | ||
| - No markdown | ||
| - No explanation or markdown | ||
| - Do NOT overwrite existing translations | ||
| - Include ONLY missing languages per entry | ||
@@ -115,7 +123,23 @@ Structure: | ||
| if (provider === "gemini") { | ||
| const result = await model.generateContent(prompt); | ||
| const result = await model.generateContent({ | ||
| contents: [{ role: "user", parts: [{ text: prompt }] }], | ||
| generationConfig: { | ||
| temperature: 0.2, | ||
| topP: 0.9, | ||
| topK: 20, | ||
| maxOutputTokens: 8192, | ||
| responseMimeType: "application/json", | ||
| }, | ||
| }); | ||
| const response = await result.response; | ||
| let text = response.text(); | ||
| text = text.replace(/```json|```/g, "").trim(); | ||
| return JSON.parse(text); | ||
| try { | ||
| return JSON.parse(text); | ||
| } | ||
| catch (err) { | ||
| console.error("โ JSON parse failed"); | ||
| console.log(text); | ||
| throw err; | ||
| } | ||
| } | ||
@@ -147,3 +171,10 @@ // ๐ฅ OPENAI FLOW | ||
| text = text.replace(/```json|```/g, "").trim(); | ||
| return JSON.parse(text); | ||
| try { | ||
| return JSON.parse(text); | ||
| } | ||
| catch (err) { | ||
| console.error("โ JSON parse failed"); | ||
| console.log(text); | ||
| throw err; | ||
| } | ||
| } | ||
@@ -162,17 +193,27 @@ throw new Error("Invalid provider"); | ||
| const texts = JSON.parse(fs.readFileSync(INPUT, "utf-8")); | ||
| let existing = {}; | ||
| if (fs.existsSync(OUTPUT)) { | ||
| existing = JSON.parse(fs.readFileSync(OUTPUT, "utf-8")); | ||
| const PUBLIC_DIR = path.join(ROOT, "public"); | ||
| const existingLangMap = {}; | ||
| const allLangs = [sourceLanguage, ...supportedLangs]; | ||
| // โ Load existing files | ||
| for (const lang of allLangs) { | ||
| const filePath = path.join(PUBLIC_DIR, `translations_${lang}.json`); | ||
| if (fs.existsSync(filePath)) { | ||
| existingLangMap[lang] = JSON.parse(fs.readFileSync(filePath, "utf-8")); | ||
| } | ||
| else { | ||
| existingLangMap[lang] = {}; | ||
| } | ||
| } | ||
| // โ Filter texts needing translation | ||
| const filtered = texts.filter((t) => { | ||
| const existingEntry = existing[t]; | ||
| // new string โ translate | ||
| if (!existingEntry) | ||
| const hasSource = existingLangMap[sourceLanguage]?.[t]; | ||
| if (!hasSource) | ||
| return true; | ||
| // check if any language missing | ||
| const missingLangs = supportedLangs.filter((lang) => !existingEntry[lang]); | ||
| const missingLangs = supportedLangs.filter((lang) => { | ||
| return !(existingLangMap[lang] && existingLangMap[lang][t]); | ||
| }); | ||
| return missingLangs.length > 0; | ||
| }); | ||
| const chunks = chunk(filtered, CHUNK_SIZE); | ||
| let final = { ...existing }; | ||
| // โ Progress bar | ||
| function updateProgress(current, total) { | ||
@@ -185,16 +226,15 @@ const percent = Math.floor((current / total) * 100); | ||
| } | ||
| // โ Translation loop | ||
| for (const [i, chunk] of chunks.entries()) { | ||
| updateProgress(i + 1, chunks.length); | ||
| try { | ||
| const res = await translateChunk(model, chunk, existing, supportedLangs); | ||
| const res = await translateChunk(model, chunk, existingLangMap, supportedLangs); | ||
| for (const key in res) { | ||
| if (!final[key]) { | ||
| final[key] = res[key]; | ||
| const entry = res[key]; | ||
| for (const lang of Object.keys(entry)) { | ||
| if (!existingLangMap[lang]) { | ||
| existingLangMap[lang] = {}; | ||
| } | ||
| existingLangMap[lang][key] = entry[lang]; | ||
| } | ||
| else { | ||
| final[key] = { | ||
| ...final[key], | ||
| ...res[key], // only adds missing languages | ||
| }; | ||
| } | ||
| } | ||
@@ -207,10 +247,18 @@ } | ||
| } | ||
| process.stdout.write("\n"); // move to next line after progress | ||
| fs.writeFileSync(OUTPUT, JSON.stringify(final, null, 2)); | ||
| log.success("translations.json generated successfully!"); | ||
| process.stdout.write("\n"); | ||
| // โ Ensure public folder exists | ||
| if (!fs.existsSync(PUBLIC_DIR)) { | ||
| fs.mkdirSync(PUBLIC_DIR, { recursive: true }); | ||
| } | ||
| // โ Write language-wise files | ||
| for (const lang of allLangs) { | ||
| const filePath = path.join(PUBLIC_DIR, `translations_${lang}.json`); | ||
| fs.writeFileSync(filePath, JSON.stringify(existingLangMap[lang], null, 2)); | ||
| } | ||
| log.success("translations generated successfully!"); | ||
| console.log("\n๐ Summary:"); | ||
| console.log(` Total input strings: ${texts.length}`); | ||
| console.log(` Translated now: ${filtered.length}`); | ||
| console.log(` Total stored translations: ${Object.keys(final).length}`); | ||
| console.log(` Output: public/translations.json\n`); | ||
| console.log(` Total stored translations: ${Object.values(existingLangMap[sourceLanguage] || {}).length}`); | ||
| console.log(` Output: public/translations_[lang].json\n`); | ||
| const duration = ((Date.now() - startTime) / 1000).toFixed(2); | ||
@@ -217,0 +265,0 @@ console.log(`โฑ Completed in ${duration}s`); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"translate.js","sourceRoot":"","sources":["../../src/scripts/translate.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"translate.js","sourceRoot":"","sources":["../../src/scripts/translate.ts"],"names":[],"mappings":"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"} |
+9
-3
| { | ||
| "name": "localize-ai", | ||
| "version": "1.1.0", | ||
| "description": "plug and play localization package", | ||
| "version": "1.2.0", | ||
| "description": "AI-powered React localization with context-aware translations, multi-provider support, lazy loading, and per-locale splitting", | ||
| "main": "dist/index.js", | ||
@@ -29,5 +29,11 @@ "types": "dist/index.d.ts", | ||
| "translation", | ||
| "react", | ||
| "react-i18n", | ||
| "ai", | ||
| "ai-translation", | ||
| "gemini" | ||
| "openai", | ||
| "gemini", | ||
| "internationalization", | ||
| "multilingual", | ||
| "react-localization" | ||
| ], | ||
@@ -34,0 +40,0 @@ "author": "Parth Gupta", |
+72
-15
| # ๐ localize-ai | ||
| **Plug & Play AI-powered localization for React apps** | ||
| **Plug & Play AI-powered localization for React apps with lazy loading & per-locale splitting** | ||
@@ -10,3 +10,5 @@ > Context-aware AI localization with multi-provider support โก | ||
| Designed for performance: no unnecessary data, no re-fetching, minimal bundle impact. | ||
| --- | ||
@@ -16,12 +18,35 @@ | ||
| * ๐ Auto-extract static text from your codebase (`t("...")`) | ||
| * ๐ AI-powered translations (Gemini, Openai) | ||
| * โก Incremental translation (only new strings + languages) | ||
| * ๐ง Zero config runtime (auto loads translations) | ||
| * โ๏ธ React hooks + context out of the box | ||
| * ๐ธ Cost optimized (no re-translation of existing content) | ||
| ### ๐ง Core | ||
| * ๐ Auto-extract static text (`t("...")`) | ||
| * ๐ AI-powered translations (OpenAI, Gemini) | ||
| * โก Incremental translation (only new strings/languages) | ||
| ### โก Performance | ||
| * โก Lazy loading (loads only required language) | ||
| * ๐ฆ Per-locale splitting (smaller bundles) | ||
| * ๐ Built-in caching (no redundant fetches) | ||
| ### โ๏ธ Developer Experience | ||
| * ๐ง Zero-config runtime | ||
| * โ๏ธ React hooks + context | ||
| * ๐ง Context-aware translations | ||
| * ๐ธ Cost optimized (no re-translation) | ||
| --- | ||
| ## โก Performance Optimizations | ||
| ### localize-ai is optimized for production: | ||
| * **Per-locale splitting** | ||
| โ Each language is stored separately (translations_en.json, translations_hi.json) | ||
| * **Lazy loading** | ||
| โ Only loads the active language instead of all translations | ||
| * **Caching** | ||
| โ Prevents repeated fetches and improves performance | ||
| ๐ This ensures fast load times and minimal bundle size. | ||
| --- | ||
| ## ๐ฆ Installation | ||
@@ -50,2 +75,4 @@ | ||
| ๐ Providing context improves translation accuracy by helping AI understand intent (e.g., "Charge" in payments vs battery). | ||
| --- | ||
@@ -80,9 +107,14 @@ | ||
| * scan your codebase | ||
| * extract `t("text")` | ||
| * extract t("text") | ||
| * generate translations | ||
| * create: | ||
| * create per-language translation files: | ||
| ``` | ||
| public/translations.json | ||
| public/localize.runtime.json | ||
| public/ | ||
| โโโ translations_en.json | ||
| โโโ translations_hi.json | ||
| โโโ translations_fr.json | ||
| โโโ ... | ||
| localize.runtime.json | ||
| ``` | ||
@@ -144,4 +176,6 @@ | ||
| public/ | ||
| โโโ translations.json | ||
| โโโ localize.runtime.json | ||
| โโโ translations_en.json | ||
| โโโ translations_hi.json | ||
| โโโ translations_fr.json | ||
| โโโ ... | ||
| ``` | ||
@@ -201,6 +235,29 @@ | ||
| ### Core Improvements | ||
| * [ ] AST-based extraction (no regex) | ||
| * [ ] Lazy loading translations | ||
| * [ ] CLI UI improvements | ||
| * [ ] Better error handling & retry logic for failed translations | ||
| * [ ] CLI UX improvements (spinners, better logs) | ||
| ### Performance & DX | ||
| * [x] Lazy loading translations | ||
| * [x] Per-locale splitting | ||
| * [x] Built-in caching | ||
| * [ ] CDN support for translation files | ||
| ### Features | ||
| * [x] Multi-provider support (OpenAI, Gemini) | ||
| * [ ] Fallback providers (auto-switch if one fails) | ||
| * [ ] Custom translation rules (skip/override specific keys) | ||
| * [ ] Namespace support (group translations) | ||
| ### Developer Experience | ||
| * [ ] VS Code extension (highlight untranslated strings) | ||
| * [ ] Debug mode (show missing translations in UI) | ||
| * [ ] CLI dry-run mode | ||
| ### Future Ideas | ||
| * [ ] Support for frameworks beyond React (Next.js, Vue) | ||
| * [ ] Dashboard for managing translations | ||
| * [ ] Analytics (missing keys, usage tracking) | ||
| --- | ||
@@ -207,0 +264,0 @@ |
50103
15.26%551
15.27%286
24.89%