From 695c54c17b3299cd6170c45878b41cb46a577cd2 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Wed, 17 Apr 2013 22:13:49 +0100 Subject: fix(i18n): escape all chars above \u007f in locale files Modify the script that writes the locales so all characters above \u007f are escaped Includes the updated locale files after running the closureI18nExtractor. Closes #2417 --- i18n/spec/closureI18nExtractorSpec.js | 11 +++++++++++ i18n/src/closureI18nExtractor.js | 11 ++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) (limited to 'i18n') diff --git a/i18n/spec/closureI18nExtractorSpec.js b/i18n/spec/closureI18nExtractorSpec.js index f4f190d5..87a9d455 100644 --- a/i18n/spec/closureI18nExtractorSpec.js +++ b/i18n/spec/closureI18nExtractorSpec.js @@ -248,3 +248,14 @@ describe("pluralExtractor", function() { }) }); +describe("serializeContent", function() { + it("should not make any modifications to the content of the locale", function() { + var serializedContent = closureI18nExtractor.serializeContent(newTestLocaleInfo()); + expect(eval("(" + serializedContent + ")")).toEqual(newTestLocaleInfo()); + }); + it("should only have ascii characters", function() { + var serializedContent = closureI18nExtractor.serializeContent(newTestLocaleInfo()); + expect((/[^\u0001-\u007f]/).test(serializedContent)).toBe(false); + }); +}); + diff --git a/i18n/src/closureI18nExtractor.js b/i18n/src/closureI18nExtractor.js index a26f89b7..13d42143 100644 --- a/i18n/src/closureI18nExtractor.js +++ b/i18n/src/closureI18nExtractor.js @@ -9,6 +9,7 @@ exports.pluralExtractor = pluralExtractor; exports.outputLocale = outputLocale; exports.correctedLocaleId = correctedLocaleId; exports.findLocaleId = findLocaleId; +exports.serializeContent = serializeContent; var goog = { provide: function() {}, require: function() {}, @@ -125,6 +126,12 @@ function canonicalizeForJsonStringify(unused_key, object) { return result; } +function serializeContent(localeObj) { + return JSON.stringify(localeObj, canonicalizeForJsonStringify, ' ') + .replace(new RegExp('[\\u007f-\\uffff]', 'g'), function(c) { return '\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4); }) + .replace(/"@@|@@"/g, ''); +} + function outputLocale(localeInfo, localeID) { var fallBackID = localeID.match(/[A-Za-z]+/)[0], localeObj = localeInfo[localeID], @@ -167,9 +174,7 @@ function outputLocale(localeInfo, localeID) { id: localeObj.id }; - var content = JSON.stringify(localeInfo[localeID], canonicalizeForJsonStringify, ' ') - .replace(/\ยค/g, '\\u00A4') - .replace(/"@@|@@"/g, ''); + var content = serializeContent(localeInfo[localeID]); return prefix + content + suffix; } -- cgit v1.2.3