Skip to content

Commit fea0498

Browse files
committed
feat(@angular-devkit/build-angular): expose i18nDuplicateTranslation option of browser and server builders
Part of #22201
1 parent f7628da commit fea0498

File tree

10 files changed

+41
-5
lines changed

10 files changed

+41
-5
lines changed

goldens/public-api/angular_devkit/build_angular/src/index.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ export interface BrowserBuilderOptions {
4343
deployUrl?: string;
4444
extractLicenses?: boolean;
4545
fileReplacements?: FileReplacement[];
46-
i18nMissingTranslation?: I18NMissingTranslation;
46+
i18nDuplicateTranslation?: I18NTranslation;
47+
i18nMissingTranslation?: I18NTranslation;
4748
index: IndexUnion;
4849
inlineStyleLanguage?: InlineStyleLanguage;
4950
localize?: Localize;
@@ -259,7 +260,8 @@ export interface ServerBuilderOptions {
259260
externalDependencies?: string[];
260261
extractLicenses?: boolean;
261262
fileReplacements?: FileReplacement_3[];
262-
i18nMissingTranslation?: I18NMissingTranslation_2;
263+
i18nDuplicateTranslation?: I18NTranslation_2;
264+
i18nMissingTranslation?: I18NTranslation_2;
263265
inlineStyleLanguage?: InlineStyleLanguage_3;
264266
localize?: Localize_2;
265267
main: string;

packages/angular_devkit/build_angular/src/babel/presets/application.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export interface ApplicationPresetOptions {
3535
i18n?: {
3636
locale: string;
3737
missingTranslationBehavior?: 'error' | 'warning' | 'ignore';
38+
duplicateTranslationBehavior?: 'error' | 'warning' | 'ignore';
3839
translation?: unknown;
3940
pluginCreators?: I18nPluginCreators;
4041
};
@@ -108,6 +109,7 @@ function createI18nPlugins(
108109
locale: string,
109110
translation: unknown | undefined,
110111
missingTranslationBehavior: 'error' | 'warning' | 'ignore',
112+
duplicateTranslationBehavior: 'error' | 'warning' | 'ignore',
111113
diagnosticReporter: DiagnosticReporter | undefined,
112114
// TODO_ESM: Make `pluginCreators` required once `@angular/localize` is published with the `tools` entry point
113115
pluginCreators: I18nPluginCreators | undefined,
@@ -125,6 +127,7 @@ function createI18nPlugins(
125127
plugins.push(
126128
makeEs2015TranslatePlugin(diagnostics, translation, {
127129
missingTranslation: missingTranslationBehavior,
130+
duplicateTranslation: duplicateTranslationBehavior,
128131
}),
129132
);
130133

@@ -137,6 +140,7 @@ function createI18nPlugins(
137140
plugins.push(
138141
makeEs5TranslatePlugin(diagnostics, translation, {
139142
missingTranslation: missingTranslationBehavior,
143+
duplicateTranslation: duplicateTranslationBehavior,
140144
}),
141145
);
142146
}
@@ -208,11 +212,18 @@ export default function (api: unknown, options: ApplicationPresetOptions) {
208212
}
209213

210214
if (options.i18n) {
211-
const { locale, missingTranslationBehavior, pluginCreators, translation } = options.i18n;
215+
const {
216+
locale,
217+
missingTranslationBehavior,
218+
duplicateTranslationBehavior,
219+
pluginCreators,
220+
translation,
221+
} = options.i18n;
212222
const i18nPlugins = createI18nPlugins(
213223
locale,
214224
translation,
215225
missingTranslationBehavior || 'ignore',
226+
duplicateTranslationBehavior || 'ignore',
216227
options.diagnosticReporter,
217228
pluginCreators,
218229
);

packages/angular_devkit/build_angular/src/builders/browser/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ export function buildWebpackBrowser(
226226
webpackOutputPath,
227227
target <= ScriptTarget.ES5,
228228
options.i18nMissingTranslation,
229+
options.i18nDuplicateTranslation,
229230
);
230231
if (!success) {
231232
return { success: false };

packages/angular_devkit/build_angular/src/builders/browser/schema.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,12 @@
220220
"enum": ["warning", "error", "ignore"],
221221
"default": "warning"
222222
},
223+
"i18nDuplicateTranslation": {
224+
"type": "string",
225+
"description": "How to handle duplicate translations for i18n.",
226+
"enum": ["warning", "error", "ignore"],
227+
"default": "warning"
228+
},
223229
"localize": {
224230
"description": "Translate the bundles in one or more locales.",
225231
"oneOf": [

packages/angular_devkit/build_angular/src/builders/dev-server/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,16 +309,19 @@ async function setupLocalize(
309309
}
310310

311311
let missingTranslationBehavior = browserOptions.i18nMissingTranslation || 'ignore';
312+
let duplicateTranslationBehavior = browserOptions.i18nMissingTranslation || 'ignore';
312313
let translation = localeDescription?.translation || {};
313314

314315
if (locale === i18n.sourceLocale) {
315316
missingTranslationBehavior = 'ignore';
317+
duplicateTranslationBehavior = 'ignore';
316318
translation = {};
317319
}
318320

319321
const i18nLoaderOptions = {
320322
locale,
321323
missingTranslationBehavior,
324+
duplicateTranslationBehavior,
322325
translation: i18n.shouldInline ? translation : undefined,
323326
};
324327

packages/angular_devkit/build_angular/src/builders/server/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export function execute(
111111
outputPath,
112112
target <= ScriptTarget.ES5,
113113
options.i18nMissingTranslation,
114+
options.i18nDuplicateTranslation,
114115
);
115116
}
116117

packages/angular_devkit/build_angular/src/builders/server/schema.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,12 @@
133133
"enum": ["warning", "error", "ignore"],
134134
"default": "warning"
135135
},
136+
"i18nDuplicateTranslation": {
137+
"type": "string",
138+
"description": "How to handle duplicate translations for i18n.",
139+
"enum": ["warning", "error", "ignore"],
140+
"default": "warning"
141+
},
136142
"localize": {
137143
"description": "Translate the bundles in one or more locales.",
138144
"oneOf": [

packages/angular_devkit/build_angular/src/utils/build-options.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
Budget,
1414
CrossOrigin,
1515
ExtraEntryPoint,
16-
I18NMissingTranslation,
16+
I18NTranslation,
1717
IndexUnion,
1818
InlineStyleLanguage,
1919
Localize,
@@ -38,7 +38,8 @@ export interface BuildOptions {
3838
verbose?: boolean;
3939
progress?: boolean;
4040
localize?: Localize;
41-
i18nMissingTranslation?: I18NMissingTranslation;
41+
i18nMissingTranslation?: I18NTranslation;
42+
i18nDuplicateTranslation?: I18NTranslation;
4243
bundleDependencies?: boolean;
4344
externalDependencies?: string[];
4445
watch?: boolean;

packages/angular_devkit/build_angular/src/utils/i18n-inlining.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ function emittedFilesToInlineOptions(
2323
outputPath: string,
2424
es5: boolean,
2525
missingTranslation: 'error' | 'warning' | 'ignore' | undefined,
26+
duplicateTranslation: 'error' | 'warning' | 'ignore' | undefined,
2627
context: BuilderContext,
2728
): { options: InlineOptions[]; originalFiles: string[] } {
2829
const options: InlineOptions[] = [];
@@ -43,6 +44,7 @@ function emittedFilesToInlineOptions(
4344
es5,
4445
outputPath,
4546
missingTranslation,
47+
duplicateTranslation,
4648
setLocale: emittedFile.name === 'main' || emittedFile.name === 'vendor',
4749
};
4850
originalFiles.push(originalPath);
@@ -93,6 +95,7 @@ export async function i18nInlineEmittedFiles(
9395
emittedPath: string,
9496
es5: boolean,
9597
missingTranslation: 'error' | 'warning' | 'ignore' | undefined,
98+
duplicateTranslation: 'error' | 'warning' | 'ignore' | undefined,
9699
): Promise<boolean> {
97100
const executor = new BundleActionExecutor({ i18n });
98101
let hasErrors = false;
@@ -107,6 +110,7 @@ export async function i18nInlineEmittedFiles(
107110
baseOutputPath,
108111
es5,
109112
missingTranslation,
113+
duplicateTranslation,
110114
context,
111115
);
112116

packages/angular_devkit/build_angular/src/utils/process-bundle.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ export interface InlineOptions {
115115
es5: boolean;
116116
outputPath: string;
117117
missingTranslation?: 'warning' | 'error' | 'ignore';
118+
duplicateTranslation?: 'warning' | 'error' | 'ignore';
118119
setLocale?: boolean;
119120
}
120121

0 commit comments

Comments
 (0)