fix(compiler): use attribute id to merge translations (#15302)
We extracted ids from i18n attributes but forgot to use them when merging the translations, resulting in an error about missing translations even when they were correctly defined. Fixes #15234 PR Close #15302
This commit is contained in:
parent
16e0423085
commit
1d7693c1e1
@ -347,12 +347,13 @@ class _Visitor implements html.Visitor {
|
|||||||
// translate the attributes of an element and remove i18n specific attributes
|
// translate the attributes of an element and remove i18n specific attributes
|
||||||
private _translateAttributes(el: html.Element): html.Attribute[] {
|
private _translateAttributes(el: html.Element): html.Attribute[] {
|
||||||
const attributes = el.attrs;
|
const attributes = el.attrs;
|
||||||
const i18nAttributeMeanings: {[name: string]: string} = {};
|
const i18nParsedMessageMeta:
|
||||||
|
{[name: string]: {meaning: string, description: string, id: string}} = {};
|
||||||
|
|
||||||
attributes.forEach(attr => {
|
attributes.forEach(attr => {
|
||||||
if (attr.name.startsWith(_I18N_ATTR_PREFIX)) {
|
if (attr.name.startsWith(_I18N_ATTR_PREFIX)) {
|
||||||
i18nAttributeMeanings[attr.name.slice(_I18N_ATTR_PREFIX.length)] =
|
i18nParsedMessageMeta[attr.name.slice(_I18N_ATTR_PREFIX.length)] =
|
||||||
_parseMessageMeta(attr.value).meaning;
|
_parseMessageMeta(attr.value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -364,9 +365,9 @@ class _Visitor implements html.Visitor {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attr.value && attr.value != '' && i18nAttributeMeanings.hasOwnProperty(attr.name)) {
|
if (attr.value && attr.value != '' && i18nParsedMessageMeta.hasOwnProperty(attr.name)) {
|
||||||
const meaning = i18nAttributeMeanings[attr.name];
|
const {meaning, description, id} = i18nParsedMessageMeta[attr.name];
|
||||||
const message: i18n.Message = this._createI18nMessage([attr], meaning, '', '');
|
const message: i18n.Message = this._createI18nMessage([attr], meaning, description, id);
|
||||||
const nodes = this._translations.get(message);
|
const nodes = this._translations.get(message);
|
||||||
if (nodes) {
|
if (nodes) {
|
||||||
if (nodes.length == 0) {
|
if (nodes.length == 0) {
|
||||||
@ -377,12 +378,12 @@ class _Visitor implements html.Visitor {
|
|||||||
} else {
|
} else {
|
||||||
this._reportError(
|
this._reportError(
|
||||||
el,
|
el,
|
||||||
`Unexpected translation for attribute "${attr.name}" (id="${this._translations.digest(message)}")`);
|
`Unexpected translation for attribute "${attr.name}" (id="${id || this._translations.digest(message)}")`);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this._reportError(
|
this._reportError(
|
||||||
el,
|
el,
|
||||||
`Translation unavailable for attribute "${attr.name}" (id="${this._translations.digest(message)}")`);
|
`Translation unavailable for attribute "${attr.name}" (id="${id || this._translations.digest(message)}")`);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
translatedAttributes.push(attr);
|
translatedAttributes.push(attr);
|
||||||
|
@ -430,6 +430,11 @@ export function main() {
|
|||||||
expect(fakeTranslate(HTML)).toEqual('<p title="**foo**"></p>');
|
expect(fakeTranslate(HTML)).toEqual('<p title="**foo**"></p>');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should merge attributes with ids', () => {
|
||||||
|
const HTML = `<p i18n-title="@@id" title="foo"></p>`;
|
||||||
|
expect(fakeTranslate(HTML)).toEqual('<p title="**foo**"></p>');
|
||||||
|
});
|
||||||
|
|
||||||
it('should merge nested attributes', () => {
|
it('should merge nested attributes', () => {
|
||||||
const HTML = `<div>{count, plural, =0 {<p i18n-title title="foo"></p>}}</div>`;
|
const HTML = `<div>{count, plural, =0 {<p i18n-title title="foo"></p>}}</div>`;
|
||||||
expect(fakeTranslate(HTML))
|
expect(fakeTranslate(HTML))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user