node.js - ngx-翻译和 Angular 通用 : client side translations not found

标签 node.js angular angular-universal ngx-translate

我尝试了半天,但没有成功将 ngx-translate 与 Angular 通用入门应用程序一起使用https://github.com/angular/universal-starter。有人知道为什么关注不起作用吗?

当我启动 npm start 我的服务器并重新加载我的页面时,我短暂地看到翻译在被 key 替换之前被找到,这通常表明某些内容不适用于 ngx-translate。另外,当我更改 server-app.module.ts 中的翻译路径时,我在服务器控制台中看到错误,因此我认为我的服务器部分没问题,问题来自客户端。

app.module.ts:

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

 imports: [
    TranslateModule.forRoot({
    loader: {
      provide: TranslateLoader,
      useFactory: exportTranslateStaticLoader,
      deps: [Http]
    }
  }
  )
]

浏览器应用程序.module.ts:

 imports: [TranslateModule.forChild()]

服务器应用程序.module.ts:

  export function translateFactory() {
    return new TranslateUniversalLoader('./dist/assets/i18n', '.json');
  }

  imports: [
      TranslateModule.forRoot({
         loader: {
          provide: TranslateLoader,
           useFactory: translateFactory
      }
    })
 ]

翻译通用加载器:

 import {Observable} from "rxjs/Observable";
 import {TranslateLoader} from '@ngx-translate/core';
 const fs = require('fs');

 export class TranslateUniversalLoader implements TranslateLoader {
   constructor(private prefix: string = 'i18n', private suffix: string = '.json') {}

   public getTranslation(lang: string): Observable<any> {
     return Observable.create(observer => {
 observer.next(JSON.parse(fs.readFileSync(`${this.prefix}/${lang}${this.suffix}`, 'utf8')));
       observer.complete();
     });
   }
 }

webpack.common.js:

 plugins: [
new copyWebpackPlugin([
     {
       from: './src/assets/i18n/en.json',
       to: './assets/i18n/en.json'
     }
   ])
 ]   

app.component.ts:

 ngOnInit() {
     this.translateService.setDefaultLang('en');
     this.translateService.use('en');
 }

此外,当我查询http://localhost:8000/assets/i18n/en.json时,我分别得到了有效的答案我的en.json:

{
   "TEST": "Super super"
 }

感谢任何帮助,这让我发疯。

最佳答案

明白了,在app.module.ts中我应该注入(inject)HttpClient而不是Http(关于AoT的自述文件仍然显示Http):

 imports: [
     HttpClientModule,
     TranslateModule.forRoot({
    loader: {
      provide: TranslateLoader,
      useFactory: exportTranslateStaticLoader,
      deps: [HttpClient]
    }
  }
   )
  ]

关于node.js - ngx-翻译和 Angular 通用 : client side translations not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45490937/

相关文章:

javascript - 使用 .populate() mongodb Node.js 的正确方法

node.js - Dockerfile 和 npm prune --生产

javascript - 将 JSON 数据从 Node 中的 URL 存储到变量中?

Angular 4 (click) 在不使用 jQuery 的情况下更改另一个元素的类

node.js - Mongoose 一次删除多个数据

javascript - 在 AppModule 中导入模块以实现 Angular2 中的关注点分离

Angular2如何在保持路线的同时显示错误页面

angular - 如何在我的 Angular 12 应用程序中实现 firebase app-check

Angular 通用 + PM2 : Keeps exiting and restarting

javascript - Angular Universal 的事件监听器替代方案