diff --git a/src/compiler/code_generator.ts b/src/compiler/code_generator.ts
index d56bbb2b..3c0d6498 100644
--- a/src/compiler/code_generator.ts
+++ b/src/compiler/code_generator.ts
@@ -447,6 +447,11 @@ export class CodeGenerator {
.join("");
}
+ translate(str: string): string {
+ const match = translationRE.exec(str) as any;
+ return match[1] + this.translateFn(match[2]) + match[3];
+ }
+
/**
* @returns the newly created block name, if any
*/
@@ -527,8 +532,7 @@ export class CodeGenerator {
let value = ast.value;
if (value && ctx.translate !== false) {
- const match = translationRE.exec(value) as any;
- value = match[1] + this.translateFn(match[2]) + match[3];
+ value = this.translate(value);
}
if (!ctx.inPreTag) {
value = value.replace(whitespaceRE, " ");
@@ -1095,10 +1099,11 @@ export class CodeGenerator {
} else {
let value: string;
if (ast.defaultValue) {
+ const defaultValue = ctx.translate ? this.translate(ast.defaultValue) : ast.defaultValue;
if (ast.value) {
- value = `withDefault(${expr}, \`${ast.defaultValue}\`)`;
+ value = `withDefault(${expr}, \`${defaultValue}\`)`;
} else {
- value = `\`${ast.defaultValue}\``;
+ value = `\`${defaultValue}\``;
}
} else {
value = expr;
diff --git a/tests/compiler/__snapshots__/translation.test.ts.snap b/tests/compiler/__snapshots__/translation.test.ts.snap
index f40bedda..6e493cb3 100644
--- a/tests/compiler/__snapshots__/translation.test.ts.snap
+++ b/tests/compiler/__snapshots__/translation.test.ts.snap
@@ -1,5 +1,79 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`translation support body of t-sets are translated 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+ let { isBoundary, withDefault, setContextValue } = helpers;
+
+ return function template(ctx, node, key = \\"\\") {
+ ctx = Object.create(ctx);
+ ctx[isBoundary] = 1
+ setContextValue(ctx, \\"label\\", \`translated\`);
+ return text(ctx['label']);
+ }
+}"
+`;
+
+exports[`translation support body of t-sets inside translation=off are not translated 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+ let { isBoundary, withDefault, setContextValue } = helpers;
+
+ return function template(ctx, node, key = \\"\\") {
+ ctx = Object.create(ctx);
+ ctx[isBoundary] = 1
+ setContextValue(ctx, \\"label\\", \`untranslated\`);
+ return text(ctx['label']);
+ }
+}"
+`;
+
+exports[`translation support body of t-sets with html content are translated 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+ let { isBoundary, withDefault, LazyValue, safeOutput } = helpers;
+
+ let block1 = createBlock(\`
translated
\`);
+
+ function value1(ctx, node, key = \\"\\") {
+ return block1();
+ }
+
+ return function template(ctx, node, key = \\"\\") {
+ ctx = Object.create(ctx);
+ ctx[isBoundary] = 1
+ ctx[\`label\`] = new LazyValue(value1, ctx, this, node, key);
+ return safeOutput(ctx['label']);
+ }
+}"
+`;
+
+exports[`translation support body of t-sets with text and html content are translated 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+ let { isBoundary, withDefault, LazyValue, safeOutput } = helpers;
+
+ let block3 = createBlock(\`translated
\`);
+
+ function value1(ctx, node, key = \\"\\") {
+ const b2 = text(\` translated \`);
+ const b3 = block3();
+ return multi([b2, b3]);
+ }
+
+ return function template(ctx, node, key = \\"\\") {
+ ctx = Object.create(ctx);
+ ctx[isBoundary] = 1
+ ctx[\`label\`] = new LazyValue(value1, ctx, this, node, key);
+ return safeOutput(ctx['label']);
+ }
+}"
+`;
+
exports[`translation support can set and remove translatable attributes 1`] = `
"function anonymous(app, bdom, helpers
) {
@@ -52,6 +126,21 @@ exports[`translation support some attributes are translated 1`] = `
}"
`;
+exports[`translation support t-set and falsy t-value: t-body are translated 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+ let { isBoundary, withDefault, setContextValue } = helpers;
+
+ return function template(ctx, node, key = \\"\\") {
+ ctx = Object.create(ctx);
+ ctx[isBoundary] = 1
+ setContextValue(ctx, \\"label\\", withDefault(false, \`translated\`));
+ return text(ctx['label']);
+ }
+}"
+`;
+
exports[`translation support translation is done on the trimmed text, with extra spaces readded after 1`] = `
"function anonymous(app, bdom, helpers
) {
diff --git a/tests/compiler/translation.test.ts b/tests/compiler/translation.test.ts
index 71dc6ba6..852f8d21 100644
--- a/tests/compiler/translation.test.ts
+++ b/tests/compiler/translation.test.ts
@@ -100,4 +100,74 @@ describe("translation support", () => {
expect(translateFn).toHaveBeenCalledWith("some word");
expect(fixture.innerHTML).toBe("un mot
");
});
+
+ test("body of t-sets are translated", async () => {
+ class SomeComponent extends Component {
+ static template = xml`
+ untranslated
+ `;
+ }
+
+ const translateFn = () => "translated";
+
+ await mount(SomeComponent, fixture, { translateFn });
+ expect(fixture.innerHTML).toBe("translated");
+ });
+
+ test("body of t-sets inside translation=off are not translated", async () => {
+ class SomeComponent extends Component {
+ static template = xml`
+
+ untranslated
+
+ `;
+ }
+
+ const translateFn = () => "translated";
+
+ await mount(SomeComponent, fixture, { translateFn });
+ expect(fixture.innerHTML).toBe("untranslated");
+ });
+
+ test("body of t-sets with html content are translated", async () => {
+ class SomeComponent extends Component {
+ static template = xml`
+ untranslated
+ `;
+ }
+
+ const translateFn = () => "translated";
+
+ await mount(SomeComponent, fixture, { translateFn });
+ expect(fixture.innerHTML).toBe("translated
");
+ });
+
+ test("body of t-sets with text and html content are translated", async () => {
+ class SomeComponent extends Component {
+ static template = xml`
+
+ some text
+ untranslated
+
+ `;
+ }
+
+ const translateFn = () => "translated";
+
+ await mount(SomeComponent, fixture, { translateFn });
+ expect(fixture.innerHTML).toBe(" translated translated
");
+ });
+
+ test("t-set and falsy t-value: t-body are translated", async () => {
+ class SomeComponent extends Component {
+ static template = xml`
+ untranslated
+ `;
+ }
+
+ const translateFn = () => "translated";
+
+ await mount(SomeComponent, fixture, { translateFn });
+ expect(fixture.innerHTML).toBe("translated");
+ });
});