使用其他名称的管道

时间:2018-09-23 21:31:14

标签: angular angular-pipe ngx-translate

我在Angular 6应用中使用了ngx-translate国际化库。现在,我的模板之一的翻译是这样完成的:

<span>{{ 'HELLO' | translate:param }}</span>

但是,如果我能以这种方式拥有它,那就太好了

<span>{{ 'HELLO' | i18n:param }}</span>

我所要做的就是以某种方式为管道命名别名,但是我不知道如何实现。我开始写类似...

import { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

@Pipe({ name: 'i18n' })
export class I18nPipe implements PipeTransform {

  constructor(private i18n: TranslateService) { }

  transform(key: string, ...args: any[]): any {
    this.i18n.get(key).subscribe((res: string) => {
        return res || key;
    });
  }

  // How to return if async? How to process args?

}

但是我是否应该以这种方式进行编码,或者在Angular中是否有一种简单的通用方式来别名管道?

我尝试过的另一种方法:

import { Pipe, PipeTransform } from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';

@Pipe({ name: 'i18n' })
export class I18nPipe extends TranslatePipe implements PipeTransform {

  transform(key: string, args?: any): any {
    return super.transform(key, args);
  }

}

这给了我一个错误:

ERROR TypeError: Cannot read property 'get' of undefined
    at I18nPipe.updateValue (ngx-translate-core.js:1058)
    at I18nPipe.transform (ngx-translate-core.js:1097)
    at I18nPipe.transform (i18n.pipe.ts:8)

2 个答案:

答案 0 :(得分:2)

您可以只包装原始管道

@Pipe({name: 'i18n'})
export class I18nPipe implements PipeTransform {
  constructor(private translatePipe: TranslatePipe) {
  }

  transform(query: string, ...args: any[]) {
    return this.translatePipe.transform(query, args);
  }
}

答案 1 :(得分:1)

您可以扩展原始管道,而无需添加任何实现代码:

import { Pipe } from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';

@Pipe({ name: 'i18n' })
export class I18nPipe extends TranslatePipe { }

有关演示,请参见this stackblitz