mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[IMP] translation contexts
A new directive t-tanslation-context and a new family of directives (of the form t-translation-context-...) are introduced to allow to translate terms in contexts. Set t-translation-context="fr" on a node makes every call of the translation function to be done with "fr" as seconde parameter when translating an attribute/content within that node or its children (if no closer t-translation-context directive is found). A directive t-translation-context-attr="fr" can be used on a node to target its attribute "attr". For example, if a div has an attribute title="a title", use t-translation-context-title="pt" will make "a title" to be translated in the context "pt". Note that this takes precedence over any other directive t-translation-context found on a parent (or the div itself). The translation function is in charge of the interpretation of the context: OWL does not associate any meaning with a translation context.
This commit is contained in:
committed by
Géry Debongnie
parent
b365ea5c9c
commit
a9be149e1e
@@ -1,17 +1,28 @@
|
||||
# 🦉 Translations 🦉
|
||||
|
||||
If properly setup, Owl can translate all rendered templates. To do
|
||||
so, it needs a translate function, which takes a string and returns a string.
|
||||
so, it needs a translate function, which takes
|
||||
|
||||
- a string (the term to translate)
|
||||
- a string (the translation context of the term)
|
||||
and returns a string.
|
||||
|
||||
For example:
|
||||
|
||||
```js
|
||||
const translations = {
|
||||
hello: "bonjour",
|
||||
yes: "oui",
|
||||
no: "non",
|
||||
fr: {
|
||||
hello: "bonjour",
|
||||
yes: "oui",
|
||||
no: "non",
|
||||
},
|
||||
pt: {
|
||||
hello: "bom dia",
|
||||
yes: "sim",
|
||||
no: "não",
|
||||
},
|
||||
};
|
||||
const translateFn = (str) => translations[str] || str;
|
||||
const translateFn = (str, ctx) => translations[ctx]?.[str] || str;
|
||||
|
||||
const app = new App(Root, { templates, tranaslateFn });
|
||||
// ...
|
||||
@@ -27,6 +38,11 @@ Once setup, all rendered templates will be translated using `translateFn`:
|
||||
`placeholder`, `label` and `alt`,
|
||||
- translating text nodes can be disabled with the special attribute `t-translation`,
|
||||
if its value is `off`.
|
||||
- the translate function receives as second parameter a context that can be used
|
||||
to contextualized the translation. That context can be set globally on a node
|
||||
and its children by using `t-translation-context`. If a specific node
|
||||
attribute `x` needs another context, that context can be specified with a
|
||||
special directive `t-translation-context-x`.
|
||||
|
||||
So, with the above `translateFn`, the following templates:
|
||||
|
||||
@@ -46,6 +62,22 @@ will be rendered as:
|
||||
<input placeholder="bonjour" other="yes"/>
|
||||
```
|
||||
|
||||
and the following template:
|
||||
|
||||
```xml
|
||||
<div t-translation-context="fr" title="hello">hello</div>
|
||||
<div>Are you sure?</div>
|
||||
<input t-translation-context-placeholder="pt" placeholder="hello" other="yes"/>
|
||||
```
|
||||
|
||||
will be rendered as:
|
||||
|
||||
```xml
|
||||
<div title="bonjour">bonjour</div>
|
||||
<div>Are you sure?</div>
|
||||
<input placeholder="bom dia" other="yes"/>
|
||||
```
|
||||
|
||||
Note that the translation is done during the compilation of the template, not
|
||||
when it is rendered.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user