mirror of
https://github.com/elyby/emails-renderer.git
synced 2025-05-31 14:12:05 +05:30
Upgrade project structure to webpack 4.
Remove unused dependencies. Rename all .jsx files into .js.
This commit is contained in:
@@ -1,14 +1,19 @@
|
||||
/* eslint-env node */
|
||||
/* eslint-disable no-console */
|
||||
import fs from 'fs';
|
||||
import {sync as globSync} from 'glob';
|
||||
import {sync as mkdirpSync} from 'mkdirp';
|
||||
import path from 'path';
|
||||
import glob from 'glob';
|
||||
import mkdirp from 'mkdirp';
|
||||
import chalk from 'chalk';
|
||||
import prompt from 'prompt';
|
||||
|
||||
const MESSAGES_PATTERN = '../dist/messages/**/*.json';
|
||||
const LANG_DIR = '../src/i18n';
|
||||
// https://stackoverflow.com/a/50052194/5184751
|
||||
const __dirname = path.dirname(new URL(import.meta.url).pathname); // eslint-disable-line
|
||||
|
||||
const MESSAGES_PATTERN = path.resolve(__dirname, '../dist/messages/**/*.json');
|
||||
const LANG_DIR = path.resolve(__dirname, '../src/i18n');
|
||||
const DEFAULT_LOCALE = 'en';
|
||||
const SUPPORTED_LANGS = [DEFAULT_LOCALE].concat('ru', 'be', 'uk');
|
||||
const SUPPORTED_LANGS = Object.keys(JSON.parse(fs.readFileSync(path.join(LANG_DIR, 'index.json'))));
|
||||
|
||||
/**
|
||||
* Aggregates the default messages that were extracted from the app's
|
||||
@@ -18,7 +23,7 @@ const SUPPORTED_LANGS = [DEFAULT_LOCALE].concat('ru', 'be', 'uk');
|
||||
*/
|
||||
let idToFileMap = {};
|
||||
let duplicateIds = [];
|
||||
const collectedMessages = globSync(MESSAGES_PATTERN)
|
||||
const collectedMessages = glob.sync(MESSAGES_PATTERN)
|
||||
.map((filename) => [filename, JSON.parse(fs.readFileSync(filename, 'utf8'))])
|
||||
.reduce((collection, [file, descriptors]) => {
|
||||
descriptors.forEach(({id, defaultMessage}) => {
|
||||
@@ -37,7 +42,8 @@ if (duplicateIds.length) {
|
||||
console.log('\nFound duplicated ids:');
|
||||
duplicateIds.forEach((id) => console.log(`${chalk.yellow(id)}:\n - ${idToFileMap[id].join('\n - ')}\n`));
|
||||
console.log(chalk.red('Please correct the errors above to proceed further!'));
|
||||
return;
|
||||
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
duplicateIds = null;
|
||||
@@ -83,7 +89,8 @@ keysToUpdate = Object.entries(prevMessages).reduce((acc, [key, message]) =>
|
||||
});
|
||||
|
||||
if (!keysToAdd.length && !keysToRemove.length && !keysToUpdate.length && !keysToRename.length) {
|
||||
return console.log(chalk.green('Everything is up to date!'));
|
||||
console.log(chalk.green('Everything is up to date!'));
|
||||
process.exit();
|
||||
}
|
||||
|
||||
console.log(chalk.magenta(`The diff relative to default locale (${DEFAULT_LOCALE}) is:`));
|
||||
@@ -135,7 +142,7 @@ prompt.get({
|
||||
|
||||
|
||||
function buildLocales() {
|
||||
mkdirpSync(LANG_DIR);
|
||||
mkdirp.sync(LANG_DIR);
|
||||
|
||||
SUPPORTED_LANGS.map((lang) => {
|
||||
const destPath = `${LANG_DIR}/${lang}.json`;
|
||||
@@ -1,150 +0,0 @@
|
||||
/* eslint-env node */
|
||||
/* eslint-disable no-console */
|
||||
|
||||
import onesky from 'onesky-utils';
|
||||
import fs from 'fs';
|
||||
import ch from 'chalk';
|
||||
|
||||
const LANG_DIR = `${__dirname}/../src/i18n`;
|
||||
const SOURCE_LANG = 'en'; // Базовый язык, относительно которого будут формироваться все остальные переводы
|
||||
const SOURCE_FILE_NAME = 'i18n.json'; // Название файла с исходными строками внутри OneSky
|
||||
const INDEX_FILE_NAME = 'index.json'; // Название файла с информацией о переводах
|
||||
const MIN_RELEASE_PROGRESS = 80; // Какой процент локали перевода должен быть выполнен, чтобы локаль была опубликована
|
||||
|
||||
/**
|
||||
* Массив локалей для соответствия каноничному виду в OneSky и нашему представлению
|
||||
* о том, каким должны быть имена локалей
|
||||
*/
|
||||
const LOCALES_MAP = {
|
||||
ru: 'ru-RU',
|
||||
en: 'en-GB',
|
||||
sl: 'sl-SI',
|
||||
fr: 'fr-FR',
|
||||
el: 'el-GR',
|
||||
de: 'de-DE',
|
||||
sr: 'sr-RS',
|
||||
lt: 'lt-LT',
|
||||
};
|
||||
|
||||
// https://ely-translates.oneskyapp.com/admin/site/settings
|
||||
const defaultOptions = {
|
||||
apiKey: '5MaW9TYp0S3qdJgkZ5QLgEIDeabkFDzB',
|
||||
secret: 'qd075hUNpop4DItD6KOXKQnbqWPLZilf',
|
||||
projectId: 202784,
|
||||
};
|
||||
|
||||
/**
|
||||
* Переводит из кода языка в OneSky в наше представление
|
||||
*
|
||||
* @param {string} code
|
||||
* @return {string}
|
||||
*/
|
||||
function code2locale(code) {
|
||||
for (const locale in LOCALES_MAP) {
|
||||
if (code === LOCALES_MAP[locale]) {
|
||||
return locale;
|
||||
}
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Переводит из нашего формата локалей в ожидаемое значение OneSky
|
||||
*
|
||||
* @param {string} locale
|
||||
* @return {string}
|
||||
*/
|
||||
function locale2code(locale) {
|
||||
return LOCALES_MAP[locale] || locale;
|
||||
}
|
||||
|
||||
/**
|
||||
* Форматирует входящий объект с переводами в итоговую строку в том формате, в каком они
|
||||
* хранятся в самом приложении
|
||||
*
|
||||
* @param {object} translates
|
||||
* @return {string}
|
||||
*/
|
||||
function formatTranslates(translates) {
|
||||
return JSON.stringify(sortByKeys(translates), null, 4) + '\n'; // eslint-disable-line prefer-template
|
||||
}
|
||||
|
||||
/**
|
||||
* http://stackoverflow.com/a/29622653/5184751
|
||||
*
|
||||
* @param {object} object
|
||||
* @return {object}
|
||||
*/
|
||||
function sortByKeys(object) {
|
||||
return Object.keys(object).sort().reduce((result, key) => {
|
||||
result[key] = object[key];
|
||||
return result;
|
||||
}, {});
|
||||
}
|
||||
|
||||
async function pullReadyLanguages() {
|
||||
const languages = JSON.parse(await onesky.getLanguages({...defaultOptions}));
|
||||
return languages.data
|
||||
.filter((elem) => elem.is_ready_to_publish || parseFloat(elem.translation_progress) > MIN_RELEASE_PROGRESS);
|
||||
}
|
||||
|
||||
async function pullTranslate(language) {
|
||||
const rawResponse = await onesky.getFile({...defaultOptions, language, fileName: SOURCE_FILE_NAME});
|
||||
const response = JSON.parse(rawResponse);
|
||||
fs.writeFileSync(`${LANG_DIR}/${code2locale(language)}.json`, formatTranslates(response));
|
||||
}
|
||||
|
||||
async function pull() {
|
||||
console.log('Pulling locales list...');
|
||||
const langs = await pullReadyLanguages();
|
||||
const langsList = langs.map((elem) => elem.custom_locale || elem.code);
|
||||
|
||||
console.log(ch.green('Pulled locales: ') + langsList.map((lang) => code2locale(lang)).join(', '));
|
||||
|
||||
console.log('Pulling translates...');
|
||||
await Promise.all(langsList.map(async (lang) => {
|
||||
await pullTranslate(lang);
|
||||
console.log(ch.green('Locale ') + ch.white.bold(code2locale(lang)) + ch.green(' successfully pulled'));
|
||||
}));
|
||||
|
||||
console.log('Writing an index file...');
|
||||
const mapFileContent = {};
|
||||
langs.map((elem) => {
|
||||
mapFileContent[elem.locale] = {
|
||||
name: elem.local_name.match(/^([^\(]+)/)[0].trim(), // Обрезаем значения в скобках
|
||||
progress: parseFloat(elem.translation_progress),
|
||||
};
|
||||
});
|
||||
fs.writeFileSync(`${LANG_DIR}/${INDEX_FILE_NAME}`, formatTranslates(mapFileContent));
|
||||
console.log(ch.green('The index file was successfully written'));
|
||||
}
|
||||
|
||||
async function publish() {
|
||||
console.log(`Publishing ${ch.bold(SOURCE_LANG)} translates file...`);
|
||||
await onesky.postFile({
|
||||
...defaultOptions,
|
||||
format: 'HIERARCHICAL_JSON',
|
||||
content: fs.readFileSync(`${LANG_DIR}/${SOURCE_LANG}.json`, 'utf8'),
|
||||
keepStrings: false,
|
||||
language: locale2code(SOURCE_LANG),
|
||||
fileName: SOURCE_FILE_NAME,
|
||||
});
|
||||
console.log(ch.green('Success'));
|
||||
}
|
||||
|
||||
try {
|
||||
const action = process.argv[2];
|
||||
switch (action) {
|
||||
case 'pull':
|
||||
pull();
|
||||
break;
|
||||
case 'publish':
|
||||
publish();
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Unknown action ${action}`);
|
||||
}
|
||||
} catch (exception) {
|
||||
console.error(exception);
|
||||
}
|
||||
@@ -11,7 +11,8 @@
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"chalk": "^1.1.3",
|
||||
"node-babel": "^0.1.2",
|
||||
"glob": "^7.1.3",
|
||||
"mkdirp": "^0.5.1",
|
||||
"prompt": "^1.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user