@ngx-translate和ngx-translate-messageformat-compiler的Angular复数形式无法正确初始化

8

我执行了以下步骤:

(1) 创建了一个新的angular-cli项目(angular-cli 1.5.0)

(2) 添加了依赖项:

npm i @ngx-translate/core @ngx-translate/http-loader messageformat ngx-translate-messageformat-compiler --save

(3)添加了带有翻译的JSON文件:

asserts/i18n/en.json

{
    "translation": "translation",
    "things": "{count, plural, =0{Nothing} one{One thing} other{Lots of things}}"
} 

asserts/i18n/de.json)

{
    "translation": "Übersetzung",
    "things": "{count, plural, =0{Nichts} one{Ein Ding} other{Viele Dinge}}"
}

(4) AppModule

import { AppComponent } from './app.component';

export function createTranslateLoader(http: HttpClient) {
  return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: (createTranslateLoader),
        deps: [HttpClient]
      },
      compiler: {
        provide: TranslateCompiler,
        useClass: TranslateMessageFormatCompiler
      }
    }),
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

(5) AppComponent

import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

@Component({
  selector: 'app-root',
  template: `
    <h1 translate>translation</h1>
    <p>{{'things' | translate:"{ count: 2 }"}}</p>
    <button (click)="selectLang('de')">De</button>
    <button (click)="selectLang('en')">En</button>
  `
})
export class AppComponent {

  constructor(private translate: TranslateService) {
    translate.setDefaultLang('de');
    this.translate.use('de');
    translate.addLangs(['en']);
  }

  selectLang(lang: string)  {
    this.translate.use(lang);
  }

}

页面加载没有任何问题,也可以正确显示简单翻译(如“Überschrift”),但是复数形式无法正常工作。

好奇心驱使,点击“En”按钮将语言更改为英语,得到了期望的结果:

enter image description here

现在,切换回“De”语言也可以显示所需的德语结果。

enter image description here

1个回答

0
有任何关于这个的最新进展吗? 我使用的解决方法是在语言设置完成后再显示我的模板。例如,在我的appComponent中,我会设置:
  langReady= false;

  constructor(private translate: TranslateService) {
    translate.setDefaultLang('de')
    translate.addLangs(['en']);
    this.translate.use('de').subscribe(()=>{
      this.langReady= true;
    });
  }

在我的模板中,我将设置一个 *ngIf,等待语言准备好后再显示,如下所示:
<p *ngIf="timeElapsed">{{'things' | translate:"{ count: 1 }"}}</p>

这不是一个非常优雅的解决方案,但它可以工作。你找到了更好的设置消息编译器的方法吗?


@herbstein:你找到了解决这个问题的方法吗,除了你提到的变通方法? - user2439903
除了你提到的解决方法,你有没有找到其他的解决方案? - user2439903

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接