diff options
Diffstat (limited to 'i18n/src/closureSlurper.js')
| -rw-r--r-- | i18n/src/closureSlurper.js | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/i18n/src/closureSlurper.js b/i18n/src/closureSlurper.js new file mode 100644 index 00000000..32ef022c --- /dev/null +++ b/i18n/src/closureSlurper.js @@ -0,0 +1,106 @@ +#!/usr/bin/env node +'use strict'; + +require.paths.push(__dirname); +var Q  = require('qq'), +    qfs  = require('q-fs'), +    converter = require('converter.js'), +    util = require('util.js'), +    localeInfo = {}, +    localeIds = [], +    currencySymbols, +    goog = { provide: function() {}, +             require: function() {}, +             i18n: {currency: {}} }; + +createFolder('../locale/').then(function() { +  var promiseA = Q.defer(), +      promiseB = Q.defer(); + +  qfs.read(__dirname + '/../closure/currencySymbols.js', 'b').then(function(content) { +    eval(content.toString()); +    currencySymbols = goog.i18n.currency.CurrencyInfo; +    currencySymbols.__proto__ = goog.i18n.currency.CurrencyInfoTier2; + +    qfs.read(__dirname + '/../closure/numberSymbols.js', 'b').then(function(content) { +      //eval script in the current context so that we get access to all the symbols +      eval(content.toString()); +      for (propName in goog.i18n) { +        var localeID = util.findLocaleId(propName, 'num'); +        if (localeID) { +          if (!localeInfo[localeID]) { +            localeInfo[localeID] = {}; +            localeIds.push(localeID); +          } +          var convertedData = converter.convertNumberData(goog.i18n[propName], currencySymbols); +          localeInfo[localeID].NUMBER_FORMATS = convertedData; +        } +      } + +      promiseA.resolve(); +    }); +  }); + + +  qfs.read(__dirname + '/../closure/datetimeSymbols.js', 'b').then(function(content) { +    eval(content.toString()); +    for (propName in goog.i18n) { +      var localeID = util.findLocaleId(propName, 'datetime'); +      if (localeID) { +        if (!localeInfo[localeID]) { +          localeInfo[localeID] = {}; +          localeIds.push(localeID); +        } +        var convertedData = converter.convertDatetimeData(goog.i18n[propName]); +        localeInfo[localeID].DATETIME_FORMATS = convertedData; +      } +    } + +    promiseB.resolve(); +  }); +   +  return Q.join(promiseA.promise, promiseB.promise, noop); +}).then(function() { +  localeIds.forEach(function(localeID) { +    var fallBackID = localeID.match(/[A-Za-z]+/)[0], +        localeObj = localeInfo[localeID], +        fallBackObj = localeInfo[fallBackID]; + +    // fallBack to language formats when country format is missing +    // e.g. if NUMBER_FORMATS of en_xyz is not present, use the NUMBER_FORMATS of en instead +    if (!localeObj.NUMBER_FORMATS) { +      localeObj.NUMBER_FORMATS = fallBackObj.NUMBER_FORMATS; +    } + +    if (!localeObj.DATETIME_FORMATS) { +       localeObj.DATETIME_FORMATS = fallBackObj.DATETIME_FORMATS; +    } + +    // e.g. from zh_CN to zh-CN, from en_US to en-US +    var correctedLocaleId = localeID.replace(/_/g, '-').toLowerCase(); +    localeObj.id = correctedLocaleId; + +    var prefix = 'angular.service("$locale", function() {\nreturn ', +        content = JSON.stringify(localeInfo[localeID]).replace(/\ยค/g,'\\u00A4'), +        suffix; + +    suffix = ';\n});'; + +    var toWrite = prefix + content + suffix; + +    qfs.write(__dirname + '/../locale/' + 'angular-locale_' + correctedLocaleId + '.js', toWrite); +  }); +  console.log('Generated ' + localeIds.length + ' locale files!'); +}).end(); + +function noop() {}; + +/** +* Make a folder under current directory. +* @param folder {string} name of the folder to be made +*/ +function createFolder(folder) { +  return qfs.isDirectory(__dirname + '/' + folder).then(function(isDir) { +    if (!isDir) return qfs.makeDirectory(__dirname + '/' + folder); +  }); +} | 
