mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 06:07:21 +01:00
126 lines
3.2 KiB
JavaScript
126 lines
3.2 KiB
JavaScript
import fs from 'fs';
|
|
import _ from 'lodash';
|
|
import nconf from 'nconf';
|
|
import md5 from 'md5';
|
|
import gulp from 'gulp';
|
|
import request from 'superagent';
|
|
|
|
nconf.argv().env().file({ file: 'config.json' });
|
|
|
|
const LOCALES = './common/locales/';
|
|
const ENGLISH_LOCALE = `${LOCALES}en/`;
|
|
|
|
const SLACK_URL = nconf.get('TRANSIFEX_SLACK:url');
|
|
const SLACK_CHANNEL = '#' + nconf.get('TRANSIFEX_SLACK:channel');
|
|
const SLACK_USERNAME = 'Transifex';
|
|
const SLACK_EMOJI = ':transifex:';
|
|
|
|
gulp.task('transifex:missingStrings', () => {
|
|
|
|
let missingStrings = [];
|
|
let languages = getArrayOfLanguages();
|
|
|
|
eachTranslationString(languages, (language, filename, key, englishString, translationString) => {
|
|
if (!translationString) {
|
|
let errorString = `${language} - ${filename} - ${key} - ${englishString}`;
|
|
missingStrings.push(errorString);
|
|
}
|
|
});
|
|
|
|
if (!_.isEmpty(missingStrings)) {
|
|
let message = 'The following strings are not translated';
|
|
let formattedMessage = formatMessageForPosting(message, missingStrings);
|
|
console.log(formattedMessage);
|
|
}
|
|
});
|
|
|
|
function getArrayOfLanguages() {
|
|
let languages = fs.readdirSync(LOCALES);
|
|
languages.shift(); // Remove README.md from array of languages
|
|
|
|
return languages;
|
|
}
|
|
|
|
function getNonEnglishLanguages() {
|
|
let allLanguages = getArrayOfLanguages();
|
|
|
|
let nonEnglishLanguages = _.filter(allLanguages, (lang) => {
|
|
return lang.indexOf('en') !== 0;
|
|
});
|
|
|
|
return nonEnglishLanguages;
|
|
}
|
|
|
|
|
|
function eachTranslationFile(languages, cb) {
|
|
let jsonFiles = stripOutNonJsonFiles(fs.readdirSync(ENGLISH_LOCALE));
|
|
|
|
_(languages).each((lang) => {
|
|
_.each(jsonFiles, (filename) => {
|
|
try {
|
|
var translationFile = fs.readFileSync(LOCALES + lang + '/' + filename);
|
|
var parsedTranslationFile = JSON.parse(translationFile);
|
|
} catch (err) {
|
|
return cb(err);
|
|
}
|
|
|
|
let englishFile = fs.readFileSync(ENGLISH_LOCALE + filename);
|
|
let parsedEnglishFile = JSON.parse(englishFile);
|
|
|
|
cb(null, lang, filename, parsedEnglishFile, parsedTranslationFile)
|
|
});
|
|
});
|
|
}
|
|
|
|
function eachTranslationString(languages, cb) {
|
|
eachTranslationFile(languages, (error, language, filename, englishJSON, translationJSON) => {
|
|
if (error) return;
|
|
_.each(englishJSON, (string, key) => {
|
|
var translationString = translationJSON[key];
|
|
cb(language, filename, key, string, translationString);
|
|
});
|
|
});
|
|
}
|
|
|
|
function checkForIssues(thingToCheck) {
|
|
let hasIssues = !_.isEmpty(thingToCheck);
|
|
return hasIssues;
|
|
}
|
|
|
|
function post(message, items) {
|
|
let formattedMessage = formatMessageForPosting(message, items);
|
|
|
|
request.post(SLACK_URL)
|
|
.send({
|
|
channel: SLACK_CHANNEL,
|
|
username: SLACK_USERNAME,
|
|
text: formattedMessage,
|
|
icon_emoji: SLACK_EMOJI
|
|
})
|
|
.end((err, res) => {
|
|
if (err) console.error('Unable to post to slack', err);
|
|
});
|
|
}
|
|
|
|
function formatMessageForPosting(msg, items) {
|
|
let body = `*Warning:* ${msg}`;
|
|
body += '\n\n```\n';
|
|
body += items.join('\n');
|
|
body += '\n```';
|
|
|
|
return body;
|
|
}
|
|
|
|
function getHash(string) {
|
|
let hash = md5(`${string}:`);
|
|
return hash;
|
|
}
|
|
|
|
function stripOutNonJsonFiles(collection) {
|
|
let onlyJson = _.filter(collection, (file) => {
|
|
return file.match(/[a-zA-Z]*\.json/);
|
|
});
|
|
|
|
return onlyJson;
|
|
}
|