前端国际化:别让你的应用只懂一种语言

前端国际化:别让你的应用只懂一种语言

毒舌时刻

这应用写得跟方言似的,出了本地就没人懂。

各位前端同行,咱们今天聊聊前端国际化。别告诉我你的应用还只有中文版本,那感觉就像在国际会议上只说方言——能说,但没人懂。

为什么你需要国际化

最近看到一个项目,想拓展海外市场,但所有文本都是硬编码在代码里的。我就想问:你是在做本地应用还是在做国际产品?

反面教材

// 反面教材:硬编码文本 function App() { return ( <div> <h1>欢迎来到我的网站</h1> <p>这是一个示例应用</p> <button>点击我</button> <div> <h2>产品列表</h2> <ul> <li>产品 1</li> <li>产品 2</li> <li>产品 3</li> </ul> </div> </div> ); } export default App; 

毒舌点评:这代码,就像在写日记,只有自己能看懂。

正确姿势

1. i18next

// 正确姿势:i18next // 1. 配置 // i18n.js import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; const resources = { zh: { translation: { welcome: '欢迎来到我的网站', description: '这是一个示例应用', button: '点击我', products: '产品列表', product1: '产品 1', product2: '产品 2', product3: '产品 3' } }, en: { translation: { welcome: 'Welcome to my website', description: 'This is a sample application', button: 'Click me', products: 'Product List', product1: 'Product 1', product2: 'Product 2', product3: 'Product 3' } } }; i18n .use(initReactI18next) .init({ resources, lng: 'zh', fallbackLng: 'en', interpolation: { escapeValue: false } }); export default i18n; // 2. 使用 // App.jsx import React from 'react'; import { useTranslation } from 'react-i18next'; function App() { const { t, i18n } = useTranslation(); const changeLanguage = (lng) => { i18n.changeLanguage(lng); }; return ( <div> <div> <button onClick={() => changeLanguage('zh')}>中文</button> <button onClick={() => changeLanguage('en')}>English</button> </div> <h1>{t('welcome')}</h1> <p>{t('description')}</p> <button>{t('button')}</button> <div> <h2>{t('products')}</h2> <ul> <li>{t('product1')}</li> <li>{t('product2')}</li> <li>{t('product3')}</li> </ul> </div> </div> ); } export default App; // 3. 入口文件 // index.js import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; import './i18n'; ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); 

2. react-intl

// 正确姿势:react-intl // 1. 配置 // App.jsx import React from 'react'; import { IntlProvider, FormattedMessage } from 'react-intl'; const zhMessages = { welcome: '欢迎来到我的网站', description: '这是一个示例应用', button: '点击我', products: '产品列表', product1: '产品 1', product2: '产品 2', product3: '产品 3' }; const enMessages = { welcome: 'Welcome to my website', description: 'This is a sample application', button: 'Click me', products: 'Product List', product1: 'Product 1', product2: 'Product 2', product3: 'Product 3' }; function App() { const [locale, setLocale] = React.useState('zh'); const messages = locale === 'zh' ? zhMessages : enMessages; return ( <IntlProvider locale={locale} messages={messages}> <div> <div> <button onClick={() => setLocale('zh')}>中文</button> <button onClick={() => setLocale('en')}>English</button> </div> <h1><FormattedMessage /></h1> <p><FormattedMessage /></p> <button><FormattedMessage /></button> <div> <h2><FormattedMessage /></h2> <ul> <li><FormattedMessage /></li> <li><FormattedMessage /></li> <li><FormattedMessage /></li> </ul> </div> </div> </IntlProvider> ); } export default App; 

3. 日期和数字格式化

// 正确姿势:日期和数字格式化 import React from 'react'; import { useTranslation } from 'react-i18next'; function FormattingExample() { const { t, i18n } = useTranslation(); const formatDate = (date) => { return new Intl.DateTimeFormat(i18n.language).format(date); }; const formatNumber = (number) => { return new Intl.NumberFormat(i18n.language).format(number); }; return ( <div> <p>{t('currentDate')}: {formatDate(new Date())}</p> <p>{t('price')}: {formatNumber(12345.67)}</p> </div> ); } export default FormattingExample; 

毒舌点评:这才叫国际化,让你的应用在全球范围内都能被理解。

Read more

零基础学AI大模型之Agent智能体

零基础学AI大模型之Agent智能体

大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析消息队列深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)AI大模型零基础学AI大模型之RunnableBranch 前情摘要 1、零基础学AI大模型之读懂AI大模型 2、零基础学AI大模型之从0到1调用大模型API 3、零基础学AI大模型之SpringAI 4、零基础学AI大模型之AI大模型常见概念 5、零基础学AI大模型之大模型私有化部署全指南 6、零基础学AI大模型之AI大模型可视化界面 7、零基础学AI大模型之LangChain 8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路 9、零基础学AI大模型之Prompt提示词工程 10、零基础学AI大模型之LangChain-PromptTe

猫头虎AI分享|字节开源了一款具备长期记忆能力的多模态智能体:M3-Agent 下载、安装、配置、部署教程

猫头虎AI分享|字节开源了一款具备长期记忆能力的多模态智能体:M3-Agent 下载、安装、配置、部署教程

猫头虎AI分享|字节开源了一款具备长期记忆能力的多模态智能体:M3-Agent 大家好,我是猫头虎 🦉🐯,今天给大家带来一个超硬核的开源 AI 项目分享:M3-Agent。这是一款由字节开源的、多模态智能体框架,最大的亮点是它具备长期记忆能力,能够像人类一样“看、听、记、推理”。 项目地址: 👉 猫头虎开源 fork github 什么是 M3-Agent? M3-Agent 是一款能够实时处理视觉和听觉输入,并将其转化为长期记忆的多模态智能体。它不仅可以存储情景记忆(episodic memory),还能够逐渐积累语义记忆(semantic memory),形成类似人类的长期知识库。 其核心创新点在于: * 实体为中心的记忆系统:把与同一实体相关的多模态信息(如人脸、声音、相关知识)关联起来,构建成一个图谱。 * 多轮迭代推理:在执行任务时,能够从长期记忆中检索相关信息来辅助推理,而不仅仅依赖即时上下文。 * 跨模态理解能力:它不局限于单一模态,能够在视觉、听觉、语言之间进行信息融合与推理。

AI 革命下半场:从对话到执行,OpenClaw 开启的执行范式革命

AI 革命下半场:从对话到执行,OpenClaw 开启的执行范式革命

从对话到执行:开源 AI 执行引擎 OpenClaw 深度解析|安装 + 实战 + 未来全指南 本文作者:ZEEKLOG 博客专家 | 专注 AI Agent 与自动化技术落地本文核心:以「AI 平权与生产力解放」为核心脉络,深度拆解 OpenClaw 的底层哲学、架构逻辑、全平台落地实操、行业实战与未来演进,新手可零门槛跟着落地,开发者可读懂 AI 从「对话」到「执行」的本质跃迁。全文干货与思考并存,建议收藏。 前言:AI 革命的下半场,是从「说到」到「做到」 人类文明的进步,从来不是靠「能说会道」,而是靠「说到做到」。 过去五年,大模型完成了

OpenSpec 完全使用指南:用规格驱动 AI 编码

OpenSpec 完全使用指南:用规格驱动 AI 编码

🚀 OpenSpec 完全使用指南:用规格驱动 AI 编码 摘要:如果你正在用 AI 写代码,却总觉得"沟通成本"比"写代码"还高——OpenSpec 可能是你一直缺的那块拼图。本文是我整理的日常使用 OpenSpec 的实战指南。 一、AI 编码的真正瓶颈不是代码,是对齐 🎯 用 AI 结对编程一段时间后,你大概率会遇到几个反复出现的问题: 🔴 常见痛点 1. 沟通成本高 你花了两段话描述一个功能,AI 听起来像是懂了,写出来的代码却跑偏了。你纠偏、它重来,几轮下来上下文窗口已经被消耗大半,真正写代码的空间反而不剩多少。 2. 上下文丢失 好不容易和 AI 对齐了设计思路,实现完一个功能。过两天打开新对话继续下一个功能,之前的所有讨论、