mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[IMP] compiler: translatableAttributes can be added/removed
This commit is contained in:
committed by
Michaël Mattiello
parent
9424312573
commit
5a7928d3e4
@@ -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...
|
||||||
|
```
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user