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

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

毒舌时刻

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

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

为什么你需要国际化

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

反面教材

// 反面教材:硬编码文本 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

ComfyUI保姆级安装指南:从零配置Python环境到共享WebUI模型库(避坑大全)

ComfyUI终极安装指南:复用WebUI资源与高效配置实战 第一次接触ComfyUI时,我被它那类似Blender的节点式界面震撼到了——这完全颠覆了我对AI绘画工具的认知。但随之而来的安装过程却让我这个有三年Stable Diffusion使用经验的老用户也踩了不少坑。最头疼的问题莫过于:如何在保留现有WebUI模型库的同时,让ComfyUI也能共享这些资源?毕竟谁也不想在已经塞满3TB硬盘的模型库里再复制一份几十GB的数据。 1. 环境预检与准备工作 在开始安装前,我们需要确保系统满足ComfyUI的基本运行要求。与WebUI不同,ComfyUI对环境的纯净度要求更高,特别是Python版本的管理。 1.1 硬件配置核查 最低配置: * 显卡:NVIDIA GTX 1060(4GB显存) * 内存:16GB DDR4 * 存储:SSD剩余空间≥50GB(仅系统+程序) 推荐配置: * 显卡:RTX 3060(12GB显存)及以上 * 内存:32GB DDR4 * 存储:NVMe SSD(模型库单独存放) 提示:显存不足8GB的用户建议关闭--hig

共绩算力 RTX 5090 极速部署 Stable Diffusion WebUI:新手也能秒开 AI 绘图工作站

共绩算力 RTX 5090 极速部署 Stable Diffusion WebUI:新手也能秒开 AI 绘图工作站

还在为本地硬件不足跑不动 AI 绘图模型发愁?想快速拥有高性价比的 Stable Diffusion 绘图环境?今天给大家带来共绩算力 RTX 5090 部署 Stable Diffusion WebUI(增强版)的详细教程,全程零兼容冲突,从云主机配置到生成第一张 AI 画作仅需 30 分钟,步骤清晰可复现,无论是设计爱好者还是 AI 新手都能轻松上手! 目录 一、为什么选择共绩算力部署 Stable Diffusion? 二、环境准备:精准配置云主机 2.1 创建云主机实例 1.2 登录云主机终端 二、完整部署流程 2.1 环境清理与依赖安装 2.2 下载与配置Stable Diffusion WebUI

ReAct Agent 与 Agent 编排:从单 Agent 闭环到多 Agent 协作(纯享版)

ReAct Agent 与 Agent 编排:从单 Agent 闭环到多 Agent 协作(纯享版)

ReAct Agent 与 Agent 编排:从单 Agent 闭环到多 Agent 协作 本篇文章,大概会花费你10分钟时间,带你对Agent进行更加深入的了解。 目录: * ReAct Agent 与 Agent 编排:从单 Agent 闭环到多 Agent 协作 * 一、这 10 分钟到底会讲什么 * 二、我将会分8节来讲 * 第 1 节:为什么要讲 ReAct 和 Agent 编排 * 时间:1 分钟 * 第 2 节:先讲清 Agent 的最小运行时骨架 * 时间:1 分钟

【Js逆向 python】Web JS 逆向全体系详细解释

【Js逆向 python】Web JS 逆向全体系详细解释

Web JS 逆向全体系内容 互联网技术安全提示与职业操守 做渗透测试,必须严格遵守以下原则: 1. 合法授权:仅在书面授权的范围内使用逆向技术,禁止未授权测试; 2. 最小影响:避免使用高风险参数(如sqlmap工具的 --risk=3、--os-shell),防止目标服务崩溃; 3. 数据保护:枚举到的敏感数据(如用户密码)需严格保密,测试后立即删除; 4. 留痕清理:测试结束后,协助目标清除测试留下的日志、文件等痕迹。 免责声明 1. 本文所述所有渗透测试技术、工具、命令及实战案例,仅适用于已获得目标系统 / 网络所有者书面授权的测试场景(如企业内部安全评估、甲方委托的红队测试、个人合法拥有的实验环境)。 2. 任何组织或个人若未取得明确书面授权,擅自将本文内容用于对第三方系统 / 网络的扫描、探测、攻击等行为,均属于非法网络活动,涉嫌违反《中华人民共和国网络安全法》《中华人民共和国刑法》(第