解决方法如下所示:
ng version
ng new angular-ssr-i18n
cd angular-ssr-i18n
ng add @nguniversal/express-engine
ng generate service i18n
import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Injectable({
providedIn: 'root'
})
export class I18nService {
constructor(private translate: TranslateService) { }
init() {
this.translate.addLangs(['en', 'fr']);
this.translate.setDefaultLang('en');
const browserLang = this.translate.getBrowserLang();
this.translate.use(browserLang.match(/en|fr/) ? browserLang : 'en');
}
}
npm install @ngx-translate/core --save
npm install @ngx-translate/http-loader --save
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule, HttpClient } from '@angular/common/http';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
}
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule.withServerTransition({ appId: 'serverApp' }),
HttpClientModule,
AppRoutingModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
{{ 'HELLO' | translate }}
import { Component, OnInit } from '@angular/core';
import { I18nService } from './i18n.service';
import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
constructor(private i18nService: I18nService, private translate: TranslateService) { }
ngOnInit() {
this.i18nService.init();
this.translate.onLangChange.subscribe(() => {
document.documentElement.lang = this.translate.currentLang;
});
}
}
en.json:
{
"HELLO": "Hello World!"
}
fr.json:
{
"HELLO": "Bonjour le monde!"
}
import 'zone.js/dist/zone-node';
import { ngExpressEngine } from '@nguniversal/express-engine';
import * as express from 'express';
import { join } from 'path';
import { existsSync } from 'fs';
const app = express();
const DIST_FOLDER = join(process.cwd(), 'dist/angular-ssr-i18n/browser');
const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/angular-ssr-i18n/server/main');
const { provideModuleMap } = require('@nguniversal/module-map-ngfactory-loader');
app.engine('html', ngExpressEngine({
bootstrap: AppServerModuleNgFactory,
providers: [provideModuleMap(LAZY_MODULE_MAP)]
}));
app.set('view engine', 'html');
app.set('views', join(DIST_FOLDER, 'browser'));
app.get('*.*', express.static(join(DIST_FOLDER, 'browser')));
app.get('*', (req, res) => {
const supportedLocales = ['en', 'fr'];
const defaultLocale = 'en';
const matches = req.url.match(/^\/([a-z]{2}(?:-[A-Z]{2})?)\//);
const locale = (matches && supportedLocales.indexOf(matches[1]) !== -1