From c47a8c36356545b90318b51c6d04b2cf94ff614c Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Fri, 17 Mar 2017 15:27:05 +0100 Subject: [PATCH] Added i18n tests. --- build/lib/i18n.js | 13 +++------ build/lib/i18n.ts | 6 ++--- build/lib/test/i18n.test.js | 41 ++++++++++++++++++++++++++++ build/lib/test/i18n.test.ts | 54 +++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 13 deletions(-) create mode 100644 build/lib/test/i18n.test.js create mode 100644 build/lib/test/i18n.test.ts diff --git a/build/lib/i18n.js b/build/lib/i18n.js index a8256d1ad37..7f602efdd3b 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -9,14 +9,12 @@ var fs = require("fs"); var event_stream_1 = require("event-stream"); var File = require("vinyl"); var Is = require("is"); -var util = require('gulp-util'); var xml2js = require("xml2js"); var glob = require("glob"); var util = require('gulp-util'); var request = require('request'); var es = require('event-stream'); var iconv = require('iconv-lite'); - function log(message) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { @@ -44,7 +42,6 @@ var BundledFormat; } BundledFormat.is = is; })(BundledFormat || (BundledFormat = {})); - var PackageJsonFormat; (function (PackageJsonFormat) { function is(value) { @@ -148,7 +145,7 @@ var XLF = (function () { //throw new Error('No item ID or value specified.'); } this.appendNewLine("", 4); - this.appendNewLine("" + encodeEntities(item.message) + "", 6); + this.appendNewLine("" + item.message + "", 6); if (item.comment) { this.appendNewLine("" + item.comment + "", 6); } @@ -211,7 +208,6 @@ XLF.parse = function (xlfString) { }); }; exports.XLF = XLF; - var vscodeLanguages = [ 'chs', 'cht', @@ -243,7 +239,6 @@ var iso639_3_to_2 = { 'sve': 'sv-se', 'trk': 'tr' }; - var iso639_2_to_3 = { 'zh-cn': 'chs', 'zh-tw': 'cht', @@ -264,7 +259,6 @@ var iso639_2_to_3 = { 'sv-se': 'sve', 'tr': 'trk' }; - function sortLanguages(directoryNames) { return directoryNames.map(function (dirName) { var lower = dirName.toLowerCase(); @@ -316,7 +310,6 @@ function stripComments(content) { }); return result; } -; function escapeCharacters(value) { var result = []; for (var i = 0; i < value.length; i++) { @@ -485,7 +478,6 @@ function processNlsFiles(opts) { }); } exports.processNlsFiles = processNlsFiles; - function prepareXlfFiles(projectName, extensionName) { return event_stream_1.through(function (file) { if (!file.isBuffer()) { @@ -541,6 +533,7 @@ function getResource(sourceFile) { } throw new Error("Could not identify the XLF bundle for " + sourceFile); } +exports.getResource = getResource; function importBundleJson(file, json, stream) { var transifexEditorXlfs = Object.create(null); for (var source in json.keys) { @@ -953,4 +946,4 @@ function decodeEntities(value) { return value.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&'); } exports.decodeEntities = decodeEntities; -//# sourceMappingURL=i18n.js.map +//# sourceMappingURL=i18n.js.map \ No newline at end of file diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index 146664b6a34..9c5f1b89698 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -32,7 +32,7 @@ interface Item { comment: string; } -interface Resource { +export interface Resource { name: string; project: string; } @@ -191,7 +191,7 @@ export class XLF { } this.appendNewLine(``, 4); - this.appendNewLine(`${encodeEntities(item.message)}`, 6); + this.appendNewLine(`${item.message}`, 6); if (item.comment) { this.appendNewLine(`${item.comment}`, 6); @@ -570,7 +570,7 @@ export function prepareXlfFiles(projectName?: string, extensionName?: string): T ); } -function getResource(sourceFile: string): Resource { +export function getResource(sourceFile: string): Resource { const editorProject: string = 'vscode-editor', workbenchProject: string = 'vscode-workbench'; let resource: string; diff --git a/build/lib/test/i18n.test.js b/build/lib/test/i18n.test.js new file mode 100644 index 00000000000..4e7b60b459e --- /dev/null +++ b/build/lib/test/i18n.test.js @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert = require("assert"); +var i18n = require("../i18n"); +suite('XLF Parser Tests', function () { + var sampleXlf = 'Key #1Key #2 &'; + var sampleTranslatedXlf = 'Key #1Кнопка #1Key #2 &Кнопка #2 &'; + var originalFilePath = 'vs/base/common/keybinding'; + var keys = ['key1', 'key2']; + var messages = ['Key #1', 'Key #2 &']; + var translatedMessages = { key1: 'Кнопка #1', key2: 'Кнопка #2 &' }; + test('Keys & messages to XLF conversion', function () { + var xlf = new i18n.XLF('vscode-workbench'); + xlf.addFile(originalFilePath, keys, messages); + var xlfString = xlf.toString(); + assert.strictEqual(xlfString.replace(/\s{2,}/g, ''), sampleXlf); + }); + test('XLF to keys & messages conversion', function () { + i18n.XLF.parse(sampleTranslatedXlf).then(function (resolvedFiles) { + assert.deepEqual(resolvedFiles[0].messages, translatedMessages); + assert.strictEqual(resolvedFiles[0].originalFilePath, originalFilePath); + }); + }); + test('JSON file source path to Transifex resource match', function () { + var editorProject = 'vscode-editor', workbenchProject = 'vscode-workbench'; + var platform = { name: 'vs/platform', project: editorProject }, editorContrib = { name: 'vs/editor/contrib', project: editorProject }, editor = { name: 'vs/editor', project: editorProject }, base = { name: 'vs/base', project: editorProject }, code = { name: 'vs/code', project: workbenchProject }, workbenchParts = { name: 'vs/workbench/parts/html', project: workbenchProject }, workbenchServices = { name: 'vs/workbench/services/files', project: workbenchProject }, workbench = { name: 'vs/workbench', project: workbenchProject }; + assert.deepEqual(i18n.getResource('vs/platform/actions/browser/menusExtensionPoint'), platform); + assert.deepEqual(i18n.getResource('vs/editor/contrib/clipboard/browser/clipboard'), editorContrib); + assert.deepEqual(i18n.getResource('vs/editor/common/modes/modesRegistry'), editor); + assert.deepEqual(i18n.getResource('vs/base/common/errorMessage'), base); + assert.deepEqual(i18n.getResource('vs/code/electron-main/window'), code); + assert.deepEqual(i18n.getResource('vs/workbench/parts/html/browser/webview'), workbenchParts); + assert.deepEqual(i18n.getResource('vs/workbench/services/files/node/fileService'), workbenchServices); + assert.deepEqual(i18n.getResource('vs/workbench/browser/parts/panel/panelActions'), workbench); + }); +}); +//# sourceMappingURL=i18n.test.js.map \ No newline at end of file diff --git a/build/lib/test/i18n.test.ts b/build/lib/test/i18n.test.ts new file mode 100644 index 00000000000..bf85d091b08 --- /dev/null +++ b/build/lib/test/i18n.test.ts @@ -0,0 +1,54 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import assert = require('assert'); +import i18n = require('../i18n'); + +suite('XLF Parser Tests', () => { + const sampleXlf = 'Key #1Key #2 &'; + const sampleTranslatedXlf = 'Key #1Кнопка #1Key #2 &Кнопка #2 &'; + const originalFilePath = 'vs/base/common/keybinding'; + const keys = ['key1', 'key2']; + const messages = ['Key #1', 'Key #2 &']; + const translatedMessages = { key1: 'Кнопка #1', key2: 'Кнопка #2 &' }; + + test('Keys & messages to XLF conversion', () => { + let xlf = new i18n.XLF('vscode-workbench'); + xlf.addFile(originalFilePath, keys, messages); + const xlfString = xlf.toString(); + + assert.strictEqual(xlfString.replace(/\s{2,}/g, ''), sampleXlf); + }); + + test('XLF to keys & messages conversion', () => { + i18n.XLF.parse(sampleTranslatedXlf).then(function(resolvedFiles) { + assert.deepEqual(resolvedFiles[0].messages, translatedMessages); + assert.strictEqual(resolvedFiles[0].originalFilePath, originalFilePath); + }); + }); + + test('JSON file source path to Transifex resource match', () => { + const editorProject: string = 'vscode-editor', + workbenchProject: string = 'vscode-workbench'; + + const platform: i18n.Resource = { name: 'vs/platform', project: editorProject }, + editorContrib = { name: 'vs/editor/contrib', project: editorProject }, + editor = { name: 'vs/editor', project: editorProject }, + base = { name: 'vs/base', project: editorProject }, + code = { name: 'vs/code', project: workbenchProject }, + workbenchParts = { name: 'vs/workbench/parts/html', project: workbenchProject }, + workbenchServices = { name: 'vs/workbench/services/files', project: workbenchProject }, + workbench = { name: 'vs/workbench', project: workbenchProject}; + + assert.deepEqual(i18n.getResource('vs/platform/actions/browser/menusExtensionPoint'), platform); + assert.deepEqual(i18n.getResource('vs/editor/contrib/clipboard/browser/clipboard'), editorContrib); + assert.deepEqual(i18n.getResource('vs/editor/common/modes/modesRegistry'), editor); + assert.deepEqual(i18n.getResource('vs/base/common/errorMessage'), base); + assert.deepEqual(i18n.getResource('vs/code/electron-main/window'), code); + assert.deepEqual(i18n.getResource('vs/workbench/parts/html/browser/webview'), workbenchParts); + assert.deepEqual(i18n.getResource('vs/workbench/services/files/node/fileService'), workbenchServices); + assert.deepEqual(i18n.getResource('vs/workbench/browser/parts/panel/panelActions'), workbench); + }); +}); \ No newline at end of file