translate-replace
Version:
A versatile npm package for translating and replacing text seamlessly. Support for multiple languages and easy integration into your projects.
173 lines (160 loc) • 6.4 kB
JavaScript
// Документация
// 1.В файле package.json в разделе "scripts" нужно написать "translate": "node translationsConfig.js"
// 2.Чтобы запустить переводы, введите `npm run translate Имя_файла Имя_папки`, 'имя файла и имя папки не являются обязательными' в терминале.
// 3.Применимые файлы
// - Файл html должен иметь тег html вида <html lang="en"></html>
// - Файл vue должен иметь тег html вида <template lang="html"><\template>
// 4.Для placeholders формы в конце нужно добавить ключевое слово _place, это условие для ключевых слов в админке
// const axios = require("axios");
module.exports = function () {
const fs = require("fs");
const path = require("path");
const selectedValues = require("./toTranslate");
const consoleUtils = require("./helpersTranslation/consoleUnits");
const templates = require("./helpersTranslation/fileTemplates");
const getTranslations = require("./helpersTranslation/translationsFile");
const OUTSIDE_FILES = require("./helpersTranslation/outsideFiles");
const replaceContent = require("./helpersTranslation/replace");
const ignorFiles = require("./helpersTranslation/ignoreFiles");
const fileType = selectedValues[1] || "html";
const folderName =
selectedValues[0] == OUTSIDE_FILES ? undefined : selectedValues[0];
const fileTemplate = templates[fileType];
async function searchAndReplaceInFolder(folderName) {
const scriptDirectory = __dirname;
const grandparentDirectory = path.dirname(path.dirname(scriptDirectory));
const targetDirectory = folderName
? path.join(grandparentDirectory, folderName)
: grandparentDirectory;
const files = fs.readdirSync(targetDirectory);
if (files.length == 0) {
consoleUtils.error("This folder is empty");
} else {
const texts = await getTranslations();
const sortByTextLength = Object.entries(texts).sort(
(a, b) => b[1].length - a[1].length
);
consoleUtils.info("Translations list: ");
console.table(sortByTextLength);
const placeHolderTexts = await sortByTextLength.filter((elem) =>
elem[0].includes("_place")
);
consoleUtils.info("Placeholder text list: ");
console.table(placeHolderTexts);
const simpleTexts = await sortByTextLength.filter(
(elem) => !elem[0].includes("_place")
);
consoleUtils.info("Text list: ");
console.table(simpleTexts);
placeHolderTexts.forEach((item, index) => {
let searchText = `placeholder="${item[1]}"`;
let replaceText =
replaceContent.placeholder[0] +
item[0] +
replaceContent.placeholder[1];
searchAndReplaceFiles(
targetDirectory,
searchText,
replaceText,
index,
true
);
});
simpleTexts.forEach((item, index) => {
let replaceText =
replaceContent.content[0] + item[0] + replaceContent.content[1];
searchAndReplaceFiles(
targetDirectory,
item[1],
replaceText,
index,
false
);
});
}
}
async function searchAndReplaceFiles(
directory,
searchText,
replaceText,
textIndex,
isPlace
) {
try {
const texts = await getTranslations();
const files = fs.readdirSync(directory);
files.forEach(async (file) => {
const filePath = path.join(directory, file);
const stats = fs.statSync(filePath);
if (stats.isDirectory() && folderName && !ignorFiles.includes(file)) {
consoleUtils.info(
`${
isPlace ? "[Placeholder]: " : ""
}Searching for text ${textIndex} in folder named ${file}...`
);
searchAndReplaceFiles(filePath, searchText, replaceText, 2);
} else if (stats.isFile() && file.endsWith(`.${fileType}`)) {
if (!Object.keys(texts).includes(searchText)) {
consoleUtils.info(
`${
isPlace ? "[Placeholder]: " : ""
}Searching for text ${textIndex} in file named ${file}...`
);
let content = fs.readFileSync(filePath, "utf-8");
const updatedContent = replaceTextInVueTemplate(
content,
searchText,
replaceText
);
if (updatedContent !== content) {
consoleUtils.success(
`Replaced text ${textIndex} in file: ${filePath}`
);
}
fs.writeFileSync(filePath, updatedContent, "utf-8");
} else {
consoleUtils.error(
`"${searchText}" text can be equal to one of the keywords please check !!!`
);
}
}
});
} catch (e) {
consoleUtils.error(`The folder named "${folderName}" was not found!`);
}
}
function replaceTextInVueTemplate(content, searchText, replaceText) {
const regex = fileTemplate;
const matches = content.match(regex);
if (matches) {
const templateContent = matches[1];
const searchTextTrim = searchText.trim().toString();
try {
const escapedSearchText = searchTextTrim.replace(
/[.*+?^${}()|[\]\\]/g,
"\\$&"
);
if (!replaceText.includes(searchTextTrim)) {
const updatedTemplateContent = templateContent.replace(
new RegExp(escapedSearchText, "g"),
replaceText
);
const updatedContent = content.replace(
templateContent,
updatedTemplateContent
);
return updatedContent;
} else {
consoleUtils.error(
`[${searchTextTrim}]: The search text may contain a replacement keyword, please check your keywords`
);
}
} catch (e) {
console.log(e);
}
}
return content;
}
consoleUtils.success("Starting process...");
searchAndReplaceInFolder(folderName);
};