2014-03-23 00:40:59 +09:00
|
|
|
/* Copyright 2012 Mozilla Foundation
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var fs = require('fs');
|
2016-06-22 16:36:59 +09:00
|
|
|
var https = require('https');
|
2014-03-23 00:40:59 +09:00
|
|
|
var path = require('path');
|
|
|
|
|
2019-10-07 00:14:45 +09:00
|
|
|
// Fetches all languages that have an *active* translation in mozilla-central.
|
2017-05-20 06:39:22 +09:00
|
|
|
// This is used in gulpfile.js for the `importl10n` command.
|
2019-10-07 00:14:45 +09:00
|
|
|
|
|
|
|
var EXCLUDE_LANG_CODES = ['ca-valencia', 'ja-JP-mac'];
|
2014-03-23 00:40:59 +09:00
|
|
|
|
2014-05-28 22:25:27 +09:00
|
|
|
function normalizeText(s) {
|
|
|
|
return s.replace(/\r\n?/g, '\n').replace(/\uFEFF/g, '');
|
|
|
|
}
|
|
|
|
|
2019-10-07 00:14:45 +09:00
|
|
|
function downloadLanguageCodes() {
|
|
|
|
console.log('Downloading language codes...\n');
|
|
|
|
|
|
|
|
var ALL_LOCALES = 'https://hg.mozilla.org/mozilla-central/raw-file/tip/browser/locales/all-locales';
|
|
|
|
|
|
|
|
return new Promise(function(resolve) {
|
|
|
|
https.get(ALL_LOCALES, function(response) {
|
|
|
|
if (response.statusCode === 200) {
|
|
|
|
var content = '';
|
|
|
|
response.setEncoding('utf8');
|
|
|
|
response.on('data', function(chunk) {
|
|
|
|
content += chunk;
|
|
|
|
});
|
|
|
|
response.on('end', function() {
|
|
|
|
content = content.trim(); // Remove any leading/trailing white-space.
|
|
|
|
var langCodes = normalizeText(content).split('\n');
|
|
|
|
resolve(langCodes);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
resolve([]);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function downloadLanguageFiles(root, langCode) {
|
2014-03-23 00:40:59 +09:00
|
|
|
console.log('Downloading ' + langCode + '...');
|
|
|
|
|
|
|
|
// Constants for constructing the URLs. Translations are taken from the
|
2017-05-18 19:35:05 +09:00
|
|
|
// Nightly channel as those are the most recent ones.
|
|
|
|
var MOZ_CENTRAL_ROOT = 'https://hg.mozilla.org/l10n-central/';
|
2018-03-18 00:18:21 +09:00
|
|
|
var MOZ_CENTRAL_PDFJS_DIR = '/raw-file/default/browser/pdfviewer/';
|
2014-03-23 00:40:59 +09:00
|
|
|
|
|
|
|
// Defines which files to download for each language.
|
2019-10-17 19:06:07 +09:00
|
|
|
var files = ['viewer.properties'];
|
2014-03-23 00:40:59 +09:00
|
|
|
var downloadsLeft = files.length;
|
|
|
|
|
2016-03-21 02:37:02 +09:00
|
|
|
var outputDir = path.join(root, langCode);
|
|
|
|
if (!fs.existsSync(outputDir)) {
|
|
|
|
fs.mkdirSync(outputDir);
|
2014-03-23 00:40:59 +09:00
|
|
|
}
|
|
|
|
|
2019-10-07 00:14:45 +09:00
|
|
|
return new Promise(function(resolve) {
|
|
|
|
// Download the necessary files for this language.
|
|
|
|
files.forEach(function(fileName) {
|
|
|
|
var outputPath = path.join(outputDir, fileName);
|
|
|
|
var url = MOZ_CENTRAL_ROOT + langCode + MOZ_CENTRAL_PDFJS_DIR + fileName;
|
2017-01-19 22:00:36 +09:00
|
|
|
|
2019-10-07 00:14:45 +09:00
|
|
|
https.get(url, function(response) {
|
|
|
|
// Not all files exist for each language. Files without translations
|
|
|
|
// have been removed (https://bugzilla.mozilla.org/show_bug.cgi?id=1443175).
|
|
|
|
if (response.statusCode === 200) {
|
|
|
|
var content = '';
|
|
|
|
response.setEncoding('utf8');
|
|
|
|
response.on('data', function(chunk) {
|
|
|
|
content += chunk;
|
|
|
|
});
|
|
|
|
response.on('end', function() {
|
|
|
|
fs.writeFileSync(outputPath, normalizeText(content), 'utf8');
|
|
|
|
if (--downloadsLeft === 0) {
|
|
|
|
resolve();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
if (--downloadsLeft === 0) {
|
|
|
|
resolve();
|
2018-03-18 00:18:21 +09:00
|
|
|
}
|
2014-03-23 00:40:59 +09:00
|
|
|
}
|
2019-10-07 00:14:45 +09:00
|
|
|
});
|
2014-03-23 00:40:59 +09:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-10-07 00:14:45 +09:00
|
|
|
async function downloadL10n(root, callback) {
|
|
|
|
var langCodes = await downloadLanguageCodes();
|
|
|
|
|
|
|
|
for (var langCode of langCodes) {
|
|
|
|
if (!langCode || EXCLUDE_LANG_CODES.includes(langCode)) {
|
|
|
|
continue;
|
2014-03-23 00:40:59 +09:00
|
|
|
}
|
2019-10-07 00:14:45 +09:00
|
|
|
await downloadLanguageFiles(root, langCode);
|
|
|
|
}
|
2019-10-07 00:55:48 +09:00
|
|
|
|
|
|
|
var removeCodes = [];
|
|
|
|
for (var entry of fs.readdirSync(root)) {
|
|
|
|
var dirPath = path.join(root, entry), stat = fs.lstatSync(dirPath);
|
|
|
|
|
|
|
|
if (stat.isDirectory() && entry !== 'en-US' &&
|
|
|
|
(!langCodes.includes(entry) || EXCLUDE_LANG_CODES.includes(entry))) {
|
|
|
|
removeCodes.push(entry);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (removeCodes.length) {
|
|
|
|
console.log('\nConsider removing the following unmaintained locales:\n' +
|
|
|
|
removeCodes.join(', ') + '\n');
|
|
|
|
}
|
|
|
|
|
2019-10-07 00:14:45 +09:00
|
|
|
if (callback) {
|
|
|
|
callback();
|
|
|
|
}
|
2014-03-23 00:40:59 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
exports.downloadL10n = downloadL10n;
|