UNPKG

@spartacus/core

Version:

Spartacus - the core framework

81 lines 11.8 kB
import { Inject, Injectable, isDevMode } from '@angular/core'; import { Observable } from 'rxjs'; import { I18NEXT_INSTANCE } from './i18next-instance'; import * as i0 from "@angular/core"; import * as i1 from "../config/i18n-config"; import * as i2 from "../translation-chunk.service"; export class I18nextTranslationService { constructor(config, translationChunk, // Required param added in 3.0.x as a critical bug fix, not subject to the breaking changes policy i18next) { this.config = config; this.translationChunk = translationChunk; this.i18next = i18next; this.NON_BREAKING_SPACE = String.fromCharCode(160); this.NAMESPACE_SEPARATOR = ':'; } translate(key, options = {}, whitespaceUntilLoaded = false) { // If we've already loaded the chunk (or failed to load), we should immediately emit the value // (or the fallback value in case the key is missing). // Moreover, we SHOULD emit a value (or a fallback value) synchronously (not in a promise/setTimeout). // Otherwise, we the will trigger additional deferred change detection in a view that consumes the returned observable, // which together with `switchMap` operator may lead to an infinite loop. const chunkName = this.translationChunk.getChunkNameForKey(key); const namespacedKey = this.getNamespacedKey(key, chunkName); return new Observable((subscriber) => { const translate = () => { if (!this.i18next.isInitialized) { return; } if (this.i18next.exists(namespacedKey, options)) { subscriber.next(this.i18next.t(namespacedKey, options)); } else { if (whitespaceUntilLoaded) { subscriber.next(this.NON_BREAKING_SPACE); } this.i18next.loadNamespaces(chunkName, () => { if (!this.i18next.exists(namespacedKey, options)) { this.reportMissingKey(key, chunkName); subscriber.next(this.getFallbackValue(namespacedKey)); } else { subscriber.next(this.i18next.t(namespacedKey, options)); } }); } }; translate(); this.i18next.on('languageChanged', translate); return () => this.i18next.off('languageChanged', translate); }); } loadChunks(chunkNames) { return this.i18next.loadNamespaces(chunkNames); } /** * Returns a fallback value in case when the given key is missing * @param key */ getFallbackValue(key) { return isDevMode() ? `[${key}]` : this.NON_BREAKING_SPACE; } reportMissingKey(key, chunkName) { if (isDevMode()) { console.warn(`Translation key missing '${key}' in the chunk '${chunkName}'`); } } getNamespacedKey(key, chunk) { return chunk + this.NAMESPACE_SEPARATOR + key; } } I18nextTranslationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: I18nextTranslationService, deps: [{ token: i1.I18nConfig }, { token: i2.TranslationChunkService }, { token: I18NEXT_INSTANCE }], target: i0.ɵɵFactoryTarget.Injectable }); I18nextTranslationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: I18nextTranslationService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: I18nextTranslationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.I18nConfig }, { type: i2.TranslationChunkService }, { type: undefined, decorators: [{ type: Inject, args: [I18NEXT_INSTANCE] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bmV4dC10cmFuc2xhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvaTE4bi9pMThuZXh0L2kxOG5leHQtdHJhbnNsYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUlsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQUd0RCxNQUFNLE9BQU8seUJBQXlCO0lBSXBDLFlBQ1ksTUFBa0IsRUFDbEIsZ0JBQXlDO0lBQ25ELGtHQUFrRztJQUM5RCxPQUFhO1FBSHZDLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQUVmLFlBQU8sR0FBUCxPQUFPLENBQU07UUFQbEMsdUJBQWtCLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1Qyx3QkFBbUIsR0FBRyxHQUFHLENBQUM7SUFPMUMsQ0FBQztJQUVKLFNBQVMsQ0FDUCxHQUFXLEVBQ1gsVUFBZSxFQUFFLEVBQ2pCLHdCQUFpQyxLQUFLO1FBRXRDLDhGQUE4RjtRQUM5RixzREFBc0Q7UUFFdEQsc0dBQXNHO1FBQ3RHLHVIQUF1SDtRQUN2SCx5RUFBeUU7UUFFekUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFNUQsT0FBTyxJQUFJLFVBQVUsQ0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQzNDLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO29CQUMvQixPQUFPO2lCQUNSO2dCQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUMvQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUN6RDtxQkFBTTtvQkFDTCxJQUFJLHFCQUFxQixFQUFFO3dCQUN6QixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3FCQUMxQztvQkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO3dCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxFQUFFOzRCQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDOzRCQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO3lCQUN2RDs2QkFBTTs0QkFDTCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO3lCQUN6RDtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtZQUNILENBQUMsQ0FBQztZQUVGLFNBQVMsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsVUFBNkI7UUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sZ0JBQWdCLENBQUMsR0FBVztRQUNwQyxPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDNUQsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxTQUFpQjtRQUNyRCxJQUFJLFNBQVMsRUFBRSxFQUFFO1lBQ2YsT0FBTyxDQUFDLElBQUksQ0FDViw0QkFBNEIsR0FBRyxtQkFBbUIsU0FBUyxHQUFHLENBQy9ELENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUNqRCxPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0lBQ2hELENBQUM7O3NIQTVFVSx5QkFBeUIsbUZBUTFCLGdCQUFnQjswSEFSZix5QkFBeUIsY0FEWixNQUFNOzJGQUNuQix5QkFBeUI7a0JBRHJDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFTN0IsTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSTE4bkNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9pMThuLWNvbmZpZyc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbkNodW5rU2VydmljZSB9IGZyb20gJy4uL3RyYW5zbGF0aW9uLWNodW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJMThORVhUX0lOU1RBTkNFIH0gZnJvbSAnLi9pMThuZXh0LWluc3RhbmNlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBJMThuZXh0VHJhbnNsYXRpb25TZXJ2aWNlIGltcGxlbWVudHMgVHJhbnNsYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBOT05fQlJFQUtJTkdfU1BBQ0UgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBOQU1FU1BBQ0VfU0VQQVJBVE9SID0gJzonO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb25maWc6IEkxOG5Db25maWcsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0aW9uQ2h1bms6IFRyYW5zbGF0aW9uQ2h1bmtTZXJ2aWNlLFxuICAgIC8vIFJlcXVpcmVkIHBhcmFtIGFkZGVkIGluIDMuMC54IGFzIGEgY3JpdGljYWwgYnVnIGZpeCwgbm90IHN1YmplY3QgdG8gdGhlIGJyZWFraW5nIGNoYW5nZXMgcG9saWN5XG4gICAgQEluamVjdChJMThORVhUX0lOU1RBTkNFKSBwcm90ZWN0ZWQgaTE4bmV4dDogaTE4blxuICApIHt9XG5cbiAgdHJhbnNsYXRlKFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IGFueSA9IHt9LFxuICAgIHdoaXRlc3BhY2VVbnRpbExvYWRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBsb2FkZWQgdGhlIGNodW5rIChvciBmYWlsZWQgdG8gbG9hZCksIHdlIHNob3VsZCBpbW1lZGlhdGVseSBlbWl0IHRoZSB2YWx1ZVxuICAgIC8vIChvciB0aGUgZmFsbGJhY2sgdmFsdWUgaW4gY2FzZSB0aGUga2V5IGlzIG1pc3NpbmcpLlxuXG4gICAgLy8gTW9yZW92ZXIsIHdlIFNIT1VMRCBlbWl0IGEgdmFsdWUgKG9yIGEgZmFsbGJhY2sgdmFsdWUpIHN5bmNocm9ub3VzbHkgKG5vdCBpbiBhIHByb21pc2Uvc2V0VGltZW91dCkuXG4gICAgLy8gT3RoZXJ3aXNlLCB3ZSB0aGUgd2lsbCB0cmlnZ2VyIGFkZGl0aW9uYWwgZGVmZXJyZWQgY2hhbmdlIGRldGVjdGlvbiBpbiBhIHZpZXcgdGhhdCBjb25zdW1lcyB0aGUgcmV0dXJuZWQgb2JzZXJ2YWJsZSxcbiAgICAvLyB3aGljaCB0b2dldGhlciB3aXRoIGBzd2l0Y2hNYXBgIG9wZXJhdG9yIG1heSBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuXG5cbiAgICBjb25zdCBjaHVua05hbWUgPSB0aGlzLnRyYW5zbGF0aW9uQ2h1bmsuZ2V0Q2h1bmtOYW1lRm9yS2V5KGtleSk7XG4gICAgY29uc3QgbmFtZXNwYWNlZEtleSA9IHRoaXMuZ2V0TmFtZXNwYWNlZEtleShrZXksIGNodW5rTmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8c3RyaW5nPigoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgY29uc3QgdHJhbnNsYXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaTE4bmV4dC5pc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmkxOG5leHQuZXhpc3RzKG5hbWVzcGFjZWRLZXksIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHRoaXMuaTE4bmV4dC50KG5hbWVzcGFjZWRLZXksIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAod2hpdGVzcGFjZVVudGlsTG9hZGVkKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodGhpcy5OT05fQlJFQUtJTkdfU1BBQ0UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmkxOG5leHQubG9hZE5hbWVzcGFjZXMoY2h1bmtOYW1lLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaTE4bmV4dC5leGlzdHMobmFtZXNwYWNlZEtleSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXBvcnRNaXNzaW5nS2V5KGtleSwgY2h1bmtOYW1lKTtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHRoaXMuZ2V0RmFsbGJhY2tWYWx1ZShuYW1lc3BhY2VkS2V5KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodGhpcy5pMThuZXh0LnQobmFtZXNwYWNlZEtleSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cmFuc2xhdGUoKTtcbiAgICAgIHRoaXMuaTE4bmV4dC5vbignbGFuZ3VhZ2VDaGFuZ2VkJywgdHJhbnNsYXRlKTtcbiAgICAgIHJldHVybiAoKSA9PiB0aGlzLmkxOG5leHQub2ZmKCdsYW5ndWFnZUNoYW5nZWQnLCB0cmFuc2xhdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZENodW5rcyhjaHVua05hbWVzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bmV4dC5sb2FkTmFtZXNwYWNlcyhjaHVua05hbWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZmFsbGJhY2sgdmFsdWUgaW4gY2FzZSB3aGVuIHRoZSBnaXZlbiBrZXkgaXMgbWlzc2luZ1xuICAgKiBAcGFyYW0ga2V5XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RmFsbGJhY2tWYWx1ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlzRGV2TW9kZSgpID8gYFske2tleX1dYCA6IHRoaXMuTk9OX0JSRUFLSU5HX1NQQUNFO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBvcnRNaXNzaW5nS2V5KGtleTogc3RyaW5nLCBjaHVua05hbWU6IHN0cmluZykge1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgVHJhbnNsYXRpb24ga2V5IG1pc3NpbmcgJyR7a2V5fScgaW4gdGhlIGNodW5rICcke2NodW5rTmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE5hbWVzcGFjZWRLZXkoa2V5OiBzdHJpbmcsIGNodW5rOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjaHVuayArIHRoaXMuTkFNRVNQQUNFX1NFUEFSQVRPUiArIGtleTtcbiAgfVxufVxuIl19