在 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/8/9 21:38:48 阅读更多 →
IGBT功率半导体器件:原理、特性与应用解析

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

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

2026/8/15 17:15:24 阅读更多 →
场效应管(FET)核心参数解析与工程应用指南

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

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

2026/8/14 0:36:48 阅读更多 →

最新新闻

OpenClaw网关安全重启指南:从告警到恢复的完整操作流程

OpenClaw网关安全重启指南:从告警到恢复的完整操作流程

1. 从一次紧急告警说起:OpenClaw网关重启的必要性与场景那天晚上十一点,手机突然弹出一连串告警。我负责维护的一套智能对话服务,其核心网关组件OpenClaw的响应延迟曲线像坐了火箭一样飙升,紧接着就是大量“503 Service Unavailab…

2026/8/16 3:33:02 阅读更多 →
实战指南:基于沙箱环境构建安全可控的多智能体系统

实战指南:基于沙箱环境构建安全可控的多智能体系统

最近在尝试将大模型能力集成到实际业务中时,你是否也遇到过这样的困境:单个AI模型能力有限,处理复杂任务时逻辑混乱、成本高昂且难以控制?面对多步骤的客户咨询、自动化报告生成或代码审查等场景,我们需要的不是一个“…

2026/8/16 3:33:02 阅读更多 →
OpenClaw双源记忆系统:构建具备长期记忆与经验学习能力的AI智能体

OpenClaw双源记忆系统:构建具备长期记忆与经验学习能力的AI智能体

1. 项目概述:当AI学会“回头看”与“向前看”最近在折腾一个挺有意思的开源项目,叫OpenClaw。这名字听着就有点“爪牙”的犀利感,但它核心的魅力,不在于多锋利的攻击性,而在于一种更接近人类思考方式的“记忆”机制。我…

2026/8/16 3:33:02 阅读更多 →
「安卓framework基础篇7」从WMS到BufferQueue第一篇 - WMS层级树的初始化过程(基于AOSP13)

「安卓framework基础篇7」从WMS到BufferQueue第一篇 - WMS层级树的初始化过程(基于AOSP13)

「安卓framework基础篇7」从WMS到BufferQueue第一篇 - WMS层级树的初始化过程(基于AOSP13) 上一篇文章分析了Vsync的基本工作过程,最终Vsync信号会派发给订阅Vsync信号的APP进程,那APP进程收到Vsync信号后,会做哪些事情呢?本篇咱们…

2026/8/16 3:32:01 阅读更多 →
BIOS/UEFI设置全解析:从入门到实战的电脑底层控制指南

BIOS/UEFI设置全解析:从入门到实战的电脑底层控制指南

1. 项目概述:为什么我们需要重新认识BIOS?每次电脑开机,屏幕上闪过品牌Logo,下方一行小字提示你按某个键进入“Setup”或“BIOS”时,有多少人会真的去按?对于绝大多数普通用户来说,BIOS&#xf…

2026/8/16 3:32:01 阅读更多 →
大模型为什么连 24 点都算不对?Tree of Thoughts 让它学会「试错和回头」,成功率从 4% 飙到 74%

大模型为什么连 24 点都算不对?Tree of Thoughts 让它学会「试错和回头」,成功率从 4% 飙到 74%

大模型为什么连 24 点都算不对?Tree of Thoughts 让它学会「试错和回头」,成功率从 4% 飙到 74% 你让 GPT-4 算一道 24 点(用 4 个数字加减乘除凑出 24),它大概率会卡壳。 不是因为它不会算——459 这种它门儿清。而…

2026/8/16 3:32:01 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →