[IMP] compiler: translatableAttributes can be added/removed

This commit is contained in:
Géry Debongnie
2022-02-03 13:31:30 +01:00
committed by Michaël Mattiello
parent 9424312573
commit 5a7928d3e4
4 changed files with 32 additions and 9 deletions
+12 -1
View File
@@ -54,6 +54,17 @@ For example, one may want to also translate `data-title` attributes. To do that,
we can define additional attributes with the `translatableAttributes` option: we can define additional attributes with the `translatableAttributes` option:
```js ```js
const app = new App(Root, { templates, tranaslateFn, translatalbeAttributes: ["data-title"] }); const app = new App(Root, { templates, tranaslateFn, translatableAttributes: ["data-title"] });
// ... // ...
``` ```
It is also possible to remove an attribute from the default list by prefixing it with `-`:
```js
const app = new App(Root, {
templates,
tranaslateFn,
translatableAttributes: ["data-title", "-title"],
});
// data-title attribute will be translated, but not title attribute...
```
+12 -2
View File
@@ -214,14 +214,24 @@ export class CodeGenerator {
templateName?: string; templateName?: string;
dev: boolean; dev: boolean;
translateFn: (s: string) => string; translateFn: (s: string) => string;
translatableAttributes: string[]; translatableAttributes: string[] = TRANSLATABLE_ATTRS;
ast: AST; ast: AST;
staticCalls: { id: string; template: string }[] = []; staticCalls: { id: string; template: string }[] = [];
helpers: Set<string> = new Set(); helpers: Set<string> = new Set();
constructor(ast: AST, options: CodeGenOptions) { constructor(ast: AST, options: CodeGenOptions) {
this.translateFn = options.translateFn || ((s: string) => s); this.translateFn = options.translateFn || ((s: string) => s);
this.translatableAttributes = options.translatableAttributes || TRANSLATABLE_ATTRS; if (options.translatableAttributes) {
const attrs = new Set(TRANSLATABLE_ATTRS);
for (let attr of options.translatableAttributes) {
if (attr.startsWith("-")) {
attrs.delete(attr.slice(1));
} else {
attrs.add(attr);
}
}
this.translatableAttributes = [...attrs];
}
this.hasSafeContext = options.hasSafeContext || false; this.hasSafeContext = options.hasSafeContext || false;
this.dev = options.dev || false; this.dev = options.dev || false;
this.ast = ast; this.ast = ast;
@@ -1,11 +1,11 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP // Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`translation support can set translatable attributes 1`] = ` exports[`translation support can set and remove translatable attributes 1`] = `
"function anonymous(bdom, helpers "function anonymous(bdom, helpers
) { ) {
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom; let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
let block1 = createBlock(\`<div tomato=\\"word\\" potato=\\"mot\\" title=\\"word\\">text</div>\`); let block1 = createBlock(\`<div tomato=\\"word\\" potato=\\"mot\\" title=\\"mot\\" label=\\"word\\">text</div>\`);
return function template(ctx, node, key = \\"\\") { return function template(ctx, node, key = \\"\\") {
return block1(); return block1();
+6 -4
View File
@@ -59,18 +59,20 @@ describe("translation support", () => {
); );
}); });
test("can set translatable attributes", async () => { test("can set and remove translatable attributes", async () => {
class SomeComponent extends Component { class SomeComponent extends Component {
static template = xml` static template = xml`
<div tomato="word" potato="word" title="word">text</div> <div tomato="word" potato="word" title="word" label="word">text</div>
`; `;
} }
await mount(SomeComponent, fixture, { await mount(SomeComponent, fixture, {
translateFn: (expr: string) => (expr === "word" ? "mot" : expr), translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
translatableAttributes: ["potato"], translatableAttributes: ["potato", "-label"],
}); });
expect(fixture.innerHTML).toBe('<div tomato="word" potato="mot" title="word">text</div>'); expect(fixture.innerHTML).toBe(
'<div tomato="word" potato="mot" title="mot" label="word">text</div>'
);
}); });
test("translation is done on the trimmed text, with extra spaces readded after", async () => { test("translation is done on the trimmed text, with extra spaces readded after", async () => {