最简单的实现(使用 data-* 属性)

这是最直接、最简单的方法,适合小型项目或快速原型,我们将文本内容直接写在 HTML 的 data-* 属性中。

HTML 结构

为需要切换的文本元素添加一个共同的类名(lang-text),并使用 data-zhdata-en 属性来存储两种语言的文本。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">中英文切换</title>
    <style>
        body { font-family: sans-serif; }
        #lang-switcher {
            position: fixed;
            top: 20px;
            right: 20px;
        }
        .lang-btn {
            margin-left: 10px;
            padding: 5px 10px;
            cursor: pointer;
            border: 1px solid #ccc;
            background: #f0f0f0;
        }
        .lang-btn.active {
            background: #007bff;
            color: white;
            border-color: #007bff;
        }
    </style>
</head>
<body>
    <div id="lang-switcher">
        <span class="lang-btn active" data-lang="zh">中文</span>
        <span class="lang-btn" data-lang="en">English</span>
    </div>
    <h1 class="lang-text" data-zh="欢迎来到我的网站" data-en="Welcome to My Website"></h1>
    <p class="lang-text" data-zh="这是一个使用 jQuery 实现的语言切换示例。" data-en="This is an example of language switching using jQuery."></p>
    <p class="lang-text" data-zh="请点击右上角的按钮进行切换。" data-en="Please click the buttons in the top-right corner to switch."></p>
    <!-- 引入 jQuery 库 -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <!-- 引入我们的脚本 -->
    <script src="script.js"></script>
</body>
</html>

JavaScript 代码 (script.js)

使用 jQuery 监听语言切换按钮的点击事件,然后遍历所有带有 lang-text 类的元素,根据当前选择的语言更新其文本内容。

$(document).ready(function() {
    // 语言切换按钮点击事件
    $('.lang-btn').on('click', function() {
        // 1. 移除所有按钮的 'active' 类,给当前点击的按钮添加 'active' 类
        $('.lang-btn').removeClass('active');
        $(this).addClass('active');
        // 2. 获取当前选择的语言
        const lang = $(this).data('lang');
        // 3. 遍历所有需要切换文本的元素
        $('.lang-text').each(function() {
            // 4. 根据语言属性设置元素的文本内容
            // 使用 `attr` 获取 data-* 属性的值
            if (lang === 'zh') {
                $(this).text($(this).data('zh'));
            } else if (lang === 'en') {
                $(this).text($(this).data('en'));
            }
        });
    });
    // 页面加载时,设置默认语言(例如中文)
    // 这部分代码其实和点击中文按钮的效果一样,可以写也可以不写
    // 如果不写,页面初始加载时可能显示的是 HTML 的 lang 属性内容
    $('.lang-btn[data-lang="zh"]').click(); 
});

优点:

  • 简单直观,无需额外的 JSON 文件。
  • HTML 和文本内容在一起,方便查找。

缺点:

  • HTML 文件会变得臃肿,特别是当文本内容很多时。
  • 不利于维护,如果需要修改文本,需要同时修改 HTML 和可能存在的 JSON 文件。

更专业的实现(使用 JSON 文件)

这是更推荐的方法,尤其对于大型项目,我们将所有文本内容存储在一个外部的 JSON 文件中,HTML 只需要定义结构和类名,这样逻辑更清晰,也方便非技术人员(如翻译)管理翻译内容。

创建语言 JSON 文件

在项目根目录下创建一个 lang 文件夹,并添加两个 JSON 文件。

lang/zh.json (中文)

{
    "welcome": "欢迎来到我的网站",
    "description": "这是一个使用 jQuery 实现的语言切换示例。",
    "instruction": "请点击右上角的按钮进行切换。"
}

lang/en.json (英文)

{
    "welcome": "Welcome to My Website",
    "description": "This is an example of language switching using jQuery.",
    "instruction": "Please click the buttons in the top-right corner to switch."
}

修改 HTML 结构

HTML 不再需要 data-* 属性,只需要给需要替换文本的元素加上一个共同的类名(i18n),并用 data-key 属性指向 JSON 文件中的键。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">中英文切换 (JSON版)</title>
    <style>
        /* 样式与方案一相同 */
        body { font-family: sans-serif; }
        #lang-switcher {
            position: fixed;
            top: 20px;
            right: 20px;
        }
        .lang-btn {
            margin-left: 10px;
            padding: 5px 10px;
            cursor: pointer;
            border: 1px solid #ccc;
            background: #f0f0f0;
        }
        .lang-btn.active {
            background: #007bff;
            color: white;
            border-color: #007bff;
        }
    </style>
