mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-01-10 04:25:08 +00:00
File based translations - multi language
+ Example in the Mail app + Component/doc page for translations
This commit is contained in:
parent
98e2ff0e1e
commit
9ecd921722
5
package-lock.json
generated
5
package-lock.json
generated
|
@ -268,6 +268,11 @@
|
||||||
"integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=",
|
"integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@ngx-translate/core": {
|
||||||
|
"version": "8.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-8.0.0.tgz",
|
||||||
|
"integrity": "sha1-dR/WtRLYDzp0jS3o38lt/vopr+A="
|
||||||
|
},
|
||||||
"@schematics/angular": {
|
"@schematics/angular": {
|
||||||
"version": "0.0.45",
|
"version": "0.0.45",
|
||||||
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.0.45.tgz",
|
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.0.45.tgz",
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
"@angular/platform-browser": "4.4.6",
|
"@angular/platform-browser": "4.4.6",
|
||||||
"@angular/platform-browser-dynamic": "4.4.6",
|
"@angular/platform-browser-dynamic": "4.4.6",
|
||||||
"@angular/router": "4.4.6",
|
"@angular/router": "4.4.6",
|
||||||
|
"@ngx-translate/core": "8.0.0",
|
||||||
"@swimlane/ngx-charts": "6.0.2",
|
"@swimlane/ngx-charts": "6.0.2",
|
||||||
"@swimlane/ngx-datatable": "9.3.1",
|
"@swimlane/ngx-datatable": "9.3.1",
|
||||||
"@swimlane/ngx-dnd": "3.0.0",
|
"@swimlane/ngx-dnd": "3.0.0",
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { FuseSplashScreenService } from './core/services/splash-screen.service';
|
import { FuseSplashScreenService } from './core/services/splash-screen.service';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-root',
|
selector : 'fuse-root',
|
||||||
|
@ -8,7 +9,18 @@ import { FuseSplashScreenService } from './core/services/splash-screen.service';
|
||||||
})
|
})
|
||||||
export class AppComponent
|
export class AppComponent
|
||||||
{
|
{
|
||||||
constructor(private fuseSplashScreen: FuseSplashScreenService)
|
constructor(
|
||||||
|
private fuseSplashScreen: FuseSplashScreenService,
|
||||||
|
private translate: TranslateService
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
// Add languages
|
||||||
|
this.translate.addLangs(['en', 'tr']);
|
||||||
|
|
||||||
|
// Set the default language
|
||||||
|
this.translate.setDefaultLang('en');
|
||||||
|
|
||||||
|
// Use a language
|
||||||
|
this.translate.use('en');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import { ComponentsThirdPartyModule } from './main/content/components-third-part
|
||||||
import { ServicesModule } from './main/content/services/services.module';
|
import { ServicesModule } from './main/content/services/services.module';
|
||||||
import { FuseAngularMaterialModule } from './main/content/components/angular-material/angular-material.module';
|
import { FuseAngularMaterialModule } from './main/content/components/angular-material/angular-material.module';
|
||||||
import { MarkdownModule } from 'angular2-markdown';
|
import { MarkdownModule } from 'angular2-markdown';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
const appRoutes: Routes = [
|
const appRoutes: Routes = [
|
||||||
{
|
{
|
||||||
|
@ -69,6 +70,7 @@ const appRoutes: Routes = [
|
||||||
RouterModule.forRoot(appRoutes),
|
RouterModule.forRoot(appRoutes),
|
||||||
SharedModule,
|
SharedModule,
|
||||||
MarkdownModule.forRoot(),
|
MarkdownModule.forRoot(),
|
||||||
|
TranslateModule.forRoot(),
|
||||||
|
|
||||||
InMemoryWebApiModule.forRoot(FuseFakeDbService, {
|
InMemoryWebApiModule.forRoot(FuseFakeDbService, {
|
||||||
delay : 0,
|
delay : 0,
|
||||||
|
|
|
@ -19,8 +19,10 @@ import { FuseHljsComponent } from '../components/hljs/hljs.component';
|
||||||
import { FusePerfectScrollbarDirective } from '../directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive';
|
import { FusePerfectScrollbarDirective } from '../directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive';
|
||||||
import { FuseIfOnDomDirective } from '../directives/fuse-if-on-dom/fuse-if-on-dom.directive';
|
import { FuseIfOnDomDirective } from '../directives/fuse-if-on-dom/fuse-if-on-dom.directive';
|
||||||
import { FuseMaterialColorPickerComponent } from '../components/material-color-picker/material-color-picker.component';
|
import { FuseMaterialColorPickerComponent } from '../components/material-color-picker/material-color-picker.component';
|
||||||
|
import { FuseTranslationLoaderService } from '../services/translation-loader.service';
|
||||||
import { CookieService } from 'ngx-cookie-service';
|
import { CookieService } from 'ngx-cookie-service';
|
||||||
import { MarkdownModule } from 'angular2-markdown';
|
import { MarkdownModule } from 'angular2-markdown';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations : [
|
declarations : [
|
||||||
|
@ -62,7 +64,8 @@ import { MarkdownModule } from 'angular2-markdown';
|
||||||
NgxDatatableModule,
|
NgxDatatableModule,
|
||||||
FuseIfOnDomDirective,
|
FuseIfOnDomDirective,
|
||||||
FuseMaterialColorPickerComponent,
|
FuseMaterialColorPickerComponent,
|
||||||
MarkdownModule
|
MarkdownModule,
|
||||||
|
TranslateModule
|
||||||
],
|
],
|
||||||
entryComponents: [
|
entryComponents: [
|
||||||
FuseConfirmDialogComponent
|
FuseConfirmDialogComponent
|
||||||
|
@ -71,7 +74,8 @@ import { MarkdownModule } from 'angular2-markdown';
|
||||||
CookieService,
|
CookieService,
|
||||||
FuseMatchMedia,
|
FuseMatchMedia,
|
||||||
FuseNavbarVerticalService,
|
FuseNavbarVerticalService,
|
||||||
FuseMatSidenavHelperService
|
FuseMatSidenavHelperService,
|
||||||
|
FuseTranslationLoaderService
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
27
src/app/core/services/translation-loader.service.ts
Normal file
27
src/app/core/services/translation-loader.service.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
|
export interface Locale
|
||||||
|
{
|
||||||
|
lang: string;
|
||||||
|
data: Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class FuseTranslationLoaderService
|
||||||
|
{
|
||||||
|
constructor(private translate: TranslateService)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public loadTranslations(...args: Locale[]): void
|
||||||
|
{
|
||||||
|
const locales = [...args];
|
||||||
|
|
||||||
|
locales.forEach((locale) => {
|
||||||
|
// use setTranslation() with the third argument set to true
|
||||||
|
// to append translations instead of replacing them
|
||||||
|
this.translate.setTranslation(locale.lang, locale.data, true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
14
src/app/main/content/apps/mail/i18n/en.ts
Normal file
14
src/app/main/content/apps/mail/i18n/en.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
export const locale = {
|
||||||
|
lang: 'en',
|
||||||
|
data: {
|
||||||
|
'MAIL': {
|
||||||
|
'COMPOSE' : 'COMPOSE',
|
||||||
|
'FOLDERS' : 'FOLDERS',
|
||||||
|
'FILTERS' : 'FILTERS',
|
||||||
|
'LABELS' : 'LABELS',
|
||||||
|
'NO_MESSAGES' : 'There are no messages!',
|
||||||
|
'SELECT_A_MESSAGE_TO_READ': 'Select a message to read',
|
||||||
|
'SEARCH_PLACEHOLDER': 'Search for an e-mail or contact'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
14
src/app/main/content/apps/mail/i18n/tr.ts
Normal file
14
src/app/main/content/apps/mail/i18n/tr.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
export const locale = {
|
||||||
|
lang: 'tr',
|
||||||
|
data: {
|
||||||
|
'MAIL': {
|
||||||
|
'COMPOSE' : 'YENİ E-POSTA',
|
||||||
|
'FOLDERS' : 'KLASÖRLER',
|
||||||
|
'FILTERS' : 'FİLTRELER',
|
||||||
|
'LABELS' : 'ETİKETLER',
|
||||||
|
'NO_MESSAGES' : 'Mesajiniz bulunmamakta!',
|
||||||
|
'SELECT_A_MESSAGE_TO_READ': 'Okumak için bir mesaj seçin',
|
||||||
|
'SEARCH_PLACEHOLDER' : 'E-mail yada bir kişi arayın'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
|
@ -1,6 +1,10 @@
|
||||||
<div *ngIf="!mail" fxLayout="column" fxLayoutAlign="center center" fxFlex>
|
<div *ngIf="!mail" fxLayout="column" fxLayoutAlign="center center" fxFlex>
|
||||||
<mat-icon class="s-128 mb-16 select-message-icon" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'300ms',scale:'0.2'}}">email</mat-icon>
|
<mat-icon class="s-128 mb-16 select-message-icon" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'300ms',scale:'0.2'}}">
|
||||||
<span class="select-message-text hint-text" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'400ms'}}">Select a message to read</span>
|
email
|
||||||
|
</mat-icon>
|
||||||
|
<span class="select-message-text hint-text" *fuseIfOnDom [@animate]="{value:'*',params:{delay:'400ms'}}">
|
||||||
|
<span>{{ 'MAIL.SELECT_A_MESSAGE_TO_READ' | translate }}</span>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="mail">
|
<div *ngIf="mail">
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<div *ngIf="mails.length === 0" fxLayout="column" fxLayoutAlign="center center" fxFlexFill>
|
<div *ngIf="mails.length === 0" fxLayout="column" fxLayoutAlign="center center" fxFlexFill>
|
||||||
<span class="no-messages-text hint-text">There are no messages!</span>
|
<span class="no-messages-text hint-text">{{ 'MAIL.NO_MESSAGES' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mail-list" *fuseIfOnDom [@animateStagger]="{value:'50'}">
|
<div class="mail-list" *fuseIfOnDom [@animateStagger]="{value:'50'}">
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
<div class="search mat-white-bg" flex fxLayout="row" fxLayoutAlign="start center">
|
<div class="search mat-white-bg" flex fxLayout="row" fxLayoutAlign="start center">
|
||||||
<mat-icon>search</mat-icon>
|
<mat-icon>search</mat-icon>
|
||||||
<input [formControl]="searchInput" placeholder="Search for an e-mail or contact" fxFlex>
|
<input [formControl]="searchInput" [placeholder]="'MAIL.SEARCH_PLACEHOLDER' | translate" fxFlex>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,9 @@ import { MailService } from './mail.service';
|
||||||
import { Subscription } from 'rxjs/Subscription';
|
import { Subscription } from 'rxjs/Subscription';
|
||||||
import { FormControl } from '@angular/forms';
|
import { FormControl } from '@angular/forms';
|
||||||
import { Mail } from './mail.model';
|
import { Mail } from './mail.model';
|
||||||
|
import { FuseTranslationLoaderService } from '../../../../core/services/translation-loader.service';
|
||||||
|
import { locale as english } from './i18n/en';
|
||||||
|
import { locale as turkish } from './i18n/tr';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-mail',
|
selector : 'fuse-mail',
|
||||||
|
@ -25,9 +28,13 @@ export class FuseMailComponent implements OnInit, OnDestroy
|
||||||
onLabelsChanged: Subscription;
|
onLabelsChanged: Subscription;
|
||||||
onCurrentMailChanged: Subscription;
|
onCurrentMailChanged: Subscription;
|
||||||
|
|
||||||
constructor(private mailService: MailService)
|
constructor(
|
||||||
|
private mailService: MailService,
|
||||||
|
private translationLoader: FuseTranslationLoaderService
|
||||||
|
)
|
||||||
{
|
{
|
||||||
this.searchInput = new FormControl('');
|
this.searchInput = new FormControl('');
|
||||||
|
this.translationLoader.loadTranslations(english, turkish);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit()
|
ngOnInit()
|
||||||
|
|
|
@ -30,13 +30,13 @@
|
||||||
class="mat-accent compose-dialog-button"
|
class="mat-accent compose-dialog-button"
|
||||||
(click)="composeDialog()"
|
(click)="composeDialog()"
|
||||||
aria-label="Compose">
|
aria-label="Compose">
|
||||||
COMPOSE
|
{{ 'MAIL.COMPOSE' | translate }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="nav">
|
<div class="nav">
|
||||||
|
|
||||||
<div class="nav-subheader">FOLDERS</div>
|
<div class="nav-subheader">{{ 'MAIL.FOLDERS' | translate }}</div>
|
||||||
|
|
||||||
<div class="nav-item" *ngFor="let folder of folders">
|
<div class="nav-item" *ngFor="let folder of folders">
|
||||||
<a class="nav-link" matRipple [routerLink]="'/apps/mail/' + folder.handle" routerLinkActive="active">
|
<a class="nav-link" matRipple [routerLink]="'/apps/mail/' + folder.handle" routerLinkActive="active">
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="nav-subheader">FILTERS</div>
|
<div class="nav-subheader">{{ 'MAIL.FILTERS' | translate }}</div>
|
||||||
|
|
||||||
<div class="nav-item" *ngFor="let filter of filters">
|
<div class="nav-item" *ngFor="let filter of filters">
|
||||||
<a class="nav-link" matRipple [routerLink]="'/apps/mail/filter/' + filter.handle" routerLinkActive="active">
|
<a class="nav-link" matRipple [routerLink]="'/apps/mail/filter/' + filter.handle" routerLinkActive="active">
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="nav-subheader">LABELS</div>
|
<div class="nav-subheader">{{ 'MAIL.LABELS' | translate }}</div>
|
||||||
|
|
||||||
<div class="nav-item" *ngFor="let label of labels">
|
<div class="nav-item" *ngFor="let label of labels">
|
||||||
<a class="nav-link" matRipple [routerLink]="'/apps/mail/label/' + label.handle" routerLinkActive="active">
|
<a class="nav-link" matRipple [routerLink]="'/apps/mail/label/' + label.handle" routerLinkActive="active">
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { RouterModule } from '@angular/router';
|
||||||
import { FuseCountdownDocsComponent } from './countdown/countdown.component';
|
import { FuseCountdownDocsComponent } from './countdown/countdown.component';
|
||||||
import { FuseHljsDocsComponent } from './hljs/hljs.component';
|
import { FuseHljsDocsComponent } from './hljs/hljs.component';
|
||||||
import { FuseMaterialColorPickerDocsComponent } from './material-color-picker/material-color-picker.component';
|
import { FuseMaterialColorPickerDocsComponent } from './material-color-picker/material-color-picker.component';
|
||||||
|
import { FuseMultiLanguageDocsComponent } from './multi-language/multi-language.component';
|
||||||
import { FuseNavigationDocsComponent } from './navigation/navigation.component';
|
import { FuseNavigationDocsComponent } from './navigation/navigation.component';
|
||||||
import { FuseShortcutsDocsComponent } from './shortcuts/shortcuts.component';
|
import { FuseShortcutsDocsComponent } from './shortcuts/shortcuts.component';
|
||||||
import { FuseSearchBarDocsComponent } from 'app/main/content/components/search-bar/search-bar.component';
|
import { FuseSearchBarDocsComponent } from 'app/main/content/components/search-bar/search-bar.component';
|
||||||
|
@ -23,6 +24,10 @@ const routes = [
|
||||||
path : 'components/material-color-picker',
|
path : 'components/material-color-picker',
|
||||||
component: FuseMaterialColorPickerDocsComponent
|
component: FuseMaterialColorPickerDocsComponent
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path : 'components/multi-language',
|
||||||
|
component: FuseMultiLanguageDocsComponent
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path : 'components/navigation',
|
path : 'components/navigation',
|
||||||
component: FuseNavigationDocsComponent
|
component: FuseNavigationDocsComponent
|
||||||
|
@ -51,6 +56,7 @@ const routes = [
|
||||||
FuseCountdownDocsComponent,
|
FuseCountdownDocsComponent,
|
||||||
FuseHljsDocsComponent,
|
FuseHljsDocsComponent,
|
||||||
FuseMaterialColorPickerDocsComponent,
|
FuseMaterialColorPickerDocsComponent,
|
||||||
|
FuseMultiLanguageDocsComponent,
|
||||||
FuseNavigationDocsComponent,
|
FuseNavigationDocsComponent,
|
||||||
FuseSearchBarDocsComponent,
|
FuseSearchBarDocsComponent,
|
||||||
FuseShortcutsDocsComponent,
|
FuseShortcutsDocsComponent,
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
<div id="multi-language" class="page-layout simple fullwidth" fusePerfectScrollbar>
|
||||||
|
|
||||||
|
<!-- HEADER -->
|
||||||
|
<div class="header mat-accent-bg p-24 h-160" fxLayout="row" fxLayoutAlign="start center">
|
||||||
|
<div fxLayout="column" fxLayoutAlign="center start">
|
||||||
|
<div class="black-fg" fxLayout="row" fxLayoutAlign="start center">
|
||||||
|
<mat-icon class="secondary-text s-16">home</mat-icon>
|
||||||
|
<mat-icon class="secondary-text s-16">chevron_right</mat-icon>
|
||||||
|
<span class="secondary-text">Components</span>
|
||||||
|
</div>
|
||||||
|
<div class="h2 mt-16">Multi Language</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- / HEADER -->
|
||||||
|
|
||||||
|
<!-- CONTENT -->
|
||||||
|
<div class="content p-24">
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Fuse uses <a class="link" href="https://github.com/ngx-translate/core" target="_blank">ngx-translate</a>
|
||||||
|
module and supports multiple languages and translations.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="warning-box">
|
||||||
|
Since not everybody need multi-language setup for their apps, we decided NOT to put translations everywhere.
|
||||||
|
If you want to see the translations in action, visit <a class="link" [routerLink]="'/apps/mail'">
|
||||||
|
Mail</a> app and then change the language from the <b>Toolbar.</b>
|
||||||
|
<br><br>
|
||||||
|
Mail app is the only app that has translations for demonstration purposes. You can look at its source code
|
||||||
|
to see the usage.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="my-48">
|
||||||
|
<h2>Usage</h2>
|
||||||
|
<p>In order to use the translations, create your translation file within the module you want to use
|
||||||
|
the translations. For example, for the Mail app, create <code>i18n/en.ts</code> file inside the
|
||||||
|
<code>apps/mail</code> folder.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The structure of the translation file is important and it must define the language id along with the
|
||||||
|
translation data:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="mat-grey-200-bg py-8">
|
||||||
|
<fuse-hljs lang="ts" class="source-code">
|
||||||
|
<textarea #source hidden="hidden">
|
||||||
|
// i18n/en.ts
|
||||||
|
export const locale = {
|
||||||
|
lang: 'en',
|
||||||
|
data: {
|
||||||
|
'MAIL': {
|
||||||
|
'COMPOSE': 'COMPOSE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// i18n/tr.ts
|
||||||
|
export const locale = {
|
||||||
|
lang: 'en',
|
||||||
|
data: {
|
||||||
|
'MAIL': {
|
||||||
|
'COMPOSE': 'YENİ E-POSTA'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</textarea>
|
||||||
|
</fuse-hljs>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="my-48">
|
||||||
|
<p>
|
||||||
|
After you create your translation files, open the <code>*.component.ts</code> file for the module you
|
||||||
|
want to have translations, and register your translation file. For this example, we will use the
|
||||||
|
<code>mail.component.ts</code> file:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="mat-grey-200-bg py-8">
|
||||||
|
<fuse-hljs lang="ts" class="source-code">
|
||||||
|
<textarea #source hidden="hidden">
|
||||||
|
// Your imports
|
||||||
|
import { ... } from '..';
|
||||||
|
|
||||||
|
// Import the locale files
|
||||||
|
import { locale as english } from './i18n/en';
|
||||||
|
import { locale as turkish } from './i18n/tr';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-mail',
|
||||||
|
templateUrl: './mail.component.html',
|
||||||
|
styleUrls : ['./mail.component.scss']
|
||||||
|
})
|
||||||
|
export class FuseMailComponent
|
||||||
|
{
|
||||||
|
constructor(private translationLoader: FuseTranslationLoaderService)
|
||||||
|
{
|
||||||
|
this.translationLoader.loadTranslations(english, turkish);
|
||||||
|
}
|
||||||
|
|
||||||
|
...
|
||||||
|
}
|
||||||
|
</textarea>
|
||||||
|
</fuse-hljs>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="my-48">
|
||||||
|
<h2>Changing the language</h2>
|
||||||
|
<p class="py-8">
|
||||||
|
Changing the current language can happen instantly. Simply call the <code>use</code> method from the
|
||||||
|
translate service:
|
||||||
|
</p>
|
||||||
|
<p class="mat-grey-200-bg py-8">
|
||||||
|
<fuse-hljs lang="ts" class="source-code">
|
||||||
|
<textarea #source hidden="hidden">
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
|
constructor(private translate: TranslateService) {}
|
||||||
|
|
||||||
|
setLanguage()
|
||||||
|
{
|
||||||
|
// Use the selected language for translations
|
||||||
|
this.translate.use('tr');
|
||||||
|
}
|
||||||
|
</textarea>
|
||||||
|
</fuse-hljs>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
More detailed usage of the translation service can be found in the <code>toolbar.component.ts</code>
|
||||||
|
file.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
:host {
|
||||||
|
|
||||||
|
.content{
|
||||||
|
max-width: 1100px;
|
||||||
|
|
||||||
|
.warning-box{
|
||||||
|
background: #FFFDE7;
|
||||||
|
border: 1px solid #FFC107;
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector : 'fuse-multi-language-docs',
|
||||||
|
templateUrl: './multi-language.component.html',
|
||||||
|
styleUrls : ['./multi-language.component.scss']
|
||||||
|
})
|
||||||
|
export class FuseMultiLanguageDocsComponent
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -71,7 +71,7 @@
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<mat-menu #languageMenu="matMenu">
|
<mat-menu #languageMenu="matMenu">
|
||||||
<button mat-menu-item *ngFor="let lang of languages" (click)="selectedLanguage = lang">
|
<button mat-menu-item *ngFor="let lang of languages" (click)="setLanguage(lang)">
|
||||||
<div fxLayout="row" fxLayoutAlign="start center">
|
<div fxLayout="row" fxLayoutAlign="start center">
|
||||||
<img class="flag mr-16" [src]="'assets/images/flags/'+lang.flag+'.png'">
|
<img class="flag mr-16" [src]="'assets/images/flags/'+lang.flag+'.png'">
|
||||||
<span class="iso">{{lang.title}}</span>
|
<span class="iso">{{lang.title}}</span>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { NavigationEnd, NavigationStart, Router } from '@angular/router';
|
import { NavigationEnd, NavigationStart, Router } from '@angular/router';
|
||||||
import { FuseConfigService } from '../../core/services/config.service';
|
import { FuseConfigService } from '../../core/services/config.service';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-toolbar',
|
selector : 'fuse-toolbar',
|
||||||
|
@ -18,7 +19,8 @@ export class FuseToolbarComponent
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private fuseConfig: FuseConfigService
|
private fuseConfig: FuseConfigService,
|
||||||
|
private translate: TranslateService
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.userStatusOptions = [
|
this.userStatusOptions = [
|
||||||
|
@ -55,11 +57,6 @@ export class FuseToolbarComponent
|
||||||
'title': 'English',
|
'title': 'English',
|
||||||
'flag' : 'us'
|
'flag' : 'us'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'id' : 'es',
|
|
||||||
'title': 'Spanish',
|
|
||||||
'flag' : 'es'
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
'id' : 'tr',
|
'id' : 'tr',
|
||||||
'title': 'Turkish',
|
'title': 'Turkish',
|
||||||
|
@ -92,4 +89,13 @@ export class FuseToolbarComponent
|
||||||
// Do your search here...
|
// Do your search here...
|
||||||
console.log(value);
|
console.log(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setLanguage(lang)
|
||||||
|
{
|
||||||
|
// Set the selected language for toolbar
|
||||||
|
this.selectedLanguage = lang;
|
||||||
|
|
||||||
|
// Use the selected language for translations
|
||||||
|
this.translate.use(lang.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -725,6 +725,13 @@ export class NavigationModel
|
||||||
'icon' : 'settings_input_component',
|
'icon' : 'settings_input_component',
|
||||||
'url' : '/components/material-color-picker'
|
'url' : '/components/material-color-picker'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'id' : 'multi-language',
|
||||||
|
'title': 'Multi Language',
|
||||||
|
'type' : 'item',
|
||||||
|
'icon' : 'settings_input_component',
|
||||||
|
'url' : '/components/multi-language'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'id' : 'navigation',
|
'id' : 'navigation',
|
||||||
'title': 'Navigation',
|
'title': 'Navigation',
|
||||||
|
|
Loading…
Reference in New Issue
Block a user