@o3r/transloco 0.0.0 → 14.5.0-prerelease.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +26 -0
- package/README.md +64 -0
- package/builders/helpers/localization-generator.d.ts +126 -0
- package/builders/helpers/localization-generator.d.ts.map +1 -0
- package/builders/helpers/localization-generator.js +303 -0
- package/builders/helpers/localization-generator.js.map +1 -0
- package/builders/i18n/index.d.ts +7 -0
- package/builders/i18n/index.d.ts.map +1 -0
- package/builders/i18n/index.js +39 -0
- package/builders/i18n/index.js.map +1 -0
- package/builders/i18n/schema.d.ts +30 -0
- package/builders/i18n/schema.d.ts.map +1 -0
- package/builders/i18n/schema.js +3 -0
- package/builders/i18n/schema.js.map +1 -0
- package/builders/i18n/schema.json +35 -0
- package/builders/localization/index.d.ts +23 -0
- package/builders/localization/index.d.ts.map +1 -0
- package/builders/localization/index.js +416 -0
- package/builders/localization/index.js.map +1 -0
- package/builders/localization/schema.d.ts +29 -0
- package/builders/localization/schema.d.ts.map +1 -0
- package/builders/localization/schema.js +3 -0
- package/builders/localization/schema.js.map +1 -0
- package/builders/localization/schema.json +78 -0
- package/builders/localization-extractor/index.d.ts +8 -0
- package/builders/localization-extractor/index.d.ts.map +1 -0
- package/builders/localization-extractor/index.js +181 -0
- package/builders/localization-extractor/index.js.map +1 -0
- package/builders/localization-extractor/schema.d.ts +25 -0
- package/builders/localization-extractor/schema.d.ts.map +1 -0
- package/builders/localization-extractor/schema.js +3 -0
- package/builders/localization-extractor/schema.js.map +1 -0
- package/builders/localization-extractor/schema.json +62 -0
- package/builders/localization-extractor/validations.d.ts +17 -0
- package/builders/localization-extractor/validations.d.ts.map +1 -0
- package/builders/localization-extractor/validations.js +54 -0
- package/builders/localization-extractor/validations.js.map +1 -0
- package/builders/metadata-check/helpers/index.d.ts +2 -0
- package/builders/metadata-check/helpers/index.d.ts.map +1 -0
- package/builders/metadata-check/helpers/index.js +5 -0
- package/builders/metadata-check/helpers/index.js.map +1 -0
- package/builders/metadata-check/helpers/localization-metadata-comparison-helper.d.ts +14 -0
- package/builders/metadata-check/helpers/localization-metadata-comparison-helper.d.ts.map +1 -0
- package/builders/metadata-check/helpers/localization-metadata-comparison-helper.js +34 -0
- package/builders/metadata-check/helpers/localization-metadata-comparison-helper.js.map +1 -0
- package/builders/metadata-check/index.d.ts +7 -0
- package/builders/metadata-check/index.d.ts.map +1 -0
- package/builders/metadata-check/index.js +12 -0
- package/builders/metadata-check/index.js.map +1 -0
- package/builders/metadata-check/schema.d.ts +5 -0
- package/builders/metadata-check/schema.d.ts.map +1 -0
- package/builders/metadata-check/schema.js +3 -0
- package/builders/metadata-check/schema.js.map +1 -0
- package/builders/metadata-check/schema.json +46 -0
- package/builders/package.json +3 -0
- package/builders.json +25 -0
- package/collection.json +29 -0
- package/fesm2022/o3r-transloco-rules-engine.mjs +57 -0
- package/fesm2022/o3r-transloco-rules-engine.mjs.map +1 -0
- package/fesm2022/o3r-transloco.mjs +1177 -0
- package/fesm2022/o3r-transloco.mjs.map +1 -0
- package/package.json +190 -2
- package/rules-engine/package.json +4 -0
- package/schemas/localization.metadata.schema.json +84 -0
- package/schemas/localization.schema.json +116 -0
- package/schemas/rules-engine.localization-action.schema.json +26 -0
- package/schematics/add-localization-key/index.d.ts +13 -0
- package/schematics/add-localization-key/index.d.ts.map +1 -0
- package/schematics/add-localization-key/index.js +227 -0
- package/schematics/add-localization-key/index.js.map +1 -0
- package/schematics/add-localization-key/schema.d.ts +20 -0
- package/schematics/add-localization-key/schema.d.ts.map +1 -0
- package/schematics/add-localization-key/schema.js +3 -0
- package/schematics/add-localization-key/schema.js.map +1 -0
- package/schematics/add-localization-key/schema.json +49 -0
- package/schematics/cms-adapter/index.d.ts +8 -0
- package/schematics/cms-adapter/index.d.ts.map +1 -0
- package/schematics/cms-adapter/index.js +81 -0
- package/schematics/cms-adapter/index.js.map +1 -0
- package/schematics/localization-base/index.d.ts +14 -0
- package/schematics/localization-base/index.d.ts.map +1 -0
- package/schematics/localization-base/index.js +359 -0
- package/schematics/localization-base/index.js.map +1 -0
- package/schematics/localization-base/templates/src/assets/locales/__empty__.gitkeep +0 -0
- package/schematics/localization-to-component/index.d.ts +13 -0
- package/schematics/localization-to-component/index.d.ts.map +1 -0
- package/schematics/localization-to-component/index.js +264 -0
- package/schematics/localization-to-component/index.js.map +1 -0
- package/schematics/localization-to-component/schema.d.ts +12 -0
- package/schematics/localization-to-component/schema.d.ts.map +1 -0
- package/schematics/localization-to-component/schema.js +3 -0
- package/schematics/localization-to-component/schema.js.map +1 -0
- package/schematics/localization-to-component/schema.json +31 -0
- package/schematics/localization-to-component/templates/__name__-localization.json +3 -0
- package/schematics/localization-to-component/templates/__name__-translation.ts.template +5 -0
- package/schematics/migration-localization-to-transloco/index.d.ts +8 -0
- package/schematics/migration-localization-to-transloco/index.d.ts.map +1 -0
- package/schematics/migration-localization-to-transloco/index.js +194 -0
- package/schematics/migration-localization-to-transloco/index.js.map +1 -0
- package/schematics/migration-localization-to-transloco/schema.d.ts +15 -0
- package/schematics/migration-localization-to-transloco/schema.d.ts.map +1 -0
- package/schematics/migration-localization-to-transloco/schema.js +3 -0
- package/schematics/migration-localization-to-transloco/schema.js.map +1 -0
- package/schematics/migration-localization-to-transloco/schema.json +30 -0
- package/schematics/ng-add/helpers/devtools-registration.d.ts +8 -0
- package/schematics/ng-add/helpers/devtools-registration.d.ts.map +1 -0
- package/schematics/ng-add/helpers/devtools-registration.js +37 -0
- package/schematics/ng-add/helpers/devtools-registration.js.map +1 -0
- package/schematics/ng-add/index.d.ts +8 -0
- package/schematics/ng-add/index.d.ts.map +1 -0
- package/schematics/ng-add/index.js +62 -0
- package/schematics/ng-add/index.js.map +1 -0
- package/schematics/ng-add/schema.d.ts +11 -0
- package/schematics/ng-add/schema.d.ts.map +1 -0
- package/schematics/ng-add/schema.js +3 -0
- package/schematics/ng-add/schema.js.map +1 -0
- package/schematics/ng-add/schema.json +38 -0
- package/schematics/package.json +3 -0
- package/types/o3r-transloco-rules-engine.d.ts +40 -0
- package/types/o3r-transloco-rules-engine.d.ts.map +1 -0
- package/types/o3r-transloco.d.ts +804 -0
- package/types/o3r-transloco.d.ts.map +1 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"$id": "I18nBuilderSchema",
|
|
4
|
+
"title": "I18n builder",
|
|
5
|
+
"description": "I18n builder options",
|
|
6
|
+
"properties": {
|
|
7
|
+
"localizationConfigs": {
|
|
8
|
+
"type": "array",
|
|
9
|
+
"items": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"properties": {
|
|
12
|
+
"localizationFiles": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"description": "Glob to define how to find localization json files",
|
|
15
|
+
"items": {
|
|
16
|
+
"type": "string"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"i18nFolderPath": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Folder path for the i18n folder relative to the localization json file",
|
|
22
|
+
"default": "i18n"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"defaultLanguageFile": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "Name of the file for the default language",
|
|
30
|
+
"default": "en-GB.json"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"additionalProperties": false,
|
|
34
|
+
"required": ["localizationConfigs"]
|
|
35
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { LocalizationBuilderSchema } from './schema';
|
|
2
|
+
/**
|
|
3
|
+
* Load all the translation files in the given array and created a single Object that associated to each key its localized value.
|
|
4
|
+
* @param files
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadTranslations(files: string[]): {
|
|
7
|
+
[k: string]: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Computes the translation bundle for a given language, by resolving overrides specified in defaultLanguageMapping
|
|
11
|
+
* @param language
|
|
12
|
+
* @param filesPerLanguage
|
|
13
|
+
* @param defaultLanguageMapping
|
|
14
|
+
* @param memory
|
|
15
|
+
* @param dependencyPath
|
|
16
|
+
*/
|
|
17
|
+
export declare function getTranslationsForLanguage(language: string, filesPerLanguage: Record<string, string[]>, defaultLanguageMapping: Record<string, string>, memory: Record<string, Record<string, string>>, dependencyPath?: Set<string>): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Builder to generate localization bundles
|
|
20
|
+
*/
|
|
21
|
+
declare const _default: import("@angular-devkit/architect").Builder<LocalizationBuilderSchema & import("@angular-devkit/core").JsonObject>;
|
|
22
|
+
export default _default;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../builders/localization/index.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EACV,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AA+ElB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAGzE;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC1C,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC9C,cAAc,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BjE;AA0KD;;GAEG;;AACH,wBAuMI"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadTranslations = loadTranslations;
|
|
4
|
+
exports.getTranslationsForLanguage = getTranslationsForLanguage;
|
|
5
|
+
const fs = require("node:fs");
|
|
6
|
+
const path = require("node:path");
|
|
7
|
+
const architect_1 = require("@angular-devkit/architect");
|
|
8
|
+
const extractors_1 = require("@o3r/extractors");
|
|
9
|
+
const schematics_1 = require("@o3r/schematics");
|
|
10
|
+
const globby_1 = require("globby");
|
|
11
|
+
const rxjs_1 = require("rxjs");
|
|
12
|
+
const operators_1 = require("rxjs/operators");
|
|
13
|
+
/** Maximum number of steps */
|
|
14
|
+
const STEP_NUMBER = 5;
|
|
15
|
+
/** File System debounce time */
|
|
16
|
+
const FS_DEBOUNCE_TIME = 200;
|
|
17
|
+
/**
|
|
18
|
+
* Get the list of translation files provided in the current package
|
|
19
|
+
* @param languages List of languages
|
|
20
|
+
* @param assets Folder containing the package override translations bundles
|
|
21
|
+
* @param context Ng Builder context
|
|
22
|
+
*/
|
|
23
|
+
function getAppTranslationFiles(languages, assets, context) {
|
|
24
|
+
const assetsList = (typeof assets === 'string' ? [assets] : assets);
|
|
25
|
+
const posixWorkspaceRoot = context.workspaceRoot.split(path.sep).join(path.posix.sep);
|
|
26
|
+
const languageFileEntries = (0, globby_1.sync)(assetsList.map((asset) => path.posix.join(posixWorkspaceRoot, asset, '*.json')), {
|
|
27
|
+
objectMode: true
|
|
28
|
+
});
|
|
29
|
+
const filesPerLanguage = languageFileEntries.reduce((acc, languageFileEntry) => {
|
|
30
|
+
const language = languageFileEntry.name.slice(0, -5); // Remove .json extension from the name
|
|
31
|
+
acc[language] = acc[language] || [];
|
|
32
|
+
acc[language].push(languageFileEntry.path);
|
|
33
|
+
return acc;
|
|
34
|
+
}, {});
|
|
35
|
+
const languagesToDelete = Object.keys(filesPerLanguage).filter((language) => !languages.includes(language));
|
|
36
|
+
languagesToDelete.forEach((language) => delete filesPerLanguage[language]);
|
|
37
|
+
return filesPerLanguage;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if a translation has been overridden at application level but not defined in the metadata
|
|
41
|
+
* @param language Language
|
|
42
|
+
* @param defaultBundle Default translation bundle
|
|
43
|
+
* @param customTranslations Override of translations provided by assets
|
|
44
|
+
* @param context ng Builder context
|
|
45
|
+
* @param metaData
|
|
46
|
+
* @param failIfMissingMetadata
|
|
47
|
+
*/
|
|
48
|
+
function checkUnusedTranslation(language, defaultBundle, customTranslations, context, metaData, failIfMissingMetadata) {
|
|
49
|
+
const dictionaryKeysPatterns = metaData
|
|
50
|
+
.filter((metadataItem) => metadataItem.dictionary)
|
|
51
|
+
.map((metadataItem) => metadataItem.key)
|
|
52
|
+
.map((key) => `${key}.`);
|
|
53
|
+
const missingMetadata = Object.keys(customTranslations)
|
|
54
|
+
.filter((key) => defaultBundle[key] === undefined)
|
|
55
|
+
.filter((key) => !dictionaryKeysPatterns.some((dictionaryKeyPattern) => key.startsWith(dictionaryKeyPattern)));
|
|
56
|
+
missingMetadata.forEach((key) => context.logger[failIfMissingMetadata ? 'error' : 'warn'](`The key "${key}" from "${language}" is not part of the MetaData`));
|
|
57
|
+
if (missingMetadata.length > 0 && failIfMissingMetadata) {
|
|
58
|
+
throw new schematics_1.O3rCliError(`There is missing metadata for ${language}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Clean localization json file.
|
|
63
|
+
* Note: it is used to remove $schema potentially added by the customization
|
|
64
|
+
* @param translationBundle Translation bundle
|
|
65
|
+
*/
|
|
66
|
+
function sanitizeLocalization(translationBundle) {
|
|
67
|
+
delete translationBundle.$schema;
|
|
68
|
+
return translationBundle;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Load all the translation files in the given array and created a single Object that associated to each key its localized value.
|
|
72
|
+
* @param files
|
|
73
|
+
*/
|
|
74
|
+
function loadTranslations(files) {
|
|
75
|
+
const translationList = files.map((file) => sanitizeLocalization(JSON.parse(fs.readFileSync(file).toString())));
|
|
76
|
+
return translationList.reduce((acc, translation) => Object.assign(acc, translation), {});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Computes the translation bundle for a given language, by resolving overrides specified in defaultLanguageMapping
|
|
80
|
+
* @param language
|
|
81
|
+
* @param filesPerLanguage
|
|
82
|
+
* @param defaultLanguageMapping
|
|
83
|
+
* @param memory
|
|
84
|
+
* @param dependencyPath
|
|
85
|
+
*/
|
|
86
|
+
function getTranslationsForLanguage(language, filesPerLanguage, defaultLanguageMapping, memory, dependencyPath = new Set()) {
|
|
87
|
+
if (memory[language]) {
|
|
88
|
+
return memory[language];
|
|
89
|
+
}
|
|
90
|
+
dependencyPath.add(language);
|
|
91
|
+
const files = filesPerLanguage[language];
|
|
92
|
+
let translations = files ? loadTranslations(files) : {};
|
|
93
|
+
const defaultLanguage = defaultLanguageMapping[language];
|
|
94
|
+
// If a default language has been configured for this language
|
|
95
|
+
if (defaultLanguage) {
|
|
96
|
+
// Throw an error if we find a circular dependency
|
|
97
|
+
if (dependencyPath.has(defaultLanguage)) {
|
|
98
|
+
throw new schematics_1.O3rCliError(`Circular dependency found: ${[...Array.from(dependencyPath), defaultLanguage].join('->')}`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Else, recursively resolve its bundle and use it as a base for the current language
|
|
102
|
+
const defaultTranslations = getTranslationsForLanguage(defaultLanguage, filesPerLanguage, defaultLanguageMapping, memory, dependencyPath);
|
|
103
|
+
translations = {
|
|
104
|
+
...defaultTranslations,
|
|
105
|
+
...translations
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
memory[language] = translations;
|
|
110
|
+
return translations;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get the translation bundle for each languages
|
|
114
|
+
* @param languages List of languages
|
|
115
|
+
* @param defaultBundle Default translation bundle
|
|
116
|
+
* @param fileMapping Mapping of translations per languages
|
|
117
|
+
* @param mapReferencesDictionary mapReferencesDictionary
|
|
118
|
+
* @param shouldCheckUnusedTranslation Specify if we need to check the translation not in metadata file
|
|
119
|
+
* @param context Ng Builder context
|
|
120
|
+
* @param metadata metadata
|
|
121
|
+
* @param refKeysMapping mapping for referencing towards referenced keys
|
|
122
|
+
* @param defaultLanguageMapping
|
|
123
|
+
* @param useMetadataAsDefault
|
|
124
|
+
* @param ignoreReferenceIfNotDefault
|
|
125
|
+
* @param failIfMissingMetadata
|
|
126
|
+
*/
|
|
127
|
+
function getBundlesPerLanguages(languages, defaultBundle, fileMapping, mapReferencesDictionary, shouldCheckUnusedTranslation, context, metadata = [], refKeysMapping, defaultLanguageMapping, useMetadataAsDefault, ignoreReferenceIfNotDefault, failIfMissingMetadata) {
|
|
128
|
+
const bundles = {};
|
|
129
|
+
const memory = {};
|
|
130
|
+
for (const language of languages) {
|
|
131
|
+
const translations = getTranslationsForLanguage(language, fileMapping, defaultLanguageMapping, memory);
|
|
132
|
+
if (shouldCheckUnusedTranslation) {
|
|
133
|
+
checkUnusedTranslation(language, defaultBundle, translations, context, metadata, failIfMissingMetadata);
|
|
134
|
+
}
|
|
135
|
+
const bundle = useMetadataAsDefault
|
|
136
|
+
? {
|
|
137
|
+
...defaultBundle,
|
|
138
|
+
...translations
|
|
139
|
+
}
|
|
140
|
+
: translations;
|
|
141
|
+
bundles[language] = bundle;
|
|
142
|
+
Object.keys(mapReferencesDictionary)
|
|
143
|
+
.forEach((key) => Object.keys(bundles[language])
|
|
144
|
+
.filter((k) => k.startsWith(mapReferencesDictionary[key]))
|
|
145
|
+
.forEach((k) => {
|
|
146
|
+
const newKey = k.replace(mapReferencesDictionary[key], key);
|
|
147
|
+
if (!bundle[newKey]) {
|
|
148
|
+
bundle[newKey] = bundle[k];
|
|
149
|
+
}
|
|
150
|
+
}));
|
|
151
|
+
Object.entries(refKeysMapping)
|
|
152
|
+
.forEach(([key, mappedKey]) => {
|
|
153
|
+
if (bundle[mappedKey] && (!ignoreReferenceIfNotDefault || bundle[key] === undefined || bundle[key] === defaultBundle[key])) {
|
|
154
|
+
bundle[key] = bundle[mappedKey];
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return bundles;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Extract localization referred in metadata
|
|
162
|
+
* @param metaData Localization metadata
|
|
163
|
+
* @param key Translation key
|
|
164
|
+
*/
|
|
165
|
+
function getExtractReferredTranslationValue(metaData, key) {
|
|
166
|
+
const translationObj = metaData.find((data) => data.key === key);
|
|
167
|
+
if (translationObj) {
|
|
168
|
+
return translationObj.ref ? getExtractReferredTranslationValue(metaData, translationObj.ref) : translationObj.value || key;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return key;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Extract localization key referred in metadata
|
|
176
|
+
* @param metaData Localization metadata
|
|
177
|
+
* @param key Translation key
|
|
178
|
+
*/
|
|
179
|
+
function getExtractReferredTranslationKey(metaData, key) {
|
|
180
|
+
const translationObj = metaData.find((data) => data.key === key);
|
|
181
|
+
return (translationObj && !!translationObj.ref) ? getExtractReferredTranslationKey(metaData, translationObj.ref) : key;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Extract some data from the provided localization metadata:
|
|
185
|
+
* - The bundle containing default translations
|
|
186
|
+
* - The map that associates to every key containing a reference, the key it resolves to
|
|
187
|
+
* - The map that associated to every key being a dictionary reference, the key it resolves to
|
|
188
|
+
* @param metadata
|
|
189
|
+
*/
|
|
190
|
+
function processMetadata(metadata) {
|
|
191
|
+
const defaultTranslations = {};
|
|
192
|
+
const keyReferences = {};
|
|
193
|
+
const dictionaryReferences = {};
|
|
194
|
+
metadata.forEach((localization) => {
|
|
195
|
+
if (localization.value === undefined && localization.ref === undefined) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (localization.ref) {
|
|
199
|
+
const extractedReference = getExtractReferredTranslationKey(metadata, localization.ref);
|
|
200
|
+
if (localization.dictionary) {
|
|
201
|
+
dictionaryReferences[localization.key] = extractedReference;
|
|
202
|
+
}
|
|
203
|
+
keyReferences[localization.key] = extractedReference;
|
|
204
|
+
defaultTranslations[localization.key] = getExtractReferredTranslationValue(metadata, localization.ref);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
defaultTranslations[localization.key] = localization.value;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
return { defaultTranslations, keyReferences, dictionaryReferences };
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Start the metadata generator in watch mode
|
|
214
|
+
* @param localizationExtractorTarget Target of the localization extractor builder
|
|
215
|
+
* @param context Builder context
|
|
216
|
+
*/
|
|
217
|
+
function startMetadataGenerator(localizationExtractorTarget, context) {
|
|
218
|
+
const logger = context.logger.createChild('Metadata Logger');
|
|
219
|
+
const extractorBuild = context.scheduleTarget(localizationExtractorTarget, { watch: true }, { logger });
|
|
220
|
+
return (0, rxjs_1.firstValueFrom)((0, rxjs_1.merge)(logger.pipe(), (0, rxjs_1.from)(extractorBuild.then((build) => build.result))).pipe((0, operators_1.filter)((entry) => !entry.message || /Localization metadata bundle extracted/.test(entry.message))));
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Regenerate the metadata if missing
|
|
224
|
+
* @param localizationMetaDataFile Path to the localization metadata file
|
|
225
|
+
* @param localizationExtractorTarget Localization Extractor target configured in the angular.json
|
|
226
|
+
* @param context Ng Builder context
|
|
227
|
+
*/
|
|
228
|
+
async function checkMetadata(localizationMetaDataFile, localizationExtractorTarget, context) {
|
|
229
|
+
let metaDataExists = fs.existsSync(localizationMetaDataFile);
|
|
230
|
+
if (!metaDataExists) {
|
|
231
|
+
context.logger.warn(`The file ${localizationMetaDataFile} does not exist, the extractor will be run`);
|
|
232
|
+
context.reportProgress(2, STEP_NUMBER, 'Generating Localization metadata file');
|
|
233
|
+
const extractorBuild = await context.scheduleTarget(localizationExtractorTarget, { watch: false });
|
|
234
|
+
const extractorBuildResult = await extractorBuild.result;
|
|
235
|
+
if (extractorBuildResult.success) {
|
|
236
|
+
metaDataExists = fs.existsSync(localizationMetaDataFile);
|
|
237
|
+
if (!metaDataExists) {
|
|
238
|
+
return {
|
|
239
|
+
success: false,
|
|
240
|
+
error: `The file ${localizationMetaDataFile} has not been generated`
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
return extractorBuildResult;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Builder to generate localization bundles
|
|
251
|
+
*/
|
|
252
|
+
exports.default = (0, architect_1.createBuilder)((0, extractors_1.createBuilderWithMetricsIfInstalled)(async (options, context) => {
|
|
253
|
+
context.reportRunning();
|
|
254
|
+
// Load Targets to get build options
|
|
255
|
+
context.reportProgress(0, STEP_NUMBER, 'Checking required options');
|
|
256
|
+
let [project, target, configuration] = options.browserTarget.split(':');
|
|
257
|
+
const browserTarget = { project, target, configuration };
|
|
258
|
+
[project, target, configuration] = options.localizationExtracterTarget.split(':');
|
|
259
|
+
const localizationExtractorTarget = { project, target, configuration };
|
|
260
|
+
const [browserTargetRawOptions, localizationExtracterTargetRawOptions, browserTargetBuilder, localizationExtracterTargetBuilder] = await Promise.all([
|
|
261
|
+
context.getTargetOptions(browserTarget),
|
|
262
|
+
context.getTargetOptions(localizationExtractorTarget),
|
|
263
|
+
context.getBuilderNameForTarget(browserTarget),
|
|
264
|
+
context.getBuilderNameForTarget(localizationExtractorTarget)
|
|
265
|
+
]);
|
|
266
|
+
const [browserTargetOptions, localizationExtracterTargetOptions] = await Promise.all([
|
|
267
|
+
context.validateOptions(browserTargetRawOptions, browserTargetBuilder),
|
|
268
|
+
context.validateOptions(localizationExtracterTargetRawOptions, localizationExtracterTargetBuilder)
|
|
269
|
+
]);
|
|
270
|
+
let browserTargetOptionsOutputPath;
|
|
271
|
+
// Check the minimum of mandatory options to the builders
|
|
272
|
+
if (typeof browserTargetOptions.outputPath !== 'string' && typeof browserTargetOptions.outputPath?.base !== 'string') {
|
|
273
|
+
browserTargetOptionsOutputPath = path.join(context.workspaceRoot, 'dist', browserTarget.project); // outputPath became optional in Angular v20
|
|
274
|
+
}
|
|
275
|
+
else if (typeof browserTargetOptions.outputPath === 'string') {
|
|
276
|
+
browserTargetOptionsOutputPath = browserTargetOptions.outputPath;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
browserTargetOptionsOutputPath = path.join(browserTargetOptions.outputPath.base, typeof browserTargetOptions.outputPath.browser === 'string' ? browserTargetOptions.outputPath.browser : '');
|
|
280
|
+
}
|
|
281
|
+
if (typeof localizationExtracterTargetOptions.outputFile !== 'string') {
|
|
282
|
+
return {
|
|
283
|
+
success: false,
|
|
284
|
+
error: `The targetLocalizationExtracter ${options.localizationExtracterTarget} does not provide 'outputFile' option`
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
/** Path to the build output folder */
|
|
288
|
+
const outputPath = path.resolve(context.workspaceRoot, browserTargetOptionsOutputPath);
|
|
289
|
+
/** Path to the metadata file */
|
|
290
|
+
const localizationMetaDataFile = path.resolve(context.workspaceRoot, localizationExtracterTargetOptions.outputFile);
|
|
291
|
+
/**
|
|
292
|
+
* Generate translation bundles
|
|
293
|
+
* @param languageToRegenerate language to focus on
|
|
294
|
+
*/
|
|
295
|
+
const execute = (languageToRegenerate) => {
|
|
296
|
+
/** Localization metadata */
|
|
297
|
+
context.reportProgress(1, STEP_NUMBER, 'Checking Metadata');
|
|
298
|
+
const metaData = JSON.parse(fs.readFileSync(localizationMetaDataFile, { encoding: 'utf8' }));
|
|
299
|
+
context.reportProgress(3, STEP_NUMBER, 'Loading translation files');
|
|
300
|
+
/** List of translation files provided in the current package */
|
|
301
|
+
const appTranslationFiles = options.assets?.length ? getAppTranslationFiles(options.locales, options.assets, context) : {};
|
|
302
|
+
/** Mapping between the language and the custom translation of the package */
|
|
303
|
+
const fileMapping = languageToRegenerate ? { [languageToRegenerate]: appTranslationFiles[languageToRegenerate] } : appTranslationFiles;
|
|
304
|
+
const { defaultTranslations, keyReferences, dictionaryReferences } = processMetadata(metaData);
|
|
305
|
+
context.reportProgress(4, STEP_NUMBER, 'Merging translations');
|
|
306
|
+
try {
|
|
307
|
+
/** List of final translation bundles */
|
|
308
|
+
const bundles = getBundlesPerLanguages(languageToRegenerate ? [languageToRegenerate] : options.locales, defaultTranslations, fileMapping, dictionaryReferences, options.checkUnusedTranslation, context, metaData, keyReferences, options.defaultLanguageMapping, options.useMetadataAsDefault, options.ignoreReferencesIfNotDefault, options.failIfMissingMetadata);
|
|
309
|
+
context.reportProgress(5, STEP_NUMBER, 'Writing translations');
|
|
310
|
+
// Write translation files
|
|
311
|
+
const writingFolder = options.outputPath || outputPath || '.';
|
|
312
|
+
if (!fs.existsSync(writingFolder)) {
|
|
313
|
+
fs.mkdirSync(writingFolder, { recursive: true });
|
|
314
|
+
}
|
|
315
|
+
Object.entries(bundles).forEach(([language, bundle]) => {
|
|
316
|
+
const filePath = path.resolve(writingFolder, `${language}.json`);
|
|
317
|
+
context.logger.info(`Writing file to disk ${filePath}`);
|
|
318
|
+
fs.writeFileSync(filePath, JSON.stringify(bundle, Object.keys(bundle).toSorted(), 2));
|
|
319
|
+
});
|
|
320
|
+
return {
|
|
321
|
+
success: true
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
return {
|
|
326
|
+
success: false,
|
|
327
|
+
error: typeof error === 'string' ? error : error.message
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
/** Timeout to handle nodejs issue (#1970) */
|
|
332
|
+
const fsTimeout = {};
|
|
333
|
+
/**
|
|
334
|
+
* Run a translation generation and report the result
|
|
335
|
+
* @param language Language that has changed and requires a regeneration
|
|
336
|
+
*/
|
|
337
|
+
const generateWithReport = (language) => {
|
|
338
|
+
const result = execute(language);
|
|
339
|
+
if (result.success && language) {
|
|
340
|
+
context.logger.info(`Translations updated based on changes in ${language}`);
|
|
341
|
+
}
|
|
342
|
+
else if (result.error) {
|
|
343
|
+
context.logger.error(result.error);
|
|
344
|
+
}
|
|
345
|
+
context.reportStatus('Waiting for changes');
|
|
346
|
+
return result;
|
|
347
|
+
};
|
|
348
|
+
/**
|
|
349
|
+
* Run a translation generation for metadata change
|
|
350
|
+
*/
|
|
351
|
+
const generateForMetadataChange = () => {
|
|
352
|
+
const METADATA_LABEL = 'metadata';
|
|
353
|
+
if (fsTimeout[METADATA_LABEL]) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
fsTimeout[METADATA_LABEL] = setTimeout(() => {
|
|
357
|
+
fsTimeout[METADATA_LABEL] = null;
|
|
358
|
+
const result = generateWithReport();
|
|
359
|
+
if (result.success) {
|
|
360
|
+
context.logger.info('Translations updated based on metadata');
|
|
361
|
+
}
|
|
362
|
+
}, FS_DEBOUNCE_TIME);
|
|
363
|
+
};
|
|
364
|
+
/**
|
|
365
|
+
* Run a translation generation for asset change
|
|
366
|
+
* @param filename File that has changed and requires a regeneration
|
|
367
|
+
* @param fullFilePath
|
|
368
|
+
*/
|
|
369
|
+
const generateForAssetsChange = (filename, fullFilePath) => {
|
|
370
|
+
if (fsTimeout[filename]) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
fsTimeout[filename] = setTimeout(() => {
|
|
374
|
+
fsTimeout[filename] = null;
|
|
375
|
+
context.logger.info(`Change triggered in ${fullFilePath}`);
|
|
376
|
+
generateWithReport(path.parse(filename).name);
|
|
377
|
+
}, FS_DEBOUNCE_TIME);
|
|
378
|
+
};
|
|
379
|
+
if (options.watch) {
|
|
380
|
+
const metaDataGeneration = await startMetadataGenerator(localizationExtractorTarget, context);
|
|
381
|
+
const metaDataGenerationResult = metaDataGeneration && metaDataGeneration.output && metaDataGeneration.result;
|
|
382
|
+
if (metaDataGenerationResult && !metaDataGenerationResult.success) {
|
|
383
|
+
return metaDataGenerationResult;
|
|
384
|
+
}
|
|
385
|
+
// Execute the generation a first time
|
|
386
|
+
generateWithReport();
|
|
387
|
+
// Create file watchers
|
|
388
|
+
let assetsWatchers = [];
|
|
389
|
+
if (options.assets) {
|
|
390
|
+
const assetsList = (typeof options.assets === 'string' ? [options.assets] : options.assets);
|
|
391
|
+
const posixWorkspaceRoot = context.workspaceRoot.split(path.sep).join(path.posix.sep);
|
|
392
|
+
const filenamesToInclude = `(${options.locales.join('|')}).json`;
|
|
393
|
+
const assets = (0, globby_1.sync)(assetsList.map((asset) => path.posix.join(posixWorkspaceRoot, asset, filenamesToInclude)));
|
|
394
|
+
assetsWatchers = assetsWatchers.concat(assets.map((asset) => fs.watch(asset, (_eventType, filename) => generateForAssetsChange(filename, asset))));
|
|
395
|
+
}
|
|
396
|
+
const metadataWatcher = fs.watch(localizationMetaDataFile, () => generateForMetadataChange());
|
|
397
|
+
context.addTeardown(() => {
|
|
398
|
+
assetsWatchers.forEach((assetsWatcher) => assetsWatcher.close());
|
|
399
|
+
metadataWatcher.close();
|
|
400
|
+
});
|
|
401
|
+
// Exit on watcher failure
|
|
402
|
+
return new Promise((_resolve, reject) => {
|
|
403
|
+
assetsWatchers.forEach((assetsWatcher) => assetsWatcher.once('error', (err) => reject(err)));
|
|
404
|
+
metadataWatcher.once('error', (err) => reject(err));
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
// Execute the generation only once if not watch mode
|
|
409
|
+
const metaDataGeneration = await checkMetadata(localizationMetaDataFile, localizationExtractorTarget, context);
|
|
410
|
+
if (metaDataGeneration && !metaDataGeneration.success) {
|
|
411
|
+
return metaDataGeneration;
|
|
412
|
+
}
|
|
413
|
+
return execute();
|
|
414
|
+
}
|
|
415
|
+
}));
|
|
416
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../builders/localization/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { JsonObject } from '@angular-devkit/core';
|
|
2
|
+
/**
|
|
3
|
+
* Schema for the localization builder
|
|
4
|
+
*/
|
|
5
|
+
export interface LocalizationBuilderSchema extends JsonObject {
|
|
6
|
+
/** Target to build */
|
|
7
|
+
browserTarget: string;
|
|
8
|
+
/** Target translation extracter */
|
|
9
|
+
localizationExtracterTarget: string;
|
|
10
|
+
/** Output path to localization bundles */
|
|
11
|
+
outputPath: string;
|
|
12
|
+
/** List of languages to generate */
|
|
13
|
+
locales: string[];
|
|
14
|
+
/** Map that associates to a locale, the other locale / language that should be used as default values */
|
|
15
|
+
defaultLanguageMapping: Record<string, string>;
|
|
16
|
+
/** Should missing translations for a given language be filled from the default values from the metadata or not */
|
|
17
|
+
useMetadataAsDefault: boolean;
|
|
18
|
+
/** Do not resolve references when the value of the child key has been customized (eg. is neither undefined or the default value) */
|
|
19
|
+
ignoreReferencesIfNotDefault: boolean;
|
|
20
|
+
/** Asset folder containing the package translations */
|
|
21
|
+
assets: string[] | string | null;
|
|
22
|
+
/** Check if a translation from the asset folder is not a registered translation */
|
|
23
|
+
checkUnusedTranslation: boolean;
|
|
24
|
+
/** Enable watch mode */
|
|
25
|
+
watch: boolean;
|
|
26
|
+
/** Throws an error if there is missing metadata */
|
|
27
|
+
failIfMissingMetadata: boolean;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../builders/localization/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACX,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,UAAU;IAE3D,sBAAsB;IACtB,aAAa,EAAE,MAAM,CAAC;IAEtB,mCAAmC;IACnC,2BAA2B,EAAE,MAAM,CAAC;IAEpC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IAEnB,oCAAoC;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,yGAAyG;IACzG,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/C,kHAAkH;IAClH,oBAAoB,EAAE,OAAO,CAAC;IAE9B,oIAAoI;IACpI,4BAA4B,EAAE,OAAO,CAAC;IAEtC,uDAAuD;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC;IAEjC,mFAAmF;IACnF,sBAAsB,EAAE,OAAO,CAAC;IAEhC,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;IAEf,mDAAmD;IACnD,qBAAqB,EAAE,OAAO,CAAC;CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../builders/localization/schema.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"$id": "LocalizationBuilderSchema",
|
|
4
|
+
"title": "Localization builder",
|
|
5
|
+
"description": "Localization builder options",
|
|
6
|
+
"properties": {
|
|
7
|
+
"browserTarget": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "Target to build."
|
|
10
|
+
},
|
|
11
|
+
"localizationExtracterTarget": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"description": "Target translation extracter."
|
|
14
|
+
},
|
|
15
|
+
"outputPath": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Output path to localization bundles"
|
|
18
|
+
},
|
|
19
|
+
"locales": {
|
|
20
|
+
"type": "array",
|
|
21
|
+
"description": "List of languages to generate",
|
|
22
|
+
"default": ["en-GB"],
|
|
23
|
+
"items": {
|
|
24
|
+
"type": "string"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"defaultLanguageMapping": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"description": "Map that associates to a locale, the other locale / language that should be used as default values",
|
|
30
|
+
"default": {},
|
|
31
|
+
"additionalProperties": { "type": "string" }
|
|
32
|
+
},
|
|
33
|
+
"useMetadataAsDefault": {
|
|
34
|
+
"type": "boolean",
|
|
35
|
+
"description": "Should missing translations for a given language be filled from the default values from the metadata or not",
|
|
36
|
+
"default": true
|
|
37
|
+
},
|
|
38
|
+
"ignoreReferencesIfNotDefault": {
|
|
39
|
+
"type": "boolean",
|
|
40
|
+
"description": "Do not resolve references when the value of the child key has been customized (eg. is neither undefined or the default value)",
|
|
41
|
+
"default": false
|
|
42
|
+
},
|
|
43
|
+
"assets": {
|
|
44
|
+
"oneOf": [
|
|
45
|
+
{
|
|
46
|
+
"type": "string"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"type": "array",
|
|
50
|
+
"items": {
|
|
51
|
+
"type": "string"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"description": "Asset folder containing the package translations"
|
|
56
|
+
},
|
|
57
|
+
"checkUnusedTranslation": {
|
|
58
|
+
"type": "boolean",
|
|
59
|
+
"description": "Check if a translation from the asset folder is not a registered translation",
|
|
60
|
+
"default": true
|
|
61
|
+
},
|
|
62
|
+
"watch": {
|
|
63
|
+
"type": "boolean",
|
|
64
|
+
"description": "Enable watch mode",
|
|
65
|
+
"default": false
|
|
66
|
+
},
|
|
67
|
+
"failIfMissingMetadata": {
|
|
68
|
+
"type": "boolean",
|
|
69
|
+
"description": "Throws an error if there is missing metadata",
|
|
70
|
+
"default": false
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"additionalProperties": false,
|
|
74
|
+
"required": [
|
|
75
|
+
"localizationExtracterTarget",
|
|
76
|
+
"browserTarget"
|
|
77
|
+
]
|
|
78
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LocalizationExtractorBuilderSchema } from './schema';
|
|
2
|
+
export type * from './schema';
|
|
3
|
+
/**
|
|
4
|
+
* Builder to extract localization keys from an Otter project
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: import("@angular-devkit/architect").Builder<LocalizationExtractorBuilderSchema & import("@angular-devkit/core").JsonObject>;
|
|
7
|
+
export default _default;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../builders/localization-extractor/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,kCAAkC,EACnC,MAAM,UAAU,CAAC;AAKlB,mBAAmB,UAAU,CAAC;AAE9B;;GAEG;;AACH,wBAoMI"}
|