UNPKG

better-crowdin

Version:

Crowdin CLI on steroids

130 lines (117 loc) 2.81 kB
const path = require('path'); const getCrowdinBranch = require('./getCrowdinBranch'); const getAPI = require('../api'); function swap(obj) { if (!obj) { return {}; } const ret = {}; Object.entries(obj).forEach(([key, value]) => { ret[value] = key; }); return ret; } function findLang(allLanguages, langCode) { return allLanguages.find(({ crowdin_code: code }) => langCode === code); } function getValue(mapping, key, lang) { return mapping && mapping[key] && swap(mapping[key])[lang]; } function replaceLangVars(allLanguages, source, translation, lang, mapping) { const baseLang = findLang(allLanguages, lang); const extName = path.extname(source); const fileName = [ { key: 'language', value: baseLang.name, }, { key: 'two_letters_code', value: baseLang.iso_639_1, }, { key: 'three_letters_code', value: baseLang.iso_639_3, }, { key: 'locale', value: baseLang.locale, }, { key: 'locale_with_underscore', value: baseLang.locale.replace('-', '_'), }, { key: 'android_code', value: baseLang.android_code, }, { key: 'osx_code', value: baseLang.osx_code, }, { key: 'osx_locale', value: baseLang.locale, }, ].reduce( (text, { key, value }) => text.replace( new RegExp(`%${key}%`, 'g'), getValue(mapping, key, lang) || value, ), translation, ); return fileName .replace(/%original_file_name%/g, path.basename(source)) .replace(/%file_name%/g, path.basename(source, extName)) .replace(/%file_extension%/g, extName.replace('.', '')) .replace(/%original_path%/g, path.dirname(source)); } function getTranslations( language, allLanguages, availableLanguages, source, translation, mapping, ) { if (language) { return replaceLangVars( allLanguages, source, translation, language, mapping, ); } return availableLanguages.reduce((acc, lang) => { acc[lang] = replaceLangVars( allLanguages, source, translation, lang, mapping, ); return acc; }, {}); } module.exports = async function getTranslationPaths(argv, language) { const branch = await getCrowdinBranch(argv); const API = getAPI(argv, branch); const availableLanguages = await API.availableLanguages(); const allLanguages = await API.crowdinLanguages(); const { files } = argv; const result = {}; files.forEach(({ source, translation, languages_mapping: mapping }) => { const translations = getTranslations( language, allLanguages, availableLanguages, source, translation, mapping, ); result[source] = translations; }); return result; };