@neiderruiz/translate-files
Version:
Internationalize and manage your website easily with (CSV or JSON to i18n)
127 lines (111 loc) • 4.26 kB
text/typescript
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;
baseBlogDir: string;
i18nDir: string;
defaultLocale: TypeListLang;
locales: TypeListLang[];
blogDir?: string;
apiKey?: string;
outputBlogDir: string;
}
export const blogTranslate = async ({
dir,
defaultLocale,
locales,
i18nDir = './i18n',
baseBlogDir,
outputBlogDir,
apiKey,
}: Options) => {
const items = fs.readdirSync(dir);
items.forEach(async (item) => {
const itemPath = path.join(dir, item);
const itemRelativePath = path.relative(baseBlogDir, itemPath);
if (fs.statSync(itemPath).isDirectory()) {
// subfolder process
blogTranslate({
dir: itemPath,
baseBlogDir,
defaultLocale,
locales,
i18nDir,
outputBlogDir,
apiKey
});
} else if (item.endsWith('.md') || item.endsWith('.yml')) {
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-blog',
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-blog',
path.dirname(itemRelativePath),
item
);
if (defaultLocale === locale) {
const baseDocsPath = path.join(
outputBlogDir,
path.dirname(itemRelativePath)
);
if (!fs.existsSync(baseDocsPath)) {
fs.mkdirSync(baseDocsPath, { recursive: true });
}
const routeFileSaveDoc = path.join(
outputBlogDir,
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 blog
copyFilesFolder({
defaultFolder: outputBlogDir,
defaultLocale,
i18nDir,
item,
itemPath,
itemRelativePath,
locales,
baseFolderSave: 'docusaurus-plugin-content-blog'
})
}
});
};