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

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

毒舌时刻

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

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

为什么你需要国际化

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

反面教材

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

实验三 Windows Server 2022/2025 搭建 Web 服务器实验指导书

实验三 Windows Server 2022/2025 搭建 Web 服务器实验指导书

作者:非凡大爹|版本:v1|日期:2026-03-30|DocID:CN-LAB-2026-03-WEB-1-LG-V1 原创声明:本文为非凡大爹原创,首发于ZEEKLOG,转载或引用请注明出处。 一、实验基本信息 课程名称: Windows 网络管理 / 网络操作系统 / 服务器配置与管理 实验名称: Windows Server 2022/2025 搭建 Web 服务器 实验性质: 验证性 + 应用性实验 实验类别: 综合配置实验 建议学时: 2 学时 实验方式: 学生独立操作 + 结果验证 二、实验目的 1. 知识目标 理解 Web 服务器的基本作用,了解网站从“本地网页文件”到“网络可访问服务”的基本发布过程,

svn的web管理后台服务svnWebUI

背景 用户需要使用web管理页面管理svn,根据网上的资料了解到国产开源的管理后台有两个,一个是svnadmin,另一个是svnwebui。对比功能和部署方式的不同,最后选择svnwebui,原因是部署方便,只需要部署jar包和java环境即可,无需其它服务,而svnadmin需要部署php、数据库服务,所以我选择最方便的工具先试用。 系统环境 麒麟v10,X64 JDK 17 Svn 1.45.5 服务部署 项目地址:https://gitee.com/cym1102/svnWebUI/#svnwebui,当前版本1.9.0,项目地址里面有更详细的说明。 下载软件 wget -O svnWebUI.jar https://gitee.com/cym1102/svnWebUI/releases/download/1.9.0/svnWebUI-1.

Vue-Vben-Admin 从入门到实战:后端开发的前端探索之旅

Vue-Vben-Admin 从入门到实战:后端开发的前端探索之旅

技术视野拓展,从后端视角开启前端探索之旅 1. 概述:一名后端工程师的前端初体验 作为一名深耕后端多年的Java工程师,一直围绕着Spring全家桶、微服务、中间件和分布式架构等后端技术栈。前端世界对我而言,虽说感觉并不陌生,但总是带着一层神秘面纱,知识点零散,理解停留在表面。 直到某天,我在GitHub上偶然发现了Vue-Vben-Admin——这个拥有超过30k⭐️的热门前端脚手架,瞬间吸引了我的注意。它基于Vue3、TypeScript和Vite等前沿技术栈,提供了一套能够快速搭建企业级管理后台的前端解决方案。 为什么Vue-Vben-Admin如此火爆? 🔥 技术栈前沿 - 采用Vue3+TypeScript+Vite,这些都是当前前端生态中最新、最热门的技术组合 🔥 开箱即用 - 内置企业级项目所需的各种功能:权限管理、多种布局、主题切换、丰富示例,应有尽有 🔥 代码规范 - 严格的代码规范和类型检查,让后端开发者也能写出高质量的前端代码 🔥 性能优异 - 基于Vite的快速冷启动和热更新,开发体验流畅 🔥 多UI库支持 - 支持Ant Desi

自用超半年的免费 OCR 工具分享:告别付费,本地搭建更安心

自用超半年的免费 OCR 工具分享:告别付费,本地搭建更安心

前言 作为一个经常需要提取图片文字的打工人,以前总被各种 OCR 工具折腾得够呛 —— 在线工具要么限次数,要么识别慢,传隐私图片还总担心泄露;付费的 OCR 软件一年下来也是笔不小的开销,性价比实在不高。直到偶然用上了 PaddleOCR-VL,才算彻底解决了这些烦恼。 用下来最大的感受就是 “省心又靠谱”:不用再频繁切换各种在线平台,本地部署后随时能用,识别印刷体、手写体甚至复杂的数学公式都又快又准,完全不输付费工具;而且所有识别过程都在自己电脑上完成,隐私性拉满,再也不用顾虑图片上传的问题。 好东西当然要和大家分享,下面就把这套 “私人 OCR 平台” 的搭建和使用方法完整整理出来,跟着做,你也能告别付费 OCR,拥有专属的高效文字识别工具。 1 什么是PaddleOCR-VL? PaddleOCR‑VL 是 PaddleOCR 3.x 系列中的一款 视觉‑语言多模态文档解析模型,专门面向复杂文档场景设计。相比传统 OCR 仅能识别文字,