--- /dev/null
+/* --------------------------------------------------------------------------------------------\r
+ * Copyright (c) Microsoft Corporation. All rights reserved.\r
+ * Licensed under the MIT License. See License.txt in the project root for license information.\r
+ * ------------------------------------------------------------------------------------------ */\r
+'use strict';\r
+Object.defineProperty(exports, "__esModule", { value: true });\r
+var path = require("path");\r
+var fs = require("fs");\r
+var toString = Object.prototype.toString;\r
+function isDefined(value) {\r
+ return typeof value !== 'undefined';\r
+}\r
+function isNumber(value) {\r
+ return toString.call(value) === '[object Number]';\r
+}\r
+function isString(value) {\r
+ return toString.call(value) === '[object String]';\r
+}\r
+function isBoolean(value) {\r
+ return value === true || value === false;\r
+}\r
+function readJsonFileSync(filename) {\r
+ return JSON.parse(fs.readFileSync(filename, 'utf8'));\r
+}\r
+var MessageFormat;\r
+(function (MessageFormat) {\r
+ MessageFormat["file"] = "file";\r
+ MessageFormat["bundle"] = "bundle";\r
+ MessageFormat["both"] = "both";\r
+})(MessageFormat = exports.MessageFormat || (exports.MessageFormat = {}));\r
+var BundleFormat;\r
+(function (BundleFormat) {\r
+ // the nls.bundle format\r
+ BundleFormat["standalone"] = "standalone";\r
+ BundleFormat["languagePack"] = "languagePack";\r
+})(BundleFormat = exports.BundleFormat || (exports.BundleFormat = {}));\r
+var LocalizeInfo;\r
+(function (LocalizeInfo) {\r
+ function is(value) {\r
+ var candidate = value;\r
+ return candidate && isDefined(candidate.key) && isDefined(candidate.comment);\r
+ }\r
+ LocalizeInfo.is = is;\r
+})(LocalizeInfo || (LocalizeInfo = {}));\r
+var resolvedLanguage;\r
+var resolvedBundles;\r
+var options;\r
+var isPseudo;\r
+function initializeSettings() {\r
+ options = { locale: undefined, language: undefined, languagePackSupport: false, cacheLanguageResolution: true, messageFormat: MessageFormat.bundle };\r
+ if (isString(process.env.VSCODE_NLS_CONFIG)) {\r
+ try {\r
+ var vscodeOptions_1 = JSON.parse(process.env.VSCODE_NLS_CONFIG);\r
+ var language = void 0;\r
+ var locale = void 0;\r
+ if (vscodeOptions_1.availableLanguages) {\r
+ var value = vscodeOptions_1.availableLanguages['*'];\r
+ if (isString(value)) {\r
+ language = value;\r
+ }\r
+ }\r
+ if (isString(vscodeOptions_1.locale)) {\r
+ options.locale = vscodeOptions_1.locale.toLowerCase();\r
+ }\r
+ if (language === undefined) {\r
+ options.language = options.locale;\r
+ }\r
+ else if (language !== 'en') {\r
+ options.language = language;\r
+ }\r
+ if (isBoolean(vscodeOptions_1._languagePackSupport)) {\r
+ options.languagePackSupport = vscodeOptions_1._languagePackSupport;\r
+ }\r
+ if (isString(vscodeOptions_1._cacheRoot)) {\r
+ options.cacheRoot = vscodeOptions_1._cacheRoot;\r
+ }\r
+ if (isString(vscodeOptions_1._languagePackId)) {\r
+ options.languagePackId = vscodeOptions_1._languagePackId;\r
+ }\r
+ if (isString(vscodeOptions_1._translationsConfigFile)) {\r
+ options.translationsConfigFile = vscodeOptions_1._translationsConfigFile;\r
+ try {\r
+ options.translationsConfig = readJsonFileSync(options.translationsConfigFile);\r
+ }\r
+ catch (error) {\r
+ // We can't read the translation config file. Mark the cache as corrupted.\r
+ if (vscodeOptions_1._corruptedFile) {\r
+ var dirname = path.dirname(vscodeOptions_1._corruptedFile);\r
+ fs.exists(dirname, function (exists) {\r
+ if (exists) {\r
+ fs.writeFile(vscodeOptions_1._corruptedFile, 'corrupted', 'utf8', function (err) {\r
+ console.error(err);\r
+ });\r
+ }\r
+ });\r
+ }\r
+ }\r
+ }\r
+ }\r
+ catch (_a) {\r
+ // Do nothing.\r
+ }\r
+ }\r
+ isPseudo = options.locale === 'pseudo';\r
+ resolvedLanguage = undefined;\r
+ resolvedBundles = Object.create(null);\r
+}\r
+initializeSettings();\r
+function supportsLanguagePack() {\r
+ return options.languagePackSupport === true && options.cacheRoot !== undefined && options.languagePackId !== undefined && options.translationsConfigFile !== undefined\r
+ && options.translationsConfig !== undefined;\r
+}\r
+function format(message, args) {\r
+ var result;\r
+ if (isPseudo) {\r
+ // FF3B and FF3D is the Unicode zenkaku representation for [ and ]\r
+ message = '\uFF3B' + message.replace(/[aouei]/g, '$&$&') + '\uFF3D';\r
+ }\r
+ if (args.length === 0) {\r
+ result = message;\r
+ }\r
+ else {\r
+ result = message.replace(/\{(\d+)\}/g, function (match, rest) {\r
+ var index = rest[0];\r
+ var arg = args[index];\r
+ var replacement = match;\r
+ if (typeof arg === 'string') {\r
+ replacement = arg;\r
+ }\r
+ else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) {\r
+ replacement = String(arg);\r
+ }\r
+ return replacement;\r
+ });\r
+ }\r
+ return result;\r
+}\r
+function createScopedLocalizeFunction(messages) {\r
+ return function (key, message) {\r
+ var args = [];\r
+ for (var _i = 2; _i < arguments.length; _i++) {\r
+ args[_i - 2] = arguments[_i];\r
+ }\r
+ if (isNumber(key)) {\r
+ if (key >= messages.length) {\r
+ console.error("Broken localize call found. Index out of bounds. Stacktrace is\n: " + new Error('').stack);\r
+ return;\r
+ }\r
+ return format(messages[key], args);\r
+ }\r
+ else {\r
+ if (isString(message)) {\r
+ console.warn("Message " + message + " didn't get externalized correctly.");\r
+ return format(message, args);\r
+ }\r
+ else {\r
+ console.error("Broken localize call found. Stacktrace is\n: " + new Error('').stack);\r
+ }\r
+ }\r
+ };\r
+}\r
+function localize(key, message) {\r
+ var args = [];\r
+ for (var _i = 2; _i < arguments.length; _i++) {\r
+ args[_i - 2] = arguments[_i];\r
+ }\r
+ return format(message, args);\r
+}\r
+function resolveLanguage(file) {\r
+ var resolvedLanguage;\r
+ if (options.cacheLanguageResolution && resolvedLanguage) {\r
+ resolvedLanguage = resolvedLanguage;\r
+ }\r
+ else {\r
+ if (isPseudo || !options.language) {\r
+ resolvedLanguage = '.nls.json';\r
+ }\r
+ else {\r
+ var locale = options.language;\r
+ while (locale) {\r
+ var candidate = '.nls.' + locale + '.json';\r
+ if (fs.existsSync(file + candidate)) {\r
+ resolvedLanguage = candidate;\r
+ break;\r
+ }\r
+ else {\r
+ var index = locale.lastIndexOf('-');\r
+ if (index > 0) {\r
+ locale = locale.substring(0, index);\r
+ }\r
+ else {\r
+ resolvedLanguage = '.nls.json';\r
+ locale = null;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if (options.cacheLanguageResolution) {\r
+ resolvedLanguage = resolvedLanguage;\r
+ }\r
+ }\r
+ return file + resolvedLanguage;\r
+}\r
+function findInTheBoxBundle(root) {\r
+ var language = options.language;\r
+ while (language) {\r
+ var candidate = path.join(root, "nls.bundle." + language + ".json");\r
+ if (fs.existsSync(candidate)) {\r
+ return candidate;\r
+ }\r
+ else {\r
+ var index = language.lastIndexOf('-');\r
+ if (index > 0) {\r
+ language = language.substring(0, index);\r
+ }\r
+ else {\r
+ language = undefined;\r
+ }\r
+ }\r
+ }\r
+ // Test if we can reslove the default bundle.\r
+ if (language === undefined) {\r
+ var candidate = path.join(root, 'nls.bundle.json');\r
+ if (fs.existsSync(candidate)) {\r
+ return candidate;\r
+ }\r
+ }\r
+ return undefined;\r
+}\r
+function mkdir(directory) {\r
+ try {\r
+ fs.mkdirSync(directory);\r
+ }\r
+ catch (err) {\r
+ if (err.code === 'EEXIST') {\r
+ return;\r
+ }\r
+ else if (err.code === 'ENOENT') {\r
+ var parent = path.dirname(directory);\r
+ if (parent !== directory) {\r
+ mkdir(parent);\r
+ fs.mkdirSync(directory);\r
+ }\r
+ }\r
+ else {\r
+ throw err;\r
+ }\r
+ }\r
+}\r
+function createDefaultNlsBundle(folder) {\r
+ var metaData = readJsonFileSync(path.join(folder, 'nls.metadata.json'));\r
+ var result = Object.create(null);\r
+ for (var module_1 in metaData) {\r
+ var entry = metaData[module_1];\r
+ result[module_1] = entry.messages;\r
+ }\r
+ return result;\r
+}\r
+function createNLSBundle(header, metaDataPath) {\r
+ var languagePackLocation = options.translationsConfig[header.id];\r
+ if (!languagePackLocation) {\r
+ return undefined;\r
+ }\r
+ var languagePack = readJsonFileSync(languagePackLocation).contents;\r
+ var metaData = readJsonFileSync(path.join(metaDataPath, 'nls.metadata.json'));\r
+ var result = Object.create(null);\r
+ for (var module_2 in metaData) {\r
+ var entry = metaData[module_2];\r
+ var translations = languagePack[header.outDir + "/" + module_2];\r
+ if (translations) {\r
+ var resultMessages = [];\r
+ for (var i = 0; i < entry.keys.length; i++) {\r
+ var messageKey = entry.keys[i];\r
+ var key = isString(messageKey) ? messageKey : messageKey.key;\r
+ var translatedMessage = translations[key];\r
+ if (translatedMessage === undefined) {\r
+ translatedMessage = entry.messages[i];\r
+ }\r
+ resultMessages.push(translatedMessage);\r
+ }\r
+ result[module_2] = resultMessages;\r
+ }\r
+ else {\r
+ result[module_2] = entry.messages;\r
+ }\r
+ }\r
+ return result;\r
+}\r
+function touch(file) {\r
+ var d = new Date();\r
+ fs.utimes(file, d, d, function () {\r
+ // Do nothing. Ignore\r
+ });\r
+}\r
+function cacheBundle(key, bundle) {\r
+ resolvedBundles[key] = bundle;\r
+ return bundle;\r
+}\r
+function loadNlsBundleOrCreateFromI18n(header, bundlePath) {\r
+ var result;\r
+ var bundle = path.join(options.cacheRoot, header.id + "-" + header.hash + ".json");\r
+ var useMemoryOnly = false;\r
+ var writeBundle = false;\r
+ try {\r
+ result = JSON.parse(fs.readFileSync(bundle, { encoding: 'utf8', flag: 'r' }));\r
+ touch(bundle);\r
+ return result;\r
+ }\r
+ catch (err) {\r
+ if (err.code === 'ENOENT') {\r
+ writeBundle = true;\r
+ }\r
+ else if (err instanceof SyntaxError) {\r
+ // We have a syntax error. So no valid JSON. Use\r
+ console.log("Syntax error parsing message bundle: " + err.message + ".");\r
+ fs.unlink(bundle, function (err) {\r
+ if (err) {\r
+ console.error("Deleting corrupted bundle " + bundle + " failed.");\r
+ }\r
+ });\r
+ useMemoryOnly = true;\r
+ }\r
+ else {\r
+ throw err;\r
+ }\r
+ }\r
+ result = createNLSBundle(header, bundlePath);\r
+ if (!result || useMemoryOnly) {\r
+ return result;\r
+ }\r
+ if (writeBundle) {\r
+ try {\r
+ fs.writeFileSync(bundle, JSON.stringify(result), { encoding: 'utf8', flag: 'wx' });\r
+ }\r
+ catch (err) {\r
+ if (err.code === 'EEXIST') {\r
+ return result;\r
+ }\r
+ throw err;\r
+ }\r
+ }\r
+ return result;\r
+}\r
+function loadDefaultNlsBundle(bundlePath) {\r
+ try {\r
+ return createDefaultNlsBundle(bundlePath);\r
+ }\r
+ catch (err) {\r
+ console.log("Generating default bundle from meta data failed.", err);\r
+ return undefined;\r
+ }\r
+}\r
+function loadNlsBundle(header, bundlePath) {\r
+ var result;\r
+ // Core decided to use a language pack. Do the same in the extension\r
+ if (supportsLanguagePack()) {\r
+ try {\r
+ result = loadNlsBundleOrCreateFromI18n(header, bundlePath);\r
+ }\r
+ catch (err) {\r
+ console.log("Load or create bundle failed ", err);\r
+ }\r
+ }\r
+ if (!result) {\r
+ // No language pack found, but core is running in language pack mode\r
+ // Don't try to use old in the box bundles since the might be stale\r
+ // Fall right back to the default bundle.\r
+ if (options.languagePackSupport) {\r
+ return loadDefaultNlsBundle(bundlePath);\r
+ }\r
+ var candidate = findInTheBoxBundle(bundlePath);\r
+ if (candidate) {\r
+ try {\r
+ return readJsonFileSync(candidate);\r
+ }\r
+ catch (err) {\r
+ console.log("Loading in the box message bundle failed.", err);\r
+ }\r
+ }\r
+ result = loadDefaultNlsBundle(bundlePath);\r
+ }\r
+ return result;\r
+}\r
+function tryFindMetaDataHeaderFile(file) {\r
+ var result;\r
+ var dirname = path.dirname(file);\r
+ while (true) {\r
+ result = path.join(dirname, 'nls.metadata.header.json');\r
+ if (fs.existsSync(result)) {\r
+ break;\r
+ }\r
+ var parent = path.dirname(dirname);\r
+ if (parent === dirname) {\r
+ result = undefined;\r
+ break;\r
+ }\r
+ else {\r
+ dirname = parent;\r
+ }\r
+ }\r
+ return result;\r
+}\r
+function loadMessageBundle(file) {\r
+ if (!file) {\r
+ // No file. We are in dev mode. Return the default\r
+ // localize function.\r
+ return localize;\r
+ }\r
+ // Remove extension since we load json files.\r
+ var ext = path.extname(file);\r
+ if (ext) {\r
+ file = file.substr(0, file.length - ext.length);\r
+ }\r
+ if (options.messageFormat === MessageFormat.both || options.messageFormat === MessageFormat.bundle) {\r
+ var headerFile = tryFindMetaDataHeaderFile(file);\r
+ if (headerFile) {\r
+ var bundlePath = path.dirname(headerFile);\r
+ var bundle = resolvedBundles[bundlePath];\r
+ if (bundle === undefined) {\r
+ try {\r
+ var header = JSON.parse(fs.readFileSync(headerFile, 'utf8'));\r
+ try {\r
+ var nlsBundle = loadNlsBundle(header, bundlePath);\r
+ bundle = cacheBundle(bundlePath, nlsBundle ? { header: header, nlsBundle: nlsBundle } : null);\r
+ }\r
+ catch (err) {\r
+ console.error('Failed to load nls bundle', err);\r
+ bundle = cacheBundle(bundlePath, null);\r
+ }\r
+ }\r
+ catch (err) {\r
+ console.error('Failed to read header file', err);\r
+ bundle = cacheBundle(bundlePath, null);\r
+ }\r
+ }\r
+ if (bundle) {\r
+ var module_3 = file.substr(bundlePath.length + 1).replace(/\\/g, '/');\r
+ var messages = bundle.nlsBundle[module_3];\r
+ if (messages === undefined) {\r
+ console.error("Messages for file " + file + " not found. See console for details.");\r
+ return function () {\r
+ return 'Messages not found.';\r
+ };\r
+ }\r
+ return createScopedLocalizeFunction(messages);\r
+ }\r
+ }\r
+ }\r
+ if (options.messageFormat === MessageFormat.both || options.messageFormat === MessageFormat.file) {\r
+ // Try to load a single file bundle\r
+ try {\r
+ var json = readJsonFileSync(resolveLanguage(file));\r
+ if (Array.isArray(json)) {\r
+ return createScopedLocalizeFunction(json);\r
+ }\r
+ else {\r
+ if (isDefined(json.messages) && isDefined(json.keys)) {\r
+ return createScopedLocalizeFunction(json.messages);\r
+ }\r
+ else {\r
+ console.error("String bundle '" + file + "' uses an unsupported format.");\r
+ return function () {\r
+ return 'File bundle has unsupported format. See console for details';\r
+ };\r
+ }\r
+ }\r
+ }\r
+ catch (err) {\r
+ if (err.code !== 'ENOENT') {\r
+ console.error('Failed to load single file bundle', err);\r
+ }\r
+ }\r
+ }\r
+ console.error("Failed to load message bundle for file " + file);\r
+ return function () {\r
+ return 'Failed to load message bundle. See console for details.';\r
+ };\r
+}\r
+exports.loadMessageBundle = loadMessageBundle;\r
+function config(opts) {\r
+ if (opts) {\r
+ if (isString(opts.locale)) {\r
+ options.locale = opts.locale.toLowerCase();\r
+ options.language = options.locale;\r
+ resolvedLanguage = undefined;\r
+ resolvedBundles = Object.create(null);\r
+ }\r
+ if (opts.messageFormat !== undefined) {\r
+ options.messageFormat = opts.messageFormat;\r
+ }\r
+ if (opts.bundleFormat === BundleFormat.standalone && options.languagePackSupport === true) {\r
+ options.languagePackSupport = false;\r
+ }\r
+ }\r
+ isPseudo = options.locale === 'pseudo';\r
+ return loadMessageBundle;\r
+}\r
+exports.config = config;\r
+//# sourceMappingURL=main.js.map
\ No newline at end of file