In the post-$localize world the current locale value is defined by setting `$localize.locale` which is then read at runtime by Angular in the provider for the `LOCALE_ID` token and also passed to the ivy machinery via`setLocaleId()`. The $localize compile-time inlining tooling can replace occurrences of `$localize.locale` with a string literal, similar to how translations are inlined. // FW-1639 See https://github.com/angular/angular-cli/issues/15896 PR Close #33314
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google Inc. All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| import {LOCALE_ID} from '@angular/core';
 | |
| import {ivyEnabled} from '@angular/private/testing';
 | |
| 
 | |
| import {getLocaleId} from '../src/render3';
 | |
| import {global} from '../src/util/global';
 | |
| import {TestBed} from '../testing';
 | |
| import {describe, expect, inject, it} from '../testing/src/testing_internal';
 | |
| 
 | |
| {
 | |
|   describe('Application module', () => {
 | |
|     it('should set the default locale to "en-US"',
 | |
|        inject([LOCALE_ID], (defaultLocale: string) => { expect(defaultLocale).toEqual('en-US'); }));
 | |
| 
 | |
|     if (ivyEnabled) {
 | |
|       it('should set the ivy locale with the configured LOCALE_ID', () => {
 | |
|         TestBed.configureTestingModule({providers: [{provide: LOCALE_ID, useValue: 'fr'}]});
 | |
|         const before = getLocaleId();
 | |
|         const locale = TestBed.inject(LOCALE_ID);
 | |
|         const after = getLocaleId();
 | |
|         expect(before).toEqual('en-us');
 | |
|         expect(locale).toEqual('fr');
 | |
|         expect(after).toEqual('fr');
 | |
|       });
 | |
| 
 | |
|       describe('$localize.locale', () => {
 | |
|         beforeEach(() => initLocale('de'));
 | |
|         afterEach(() => restoreLocale());
 | |
| 
 | |
|         it('should set the ivy locale to `$localize.locale` value if it is defined', () => {
 | |
|           // Injecting `LOCALE_ID` should also initialize the ivy locale
 | |
|           const locale = TestBed.inject(LOCALE_ID);
 | |
|           expect(locale).toEqual('de');
 | |
|           expect(getLocaleId()).toEqual('de');
 | |
|         });
 | |
| 
 | |
|         it('should set the ivy locale to an application provided LOCALE_ID even if `$localize.locale` is defined',
 | |
|            () => {
 | |
|              TestBed.configureTestingModule({providers: [{provide: LOCALE_ID, useValue: 'fr'}]});
 | |
|              const locale = TestBed.inject(LOCALE_ID);
 | |
|              expect(locale).toEqual('fr');
 | |
|              expect(getLocaleId()).toEqual('fr');
 | |
|            });
 | |
|       });
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| let hasGlobalLocalize: boolean;
 | |
| let hasGlobalLocale: boolean;
 | |
| let originalLocale: string;
 | |
| 
 | |
| function initLocale(locale: string) {
 | |
|   hasGlobalLocalize = Object.getOwnPropertyNames(global).includes('$localize');
 | |
|   if (!hasGlobalLocalize) {
 | |
|     global.$localize = {};
 | |
|   }
 | |
|   hasGlobalLocale = Object.getOwnPropertyNames(global.$localize).includes('locale');
 | |
|   originalLocale = global.$localize.locale;
 | |
|   global.$localize.locale = locale;
 | |
| }
 | |
| 
 | |
| function restoreLocale() {
 | |
|   if (hasGlobalLocale) {
 | |
|     global.$localize.locale = originalLocale;
 | |
|   } else {
 | |
|     delete global.$localize.locale;
 | |
|   }
 | |
| 
 | |
|   if (!hasGlobalLocalize) {
 | |
|     delete global.$localize;
 | |
|   }
 | |
| }
 |