ngx-i18nsupport
Advanced tools
Comparing version
@@ -0,1 +1,18 @@ | ||
<a name="0.6.0"></a> | ||
# [0.6.0](https://github.com/martinroob/ngx-i18nsupport/compare/v0.5.0...v0.6.0) (2017-05-25) | ||
### Bug Fixes | ||
* **xliffmerge:** Format xmb should create xtb files for translations. ([#25](https://github.com/martinroob/ngx-i18nsupport/issues/25)). | ||
There is no migration tooling, so if you do have translated xmb files, you must manually correct them to xtb. | ||
* **xliffmerge:** File suffix change. For format XLIFF 2.0 the suffix of the generated files is `xlf` now (was `xlf2`, which is not correct). | ||
If you already have such files, you should rename them before running xliffmerge. Otherwise they will not be merged. | ||
### Features | ||
* **xliffmerge:** xliffmerge does not merge the new source references. ([#24](https://github.com/martinroob/ngx-i18nsupport/issues/24)) | ||
* **xliffmerge:** For format XLIFF 2.0 source references are supported now. | ||
<a name="0.5.0"></a> | ||
@@ -2,0 +19,0 @@ # [0.5.0](https://github.com/martinroob/ngx-i18nsupport/compare/v0.4.0...v0.5.0) (2017-05-05) |
@@ -126,2 +126,2 @@ /** | ||
exports.CommandOutput = CommandOutput; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/common/command-output.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/common/command-output.js.map |
@@ -105,2 +105,2 @@ "use strict"; | ||
exports.FileUtil = FileUtil; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/common/file-util.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/common/file-util.js.map |
@@ -52,2 +52,2 @@ "use strict"; | ||
exports.WriterToString = WriterToString; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/common/writer-to-string.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/common/writer-to-string.js.map |
@@ -7,2 +7,2 @@ /** | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/i-xliff-merge-options.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/i-xliff-merge-options.js.map |
@@ -9,2 +9,2 @@ "use strict"; | ||
xliff_merge_1.XliffMerge.main(process.argv); | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/main.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/main.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var ngx_i18nsupport_lib_1 = require("ngx-i18nsupport-lib"); | ||
var file_util_1 = require("../common/file-util"); | ||
@@ -37,3 +38,3 @@ var util_1 = require("util"); | ||
if (ngxId) { | ||
var messagetext = tu.targetContentNormalized(); | ||
var messagetext = tu.targetContentNormalized().asDisplayString(ngx_i18nsupport_lib_1.NORMALIZATION_FORMAT_NGXTRANSLATE); | ||
result.push({ id: ngxId, message: messagetext }); | ||
@@ -131,2 +132,2 @@ } | ||
exports.NgxTranslateExtractor = NgxTranslateExtractor; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/ngx-translate-extractor.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/ngx-translate-extractor.js.map |
@@ -68,2 +68,2 @@ "use strict"; | ||
exports.TranslationMessagesFileReader = TranslationMessagesFileReader; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/translation-messages-file-reader.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/translation-messages-file-reader.js.map |
@@ -9,2 +9,2 @@ "use strict"; | ||
exports.VERSION = (pkg ? pkg.version : 'unknown'); | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/version.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/version.js.map |
@@ -27,2 +27,2 @@ /** | ||
exports.XliffMergeError = XliffMergeError; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/xliff-merge-error.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/xliff-merge-error.js.map |
@@ -60,3 +60,3 @@ /** | ||
* Read profile. | ||
* @param profilePath | ||
* @param options program options | ||
* @return the read profile (empty, if none, null if errors) | ||
@@ -77,4 +77,3 @@ */ | ||
} | ||
var profileContent = JSON.parse(content); | ||
return profileContent; | ||
return JSON.parse(content); | ||
}; | ||
@@ -256,4 +255,14 @@ XliffMergeParameters.prototype.initializeFromConfig = function (profileContent) { | ||
XliffMergeParameters.prototype.generatedI18nFile = function (lang) { | ||
return this.genDir() + '/' + 'messages.' + lang + '.' + this.i18nFormat(); | ||
return this.genDir() + '/' + 'messages.' + lang + '.' + this.suffixForGeneratedI18nFile(); | ||
}; | ||
XliffMergeParameters.prototype.suffixForGeneratedI18nFile = function () { | ||
switch (this.i18nFormat()) { | ||
case 'xlf': | ||
return 'xlf'; | ||
case 'xlf2': | ||
return 'xlf'; | ||
case 'xmb': | ||
return 'xtb'; | ||
} | ||
}; | ||
/** | ||
@@ -297,2 +306,2 @@ * potentially to be generated translate-File for ngx-translate with the translations for one language. | ||
exports.XliffMergeParameters = XliffMergeParameters; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/xliff-merge-parameters.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/xliff-merge-parameters.js.map |
@@ -10,2 +10,3 @@ "use strict"; | ||
var util_1 = require("util"); | ||
var ngx_i18nsupport_lib_1 = require("ngx-i18nsupport-lib"); | ||
var ngx_translate_extractor_1 = require("./ngx-translate-extractor"); | ||
@@ -176,3 +177,3 @@ var translation_messages_file_reader_1 = require("./translation-messages-file-reader"); | ||
if (this.parameters.supportNgxTranslate()) { | ||
var languageSpecificMessagesFile = translation_messages_file_reader_1.TranslationMessagesFileReader.fromFile(this.parameters.i18nFormat(), languageXliffFile, this.parameters.encoding()); | ||
var languageSpecificMessagesFile = translation_messages_file_reader_1.TranslationMessagesFileReader.fromFile(XliffMerge.translationFormat(this.parameters.i18nFormat()), languageXliffFile, this.parameters.encoding(), this.master.filename()); | ||
ngx_translate_extractor_1.NgxTranslateExtractor.extract(languageSpecificMessagesFile, this.parameters.generatedNgxTranslateFile(lang)); | ||
@@ -188,13 +189,7 @@ } | ||
XliffMerge.prototype.createUntranslatedXliff = function (lang, languageXliffFilePath) { | ||
var _this = this; | ||
// copy master ... | ||
file_util_1.FileUtil.copy(this.parameters.i18nFile(), languageXliffFilePath); | ||
// read copy and set target-language | ||
var languageSpecificMessagesFile = translation_messages_file_reader_1.TranslationMessagesFileReader.fromFile(this.parameters.i18nFormat(), languageXliffFilePath, this.parameters.encoding()); | ||
languageSpecificMessagesFile.setTargetLanguage(lang); | ||
// copy source to target if necessary | ||
// and set target-language | ||
// and copy source to target if necessary | ||
var isDefaultLang = (lang == this.parameters.defaultLanguage()); | ||
languageSpecificMessagesFile.forEachTransUnit(function (transUnit) { | ||
languageSpecificMessagesFile.useSourceAsTarget(transUnit, isDefaultLang, _this.parameters.useSourceAsTarget()); | ||
}); | ||
var languageSpecificMessagesFile = this.master.createTranslationFileForLang(lang, languageXliffFilePath, isDefaultLang, this.parameters.useSourceAsTarget()); | ||
// write it to file | ||
@@ -208,2 +203,15 @@ translation_messages_file_reader_1.TranslationMessagesFileReader.save(languageSpecificMessagesFile); | ||
/** | ||
* Map the input format to the format of the translation. | ||
* Normally they are the same but for xmb the translation format is xtb. | ||
* @param i18nFormat | ||
*/ | ||
XliffMerge.translationFormat = function (i18nFormat) { | ||
if (i18nFormat === ngx_i18nsupport_lib_1.FORMAT_XMB) { | ||
return ngx_i18nsupport_lib_1.FORMAT_XTB; | ||
} | ||
else { | ||
return i18nFormat; | ||
} | ||
}; | ||
/** | ||
* Merge all | ||
@@ -216,5 +224,6 @@ * @param lang | ||
// read lang specific file | ||
var languageSpecificMessagesFile = translation_messages_file_reader_1.TranslationMessagesFileReader.fromFile(this.parameters.i18nFormat(), languageXliffFilePath, this.parameters.encoding()); | ||
var languageSpecificMessagesFile = translation_messages_file_reader_1.TranslationMessagesFileReader.fromFile(XliffMerge.translationFormat(this.parameters.i18nFormat()), languageXliffFilePath, this.parameters.encoding()); | ||
var isDefaultLang = (lang == this.parameters.defaultLanguage()); | ||
var newCount = 0; | ||
var correctSourceRefCount = 0; | ||
this.master.forEachTransUnit(function (masterTransUnit) { | ||
@@ -224,6 +233,12 @@ var transUnit = languageSpecificMessagesFile.transUnitWithId(masterTransUnit.id); | ||
// oops, no translation, must be a new key, so add it | ||
languageSpecificMessagesFile.useSourceAsTarget(masterTransUnit, isDefaultLang, _this.parameters.useSourceAsTarget()); | ||
languageSpecificMessagesFile.addNewTransUnit(masterTransUnit); | ||
languageSpecificMessagesFile.importNewTransUnit(masterTransUnit, isDefaultLang, _this.parameters.useSourceAsTarget()); | ||
newCount++; | ||
} | ||
else { | ||
// check for missing or changed source ref and add it if needed | ||
if (!_this.areSourceReferencesEqual(masterTransUnit.sourceReferences(), transUnit.sourceReferences())) { | ||
transUnit.setSourceReferences(masterTransUnit.sourceReferences()); | ||
correctSourceRefCount++; | ||
} | ||
} | ||
}); | ||
@@ -233,2 +248,5 @@ if (newCount > 0) { | ||
} | ||
if (correctSourceRefCount > 0) { | ||
this.commandOutput.warn('transferred %s source references from master to "%s"', correctSourceRefCount, lang); | ||
} | ||
// remove all elements that are no longer used | ||
@@ -265,5 +283,28 @@ var removeCount = 0; | ||
}; | ||
XliffMerge.prototype.areSourceReferencesEqual = function (ref1, ref2) { | ||
if ((util_1.isNullOrUndefined(ref1) && !util_1.isNullOrUndefined(ref2)) || (util_1.isNullOrUndefined(ref2) && !util_1.isNullOrUndefined(ref1))) { | ||
return false; | ||
} | ||
if (util_1.isNullOrUndefined(ref1) && util_1.isNullOrUndefined(ref2)) { | ||
return true; | ||
} | ||
// bot refs are set now, convert to set to compare them | ||
var set1 = new Set(); | ||
ref1.forEach(function (ref) { set1.add(ref.sourcefile + ':' + ref.linenumber); }); | ||
var set2 = new Set(); | ||
ref2.forEach(function (ref) { set2.add(ref.sourcefile + ':' + ref.linenumber); }); | ||
if (set1.size !== set2.size) { | ||
return false; | ||
} | ||
var match = true; | ||
set2.forEach(function (ref) { | ||
if (!set1.has(ref)) { | ||
match = false; | ||
} | ||
}); | ||
return match; | ||
}; | ||
return XliffMerge; | ||
}()); | ||
exports.XliffMerge = XliffMerge; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/xliff-merge.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/xliff-merge.js.map |
@@ -51,2 +51,2 @@ "use strict"; | ||
exports.XmlReader = XmlReader; | ||
//# sourceMappingURL=s:/experimente/ngx-i18nsupport/src/xliffmerge/xml-reader.js.map | ||
//# sourceMappingURL=S:/experimente/ngx-i18nsupport/xliffmerge/xml-reader.js.map |
{ | ||
"name": "ngx-i18nsupport", | ||
"version": "0.5.0", | ||
"version": "0.6.0", | ||
"description": "Some tooling to be used with the Angular 2 i18n workflow", | ||
@@ -15,3 +15,3 @@ "main": "index.js", | ||
"scripts": { | ||
"build": "tsc -p ./src/tsconfig.json && cpx ./src/xliffmerge/xliffmerge ./dist/xliffmerge", | ||
"build": "tsc -p ./tsconfig.json && cpx ./src/xliffmerge/xliffmerge ./dist/xliffmerge", | ||
"xliffmerge": "npm link && xliffmerge", | ||
@@ -53,4 +53,4 @@ "pretest": "npm run build", | ||
"commander": "^2.9.0", | ||
"ngx-i18nsupport-lib": "^0.1.3" | ||
"ngx-i18nsupport-lib": "^1.2.0" | ||
} | ||
} |
@@ -1,2 +0,2 @@ | ||
import {ITranslationMessagesFile, ITransUnit} from 'ngx-i18nsupport-lib'; | ||
import {ITranslationMessagesFile, ITransUnit, NORMALIZATION_FORMAT_NGXTRANSLATE} from 'ngx-i18nsupport-lib'; | ||
import {FileUtil} from '../common/file-util'; | ||
@@ -60,3 +60,3 @@ import {isNullOrUndefined} from 'util'; | ||
if (ngxId) { | ||
let messagetext = tu.targetContentNormalized(); | ||
let messagetext = tu.targetContentNormalized().asDisplayString(NORMALIZATION_FORMAT_NGXTRANSLATE); | ||
result.push({id: ngxId, message: messagetext}); | ||
@@ -63,0 +63,0 @@ } |
@@ -83,3 +83,3 @@ /** | ||
* Read profile. | ||
* @param profilePath | ||
* @param options program options | ||
* @return the read profile (empty, if none, null if errors) | ||
@@ -99,4 +99,3 @@ */ | ||
} | ||
let profileContent: IConfigFile = JSON.parse(content); | ||
return profileContent; | ||
return JSON.parse(content); | ||
} | ||
@@ -285,5 +284,16 @@ | ||
public generatedI18nFile(lang: string): string { | ||
return this.genDir() + '/' + 'messages.' + lang + '.' + this.i18nFormat(); | ||
return this.genDir() + '/' + 'messages.' + lang + '.' + this.suffixForGeneratedI18nFile(); | ||
} | ||
private suffixForGeneratedI18nFile(): string { | ||
switch (this.i18nFormat()) { | ||
case 'xlf': | ||
return 'xlf'; | ||
case 'xlf2': | ||
return 'xlf'; | ||
case 'xmb': | ||
return 'xtb'; | ||
} | ||
} | ||
/** | ||
@@ -290,0 +300,0 @@ * potentially to be generated translate-File for ngx-translate with the translations for one language. |
@@ -9,3 +9,3 @@ import * as program from 'commander'; | ||
import {isNullOrUndefined} from 'util'; | ||
import {ITranslationMessagesFile, ITransUnit} from 'ngx-i18nsupport-lib'; | ||
import {ITranslationMessagesFile, ITransUnit, FORMAT_XMB, FORMAT_XTB} from 'ngx-i18nsupport-lib'; | ||
import {ProgramOptions, IConfigFile} from './i-xliff-merge-options'; | ||
@@ -194,3 +194,3 @@ import {NgxTranslateExtractor} from './ngx-translate-extractor'; | ||
if (this.parameters.supportNgxTranslate()) { | ||
let languageSpecificMessagesFile: ITranslationMessagesFile = TranslationMessagesFileReader.fromFile(this.parameters.i18nFormat(), languageXliffFile, this.parameters.encoding()); | ||
let languageSpecificMessagesFile: ITranslationMessagesFile = TranslationMessagesFileReader.fromFile(XliffMerge.translationFormat(this.parameters.i18nFormat()), languageXliffFile, this.parameters.encoding(), this.master.filename()); | ||
NgxTranslateExtractor.extract(languageSpecificMessagesFile, this.parameters.generatedNgxTranslateFile(lang)); | ||
@@ -208,13 +208,7 @@ } | ||
// copy master ... | ||
FileUtil.copy(this.parameters.i18nFile(), languageXliffFilePath); | ||
// and set target-language | ||
// and copy source to target if necessary | ||
let isDefaultLang: boolean = (lang == this.parameters.defaultLanguage()); | ||
let languageSpecificMessagesFile: ITranslationMessagesFile = this.master.createTranslationFileForLang(lang, languageXliffFilePath, isDefaultLang, this.parameters.useSourceAsTarget()); | ||
// read copy and set target-language | ||
let languageSpecificMessagesFile: ITranslationMessagesFile = TranslationMessagesFileReader.fromFile(this.parameters.i18nFormat(), languageXliffFilePath, this.parameters.encoding()); | ||
languageSpecificMessagesFile.setTargetLanguage(lang); | ||
// copy source to target if necessary | ||
let isDefaultLang: boolean = (lang == this.parameters.defaultLanguage()); | ||
languageSpecificMessagesFile.forEachTransUnit((transUnit: ITransUnit) => { | ||
languageSpecificMessagesFile.useSourceAsTarget(transUnit, isDefaultLang, this.parameters.useSourceAsTarget()); | ||
}); | ||
// write it to file | ||
@@ -229,2 +223,15 @@ TranslationMessagesFileReader.save(languageSpecificMessagesFile); | ||
/** | ||
* Map the input format to the format of the translation. | ||
* Normally they are the same but for xmb the translation format is xtb. | ||
* @param i18nFormat | ||
*/ | ||
private static translationFormat(i18nFormat: string): string { | ||
if (i18nFormat === FORMAT_XMB) { | ||
return FORMAT_XTB; | ||
} else { | ||
return i18nFormat; | ||
} | ||
} | ||
/** | ||
* Merge all | ||
@@ -236,6 +243,7 @@ * @param lang | ||
// read lang specific file | ||
let languageSpecificMessagesFile: ITranslationMessagesFile = TranslationMessagesFileReader.fromFile(this.parameters.i18nFormat(), languageXliffFilePath, this.parameters.encoding()); | ||
let languageSpecificMessagesFile: ITranslationMessagesFile = TranslationMessagesFileReader.fromFile(XliffMerge.translationFormat(this.parameters.i18nFormat()), languageXliffFilePath, this.parameters.encoding()); | ||
let isDefaultLang: boolean = (lang == this.parameters.defaultLanguage()); | ||
let newCount = 0; | ||
let correctSourceRefCount = 0; | ||
this.master.forEachTransUnit((masterTransUnit) => { | ||
@@ -245,5 +253,10 @@ let transUnit: ITransUnit = languageSpecificMessagesFile.transUnitWithId(masterTransUnit.id); | ||
// oops, no translation, must be a new key, so add it | ||
languageSpecificMessagesFile.useSourceAsTarget(masterTransUnit, isDefaultLang, this.parameters.useSourceAsTarget()); | ||
languageSpecificMessagesFile.addNewTransUnit(masterTransUnit); | ||
languageSpecificMessagesFile.importNewTransUnit(masterTransUnit, isDefaultLang, this.parameters.useSourceAsTarget()); | ||
newCount++; | ||
} else { | ||
// check for missing or changed source ref and add it if needed | ||
if (!this.areSourceReferencesEqual(masterTransUnit.sourceReferences(), transUnit.sourceReferences())) { | ||
transUnit.setSourceReferences(masterTransUnit.sourceReferences()); | ||
correctSourceRefCount++; | ||
} | ||
} | ||
@@ -254,2 +267,5 @@ }); | ||
} | ||
if (correctSourceRefCount > 0) { | ||
this.commandOutput.warn('transferred %s source references from master to "%s"', correctSourceRefCount, lang); | ||
} | ||
@@ -288,2 +304,25 @@ // remove all elements that are no longer used | ||
private areSourceReferencesEqual(ref1: {sourcefile: string; linenumber: number;}[], ref2: {sourcefile: string; linenumber: number;}[]): boolean { | ||
if ((isNullOrUndefined(ref1) && !isNullOrUndefined(ref2)) || (isNullOrUndefined(ref2) && !isNullOrUndefined(ref1))) { | ||
return false; | ||
} | ||
if (isNullOrUndefined(ref1) && isNullOrUndefined(ref2)) { | ||
return true; | ||
} | ||
// bot refs are set now, convert to set to compare them | ||
let set1: Set<string> = new Set<string>(); | ||
ref1.forEach((ref) => {set1.add(ref.sourcefile + ':' + ref.linenumber)}); | ||
let set2: Set<string> = new Set<string>(); | ||
ref2.forEach((ref) => {set2.add(ref.sourcefile + ':' + ref.linenumber)}); | ||
if (set1.size !== set2.size) { | ||
return false; | ||
} | ||
let match = true; | ||
set2.forEach((ref) => { | ||
if (!set1.has(ref)) { | ||
match = false; | ||
} | ||
}); | ||
return match; | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
449481
4.37%72
16.13%5085
5.61%6
50%+ Added
+ Added
- Removed
Updated