UNPKG

@neiderruiz/translate-files

Version:

Internationalize and manage your website easily with (CSV or JSON to i18n)

123 lines (111 loc) 4.31 kB
import fs from 'fs'; import path from 'path'; import { TypeListLang } from "src/translate/types/langs"; import { getTranslationsFromAPI } from '../../translate/utils/get-translations-api'; import { copyFilesFolder } from './copy-files-folder'; import { extractKeysAndTexts } from "./extract-keys-and-texts"; type Options = { dir: string; baseDocsDir: string; i18nDir: string; defaultLocale: TypeListLang; locales: TypeListLang[]; outputDocDir: string; apiKey?: string; } export const docsTranslate = async ({ dir, baseDocsDir, defaultLocale, locales, i18nDir, outputDocDir, apiKey }: Options) => { const items = fs.readdirSync(dir); items.forEach(async (item) => { const itemPath = path.join(dir, item); const itemRelativePath = path.relative(baseDocsDir, itemPath); if (fs.statSync(itemPath).isDirectory()) { // subfolder process docsTranslate({ dir: itemPath, baseDocsDir, defaultLocale, locales, i18nDir, outputDocDir, apiKey }); } else if (item.endsWith('.md') || item === '_category_.json') { // process archivo `.md` o `_category_.json` const content = fs.readFileSync(itemPath, 'utf8'); const keysAndTexts = extractKeysAndTexts(content); const localeArray = defaultLocale ? [defaultLocale, ...locales] : locales; for (const locale of localeArray) { let translations = {}; if (defaultLocale === locale) { translations = keysAndTexts; // Mantener el contenido original } else { translations = await getTranslationsFromAPI({ sourceLang: defaultLocale!, targetLang: locale, data: keysAndTexts, typeProject: 'docusaurus', apiKey, route_file: itemPath }); } const localeDir = path.join( i18nDir, locale, 'docusaurus-plugin-content-docs/current', path.dirname(itemRelativePath) ); if (!fs.existsSync(localeDir)) { fs.mkdirSync(localeDir, { recursive: true }); } const outputFilePath = path.join(localeDir, item); let translatedContent = content; for (const [key, value] of Object.entries(translations)) { translatedContent = translatedContent.replace(new RegExp(`{{${key}\\|.*?}}`, 'g'), value as any); } const routeOutputLog = path.join( locale, 'docusaurus-plugin-content-docs/current', path.dirname(itemRelativePath), item ); if (defaultLocale === locale) { const baseDocsPath = path.join( outputDocDir, path.dirname(itemRelativePath) ); if (!fs.existsSync(baseDocsPath)) { fs.mkdirSync(baseDocsPath, { recursive: true }); } const routeFileSaveDoc = path.join( outputDocDir, path.dirname(itemRelativePath), item ); fs.writeFileSync(routeFileSaveDoc, translatedContent); } fs.writeFileSync(outputFilePath, translatedContent); console.log(`✅ (Translated): ${routeOutputLog}`); } } else { // move file to all locales and copy to docs copyFilesFolder({ defaultFolder: outputDocDir, defaultLocale, i18nDir, item, itemPath, itemRelativePath, locales, baseFolderSave: 'docusaurus-plugin-content-docs/current' }) } }); };