js使用i18n实现页面国际化的方法

实现页面国际化(Internationalization,简称i18n)的方法在前端开发中非常常见,可以让我们的网站更易于被全球用户理解和使用。下面我将详细讲解如何使用JavaScript实现网站的i18n。

1. 建立语言包

首先,我们需要建立站点所需的多语言文字资源。针对不同语言,我们可以分别建立不同的语言包(language pack),其中保存着相应语言的翻译文字。通常,我们使用JSON格式进行保存,如下面的示例所示:

// lang/zh-CN.json
{
  "title": "网站标题",
  "hello": "您好!",
  "welcome": "欢迎访问我们的网站!"
}
// lang/en-US.json
{
  "title": "Website Title",
  "hello": "Hello!",
  "welcome": "Welcome to our website!"
}

上述代码中,我们分别建立了中文简体和英文语言包,分别保存着相应语言的翻译文字。

2. 根据用户语言设置加载语言包

接下来,我们需要根据用户的语言设置自动加载相应的语言包。可通过如下代码判断浏览器所用语言:

const userLang = navigator.language || navigator.userLanguage; // 获取用户语言
const langCode = userLang.startsWith("zh") ? "zh-CN" : "en-US"; // 判断用户语言是否为中文

以上代码利用navigator.languagenavigator.userLanguage获取浏览器所用语言(如"zh-CN"、"en-US"等),并根据语言代码确定加载的语言包。

接下来我们可以通过fetch方法异步请求语言包文件,并将其解析成对象。可以定义一个loadLangPack函数来实现:

function loadLangPack(langCode) {
  return fetch(`lang/${langCode}.json`)
    .then(res => res.json())
    .catch(err => {
      console.warn(`Failed to load language pack ${langCode}:`, err);
      return {}; // 如果加载失败返回一个空对象
    });
}

3. 构建翻译功能

在完成语言包的加载后,我们需要使用i18n函数对页面内容进行动态翻译。下面我们将i18n函数实现为一个在全局范围内可用的函数:

let langPack; // 全局语言包变量

async function i18n(key, ...args) {
  if (!langPack) { // 如果语言包未加载则进行加载
    langPack = await loadLangPack(langCode);
  }
  const text = langPack[key] || key; // 如果语言包中无对应的翻译则使用自身作为显示内容
  return text.replace(/\{(\d+)\}/g, (_, num) => args[num] || ""); // 替换文本中的占位符
}

在上述代码中,我们通过传递一个关键字key和需要替换的变量参数args来实现翻译功能。我们首先检查语言包是否已经加载,如果未加载则调用loadLangPack函数来进行加载。然后我们在语言包中查找关键字对应的翻译文本,如果没有找到则使用原来的文本内容。最后,我们将翻译后的文本中的占位符替换成对应的变量。

通过以上方式,我们可以实现网站的国际化(i18n)功能。

示例

下面我们通过两个示例来演示如何在网站中实现i18n功能。

示例1:翻译页面标题

在示例中,我们通过文档标题来演示如何使用i18n来实现标题的翻译。HTML页面代码如下所示:

<!DOCTYPE html>
<html>
  <head>
    <title data-i18n="title">Website Title</title>
    <script src="./i18n.js"></script>
  </head>
  <body>
    <h1 data-i18n="hello">Hello!</h1>
    <p data-i18n="welcome">Welcome to our website!</p>
    <button onclick="changeLang()">Change language</button>
    <script>
      async function changeLang() {
        langCode = langCode === "zh-CN" ? "en-US" : "zh-CN";
        langPack = await loadLangPack(langCode);
        document.querySelectorAll("[data-i18n]").forEach(el => {
          const key = el.getAttribute("data-i18n");
          i18n(key).then(text => (el.textContent = text));
        });
      }
      changeLang(); // 首次加载时进行语言切换
    </script>
  </body>
</html>

在上述代码中,我们使用data-i18n属性来对需要翻译的元素进行标记。在页面加载完成后,通过遍历页面上的所有标记数据,使用i18n方法进行翻译。

我们在i18n.js中实现我们的i18n逻辑:

let langPack;

async function loadLangPack(langCode) {
  return fetch(`lang/${langCode}.json`)
    .then(res => res.json())
    .catch(err => {
      console.warn(`Failed to load language pack ${langCode}:`, err);
      return {};
    });
}

async function i18n(key, ...args) {
  if (!langPack) {
    langPack = await loadLangPack(langCode);
  }
  const text = langPack[key] || key;
  return text.replace(/\{(\d+)\}/g, (_, num) => args[num] || "");
}

我们首先定义了一个全局变量langPack用于保存当前的语言包。在loadLangPack函数中通过fetchPromise异步加载语言包文件并返回JSON对象,i18n函数则是用于翻译文字的主要方法,其中key参数指定了需要翻译的关键字,args是需要替换的变量。

现在,我们可以打开这个HTML文件并查看效果了。

示例2:翻译表单项

在这个示例中,我们演示如何使用i18n来实现表单翻译功能,HTML代码如下所示:

