UNPKG

sails-stringfile

Version:

translated/localized stringfiles containing messages from Sails core and dependencies

95 lines (80 loc) 2.3 kB
/** * Module dependencies */ var util = require('util') , path = require('path'); /** * Look up a string by name, using environment variable * to detect the appropriate locale. * If a stringfile doesn't exist, default to `en`. * * @api experimental * * @address {String} keypath [e.g. 'cli.new.successful'] * @address {Object} args [ordered scope args for `util.format()`] * @return {String} */ module.exports = function getString (keypath, args) { var locale = process.env.LANGUAGE || process.env.LC_ALL || process.env.LC_MESSAGES || process.env.LANG || 'en'; locale = locale.toLowerCase(); // Just to be safe, check that there are no '/' // (in case an attacker attempts to use environment // variables to load malicious code) if (locale.match(/[\/]+/)) return util.format('INVALID LOCALE: %s',locale); // TODO: do something smarter here to determine the proper stringfile if (locale.match('en')) { locale = 'en'; } var stringfile, pathToLocale; try { pathToLocale = path.resolve(__dirname, './locales/',locale); stringfile = require( pathToLocale ); } catch(e) { // In the event of an unresolvable locale, // fail silently and default to english pathToLocale = path.resolve(__dirname, './locales/en'); stringfile = require( pathToLocale ); // return util.format( // 'ERROR LOADING LOCALE: '+ // 'Unable to find stringfile for locale `%s`', // locale); } var strtemplate = _deepValue(stringfile, keypath); if (!strtemplate) return util.format('STRING `%s` NOT DEFINED IN `%s` LOCALE!',keypath, locale); return util.format.apply( null, [strtemplate].concat(args || [])); }; /** * @api private * * Lookup a value in an object given a keypath. * * @param {Object} object [description] * @param {String} path [description] * @return {[type]} [description] */ function _deepValue (object, path) { if ('undefined' == typeof object || object === null) { return null; } var val = object; path = path.split('.'); while (path.length) { var part = path.shift(); if ('undefined' == typeof val[part]) { return null; } else { val = val[part]; } } // Try [0] if an object remains if (typeof val === 'object') { if (typeof val[0] === 'string') val = val[0]; } return val; }