From 8464a1b04e7469434f9dcb3d68a543f58cb61b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Mon, 20 Sep 2021 16:51:20 +0200 Subject: [PATCH] [IMP] qweb: expose translatable attributes This commit allows owl users to add any attribute to the list of translatable attributes. closes #903 --- src/config.ts | 6 +++++- src/qweb/qweb.ts | 14 +++++++++++--- tests/qweb/__snapshots__/qweb.test.ts.snap | 14 ++++++++++++++ tests/qweb/qweb.test.ts | 13 +++++++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/config.ts b/src/config.ts index 5edc1c41..d31c3892 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,4 +1,5 @@ import { QWeb } from "./qweb/index"; +import { TRANSLATABLE_ATTRS } from "./qweb/qweb"; /** * This file creates and exports the OWL 'config' object, with keys: @@ -9,9 +10,12 @@ import { QWeb } from "./qweb/index"; interface Config { mode: string; enableTransitions: boolean; + translatableAttributes: string[]; } -export const config = {} as Config; +export const config = { + translatableAttributes: TRANSLATABLE_ATTRS, +} as Config; Object.defineProperty(config, "mode", { get() { diff --git a/src/qweb/qweb.ts b/src/qweb/qweb.ts index c2bb445e..fbcc9a93 100644 --- a/src/qweb/qweb.ts +++ b/src/qweb/qweb.ts @@ -66,7 +66,7 @@ interface QWebConfig { // Const/global stuff/helpers //------------------------------------------------------------------------------ -const TRANSLATABLE_ATTRS = ["label", "title", "placeholder", "alt"]; +export const TRANSLATABLE_ATTRS = ["label", "title", "placeholder", "alt"]; const lineBreakRE = /[\r\n]/; const whitespaceRE = /\s+/g; @@ -560,7 +560,11 @@ export class QWeb extends EventBus { } if (node.tagName !== "t" && node.hasAttribute("t-call")) { - const tCallNode = document.implementation.createDocument("http://www.w3.org/1999/xhtml", "t", null).documentElement; + const tCallNode = document.implementation.createDocument( + "http://www.w3.org/1999/xhtml", + "t", + null + ).documentElement; tCallNode.setAttribute("t-call", node.getAttribute("t-call")!); node.removeAttribute("t-call"); node.prepend(tCallNode); @@ -596,7 +600,11 @@ export class QWeb extends EventBus { throw new Error(`Unknown QWeb directive: '${attrName}'`); } if (node.tagName !== "t" && (attrName === "t-esc" || attrName === "t-raw")) { - const tNode = document.implementation.createDocument("http://www.w3.org/1999/xhtml", "t", null).documentElement; + const tNode = document.implementation.createDocument( + "http://www.w3.org/1999/xhtml", + "t", + null + ).documentElement; tNode.setAttribute(attrName, node.getAttribute(attrName)!); for (let child of Array.from(node.childNodes)) { tNode.appendChild(child); diff --git a/tests/qweb/__snapshots__/qweb.test.ts.snap b/tests/qweb/__snapshots__/qweb.test.ts.snap index 4d1f07ee..41de1d25 100644 --- a/tests/qweb/__snapshots__/qweb.test.ts.snap +++ b/tests/qweb/__snapshots__/qweb.test.ts.snap @@ -3943,6 +3943,20 @@ exports[`t-set value priority 1`] = ` }" `; +exports[`translation support can add additional attributes to the list of translatable attributes 1`] = ` +"function anonymous(context, extra +) { + // Template name: \\"test\\" + let h = this.h; + let _1 = 'word'; + let _2 = 'mot'; + let c3 = [], p3 = {key:3,attrs:{tomato: _1,potato: _2}}; + let vn3 = h('div', p3, c3); + c3.push({text: \`text\`}); + return vn3; +}" +`; + exports[`translation support can translate node content 1`] = ` "function anonymous(context, extra ) { diff --git a/tests/qweb/qweb.test.ts b/tests/qweb/qweb.test.ts index b87b9ec7..4aec9512 100644 --- a/tests/qweb/qweb.test.ts +++ b/tests/qweb/qweb.test.ts @@ -1,4 +1,5 @@ import { QWeb } from "../../src/qweb/index"; +import { config } from "../../src/index"; import { nextTick, normalize, renderToDOM, renderToString, trim } from "../helpers"; import { patch } from "../../src/vdom"; @@ -13,6 +14,7 @@ let qweb: QWeb; beforeEach(() => { QWeb.TEMPLATES = {}; + QWeb.nextId = 1; qweb = new QWeb(); }); @@ -2211,6 +2213,17 @@ describe("translation support", () => { ); }); + test("can add additional attributes to the list of translatable attributes", () => { + const translations = { + word: "mot", + }; + const translateFn = (expr) => translations[expr] || expr; + const qweb = new QWeb({ translateFn }); + config.translatableAttributes.push("potato"); + qweb.addTemplate("test", `
text
`); + expect(renderToString(qweb, "test")).toBe('
text
'); + }); + test("translation is done on the trimmed text, with extra spaces readded after", () => { const translations = { word: "mot",