@@ -7,6 +7,7 @@ import "rxjs/add/operator/share";
77import "rxjs/add/operator/map" ;
88import "rxjs/add/operator/merge" ;
99import "rxjs/add/operator/toArray" ;
10+ import "rxjs/add/operator/take" ;
1011
1112import { TranslateParser } from "./translate.parser" ;
1213import { isDefined } from "./util" ;
@@ -129,6 +130,7 @@ export class TranslateService {
129130 /**
130131 *
131132 * @param currentLoader An instance of the loader currently used
133+ * @param parser An instance of the parser currently used
132134 * @param missingTranslationHandler A handler for missing translations.
133135 */
134136 constructor (
@@ -142,6 +144,10 @@ export class TranslateService {
142144 * @param lang
143145 */
144146 public setDefaultLang ( lang : string ) : void {
147+ if ( lang === this . defaultLang ) {
148+ return ;
149+ }
150+
145151 let pending : Observable < any > = this . retrieveTranslations ( lang ) ;
146152
147153 if ( typeof pending !== "undefined" ) {
@@ -150,10 +156,10 @@ export class TranslateService {
150156 this . defaultLang = lang ;
151157 }
152158
153- pending . subscribe ( ( res : any ) => {
154- this . changeDefaultLang ( lang ) ;
155- } , ( err : any ) => {
156- } ) ;
159+ pending . take ( 1 )
160+ . subscribe ( ( res : any ) => {
161+ this . changeDefaultLang ( lang ) ;
162+ } ) ;
157163 } else { // we already have this language
158164 this . changeDefaultLang ( lang ) ;
159165 }
@@ -180,10 +186,11 @@ export class TranslateService {
180186 if ( ! this . currentLang ) {
181187 this . currentLang = lang ;
182188 }
183- pending . subscribe ( ( res : any ) => {
184- this . changeLang ( lang ) ;
185- } , ( err : any ) => {
186- } ) ;
189+
190+ pending . take ( 1 )
191+ . subscribe ( ( res : any ) => {
192+ this . changeLang ( lang ) ;
193+ } ) ;
187194
188195 return pending ;
189196 } else { // we have this language, return an Observable
@@ -200,11 +207,12 @@ export class TranslateService {
200207 */
201208 private retrieveTranslations ( lang : string ) : Observable < any > {
202209 let pending : Observable < any > ;
203- // check if this language is available
210+
211+ // if this language is unavailable, ask for it
204212 if ( typeof this . translations [ lang ] === "undefined" ) {
205- // not available, ask for it
206213 pending = this . getTranslation ( lang ) ;
207214 }
215+
208216 return pending ;
209217 }
210218
@@ -215,13 +223,15 @@ export class TranslateService {
215223 */
216224 public getTranslation ( lang : string ) : Observable < any > {
217225 this . pending = this . currentLoader . getTranslation ( lang ) . share ( ) ;
218- this . pending . subscribe ( ( res : Object ) => {
219- this . translations [ lang ] = res ;
220- this . updateLangs ( ) ;
221- this . pending = undefined ;
222- } , ( err : any ) => {
223- this . pending = undefined ;
224- } ) ;
226+
227+ this . pending . take ( 1 )
228+ . subscribe ( ( res : Object ) => {
229+ this . translations [ lang ] = res ;
230+ this . updateLangs ( ) ;
231+ this . pending = undefined ;
232+ } , ( err : any ) => {
233+ this . pending = undefined ;
234+ } ) ;
225235
226236 return this . pending ;
227237 }
@@ -235,11 +245,11 @@ export class TranslateService {
235245 public setTranslation ( lang : string , translations : Object , shouldMerge : boolean = false ) : void {
236246 if ( shouldMerge && this . translations [ lang ] ) {
237247 Object . assign ( this . translations [ lang ] , translations ) ;
238- this . onTranslationChange . emit ( { translations : this . translations [ lang ] , lang : lang } ) ;
239248 } else {
240249 this . translations [ lang ] = translations ;
241250 }
242251 this . updateLangs ( ) ;
252+ this . onTranslationChange . emit ( { lang : lang , translations : this . translations [ lang ] } ) ;
243253 }
244254
245255 /**
@@ -317,15 +327,15 @@ export class TranslateService {
317327 res = this . parser . interpolate ( this . parser . getValue ( this . translations [ this . defaultLang ] , key ) , interpolateParams ) ;
318328 }
319329
320- if ( ! res && this . missingTranslationHandler ) {
321- let params : MissingTranslationHandlerParams = { key, translateService : this } ;
322- if ( typeof interpolateParams !== 'undefined' ) {
330+ if ( ! res && this . missingTranslationHandler ) {
331+ let params : MissingTranslationHandlerParams = { key, translateService : this } ;
332+ if ( typeof interpolateParams !== 'undefined' ) {
323333 params . interpolateParams = interpolateParams ;
324334 }
325335 res = this . missingTranslationHandler . handle ( params ) ;
326336 }
327337
328- return res !== undefined ? res : key ;
338+ return typeof res !== " undefined" ? res : key ;
329339 }
330340
331341 /**
@@ -403,7 +413,7 @@ export class TranslateService {
403413 public set ( key : string , value : string , lang : string = this . currentLang ) : void {
404414 this . translations [ lang ] [ key ] = value ;
405415 this . updateLangs ( ) ;
406- this . onTranslationChange . emit ( { translations : { [ key ] : value } , lang : lang } ) ;
416+ this . onTranslationChange . emit ( { lang : lang , translations : this . translations [ lang ] } ) ;
407417 }
408418
409419 /**
@@ -413,6 +423,11 @@ export class TranslateService {
413423 private changeLang ( lang : string ) : void {
414424 this . currentLang = lang ;
415425 this . onLangChange . emit ( { lang : lang , translations : this . translations [ lang ] } ) ;
426+
427+ // if there is no default lang, use the one that we just set
428+ if ( ! this . defaultLang ) {
429+ this . changeDefaultLang ( lang ) ;
430+ }
416431 }
417432
418433 /**
@@ -472,7 +487,7 @@ export class TranslateService {
472487 * @returns string
473488 */
474489 public getBrowserCultureLang ( ) : string {
475- if ( typeof window === 'undefined' || typeof window . navigator === 'undefined' ) {
490+ if ( typeof window === 'undefined' || typeof window . navigator === 'undefined' ) {
476491 return undefined ;
477492 }
478493
0 commit comments