extract-i18n does not respect the i18nDuplicateTranslation option
See original GitHub issueπ Bug report
Command (mark with an x
)
- new
- build
- serve
- test
- e2e
- generate
- add
- update
- lint
- extract-i18n
- run
- config
- help
- version
- doc
Is this a regression?
No
Description
Running the extract-i18n
command will always log duplicate i18n message IDs as warnings, regardless of the value of the i18nDuplicateTranslation
option in the build target.
π¬ Minimal Reproduction
This repository can be used to quickly reproduce this bug: https://github.com/reduckted/repro-extract-i18n-duplicates
Or using this archive: repro-extract-i18n-duplicates.zip
- Run
npm i
- Run
ng extract-i18n
The template app.component.html
contains two i18n messages with the same ID but different text. The angular.json
file has the i18nDuplicateTranslation
option set to "error"
in the browser builder.
The output is:
WARNINGS:
- Duplicate messages with id "test":
- "first" : src\app\app.component.html:1
- "second" : src\app\app.component.html:2
π₯ Exception or Error
I expect that with i18nDuplicateTranslation
set to "error"
, the duplicate message IDs will be logged as errors and that the process exits with a non-zero exit code.
Instead, the duplicate message IDs are logged as a warning, and the process exits with an exit code of zero.
π Your Environment
> ng version
_ _ ____ _ ___
/ \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|
/ β³ \ | '_ \ / _` | | | | |/ _` | '__| | | | | | |
/ ___ \| | | | (_| | |_| | | (_| | | | |___| |___ | |
/_/ \_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___|
|___/
Angular CLI: 14.1.0
Node: 16.12.0
Package Manager: npm 8.15.0
OS: win32 x64
Angular: 14.1.0
... animations, cli, common, compiler, compiler-cli, core, forms
... localize, platform-browser, platform-browser-dynamic, router
Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1401.0
@angular-devkit/build-angular 14.1.0
@angular-devkit/core 14.1.0
@angular-devkit/schematics 14.1.0
@schematics/angular 14.1.0
rxjs 7.5.6
typescript 4.7.4
Anything else relevant?
Looking at the code, it seems like this might be a simple fix. π€
The duplicate message IDs are checked here with a hard-coded value of βwarningβ and then always logged as warnings: https://github.com/angular/angular-cli/blob/1b89fd43400455366a3054f6ada10fb0dae5a209/packages/angular_devkit/build_angular/src/builders/extract-i18n/index.ts#L273-L283
Earlier in the same function, the browser target options are fetched here, which should contain the value of the i18nDuplicateTranslation
option:
https://github.com/angular/angular-cli/blob/1b89fd43400455366a3054f6ada10fb0dae5a209/packages/angular_devkit/build_angular/src/builders/extract-i18n/index.ts#L138-L141
Issue Analytics
- State:
- Created a year ago
- Reactions:5
- Comments:16 (3 by maintainers)
@reduckted, I donβt think our behavior needs to change there. Just like how no warning is emitted when the text matches, we donβt have to fail that case. My suggestion is to always error in the case where there are two messages with the same ID and different content.
On a separate point, if you have two locations where you want to use the same translations, I recommend using
$localize
instead at one place in your code and just binding it in two locations. That way you have a single source of truth and you donβt have to hard-code an ID anywhere.Just confirming my own thoughts here. With these files:
app.component.html
:test.component.html
:app.component.html
There are no warnings from
ng extract-i18n
and this is the output:However, if I add some whitespace to one of the values, for example:
Then you get a warning, which is 100% what I would expect (although it should be an error π)
So you can use the same ID in multiple templates. You just have to make sure they have the same text value. If they donβt have the same text value, then you absolutely should be alerted about it via an error.