J'utilise Angular 7.1 mais malheureusement je ne suis pas en mesure de faire fonctionner le tube de traduction de ngx-translate ...
package.json
import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'app-root',
template: `
{{'demo.text' | translate}}
<router-outlet></router-outlet>
`
})
export class AppComponent {
constructor(private translate: TranslateService) {
translate.setDefaultLang('en');
this.translate.get('demo.text').subscribe((text: string) => { console.log('HERE: ', text); });
}
}
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
// import ngx-translate and the http loader
import {TranslateLoader, TranslateModule} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import {HttpClient, HttpClientModule} from '@angular/common/http';
export const APP_ID = 'test-app';
@NgModule({
imports: [
BrowserModule.withServerTransition({ appId: APP_ID }),
AppRoutingModule,
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
exports: [ AppRoutingModule, TranslateModule ],
providers: [],
bootstrap: [ AppComponent ]
})
export class AppModule { }
// required for AOT compilation
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
}
app.component.ts
"dependencies": {
"@angular/animations": "~7.1.0",
"@angular/common": "~7.1.0",
"@angular/compiler": "~7.1.0",
"@angular/core": "~7.1.0",
"@angular/forms": "~7.1.0",
"@angular/http": "~7.1.0",
"@angular/platform-browser": "~7.1.0",
"@angular/platform-browser-dynamic": "~7.1.0",
"@angular/platform-server": "~7.1.0",
"@angular/router": "~7.1.0",
"@angularclass/hmr": "~2.1.3",
"@ngrx/store": "^7.0.0",
"@nguniversal/express-engine": "~7.0.2",
"@nguniversal/module-map-ngfactory-loader": "~7.0.2",
"@ngx-translate/core": "^11.0.1",
"@ngx-translate/http-loader": "^4.0.0",
"core-js": "^2.5.7",
"express": "^4.16.4",
"rxjs": "~6.3.3",
"zone.js": "~0.8.26"
}
Je peux voir que le TranslateService fonctionne bien car il traduit correctement et sortie sur la console avec succès, cependant le tube ni le [translate] fonctionnent.
ERREUR dans: Le tube 'translate' est introuvable ("[ERROR ->] {{'demo.text' | translate}}")
Je vois que cela se produit généralement lorsque le TranslateModule n'est pas correctement chargé dans les importations, mais cela ne semble pas être le cas car ici, il est correctement chargé dans app.module.ts et utilisé dans app.component.ts, qui est bootstrap par app.module.ts…
Une idée?
5 Réponses :
Désolé les gars. C'était facile ... TranslateModule était bien chargé dans app.module, mais pas dans le module de routage d'application qui était un module de routeur paresseux supplémentaire pour charger le composant d'application. L'ajouter là a simplement corrigé le problème:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { AppComponent } from './app.component';
import { NotFoundComponent } from './not-found.component';
import {TranslateModule} from '@ngx-translate/core';
const routes: Routes = [
{ path: '', loadChildren: './welcome/welcome.module#WelcomeModule' },
{ path: '**', component: NotFoundComponent }
];
@NgModule({
declarations: [
AppComponent,
NotFoundComponent,
],
imports: [
RouterModule.forRoot(routes),
TranslateModule
],
exports: [
RouterModule,
]
})
export class AppRoutingModule { }
Vous pouvez l'ajouter à votre PLATFORM_PIPES au bootstrap:
{provide: PLATFORM_PIPES, useValue: TranslatePipe, multi: true} De cette façon, vous n'aurez pas à l'ajouter à la propriété pipes de vos composants
Cela semble obsolète après Angular 5. Approach cherche soit à charger TranslateModule dans chaque module qui l'utilise, soit à charger un SharedModule.
J'ai eu un problème similaire que j'ai résolu en important et en exportant le module Traduire dans le module partagé de mon application. Je ne pense pas que cela devrait aller dans le module de routage.
Donc, ma configuration était la suivante: app.module
<nav class="app-navigation" [class.mat-elevation-z2]="!isActive" >
<mat-toolbar color="primary">
<div fxHide.gt-xs>
<button mat-icon-button (click)="onToggleSidenav()">
<mat-icon>menu</mat-icon>
</button>
</div>
<div>
<a routerLink="/">{{'HOME.Title' | translate}}</a>
</div>
<div fxFlex fxLayout fxLayoutAlign="end" fxHide.xs>
<ul fxLayout fxLayoutGap="15px" class="navigation-items">
<li>
<a mat-button [routerLink]="['/forms/appointments']" routerLinkActive="router-link-active" >appointments</a>
</li>
<li>
<a mat-button [routerLink]="['/forms/clientreg']" routerLinkActive="router-link-active" >new client</a>
</li>
<li>
<a mat-button [routerLink]="['/forms/euthanasia']" routerLinkActive="router-link-active" >euthanasia</a>
</li>
<li>
<a mat-button [routerLink]="['/blog']" routerLinkActive="router-link-active" >blog</a>
</li>
<li>
<a mat-button [routerLink]="['/services']" routerLinkActive="router-link-active" >Services</a>
</li>
<li>
<a mat-button [routerLink]="['/legal/terms']" routerLinkActive="router-link-active" >terms</a>
</li>
<li>
<a mat-button [routerLink]="['/legal/privacy']" routerLinkActive="router-link-active" >privacy</a>
</li>
<li *ngIf="!isLoggedIn">
<a mat-button [routerLink]="['/account/signup']" routerLinkActive="router-link-active" >signup</a>
</li>
<li *ngIf="!isLoggedIn">
<a mat-button [routerLink]="['/account/login']" routerLinkActive="router-link-active" >login</a>
</li>
<li *ngIf="isLoggedIn">
<a mat-button (click)="isLoggedIn = false">Log Out</a>
</li>
<li >
<a mat-button (click)="changeLocale()">Language</a>
</li>
</ul>
</div>
</mat-toolbar>
</nav>
Module partagé:
import { FlexLayoutModule } from '@angular/flex-layout';
import { NgModule } from '@angular/core';
import { SharedModule } from '../shared/shared.module';
import { MatIconModule, MatButtonModule, MatSidenavModule, MatToolbarModule,
MatCardModule, MatInputModule, MatDialogModule, MatTableModule,
MatMenuModule, MatProgressSpinnerModule
} from '@angular/material';
import { NavigationComponent } from './navigation/navigation.component';
import { FooterComponent } from './footer/footer.component';
import { SideNavigationComponent } from './side-navigation/side-navigation.component';
const matModules = [
MatIconModule, MatButtonModule, MatSidenavModule, MatToolbarModule,
MatCardModule, MatInputModule, MatDialogModule, MatTableModule,
MatMenuModule, MatProgressSpinnerModule
];
const moduleComponents = [
NavigationComponent, FooterComponent, SideNavigationComponent
];
@NgModule({
declarations: [
moduleComponents
],
imports: [
SharedModule,
FlexLayoutModule,
matModules
],
exports: [
FlexLayoutModule,
matModules,
moduleComponents
],
})
export class SharedUiModule { }
Un module partagé pour l'interface utilisateur:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';
import { NgChatModule } from 'ng-chat';
import { TranslateModule } from '@ngx-translate/core';
@NgModule({
declarations: [],
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
RouterModule,
NgChatModule,
TranslateModule
],
exports: [
CommonModule, FormsModule, ReactiveFormsModule, TranslateModule,
RouterModule, NgChatModule
]
})
export class SharedModule { }
et enfin mon modèle de composant:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AngularFireModule } from '@angular/fire';
import { ServiceWorkerModule } from '@angular/service-worker';
import { environment } from '../environments/environment';
import { AngularFireAuth} from '@angular/fire/auth';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
// AoT requires an exported function for factories
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
}
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
HttpClientModule,
ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
AngularFireModule.initializeApp(environment.firebase, 'VetCafe'),
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
}),
AppRoutingModule
],
providers: [HttpClient, AngularFireAuth],
bootstrap: [AppComponent]
})
export class AppModule { }
Cela fonctionne pour moi. J'ai également différents modules pour la structure de mon projet.
Si vous utilisez la directive translate dans un modèle appartenant à un module de fonctionnalités chargé paresseusement par le module de routage d'application, ajoutez l'entrée TranslateModule dans le tableau d' export dans le fichier app-routing.module.ts :
export class AppComponent implements OnInit {
constructor(
private translateService: TranslateService,
) {
// The default language used as a fallback if a translation isn't found for the current language
translateService.setDefaultLang(LANGUAGE_CODE_ENGLISH);
// The language to use
translateService.use(LANGUAGE_CODE_ENGLISH);
}
Il n'est pas nécessaire d'ajouter une entrée TranslateModule dans le tableau d' import du même fichier.
Il n'est pas non plus nécessaire d'ajouter une entrée TranslateModule dans le tableau d' export du module d'application.
En outre, le TranslateModule peut être importé depuis un module principal personnalisé plutôt que depuis le module d'application. Dans un fichier core.module.ts , core.module.ts l'entrée suivante dans le tableau d' import :
export function httpLoaderFactory(httpClient: HttpClient) {
return new TranslateHttpLoader(httpClient);
}
Il n'est pas nécessaire d'avoir une entrée dans le tableau d' export dans ce fichier.
Dans ce même fichier, la fonction httpLoaderFactory est définie en dehors de la classe:
imports: [
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: httpLoaderFactory,
deps: [ HttpClient ]
}
})
]
Le service de traduction peut ensuite être utilisé dans le composant de l'application:
exports: [
RouterModule,
TranslateModule
]
Utilisez TranslateModule.forChild si le module est un module de chargement différé.
imports: [
TranslateModule.forChild({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
},
isolate: true
}),]
Pouvez-vous créer une démo pour reproduire le problème
github.com/ngx-translate/core#1-import-the-translatemodule SharedModule est la partie que vous devriez lire
Stackblitz reproduisant le problème: lien