Last active
June 16, 2016 09:57
-
-
Save mlocati/cf697b51fbba3bbc2d03 to your computer and use it in GitHub Desktop.
Translate Country names for Webogram
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Reference: zhukov/webogram#487