前端开发
构建多语言应用时实现翻译管理、复数处理、日期货币格式化与…
在开发多语言应用、处理日期/货币格式化或支持从右到左语言时,用 i18next、gettext 或 Intl API 实现国际化。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
构建多语言应用时实现翻译管理、复数处理、通用
解决思路
- 使用 i18next 初始化:引入 i18next、initReactI18next 和 i18next-browser-languagedetector,调用 i18n.use(LanguageDetector).use(initReactI18next).init({ fallbackLng: 'en', interpolation: { escapeValue: false }, resources: { en: { translation: { welcome: 'Welcome, {{name}}!' } }, es: { translation: { welcome: '¡Bienvenido, {{name}}!' } } } })
- 在组件中使用翻译:通过 const { t } = useTranslation() 获取 t 函数,然后调用 t('welcome', { name: 'John' }) 渲染翻译文本
- 处理复数:在翻译文件中定义 items、items_plural、items_zero 等键,调用 t('items', { count: 0 }) 返回 'No items',t('items', { count: 1 }) 返回 '1 item',t('items', { count: 5 }) 返回 '5 items'
- 使用 Intl.DateTimeFormat 格式化日期:new Intl.DateTimeFormat('de-DE', { dateStyle: 'long', timeStyle: 'short' }).format(new Date())
- 使用 Intl.NumberFormat 格式化数字与货币:new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(1234.56) 返回 '$1,234.56'
- 使用 Intl.RelativeTimeFormat 格式化相对时间:new Intl.RelativeTimeFormat('en', { numeric: 'auto' }).format(-1, 'day') 返回 'yesterday'
- 支持 RTL:使用逻辑属性如 margin-inline-start: 1rem 和 padding-inline-end: 1rem 替代 margin-left/right;通过 html[dir="rtl"] .icon { transform: scaleX(-1); } 翻转图标
- 参考 references/frameworks.md 获取 React-Intl (Format.js) 完整实现、Python gettext 配合 Flask/Babel、RTL 语言支持模式以及 ICU Message Format 示例
- 提取所有面向用户的字符串进行翻译
- 对复杂翻译使用 ICU message format
- 使用伪本地化(pseudo-localization)进行测试
- 从一开始就支持 RTL
- 绝不拼接已翻译的字符串
- 生产环境使用专业翻译人员