- 安装核心依赖
首先,在项目的根目录下通过 npm 安装 ngx-translate 的核心库以及用于通过 HTTP 请求加载翻译文件的加载器:
ts
npm install @ngx-translate/core --save
npm install @ngx-translate/http-loader --save
- 配置根模块(AppModule)
在项目的根模块(通常是 app.module.ts)中,需要引入 HttpClientModule 和 TranslateModule,并配置翻译文件的加载路径
ts
import { HttpClientModule, HttpClient } from '@angular/common/http';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
// 定义加载器工厂函数,指定翻译文件位于 ./assets/i18n/ 目录下,后缀为 .json
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
@NgModule({
imports: [
BrowserModule,
HttpClientModule, // 必须引入
TranslateModule.forRoot({
defaultLanguage: 'zh', // 设置默认语言
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
bootstrap: [AppComponent]
})
export class AppModule { }
- 创建翻译资源文件
zh.json(中文)
json
{
"welcome": "欢迎使用",
"language": "语言",
"home": "主页"
}
en.json(英文)
json
{
"welcome": "Welcome",
"language": "Language",
"home": "Home"
}
- 初始化与切换语言
在根组件(如 app.component.ts)中注入 TranslateService,设置默认语言,并根据需求(如浏览器语言或本地存储)初始化当前语言。同时可以编写切换语言的方法。
ts
import { Component, OnInit } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
constructor(public translate: TranslateService) {
// 设置回退语言
this.translate.setDefaultLang('en');
}
ngOnInit(): void {
// 获取浏览器语言并设置当前使用的语言
const browserLang = this.translate.getBrowserLang();
this.translate.use(browserLang?.match(/en|zh/) ? browserLang : 'en');
}
// 切换语言的方法
switchLanguage(lang: string) {
this.translate.use(lang);
}
}
- 在页面中使用翻译
最后,在 HTML 模板中可以通过管道(Pipe)直接获取翻译内容,或者在 TypeScript 业务逻辑中通过服务获取。
html
<!-- 插值表达式 -->
<h1>{{ 'welcome' | translate }}</h1>
<!-- 属性绑定 -->
<button [title]="'home' | translate">按钮</button>
ts
// 同步获取(需确保翻译文件已加载完成)
const text = this.translate.instant('welcome');
// 异步获取(推荐,更安全)
this.translate.get('welcome').subscribe((res: string) => {
console.log(res);
});
- 按照以上步骤,你的 Angular 项目即可成功集成 ngx-translate,实现流畅的运行时多语言切换功能。如果在实际配置中遇到版本兼容或懒加载模块的问题,可以随时进一步提问。
- 但是按照第5步的ts去写 每次在业务代码中都要手动处理 get 的订阅或者担心 instant 的同步加载问题,不仅代码冗余,还容易因为翻译文件未加载完成而导致取不到值
封装 I18nService 服务
(i18n.service.ts)
ts
import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { BehaviorSubject, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class I18nService {
// 用于监听当前语言的变化(方便组件UI更新)
public currentLang$ = new BehaviorSubject<string>('en');
constructor(private translate: TranslateService) {
// 设置支持的语言列表和默认语言
this.translate.addLangs(['en', 'zh']);
this.translate.setDefaultLang('en');
// 初始化语言
this.initLanguage();
}
private initLanguage(): void {
const savedLang = localStorage.getItem('preferred-language');
const browserLang = this.translate.getBrowserLang();
// 优先使用本地存储,其次浏览器语言,最后回退到 en
const langToUse = savedLang || (browserLang?.match(/en|zh/) ? browserLang : 'en');
this.setLanguage(langToUse);
}
// 切换语言的核心方法
setLanguage(lang: string): void {
this.translate.use(lang);
this.currentLang$.next(lang);
localStorage.setItem('preferred-language', lang);
document.documentElement.lang = lang;
}
/**
* 智能获取翻译文本(优先同步,失败自动异步兜底)
*/
getTranslation(key: string, params?: any): Observable<string> {
const translated = this.translate.instant(key, params);
if (translated !== key) {
return new Observable(observer => {
observer.next(translated);
observer.complete();
});
}
return this.translate.get(key, params);
}
}
第二步:下拉切换组件 (lang-switcher.component.ts)
ts
import { Component, OnInit, OnDestroy } from '@angular/core';
import { I18nService } from '../services/i18n.service';
import { Subscription } from 'rxjs';
@Component({
selector: 'app-lang-switcher',
templateUrl: './lang-switcher.component.html',
styleUrls: ['./lang-switcher.component.css']
})
export class LangSwitcherComponent implements OnInit, OnDestroy {
currentLang: string = 'en';
private langSub!: Subscription;
// 定义支持的语言选项
languages = [
{ code: 'zh', label: '简体中文' },
{ code: 'en', label: 'English' }
];
constructor(private i18n: I18nService) {}
ngOnInit(): void {
// 订阅当前语言的变化,以便UI实时更新
this.langSub = this.i18n.currentLang$.subscribe(lang => {
this.currentLang = lang;
});
}
// 用户在下拉框中选择语言时触发
onLanguageChange(event: Event): void {
const selectElement = event.target as HTMLSelectElement;
this.i18n.setLanguage(selectElement.value);
}
ngOnDestroy(): void {
// 防止内存泄漏,组件销毁时取消订阅
if (this.langSub) {
this.langSub.unsubscribe();
}
}
}
第三步:组件模板与样式
lang-switcher.component.html
html
<div class="lang-switcher-wrapper">
<label for="language-select" class="lang-label">🌐</label>
<select
id="language-select"
[value]="currentLang"
(change)="onLanguageChange($event)"
class="lang-dropdown"
>
<option *ngFor="let lang of languages" [value]="lang.code">
{{ lang.label }}
</option>
</select>
</div>
lang-switcher.component.css
css
.lang-switcher-wrapper {
display: flex;
align-items: center;
gap: 8px;
}
.lang-label {
font-size: 1.2rem;
cursor: pointer;
}
.lang-dropdown {
padding: 6px 12px;
border-radius: 6px;
border: 1px solid #ddd;
background-color: #fff;
font-size: 14px;
cursor: pointer;
outline: none;
transition: border-color 0.3s;
}
.lang-dropdown:hover {
border-color: #409eff;
}
第四步:在根模块中注册
别忘了在你的 app.module.ts 中声明这个组件,并配置好 ngx-translate 的加载器(参考之前提供的配置)。
ts
@NgModule({
declarations: [
AppComponent,
LangSwitcherComponent // 声明组件
],
imports: [
// ... 其他模块
TranslateModule.forRoot({
defaultLanguage: 'en',
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
bootstrap: [AppComponent]
})
export class AppModule { }
第五步:在页面中使用
html
<!-- 导航栏 -->
<nav>
<h1>{{ 'app_title' | translate }}</h1>
<!-- 直接放入切换组件,无需任何额外逻辑 -->
<app-lang-switcher></app-lang-switcher>
</nav>
在业务代码中如何简便使用
封装之后,你在组件或业务逻辑中只需要注入 这个 I18nService 即可,完全不用关心底层的异步订阅:
ts
import { Component, OnInit, OnDestroy } from '@angular/core';
import { I18nService } from './i18n.service'; // 确保路径正确
import { Subscription } from 'rxjs'; // 引入 Subscription 用于取消订阅
@Component({
selector: 'app-demo',
templateUrl: './demo.component.html'
})
export class DemoComponent implements OnInit, OnDestroy {
// 定义一个变量来保存订阅
private translationSub!: Subscription;
constructor(private i18n: I18nService) {}
ngOnInit() {
// 获取翻译,加上类型约束 : string
this.translationSub = this.i18n.getTranslation('welcome').subscribe((text: string) => {
console.log('翻译结果:', text);
// 在这里执行业务逻辑,比如赋值给变量:this.welcomeText = text;
});
}
// 切换语言也只需一行代码
switchToChinese() {
this.i18n.setLanguage('zh');
}
// 组件销毁时,取消订阅,防止内存泄漏
ngOnDestroy(): void {
if (this.translationSub) {
this.translationSub.unsubscribe();
}
}
}