[FIX] web: prevent double translations in views
Steps to reproduce ================== In 17: - Install hr_holidays,project - Switch the language to dutch - Go to project > three dots > Projectupdates We can see `x/y Genomen`, it should be `x/y Taken` Cause of the issue ================== The original term is Tasks. When loading the views, python translates them and changes Tasks to Taken. Owl then translates the template and transforms Taken to Genomen. Solution ======== Since the views are already translated, we don't need to translate them with owl. We can simply set the attribute t-translation to off on the view root node. opw-3787336 closes odoo/odoo#158627 X-original-commit: 454760e12145f8987e443d7776a614a5eb441feb Signed-off-by: Aaron Bohy (aab) <aab@odoo.com> Signed-off-by: Hubert Van De Walle <huvw@odoo.com>
This commit is contained in:
@@ -252,6 +252,7 @@ export class ViewCompiler {
|
||||
const root = this.templates[key].cloneNode(true);
|
||||
const child = this.compileNode(root, params);
|
||||
const newRoot = createElement("t", [child]);
|
||||
newRoot.setAttribute("t-translation", "off");
|
||||
return newRoot;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ QUnit.module("Form Compiler", (hooks) => {
|
||||
QUnit.test("properly compile simple div", async (assert) => {
|
||||
const arch = /*xml*/ `<form><div>lol</div></form>`;
|
||||
const expected = /*xml*/ `
|
||||
<t>
|
||||
<t t-translation="off">
|
||||
<div class="o_form_renderer o_form_nosheet" t-att-class="__comp__.props.class" t-attf-class="{{__comp__.props.record.isInEdition ? 'o_form_editable' : 'o_form_readonly'}} d-block {{ __comp__.props.record.dirty ? 'o_form_dirty' : !__comp__.props.record.isNew ? 'o_form_saved' : '' }}" t-ref="compiled_view_root">
|
||||
<div>lol</div>
|
||||
</div>
|
||||
@@ -52,7 +52,7 @@ QUnit.module("Form Compiler", (hooks) => {
|
||||
async (assert) => {
|
||||
const arch = /*xml*/ `<form><field field_id="test" name="test"/><label for="test" string=""/></form>`;
|
||||
const expected = /*xml*/ `
|
||||
<t>
|
||||
<t t-translation="off">
|
||||
<div class="o_form_renderer o_form_nosheet" t-att-class="__comp__.props.class" t-attf-class="{{__comp__.props.record.isInEdition ? 'o_form_editable' : 'o_form_readonly'}} d-block {{ __comp__.props.record.dirty ? 'o_form_dirty' : !__comp__.props.record.isNew ? 'o_form_saved' : '' }}" t-ref="compiled_view_root">
|
||||
<Field id="'test'" name="'test'" record="__comp__.props.record" fieldInfo="__comp__.props.archInfo.fieldNodes['test']" readonly="__comp__.props.archInfo.activeActions?.edit === false and !__comp__.props.record.isNew"/>
|
||||
<FormLabel id="'test'" fieldName="'test'" record="__comp__.props.record" fieldInfo="__comp__.props.archInfo.fieldNodes['test']" className="""" string="\`\`" />
|
||||
@@ -65,7 +65,7 @@ QUnit.module("Form Compiler", (hooks) => {
|
||||
QUnit.test("properly compile simple div with field", async (assert) => {
|
||||
const arch = /*xml*/ `<form><div class="someClass">lol<field field_id="display_name" name="display_name"/></div></form>`;
|
||||
const expected = /*xml*/ `
|
||||
<t>
|
||||
<t t-translation="off">
|
||||
<div class="o_form_renderer o_form_nosheet" t-att-class="__comp__.props.class" t-attf-class="{{__comp__.props.record.isInEdition ? 'o_form_editable' : 'o_form_readonly'}} d-block {{ __comp__.props.record.dirty ? 'o_form_dirty' : !__comp__.props.record.isNew ? 'o_form_saved' : '' }}" t-ref="compiled_view_root">
|
||||
<div class="someClass">
|
||||
lol
|
||||
@@ -120,7 +120,7 @@ QUnit.module("Form Compiler", (hooks) => {
|
||||
</group>
|
||||
</form>`;
|
||||
const expected = /*xml*/ `
|
||||
<t>
|
||||
<t t-translation="off">
|
||||
<div class="o_form_renderer o_form_nosheet" t-att-class="__comp__.props.class" t-attf-class="{{__comp__.props.record.isInEdition ? 'o_form_editable' : 'o_form_readonly'}} d-block {{ __comp__.props.record.dirty ? 'o_form_dirty' : !__comp__.props.record.isNew ? 'o_form_saved' : '' }}" t-ref="compiled_view_root">
|
||||
<OuterGroup>
|
||||
<t t-set-slot="item_0" type="'item'" sequence="0" t-slot-scope="scope" isVisible="true" itemSpan="1">
|
||||
@@ -183,7 +183,7 @@ QUnit.module("Form Compiler", (hooks) => {
|
||||
</form>`;
|
||||
|
||||
const expected = /*xml*/ `
|
||||
<t>
|
||||
<t t-translation="off">
|
||||
<div class="o_form_renderer o_form_nosheet" t-att-class="__comp__.props.class" t-attf-class="{{__comp__.props.record.isInEdition ? 'o_form_editable' : 'o_form_readonly'}} d-block {{ __comp__.props.record.dirty ? 'o_form_dirty' : !__comp__.props.record.isNew ? 'o_form_saved' : '' }}" t-ref="compiled_view_root">
|
||||
<div class="o_form_statusbar position-relative d-flex justify-content-between mb-0 mb-md-2 pb-2 pb-md-0"><StatusBarButtons/></div>
|
||||
<div>someDiv</div>
|
||||
@@ -205,7 +205,7 @@ QUnit.module("Form Compiler", (hooks) => {
|
||||
</form>`;
|
||||
|
||||
const expected = /*xml*/ `
|
||||
<t>
|
||||
<t t-translation="off">
|
||||
<div class="o_form_renderer" t-att-class="__comp__.props.class" t-attf-class="{{__comp__.props.record.isInEdition ? 'o_form_editable' : 'o_form_readonly'}} d-flex {{ __comp__.uiService.size < 6 ? "flex-column" : "flex-nowrap h-100" }} {{ __comp__.props.record.dirty ? 'o_form_dirty' : !__comp__.props.record.isNew ? 'o_form_saved' : '' }}" t-ref="compiled_view_root">
|
||||
<div class="o_form_sheet_bg">
|
||||
<div class="o_form_statusbar position-relative d-flex justify-content-between mb-0 mb-md-2 pb-2 pb-md-0"><StatusBarButtons/></div>
|
||||
@@ -233,7 +233,7 @@ QUnit.module("Form Compiler", (hooks) => {
|
||||
</form>`;
|
||||
|
||||
const expected = /*xml*/ `
|
||||
<t>
|
||||
<t t-translation="off">
|
||||
<div class="o_form_renderer"
|
||||
t-att-class="__comp__.props.class"
|
||||
t-attf-class="{{__comp__.props.record.isInEdition ? 'o_form_editable' : 'o_form_readonly'}} d-flex {{ __comp__.uiService.size < 6 ? "flex-column" : "flex-nowrap h-100" }} {{ __comp__.props.record.dirty ? 'o_form_dirty' : !__comp__.props.record.isNew ? 'o_form_saved' : '' }}"
|
||||
@@ -532,7 +532,7 @@ QUnit.module("Form Renderer", (hooks) => {
|
||||
|
||||
const arch = `<myNode invisible="field == 'value'" />`;
|
||||
|
||||
const expected = `<t><div class="myNode" t-if="( myCondition or myOtherCondition ) and !__comp__.evaluateBooleanExpr("field == 'value'",__comp__.props.record.evalContextWithVirtualIds)" t-ref="compiled_view_root"/></t>`;
|
||||
const expected = `<t t-translation="off"><div class="myNode" t-if="( myCondition or myOtherCondition ) and !__comp__.evaluateBooleanExpr("field == 'value'",__comp__.props.record.evalContextWithVirtualIds)" t-ref="compiled_view_root"/></t>`;
|
||||
assert.areEquivalent(compileTemplate(arch), expected);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -37,7 +37,7 @@ QUnit.module("Kanban Compiler", (hooks) => {
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>`;
|
||||
const expected = `<t>
|
||||
const expected = `<t t-translation="off">
|
||||
<kanban>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
|
||||
Reference in New Issue
Block a user