当前位置: 首页 > article >正文

react-i18next 国际化支持

一、今日整体工作内容今天完成的是做了国际化支持实现中英文语言切换。首先看了官方的 API 文档它支持不同的编辑器语言。然后我用 React Next 18 引入了相关包自己维护了一个 locale 键值数组对应中文和英文字段。全文国际化不是简单调用 API它需要配置台注入内容。因为我一开始觉得比较麻烦我用了很多文本的hard code还有一些组件包括主编辑区也是基于 BlockNote 这个开源库开发的其实理一下也还好因为后面用了框架。我用的是 i18n 框架react-i18next能自动读取我维护的中英文 JSON 文件。i18n 框架的核心逻辑本质是 JSON 语言文件的“管理器”和“分发员”。核心解决了三件事语言文件加载、字段映射、语言切换时的状态同步。它提供了一个 t ( )函数。我在实际代码里写了很多 t ( )函数填入对应字段就可以切换中英文我也不太清楚底层原理。我们要做的就是翻译工作和工程化基建。然后又做了一个 UI 组件只是一个按钮。这个东西我没找到现成的用 segmented 写并且补充localstorage 持久化记住之前的选择。在 main 里然后把 i18n 实例放上。import{StrictMode}fromreact;import{createRoot}fromreact-dom/client;import{ThemeProvider}fromnext-themes;importAppfrom./App.tsx;import./locales/i18.ts;createRoot(document.getElementById(root)!).render(StrictModeThemeProviderApp//ThemeProvider/StrictMode,);二、国际化支持一编辑器语言切换异常后面我就是在做一些很没用的工作。编辑区为什么不能跟着切换语言编辑器语言为什么不会改我看 BlockNote 原生是支持的然后我就一直在弄这个…来看官方文档是怎么介绍这块Integration with i18n LibrariesYou can integrate BlockNote with popular i18n libraries like react-i18next or next-intl:import{useCreateBlockNote,BlockNoteView}fromblocknote/react;import{useTranslation}fromreact-i18next;import*aslocalesfromblocknote/core/locales;functionI18nEditor(){const{i18n}useTranslation();consteditoruseCreateBlockNote({dictionary:locales[i18n.languageaskeyoftypeoflocales]||locales.en,});returnBlockNoteView editor{editor}/;}现在代码里一个问题全局创建了实例但编辑器的原则是重新创建实例就会把之前内容丢掉。我要做的一是切换语言二是之前内容不丢失。切换语言这一块一开始偶尔能切换成功偶尔不行应该是渲染时机或者竞态条件的问题。有可能拿到切换数据时组件已经渲染好了或者还没渲染反正很玄学根本不知道有没有被激活。一开始 AI 给我的方案是可能太卡没加载出来。因为实例创建在 App 根组件里切换语言会导致页面重绘。AI 让我把 i18n 实例移到 Content 里再做状态分发。我觉得很麻烦之前用的都是 props 传递改成 Context 很多地方都要改传递实例的地方要重新声明。后来想到原生钩子应该遵循 React Hook 规则要有依赖数组把 language 变量放进依赖数组里。如果当前 language 因切换改变就重新渲染问题就解决了。consteditoruseCreateBlockNote({dictionary:langzh?zh:en,uploadFile,},[lang],);还有默认设置默认打开是中文切换后要记住刷新后状态也保留这些都在 i18n 的 TS 配置里。importi18nfromi18next;import{initReactI18next}fromreact-i18next;importLanguageDetectorfromi18next-browser-languagedetector;importenfrom./en.json;importzhfrom./zh.json;constresources{en:{translation:en,},zh:{translation:zh,},};exportconsti18nPromisei18n.use(LanguageDetector).use(initReactI18next).init({resources,fallbackLng:zh,nonExplicitSupportedLngs:true,supportedLngs:[zh,en],detection:{order:[localStorage],caches:[localStorage],},interpolation:{escapeValue:false,// react already safes from xss},});exportdefaulti18n;二切换语言时编辑区内容不丢失使用 useRef 保存一份“当前的文档内容”。内存缓存Ref使用 useRef 保存一份“当前的文档内容”。无论 editor 怎么变Ref 里的内容都不会丢失。卸载前同步利用 useEffect 的清理函数cleanup function在 editor 卸载前强制从 editor.document 中提取最新内容并更新到 Ref 中。重建后填充当新的 editor 实例挂载时读取这个 Ref 里的内容而不是仅仅依赖 useEditorStorage 里的 data。// 1. 在 Editor 渲染层创建一个 Ref 存储最新内容constlatestContentRefuseRef(null);// 2. 利用 useEffect 监听 editor 变化在旧 editor 销毁前保存内容useEffect((){return(){// 销毁前的清理将 editor 里的内容同步到 ReflatestContentRef.currenteditor.document;};},[editor]);// 3. 在初始化新 editor 后优先使用 latestContentRef 的内容useEffect((){constcontentlatestContentRef.current||data?.content;if(editorcontent){editor.replaceBlocks(editor.document,content);}},[editor]);三白屏问题问题if (!ready) 条件内渲染完整 UIready 为 true 时无返回值导致初始化完成后白屏i18n.init() 是异步操作但组件渲染时直接读取 i18n.language此时 i18n 可能未初始化完成useState(i18n.language) 初始化时机过早LanguageDetector 浏览器语言检测也需要时间。修复方案// 等待 i18n 初始化完成显示 Loading 状态if(!ready){returndivLoading.../div;}// ready 为 true 时渲染完整应用return(ThemeBridgediv classNamefixed-viewportToolbar editor{editor}/Splitter style{{flex:1,height:calc(100% - 48px),overflow:hidden}}Splitter.Panel classNamesidebar-container sidebar-triggerstyle{{overflow:hidden}}collapsible{{start:true,end:true}}div classNamesidebar-hidden sidebar-scrollableSidebar editor{editor}//div/Splitter.PanelSplitter.Panel classNamemain-contentmin20%defaultSize80%style{{display:flex,flexDirection:column,overflow:hidden,}}div classNamemain-content-scrollablestyle{{padding:15px 20px,flex:1,overflow:auto}}Editor key{lang}editor{editor}onSave{save}noteId{docId}//divFootbar editor{editor}//Splitter.Panel/Splitter/div/ThemeBridge);额外优化解决 i18n 异步初始化问题const{i18n,ready}useTranslation();const[lang,setLang]useState(i18n.language);const[isI18nReady,setIsI18nReady]useState(i18n.isInitialized);useEffect((){// 等待 i18n 初始化完成if(i18n.isInitialized){setIsI18nReady(true);setLang(i18n.language);}else{constunsubscribei18n.on(initialized,(){setIsI18nReady(true);setLang(i18n.language);});return()unsubscribe();}},[i18n]);// 等待 ready 后再渲染if(!ready||!isI18nReady){returndivLoading.../div;}三、性能优化与打包除此之外还做了性能优化跟之前策略差不多也是把导入的包做成动态加载。不知道为什么 Web 端性能很快但移动端测试很慢说是 JS 包太大我按提示重新打包在 Vite 配置里重新配置反而更慢了越改越错越改越难用这一块之后我还要补一补性能优化。后面也花了很多时间做 Git 版本回退vercel回退版本再部署。小结这一部分很简单但是我却真的头大终于好了。不知道为什么 AI 给我一些错误答案也可能我自己没描述好乱七八糟的有点浪费时间。瞎忙活重复性大规模重构的要求扔给ai改代码改完也不知道会变成什么样上下文不够的时候拆东墙补西墙各种崩溃感觉很蠢效率很低。我学到的是要去看源码、看配置。之前依赖数组useCreateBlockNote源码里其实已经说过支持dependency 配置项可以填依赖要去看源码不能只看接口文档官方文档不会写那么细的需求。总之读源码很重要要看源码看原始数据流要理清当前代码在做什么比盲目翻文档重要太多

相关文章:

react-i18next 国际化支持

一、今日整体工作内容 今天完成的是做了国际化支持,实现中英文语言切换。首先看了官方的 API 文档,它支持不同的编辑器语言。然后我用 React Next 18 引入了相关包,自己维护了一个 locale 键值数组,对应中文和英文字段。 全文国际…...

2025 年全国大学生电子设计竞赛试题(C 题)——基于单目视觉的目标物测量装置

一、 任务 设计制作基于单目视觉的目标物测量装置,用于测量并显示基准线到目标物的距离 D(见说明)、目标物平面(简称物面)上几何图形的边长或直径 x,测量系统组成如图 1 所示。测量电路和单目摄像头组成测量…...

打造Spring Boot接口护盾:防重提交与限流秘籍

打造Spring Boot接口护盾:防重提交与限流秘籍 Spring Boot 接口那些 “糟心事” 在当今高并发的互联网应用场景下,Spring Boot 作为主流的 Java 开发框架,被广泛应用于构建各类后端服务。然而,随着业务的不断发展和用户量的增长&a…...

【JAVA学习思维导图】黑马程序员Java+AI智能辅助编程day03- 结构-Xmind思维导图

...

JunZi Music 2.0.5 | 聚合网易云和酷狗双音源,支持超清母带下载

JunZi Music是一款特色鲜明的听歌软件,整合了网易云音乐和酷狗音乐双音源。它允许用户导入网易云和酷狗的歌单,不过歌单属于本地存储,卸载软件后会消失;同时具备收藏歌曲功能,该功能通过服务器保存,可跟随账…...

2026年论文AI率从85%降到8%全记录:踩了3个坑才搞定

2026年论文AI率从85%降到8%全记录:踩了3个坑才搞定 改了三遍,AI率从45%涨到了62%。 没错,越改越高。因为方向错了——我当时在用手动改写的方式,每段都在调措辞换说法,结果反而让文本特征变得更像AI生成的。后来换了…...

从实验室到码头:精仪智检的技术迭代与海洋监测精度革新路径

风暴潮会对海岸造成冲击。海浪会对船舶航行构成威胁。每一次海洋灾害的发生,都与传统监测技术的局限性密切相关。传统浮子式验潮仪的测量误差普遍达到10cm。这一误差可能导致灾害预警延迟数小时。延迟预警会造成数亿元的经济损失。在这样的背景下,福州大…...

【C语言程序设计】第27篇:递归函数原理与实例分析

1 引言考虑计算阶乘的问题&#xff1a;n! n (n-1) ... 2 1。我们可以用循环实现&#xff1a;cint factorial(int n) {int result 1;for (int i 1; i < n; i) {result * i;}return result; }但也可以换一种思路&#xff1a;n! n (n-1)!&#xff0c;即阶乘可以用自身…...

零基础上手:5分钟搭建第一个智能体——用Coze零代码实战(2026智能体开发系列·第3篇)

> 本文适合:AI智能体零基础新手、非技术从业者、想快速体验智能体开发的爱好者 > 阅读难度:🌟(全程零代码、图文步骤,复制模板即可上手,5分钟搞定) > 系列衔接:承接第2篇《AI Agent核心概念拆解》,将“感知、工具调用”等概念落地到实操,用Coze零代码搭建…...

湘潭品牌设计公司权威推荐榜单

在当今竞争激烈的市场环境中&#xff0c;品牌已成为企业最核心的资产之一。一个专业、系统、富有战略性的品牌设计&#xff0c;不仅能提升企业的市场辨识度&#xff0c;更能成为驱动业务增长的强大引擎。对于湘潭及周边地区的企业而言&#xff0c;选择一家专业、可靠的品牌设计…...

【Spring框架】别再死记硬背!AOP 原来这么简单

一、核心定义 AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程范式&#xff0c;核心思想是&#xff1a;将与业务核心逻辑无关&#xff0c;但多个模块都需要的通用功能&#xff08;如日志、事务、权限校验&#xff09;抽离出来&…...

Kafka消息幂等性实战指南

Kafka 通过 生产者端机制 与 消费者端应用设计 协同保障消息处理的幂等性&#xff08;即重复操作不影响最终结果&#xff09;。需注意&#xff1a;Kafka 本身不提供“端到端全自动幂等”&#xff0c;需结合配置与业务逻辑实现。核心方案如下&#xff1a;&#x1f512; 一、生产…...

基于大数据的学习资源推送系统的设计与实现-

目录需求分析与规划数据采集与处理推荐算法设计系统架构实现测试与优化部署与维护项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与规划 明确系统目标&#xff0c;如个性化推荐、资源分类、用…...

筋膜提拉一般多少钱

在面部年轻化领域&#xff0c;筋膜提升手术始终是公认的“终极抗衰方案”。它打破传统表皮提拉的局限&#xff0c;通过精准切除面部松弛冗余的皮肤&#xff0c;同时对SMAS筋膜层这一深层支撑结构进行复位、提升与紧致&#xff0c;从衰老根源重塑清晰面部轮廓&#xff0c;让皱纹…...

单链表应用:双指针【快慢指针】

[2019] &#xff08;15 分&#xff09;已知一个带有表头节点的单链表&#xff0c;节点结构为datalink假设该链表只给出了头指针 list。在不改变链表的前提下&#xff0c;请设计一个尽可能高效的算法&#xff0c;查找链表中倒数第 k 个位置上的结点&#xff08;k 为正整数&#…...

2026微信抢红包终极秘籍:从0.01元专业户到手气王锦鲤

2026年抢红包&#xff0c;早已不是“拼手速”那么简单&#xff01;微信红包的分配背后藏着明确的算法逻辑&#xff0c;掌握这套逻辑再搭配实用技巧&#xff0c;就能从“陪跑选手”逆袭成“红包锦鲤”。据统计&#xff0c;2026年除夕夜用户共抢到50.8亿个微信红包&#xff0c;但…...

鸿蒙HarmonyOS开发从入门到实战:一份完整的布局与组件学习路线图

最近整理了一份《鸿蒙HarmonyOS深度探索》的学习资料&#xff0c;涵盖了从UI布局到基础组件的完整知识体系&#xff0c;特别适合想要系统性入门HarmonyOS应用开发的同学。 鸿蒙HarmonyOS深度探索 &#x1f4da; 内容体系概览 这份资料不是简单的概念堆砌&#xff0c;而是按照…...

Hi3519芯片开发过程笔记:四、Uboot环境变量nand_env.bin镜像生成方法(默认环境变量设置方法)

Hi3519的sdk里面&#xff0c;默认的分区方式中&#xff0c;有一个分区是专门用来存放Uboot的env环境变量的。如图所示&#xff0c;Hi3519的SDK可以生成可烧写的uboot环境变量.bin镜像文件。具体的生成方法为&#xff1a;在目录&#xff1a;/Hi3519dv500_sdk_new/Hi3519DV500_SD…...

甩掉API硬编码包袱:2026桌面级办公智能体选型指南及实在Agent等主流工具横评

2026年&#xff0c;企业自动化已全面从“对话框时代”跨入“行动代理时代”。 选型逻辑不再是单纯对比模型参数&#xff0c;而是考验智能体&#xff08;Agent&#xff09;对复杂办公环境的系统级操纵能力与安全合规边界。 本文将深度拆解当前市场主流方案&#xff0c;通过多维R…...

ADRC优于PID?真相揭秘

ADRC与PID控制对比分析&#xff1a;为何经典PID仍占主导地位 1. 控制算法基本原理对比 1.1 PID控制核心原理 PID&#xff08;比例-积分-微分&#xff09;控制器是控制领域最经典的算法&#xff0c;其基本结构包含三个核心环节&#xff1a; // PID控制器基本实现 float PID_…...

迦娃餐馆点餐系统的设计与实现小程序

目录需求分析技术选型原型设计开发与测试部署上线运营维护关键代码示例&#xff08;微信小程序&#xff09;项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析 明确迦娃餐馆点餐系统的核心功能需…...

SQL Server 学习笔记:从 MySQL 到 SQL Server

作为一名在大学项目 中经常使用MySQL 数据库的开发者&#xff0c;最近因项目需要开始学习 SQL Server。本文记录核心差异点和学习要点&#xff0c;方便有相同背景的同学快速上手以及我的事后回顾。一、基础概念对比 特性 MySQL SQL Server 所属公司 Oracle&#xff08…...

答题卡检测

答题卡识别评分代码完整讲解1. 答题卡处理流程图1) 读取答题卡图像并进行灰度化、模糊处理和边缘检测&#xff1b;2) 定位答题卡区域并进行透视变换&#xff1b;3) 通过阈值处理和轮廓分析检测填涂的选项泡泡&#xff1b;4) 将检测结果与标准答案对比计算得分。系统支持自定义参…...

程序员如何利用自然语言处理技术

程序员如何利用自然语言处理技术关键词&#xff1a;程序员、自然语言处理、技术应用、算法原理、实战案例摘要&#xff1a;本文旨在全面探讨程序员如何利用自然语言处理&#xff08;NLP&#xff09;技术。从自然语言处理的背景知识入手&#xff0c;详细阐述其核心概念、算法原理…...

简单的c语言分析 汇编代码

1、STR是ARM汇编中的内存访问指令&#xff1a;表示字数据写入&#xff0c;用于将一个32位的字数据写入到指令中指定的内存单元。 比如STR R0, [R1, #0x100]; 表示将R0中的字数据保存到内存单元&#xff08;R10x100&#xff09;中。2、 BL 指令BL 指令的格式为&#xff1a; BL{条…...

ALS(Approximate Logic Synthesis) 综述| Approximate Logic Synthesis: A Survey

记一下ALS的综述笔记。Introduction 讲近似电路计算的两种分类&#xff0c;大致介绍了怎么对误差建模。Method for error estimation 讲如何计算近似电路和精确电路的误差。包括&#xff1a; A. error matrix hamming distance (max & average)error rateapproximate effic…...

keil+Arm Visual Hardware(AVH)入门

1.准备 下载keil5,最新版本5.37&#xff08;早期版本没有AVH&#xff09;,激活professional版本&#xff0c;plus和Essential版本不行 2.安装好keil后&#xff0c;建立VHT工程&#xff0c;此处以arm cortex-M4为例&#xff0c;按照下图选择设备3.配置标准接口&#xff0c;下面以…...

