JavaScript实现国际化多语言支持需要结合语言包管理、文本替换逻辑以及内置的国际化API,整体可以分为基础配置、核心功能实现、进阶优化三个部分。

基础语言包配置
首先需要准备不同语言的文本资源,通常将语言包设计为键值对的形式,键是统一的标识,值是对应语言的文本。可以将不同语言的配置放在独立的对象中,方便后续扩展。
// 英文语言包
const en_US = {
greeting: 'Hello',
welcome: 'Welcome to our platform',
button_submit: 'Submit'
};
// 中文语言包
const zh_CN = {
greeting: '你好',
welcome: '欢迎来到我们的平台',
button_submit: '提交'
};
// 语言包映射
const langPackages = {
'en-US': en_US,
'zh-CN': zh_CN
};
核心切换逻辑实现
需要维护一个当前语言的状态,同时提供获取对应语言文本的方法,当语言切换时更新状态并重新渲染页面文本。
// 默认语言
let currentLang = 'zh-CN';
// 获取对应语言的文本
function t(key) {
const pkg = langPackages[currentLang];
if (!pkg) {
console.warn(`未找到语言包: ${currentLang}`);
return key;
}
return pkg[key] || key;
}
// 切换语言
function switchLang(lang) {
if (langPackages[lang]) {
currentLang = lang;
renderText();
}
}
// 渲染页面文本
function renderText() {
document.getElementById('greeting').textContent = t('greeting');
document.getElementById('welcome').textContent = t('welcome');
document.getElementById('submitBtn').textContent = t('button_submit');
}
结合Intl API实现格式化
JavaScript内置的Intl对象可以处理日期、数字、货币的本地化格式化,不需要手动编写不同地区的格式规则。
// 日期本地化格式化
function formatDate(date) {
return new Intl.DateTimeFormat(currentLang, {
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(date);
}
// 货币本地化格式化
function formatCurrency(amount) {
return new Intl.NumberFormat(currentLang, {
style: 'currency',
currency: currentLang === 'zh-CN' ? 'CNY' : 'USD'
}).format(amount);
}
// 使用示例
console.log(formatDate(new Date())); // 中文环境下输出 "2024年5月20日"
console.log(formatCurrency(100)); // 中文环境下输出 "¥100.00"
进阶优化方案
自动匹配用户偏好语言
可以通过navigator.language获取用户的浏览器语言,自动匹配对应的语言包,提升用户体验。
function getDefaultLang() {
const browserLang = navigator.language;
// 优先匹配完整语言标识,再匹配语言前缀
if (langPackages[browserLang]) {
return browserLang;
}
const langPrefix = browserLang.split('-')[0];
const matchedLang = Object.keys(langPackages).find(item => item.startsWith(langPrefix));
return matchedLang || 'zh-CN';
}
// 初始化时设置默认语言
currentLang = getDefaultLang();
动态加载语言包
如果语言包体积较大,可以采用动态加载的方式,只在需要切换对应语言时加载对应的资源,减少初始加载时间。
async function loadLangPackage(lang) {
if (langPackages[lang]) {
return langPackages[lang];
}
try {
const response = await fetch(`/lang/${lang}.json`);
const package = await response.json();
langPackages[lang] = package;
return package;
} catch (error) {
console.error('加载语言包失败:', error);
return null;
}
}
// 切换语言时动态加载
async function asyncSwitchLang(lang) {
const pkg = await loadLangPackage(lang);
if (pkg) {
currentLang = lang;
renderText();
}
}
注意事项
- 语言包的键名需要保持统一,避免出现同一文本在不同地方使用不同键名的情况
- 对于包含变量的文本,可以使用占位符的方式处理,比如
{name},欢迎回来,替换时传入对应参数 - 如果项目使用框架开发,可以将多语言逻辑封装成插件或 hooks,方便全局调用
JavaScript国际化i18n多语言支持修改时间:2026-07-10 09:48:18