зеркало из https://github.com/mozilla/brackets.git
200 строки
6.5 KiB
JavaScript
200 строки
6.5 KiB
JavaScript
/*
|
|
* Copyright (c) 2012 Adobe Systems Incorporated. All rights reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Adapted from https://github.com/mozilla/donate.mozilla.org/blob/master/scripts/properties2json.js
|
|
*/
|
|
|
|
/*jslint vars: true, plusplus: true, devel: true, nomen: true, indent: 4, maxerr: 50 */
|
|
/* global process */
|
|
|
|
var Promise = require("bluebird");
|
|
var requireJS = require("requirejs");
|
|
var path = require("path");
|
|
var Nunjucks = require("nunjucks");
|
|
var properties = Promise.promisifyAll(require("properties-parser"));
|
|
var fs = Promise.promisifyAll(require("fs"));
|
|
var mkdirp = Promise.promisify(require("mkdirp"));
|
|
|
|
// Unchanging values
|
|
var EN_US_DIR = "root";
|
|
var L10N_DIR = "nls";
|
|
var L10N_PROP_FILE = "editor.properties";
|
|
var L10N_STR_FILE = "strings.js";
|
|
var L10N_TEMPLATE_FILE = "strings.template";
|
|
var LOCALE_LIST_TEMPLATE_FILE = "locale-list.template";
|
|
var CONCURRENCY = { concurrency: 3 };
|
|
|
|
var root = process.cwd();
|
|
var src = path.join(root, "locales");
|
|
var dest = path.join(root, process.argv.length > 2 ? process.argv[2] : "src", L10N_DIR);
|
|
var templates = new Nunjucks.Environment(new Nunjucks.FileSystemLoader(path.join(root, "templates")), { autoescape: false });
|
|
var destLocalizedStrings = {};
|
|
var locales;
|
|
var destLocales;
|
|
|
|
templates.addFilter('escapeQuotes', function(str){
|
|
return str.replace(/"/g, """);
|
|
});
|
|
|
|
function getDestLocaleDir(locale) {
|
|
"use strict";
|
|
|
|
return locale === "en-US" ? EN_US_DIR : locale.toLowerCase();
|
|
}
|
|
|
|
function updateLocaleList() {
|
|
"use strict";
|
|
|
|
var localeList = templates.render(LOCALE_LIST_TEMPLATE_FILE, { locales: destLocales });
|
|
var localeListFile = path.join(dest, L10N_STR_FILE);
|
|
|
|
return fs.writeFileAsync(localeListFile, localeList)
|
|
.then(function() {
|
|
console.log("Updated locale list in `", localeListFile, "`");
|
|
return Promise.resolve();
|
|
})
|
|
.catch(function(err) {
|
|
console.error("Failed to update locale list in `", localeListFile, "`");
|
|
return Promise.reject(err);
|
|
});
|
|
}
|
|
|
|
function localizeBrackets(locale) {
|
|
"use strict";
|
|
|
|
var localeDir = getDestLocaleDir(locale);
|
|
var strings = destLocalizedStrings[locale];
|
|
var isNewLocale = !(Object.keys(strings).length);
|
|
|
|
function combineAndWriteStrings(newStrings) {
|
|
if(newStrings) {
|
|
Object.assign(strings, newStrings);
|
|
}
|
|
|
|
if(!(Object.keys(strings).length)) {
|
|
// Our string file is empty and Brackets does not have any strings
|
|
console.log("No strings to write for `", localeDir, "`");
|
|
return Promise.resolve();
|
|
}
|
|
|
|
if(isNewLocale && (destLocales.indexOf(localeDir) === -1)) {
|
|
destLocales.push(localeDir);
|
|
}
|
|
|
|
var localizedFileContents = templates.render(L10N_TEMPLATE_FILE, { localizedStrings: strings });
|
|
var destLocaleDir = path.join(dest, localeDir);
|
|
|
|
return mkdirp(destLocaleDir)
|
|
.then(function() {
|
|
return fs.writeFileAsync(path.join(destLocaleDir, L10N_STR_FILE), localizedFileContents);
|
|
})
|
|
.then(function() {
|
|
console.log("Updated l10n file for `", localeDir, "`");
|
|
return Promise.resolve();
|
|
})
|
|
.catch(function(err) {
|
|
console.error("Failed to update l10n file for `", localeDir, "`");
|
|
return Promise.reject(err);
|
|
});
|
|
}
|
|
|
|
return properties.readAsync(path.join(src, locale, L10N_PROP_FILE))
|
|
.then(combineAndWriteStrings)
|
|
.catch(function(err) {
|
|
if(err.code !== "ENOENT") {
|
|
console.error("Failed to update l10n file for `", localeDir, "`");
|
|
return Promise.reject(err);
|
|
}
|
|
|
|
if(!isNewLocale) {
|
|
// We need to write the strings that brackets provides
|
|
return combineAndWriteStrings();
|
|
}
|
|
|
|
// Our string file nor their's have any strings
|
|
console.log("No strings to write for `", localeDir, "`");
|
|
return Promise.resolve();
|
|
});
|
|
}
|
|
|
|
function getLocalizedFile(file, locale) {
|
|
"use strict";
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
try {
|
|
requireJS([ file ], function(destLocaleStrings) {
|
|
destLocalizedStrings[locale] = destLocaleStrings;
|
|
resolve();
|
|
});
|
|
} catch(err) {
|
|
reject(err);
|
|
}
|
|
});
|
|
}
|
|
|
|
function getExistingLocalizedContent(locale) {
|
|
"use strict";
|
|
|
|
var destLocaleFile = path.join(dest, getDestLocaleDir(locale), L10N_STR_FILE);
|
|
|
|
return fs.statAsync(destLocaleFile)
|
|
.then(getLocalizedFile.bind(null, destLocaleFile, locale))
|
|
.catch(function(err) {
|
|
if(err.code !== "ENOENT") {
|
|
return Promise.reject(err);
|
|
}
|
|
|
|
destLocalizedStrings[locale] = {};
|
|
return Promise.resolve();
|
|
});
|
|
}
|
|
|
|
function run() {
|
|
"use strict";
|
|
|
|
return fs.readdirAsync(src)
|
|
.then(function(folders) {
|
|
var DSStoreIndex = folders.indexOf(".DS_Store");
|
|
if(DSStoreIndex > -1) {
|
|
folders.splice(DSStoreIndex, 1);
|
|
}
|
|
locales = folders;
|
|
return Promise.map(locales, getExistingLocalizedContent, CONCURRENCY);
|
|
})
|
|
.then(function() {
|
|
return Promise.map(locales, localizeBrackets, CONCURRENCY);
|
|
})
|
|
.then(updateLocaleList)
|
|
.catch(console.error.bind(console, "Failed to convert properties l10n to js l10n with: "));
|
|
}
|
|
|
|
requireJS([ path.join(dest, L10N_STR_FILE) ], function(destLocaleList) {
|
|
"use strict";
|
|
|
|
destLocales = Object.keys(destLocaleList);
|
|
destLocales.splice(destLocales.indexOf(EN_US_DIR), 1);
|
|
|
|
run();
|
|
});
|