在 Angular 项目中实现国际化(i18n)和翻译 使用ngx-translate
安装核心依赖首先在项目的根目录下通过 npm 安装 ngx-translate 的核心库以及用于通过 HTTP 请求加载翻译文件的加载器npm installngx-translate/core--save npm installngx-translate/http-loader--save配置根模块AppModule在项目的根模块通常是 app.module.ts中需要引入 HttpClientModule 和 TranslateModule并配置翻译文件的加载路径import{HttpClientModule,HttpClient}fromangular/common/http;import{TranslateModule,TranslateLoader}fromngx-translate/core;import{TranslateHttpLoader}fromngx-translate/http-loader;// 定义加载器工厂函数指定翻译文件位于 ./assets/i18n/ 目录下后缀为 .jsonexportfunctionHttpLoaderFactory(http:HttpClient){returnnewTranslateHttpLoader(http,./assets/i18n/,.json);}NgModule({imports:[BrowserModule,HttpClientModule,// 必须引入TranslateModule.forRoot({defaultLanguage:zh,// 设置默认语言loader:{provide:TranslateLoader,useFactory:HttpLoaderFactory,deps:[HttpClient]}})],bootstrap:[AppComponent]})exportclassAppModule{}创建翻译资源文件zh.json中文{welcome:欢迎使用,language:语言,home:主页}en.json英文{welcome:Welcome,language:Language,home:Home}初始化与切换语言在根组件如 app.component.ts中注入 TranslateService设置默认语言并根据需求如浏览器语言或本地存储初始化当前语言。同时可以编写切换语言的方法。import{Component,OnInit}fromangular/core;import{TranslateService}fromngx-translate/core;Component({selector:app-root,templateUrl:./app.component.html})exportclassAppComponentimplementsOnInit{constructor(publictranslate:TranslateService){// 设置回退语言this.translate.setDefaultLang(en);}ngOnInit():void{// 获取浏览器语言并设置当前使用的语言constbrowserLangthis.translate.getBrowserLang();this.translate.use(browserLang?.match(/en|zh/)?browserLang:en);}// 切换语言的方法switchLanguage(lang:string){this.translate.use(lang);}}在页面中使用翻译最后在 HTML 模板中可以通过管道Pipe直接获取翻译内容或者在 TypeScript 业务逻辑中通过服务获取。!-- 插值表达式 --h1{{ welcome | translate }}/h1!-- 属性绑定 --button[title]home | translate按钮/button// 同步获取需确保翻译文件已加载完成consttextthis.translate.instant(welcome);// 异步获取推荐更安全this.translate.get(welcome).subscribe((res:string){console.log(res);});按照以上步骤你的 Angular 项目即可成功集成 ngx-translate实现流畅的运行时多语言切换功能。如果在实际配置中遇到版本兼容或懒加载模块的问题可以随时进一步提问。但是按照第5步的ts去写 每次在业务代码中都要手动处理 get 的订阅或者担心 instant 的同步加载问题不仅代码冗余还容易因为翻译文件未加载完成而导致取不到值封装 I18nService 服务(i18n.service.ts)import{Injectable}fromangular/core;import{TranslateService}fromngx-translate/core;import{BehaviorSubject,Observable}fromrxjs;Injectable({providedIn:root})exportclassI18nService{// 用于监听当前语言的变化方便组件UI更新publiccurrentLang$newBehaviorSubjectstring(en);constructor(privatetranslate:TranslateService){// 设置支持的语言列表和默认语言this.translate.addLangs([en,zh]);this.translate.setDefaultLang(en);// 初始化语言this.initLanguage();}privateinitLanguage():void{constsavedLanglocalStorage.getItem(preferred-language);constbrowserLangthis.translate.getBrowserLang();// 优先使用本地存储其次浏览器语言最后回退到 enconstlangToUsesavedLang||(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.langlang;}/** * 智能获取翻译文本优先同步失败自动异步兜底 */getTranslation(key:string,params?:any):Observablestring{consttranslatedthis.translate.instant(key,params);if(translated!key){returnnewObservable(observer{observer.next(translated);observer.complete();});}returnthis.translate.get(key,params);}}第二步下拉切换组件 (lang-switcher.component.ts)import{Component,OnInit,OnDestroy}fromangular/core;import{I18nService}from../services/i18n.service;import{Subscription}fromrxjs;Component({selector:app-lang-switcher,templateUrl:./lang-switcher.component.html,styleUrls:[./lang-switcher.component.css]})exportclassLangSwitcherComponentimplementsOnInit,OnDestroy{currentLang:stringen;privatelangSub!:Subscription;// 定义支持的语言选项languages[{code:zh,label:简体中文},{code:en,label:English}];constructor(privatei18n:I18nService){}ngOnInit():void{// 订阅当前语言的变化以便UI实时更新this.langSubthis.i18n.currentLang$.subscribe(lang{this.currentLanglang;});}// 用户在下拉框中选择语言时触发onLanguageChange(event:Event):void{constselectElementevent.targetasHTMLSelectElement;this.i18n.setLanguage(selectElement.value);}ngOnDestroy():void{// 防止内存泄漏组件销毁时取消订阅if(this.langSub){this.langSub.unsubscribe();}}}第三步组件模板与样式lang-switcher.component.htmldivclasslang-switcher-wrapperlabelforlanguage-selectclasslang-label/labelselectidlanguage-select[value]currentLang(change)onLanguageChange($event)classlang-dropdownoption*ngForlet lang of languages[value]lang.code{{ lang.label }}/option/select/divlang-switcher.component.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 的加载器参考之前提供的配置。NgModule({declarations:[AppComponent,LangSwitcherComponent// 声明组件],imports:[// ... 其他模块TranslateModule.forRoot({defaultLanguage:en,loader:{provide:TranslateLoader,useFactory:HttpLoaderFactory,deps:[HttpClient]}})],bootstrap:[AppComponent]})exportclassAppModule{}第五步在页面中使用!-- 导航栏 --navh1{{ app_title | translate }}/h1!-- 直接放入切换组件无需任何额外逻辑 --app-lang-switcher/app-lang-switcher/nav在业务代码中如何简便使用封装之后你在组件或业务逻辑中只需要注入 这个 I18nService 即可完全不用关心底层的异步订阅import{Component,OnInit,OnDestroy}fromangular/core;import{I18nService}from./i18n.service;// 确保路径正确import{Subscription}fromrxjs;// 引入 Subscription 用于取消订阅Component({selector:app-demo,templateUrl:./demo.component.html})exportclassDemoComponentimplementsOnInit,OnDestroy{// 定义一个变量来保存订阅privatetranslationSub!:Subscription;constructor(privatei18n:I18nService){}ngOnInit(){// 获取翻译加上类型约束 : stringthis.translationSubthis.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();}}}

相关新闻

【无标题】 2026最新2款AI编程工具平替之选深度实测

【无标题】 2026最新2款AI编程工具平替之选深度实测

这篇文章是写给和我一样从大厂出来创业的人:创业团队选 AI 编程工具,性价比和上手速度比功能数量重要得多。我去年底接了个信创IoT设备管理平台的国产化改造项目,代号「星联2025」,当时团队3个人,独立开发者年度AI工具…

2026/10/17 11:15:56 阅读更多 →
IGBT功率半导体器件:原理、特性与应用解析

IGBT功率半导体器件:原理、特性与应用解析

1. IGBT的基本概念与历史沿革 绝缘栅双极型晶体管(Insulated Gate Bipolar Transistor,简称IGBT)是一种兼具MOSFET高输入阻抗和BJT低导通压降特性的复合型功率半导体器件。作为现代电力电子系统的核心开关元件,IGBT通过独特的四层…

2026/10/16 10:01:28 阅读更多 →
场效应管(FET)核心参数解析与工程应用指南

场效应管(FET)核心参数解析与工程应用指南

1. 场效应管基础概念与分类体系场效应管(Field-Effect Transistor, FET)作为现代电子电路的核心元件,其性能参数直接决定了电路的整体表现。与双极型晶体管不同,FET是通过电场效应控制电流的单极型器件,具有输入阻抗高…

2026/10/17 10:27:57 阅读更多 →

最新新闻

跨境电商前端HTML模板:多语言多币种可落地骨架

跨境电商前端HTML模板:多语言多币种可落地骨架

简介:这是一套面向前端初学者与电商项目开发者的跨境电商网站前端模板代码,基于HTMLCSSJS构建,可快速搭建具备商品展示、购物车、响应式布局等基础功能的电商页面。资源共188个文件,包含26个结构清晰的HTML页面、7个核心CSS样式表…

2026/10/18 6:32:52 阅读更多 →
滴水OS 2.0 Pre:AI原生智能座舱操作系统架构与技术解析

滴水OS 2.0 Pre:AI原生智能座舱操作系统架构与技术解析

今年的CES2026展区里,智能座舱依然是绝对的流量担当,但真正让我停下来反复琢磨的,并不是哪家又堆了一块更大的屏幕,而是“滴水OS 2.0 Pre”这套主打“AI原生”的座舱操作系统。看了发布信息和现场演示之后,我的感觉是&…

2026/10/18 6:32:52 阅读更多 →
基于sherpa-onnx的Android离线语音识别与语音合成实战指南

基于sherpa-onnx的Android离线语音识别与语音合成实战指南

早些年做语音产品,总觉得离线识别和合成是稀罕事,直到真把 sherpa-onnx 跑在 Android 上,才意识到本地 ASR / TTS 的门槛可以压得非常低。用云端方案当然省事,但网络一抖就抓瞎,还会带来延迟和隐私问题。这阵子我重新把…

2026/10/18 6:32:52 阅读更多 →
2026年国产协作工具实测:8款高性价比选型指南

2026年国产协作工具实测:8款高性价比选型指南

我刚把团队里正在用的几套协作工具换了一轮,跑了大概两个月的对比测试,说实话,2026年拿来主义式地选协作工具已经不够用了,版本更新太快,功能卷得飞起,但很多团队的刚需其实就几条:任务看得见、…

2026/10/18 6:32:52 阅读更多 →
RK3562+RK817充电关机后无法开机:PMIC电源状态分支的排查与修复

RK3562+RK817充电关机后无法开机:PMIC电源状态分支的排查与修复

前阵子调一块 RK3562 RK817 的带电池主板,遇到一个特别折磨人的现象:插着充电器的时候系统能正常关机,但关机后马上按电源键,整机就像彻底断电一样,串口一个字符都没有,U-Boot 完全没有跑起来。拔掉充电器…

2026/10/18 6:32:52 阅读更多 →
SpringBoot+Vue健身房管理系统设计与实现全解析

SpringBoot+Vue健身房管理系统设计与实现全解析

1. 项目概述与业务价值拆解1.1 这个管理系统到底解决什么问题先说结论:健身房管理系统是目前JavaWeb毕设里性价比极高的一类选题。它不像电商系统那样业务链路冗长,也不像纯后台管理系统那样缺乏亮点,而是处在一个恰到好处的位置——业务逻辑…

2026/10/18 6:31:52 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →