- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- error
- C++
- Angular
- 네트워크
- 자바스크립트
- 웹
- 프론트엔드
- 상태관리
- html
- JavaScript
- http
- deep dive
- 모던 자바스크립트
- Java Script
- 이터러블
- 비동기
- get
- es6
- js
- 모던 자바스크립트 deep dive
- map
- git
- 백준 실버
- async
- git error
- 백준
- 알고리즘
- React
- 에러처리
- 그림으로 배우는 http&network
sharingStorage
Angular 다국어전용 | @ngx-translate 사용법 본문
ngx-translate 라이브러리를 이요하여 Angular 애플리케이션에 다국어 변환 기능을 적용하는 방법을 정리해 보려고 한다.
다국어 변환에 있어서 Angular는 자체 i18n(Internationalization) 기능을 제공하므로 두가지 중 선택하면 된다.
ngx-translate 설치 및 사용법
https://github.com/ngx-translate/core 공식문서에도 설명이 굉장히 잘 돼있다.
1. npm 모듈을 설치한다.
npm install @ngx-translate/core
2. 설치가 완료되면 상위모듈 (ex AppModule)에 TranslateModule 을 import한다.
(본인은 defaultModule)
이때 forRoot로 적용한다. loader를 설정하기 위해 http-loader 패키지를 설치한다.
npm install @npx-translate/http-loader --save
import {TranslateLoader, TranslateModule} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {HttpClientModule, HTTP_INTERCEPTORS, HttpClient} from '@angular/common/http';
.
.
.
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, 'assets/il8n/', '.json');
}
이 때 useFactory에 선언한 TranslateHttpLoader 함수에서 리턴하는 로더의 인자로 전달되는 경로에 번역을 위한 파일을 생성해야한다.
이 json파일을 참고해 각각 키를 매핑된 값으로 바꿔주는 방식으로 translate가 동작한다.
경로가 assets/i18n/*.json 이므로 아래와 같은 경로에 원하는 언어의 파일을 생성해둔다.
3. default.component에 TranslateService 를 주입시키고 초기화 해주는 소스코드를 작성한다.
import {TranslateService} from '@ngx-translate/core';
import { OnInit, AfterViewInit, PLATFORM_ID, Inject } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
@Component({
selector: 'app-root',
templateUrl: './default.component.html',
styleUrls: ['./default.component.scss']
})
export class DefaultComponent implements OnInit , AfterViewInit {
loading = false;
public settings: Settings;
public language: string;
constructor(public appSettings: AppSettings,
public router: Router,
private translate: TranslateService,
@Inject(PLATFORM_ID) private platformId: Object) {
this.settings = this.appSettings.settings;
}
// 초기에는 언어 selection에 대한 데이터를 로컬 스토리지에서 얻고
// user selection에 따른 언어 변화를 가능하게 한다.
ngOnInit() {
if (isPlatformBrowser(this.platformId)) {
this.language = localStorage.getItem('language');
}
if (this.language) {
if (this.language === 'हिंदी') {
this.translate.setDefaultLang('hi');
} else if(this.language === 'English') {
this.translate.setDefaultLang('en');
} else if(this.language === 'Korea'){
this.translate.setDefaultLang('ko');
} else if(this.language === 'French'){
this.translate.setDefaultLang('fr');
}
} else {
this.translate.setDefaultLang('en');
}
}
translate.use() 를 사용하면 해당언어로 template가 활성되지만 본인은 this.setDefaultLang()으로도 기능활성화가 가능했다.
4. 템플릿 코드
ngx-translate가 번역할 문자열들을 key로 대체하고 translate 파이프를 사용하여 템플릿을 수정한다.
header-menu.component.html
<span>
<div class="divider"></div>
<a mat-menu-item routerLink="/account/order-manage-order">
<mat-icon class="mat-icon-sm"><mat-icon>description</mat-icon>
</mat-icon>
<span>{{'Shared.OrderHistory'|translate}}</span>
</a>
<a mat-menu-item routerLink="/account">
<mat-icon class="mat-icon-sm">settings</mat-icon>
<span>{{'Shared.AccountSettings'|translate}}</span>
</a>
<a mat-menu-item routerLink="/wishlist" fxHide="false" fxHide.gt-sm>
<mat-icon class="mat-icon-sm">favorite</mat-icon>
<span>{{'Shared.Wishlist'|translate}}({{commonSandbox.wishlistCount$ | async}})</span>
</a>
<div class="divider"></div>
<a mat-menu-item (click)="signOut()">
<mat-icon class="mat-icon-sm">power_settings_new</mat-icon>
<span>{{'Shared.SignOut'|translate}}</span>
</a>
</span>
번역하고 싶은 단어들을 임의의 key로 대체하고 translate pipe 를 적용한다.
{{ 'key' | translate }} 형식으로 템플릿을 모두 수정한 후 ngx-translate-extract 를 사용해 템플릿에 적용된 키를 json파일로 추출한다.
en.json
"Shared": {
"WelcomeToOurMarket": "Welcome to our market!",
"Hotline": "Hotline:(+100) 123 456 7890",
"account": "Account",
"sign": "Login/Register",
"register": "register",
"AccountSettings": "Account Settings",
"LockScreen": "Lock screen",
"OrderHistory": "My Order history",
"Wishlist": "Wishlist",
"Help": "Help",
"SignOut": "Sign Out",
"Remove": "Remove",
"Categories": "Categories",
"TypeToSearch": "What are you looking for ?",
"ShoppingCart": "Shopping Cart",
"ITEM": "ITEM",
"VIEWCART": "VIEW CART",
"YouHaveNoItemsInYourShoppingCart": "You have no items in your shopping cart.",
"TOTAL": "TOTAL:",
"Checkout": "Checkout",
"ClearAll": "Clear All",
"Home": "Home",
"AllProducts": "All Products",
"NewFabric":"New Fabric",
"BestItem":"Best Item",
"BestShop":"Best Shop",
"Trend":"Trend",
"Contact": "Contact",
"TrackOrder": "Track Order",
"USEFULLINKS": "USEFUL LINKS",
"CONTACTINFORMATION": "CONTACT INFORMATION",
"SOCIALMEDIA": "SOCIAL MEDIA",
"Copyright": "Copyright © 2019,Piccosoft Software labs India Private Limited",
"DateTime": "Mon - Sun / 9:00AM - 8:00PM",
"Getdirections": "Get directions",
"RoutesToUs": "RoutesToUs",
"Price": "Price",
"Email": "Email",
"Name": "Name",
"SignIn.": "Sign In",
"ShopNow": "Shop now",
"Status": "Status",
"Date": "Date",
"Order": "Order",
"Cancel": "Cancel",
"AddToCart": "Add to cart",
"Clear": "Clear",
"Search": "Search"
},
fr.json
"Shared": {
"WelcomeToOurMarket": "Bienvenue sur notre marché!",
"Hotline": "Hotline:(+100) 123 456 7890",
"account": "Compte",
"sign": "Connexion / S'inscrire",
"register": "registre",
"AccountSettings": "Paramètres du compte",
"LockScreen": "Écran verrouillé",
"OrderHistory": "Historique de mes commandes",
"Wishlist": "Liste de souhaits",
"Help": "Aidez-moi",
"SignOut": "Déconnexion",
"Remove": "Retirer",
"Categories": "Les catégories",
"TypeToSearch": "Que cherchez-vous ?",
"ShoppingCart": "Chariot",
"ITEM": "ARTICLE",
"VIEWCART": "VOIR LE PANIER",
"YouHaveNoItemsInYourShoppingCart": "Vous n'avez aucun article dans votre panier.",
"TOTAL": "TOTALE:",
"Checkout": "Check-out",
"ClearAll": "Tout effacer",
"Home": "Accueil",
"AllProducts": "Tous les produits",
"NewFabric":"Nouveau tissu",
"BestItem":"meilleur article",
"BestShop":"meilleur magasin",
"Trend":"Tendance",
"Contact": "Contact",
"TrackOrder": "Suivi de commande",
"USEFULLINKS": "LIENS UTILES",
"CONTACTINFORMATION": "INFORMATIONS DE CONTACT",
"SOCIALMEDIA": "MÉDIAS SOCIAUX",
"Copyright": "Copyright © 2019 Piccosoft Software labs India Private Limited",
"DateTime": "Lundi - dimanche / 9:00AM - 8:00PM",
"Getdirections": "Obtenir des directions",
"RoutesToUs": "ItinérairesVers",
"Price": "Prix",
"Email": "Email",
"Name": "prénom",
"SignIn.": "Se connecter",
"ShopNow": "Achetez maintenant",
"Status": "Statut",
"Date": "Rendez-vous amoureux",
"Order": "Ordre",
"Cancel": "Annuler",
"AddToCart": "Ajouter au panier",
"Clear": "Claire",
"Search": "Chercher"
},
translate 모드 바꾸기
키값에 대치할 단어를 모두 작성했다면 알맞은 위치와 상황에서 언어를 바꿔주면 된다. 보통은 버튼을 클릭할 때 이벤트 핸들러에서 변경을 처리한다.
위에 defaultComponent 에서 TranslateService 를 주입받아 언어 사용 설정을 했던 것과 같이해주면 된다.
header-menu.component.ts
public changeLanguage(data, indexValue) {
this.index = indexValue;
if (isPlatformBrowser(this.platformId)) {
this.language = localStorage.getItem('language');
this.language = data.name;
if (this.language === 'Hindi') {
localStorage.setItem('language', 'Hindi');
this.translate.setDefaultLang('hi');
} else
if (this.language === 'English') {
localStorage.setItem('language', 'english');
this.selectedLanguage='English';
this.translate.setDefaultLang('en');
} else if (this.language === 'French') {
localStorage.setItem('language', 'french');
this.selectedLanguage='French';
this.translate.setDefaultLang('fr');
}
else if (this.language === 'Korea') {
localStorage.setItem('language', 'Korea');
this.selectedLanguage='Korea';
this.translate.setDefaultLang('ko');
}
else {
this.translate.setDefaultLang(data.code);
}
}
}
완성후 모습 (상단 헤더메뉴)
오른쪽 상단 언어 선택 버튼 클릭
French로 언어 설정시 모습
Reference
'Front-End > Angular' 카테고리의 다른 글
Angular 새로고침 방법 (0) | 2022.04.18 |
---|---|
Angular Directive (0) | 2022.01.27 |
Angular app.module.ts (0) | 2022.01.26 |
생명주기후크 ngOnInit() (0) | 2022.01.26 |
Angular 부모 자식 컴포넌트끼리 데이터 공유 @Input(), @Output() (0) | 2022.01.18 |