在 Angular 项目中实现国际化(i18n)和翻译 使用ngx-translate

  1. 安装核心依赖
    首先,在项目的根目录下通过 npm 安装 ngx-translate 的核心库以及用于通过 HTTP 请求加载翻译文件的加载器:
ts 复制代码
npm install @ngx-translate/core --save
npm install @ngx-translate/http-loader --save
  1. 配置根模块(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 { }
  1. 创建翻译资源文件
    zh.json(中文)
json 复制代码
{
  "welcome": "欢迎使用",
  "language": "语言",
  "home": "主页"
}

en.json(英文)

json 复制代码
{
  "welcome": "Welcome",
  "language": "Language",
  "home": "Home"
}
  1. 初始化与切换语言
    在根组件(如 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);
  }
}
  1. 在页面中使用翻译
    最后,在 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();
    }
  }
}
相关推荐
FourAu4 分钟前
2026 前端突围指南:从 ESR 边缘渲染到封装 Web AI SDK,聊聊 AI 时代的职业进化
前端·人工智能
Zkeq11 分钟前
不止是聊天框:我用 EdgeOne Makers Agents 给烹饪 APP 加了一位能“改菜谱”的 AI 主厨
前端
咩咩啃树皮1 小时前
第32篇:前端本地存储全解——Cookie、localStorage、sessionStorage 区别与实战
前端
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 框架层:15 个 Starter 到底在干什么?
前端·vue.js·产品经理·ai编程
梦想的旅途23 小时前
JavaScript 实现企业微信消息自动发送的技术实践
运维·javascript·自动化·企业微信
就叫飞六吧4 小时前
子页面和dialog案例
开发语言·javascript·ecmascript
程序员黑豆4 小时前
从零开始:编写第一个鸿蒙(HarmonyOS)程序
前端·harmonyos
lastknight4 小时前
CSS @layer
前端·css
李宸净4 小时前
Web自动化测试selenium+python
前端·python·selenium