Commit e2ede3ed by Nattana Chaiyamat

translate

parent bf838d73
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
"@ks89/angular-modal-gallery": "^10.0.1", "@ks89/angular-modal-gallery": "^10.0.1",
"@ng-select/ng-select": "^11.0.0", "@ng-select/ng-select": "^11.0.0",
"@ngrx/store": "^16.0.1", "@ngrx/store": "^16.0.1",
"@ngx-translate/core": "^17.0.0",
"@ngx-translate/http-loader": "^17.0.0",
"@swimlane/ngx-charts": "^20.4.1", "@swimlane/ngx-charts": "^20.4.1",
"@syncfusion/ej2-angular-base": "^29.2.4", "@syncfusion/ej2-angular-base": "^29.2.4",
"@syncfusion/ej2-angular-charts": "^29.2.4", "@syncfusion/ej2-angular-charts": "^29.2.4",
......
<router-outlet></router-outlet> <router-outlet></router-outlet>
\ No newline at end of file
import { Component, Renderer2 } from '@angular/core'; import { Component, Renderer2 } from '@angular/core';
import { TranslationService } from './shared/services/translation.service';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
...@@ -6,7 +7,8 @@ import { Component, Renderer2 } from '@angular/core'; ...@@ -6,7 +7,8 @@ import { Component, Renderer2 } from '@angular/core';
styleUrls: ['./app.component.scss'], styleUrls: ['./app.component.scss'],
}) })
export class AppComponent { export class AppComponent {
constructor(private renderer: Renderer2) {} constructor(private renderer: Renderer2) {
}
ngOnInit() { ngOnInit() {
// Use Renderer2 to append an element to the html element // Use Renderer2 to append an element to the html element
......
...@@ -16,21 +16,37 @@ import { AngularFireDatabaseModule } from '@angular/fire/compat/database'; ...@@ -16,21 +16,37 @@ import { AngularFireDatabaseModule } from '@angular/fire/compat/database';
import { LeafletModule } from '@asymmetrik/ngx-leaflet'; import { LeafletModule } from '@asymmetrik/ngx-leaflet';
import { environment } from 'src/environments/environment'; import { environment } from 'src/environments/environment';
import { ColorPickerModule } from 'ngx-color-picker'; import { ColorPickerModule } from 'ngx-color-picker';
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; import { provideHttpClient, withInterceptorsFromDi, HttpClient, HttpClientModule } from '@angular/common/http';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateJsonLoader } from './translate-json.loader';
@NgModule({ declarations: [AppComponent, CustomLayoutComponent, ContentLayoutComponent], @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], declarations: [AppComponent, CustomLayoutComponent, ContentLayoutComponent],
bootstrap: [AppComponent], imports: [BrowserModule, schemas: [CUSTOM_ELEMENTS_SCHEMA],
AppRoutingModule, bootstrap: [AppComponent],
SharedModule, imports: [
BrowserAnimationsModule, BrowserModule,
StoreModule.forRoot({ data: dataReaducer }), AppRoutingModule,
ToastrModule.forRoot(), SharedModule,
// AngularFireModule, BrowserAnimationsModule,
AngularFireDatabaseModule, StoreModule.forRoot({ data: dataReaducer }),
AngularFirestoreModule, ToastrModule.forRoot(),
AngularFireAuthModule, // AngularFireModule,
LeafletModule, AngularFireDatabaseModule,
// AngularFireModule.initializeApp(environment.firebase), AngularFirestoreModule,
ColorPickerModule], providers: [provideHttpClient(withInterceptorsFromDi())] }) AngularFireAuthModule,
LeafletModule,
// AngularFireModule.initializeApp(environment.firebase),
ColorPickerModule,
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateJsonLoader,
deps: [HttpClient]
}
})
],
providers: [provideHttpClient(withInterceptorsFromDi())]
})
export class AppModule {} export class AppModule {}
...@@ -55,28 +55,31 @@ ...@@ -55,28 +55,31 @@
data-hs-dropdown-placement="bottom-right"> data-hs-dropdown-placement="bottom-right">
<button id="dropdown-flag" type="button" <button id="dropdown-flag" type="button"
class="hs-dropdown-toggle ti-dropdown-toggle p-0 flex-shrink-0 h-[2.375rem] w-[2.375rem] border-0 rounded-full shadow-none focus:ring-gray-400 text-xs dark:focus:ring-white/10"> class="hs-dropdown-toggle ti-dropdown-toggle p-0 flex-shrink-0 h-[2.375rem] w-[2.375rem] border-0 rounded-full shadow-none focus:ring-gray-400 text-xs dark:focus:ring-white/10">
<i class="flag-icon flag-icon-th h-[1.375rem] w-[1.375rem]"></i> <i class="flag-icon flag-icon-active flag-icon-th h-[1.375rem] w-[1.375rem]"
[class.active]="translationService.getCurrentLang()=='th'"></i>
<i class="flag-icon flag-icon-active flag-icon-us h-[1.375rem] w-[1.375rem]"
[class.active]="translationService.getCurrentLang()=='en'"></i>
</button> </button>
<div class="hs-dropdown-menu ti-dropdown-menu min-w-[10rem]" aria-labelledby="dropdown-flag"> <div class="hs-dropdown-menu ti-dropdown-menu min-w-[10rem]" aria-labelledby="dropdown-flag">
<div class="ti-dropdown-divider divide-y divide-gray-200 dark:divide-white/10"> <div class="ti-dropdown-divider divide-y divide-gray-200 dark:divide-white/10">
<div class="py-2 first:pt-0 last:pb-0"> <div class="py-2 first:pt-0 last:pb-0">
<div class="ti-dropdown-item"> <div class="ti-dropdown-item cursor-pointer" (click)="switchLang('th')">
<div class="flex items-center space-x-2 rtl:space-x-reverse w-full"> <div class="flex items-center space-x-2 rtl:space-x-reverse w-full ">
<div class="h-[1.375rem] w-[1.375rem] rounded-sm"> <div class="h-[1.375rem] w-[1.375rem] rounded-sm">
<i class="flag-icon flag-icon-th"></i> <i class="flag-icon flag-icon-th"></i>
</div> </div>
<div> <div>
<p class="text-xs font-medium">ไทย (TH)</p> <p class="text-xs font-medium">{{'ไทย (TH)' | translate}}</p>
</div> </div>
</div> </div>
</div> </div>
<div class="ti-dropdown-item"> <div class="ti-dropdown-item cursor-pointer" (click)="switchLang('en')">
<div class="flex items-center space-x-2 rtl:space-x-reverse w-full"> <div class="flex items-center space-x-2 rtl:space-x-reverse w-full">
<div class="h-[1.375rem] w-[1.375rem] rounded-sm"> <div class="h-[1.375rem] w-[1.375rem] rounded-sm">
<i class="flag-icon flag-icon-us"></i> <i class="flag-icon flag-icon-us"></i>
</div> </div>
<div> <div>
<p class="text-xs font-medium">English (US)</p> <p class="text-xs font-medium">{{'English (US)' | translate}}</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -681,14 +684,16 @@ ...@@ -681,14 +684,16 @@
<button id="dropdown-profile" type="button" <button id="dropdown-profile" type="button"
class="hs-dropdown-toggle ti-dropdown-toggle gap-2 p-0 flex-shrink-0 rounded-full shadow-none focus:ring-gray-400 text-xs"> class="hs-dropdown-toggle ti-dropdown-toggle gap-2 p-0 flex-shrink-0 rounded-full shadow-none focus:ring-gray-400 text-xs">
<img class="avatar shadow-none rounded-full !ring-transparent object-cover h-8 w-8" <img class="avatar shadow-none rounded-full !ring-transparent object-cover h-8 w-8"
[src]="getTokenImg()?getImg(getTokenImg()):'./assets/img/users/defaultperson.jpg'" (error)="onImageError($event)"> [src]="getTokenImg()?getImg(getTokenImg()):'./assets/img/users/defaultperson.jpg'"
(error)="onImageError($event)">
</button> </button>
<div class="hs-dropdown-menu ti-dropdown-menu border-0 w-[20rem]" aria-labelledby="dropdown-profile"> <div class="hs-dropdown-menu ti-dropdown-menu border-0 w-[20rem]" aria-labelledby="dropdown-profile">
<div class="ti-dropdown-header !bg-primary flex items-center space-x-3"> <div class="ti-dropdown-header !bg-primary flex items-center space-x-3">
<div class="flex-shrink-0"> <div class="flex-shrink-0">
<img class="avatar shadow-none rounded-full !ring-transparent object-cover" <img class="avatar shadow-none rounded-full !ring-transparent object-cover"
[src]="getTokenImg()?getImg(getTokenImg()):'./assets/img/users/defaultperson.jpg'" (error)="onImageError($event)"> [src]="getTokenImg()?getImg(getTokenImg()):'./assets/img/users/defaultperson.jpg'"
(error)="onImageError($event)">
</div> </div>
<div> <div>
<p class=" ti-dropdown-header-title !text-white"> <p class=" ti-dropdown-header-title !text-white">
......
.flag-icon-active {
position: absolute; /* วางซ้อนกัน */
transition: opacity 0.5s ease; /* ความนุ่มของการเปลี่ยน */
opacity: 0;
}
.flag-icon-active.active {
opacity: 1;
}
\ No newline at end of file
...@@ -9,6 +9,7 @@ import { ActivatedRoute, Router } from '@angular/router'; ...@@ -9,6 +9,7 @@ import { ActivatedRoute, Router } from '@angular/router';
import { environment } from 'src/environments/environment'; import { environment } from 'src/environments/environment';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { FileService } from '../../services/file.service'; import { FileService } from '../../services/file.service';
import { TranslationService } from '../../services/translation.service';
@Component({ @Component({
selector: 'app-header', selector: 'app-header',
...@@ -26,12 +27,16 @@ export class HeaderComponent { ...@@ -26,12 +27,16 @@ export class HeaderComponent {
public router: Router, public router: Router,
private route: ActivatedRoute, private route: ActivatedRoute,
private fileService: FileService, private fileService: FileService,
private navService: NavService, private http: HttpClient) { private navService: NavService,
private http: HttpClient,
public translationService: TranslationService) {
this.getEvaluatee(); this.getEvaluatee();
this.translationService.setDefaultLang('th');
this.translationService.useLang('th');
} }
imageUrl = '' imageUrl = ''
getEvaluatee() { getEvaluatee() {
this.employeeProfile = new MyEmployeeModel(JSON.parse(sessionStorage.getItem('employeeProfile') || '{}')); this.employeeProfile = new MyEmployeeModel(JSON.parse(sessionStorage.getItem('employeeProfile') || '{}'));
if (this.employeeProfile?.employeeId == undefined || this.employeeProfile?.employeeId == null || this.employeeProfile?.employeeId == '') { if (this.employeeProfile?.employeeId == undefined || this.employeeProfile?.employeeId == null || this.employeeProfile?.employeeId == '') {
...@@ -163,4 +168,8 @@ export class HeaderComponent { ...@@ -163,4 +168,8 @@ export class HeaderComponent {
getTokenImg() { getTokenImg() {
return this.tokenService.getUserData().picture return this.tokenService.getUserData().picture
} }
switchLang(lang: string) {
this.translationService.useLang(lang);
}
} }
import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Injectable({
providedIn: 'root'
})
export class TranslationService {
constructor(private translate: TranslateService) { }
setDefaultLang(lang: string) {
this.translate.setDefaultLang(lang);
}
useLang(lang: string) {
this.translate.use(lang);
}
get(key: string) {
return this.translate.get(key);
}
getCurrentLang() {
return this.translate.getCurrentLang()
}
}
...@@ -16,10 +16,13 @@ import { HoverEffectSidebarDirective } from './directives/hover-effect-sidebar.d ...@@ -16,10 +16,13 @@ import { HoverEffectSidebarDirective } from './directives/hover-effect-sidebar.d
import { SidemenuToggleDirective } from './directives/sidemenuToggle'; import { SidemenuToggleDirective } from './directives/sidemenuToggle';
import { AuthService } from './services/auth.service'; import { AuthService } from './services/auth.service';
import { ToggleThemeDirective } from './directives/toggle-theme.directive'; import { ToggleThemeDirective } from './directives/toggle-theme.directive';
import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http';
import { ConfigPermissionService } from './services/config-permission.service'; import { ConfigPermissionService } from './services/config-permission.service';
import { HttpRequestInterceptor } from './services/http-request.interceptor'; import { HttpRequestInterceptor } from './services/http-request.interceptor';
import { FileService } from './services/file.service'; import { FileService } from './services/file.service';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateJsonLoader } from '../translate-json.loader';
@NgModule({ @NgModule({
declarations: [ declarations: [
...@@ -40,7 +43,14 @@ import { FileService } from './services/file.service'; ...@@ -40,7 +43,14 @@ import { FileService } from './services/file.service';
RouterModule, RouterModule,
SimplebarAngularModule, SimplebarAngularModule,
ColorPickerModule, ColorPickerModule,
FormsModule FormsModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateJsonLoader,
deps: [HttpClient]
}
})
], ],
exports: [ exports: [
......
import { HttpClient } from '@angular/common/http';
import { TranslateLoader } from '@ngx-translate/core';
import { Observable } from 'rxjs';
export class TranslateJsonLoader implements TranslateLoader {
constructor(private http: HttpClient, private prefix = './assets/i18n/', private suffix = '.json') {}
public getTranslation(lang: string): Observable<any> {
return this.http.get(`${this.prefix}${lang}${this.suffix}`);
}
}
{
"Thai (TH)": "ไทย (TH)",
"English (US)": "อังกฤษ (US)"
}
\ No newline at end of file
{
"Thai (TH)": "ไทย (TH)",
"English (US)": "อังกฤษ (US)"
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment