• Angular ngx-translate 国际化实践(中文转英文)


    1.安装包

    npm install @ngx-translate/core --save 
    npm install @ngx-translate/http-loader --save

    2.根模块app.module.ts 引入

    import { HttpClientModule, HttpClient } from '@angular/common/http';
    import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
    import { TranslateHttpLoader } from '@ngx-translate/http-loader';
    export function createTranslateLoader(http: HttpClient) {
      return new TranslateHttpLoader(http, './assets/i18n/', '.json');
    }
    
      imports: [
        HttpClientModule,
        TranslateModule.forRoot({
          loader: {
              provide: TranslateLoader,
              useFactory: createTranslateLoader,
              deps: [HttpClient]
          }
        })
      ],

    3.在有需要的模块引入 TranslateModule

    import { TranslateModule } from '@ngx-translate/core';
      imports: [
        TranslateModule,
      ]

    4.新建语言转换文件

      在assets新建文件夹 i18n,新建语言文件(名字自定义即可):

      

      正常用en-Us.json 代表英文,内容如下

    {
      "用户登录":"User Login",
      "账号":"Account",
      "密码":"Pwd",
      "验证":"Verify",
      "登录":"Login",
      "取消":"Cancel",
      "请滑动到":"Swipe to"
    }

      我们是中文转英文,所以

      zh-CN.json 如下即可:

    {
    
    }

    5.在component 注册服务和使用

    import { TranslateService } from '@ngx-translate/core';
    
      constructor(
        private translate: TranslateService
      ) {
        this.translate.use('en-US');
      }

      1)无参:

      三个方法

    --管道翻译
    <a>{{'用户登录'| translate}}</a>
    
    --命令翻译
    <a [translate]="'用户登录'"></a>
    
    --服务翻译
    cancel='取消'
    ts:
        this.translate.get(this.cancel).subscribe((res: string) => {
          this.cancel = res;
        });
    html:
    <button mat-raised-button>{{cancel}}</button>
    
    在属性上面使用,也是可以的,如下:
    <input matInput type="text" [placeholder]="'账号'|translate" [(ngModel)]="acc">
    <input matInput type="password" placeholder="{{'密码'| translate}}" [(ngModel)]="pwd">

      2)有参:

      修改 en-Us.json 

    {
      "用户登录":"User Login {{user}}",
      "取消":"Cancel {{ee}}",
    }

      同样是三个方法

    --管道翻译
    <a>{{'用户登录'| translate:{user:'kxy'} }}</a>
    
    --命令翻译
    <a [translate]="'用户登录'" [translateParams]="{user:'kxy'}"></a>
    
    --服务翻译
    cancel='取消'
    ts:
        this.translate.get(this.cancel, { 'ee': '?' }).subscribe((res: string) => {
          console.log(res); // welcome to this app
          this.cancel = res;
        });
    html:
    <button mat-raised-button>{{cancel}}</button>

      效果图展示:

      

     6.扩展:

      可以将服务封装起来

    import { Injectable } from '@angular/core';
    import { Router } from '@angular/router';
    import { TranslateService } from '@ngx-translate/core';
    import { Subscription } from 'rxjs';
    import { DialogService } from 'src/app/dialog/dialog.service';
    
    @Injectable({
      providedIn: 'root'
    })
    export class LanguageService {
      private _sub: Subscription = new Subscription();
    
      constructor(
        public router: Router,
        public translate: TranslateService,
        public ds: DialogService,
      ) {
      }
    
      ngOnDestroy() {
        console.log('ngOnDestroy')
        if (this._sub) { this._sub.unsubscribe(); }
      }
      iniLanguage(): string {
        let lang = window.localStorage.getItem('_language');
        if (lang == 'en-US') {
          this.translate.use('en-US');
          return 'English'
        }
        else {
          this.translate.use('zh-CN');
          return '中文'
        }
      }
      changeLanguage(nowLanguage: string, url: string) {
        if (nowLanguage == '中文') {
          this._sub.add(
            this.ds.openConfirm('是否切换到[English],切换后会刷新界面').subscribe(res => {
              if (res == 'yes') {
                window.localStorage.setItem('_language', 'en-US');
                this.router.navigateByUrl('/', { skipLocationChange: true }).then(
                  () => {
                    this.router.navigate([url]);
                  }
                )
              }
            })
          )
        }
        if (nowLanguage == 'English') {
          this._sub.add(
            this.ds.openConfirm('Whether to switch to [中文], the interface will refresh after switching').subscribe(res => {
              if (res == 'yes') {
                window.localStorage.removeItem('_language');
                this.router.navigateByUrl('/', { skipLocationChange: true }).then(
                  () => {
                    this.router.navigate([url]);
                  }
                )
              }
            })
          )
        }
      }
    }

      页面组件中仅需

      iniLanguage() {
        this.language = this.langService.iniLanguage();
        if (this.language == 'English') {
          for (let i = 0; i < this.menu.length; i++) {
            this.langService.translate.get(this.menu[i].desc as string).subscribe((res: string) => {
              this.menu[i].desc = res;
            });
          }
        }
      }
      changeLanguage(nowLanguage: string) {
        this.langService.changeLanguage(nowLanguage, '/plm');
      }

     iniLanguage() 最外层组件调用一次即可,无需所有组件都调用。

     对应的子组件子页面模块,如果无需用服务翻译,那仅需在模块中引入 TranslateModule即可使用pipe

  • 相关阅读:
    linux下载和解压命令
    检测是否存在post类型的注入
    snort的学习
    解决ERROR: D:Snortetcsnort.conf(511) Unknown preprocessor: "sip". Fatal Error, Quitting..
    代理服务器
    Settimer及回调函数的用法
    vm安装ubantu的详细过程(转载)
    linux 常用指令汇总
    linux 用户及文件权限管理
    linux 基础知识
  • 原文地址:https://www.cnblogs.com/wskxy/p/14548816.html
Copyright © 2020-2023  润新知