<!DOCTYPE html>
<html>
  <head>
    <title>Example i18n</title>
    <script src="./i18n.js"></script>
  </head>
  <body>
    <form>
      <div>
        <label for="name" data-i18n="nameLabel">Name:</label>
        <input type="text" name="name" id="name" placeholder="Enter your name" />
      </div>
      <div>
        <label for="email" data-i18n="emailLabel">Email:</label>
        <input type="email" name="email" id="email" placeholder="Enter your email" />
      </div>
      <div>
        <button type="submit" data-i18n="submitBtn">Submit</button>
      </div>
    </form>
    <button onclick="changeLang()">Change language</button>
    <script>
      async function changeLang() {
        langCode = langCode === "zh-CN" ? "en-US" : "zh-CN";
        langPack = await loadLangPack(langCode);
        document.querySelectorAll("[data-i18n]").forEach(el => {
          const key = el.getAttribute("data-i18n");
          i18n(key).then(text => (el.textContent = text));
        });
        document.querySelectorAll("[placeholder]").forEach(el => {
          const key = el.getAttribute("placeholder");
          i18n(key).then(text => (el.placeholder = text));
        });
      }
      changeLang(); // 首次加载时进行语言切换
    </script>
  </body>
</html>

在上述代码中,我们通过data-i18n属性和querySelectorAll方法选择需要翻译的元素,并将其翻译成当前语言的文本。我们还使用placeholder属性来对表单项的占位符进行翻译。在语言切换时,我们遍历所有标记数据和占位符数据,并使用i18n方法进行翻译。

通过以上文档和示例,我们学会了如何使用i18n來進行页面国际化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js使用i18n实现页面国际化的方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Asp.Net中避免重复提交和弹出提示框的实例代码

    在ASP.NET中避免重复提交和弹出提示框是开发Web应用程序时很重要的一部分。下面是一个实例代码,用于防止重复提交表单,并弹出异常提示框。 避免表单重复提交 在ASP.NET中,为了防止表单重复提交,我们可以使用以下两种方式: 1. 禁用页面上提交按钮 在单击按钮时,将其设置为禁用状态。在以前无法恢复之前,可以使其显示Progress GIF图像,以便用户…

    JavaScript 2023年6月11日
    00
  • Javascript字符串拼接小技巧(推荐)

    我将为您提供一份详细的Javascript字符串拼接小技巧攻略,包含以下内容: 标准的字符串拼接方法 在JavaScript中,我们可以使用加号+来拼接字符串。例如: var str1 = "hello"; var str2 = "world"; var str3 = str1 + " " + st…

    JavaScript 2023年5月28日
    00
  • JavaScript常见JSON操作实例分析

    JavaScript常见JSON操作实例分析 本篇文章将介绍JavaScript中常用的JSON操作,包括JSON对象的创建、解析、修改等操作,并提供了多个实例来说明这些操作的使用场景。 JSON对象的创建 使用JavaScript中的JSON对象可以方便地创建和操作JSON格式的数据。要创建JSON对象,可以使用JSON.parse()函数解析一个包含JS…

    JavaScript 2023年6月10日
    00
  • 经典Javascript正则表达式[优质排版]

    经典Javascript正则表达式 [优质排版] 正则表达式是Javascript中常用的字符串处理工具,学习好正则表达式能够提高我们处理字符串的效率,本文将带你深入学习Javascript中的正则表达式,同时介绍一些优质的排版技巧。 正则表达式字面量 正则表达式字面量是创建正则表达式的一种简写方式,字面量由两个斜杆之间的文本组成,例如: const reg…

    JavaScript 2023年6月10日
    00
  • 详解JavaScript实现哈希表

    详解JavaScript实现哈希表 什么是哈希表 哈希表是一种常见的数据结构,它可以提供快速的插入、查找和删除操作,其时间复杂度为 O(1) 。 哈希表的主要思想是将数据元素经过哈希(hash)函数的映射后,存储到一个数组中。哈希函数 将插入的元素映射到一个数组下标上,这个下标对应的元素就是这个元素所对应的值。在查找时,再使用同样的哈希函数,得到元素所对应的…

    JavaScript 2023年5月18日
    00
  • javascript学习笔记(十) js对象 继承

    下面是“javascript学习笔记(十) js对象 继承”的攻略。 一、对象的基础知识 在JavaScript中,对象是一种键-值对的数据结构。而对象的键和值通常称作属性和方法。我们可以使用对象字面量定义一个简单的对象,如下所示: var person = { name: ‘Jack’, age: 20, sayHi: function() { conso…

    JavaScript 2023年5月27日
    00
  • 编程语言JavaScript简介

    编程语言JavaScript简介 JavaScript的概述 JavaScript是一种Web前端开发中经常用到的编程语言,也是一种具有广泛应用的脚本语言。它可以与HTML和CSS合作,用于构建交互式的网站和Web应用程序,也可以在后端服务器上运行。 JavaScript最初由网景公司(Netscape)的 Brendan Eich 开发,于1995年发布,…

    JavaScript 2023年5月18日
    00
  • Vue Router中Matcher的初始化流程

    Vue Router的Matcher是用来匹配路径与路由配置的。该匹配器会在Vue Router的实例化过程中被初始化。Matcher的初始化流程如下: 创建空的路由映射表 在Vue Router实例化时,会创建一个空的路由映射表,用于存储路径与路由配置之间的映射关系。该映射表是一个由路径作为键,路由配置作为值的对象。 示例: const routes = …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部