restore language helper and edit README

pull/404/head
gabrielburnworth 2017-08-15 05:06:25 -07:00
parent 3dcf1f89c6
commit 2bc4c6ff7a
3 changed files with 160 additions and 148 deletions

View File

@ -130,3 +130,12 @@ $.ajax({
# Want to Help?
[Low Hanging Fruit](https://github.com/FarmBot/Farmbot-Web-App/search?utf8=%E2%9C%93&q=todo). [Raise an issue](https://github.com/FarmBot/Farmbot-Web-App/issues/new?title=Question%20about%20a%20TODO) if you have any questions.
## Translating the web app into your language
Thanks for your interest in internationalizing the FarmBot web app! To add translations:
1. Fork this repo
0. Navigate to `/public/app-resources/languages` and run the command `node _helper.js yy` where `yy` is your language's [language code](http://www.science.co.il/Language/Locale-codes.php). Eg: `ru` for Russian.
0. Edit the translations in the file created in the previous step: `"phrase": "translated phrase"`.
0. When you have updated or added new translations, commit/push your changes and submit a pull request.

View File

@ -68,5 +68,8 @@ module.exports = {
new webpack.DefinePlugin({
"process.env.NODE_ENV": JSON.stringify("production")
})
]
],
node: {
fs: "empty"
}
}

View File

@ -1,170 +1,170 @@
// var HelperNamespace = (function () {
// /**
// * @desc Build a list of all the files that are children of the root isDirectory
// * @param {string} dir The rot isDirectory
// * @param {list} filelist The list of the directories/files already detected
// * @param {string} ext The extension to filter for the files
// */
// function walkSync(dir, filelist, ext) {
// var path = path || require('path');
// var fs = fs || require('fs'),
// files = fs.readdirSync(dir);
// filelist = filelist || [];
// files.forEach(function (file) {
// if (fs.statSync(path.join(dir, file)).isDirectory()) {
// filelist = walkSync(path.join(dir, file), filelist, ext);
// }
// else {
// if (file.indexOf(ext) > 0)
// filelist.push(path.join(dir, file));
// }
// });
// return filelist;
// };
var HelperNamespace = (function () {
/**
* @desc Build a list of all the files that are children of the root isDirectory
* @param {string} dir The rot isDirectory
* @param {list} filelist The list of the directories/files already detected
* @param {string} ext The extension to filter for the files
*/
function walkSync(dir, filelist, ext) {
var path = path || require('path');
var fs = fs || require('fs'),
files = fs.readdirSync(dir);
filelist = filelist || [];
files.forEach(function (file) {
if (fs.statSync(path.join(dir, file)).isDirectory()) {
filelist = walkSync(path.join(dir, file), filelist, ext);
}
else {
if (file.indexOf(ext) > 0)
filelist.push(path.join(dir, file));
}
});
return filelist;
};
// /**
// * @desc search in the file in parameter to detect the tags
// */
// function searchInFile(path) {
// /* some tags could be missed in this regex
// We detect all the tags in the code
// regex is matching '.t("")' or '{t("")}' or ' t("")' or '(t("")' */
// var REGEX = /[\.|\{|(|\s]t\(\"([\w|\s|\{|\}|\(|\)]*)[\"|,].*\)/g;
/**
* @desc search in the file in parameter to detect the tags
*/
function searchInFile(path) {
/* some tags could be missed in this regex
We detect all the tags in the code
regex is matching '.t("")' or '{t("")}' or ' t("")' or '(t("")' */
var REGEX = /[\.|\{|(|\s]t\(\"([\w|\s|\{|\}|\(|\)]*)[\"|,].*\)/g;
// var fs = fs || require('fs')
// // load the file
// var fileContent = fs.readFileSync(path, 'utf8');
// let strArray = [];
// //match all the groups
// var match = REGEX.exec(fileContent);
// while (match != null) {
// strArray.push(match[1])
// match = REGEX.exec(fileContent);
// }
// return strArray;
// }
var fs = fs || require('fs')
// load the file
var fileContent = fs.readFileSync(path, 'utf8');
var strArray = [];
//match all the groups
var match = REGEX.exec(fileContent);
while (match != null) {
strArray.push(match[1])
match = REGEX.exec(fileContent);
}
return strArray;
}
// /**
// * Get all the tags in the files with extension .ts of the current project
// */
// function getAllTags() {
// const srcPath = __dirname + '/../../..';
/**
* Get all the tags in the files with extension .ts of the current project
*/
function getAllTags() {
const srcPath = __dirname + '/../../../';
// var listFilteredFiles = walkSync(srcPath, [], '.ts');
// var allTags = listFilteredFiles.map(x => searchInFile(x));
// //flatten list of list in a simple list
// var flattenedTags = [].concat.apply([], allTags);
var listFilteredFiles = walkSync(srcPath, [], '.ts');
var allTags = listFilteredFiles.map(x => searchInFile(x));
// //distinct
// var uniq = [...new Set(flattenedTags)];
//flatten list of list in a simple list
var flattenedTags = [].concat.apply([], allTags);
// var sorted = uniq.sort(function (a, b) { return a.localeCompare(b); });
//distinct
var uniq = Array.from(new Set(flattenedTags));
// return sorted;
// }
var sorted = uniq.sort(function (a, b) { return a.localeCompare(b); });
// /**
// * For debugging
// */
// function logAllTags() {
// console.dir(getAllTags());
// }
return sorted;
}
// /**
// * Create the translation file or update it with new tags
// * The tags are in the following order:
// * 1. New tags in English that need to be translated (ASC)
// * 2. Tags already translated, and kept because it match an existing tag in src (ASC)
// * 3. Tags already in the file before but not found at the moment in the src (ASC)
// * @param {string} lang The short name of the language. for the language in parameter
// */
// function createOrUpdateTranslationFile(lang) {
// lang = lang || 'en';
/**
* For debugging
*/
function logAllTags() {
console.dir(getAllTags());
}
// //check current file entry
// const langFilePath = __dirname + '/' + lang + '.js';
// var fs = fs || require('fs')
/**
* Create the translation file or update it with new tags
* The tags are in the following order:
* 1. New tags in English that need to be translated (ASC)
* 2. Tags already translated, and kept because it match an existing tag in src (ASC)
* 3. Tags already in the file before but not found at the moment in the src (ASC)
* @param {string} lang The short name of the language. for the language in parameter
*/
function createOrUpdateTranslationFile(lang) {
lang = lang || 'en';
// try {
// var columnsResult = HelperNamespace.getAllTags();
//check current file entry
const langFilePath = __dirname + '/' + lang + '.js';
var fs = fs || require('fs')
// var jsonCurrentTagData = {};
// columnsResult.forEach(function (column) {
// jsonCurrentTagData[column] = column;
// });
try {
var columnsResult = HelperNamespace.getAllTags();
// var ordered = {};
// var fileContent;
// try {
// //check the file can be opened
// var stats = fs.statSync(langFilePath);
var jsonCurrentTagData = {};
columnsResult.forEach(function (column) {
jsonCurrentTagData[column] = column;
});
// // load the file
// var fileContent = fs.readFileSync(langFilePath, 'utf8');
// console.log("Current file content: ");
// console.log(fileContent);
// }
// catch (e) { // do this
// console.log("we will create the file: " + langFilePath);
// //If there is no current file, we will create it
// };
var ordered = {};
var fileContent;
try {
//check the file can be opened
var stats = fs.statSync(langFilePath);
// try {
// if (fileContent != undefined) {
// var jsonContent = fileContent
// .replace("module.exports = ", "")
// //regex to delete all comments // and :* in the JSON file
// .replace(/(\/\*(\n|\r|.)*\*\/)|(\/\/.*(\n|\r))/g, "");
// load the file
var fileContent = fs.readFileSync(langFilePath, 'utf8');
console.log("Current file content: ");
console.log(fileContent);
}
catch (e) { // do this
console.log("we will create the file: " + langFilePath);
//If there is no current file, we will create it
};
// var jsonParsed = JSON.parse(jsonContent);
try {
if (fileContent != undefined) {
var jsonContent = fileContent
.replace("module.exports = ", "")
//regex to delete all comments // and :* in the JSON file
.replace(/(\/\*(\n|\r|.)*\*\/)|(\/\/.*(\n|\r))/g, "");
// Object.keys(jsonParsed).sort().forEach(function (key) {
// ordered[key] = jsonParsed[key];
// });
// }
// } catch (e) {
// console.log("file: " + langFilePath + " contains an error: " + e);
// //If there is an error with the current file content, abort
// return;
// }
var jsonParsed = JSON.parse(jsonContent);
// // merge new tags with existing translation
// var result = {};
// var unexistingTag = {};
// // all current tags in English
// for (var key in jsonCurrentTagData) result[key] = jsonCurrentTagData[key];
// for (var key in ordered) {
// // replace current tag with an existing translation
// if (result.hasOwnProperty(key)) {
// delete result[key];
// result[key] = ordered[key];
// }
// // if the tag doesn't exist but a translation exists,
// // put the key/value at the end of the json
// else {
// unexistingTag[key] = ordered[key];
// }
// }
// for (var key in unexistingTag) result[key] = unexistingTag[key];
Object.keys(jsonParsed).sort().forEach(function (key) {
ordered[key] = jsonParsed[key];
});
}
} catch (e) {
console.log("file: " + langFilePath + " contains an error: " + e);
//If there is an error with the current file content, abort
return;
}
// var stringJson = JSON.stringify(result, null, " ");
// var newFileContent = "module.exports = " + stringJson;
// merge new tags with existing translation
var result = {};
var unexistingTag = {};
// all current tags in English
for (var key in jsonCurrentTagData) result[key] = jsonCurrentTagData[key];
for (var key in ordered) {
// replace current tag with an existing translation
if (result.hasOwnProperty(key)) {
delete result[key];
result[key] = ordered[key];
}
// if the tag doesn't exist but a translation exists,
// put the key/value at the end of the json
else {
unexistingTag[key] = ordered[key];
}
}
for (var key in unexistingTag) result[key] = unexistingTag[key];
// fs.writeFileSync(langFilePath, newFileContent);
// } catch (e) {
// console.log("file: " + langFilePath + ". error append: " + e);
// }
// }
var stringJson = JSON.stringify(result, null, " ");
var newFileContent = "module.exports = " + stringJson;
// //public functions
// return {
// logAllTags: logAllTags,
// getAllTags: getAllTags,
// createOrUpdateTranslationFile: createOrUpdateTranslationFile
// };
// })();
fs.writeFileSync(langFilePath, newFileContent);
} catch (e) {
console.log("file: " + langFilePath + ". error append: " + e);
}
}
// // Need to run this cmd in this folder: node _helper.js
// var language = process.argv[2];
// HelperNamespace.createOrUpdateTranslationFile(language)
//public functions
return {
logAllTags: logAllTags,
getAllTags: getAllTags,
createOrUpdateTranslationFile: createOrUpdateTranslationFile
};
})();
// Need to run this cmd in this folder: node _helper.js
var language = process.argv[2];
HelperNamespace.createOrUpdateTranslationFile(language)