diff --git a/bin/build-locales b/bin/build-locales index 059c1fc06..a81d86cef 100755 --- a/bin/build-locales +++ b/bin/build-locales @@ -36,13 +36,13 @@ ''' */ var fs = require('fs'); -var glob = require('glob'); var merge = require('lodash.merge'); var path = require('path'); var languages = require('../languages.json'); var localeCompare = require('./lib/locale-compare'); var localizedUrls = require('./lib/localized-urls'); +var routes = require('../src/routes.json'); // ----------------------------------------------------------------------------- // Main script @@ -64,56 +64,72 @@ try { fs.mkdirSync(outputDir); } -// message key with english string values (i.e. default values) -var viewLocales = {}; -// FormattedMessage id with english string as value. Use for default values in translations -// Sample structure: { 'general-general.blah': 'blah', 'about-about.blah': 'blahblah' } -var idsWithICU = {}; -// reverse (i.e. english string with message key as the value) object for searching po files. -// Sample structure: { 'blah': 'general-general.blah', 'blahblah': 'about-about.blah' } -var icuWithIds = {}; - // get global locale strings first. var globalTemplateFile = path.resolve(__dirname, '../src/l10n.json'); -localeCompare.getIdsForView('general', globalTemplateFile, viewLocales, idsWithICU, icuWithIds); +var ids = JSON.parse(fs.readFileSync(globalTemplateFile, 'utf8')); +// message key with english string values (i.e. default values) +var viewLocales = { + general: { + en: ids + } +}; +var idsWithICU = localeCompare.idToICUMap('general', ids); +var icuWithIds = localeCompare.icuToIdMap('general', ids); +// localeCompare.getIdsForView('general', globalTemplateFile, viewLocales, idsWithICU, icuWithIds); + +var views = []; +var localizedAssetUrls = {}; // start with all views, and remove localized ones as they are iterated over -var views = glob.sync(path.resolve(__dirname, '../src/views/*')); -for (var i = 0; i < views.length; i++) { - views[i] = views[i].split('/').pop(); -} - -// get view-specific locale strings. -var files = glob.sync(path.resolve(__dirname, '../src/views/**/l10n.json')); -files.forEach(function (file) { - var dirPath = file.split('/'); - dirPath.pop(); - var view = dirPath.pop(); - localeCompare.getIdsForView(view, file, viewLocales, idsWithICU, icuWithIds); -}); - -// get asset url translations -var localizedAssetUrls = {}; -files = glob.sync(path.resolve(__dirname, '../src/views/**/l10n-static.json')); -files.forEach(function (file) { - var dirPath = file.split('/'); - dirPath.pop(); - var view = dirPath.pop(); - localizedAssetUrls[view] = {}; - - var assetUrls = JSON.parse(fs.readFileSync(file, 'utf8')); - for (var lang in localizedUrls) { - localizedAssetUrls[view][lang] = {}; - for (var key in assetUrls) { - if (localizedUrls[lang].hasOwnProperty(key)) { - localizedAssetUrls[view][lang][key] = localizedUrls[lang][key]; - } else { - localizedAssetUrls[view][lang][key] = assetUrls[key]; - } +for (var v in routes) { + if (typeof routes[v].redirect !== 'undefined') { + continue; + } + + views.push(routes[v].name); + try { + var subdir = routes[v].view.split('/'); + subdir.pop(); + var l10n = path.resolve(__dirname, '../src/views/' + subdir.join('/') + '/l10n.json'); + fs.accessSync(l10n, fs.F_OK); + ids = JSON.parse(fs.readFileSync(l10n, 'utf8')); + viewLocales[routes[v].name] = { + en: ids + }; + idsWithICU = merge(idsWithICU, localeCompare.idToICUMap(routes[v].name, ids)); + icuWithIds = merge(icuWithIds, localeCompare.icuToIdMap(routes[v].name, ids)); + } catch (err) { + // check that routes' view path is not malformed, error if it is + try { + fs.accessSync(path.resolve(__dirname, '../src/views/' + routes[v].view + '.jsx')); + } catch (err) { + // the config for the view is not set up correctly, so throw the error. + throw err; } } -}); + + // get asset url translations + try { + var l10nStatic = path.resolve(__dirname, '../src/views/' + routes[v].view + '/l10n-static.json'); + fs.accessSync(l10nStatic, fs.F_OK); + localizedAssetUrls[routes[v].name] = {}; + + var assetUrls = JSON.parse(fs.readFileSync(l10nStatic, 'utf8')); + for (var lang in localizedUrls) { + localizedAssetUrls[routes[v].name][lang] = {}; + for (var key in assetUrls) { + if (localizedUrls[lang].hasOwnProperty(key)) { + localizedAssetUrls[routes[v].name][lang][key] = localizedUrls[lang][key]; + } else { + localizedAssetUrls[routes[v].name][lang][key] = assetUrls[key]; + } + } + } + } catch (err) { + // :) + } +} // md5 of english strings with message key as the value for searching po files. // Sample structure: { 'sdfas43534sdfasdf': 'general-general.blah', 'lkjfasdf4t342asdfa': 'about-about.blah' } @@ -121,9 +137,9 @@ var md5WithIds = localeCompare.getMD5Map(icuWithIds); // Get ui localization strings first var isoCodes = Object.keys(languages); -for (i in isoCodes) { +for (var i in isoCodes) { var translations = localeCompare.getTranslationsForLanguage(isoCodes[i], idsWithICU, md5WithIds); - for (var key in translations) { + for (key in translations) { viewLocales[key] = merge(viewLocales[key], translations[key]); } } diff --git a/bin/lib/locale-compare.js b/bin/lib/locale-compare.js index b20a08d6e..0a064b8aa 100644 --- a/bin/lib/locale-compare.js +++ b/bin/lib/locale-compare.js @@ -125,15 +125,24 @@ Helpers.writeTranslationsToJS = function (outputDir, viewName, translationObject fs.writeFileSync(outputDir + '/' + viewName + '.intl.js', fileString); }; -Helpers.getIdsForView = function (viewName, viewFile, localeObject, idsWithICU, icuWithIds) { - var ids = JSON.parse(fs.readFileSync(viewFile, 'utf8')); - localeObject[viewName] = { - en: ids - }; +// Returns a FormattedMessage id with english string as value. Use for default values in translations +// Sample structure: { 'general-general.blah': 'blah', 'about-about.blah': 'blahblah' } +Helpers.idToICUMap = function (viewName, ids) { + var idsToICU = {}; for (var id in ids) { - idsWithICU[viewName + '-' + id] = ids[id]; - icuWithIds[ids[id]] = viewName + '-' + id; // add viewName to identifier for later + idsToICU[viewName + '-' + id] = ids[id]; } + return idsToICU; +}; + +// Reuturns reverse (i.e. english string with message key as the value) object for searching po files. +// Sample structure: { 'blah': 'general-general.blah', 'blahblah': 'about-about.blah' } +Helpers.icuToIdMap = function (viewName, ids) { + var icuToIds = {}; + for (var id in ids) { + icuToIds[ids[id]] = viewName + '-' + id; + } + return icuToIds; }; module.exports = Helpers; diff --git a/test/localization/spot_check_about_has_strings.js b/test/localization/spot_check_about_has_strings.js index b13535a70..40e66a474 100644 --- a/test/localization/spot_check_about_has_strings.js +++ b/test/localization/spot_check_about_has_strings.js @@ -12,16 +12,13 @@ var localeCompare = require('../../bin/lib/locale-compare'); tap.test('spotCheckAboutStrings', function (t) { var isoCodes = Object.keys(languages); isoCodes.splice(isoCodes.indexOf('en'), 1); - var viewLocales = {}; - var idsWithICU = {}; - var icuWithIds = {}; - localeCompare.getIdsForView( - 'about', - path.resolve(__dirname, '../../src/views/about/l10n.json'), - viewLocales, - idsWithICU, - icuWithIds - ); + + var ids = path.resolve(__dirname, '../../views/about/l10n.json'); + var viewLocales = { + about: {en: ids} + }; + var idsWithICU = localeCompare.idToICUMap('about', ids); + var icuWithIds = localeCompare.icuToIdMap('about', ids); var md5WithIds = localeCompare.getMD5Map(icuWithIds); var keysToCheck = Object.keys(merge(viewLocales['about']['en'])).sort(); for (var i in isoCodes) { diff --git a/test/localization/spot_check_cards_has_strings.js b/test/localization/spot_check_cards_has_strings.js index 2925af3df..1106bd8e9 100644 --- a/test/localization/spot_check_cards_has_strings.js +++ b/test/localization/spot_check_cards_has_strings.js @@ -9,19 +9,16 @@ var tap = require('tap'); var languages = require('../../languages.json'); var localeCompare = require('../../bin/lib/locale-compare'); -tap.test('spotCheckAboutStrings', function (t) { +tap.test('spotCheckCardStrings', function (t) { var isoCodes = Object.keys(languages); isoCodes.splice(isoCodes.indexOf('en'), 1); - var viewLocales = {}; - var idsWithICU = {}; - var icuWithIds = {}; - localeCompare.getIdsForView( - 'cards', - path.resolve(__dirname, '../../src/views/cards/l10n.json'), - viewLocales, - idsWithICU, - icuWithIds - ); + + var ids = path.resolve(__dirname, '../../views/cards/l10n.json'); + var viewLocales = { + cards: {en: ids} + }; + var idsWithICU = localeCompare.idToICUMap('cards', ids); + var icuWithIds = localeCompare.icuToIdMap('cards', ids); var md5WithIds = localeCompare.getMD5Map(icuWithIds); var keysToCheck = Object.keys(merge(viewLocales['cards']['en'])).sort(); for (var i in isoCodes) { diff --git a/test/localization/spot_check_general_has_strings.js b/test/localization/spot_check_general_has_strings.js index 53ea0e9e2..fdcc87f37 100644 --- a/test/localization/spot_check_general_has_strings.js +++ b/test/localization/spot_check_general_has_strings.js @@ -9,19 +9,16 @@ var tap = require('tap'); var languages = require('../../languages.json'); var localeCompare = require('../../bin/lib/locale-compare'); -tap.test('spotCheckAboutStrings', function (t) { +tap.test('spotCheckGeneralStrings', function (t) { var isoCodes = Object.keys(languages); isoCodes.splice(isoCodes.indexOf('en'), 1); - var viewLocales = {}; - var idsWithICU = {}; - var icuWithIds = {}; - localeCompare.getIdsForView( - 'general', - path.resolve(__dirname, '../../src/l10n.json'), - viewLocales, - idsWithICU, - icuWithIds - ); + + var ids = path.resolve(__dirname, '../../src/l10n.json'); + var viewLocales = { + general: {en: ids} + }; + var idsWithICU = localeCompare.idToICUMap('general', ids); + var icuWithIds = localeCompare.icuToIdMap('general', ids); var md5WithIds = localeCompare.getMD5Map(icuWithIds); var keysToCheck = Object.keys(merge(viewLocales['general']['en'])).sort(); for (var i in isoCodes) { diff --git a/test/localization/spot_check_nav.js b/test/localization/spot_check_nav.js index b3caeaed3..e997780c0 100644 --- a/test/localization/spot_check_nav.js +++ b/test/localization/spot_check_nav.js @@ -16,10 +16,6 @@ var path = require('path'); var tap = require('tap'); var localeCompare = require('../../bin/lib/locale-compare'); -var viewLocales = {}; -var idsWithICU = {}; -var icuWithIds = {}; - var languagesToCheck = [ 'he', 'zh-cn', 'ja', 'pt-br', 'pl', 'nb' ]; @@ -29,14 +25,12 @@ var idsToCheck = [ ]; -// Test nav for real languages. -localeCompare.getIdsForView( - 'general', - path.resolve(__dirname, '../../src/l10n.json'), - viewLocales, - idsWithICU, - icuWithIds -); +var ids = path.resolve(__dirname, '../../src/l10n.json'); +var viewLocales = { + general: {en: ids} +}; +var idsWithICU = localeCompare.idToICUMap('general', ids); +var icuWithIds = localeCompare.icuToIdMap('general', ids); var md5WithIds = localeCompare.getMD5Map(icuWithIds); tap.test('spotCheckNavBar', function (t) { diff --git a/test/localization/spot_check_splash_has_strings.js b/test/localization/spot_check_splash_has_strings.js index 75bd4d590..7a840018b 100644 --- a/test/localization/spot_check_splash_has_strings.js +++ b/test/localization/spot_check_splash_has_strings.js @@ -9,19 +9,16 @@ var tap = require('tap'); var languages = require('../../languages.json'); var localeCompare = require('../../bin/lib/locale-compare'); -tap.test('spotCheckAboutStrings', function (t) { +tap.test('spotCheckSplashStrings', function (t) { var isoCodes = Object.keys(languages); isoCodes.splice(isoCodes.indexOf('en'), 1); - var viewLocales = {}; - var idsWithICU = {}; - var icuWithIds = {}; - localeCompare.getIdsForView( - 'splash', - path.resolve(__dirname, '../../src/views/splash/l10n.json'), - viewLocales, - idsWithICU, - icuWithIds - ); + + var ids = path.resolve(__dirname, '../../views/splash/l10n.json'); + var viewLocales = { + splash: {en: ids} + }; + var idsWithICU = localeCompare.idToICUMap('splash', ids); + var icuWithIds = localeCompare.icuToIdMap('splash', ids); var md5WithIds = localeCompare.getMD5Map(icuWithIds); var keysToCheck = Object.keys(merge(viewLocales['splash']['en'])).sort(); for (var i in isoCodes) { diff --git a/test/localization/spot_check_wedo2_has_strings.js b/test/localization/spot_check_wedo2_has_strings.js index 315ee4734..6f01c73af 100644 --- a/test/localization/spot_check_wedo2_has_strings.js +++ b/test/localization/spot_check_wedo2_has_strings.js @@ -9,19 +9,16 @@ var tap = require('tap'); var languages = require('../../languages.json'); var localeCompare = require('../../bin/lib/locale-compare'); -tap.test('spotCheckAboutStrings', function (t) { +tap.test('spotCheckWedo2Strings', function (t) { var isoCodes = Object.keys(languages); isoCodes.splice(isoCodes.indexOf('en'), 1); - var viewLocales = {}; - var idsWithICU = {}; - var icuWithIds = {}; - localeCompare.getIdsForView( - 'wedo2', - path.resolve(__dirname, '../../src/views/wedo2/l10n.json'), - viewLocales, - idsWithICU, - icuWithIds - ); + + var ids = path.resolve(__dirname, '../../views/wedo2/l10n.json'); + var viewLocales = { + wedo2: {en: ids} + }; + var idsWithICU = localeCompare.idToICUMap('wedo2', ids); + var icuWithIds = localeCompare.icuToIdMap('wedo2', ids); var md5WithIds = localeCompare.getMD5Map(icuWithIds); var keysToCheck = Object.keys(merge(viewLocales['wedo2']['en'])).sort(); for (var i in isoCodes) {