ilib-tools-common 1.19.1 → 1.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/ResourceXliff.js +1 -1
- package/lib/ResourceXliff.js.map +1 -1
- package/package.json +6 -6
- package/src/Resource.js +88 -4
- package/src/ResourceXliff.js +4 -2
- package/src/index.js +3 -1
package/lib/ResourceXliff.js
CHANGED
|
@@ -42,7 +42,7 @@ return res.comment}}json.pluralForm=form;json.pluralFormOther=res.getKey();retur
|
|
|
42
42
|
* @param {string} [options.version] The version of xliff that will be produced by this instance. This
|
|
43
43
|
* may be either "1.2" or "2.0"
|
|
44
44
|
* @param {Xliff} [options.xliff] The xliff instance to use for this resource xliff instance.
|
|
45
|
-
*/function ResourceXliff(options){var _options$xliff
|
|
45
|
+
*/function ResourceXliff(options){var _options$xliff;_classCallCheck(this,ResourceXliff);if(options){this["tool-id"]=options["tool-id"];this["tool-name"]=options["tool-name"];this["tool-version"]=options["tool-version"];this["tool-company"]=options["tool-company"];this.copyright=options.copyright;this.path=options.path;this.sourceLocale=options.sourceLocale||"en-US";this.project=options.project;this.allowDups=options.allowDups;this.style=options.style||"standard";if(typeof options.version!=="undefined"){this.version=options.version}}this.sourceLocale=this.sourceLocale||"en-US";this.xliff=(_options$xliff=options===null||options===void 0?void 0:options.xliff)!==null&&_options$xliff!==void 0?_options$xliff:new _ilibXliff.Xliff(options);this.ts=new _TranslationSet["default"](this.sourceLocale)}/**
|
|
46
46
|
* Convert a resource into one or more translation units.
|
|
47
47
|
*
|
|
48
48
|
* @private
|
package/lib/ResourceXliff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceXliff.js","names":["_ilibXliff","require","_log4jsApi","_interopRequireDefault","_ResourceString","_ResourceArray","_ResourcePlural","_TranslationSet","_Location","_utils","e","__esModule","_typeof","o","Symbol","iterator","constructor","prototype","_classCallCheck","a","n","TypeError","_defineProperties","r","t","length","enumerable","configurable","writable","Object","defineProperty","_toPropertyKey","key","_createClass","i","_toPrimitive","toPrimitive","call","String","Number","logger","log4js","getLogger","generatePluralComment","res","sourcePlurals","form","json","comment","JSON","parse","pluralForm","pluralFormOther","getKey","stringify","ResourceXliff","options","_options$xliff","_this","copyright","path","sourceLocale","project","allowDups","style","version","xliff","Xliff","ts","TranslationSet","getTranslationUnits","translationUnits","forEach","tu","add","convertTransUnit","value","convertResource","units","resType","TranslationUnit","file","getPath","getSourceLocale","source","getSource","targetLocale","getTargetLocale","target","getTarget","state","getState","id","getId","translated","context","datatype","flavor","getFlavor","undefined","translate","getDNT","location","getLocation","push","sarr","tarr","j","newtu","clone","ordinal","warn","sp","tp","isEmpty","p","quantity","other","ResourceString","pathName","Location","resfile","setTarget","arr","ResourceArray","addTargetItem","strings","ResourcePlural","addTargetPlural","setDNT","setPath","newPath","xml","tuList","deserialize","get","hashKey","addSourceItem","addSourcePlural","getResources","criteria","getAll","getBy","addResource","getText","size","resources","initialLength","instances","getInstances","concat","sort","left","right","index","clear","addTranslationUnits","serialize","getLines","getVersion","_default","exports","module","default"],"sources":["../src/ResourceXliff.js"],"sourcesContent":["/*\n * Xliff.js - convert an Xliff file into a set of resources and vice versa\n *\n * Copyright © 2022-2023, 2025 JEDLSoft\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Xliff, TranslationUnit } from 'ilib-xliff';\nimport log4js from \"@log4js-node/log4js-api\";\n\nimport ResourceString from './ResourceString.js';\nimport ResourceArray from './ResourceArray.js';\nimport ResourcePlural from './ResourcePlural.js';\nimport TranslationSet from './TranslationSet.js';\nimport Location from './Location.js';\nimport { isEmpty } from './utils.js';\n\nconst logger = log4js.getLogger(\"tools-common.ResourceXliff\");\n\nfunction generatePluralComment(res, sourcePlurals, form) {\n var json = {};\n\n if (res.comment) {\n try {\n // see if its json already. If so, we'll add to it\n json = JSON.parse(res.comment);\n } catch (e) {\n // not json, so just return it as is\n return res.comment;\n }\n }\n\n json.pluralForm = form;\n json.pluralFormOther = res.getKey();\n\n return JSON.stringify(json);\n}\n\n/**\n * @class a class that represents resources as an xliff file.\n */\nclass ResourceXliff {\n /**\n * Construct a new resource xliff instance. Operation of the instance\n * is controlled via the options. The options may be undefined, which represents a new,\n * clean Xliff instance.\n *\n * @constructor\n * @param {Object|undefined} options options to\n * initialize the file, or undefined for a new empty file\n * @param {string} [options.path] the path to the xliff file on disk\n * @param {string} [options.tool-id] the id of the tool that saved this xliff file\n * @param {string} [options.tool-name] the full name of the tool that saved this xliff file\n * @param {string} [options.tool-version] the version of the tool that save this xliff file\n * @param {string} [options.tool-company] the name of the company that made this tool\n * @param {string} [options.copyright] a copyright notice that you would like included into the xliff file\n * @param {string} [options.sourceLocale] specify the default source locale if a resource doesn't have a locale itself\n * @param {string} [options.allowDups] allow duplicate resources in the xliff. By default, dups are\n * filtered out. This option allows you to have trans-units that represent instances of the\n * same resource in the file with different metadata. For example, two instances of a\n * resource may have different comments which may both be useful to translators or\n * two instances of the same resource may have been extracted from different source files.\n * @param {string} [options.version] The version of xliff that will be produced by this instance. This\n * may be either \"1.2\" or \"2.0\"\n * @param {Xliff} [options.xliff] The xliff instance to use for this resource xliff instance.\n */\n constructor(options) {\n if (options) {\n this[\"tool-id\"] = options[\"tool-id\"];\n this[\"tool-name\"] = options[\"tool-name\"];\n this[\"tool-version\"] = options[\"tool-version\"];\n this[\"tool-company\"] = options[\"tool-company\"];\n this.copyright = options.copyright;\n this.path = options.path;\n this.sourceLocale = options.sourceLocale || \"en-US\";\n this.project = options.project;\n this.allowDups = options.allowDups;\n this.style = options.style || \"standard\";\n if (typeof(options.version) !== 'undefined') {\n this.version = options.version;\n }\n }\n this.sourceLocale = this.sourceLocale || \"en-US\";\n this.xliff = options?.xliff ?? new Xliff(options);\n this.ts = new TranslationSet(this.sourceLocale);\n\n if (this.xliff.getTranslationUnits().length) {\n const translationUnits = this.xliff.getTranslationUnits();\n translationUnits.forEach(tu => {\n this.ts.add(this.convertTransUnit(tu));\n });\n }\n }\n\n /**\n * Convert a resource into one or more translation units.\n *\n * @private\n * @param {Resource} res the resource to convert\n * @returns {Array.<TranslationUnit>} an array of translation units\n * that represent the resource\n */\n convertResource(res) {\n let units = [], tu;\n\n try {\n switch (res.resType) {\n case \"string\":\n tu = new TranslationUnit({\n project: res.project,\n key: res.getKey(),\n file: res.getPath(),\n sourceLocale: res.getSourceLocale(),\n source: res.getSource(),\n targetLocale: res.getTargetLocale(),\n target: res.getTarget(),\n state: res.getState(),\n id: res.getId(),\n translated: true,\n context: res.context,\n comment: res.comment,\n resType: res.resType,\n datatype: res.datatype,\n flavor: res.getFlavor ? res.getFlavor() : undefined,\n translate: !res.getDNT(),\n location: res.getLocation()\n });\n units.push(tu);\n break;\n\n case \"array\":\n const sarr = res.getSource();\n let tarr = res.getTarget();\n\n tu = new TranslationUnit({\n project: res.project,\n key: res.getKey(),\n file: res.getPath(),\n source: \" \",\n sourceLocale: res.getSourceLocale(),\n targetLocale: res.getTargetLocale(),\n state: res.getState(),\n id: res.getId(),\n translated: true,\n context: res.context,\n comment: res.comment,\n resType: res.resType,\n datatype: res.datatype,\n flavor: res.getFlavor ? res.getFlavor() : undefined,\n translate: !res.getDNT(),\n location: res.getLocation()\n });\n\n for (let j = 0; j < sarr.length; j++) {\n // only output array items that have a translation\n if (sarr[j]) {\n const newtu = tu.clone();\n newtu.source = sarr[j];\n newtu.ordinal = j;\n\n if (tarr && j < tarr.length && tarr[j]) {\n newtu.target = tarr[j];\n }\n\n newtu.ordinal = j;\n units.push(newtu);\n } else if (tarr[j]) {\n logger.warn(\"Translated array \" + res.getKey() + \" has no source string at index \" + j + \". Cannot translate. Resource is: \" + JSON.stringify(res, undefined, 4));\n }\n }\n break;\n\n case \"plural\":\n tu = new TranslationUnit({\n project: res.project,\n key: res.getKey(),\n file: res.getPath(),\n source: \" \",\n sourceLocale: res.getSourceLocale(),\n targetLocale: res.getTargetLocale(),\n state: res.getState(),\n id: res.getId(),\n translated: true,\n context: res.context,\n resType: res.resType,\n datatype: res.datatype,\n flavor: res.getFlavor ? res.getFlavor() : undefined,\n location: res.getLocation(),\n translate: !res.getDNT()\n });\n\n const sp = res.getSource();\n const tp = res.getTarget();\n\n if (!tp || isEmpty(tp)) {\n for (let p in sp) {\n const newtu = tu.clone();\n newtu.source = sp[p];\n newtu.quantity = p;\n newtu.comment = generatePluralComment(res, sp, p);\n units.push(newtu);\n }\n } else {\n for (let p in tp) {\n const newtu = tu.clone();\n newtu.source = sp[p] || sp.other;\n newtu.target = tp[p];\n newtu.quantity = p;\n newtu.comment = generatePluralComment(res, sp, p);\n units.push(newtu);\n }\n }\n break;\n }\n } catch (e) {\n logger.warn(e);\n logger.warn(JSON.stringify(res));\n logger.warn(\"Skipping that resource.\");\n }\n\n return units;\n }\n\n /**\n * Convert a translation unit to a new loctool resource.\n *\n * @private\n * @param {TranslationUnit} tu the translation to convert\n * @return {Resource} the corresponding resource\n */\n convertTransUnit(tu) {\n let res;\n\n switch (tu.resType) {\n default:\n res = new ResourceString({\n pathName: tu.file,\n project: tu.project,\n id: tu.id,\n key: tu.key,\n sourceLocale: tu.sourceLocale,\n source: tu.source,\n targetLocale: tu.targetLocale,\n context: tu.context,\n comment: tu.comment,\n resType: tu.resType,\n datatype: tu.datatype,\n state: tu.state,\n flavor: tu.flavor,\n location: new Location(tu.location),\n resfile: tu.resfile\n });\n\n if (tu.target) {\n res.setTarget(tu.target);\n }\n break;\n\n case \"array\":\n var arr = [];\n arr[tu.ordinal] = tu.source;\n res = new ResourceArray({\n pathName: tu.file,\n project: tu.project,\n id: tu.id,\n key: tu.key,\n sourceLocale: tu.sourceLocale,\n source: arr,\n targetLocale: tu.targetLocale,\n target: [],\n context: tu.context,\n comment: tu.comment,\n resType: tu.resType,\n datatype: tu.datatype,\n state: tu.state,\n flavor: tu.flavor,\n location: new Location(tu.location),\n resfile: tu.resfile\n });\n\n if (tu.target) {\n res.addTargetItem(tu.ordinal, tu.target);\n }\n break;\n\n case \"plural\":\n var strings = {};\n strings[tu.quantity] = tu.source;\n res = new ResourcePlural({\n pathName: tu.file,\n project: tu.project,\n id: tu.id,\n key: tu.key,\n sourceLocale: tu.sourceLocale,\n source: strings,\n targetLocale: tu.targetLocale,\n target: {},\n context: tu.context,\n comment: tu.comment,\n resType: tu.resType,\n datatype: tu.datatype,\n state: tu.state,\n flavor: tu.flavor,\n location: new Location(tu.location),\n resfile: tu.resfile\n });\n\n if (tu.target) {\n res.addTargetPlural(tu.quantity, tu.target);\n }\n break;\n }\n\n if (typeof(tu.translate) === \"boolean\") {\n res.setDNT(!tu.translate);\n }\n\n return res;\n }\n\n getPath() {\n return this.path;\n }\n\n setPath(newPath) {\n this.path = newPath;\n }\n\n /**\n * Parse the given xml and convert it into a set of resources.\n *\n * @param {string} xml the contents of the xliff file to parse\n * @returns {TranslationSet} the translation set that represents\n * the resources in the xliff file\n */\n parse(xml) {\n const tuList = this.xliff.deserialize(xml, this.path);\n let res;\n\n if (tuList) {\n for (var j = 0; j < tuList.length; j++) {\n const tu = tuList[j];\n\n switch (tu.resType) {\n default:\n res = this.convertTransUnit(tu);\n this.ts.add(res);\n break;\n\n case \"array\":\n res = this.ts.get(ResourceArray.hashKey(tu.project, tu.context, tu.targetLocale || tu.sourceLocale, tu.key));\n if (res) {\n // if it already exists, amend the existing resource instead of creating a new one\n res.addSourceItem(tu.ordinal, tu.source);\n if (tu.target) {\n res.addTargetItem(tu.ordinal, tu.target);\n }\n } else {\n res = this.convertTransUnit(tu);\n this.ts.add(res);\n }\n break;\n\n case \"plural\":\n res = this.ts.get(ResourcePlural.hashKey(tu.project, tu.context, tu.targetLocale || tu.sourceLocale, tu.key));\n if (res) {\n // if it already exists, amend the existing resource instead of creating a new one\n res.addSourcePlural(tu.quantity, tu.source);\n if (tu.target) {\n res.addTargetPlural(tu.quantity, tu.target);\n }\n } else {\n res = this.convertTransUnit(tu);\n this.ts.add(res);\n }\n break;\n }\n }\n }\n\n return this.ts;\n }\n\n getResources(criteria) {\n if (!criteria) return this.ts.getAll();\n return this.ts.getBy(criteria);\n }\n\n addResource(res) {\n if (!res) return;\n\n if (res.getTargetLocale() === this.sourceLocale || res.getTargetLocale() === \"en\") {\n // don't add this one... cannot translate TO the source locale!\n return;\n }\n\n this.ts.add(res);\n }\n\n getText() {\n let units = [];\n\n if (this.ts.size() > 0) {\n // first convert the resources into translation units\n let resources = this.ts.getAll();\n\n if (this.allowDups) {\n // only look at the initial set of resources\n const initialLength = resources.length;\n for (let i = 0; i < initialLength; i++) {\n const res = resources[i];\n const instances = res.getInstances();\n if (instances && instances.length) {\n resources = resources.concat(instances);\n resources[i].instances = undefined;\n }\n }\n }\n resources.sort(function(left, right) {\n if (typeof(left.index) === 'number' && typeof(right.index) === 'number') {\n return left.index - right.index;\n }\n if (typeof(left.id) === 'number' && typeof(right.id) === 'number') {\n return left.id - right.id;\n }\n // no ids and no indexes? Well, then don't rearrange\n return 0;\n });\n\n // now add the translations\n for (var i = 0; i < resources.length; i++) {\n var res = resources[i];\n if (res.getTargetLocale() !== this.sourceLocale) {\n units = units.concat(this.convertResource(res));\n }\n }\n }\n\n // start with no translation units in it\n this.xliff.clear();\n this.xliff.addTranslationUnits(units);\n\n return this.xliff.serialize(true);\n }\n\n /**\n * Return the number of lines in the xml representation of this file.\n *\n * @returns {Number} the number of lines in the xml\n */\n getLines() {\n return this.xliff.getLines();\n }\n\n /**\n * Return the number of resources in this resource xliff file.\n * @returns {Number} the number of resources in this file\n */\n size() {\n return this.ts.size();\n }\n\n /**\n * Get the version number of this file. Currently, it only supports\n * xliff v1.2 and v2.0.\n * @returns {String} the version number of the file\n */\n getVersion() {\n return this.version;\n }\n}\n\nexport default ResourceXliff;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ResourceXliff.js","names":["_ilibXliff","require","_log4jsApi","_interopRequireDefault","_ResourceString","_ResourceArray","_ResourcePlural","_TranslationSet","_Location","_utils","e","__esModule","_typeof","o","Symbol","iterator","constructor","prototype","_classCallCheck","a","n","TypeError","_defineProperties","r","t","length","enumerable","configurable","writable","Object","defineProperty","_toPropertyKey","key","_createClass","i","_toPrimitive","toPrimitive","call","String","Number","logger","log4js","getLogger","generatePluralComment","res","sourcePlurals","form","json","comment","JSON","parse","pluralForm","pluralFormOther","getKey","stringify","ResourceXliff","options","_options$xliff","copyright","path","sourceLocale","project","allowDups","style","version","xliff","Xliff","ts","TranslationSet","value","convertResource","units","tu","resType","TranslationUnit","file","getPath","getSourceLocale","source","getSource","targetLocale","getTargetLocale","target","getTarget","state","getState","id","getId","translated","context","datatype","flavor","getFlavor","undefined","translate","getDNT","location","getLocation","push","sarr","tarr","j","newtu","clone","ordinal","warn","sp","tp","isEmpty","p","quantity","other","convertTransUnit","ResourceString","pathName","Location","resfile","setTarget","arr","ResourceArray","addTargetItem","strings","ResourcePlural","addTargetPlural","setDNT","setPath","newPath","xml","tuList","deserialize","add","get","hashKey","addSourceItem","addSourcePlural","getResources","criteria","getAll","getBy","addResource","getText","size","resources","initialLength","instances","getInstances","concat","sort","left","right","index","clear","addTranslationUnits","serialize","getLines","getVersion","_default","exports","module","default"],"sources":["../src/ResourceXliff.js"],"sourcesContent":["/*\n * Xliff.js - convert an Xliff file into a set of resources and vice versa\n *\n * Copyright © 2022-2023, 2025 JEDLSoft\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Xliff, TranslationUnit } from 'ilib-xliff';\nimport log4js from \"@log4js-node/log4js-api\";\n\nimport ResourceString from './ResourceString.js';\nimport ResourceArray from './ResourceArray.js';\nimport ResourcePlural from './ResourcePlural.js';\nimport TranslationSet from './TranslationSet.js';\nimport Location from './Location.js';\nimport { isEmpty } from './utils.js';\n\nconst logger = log4js.getLogger(\"tools-common.ResourceXliff\");\n\nfunction generatePluralComment(res, sourcePlurals, form) {\n var json = {};\n\n if (res.comment) {\n try {\n // see if its json already. If so, we'll add to it\n json = JSON.parse(res.comment);\n } catch (e) {\n // not json, so just return it as is\n return res.comment;\n }\n }\n\n json.pluralForm = form;\n json.pluralFormOther = res.getKey();\n\n return JSON.stringify(json);\n}\n\n/**\n * @class a class that represents resources as an xliff file.\n */\nclass ResourceXliff {\n /**\n * Construct a new resource xliff instance. Operation of the instance\n * is controlled via the options. The options may be undefined, which represents a new,\n * clean Xliff instance.\n *\n * @constructor\n * @param {Object|undefined} options options to\n * initialize the file, or undefined for a new empty file\n * @param {string} [options.path] the path to the xliff file on disk\n * @param {string} [options.tool-id] the id of the tool that saved this xliff file\n * @param {string} [options.tool-name] the full name of the tool that saved this xliff file\n * @param {string} [options.tool-version] the version of the tool that save this xliff file\n * @param {string} [options.tool-company] the name of the company that made this tool\n * @param {string} [options.copyright] a copyright notice that you would like included into the xliff file\n * @param {string} [options.sourceLocale] specify the default source locale if a resource doesn't have a locale itself\n * @param {string} [options.allowDups] allow duplicate resources in the xliff. By default, dups are\n * filtered out. This option allows you to have trans-units that represent instances of the\n * same resource in the file with different metadata. For example, two instances of a\n * resource may have different comments which may both be useful to translators or\n * two instances of the same resource may have been extracted from different source files.\n * @param {string} [options.version] The version of xliff that will be produced by this instance. This\n * may be either \"1.2\" or \"2.0\"\n * @param {Xliff} [options.xliff] The xliff instance to use for this resource xliff instance.\n */\n constructor(options) {\n if (options) {\n this[\"tool-id\"] = options[\"tool-id\"];\n this[\"tool-name\"] = options[\"tool-name\"];\n this[\"tool-version\"] = options[\"tool-version\"];\n this[\"tool-company\"] = options[\"tool-company\"];\n this.copyright = options.copyright;\n this.path = options.path;\n this.sourceLocale = options.sourceLocale || \"en-US\";\n this.project = options.project;\n this.allowDups = options.allowDups;\n this.style = options.style || \"standard\";\n if (typeof(options.version) !== 'undefined') {\n this.version = options.version;\n }\n }\n this.sourceLocale = this.sourceLocale || \"en-US\";\n this.xliff = options?.xliff ?? new Xliff(options);\n this.ts = new TranslationSet(this.sourceLocale);\n }\n\n /**\n * Convert a resource into one or more translation units.\n *\n * @private\n * @param {Resource} res the resource to convert\n * @returns {Array.<TranslationUnit>} an array of translation units\n * that represent the resource\n */\n convertResource(res) {\n let units = [], tu;\n\n try {\n switch (res.resType) {\n case \"string\":\n tu = new TranslationUnit({\n project: res.project,\n key: res.getKey(),\n file: res.getPath(),\n sourceLocale: res.getSourceLocale(),\n source: res.getSource(),\n targetLocale: res.getTargetLocale(),\n target: res.getTarget(),\n state: res.getState(),\n id: res.getId(),\n translated: true,\n context: res.context,\n comment: res.comment,\n resType: res.resType,\n datatype: res.datatype,\n flavor: res.getFlavor ? res.getFlavor() : undefined,\n translate: !res.getDNT(),\n location: res.getLocation()\n });\n units.push(tu);\n break;\n\n case \"array\":\n const sarr = res.getSource();\n let tarr = res.getTarget();\n\n tu = new TranslationUnit({\n project: res.project,\n key: res.getKey(),\n file: res.getPath(),\n source: \" \",\n sourceLocale: res.getSourceLocale(),\n targetLocale: res.getTargetLocale(),\n state: res.getState(),\n id: res.getId(),\n translated: true,\n context: res.context,\n comment: res.comment,\n resType: res.resType,\n datatype: res.datatype,\n flavor: res.getFlavor ? res.getFlavor() : undefined,\n translate: !res.getDNT(),\n location: res.getLocation()\n });\n\n for (let j = 0; j < sarr.length; j++) {\n // only output array items that have a translation\n if (sarr[j]) {\n const newtu = tu.clone();\n newtu.source = sarr[j];\n newtu.ordinal = j;\n\n if (tarr && j < tarr.length && tarr[j]) {\n newtu.target = tarr[j];\n }\n\n newtu.ordinal = j;\n units.push(newtu);\n } else if (tarr[j]) {\n logger.warn(\"Translated array \" + res.getKey() + \" has no source string at index \" + j + \". Cannot translate. Resource is: \" + JSON.stringify(res, undefined, 4));\n }\n }\n break;\n\n case \"plural\":\n tu = new TranslationUnit({\n project: res.project,\n key: res.getKey(),\n file: res.getPath(),\n source: \" \",\n sourceLocale: res.getSourceLocale(),\n targetLocale: res.getTargetLocale(),\n state: res.getState(),\n id: res.getId(),\n translated: true,\n context: res.context,\n resType: res.resType,\n datatype: res.datatype,\n flavor: res.getFlavor ? res.getFlavor() : undefined,\n location: res.getLocation(),\n translate: !res.getDNT()\n });\n\n const sp = res.getSource();\n const tp = res.getTarget();\n\n if (!tp || isEmpty(tp)) {\n for (let p in sp) {\n const newtu = tu.clone();\n newtu.source = sp[p];\n newtu.quantity = p;\n newtu.comment = generatePluralComment(res, sp, p);\n units.push(newtu);\n }\n } else {\n for (let p in tp) {\n const newtu = tu.clone();\n newtu.source = sp[p] || sp.other;\n newtu.target = tp[p];\n newtu.quantity = p;\n newtu.comment = generatePluralComment(res, sp, p);\n units.push(newtu);\n }\n }\n break;\n }\n } catch (e) {\n logger.warn(e);\n logger.warn(JSON.stringify(res));\n logger.warn(\"Skipping that resource.\");\n }\n\n return units;\n }\n\n /**\n * Convert a translation unit to a new loctool resource.\n *\n * @private\n * @param {TranslationUnit} tu the translation to convert\n * @return {Resource} the corresponding resource\n */\n convertTransUnit(tu) {\n let res;\n\n switch (tu.resType) {\n default:\n res = new ResourceString({\n pathName: tu.file,\n project: tu.project,\n id: tu.id,\n key: tu.key,\n sourceLocale: tu.sourceLocale,\n source: tu.source,\n targetLocale: tu.targetLocale,\n context: tu.context,\n comment: tu.comment,\n resType: tu.resType,\n datatype: tu.datatype,\n state: tu.state,\n flavor: tu.flavor,\n location: new Location(tu.location),\n resfile: tu.resfile\n });\n\n if (tu.target) {\n res.setTarget(tu.target);\n }\n break;\n\n case \"array\":\n var arr = [];\n arr[tu.ordinal] = tu.source;\n res = new ResourceArray({\n pathName: tu.file,\n project: tu.project,\n id: tu.id,\n key: tu.key,\n sourceLocale: tu.sourceLocale,\n source: arr,\n targetLocale: tu.targetLocale,\n target: [],\n context: tu.context,\n comment: tu.comment,\n resType: tu.resType,\n datatype: tu.datatype,\n state: tu.state,\n flavor: tu.flavor,\n location: new Location(tu.location),\n resfile: tu.resfile\n });\n\n if (tu.target) {\n res.addTargetItem(tu.ordinal, tu.target);\n }\n break;\n\n case \"plural\":\n var strings = {};\n strings[tu.quantity] = tu.source;\n res = new ResourcePlural({\n pathName: tu.file,\n project: tu.project,\n id: tu.id,\n key: tu.key,\n sourceLocale: tu.sourceLocale,\n source: strings,\n targetLocale: tu.targetLocale,\n target: {},\n context: tu.context,\n comment: tu.comment,\n resType: tu.resType,\n datatype: tu.datatype,\n state: tu.state,\n flavor: tu.flavor,\n location: new Location(tu.location),\n resfile: tu.resfile\n });\n\n if (tu.target) {\n res.addTargetPlural(tu.quantity, tu.target);\n }\n break;\n }\n\n if (typeof(tu.translate) === \"boolean\") {\n res.setDNT(!tu.translate);\n }\n\n return res;\n }\n\n getPath() {\n return this.path;\n }\n\n setPath(newPath) {\n this.path = newPath;\n }\n\n /**\n * Parse the given xml and convert it into a set of resources.\n *\n * @param {string} xml the contents of the xliff file to parse\n * @returns {TranslationSet} the translation set that represents\n * the resources in the xliff file\n */\n parse(xml) {\n const tuList = this.xliff.deserialize(xml, this.path);\n let res;\n\n if (tuList) {\n for (var j = 0; j < tuList.length; j++) {\n const tu = tuList[j];\n\n switch (tu.resType) {\n default:\n res = this.convertTransUnit(tu);\n this.ts.add(res);\n break;\n\n case \"array\":\n res = this.ts.get(ResourceArray.hashKey(tu.project, tu.context, tu.targetLocale || tu.sourceLocale, tu.key));\n if (res) {\n // if it already exists, amend the existing resource instead of creating a new one\n res.addSourceItem(tu.ordinal, tu.source);\n if (tu.target) {\n res.addTargetItem(tu.ordinal, tu.target);\n }\n } else {\n res = this.convertTransUnit(tu);\n this.ts.add(res);\n }\n break;\n\n case \"plural\":\n res = this.ts.get(ResourcePlural.hashKey(tu.project, tu.context, tu.targetLocale || tu.sourceLocale, tu.key));\n if (res) {\n // if it already exists, amend the existing resource instead of creating a new one\n res.addSourcePlural(tu.quantity, tu.source);\n if (tu.target) {\n res.addTargetPlural(tu.quantity, tu.target);\n }\n } else {\n res = this.convertTransUnit(tu);\n this.ts.add(res);\n }\n break;\n }\n }\n }\n\n return this.ts;\n }\n\n getResources(criteria) {\n if (!criteria) return this.ts.getAll();\n return this.ts.getBy(criteria);\n }\n\n addResource(res) {\n if (!res) return;\n\n if (res.getTargetLocale() === this.sourceLocale || res.getTargetLocale() === \"en\") {\n // don't add this one... cannot translate TO the source locale!\n return;\n }\n\n this.ts.add(res);\n }\n\n getText() {\n let units = [];\n\n if (this.ts.size() > 0) {\n // first convert the resources into translation units\n let resources = this.ts.getAll();\n\n if (this.allowDups) {\n // only look at the initial set of resources\n const initialLength = resources.length;\n for (let i = 0; i < initialLength; i++) {\n const res = resources[i];\n const instances = res.getInstances();\n if (instances && instances.length) {\n resources = resources.concat(instances);\n resources[i].instances = undefined;\n }\n }\n }\n resources.sort(function(left, right) {\n if (typeof(left.index) === 'number' && typeof(right.index) === 'number') {\n return left.index - right.index;\n }\n if (typeof(left.id) === 'number' && typeof(right.id) === 'number') {\n return left.id - right.id;\n }\n // no ids and no indexes? Well, then don't rearrange\n return 0;\n });\n\n // now add the translations\n for (var i = 0; i < resources.length; i++) {\n var res = resources[i];\n if (res.getTargetLocale() !== this.sourceLocale) {\n units = units.concat(this.convertResource(res));\n }\n }\n }\n\n // start with no translation units in it\n this.xliff.clear();\n this.xliff.addTranslationUnits(units);\n\n return this.xliff.serialize(true);\n }\n\n /**\n * Return the number of lines in the xml representation of this file.\n *\n * @returns {Number} the number of lines in the xml\n */\n getLines() {\n return this.xliff.getLines();\n }\n\n /**\n * Return the number of resources in this resource xliff file.\n * @returns {Number} the number of resources in this file\n */\n size() {\n return this.ts.size();\n }\n\n /**\n * Get the version number of this file. Currently, it only supports\n * xliff v1.2 and v2.0.\n * @returns {String} the version number of the file\n */\n getVersion() {\n return this.version;\n }\n}\n\nexport default ResourceXliff;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ilib-tools-common",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.1",
|
|
4
4
|
"main": "./lib/index.js",
|
|
5
5
|
"module": "./src/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"url": "https://github.com/iLib-js/ilib-mono.git"
|
|
51
51
|
},
|
|
52
52
|
"engines": {
|
|
53
|
-
"node": ">=
|
|
53
|
+
"node": ">=12 <23"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@babel/core": "^7.24.5",
|
|
@@ -78,13 +78,13 @@
|
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
80
|
"@log4js-node/log4js-api": "^1.0.2",
|
|
81
|
-
"ilib-xliff-webos": "^1.0.
|
|
81
|
+
"ilib-xliff-webos": "^1.0.5",
|
|
82
82
|
"intl-messageformat": "^10.7.11",
|
|
83
83
|
"micromatch": "^4.0.8",
|
|
84
|
-
"ilib-
|
|
85
|
-
"ilib-istring": "^1.1.1",
|
|
84
|
+
"ilib-xliff": "^1.4.1",
|
|
86
85
|
"ilib-locale": "^1.2.4",
|
|
87
|
-
"ilib-
|
|
86
|
+
"ilib-ctype": "^1.3.0",
|
|
87
|
+
"ilib-istring": "^1.1.1"
|
|
88
88
|
},
|
|
89
89
|
"scripts": {
|
|
90
90
|
"build": "pnpm build:data ; pnpm build:prod",
|
package/src/Resource.js
CHANGED
|
@@ -18,11 +18,91 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
const validStates = {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
21
|
+
// XLIFF 2.0 standard states
|
|
22
|
+
// https://docs.oasis-open.org/xliff/xliff-core/v2.0/xliff-core-v2.0.html
|
|
23
|
+
"initial": true,
|
|
24
|
+
"translated": true,
|
|
25
|
+
"reviewed": true,
|
|
26
|
+
"final": true,
|
|
27
|
+
|
|
28
|
+
// XLIFF 1.2 standard states
|
|
29
|
+
// from https://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html
|
|
30
|
+
"new": true,
|
|
31
|
+
"needs-translation": true,
|
|
32
|
+
"needs-adaptation": true,
|
|
33
|
+
"needs-l10n": true,
|
|
34
|
+
"needs-review-translation": true,
|
|
35
|
+
"needs-review-adaptation": true,
|
|
36
|
+
"needs-review-l10n": true,
|
|
37
|
+
"signed-off": true,
|
|
38
|
+
|
|
39
|
+
// Additional common states used in practice
|
|
40
|
+
"needs-review": true,
|
|
41
|
+
"fuzzy": true,
|
|
42
|
+
"accepted": true,
|
|
43
|
+
"rejected": true,
|
|
44
|
+
"approved": true,
|
|
45
|
+
"needs-approval": true
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Array of all valid state names that can be used with Resource objects.
|
|
50
|
+
* This array is sorted alphabetically and includes states from:
|
|
51
|
+
* - XLIFF 2.0 standard states
|
|
52
|
+
* - XLIFF 1.2 standard states
|
|
53
|
+
* - Additional common states used in practice
|
|
54
|
+
*
|
|
55
|
+
* Custom states with "x-" prefix are also valid but not included in this array.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* // Check if a state is valid
|
|
59
|
+
* if (VALID_STATES.includes(state)) {
|
|
60
|
+
* console.log('Valid state');
|
|
61
|
+
* }
|
|
62
|
+
*
|
|
63
|
+
* @type {string[]}
|
|
64
|
+
* @since 1.19.0
|
|
65
|
+
*/
|
|
66
|
+
export const VALID_STATES = Object.keys(validStates).sort();
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Check if a state is valid according to XLIFF 1.2 or 2.0 specification
|
|
70
|
+
* or if the state is used with ilib projects.
|
|
71
|
+
*
|
|
72
|
+
* @param {string} state the state to validate
|
|
73
|
+
* @returns {boolean} true if the state is valid, false otherwise
|
|
74
|
+
* @since 1.19.0
|
|
75
|
+
*/
|
|
76
|
+
function isValidState(state) {
|
|
77
|
+
// Must be a string
|
|
78
|
+
if (typeof state !== 'string') {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Empty string is invalid
|
|
83
|
+
if (state.length === 0) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Check predefined states first
|
|
88
|
+
if (validStates[state]) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Custom states must start with "x-" and have content after the hyphen
|
|
93
|
+
if (state.startsWith('x-')) {
|
|
94
|
+
// Must have non-whitespace content after "x-"
|
|
95
|
+
const contentAfterX = state.substring(2);
|
|
96
|
+
if (contentAfterX.trim().length > 0) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return false;
|
|
24
102
|
}
|
|
25
103
|
|
|
104
|
+
export { isValidState };
|
|
105
|
+
|
|
26
106
|
const translationImportant = [
|
|
27
107
|
"context",
|
|
28
108
|
"datatype",
|
|
@@ -302,9 +382,13 @@ class Resource {
|
|
|
302
382
|
* "translated", or "accepted".
|
|
303
383
|
*
|
|
304
384
|
* @param {string} state the state of this resource
|
|
385
|
+
* @throws {Error} if the state is invalid
|
|
305
386
|
*/
|
|
306
387
|
setState(state) {
|
|
307
|
-
|
|
388
|
+
if (!isValidState(state)) {
|
|
389
|
+
throw new Error(`Attempt to set an invalid state on a resource: "${state}". Valid states are: ${VALID_STATES.join(', ')}, or custom states starting with "x-"`);
|
|
390
|
+
}
|
|
391
|
+
this.state = state;
|
|
308
392
|
this.dirty = true;
|
|
309
393
|
}
|
|
310
394
|
|
package/src/ResourceXliff.js
CHANGED
|
@@ -135,7 +135,8 @@ class ResourceXliff {
|
|
|
135
135
|
datatype: res.datatype,
|
|
136
136
|
flavor: res.getFlavor ? res.getFlavor() : undefined,
|
|
137
137
|
translate: !res.getDNT(),
|
|
138
|
-
location: res.getLocation()
|
|
138
|
+
location: res.getLocation(),
|
|
139
|
+
metadata: res.metadata
|
|
139
140
|
});
|
|
140
141
|
units.push(tu);
|
|
141
142
|
break;
|
|
@@ -260,7 +261,8 @@ class ResourceXliff {
|
|
|
260
261
|
state: tu.state,
|
|
261
262
|
flavor: tu.flavor,
|
|
262
263
|
location: new Location(tu.location),
|
|
263
|
-
resfile: tu.resfile
|
|
264
|
+
resfile: tu.resfile,
|
|
265
|
+
metadata: tu.metadata
|
|
264
266
|
});
|
|
265
267
|
|
|
266
268
|
if (tu.target) {
|
package/src/index.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import Resource from './Resource.js';
|
|
20
|
+
import Resource, { VALID_STATES, isValidState } from './Resource.js';
|
|
21
21
|
import ResourceString from './ResourceString.js';
|
|
22
22
|
import ResourceArray from './ResourceArray.js';
|
|
23
23
|
import ResourcePlural from './ResourcePlural.js';
|
|
@@ -49,6 +49,8 @@ import {
|
|
|
49
49
|
|
|
50
50
|
export {
|
|
51
51
|
Resource,
|
|
52
|
+
VALID_STATES,
|
|
53
|
+
isValidState,
|
|
52
54
|
ResourceString,
|
|
53
55
|
ResourceArray,
|
|
54
56
|
ResourcePlural,
|