2022-02-21 13:44:23
核心实现步骤如下:
定义多语言资源文件使用JSON格式存储不同语言的文本内容,例如:
const LANGUAGES = { en: { welcome: "Welcome", login: "Login" }, zh: { welcome: "欢迎", login: "登录" }};建议拆分为独立文件(如lang/en.json),通过动态导入或<script>标签引入。
检测用户语言偏好
浏览器语言:通过navigator.language获取,简化判断逻辑:function getBrowserLang() { const lang = navigator.language || 'en'; return lang.startsWith('zh') ? 'zh' : 'en';}
优先级处理:URL参数(?lang=zh)> localStorage > 浏览器语言:function getCurrentLang() { const urlParam = new URLSearchParams(window.location.search).get('lang'); return urlParam || localStorage.getItem('i18n_lang') || getBrowserLang();}
动态替换页面文本
标记元素:使用data-i18n属性指定键名:<h1 data-i18n="welcome"></h1><button data-i18n="login"></button>
翻译函数:遍历标记元素并替换内容:function translate(lang) { const texts = LANGUAGES[lang] || LANGUAGES.en; document.querySelectorAll('[data-i18n]').forEach(el => { const key = el.getAttribute('data-i18n'); el.textContent = texts[key] || key; // 显示键名作为回退 }); localStorage.setItem('i18n_lang', lang);}
初始化:调用translate(getCurrentLang())。
语言切换功能提供按钮或下拉菜单,调用switchLanguage并更新URL(可选):
function switchLanguage(lang) { translate(lang); // 可选:更新URL参数(需处理历史记录) const url = new URL(window.location); url.searchParams.set('lang', lang); window.history.pushState({}, '', url);}优化建议:
完整示例代码:
<!DOCTYPE html><html><head> <script> const LANGUAGES = { en: {}, zh: {} }; // 实际项目中替换为完整语言包 function getBrowserLang() { /* 同上 */ } function getCurrentLang() { /* 同上 */ } function translate(lang) { /* 同上,增加嵌套键和占位符处理 */ } function switchLanguage(lang) { /* 同上 */ } // 初始化 document.addEventListener('DOMContentLoaded', () => translate(getCurrentLang())); </script></head><body> <h1 data-i18n="welcome"></h1> <button data-i18n="login"></button> <div> <button onclick="switchLanguage('en')">English</button> <button onclick="switchLanguage('zh')">中文</button> </div></body></html>方案优势:
扩展场景: