mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-26 17:24:56 +00:00
Removed ng-translate code from the core
Added ng-translate dependency
This commit is contained in:
parent
3f28925d35
commit
339b84f042
@ -53,6 +53,7 @@
|
|||||||
"ng2-alfresco-login": "^0.1.0",
|
"ng2-alfresco-login": "^0.1.0",
|
||||||
"ng2-alfresco-search": "^0.1.2",
|
"ng2-alfresco-search": "^0.1.2",
|
||||||
"ng2-alfresco-upload": "^0.1.0",
|
"ng2-alfresco-upload": "^0.1.0",
|
||||||
|
"ng2-translate": "^1.11.3",
|
||||||
"reflect-metadata": "0.1.2",
|
"reflect-metadata": "0.1.2",
|
||||||
"rxjs": "5.0.0-beta.2",
|
"rxjs": "5.0.0-beta.2",
|
||||||
"systemjs": "0.19.26",
|
"systemjs": "0.19.26",
|
||||||
|
@ -25,7 +25,8 @@
|
|||||||
'ng2-alfresco-login': 'node_modules/ng2-alfresco-login',
|
'ng2-alfresco-login': 'node_modules/ng2-alfresco-login',
|
||||||
'ng2-alfresco-search': 'node_modules/ng2-alfresco-search',
|
'ng2-alfresco-search': 'node_modules/ng2-alfresco-search',
|
||||||
'ng2-alfresco-upload': 'node_modules/ng2-alfresco-upload',
|
'ng2-alfresco-upload': 'node_modules/ng2-alfresco-upload',
|
||||||
'rxjs': 'node_modules/rxjs'
|
'rxjs': 'node_modules/rxjs',
|
||||||
|
'ng2-translate': 'node_modules/ng2-translate'
|
||||||
};
|
};
|
||||||
|
|
||||||
// packages tells the System loader how to load when no filename and/or no extension
|
// packages tells the System loader how to load when no filename and/or no extension
|
||||||
@ -40,6 +41,7 @@
|
|||||||
'ng2-alfresco-login': {defaultExtension: 'js'},
|
'ng2-alfresco-login': {defaultExtension: 'js'},
|
||||||
'ng2-alfresco-search': {defaultExtension: 'js'},
|
'ng2-alfresco-search': {defaultExtension: 'js'},
|
||||||
'ng2-alfresco-upload': {defaultExtension: 'js'},
|
'ng2-alfresco-upload': {defaultExtension: 'js'},
|
||||||
|
'ng2-translate': {defaultExtension: 'js'},
|
||||||
'rxjs': {defaultExtension: 'js'}
|
'rxjs': {defaultExtension: 'js'}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ng2-alfresco-core",
|
"name": "ng2-alfresco-core",
|
||||||
"description": "Alfresco Angular 2 Components core",
|
"description": "Alfresco Angular 2 Components core",
|
||||||
"version": "0.1.19",
|
"version": "0.1.20",
|
||||||
"author": "Alfresco Software, Ltd.",
|
"author": "Alfresco Software, Ltd.",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"typings": "typings install",
|
"typings": "typings install",
|
||||||
@ -53,7 +53,8 @@
|
|||||||
"reflect-metadata": "0.1.2",
|
"reflect-metadata": "0.1.2",
|
||||||
"rxjs": "5.0.0-beta.2",
|
"rxjs": "5.0.0-beta.2",
|
||||||
"systemjs": "0.19.26",
|
"systemjs": "0.19.26",
|
||||||
"zone.js": "^0.6.12"
|
"zone.js": "^0.6.12",
|
||||||
|
"ng2-translate": "^1.11.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"angular2": "2.0.0-beta.15"
|
"angular2": "2.0.0-beta.15"
|
||||||
|
@ -15,152 +15,18 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { PipeTransform, Pipe, Injectable, EventEmitter, OnDestroy, ChangeDetectorRef } from 'angular2/core';
|
import { Injectable, ChangeDetectorRef, Pipe } from 'angular2/core';
|
||||||
import { AlfrescoTranslationService, LangChangeEvent } from './AlfrescoTranslationService.service';
|
import { TranslatePipe } from 'ng2-translate/ng2-translate';
|
||||||
import { isPresent, isArray } from 'angular2/src/facade/lang';
|
import { AlfrescoTranslationService } from './AlfrescoTranslationService.service';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@Pipe({
|
@Pipe({
|
||||||
name: 'translate',
|
name: 'translate',
|
||||||
pure: false // required to update the value when the promise is resolved
|
pure: false // required to update the value when the promise is resolved
|
||||||
})
|
})
|
||||||
export class AlfrescoPipeTranslate implements PipeTransform, OnDestroy {
|
export class AlfrescoPipeTranslate extends TranslatePipe {
|
||||||
value: string = '';
|
|
||||||
lastKey: string;
|
|
||||||
lastParams: any[];
|
|
||||||
onLangChange: EventEmitter<LangChangeEvent>;
|
|
||||||
|
|
||||||
constructor(private translate: AlfrescoTranslationService, private _ref: ChangeDetectorRef) {
|
constructor(translate: AlfrescoTranslationService, _ref: ChangeDetectorRef) {
|
||||||
}
|
super(translate, _ref);
|
||||||
|
|
||||||
/**
|
|
||||||
* @name equals
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Determines if two objects or two values are equivalent.
|
|
||||||
*
|
|
||||||
* Two objects or values are considered equivalent if at least one of the following is true:
|
|
||||||
*
|
|
||||||
* * Both objects or values pass `===` comparison.
|
|
||||||
* * Both objects or values are of the same type and all of their properties are equal by
|
|
||||||
* comparing them with `equals`.
|
|
||||||
*
|
|
||||||
* @param {*} o1 Object or value to compare.
|
|
||||||
* @param {*} o2 Object or value to compare.
|
|
||||||
* @returns {boolean} True if arguments are equal.
|
|
||||||
*/
|
|
||||||
private equals(o1: any, o2: any): boolean {
|
|
||||||
if (o1 === o2) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o1 === null || o2 === null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (o1 !== o1 && o2 !== o2) {
|
|
||||||
return true;
|
|
||||||
} // NaN === NaN
|
|
||||||
let t1 = typeof o1, t2 = typeof o2, length: number, key: any, keySet: any;
|
|
||||||
if (t1 === t2 && t1 === 'object') {
|
|
||||||
if (isArray(o1)) {
|
|
||||||
if (!isArray(o2)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
length = o1.length;
|
|
||||||
if (length === o2.length) {
|
|
||||||
for (key = 0; key < length; key++) {
|
|
||||||
if (!this.equals(o1[key], o2[key])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (isArray(o2)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
keySet = Object.create(null);
|
|
||||||
for (key in o1) {
|
|
||||||
if (key) {
|
|
||||||
if (!this.equals(o1[key], o2[key])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
keySet[key] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (key in o2) {
|
|
||||||
if (!(key in keySet) && typeof o2[key] !== 'undefined') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateValue(key: string, interpolateParams?: Object): void {
|
|
||||||
this.translate.get(key, interpolateParams).subscribe((res: string) => {
|
|
||||||
this.value = res ? res : key;
|
|
||||||
this._ref.markForCheck();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
transform(query: string, ...args: any[]): any {
|
|
||||||
if (!query || query.length === 0) {
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
// if we ask another time for the same key, return the last value
|
|
||||||
if (this.equals(query, this.lastKey) && this.equals(args, this.lastParams)) {
|
|
||||||
return this.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
let interpolateParams: Object;
|
|
||||||
if (args.length && args[0] !== null) {
|
|
||||||
if (typeof args[0] === 'string' && args[0].length) {
|
|
||||||
// we accept objects written in the template such as {n:1},
|
|
||||||
// which is why we might need to change it to real JSON objects such as {"n":1}
|
|
||||||
try {
|
|
||||||
interpolateParams = JSON.parse(args[0].replace(/(['"])?([a-zA-Z0-9_]+)(['"])?:/g, '"$2": '));
|
|
||||||
} catch (e) {
|
|
||||||
throw new SyntaxError(`Wrong parameter in TranslatePipe. Expected a valid Object, received: ${args[0]}`);
|
|
||||||
}
|
|
||||||
} else if (typeof args[0] === 'object' && !Array.isArray(args[0])) {
|
|
||||||
interpolateParams = args[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// store the query, in case it changes
|
|
||||||
this.lastKey = query;
|
|
||||||
|
|
||||||
// store the params, in case they change
|
|
||||||
this.lastParams = args;
|
|
||||||
|
|
||||||
// set the value
|
|
||||||
this.updateValue(query, interpolateParams);
|
|
||||||
|
|
||||||
// if there is a subscription to onLangChange, clean it
|
|
||||||
this._dispose();
|
|
||||||
|
|
||||||
// subscribe to onLangChange event, in case the language changes
|
|
||||||
this.onLangChange = this.translate.onLangChange.subscribe((event: LangChangeEvent) => {
|
|
||||||
this.updateValue(query, interpolateParams);
|
|
||||||
});
|
|
||||||
|
|
||||||
return this.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clean any existing subscription to onLangChange events
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
_dispose(): void {
|
|
||||||
if (isPresent(this.onLangChange)) {
|
|
||||||
this.onLangChange.unsubscribe();
|
|
||||||
this.onLangChange = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
|
||||||
this._dispose();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
import { Injectable } from 'angular2/core';
|
import { Injectable } from 'angular2/core';
|
||||||
import { Response, Http } from 'angular2/http';
|
import { Response, Http } from 'angular2/http';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { TranslateLoader } from './AlfrescoTranslationService.service';
|
import { TranslateLoader } from 'ng2-translate/ng2-translate';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AlfrescoTranslationLoader implements TranslateLoader {
|
export class AlfrescoTranslationLoader implements TranslateLoader {
|
||||||
|
@ -15,87 +15,18 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Injectable, Optional, EventEmitter } from 'angular2/core';
|
import { Injectable, Optional } from 'angular2/core';
|
||||||
|
import { Http } from 'angular2/http';
|
||||||
|
import { MissingTranslationHandler, TranslateService } from 'ng2-translate/ng2-translate';
|
||||||
import { AlfrescoTranslationLoader } from './AlfrescoTranslationLoader.service';
|
import { AlfrescoTranslationLoader } from './AlfrescoTranslationLoader.service';
|
||||||
import { Http, Response } from 'angular2/http';
|
|
||||||
import { Observable } from 'rxjs/Observable';
|
|
||||||
import { Observer } from 'rxjs/Observer';
|
|
||||||
import 'rxjs/add/observable/of';
|
|
||||||
import 'rxjs/add/operator/share';
|
|
||||||
import 'rxjs/add/operator/map';
|
|
||||||
import 'rxjs/add/operator/merge';
|
|
||||||
import 'rxjs/add/operator/toArray';
|
|
||||||
|
|
||||||
import { Parser } from './translate.parser';
|
|
||||||
|
|
||||||
export interface LangChangeEvent {
|
|
||||||
lang: string;
|
|
||||||
translations: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class MissingTranslationHandler {
|
|
||||||
/**
|
|
||||||
* A function that handles missing translations.
|
|
||||||
* @param key the missing key
|
|
||||||
* @returns {any} a value or an observable
|
|
||||||
* If it returns a value, then this value is used.
|
|
||||||
* If it return an observable, the value returned by this observable will be used (except if the method was "instant").
|
|
||||||
* If it doesn't return then the key will be used as a value
|
|
||||||
*/
|
|
||||||
abstract handle(key: string): any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class TranslateLoader {
|
|
||||||
abstract getTranslation(lang: string): Observable<any>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class TranslateStaticLoader implements TranslateLoader {
|
|
||||||
constructor(private http: Http, private prefix: string = 'i18n', private suffix: string = '.json') {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the translations from the server
|
|
||||||
* @param lang
|
|
||||||
* @returns {any}
|
|
||||||
*/
|
|
||||||
public getTranslation(lang: string): Observable<any> {
|
|
||||||
return this.http.get(`${this.prefix}/${lang}${this.suffix}`)
|
|
||||||
.map((res: Response) => res.json());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AlfrescoTranslationService {
|
export class AlfrescoTranslationService extends TranslateService {
|
||||||
/**
|
userLang: string = 'en' ;
|
||||||
* The lang currently used
|
currentLoader: AlfrescoTranslationLoader;
|
||||||
*/
|
|
||||||
public currentLang: string = this.defaultLang;
|
|
||||||
|
|
||||||
/**
|
constructor(http: Http, currentLoader: AlfrescoTranslationLoader, @Optional() missingTranslationHandler: MissingTranslationHandler) {
|
||||||
* An EventEmitter to listen to lang changes events
|
super(http, currentLoader, missingTranslationHandler);
|
||||||
* onLangChange.subscribe((params: LangChangeEvent) => {
|
|
||||||
* // do something
|
|
||||||
* });
|
|
||||||
* @type {ng.EventEmitter<LangChangeEvent>}
|
|
||||||
*/
|
|
||||||
public onLangChange: EventEmitter<LangChangeEvent> = new EventEmitter<LangChangeEvent>();
|
|
||||||
|
|
||||||
private pending: any;
|
|
||||||
private translations: any = {};
|
|
||||||
private defaultLang: string;
|
|
||||||
private langs: Array<string>;
|
|
||||||
private parser: Parser = new Parser();
|
|
||||||
|
|
||||||
userLang: string = 'en';
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param http The Angular 2 http provider
|
|
||||||
* @param currentLoader An instance of the loader currently used
|
|
||||||
* @param missingTranslationHandler A handler for missing translations.
|
|
||||||
*/
|
|
||||||
constructor(private http: Http, public currentLoader: AlfrescoTranslationLoader, @Optional()
|
|
||||||
private missingTranslationHandler: MissingTranslationHandler) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
translationInit(name: string = ''): void {
|
translationInit(name: string = ''): void {
|
||||||
@ -113,238 +44,4 @@ export class AlfrescoTranslationService {
|
|||||||
this.getTranslation(this.userLang);
|
this.getTranslation(this.userLang);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the default language to use as a fallback
|
|
||||||
* @param lang
|
|
||||||
*/
|
|
||||||
public setDefaultLang(lang: string): void {
|
|
||||||
this.defaultLang = lang;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the lang currently used
|
|
||||||
* @param lang
|
|
||||||
* @returns {Observable<*>}
|
|
||||||
*/
|
|
||||||
public use(lang: string): Observable<any> {
|
|
||||||
let pending: Observable<any>;
|
|
||||||
// check if this language is available
|
|
||||||
if (typeof this.translations[lang] === 'undefined') {
|
|
||||||
// not available, ask for it
|
|
||||||
pending = this.getTranslation(lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof pending !== 'undefined') {
|
|
||||||
pending.subscribe((res: any) => {
|
|
||||||
this.changeLang(lang);
|
|
||||||
});
|
|
||||||
|
|
||||||
return pending;
|
|
||||||
} else { // we have this language, return an Observable
|
|
||||||
this.changeLang(lang);
|
|
||||||
|
|
||||||
return Observable.of(this.translations[lang]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an object of translations for a given language with the current loader
|
|
||||||
* @param lang
|
|
||||||
* @returns {Observable<*>}
|
|
||||||
*/
|
|
||||||
public getTranslation(lang: string): Observable<any> {
|
|
||||||
this.pending = this.currentLoader.getTranslation(lang).share();
|
|
||||||
this.pending.subscribe((res: Object) => {
|
|
||||||
this.translations[lang] = res;
|
|
||||||
this.updateLangs();
|
|
||||||
}, (err: any) => {
|
|
||||||
throw err;
|
|
||||||
}, () => {
|
|
||||||
this.pending = undefined;
|
|
||||||
});
|
|
||||||
|
|
||||||
return this.pending;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Manually sets an object of translations for a given language
|
|
||||||
* @param lang
|
|
||||||
* @param translations
|
|
||||||
*/
|
|
||||||
public setTranslation(lang: string, translations: Object): void {
|
|
||||||
this.translations[lang] = translations;
|
|
||||||
this.updateLangs();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an array of currently available langs
|
|
||||||
* @returns {any}
|
|
||||||
*/
|
|
||||||
public getLangs(): Array<string> {
|
|
||||||
return this.langs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the list of available langs
|
|
||||||
*/
|
|
||||||
private updateLangs(): void {
|
|
||||||
this.langs = Object.keys(this.translations);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the parsed result of the translations
|
|
||||||
* @param translations
|
|
||||||
* @param key
|
|
||||||
* @param interpolateParams
|
|
||||||
* @returns {any}
|
|
||||||
*/
|
|
||||||
private getParsedResult(translations: any, key: any, interpolateParams?: Object): any {
|
|
||||||
let res: string|Observable<string>;
|
|
||||||
|
|
||||||
if (key instanceof Array) {
|
|
||||||
let result: any = {},
|
|
||||||
observables: boolean = false;
|
|
||||||
for (let k of key) {
|
|
||||||
result[k] = this.getParsedResult(translations, k, interpolateParams);
|
|
||||||
if (typeof result[k].subscribe === 'function') {
|
|
||||||
observables = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (observables) {
|
|
||||||
let mergedObs: any;
|
|
||||||
for (let k of key) {
|
|
||||||
let obs = typeof result[k].subscribe === 'function' ? result[k] : Observable.of(result[k]);
|
|
||||||
if (typeof mergedObs === 'undefined') {
|
|
||||||
mergedObs = obs;
|
|
||||||
} else {
|
|
||||||
mergedObs = mergedObs.merge(obs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mergedObs.toArray().map((arr: Array<string>) => {
|
|
||||||
let obj: any = {};
|
|
||||||
arr.forEach((value: string, index: number) => {
|
|
||||||
obj[key[index]] = value;
|
|
||||||
});
|
|
||||||
return obj;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (translations) {
|
|
||||||
res = this.parser.interpolate(this.parser.getValue(translations, key), interpolateParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof res === 'undefined' && this.defaultLang && this.defaultLang !== this.currentLang) {
|
|
||||||
res = this.parser.interpolate(this.parser.getValue(this.translations[this.defaultLang], key), interpolateParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!res && this.missingTranslationHandler) {
|
|
||||||
res = this.missingTranslationHandler.handle(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res || key;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the translated value of a key (or an array of keys)
|
|
||||||
* @param key
|
|
||||||
* @param interpolateParams
|
|
||||||
* @returns {any} the translated key, or an object of translated keys
|
|
||||||
*/
|
|
||||||
public get(key: string|Array<string>, interpolateParams?: Object): Observable<string|any> {
|
|
||||||
if (!key) {
|
|
||||||
throw new Error('Parameter "key" required');
|
|
||||||
}
|
|
||||||
// check if we are loading a new translation to use
|
|
||||||
if (this.pending) {
|
|
||||||
return Observable.create((observer: Observer<string>) => {
|
|
||||||
let onComplete = (res: string) => {
|
|
||||||
observer.next(res);
|
|
||||||
observer.complete();
|
|
||||||
};
|
|
||||||
this.pending.subscribe((resSub: any) => {
|
|
||||||
let res = this.getParsedResult(resSub, key, interpolateParams);
|
|
||||||
if (typeof res.subscribe === 'function') {
|
|
||||||
res.subscribe(onComplete);
|
|
||||||
} else {
|
|
||||||
onComplete(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
let res = this.getParsedResult(this.translations[this.currentLang], key, interpolateParams);
|
|
||||||
if (typeof res.subscribe === 'function') {
|
|
||||||
return res;
|
|
||||||
} else {
|
|
||||||
return Observable.of(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a translation instantly from the internal state of loaded translation.
|
|
||||||
* All rules regarding the current language, the preferred language of even fallback languages will be used except any promise handling.
|
|
||||||
* @param key
|
|
||||||
* @param interpolateParams
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
public instant(key: string|Array<string>, interpolateParams?: Object): string|any {
|
|
||||||
if (!key) {
|
|
||||||
throw new Error('Parameter "key" required');
|
|
||||||
}
|
|
||||||
|
|
||||||
let res = this.getParsedResult(this.translations[this.currentLang], key, interpolateParams);
|
|
||||||
if (typeof res.subscribe !== 'undefined') {
|
|
||||||
if (key instanceof Array) {
|
|
||||||
let obj: any = {};
|
|
||||||
key.forEach((value: string, index: number) => {
|
|
||||||
obj[key[index]] = key[index];
|
|
||||||
});
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
} else {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the translated value of a key
|
|
||||||
* @param key
|
|
||||||
* @param value
|
|
||||||
* @param lang
|
|
||||||
*/
|
|
||||||
public set(key: string, value: string, lang: string = this.currentLang): void {
|
|
||||||
this.translations[lang][key] = value;
|
|
||||||
this.updateLangs();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the current lang
|
|
||||||
* @param lang
|
|
||||||
*/
|
|
||||||
private changeLang(lang: string): void {
|
|
||||||
this.currentLang = lang;
|
|
||||||
this.onLangChange.emit({lang: lang, translations: this.translations[lang]});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allows to reload the lang file from the file
|
|
||||||
* @param lang
|
|
||||||
* @returns {Observable<any>}
|
|
||||||
*/
|
|
||||||
public reloadLang(lang: string): Observable<any> {
|
|
||||||
this.resetLang(lang);
|
|
||||||
return this.getTranslation(lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deletes inner translation
|
|
||||||
* @param lang
|
|
||||||
*/
|
|
||||||
public resetLang(lang: string): void {
|
|
||||||
this.translations[lang] = undefined;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,65 +0,0 @@
|
|||||||
/*!
|
|
||||||
* @license
|
|
||||||
* Copyright 2016 Alfresco Software, Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export class Parser {
|
|
||||||
templateMatcher: RegExp = /{{\s?([^{}\s]*)\s?}}/g;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interpolates a string to replace parameters
|
|
||||||
* "This is a {{ key }}" ==> "This is a value", with params = { key: "value" }
|
|
||||||
* @param expr
|
|
||||||
* @param params
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
public interpolate(expr: string, params?: any): string {
|
|
||||||
if (typeof expr !== 'string' || !params) {
|
|
||||||
return expr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return expr.replace(this.templateMatcher, (substring: string, b: string) => {
|
|
||||||
let r = this.getValue(params, b);
|
|
||||||
return typeof r !== 'undefined' ? r : substring;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a value from an object by composed key
|
|
||||||
* parser.getValue({ key1: { keyA: 'valueI' }}, 'key1.keyA') ==> 'valueI'
|
|
||||||
* @param target
|
|
||||||
* @param key
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
public getValue(target: any, key: string): string {
|
|
||||||
let keys = key.split('.');
|
|
||||||
key = '';
|
|
||||||
do {
|
|
||||||
key += keys.shift();
|
|
||||||
if (target[key] !== undefined && (typeof target[key] === 'object' || !keys.length)) {
|
|
||||||
target = target[key];
|
|
||||||
key = '';
|
|
||||||
} else if (!keys.length) {
|
|
||||||
target = undefined;
|
|
||||||
} else {
|
|
||||||
key += '.';
|
|
||||||
}
|
|
||||||
} while (keys.length);
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -26,6 +26,7 @@
|
|||||||
'ng2-translate': 'node_modules/ng2-translate',
|
'ng2-translate': 'node_modules/ng2-translate',
|
||||||
'rxjs': 'node_modules/rxjs',
|
'rxjs': 'node_modules/rxjs',
|
||||||
'angular2' : 'node_modules/angular2',
|
'angular2' : 'node_modules/angular2',
|
||||||
|
'ng2-translate' : 'node_modules/ng2-translate',
|
||||||
'app': 'dist/src'
|
'app': 'dist/src'
|
||||||
},
|
},
|
||||||
packages: {
|
packages: {
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
"es6-promise": "3.0.2",
|
"es6-promise": "3.0.2",
|
||||||
"es6-shim": "0.35.0",
|
"es6-shim": "0.35.0",
|
||||||
"ng2-alfresco-login": "^0.1.0",
|
"ng2-alfresco-login": "^0.1.0",
|
||||||
|
"ng2-translate": "^1.11.3",
|
||||||
"ng2-translate": "^1.11.2",
|
"ng2-translate": "^1.11.2",
|
||||||
"reflect-metadata": "0.1.2",
|
"reflect-metadata": "0.1.2",
|
||||||
"rxjs": "5.0.0-beta.2",
|
"rxjs": "5.0.0-beta.2",
|
||||||
|
@ -17,13 +17,17 @@ System.config({
|
|||||||
'ng2-alfresco-core/dist': {
|
'ng2-alfresco-core/dist': {
|
||||||
defaultExtension: 'js'
|
defaultExtension: 'js'
|
||||||
},
|
},
|
||||||
|
'ng2-translate': {
|
||||||
|
defaultExtension: 'js'
|
||||||
|
},
|
||||||
'rxjs': {
|
'rxjs': {
|
||||||
defaultExtension: 'js'
|
defaultExtension: 'js'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
map: {
|
map: {
|
||||||
'ng2-alfresco-core/dist': '/base/node_modules/ng2-alfresco-core/dist',
|
'ng2-alfresco-core/dist': '/base/node_modules/ng2-alfresco-core/dist',
|
||||||
'rxjs': '/base/node_modules/rxjs'
|
'rxjs': '/base/node_modules/rxjs',
|
||||||
|
'ng2-translate' : '/base/node_modules/ng2-translate'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ module.exports = function (config) {
|
|||||||
{pattern: 'node_modules/angular2/bundles/router.dev.js', included: true, watched: false},
|
{pattern: 'node_modules/angular2/bundles/router.dev.js', included: true, watched: false},
|
||||||
{pattern: 'node_modules/alfresco-core-rest-api/bundle.js', included: true, watched: false},
|
{pattern: 'node_modules/alfresco-core-rest-api/bundle.js', included: true, watched: false},
|
||||||
{pattern: 'node_modules/ng2-alfresco-core/dist/**/*.js', included: false, served: true, watched: false},
|
{pattern: 'node_modules/ng2-alfresco-core/dist/**/*.js', included: false, served: true, watched: false},
|
||||||
|
{pattern: 'node_modules/ng2-translate/**/*.js', included: false, served: true, watched: false},
|
||||||
|
|
||||||
{pattern: 'karma-test-shim.js', included: true, watched: true},
|
{pattern: 'karma-test-shim.js', included: true, watched: true},
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ng2-alfresco-login",
|
"name": "ng2-alfresco-login",
|
||||||
"description": "Alfresco Angular2 Login Component",
|
"description": "Alfresco Angular2 Login Component",
|
||||||
"version": "0.1.6",
|
"version": "0.1.7",
|
||||||
"author": "Alfresco Software, Ltd.",
|
"author": "Alfresco Software, Ltd.",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"typings": "typings install",
|
"typings": "typings install",
|
||||||
@ -63,7 +63,8 @@
|
|||||||
"reflect-metadata": "0.1.2",
|
"reflect-metadata": "0.1.2",
|
||||||
"rxjs": "5.0.0-beta.2",
|
"rxjs": "5.0.0-beta.2",
|
||||||
"systemjs": "0.19.26",
|
"systemjs": "0.19.26",
|
||||||
"zone.js": "^0.6.12"
|
"zone.js": "^0.6.12",
|
||||||
|
"ng2-translate": "^1.11.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"angular2": "2.0.0-beta.15"
|
"angular2": "2.0.0-beta.15"
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
'ng2-alfresco-upload': 'node_modules/ng2-alfresco-upload',
|
'ng2-alfresco-upload': 'node_modules/ng2-alfresco-upload',
|
||||||
'rxjs': 'node_modules/rxjs',
|
'rxjs': 'node_modules/rxjs',
|
||||||
'angular2' : 'node_modules/angular2',
|
'angular2' : 'node_modules/angular2',
|
||||||
|
'ng2-translate' : 'node_modules/ng2-translate',
|
||||||
'app': 'dist/src'
|
'app': 'dist/src'
|
||||||
},
|
},
|
||||||
packages: {
|
packages: {
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
"material-design-lite": "^1.1.3",
|
"material-design-lite": "^1.1.3",
|
||||||
"ng2-alfresco-core": "^0.1.6",
|
"ng2-alfresco-core": "^0.1.6",
|
||||||
"ng2-alfresco-upload": "^0.1.0",
|
"ng2-alfresco-upload": "^0.1.0",
|
||||||
|
"ng2-translate": "^1.11.3",
|
||||||
"reflect-metadata": "0.1.2",
|
"reflect-metadata": "0.1.2",
|
||||||
"rxjs": "5.0.0-beta.2",
|
"rxjs": "5.0.0-beta.2",
|
||||||
"zone.js": "0.6.6"
|
"zone.js": "0.6.6"
|
||||||
|
@ -17,13 +17,17 @@ System.config({
|
|||||||
'ng2-alfresco-core/dist': {
|
'ng2-alfresco-core/dist': {
|
||||||
defaultExtension: 'js'
|
defaultExtension: 'js'
|
||||||
},
|
},
|
||||||
|
'ng2-translate': {
|
||||||
|
defaultExtension: 'js'
|
||||||
|
},
|
||||||
'rxjs': {
|
'rxjs': {
|
||||||
defaultExtension: 'js'
|
defaultExtension: 'js'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
map: {
|
map: {
|
||||||
'ng2-alfresco-core/dist': '/base/node_modules/ng2-alfresco-core/dist',
|
'ng2-alfresco-core/dist': '/base/node_modules/ng2-alfresco-core/dist',
|
||||||
'rxjs': '/base/node_modules/rxjs'
|
'rxjs': '/base/node_modules/rxjs',
|
||||||
|
'ng2-translate' : '/base/node_modules/ng2-translate'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ module.exports = function (config) {
|
|||||||
{pattern: 'node_modules/angular2/bundles/router.dev.js', included: true, watched: false},
|
{pattern: 'node_modules/angular2/bundles/router.dev.js', included: true, watched: false},
|
||||||
{pattern: 'node_modules/alfresco-core-rest-api/bundle.js', included: true, watched: false},
|
{pattern: 'node_modules/alfresco-core-rest-api/bundle.js', included: true, watched: false},
|
||||||
{pattern: 'node_modules/ng2-alfresco-core/dist/**/*.js', included: false, served: true, watched: false},
|
{pattern: 'node_modules/ng2-alfresco-core/dist/**/*.js', included: false, served: true, watched: false},
|
||||||
|
{pattern: 'node_modules/ng2-translate/**/*.js', included: false, served: true, watched: false},
|
||||||
|
|
||||||
{pattern: 'karma-test-shim.js', included: true, watched: true},
|
{pattern: 'karma-test-shim.js', included: true, watched: true},
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ng2-alfresco-upload",
|
"name": "ng2-alfresco-upload",
|
||||||
"description": "Alfresco Angular2 Upload Component",
|
"description": "Alfresco Angular2 Upload Component",
|
||||||
"version": "0.1.9",
|
"version": "0.1.10",
|
||||||
"author": "Alfresco Software, Ltd.",
|
"author": "Alfresco Software, Ltd.",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"typings": "typings install",
|
"typings": "typings install",
|
||||||
@ -55,7 +55,8 @@
|
|||||||
"reflect-metadata": "0.1.2",
|
"reflect-metadata": "0.1.2",
|
||||||
"rxjs": "5.0.0-beta.2",
|
"rxjs": "5.0.0-beta.2",
|
||||||
"systemjs": "0.19.26",
|
"systemjs": "0.19.26",
|
||||||
"zone.js": "^0.6.12"
|
"zone.js": "^0.6.12",
|
||||||
|
"ng2-translate": "^1.11.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"angular2": "2.0.0-beta.15"
|
"angular2": "2.0.0-beta.15"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user