Google Earth Engine(GEE)——矢量数据集合和影像集合的连接join,给矢量集合添加到两景影像作为矢量集合的属性

本次教程主要是加载一个矢量集合,然后通过设定指定的时间条件和地理条件,和指定的时间窗口进行筛选应用于Landsat8 影像,最后将筛选出的影像加载到矢量集合中。 矢量数据集合: Feature Index Dy (Long) Hr (Long) Location N (String) Mo (Long) Year (Long) system:index…...

全球台锯:家具家装与建筑工程刚需驱动下的稳增扩容,2026-2032年CAGR3.8%,2032年规模9.6亿美元

在制造业与木工行业的蓬勃发展浪潮中&#xff0c;台锯作为核心工具&#xff0c;其市场表现备受瞩目。QYResearch调研显示&#xff0c;2025年全球台锯市场规模大约为7.41亿美元&#xff0c;预计2032年将达到9.6亿美元&#xff0c;2026-2032期间年复合增长率&#xff08;CAGR&…...

解决报错:ORA-12541:TNS:无监听程序

1.重新配置监听 找到监听程序配置&#xff0c;右键已管理员身份运行 选择第二个&#xff1a;重新配置 这个一般没什么好选的 默认选定的协议TCP&#xff0c;继续下一步 默认的否 继续下一步&#xff0c;完成监听重新配置 之后进行测试看能否连上 2.本地Net服务名配置 …...