# Localization Before you read about _the Localization Pipe_ and _the Localization Service_, you should know about localization keys. The Localization key format consists of 2 sections which are **Resource Name** and **Key**. `ResourceName::Key` > If you do not specify the resource name, it will be `defaultResourceName` which is declared in `environment.ts` ```js const environment = { //... localization: { defaultResourceName: 'MyProjectName', }, }; ``` So these two are the same: ```html

{%{{{ '::Key' | abpLocalization }}}%}

{%{{{ 'MyProjectName::Key' | abpLocalization }}}%}

``` ## Using the Localization Pipe You can use the `abpLocalization` pipe to get localized text as in this example: ```html

{%{{{ 'Resource::Key' | abpLocalization }}}%}

``` The pipe will replace the key with the localized text. You can also specify a default value as shown below: ```html

{%{{{ { key: 'Resource::Key', defaultValue: 'Default Value' } | abpLocalization }}}%}

``` To use interpolation, you must give the values for interpolation as pipe parameters, for example: Localization data is stored in key-value pairs: ```js { //... AbpAccount: { // AbpAccount is the resource name Key: "Value", PagerInfo: "Showing {0} to {1} of {2} entries" } } ``` So we can use this key like this: ```html

{%{{{ 'AbpAccount::PagerInfo' | abpLocalization:'20':'30':'50' }}}%}

``` ### Using the Localization Service First of all you should import the `LocalizationService` from **@abp/ng.core** ```js import { LocalizationService } from '@abp/ng.core'; class MyClass { constructor(private localizationService: LocalizationService) {} } ``` After that, you are able to use localization service. > You can add interpolation parameters as arguments to `instant()` and `get()` methods. ```js this.localizationService.instant('AbpIdentity::UserDeletionConfirmation', 'John'); // with fallback value this.localizationService.instant( { key: 'AbpIdentity::UserDeletionConfirmation', defaultValue: 'Default Value' }, 'John', ); // Output // User 'John' will be deleted. Do you confirm that? ``` To get a localized text as [_Observable_](https://rxjs.dev/guide/observable) use `get` method instead of `instant`: ```js this.localizationService.get('Resource::Key'); // with fallback value this.localizationService.get({ key: 'Resource::Key', defaultValue: 'Default Value' }); ``` ### Using the Config State In order to you `getLocalization` method you should import ConfigState. ```js import { ConfigState } from '@abp/ng.core'; ``` Then you can use it as followed: ```js this.store.selectSnapshot(ConfigState.getLocalization('ResourceName::Key')); ``` `getLocalization` method can be used with both `localization key` and [`LocalizationWithDefault`](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/config.ts#L34) interface. ```js this.store.selectSnapshot( ConfigState.getLocalization( { key: 'AbpIdentity::UserDeletionConfirmation', defaultValue: 'Default Value', }, 'John', ), ); ``` Localization resources are stored in the `localization` property of `ConfigState`. ## RTL Support As of v2.9 ABP has RTL support. If you are generating a new project with v2.9 and above, everything is set, you do not need to do any changes. If you are migrating your project from an earlier version, please follow the 2 steps below: #### Step 1. Create Chunks for Bootstrap LTR and RTL Find [styles configuration in angular.json](https://angular.io/guide/workspace-config#style-script-config) and make sure the chunks in your project has `bootstrap-rtl.min` and `bootstrap-ltr.min` as shown below. ```json { "projects": { "MyProjectName": { "architect": { "build": { "options": { "styles": [ { "input": "node_modules/@abp/ng.theme.shared/styles/bootstrap-rtl.min.css", "inject": false, "bundleName": "bootstrap-rtl.min" }, { "input": "node_modules/bootstrap/dist/css/bootstrap.min.css", "inject": true, "bundleName": "bootstrap-ltr.min" }, { "input": "node_modules/@fortawesome/fontawesome-free/css/all.min.css", "inject": true, "bundleName": "fontawesome-all.min" }, { "input": "node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css", "inject": true, "bundleName": "fontawesome-v4-shims.min" }, "apps/dev-app/src/styles.scss" ], } } } } } } #### Step 2. Clear Lazy Loaded Fontawesome in AppComponent If you have created and injected chunks for Fontawesome as seen above, you no longer need the lazy loading in the `AppComponent` which was implemented before v2.9. Simply remove them. The `AppComponent` in the template of the new version looks like this: ```js import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ` `, }) export class AppComponent {} ``` ## See Also * [Localization in ASP.NET Core](../../Localization.md) ## What's Next? * [Permission Management](./Permission-Management.md)