From 96a314766c41bbb18bcddeddd25c8e566ab76acd Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Mon, 2 Jun 2014 14:17:51 -0400 Subject: [PATCH] fix(ngLocale): fix i18n code-generation to support get_vf_, decimals_, and get_wt_ The updated Closure I18N code relies on these methods to enhance the localization quality. This fix prevents ngLocale files from referencing undefined values. In the short term, this means adding references to versions of these methods in locales where they are necessary. --- i18n/src/closureI18nExtractor.js | 66 +++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/i18n/src/closureI18nExtractor.js b/i18n/src/closureI18nExtractor.js index 83146d07..67ea5ff7 100644 --- a/i18n/src/closureI18nExtractor.js +++ b/i18n/src/closureI18nExtractor.js @@ -87,7 +87,11 @@ function pluralExtractor(content, localeInfo) { continue; } var temp = goog.i18n.pluralRules.select.toString(). - replace(/goog.i18n.pluralRules.Keyword/g, 'PLURAL_CATEGORY').replace(/\n/g, ''); + replace(/goog\.i18n\.pluralRules\.Keyword/g, 'PLURAL_CATEGORY'). + replace(/goog\.i18n\.pluralRules\.get_vf_/g, 'getVF'). + replace(/goog\.i18n\.pluralRules\.get_wt_/g, 'getWT'). + replace(/goog\.i18n\.pluralRules\.decimals_/g, 'getDecimals'). + replace(/\n/g, ''); ///@@ is a crazy place holder to be replaced before writing to file localeInfo[localeIds[i]].pluralCat = "@@" + temp + "@@"; @@ -158,15 +162,39 @@ function outputLocale(localeInfo, localeID) { } localeObj.id = correctedLocaleId(localeID); - var prefix = - "'use strict';\n" + - 'angular.module("ngLocale", [], ["$provide", function($provide) {\n' + - 'var PLURAL_CATEGORY = {' + - 'ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"' + - '};\n' + - '$provide.value("$locale", '; + var getDecimals = [ + 'function getDecimals(n) {', + ' n = n + \'\';', + ' var i = n.indexOf(\'.\');', + ' return (i == -1) ? 0 : n.length - i - 1;', + '}', '', '' + ].join('\n'); - var suffix = ');\n}]);'; + var getVF = [ + 'function getVF(n, opt_precision) {', + ' var v = opt_precision;', '', + ' if (undefined === v) {', + ' v = Math.min(getDecimals(n), 3);', + ' }', '', + ' var base = Math.pow(10, v);', + ' var f = ((n * base) | 0) % base;', + ' return {v: v, f: f};', + '}', '', '' + ].join('\n'); + + var getWT = + [ + 'function getWT(v, f) {', + ' if (f === 0) {', + ' return {w: 0, t: 0};', + ' }', '', + ' while ((f % 10) === 0) {', + ' f /= 10;', + ' v--;', + ' }', '', + ' return {w: v, t: f};', + '}', '', '' + ].join('\n'); localeObj = { DATETIME_FORMATS: localeObj.DATETIME_FORMATS, @@ -176,6 +204,26 @@ function outputLocale(localeInfo, localeID) { }; var content = serializeContent(localeInfo[localeID]); + if (content.indexOf('getVF(') < 0) { + getVF = ''; + } + if (content.indexOf('getWT(') < 0) { + getWT = ''; + } + if (!getVF && content.indexOf('getDecimals(') < 0) { + getDecimals = ''; + } + + var prefix = + "'use strict';\n" + + 'angular.module("ngLocale", [], ["$provide", function($provide) {\n' + + 'var PLURAL_CATEGORY = {' + + 'ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"' + + '};\n' + + getDecimals + getVF + getWT + + '$provide.value("$locale", '; + + var suffix = ');\n}]);'; return prefix + content + suffix; }