</head>
<body>
    <div id="lang-switcher">
        <span class="lang-btn active" data-lang="zh">中文</span>
        <span class="lang-btn" data-lang="en">English</span>
    </div>
    <h1 class="i18n" data-key="welcome"></h1>
    <p class="i18n" data-key="description"></p>
    <p class="i18n" data-key="instruction"></p>
    <!-- 引入 jQuery 库 -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <!-- 引入我们的脚本 -->
    <script src="script-json.js"></script>
</body>
</html>

JavaScript 代码 (script-json.js)

这个脚本会先加载默认语言文件,然后根据用户的选择动态加载并应用另一种语言。

$(document).ready(function() {
    let currentLang = 'zh'; // 默认语言
    let translations = {};  // 用于存储当前加载的翻译内容
    // 初始化函数:加载指定语言的翻译文件
    function init(lang) {
        // 显示加载提示(可选)
        // $('.i18n').text('Loading...');
        // 使用 jQuery 的 getJSON 方法加载 JSON 文件
        $.getJSON(`lang/${lang}.json`, function(data) {
            translations = data; // 将加载的数据存入全局变量
            updateLanguage(lang); // 更新页面上的文本
        }).fail(function() {
            console.error("Failed to load language file: lang/" + lang + ".json");
        });
    }
    // 更新页面文本的函数
    function updateLanguage(lang) {
        // 遍历所有带有 i18n 类的元素
        $('.i18n').each(function() {
            const key = $(this).data('key');
            // 如果当前翻译对象中存在该键,则更新文本
            if (translations[key]) {
                $(this).text(translations[key]);
            }
        });
    }
    // 语言切换按钮点击事件
    $('.lang-btn').on('click', function() {
        const lang = $(this).data('lang');
        // 如果点击的是当前语言,则不做任何操作
        if (lang === currentLang) {
            return;
        }
        // 更新按钮的激活状态
        $('.lang-btn').removeClass('active');
        $(this).addClass('active');
        // 加载新语言并更新
        currentLang = lang;
        init(lang);
    });
    // 页面加载时,初始化默认语言
    init(currentLang);
});

优点:

  • 关注点分离:HTML 结构、JavaScript 逻辑和文本内容完全分离。
  • 易于维护:添加新语言或修改翻译内容,只需编辑对应的 JSON 文件。
  • 性能友好:可以预先加载所有语言文件,实现瞬时切换(稍作扩展即可)。
  • 专业标准:这是国际化(i18n)项目的常见做法。

缺点:

  • 相对方案一,文件结构稍复杂。

如何选择?

  • 小型项目、个人博客、快速原型:使用 方案一 足够,开发速度快。
  • 商业项目、多语言支持、需要长期维护:强烈推荐 方案二,它更规范、更易于扩展。

额外优化(方案二的扩展)

添加 HTML lang 属性的切换

这对 SEO 和屏幕阅读器很重要,在 updateLanguage 函数中添加:

// 在 updateLanguage 函数中,更新页面语言属性
function updateLanguage(lang) {
    // ... 原有的更新文本代码 ...
    // 更新 <html> 标签的 lang 属性
    $('html').attr('lang', lang);
}

预加载所有语言文件

为了实现无刷新的瞬时切换,可以在页面加载时就将所有语言文件都下载下来。

$(document).ready(function() {
    let currentLang = 'zh';
    let translations = {};
    const allLangs = ['zh', 'en']; // 定义所有支持的语言
    // 预加载所有语言文件
    const loadPromises = allLangs.map(lang => {
        return $.getJSON(`lang/${lang}.json`).then(data => {
            translations[lang] = data; // 按语言名存储
        });
    });
    // 当所有文件都加载完成后,执行初始化
    Promise.all(loadPromises).then(() => {
        // 设置默认语言
        $('.lang-btn[data-lang="zh"]').click();
    }).catch(error => {
        console.error("Failed to load one or more language files.", error);
    });
    // ... 其余的点击事件处理函数保持不变 ...
    // 点击事件中只需调用 updateLanguage,无需再 init
    $('.lang-btn').on('click', function() {
        const lang = $(this).data('lang');
        if (lang === currentLang) return;
        $('.lang-btn').removeClass('active');
        $(this).addClass('active');
        currentLang = lang;
        updateLanguage(lang); // 直接调用更新函数
    });
    function updateLanguage(lang) {
        $('.i18n').each(function() {
            const key = $(this).data('key');
            if (translations[lang] && translations[lang][key]) {
                $(this).text(translations[lang][key]);
            }
        });
        $('html').attr('lang', lang);
    }
});

这个优化版本更适合对用户体验要求高的项目。