
前端国际化(i18n)是现代Web应用中常见的需求,尤其面向多语言用户的项目。javaScript 提供了多种方式实现 i18n,无需依赖后端即可动态切换语言。下面介绍一种轻量、实用的纯 JS 国际化方案,适合中小型项目快速落地。
1. 基于 json 的语言包管理
最简单的方式是将不同语言的文本存为 JSON 文件,通过 key-value 形式组织。例如:
// locales/zh.json { "welcome": "欢迎使用我们的产品", "login": "登录", "logout": "退出" } // locales/en.json { "welcome": "Welcome to our product", "login": "Login", "logout": "Logout" }
在页面加载时,根据用户偏好或设置读取对应语言文件。可以预先将语言包导入 JS 对象,避免频繁请求。
2. 实现一个简单的 i18n 核心类
封装一个 I18n 类,负责加载语言包、切换语言和翻译文本。
立即学习“Java免费学习笔记(深入)”;
class I18n { constructor() { this.lang = 'zh'; // 默认语言 this.translations = {}; } async load(lang) { if (this.translations[lang]) { this.lang = lang; return; } try { const res = await fetch(`/locales/${lang}.json`); const data = await res.json(); this.translations[lang] = data; this.lang = lang; this.applyTranslations(); // 应用到页面 } catch (err) { console.error('Failed to load language:', lang); } } t(key) { return this.translations[this.lang]?.[key] || key; } applyTranslations() { document.querySelectorAll('[data-i18n]').forEach(el => { const key = el.getAttribute('data-i18n'); el.textContent = this.t(key); }); } }
使用 data-i18n 属性标记需要翻译的元素,调用 applyTranslations 自动更新文本。
3. 页面中使用方式
在 html 中通过属性绑定待翻译内容:
<h1 data-i18n="welcome"></h1> <button data-i18n="login"></button>
初始化并切换语言:
const i18n = new I18n(); // 加载中文 i18n.load('zh'); // 用户点击切换语言 document.getElementById('lang-switch').addEventListener('click', () => { const nextLang = i18n.lang === 'zh' ? 'en' : 'zh'; i18n.load(nextLang); }); // 动态获取翻译 console.log(i18n.t('login')); // 根据当前语言输出
4. 进阶优化建议
实际项目中可进一步提升体验:
- 缓存语言包:使用 localStorage 缓存已加载的语言 JSON,减少重复请求。
- 自动检测语言:读取 navigator.language 判断用户系统语言。
- 支持变量插值:如 “hello {{name}}”,扩展 t 方法支持参数替换。
- 按需加载:结合模块化,只加载当前语言包。
基本上就这些。这套方案不依赖框架,适用于原生 JS、vue、react 等各种项目,结构清晰,易于维护。对于复杂场景,可考虑使用 i18next 或 formatjs 等成熟库,但理解基础原理有助于更好集成和调试。