【问题标题】:Adding internationalization to Angular application向 Angular 应用程序添加国际化
【发布时间】:2019-06-23 14:34:55
【问题描述】:

我正在尝试将我的 Angular 应用程序国际化。

app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';

import { HttpClientModule, HttpClient } from '@angular/common/http';

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

// NG Translate
import { TranslateModule, TranslateLoader, TranslateService } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { NgxElectronModule } from 'ngx-electron';
import { StoreDevtoolsModule } from '@ngrx/store-devtools';
import { environment } from '../environments/environment';
import { RecipeDetailsComponent } from './recipe/recipe-details/recipe-details.component'

// AoT requires an exported function for factories
export function HttpLoaderFactory(http: HttpClient) {
  return new TranslateHttpLoader(http, './assets/locale/', '.json');
}

@NgModule({
  declarations: [
    AppComponent,
    ErrorComponent,
    RecipeDetailsComponent 
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    HttpClientModule,
    NgxElectronModule,
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: (HttpLoaderFactory),
        deps: [HttpClient]
      }
    }),
    StoreDevtoolsModule.instrument({ maxAge: 25, logOnly: environment.production })
  ],
  providers: [TranslateService],
  bootstrap: [AppComponent]
})
export class AppModule { }

我的appcomponent.ts如下:

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  constructor(translate: TranslateService) {
    translate.setDefaultLang('en');
}

我的English.json如下:

{
    "SCREENS": {
        "HOME": {
            "TITLE": "Home Screen works"
        },        
        "DETAILS": {
            "TITLE": "Recipe Details works!"
        }
   }
}

我的appcomponent.html如下:

<app-header></app-header>
<h1 style="text-align: center;">
   {{ 'SCREENS.HOME.TITLE' | translate }} 
</h1>
<router-outlet></router-outlet>

我有另一个配方详细信息的组件,它的 html 文件如下:

<div class="container">
  <h1 class="title">
    {{ 'SCREENS.DETAILS.TITLE' | translate }} 
  </h1>
</div>
<p>recipe etails screen</p>

我的食谱详情组件类如下:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-reservation-search',
  templateUrl: './reservation-search.component.html',
  styleUrls: ['./reservation-search.component.css']
})
export class RecipeDetailsComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

}

My app-routing.module file is as follows:

    import { NgModule } from '@angular/core';
    import { Routes, RouterModule } from '@angular/router';
    import { RecipeDetailComponent} from './recipe/recipe-details/recipe-details.component';
    import { ErrorComponent } from './error/error.component';

    const routes: Routes = [
      {
        path: '',
        pathMatch: 'full',
        redirectTo: '/first'
      },
      {
        path: 'first',
        component: FirstComponent
      },
      {
        path: 'recipe/details',
        component: RecipeDetailComponent
      },
      {
        path: 'error',
        component: ErrorComponent
      }
    ];

@NgModule({
  imports: [RouterModule.forRoot(routes, { useHash: true })],
  exports: [RouterModule]
})
export class AppRoutingModule { }

当我为配方组件运行代码时,我希望在我的 UI 上显示“配方详细信息有效”行,并且主屏幕有效。 recipe.details.html 的段落标签中的文本在 GUI 上可见,但应该来自 English.json 的数据不可见。 截至目前 English.json 添加将在以后添加对其他语言的支持。但是想知道如何根据 English.json 文件将我的数据带到 GUI 上。我认为翻译管道不起作用。如何解决它,以便我可以轻松地在其他组件上添加国际化。我正在使用角度 7。

【问题讨论】:

  • 是什么让你认为这与 i18n 有任何关系。如果配方组件本身根本不显示,则您有路由问题,而不是 i18n 问题。解释你是如何“我的配方组件代码”,发布所有相关代码。
  • 我添加了配方组件类代码。我需要在这里添加一些订阅吗?
  • @Zaib333 您确定您的食谱详细信息组件正确呈现并且它按预期显示其他 HTML 元素但唯一的 title 未正确显示吗?我的意思是你的路由是否正常工作?
  • @Zaib333 如果我理解正确,您的食谱组件根本不会显示。那么,您如何尝试显示您的配方组件?你在做什么来展示它,为什么你认为它应该展示?您的路由配置是什么,您使用哪个 URL 来显示它?
  • 由于我的应用程序处于启动阶段,所以我的 GUI 上现在只有标题。我是角度的新手。你能建议如何检查路由吗?

标签: angular angular6 angular7 angular8


【解决方案1】:

问题在于constructor() 中的AppComponent 错误注入集'private translate: TranslateService' 并使用this.translate.setDefaultLand('en')

尝试将文件名从 English.json 更改为 en.json。关于路由,请记住,在将组件拒绝为路由时,您没有在“补丁:”中使用“/”。

这样声明:

{ path: 'recipe', component: RecipeComponent, children: [
  {path: 'details', component: DetailsComponent }
]}

当你这样做时,你可以在你的食谱模板中使用:&lt;router-outlet&gt;&lt;/router-outlet&gt;

【讨论】:

  • 请看我的 app-routung.module.ts。已定义的配置。让我知道这是否有任何错误。 @米塞斯
  • 代码中文件名是en.json,这里提到English.json是为了理解目的
  • 发现不需要导入“providers: [TranslateService]”,它是由TranslateModule提供的。
  • 这里肯定不需要圆括号:“useFactory: (HttpLoaderFactory),”
  • 你可以尝试放置“translate.setDefaultLang('en');”在“ngOnInit()”函数中
【解决方案2】:

我认为问题可能出在模块中,请尝试删除提供者列表中的TranslateService

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多