import {DesugaringStep} from "./Conversion"; import {Utils} from "../../../Utils"; import Translations from "../../../UI/i18n/Translations"; export class AddContextToTranslations extends DesugaringStep { private readonly _prefix: string; constructor(prefix = "") { super("Adds a '_context' to every object that is probably a translation", ["_context"], "AddContextToTranslation"); this._prefix = prefix; } /** * const theme = { * layers: [ * { * builtin: ["abc"], * override: { * title:{ * en: "Some title" * } * } * } * ] * } * const rewritten = new AddContextToTranslations("prefix:").convert(theme, "context").result * const expected = { * layers: [ * { * builtin: ["abc"], * override: { * title:{ * _context: "prefix:context.layers.0.override.title" * en: "Some title" * } * } * } * ] * } * rewritten // => expected * * // should use the ID if one is present instead of the index * const theme = { * layers: [ * { * tagRenderings:[ * * {id: "some-tr", * question:{ * en:"Question?" * } * } * ] * } * ] * } * const rewritten = new AddContextToTranslations("prefix:").convert(theme, "context").result * const expected = { * layers: [ * { * tagRenderings:[ * * {id: "some-tr", * question:{ * _context: "prefix:context.layers.0.tagRenderings.some-tr.question" * en:"Question?" * } * } * ] * } * ] * } * rewritten // => expected * * // should preserve nulls * const theme = { * layers: [ * { * builtin: ["abc"], * override: { * name:null * } * } * ] * } * const rewritten = new AddContextToTranslations("prefix:").convert(theme, "context").result * const expected = { * layers: [ * { * builtin: ["abc"], * override: { * name: null * } * } * ] * } * rewritten // => expected * * * // Should ignore all if '#dont-translate' is set * const theme = { * "#dont-translate": "*", * layers: [ * { * builtin: ["abc"], * override: { * title:{ * en: "Some title" * } * } * } * ] * } * const rewritten = new AddContextToTranslations("prefix:").convert(theme, "context").result * rewritten // => theme * */ convert(json: T, context: string): { result: T; errors?: string[]; warnings?: string[]; information?: string[] } { if(json["#dont-translate"] === "*"){ return {result: json} } const result = Utils.WalkJson(json, (leaf, path) => { if(leaf === undefined || leaf === null){ return leaf } if (typeof leaf === "object") { // follow the path. If we encounter a number, check that there is no ID we can use instead let breadcrumb = json; for (let i = 0; i < path.length; i++) { const pointer = path[i] breadcrumb = breadcrumb[pointer] if(pointer.match("[0-9]+") && breadcrumb["id"] !== undefined){ path[i] = breadcrumb["id"] } } return {...leaf, _context: this._prefix + context + "." + path.join(".")} } else { return leaf } }, obj => obj === undefined || obj === null || Translations.isProbablyATranslation(obj)) return { result }; } }