mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
7ac81ed5fe
Before this commit, the parser would remove all consecutive white spaces for text nodes. After that, the code generator would call the translate function with the resulting string, which then is different than what we would expect. With this commit, we make sure we apply the translation before removing the additional whitespace. To do that, we have to move the code processing the string from the parser into the code generator, which actually makes sense, as the parser should only collect all useful information without applying too much logic. closes #1351
104 lines
3.1 KiB
TypeScript
104 lines
3.1 KiB
TypeScript
import { Component, mount, xml } from "../../src";
|
|
import { makeTestFixture, snapshotEverything } from "../helpers";
|
|
|
|
let fixture: HTMLElement;
|
|
|
|
snapshotEverything();
|
|
|
|
beforeEach(() => {
|
|
fixture = makeTestFixture();
|
|
});
|
|
|
|
describe("translation support", () => {
|
|
test("can translate node content", async () => {
|
|
class SomeComponent extends Component {
|
|
static template = xml`<div>word</div>`;
|
|
}
|
|
|
|
await mount(SomeComponent, fixture, {
|
|
translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
|
|
});
|
|
expect(fixture.innerHTML).toBe("<div>mot</div>");
|
|
});
|
|
|
|
test("does not translate node content if disabled", async () => {
|
|
class SomeComponent extends Component {
|
|
static template = xml`
|
|
<div>
|
|
<span>word</span>
|
|
<span t-translation="off">word</span>
|
|
</div>
|
|
`;
|
|
}
|
|
|
|
await mount(SomeComponent, fixture, {
|
|
translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
|
|
});
|
|
|
|
expect(fixture.innerHTML).toBe("<div><span>mot</span><span>word</span></div>");
|
|
});
|
|
|
|
test("some attributes are translated", async () => {
|
|
class SomeComponent extends Component {
|
|
static template = xml`
|
|
<div>
|
|
<p label="word">word</p>
|
|
<p title="word">word</p>
|
|
<p placeholder="word">word</p>
|
|
<p alt="word">word</p>
|
|
<p something="word">word</p>
|
|
</div>
|
|
`;
|
|
}
|
|
|
|
await mount(SomeComponent, fixture, {
|
|
translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
|
|
});
|
|
expect(fixture.innerHTML).toBe(
|
|
'<div><p label="mot">mot</p><p title="mot">mot</p><p placeholder="mot">mot</p><p alt="mot">mot</p><p something="word">mot</p></div>'
|
|
);
|
|
});
|
|
|
|
test("can set and remove translatable attributes", async () => {
|
|
class SomeComponent extends Component {
|
|
static template = xml`
|
|
<div tomato="word" potato="word" title="word" label="word">text</div>
|
|
`;
|
|
}
|
|
|
|
await mount(SomeComponent, fixture, {
|
|
translateFn: (expr: string) => (expr === "word" ? "mot" : expr),
|
|
translatableAttributes: ["potato", "-label"],
|
|
});
|
|
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 () => {
|
|
class SomeComponent extends Component {
|
|
static template = xml`
|
|
<div> word </div>
|
|
`;
|
|
}
|
|
|
|
const translateFn = jest.fn((expr: string) => (expr === "word" ? "mot" : expr));
|
|
|
|
await mount(SomeComponent, fixture, { translateFn });
|
|
expect(fixture.innerHTML).toBe("<div> mot </div>");
|
|
expect(translateFn).toHaveBeenCalledWith("word");
|
|
});
|
|
|
|
test("translation works, even if initial string has inner consecutive white space", async () => {
|
|
class SomeComponent extends Component {
|
|
static template = xml`<div>some word</div>`;
|
|
}
|
|
|
|
const translateFn = jest.fn((expr: string) => (expr === "some word" ? "un mot" : expr));
|
|
|
|
await mount(SomeComponent, fixture, { translateFn });
|
|
expect(translateFn).toHaveBeenCalledWith("some word");
|
|
expect(fixture.innerHTML).toBe("<div>un mot</div>");
|
|
});
|
|
});
|