Telegram Web, preconfigured for usage in I2P.
http://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.5 KiB
165 lines
4.5 KiB
/* A little utility to translate Country names for Webogram. |
|
* You need to install nodejs. |
|
* Usage: node <thisfile> <languageCode> <inputFile> [outputFile] |
|
* If outputFile is not specified, inputFile will be overwritten. |
|
* |
|
* @author: Michele Locati <mlocati@gmail.com> |
|
* @licence: MIT |
|
*/ |
|
try { |
|
var fs = require('fs'), path = require('path'); |
|
|
|
var cldrFolder = path.join(__dirname, 'cldr'); |
|
if(!(isDir(cldrFolder) && isDir(path.join(cldrFolder, 'main')))) { |
|
process.stderr.write('Please download the CLDR json data from http://cldr.unicode.org and extract it to the following directory:\n' + cldrFolder + '\n'); |
|
process.exit(1); |
|
} |
|
|
|
var locale, inputFile, outputFile = ''; |
|
switch(process.argv.length) { |
|
case 5: |
|
outputFile = process.argv[4]; |
|
/*-fallthrough*/ |
|
case 4: |
|
inputFile = process.argv[3]; |
|
locale = process.argv[2]; |
|
break; |
|
default: |
|
process.stderr.write('Syntax:\n' + process.argv[0] + ' ' + path.basename(process.argv[1]) + ' <languageCode> <inputFile> [outputFile]' + '\n'); |
|
process.exit(1); |
|
} |
|
|
|
var foundLocale = ''; |
|
getLocaleAlternatives(locale).every(function(loc) { |
|
if(isDir(path.join(cldrFolder, 'main', loc))) { |
|
foundLocale = loc; |
|
return false; |
|
} |
|
return true; |
|
}); |
|
if(foundLocale.length === 0) { |
|
process.stderr.write('Unable to find data folder for the "' + locale + '" language.'); |
|
process.exit(1); |
|
} |
|
process.stdout.write('Found locale: ' + foundLocale + '\n'); |
|
var territoryData = readJsonFromFile(path.join(cldrFolder, 'main', foundLocale, 'territories.json')); |
|
var displayNames = territoryData.main[foundLocale].localeDisplayNames.territories; |
|
var theData = readJsonFromFile(inputFile); |
|
var inputKey, match, territoryID; |
|
for(inputKey in theData) { |
|
if (theData.hasOwnProperty(inputKey)) { |
|
match = /^country_select_modal_country_([a-z]+)$/.exec(inputKey); |
|
if(match) { |
|
territoryID = match[1].toUpperCase(); |
|
process.stdout.write('Found territory: ' + territoryID + ' (' + theData[inputKey] + ')... '); |
|
if(displayNames.hasOwnProperty(territoryID)) { |
|
process.stdout.write('translated as "' + displayNames[territoryID] + '"\n'); |
|
theData[inputKey] = displayNames[territoryID]; |
|
} |
|
else { |
|
process.stdout.write('NOT FOUND IN CLDR!\n'); |
|
} |
|
} |
|
} |
|
} |
|
if(outputFile.length === 0) { |
|
outputFile = inputFile; |
|
} |
|
writeJsonToFile(outputFile, theData); |
|
process.stdout.write('File written: "' + outputFile + '"!\n'); |
|
} |
|
catch(e) { |
|
process.stderr.write(e.message + '\n'); |
|
process.exit(1); |
|
} |
|
|
|
function isFile(path) { |
|
var r = false; |
|
if((typeof(path) === 'string') && (path.length > 0)) { |
|
try { |
|
if(fs.existsSync(path)) { |
|
if(fs.lstatSync(path).isFile()) { |
|
r = true; |
|
} |
|
} |
|
} |
|
catch(x) { |
|
} |
|
} |
|
return r; |
|
} |
|
|
|
function isDir(path) { |
|
var r = false; |
|
if((typeof(path) === 'string') && (path.length > 0)) { |
|
try { |
|
if(fs.existsSync(path)) { |
|
if(fs.lstatSync(path).isDirectory()) { |
|
r = true; |
|
} |
|
} |
|
} |
|
catch(x) { |
|
} |
|
} |
|
return r; |
|
} |
|
|
|
function getLocaleAlternatives(locale) { |
|
var language = '', script = '', territory = ''; |
|
locale.replace(/_/g, '-').split('-').forEach(function(chunk, index) { |
|
if(index === 0) { |
|
language = chunk.toLowerCase(); |
|
} |
|
else if(chunk.length === 4) { |
|
if(script.length > 0) { |
|
throw new Error('"' + locale + '" is not a valid locale identifier'); |
|
} |
|
script = chunk.charAt(0).toUpperCase() + chunk.substr(1).toLowerCase(); |
|
} |
|
else if(territory.length) { |
|
throw new Error('"' + locale + '" is not a valid locale identifier'); |
|
} |
|
else { |
|
if(/^[a-z]{2}$/i.test(chunk) || /^[0-9]{3}$/i.test(chunk)) { |
|
territory = chunk.toUpperCase(); |
|
} |
|
else { |
|
console.log(chunk); |
|
throw new Error('"' + locale + '" is not a valid locale identifier'); |
|
} |
|
} |
|
}); |
|
if(language.length === 0) { |
|
throw new Error('"' + locale + '" is not a valid locale identifier'); |
|
} |
|
var result = []; |
|
if((script.length > 0) && (territory.length > 0)) { |
|
result.push([language, script, territory].join('-')); |
|
} |
|
if(script.length > 0) { |
|
result.push([language, script].join('-')); |
|
} |
|
if(territory.length > 0) { |
|
result.push([language, territory].join('-')); |
|
} |
|
result.push(language); |
|
return result; |
|
} |
|
|
|
function readJsonFromFile(path) { |
|
if(!isFile(path)) { |
|
throw new Error('File not found: ' + path); |
|
} |
|
var fileContents = fs.readFileSync(path), data; |
|
try { |
|
data = JSON.parse(fileContents); |
|
} |
|
catch(e) { |
|
throw new Error('Error reading JSON file ' + path + ':\n' + e.message); |
|
} |
|
return data; |
|
} |
|
function writeJsonToFile(path, data) { |
|
fs.writeFileSync(path, JSON.stringify(data, null, 4)); |
|
}
|
|
|