js - - - - - 如何给自己的网站添加中英文切换(多语言也可)

如何给自己的网站添加中英文切换

  • 1. 需求描述
  • 2. 解决方案
  • 3. 方案实施
    • 3.1 简单实现(第一版)
  • 3.2 样式微调(第二版)
  • 3.3 重载页面(第三版)
  • 3.4 自动翻译(第四版)
  • 3.5 限定适用范围(第五版)

1. 需求描述

因公司外籍人员的比例达到了一定的数量,现有的项目均为中文版 对其不太友好,所以需要紧急对现有项目进行简单翻译方便实用。

2. 解决方案

关于项目的翻译,经过沟通给出了以下几种方案:

  • 类似google右键 “翻译成english”
  • 使用vue-i18n结合elementUI

如果使用vue-i18n,对项目的改动比较大且较费时费力,所以优先选择简单的使用类’google’ 翻译’即可。

3. 方案实施

即然选择好了方向,开干!

经过一番翻找搜索,找如下插件

  1. Google Translate (谷歌翻译)
  2. microsoft translator(微软翻译)
  3. translate.js (免费、开源的翻译工具库)
  4. languages-js

经过一番尝试,最终选择使用Google Translate
但是需要注意的是,使用google translate进行网站翻译时,网络必须是可以访问谷歌的

示例以vue项目改造,记录如下⬇️

3.1 简单实现(第一版)

index.html文件添加如下代码

<script src="https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> 
<script type="text/javascript">
   function googleTranslateElementInit () {
     new google.translate.TranslateElement({
       pageLanguage: 'zh-CN', // 设置当前页面语言, ‘auto’即为默认跟随浏览器默认语言 (但是不知为何不生效果!!!!)
       includedLanguages: 'en,zh-CN', // 需要支持的翻译语种
     }, 'google_translate_element'); // 绑定的标签标识
   }
</script> 

app.vue文件添加如下代码

<template>
  <div id="app">
    <!-- 按钮 id需要和上述代码里 绑定的标签标识 一致 -->
    <div
      id="google_translate_element"
      style="
        position: absolute;
        top: 10px;
        right: 10px;
        z-index: 2000;
        opacity: 0.7;
      "
    ></div>
    ...
  </div>
</template>

如此,第一版的翻译即可实现
初始状态如下:⬇️
在这里插入图片描述

翻译后的效果如下:⬇️
在这里插入图片描述

可以看出,翻译基本实现了。
但是图里红色框框圈出的部分,看起来不太美观(其实就是看起来像是山寨版),故需去掉。

因此来了第二版

3.2 样式微调(第二版)

需要在第一版的代码上添加css样式(一定要设置为全局样式)

// 修复翻译栏带来的整体布局下移
body {
    top: revert !important
}


// 翻译栏隐藏
.skiptranslate iframe {
    display: none;
}

// 设置翻译按钮的样式
#google_translate_element {
    .goog-te-gadget {
        width: 102px !important;
        height: 25px !important;
        overflow: hidden;

        .goog-te-combo {
            width: 102px !important;
        }
    }
}

调整之后的效果如下⬇️:(可以发现 上图两个红框里的都进行了调整)在这里插入图片描述

但是发现一个问题:

如果从配置了翻译的项目通过window.location.href='***'跳转到别的项目页面,然后再后退回来时,翻译按钮消失不见了

调整后得到第三版

3.3 重载页面(第三版)

在第二版的代码上增加如下逻辑:
页面从hide=>visible变化时进行页面重载

app.vue

<script>
	export default {
	  mounted() {
	    document.addEventListener("visibilitychange", this.watchVisibility); // 监听页面hide or visible
	  },
	  methods: {
	    watchVisibility() {
	      if (document.visibilityState == "visible") {
	        setTimeout(() => {
	          location.reload();
	        }, 1 * 1000);
	      }
	    },
	  },
	};
</script>

等进入页面,还得自己点击才能翻译,交互不太友好。能不能进入页面之后,自动进行翻译呢?

于是有了第四版

3.4 自动翻译(第四版)

在第三版的基础上添加如下代码:

app.vue

<script>
	export default {
	  mounted() {
	    document.addEventListener("visibilitychange", this.watchVisibility); // 监听页面hide or visible

		// 等页面加载完成 js触发change事件
	    this.$nextTick(() => {
	      let documents = document.getElementsByClassName("goog-te-combo");
	      let select = documents[0];
	      let options = select.getElementsByTagName("option");
	      // select.getElementsByTagName("option")[0].selected = true;
	      if (!!select && options[1]) {
	        options[1].selected = true;
	        select.dispatchEvent(new Event("change"));
	      }
	    });
	  },
	};
</script>

这个功能目前只想提供给外籍员工进行使用,言外之意就是对已经习惯该项目的人 “无感”

于是有了第五版

3.5 限定适用范围(第五版)

适用范围最终定为“浏览器默认语言为english”的员工
在第四版的基础上调整如下:

  • index.html两个script脚本全部删除,使用如下一个即可
  • app.vue的延迟翻译删除

index.html

  <script type="text/javascript">

    let lang = navigator.language || navigator.userLanguage;//常规浏览器语言和IE浏览器
    lang = lang.substr(0, 2);

    if (lang == 'en') {
      //如果是English 则手动引入script脚本
      let script = document.createElement('script');
      script.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
      document.getElementsByTagName('head')[0].appendChild(script);


      // google翻译配置
      function googleTranslateElementInit () {
        new google.translate.TranslateElement({
          // pageLanguage: 'auto',
          pageLanguage: 'zh-CN',
          includedLanguages: 'en,zh-CN'
        }, 'google_translate_element');
      }

      setTimeout(() => {
        let documents = document.getElementsByClassName("goog-te-combo");
        let select = documents[0];
        let options = select.getElementsByTagName("option");
        if (!!select && options[1]) {
          options[1].selected = true;
          select.dispatchEvent(new Event("change"));
        }
      }, 0.5 * 1000);
    }
  </script>

如此第五版,即为需要的终版!

参考文献:
https://www.wangjun.dev/2023/10/add-google-translate-into-webpage/
https://juejin.cn/s/google%20translate%20element%20api
https://blog.csdn.net/qq_28855277/article/details/80226584
https://juejin.cn/post/7249624466150096954
https://blog.csdn.net/qq_26212731/article/details/78457198
https://blog.csdn.net/s55646nsn/article/details/131419252
https://blog.csdn.net/SSenW/article/details/122537752
https://www.cnblogs.com/yulingjia/p/10406191.html
https://blog.csdn.net/snowball_li/article/details/133254343
https://blog.csdn.net/weixin_41697143/article/details/129011570
https://blog.csdn.net/sunshineTing2/article/details/112839611
https://blog.csdn.net/weixin_46607967/article/details/134411980
https://blog.csdn.net/m0_73248604/article/details/132472919
https://www.cnblogs.com/mggahui/p/13689804.html
https://segmentfault.com/a/1190000041067692

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/347275.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序员如何保持身心健康

程序员要保持身心健康&#xff0c;可以注意以下几个方面&#xff1a; 饮食健康&#xff1a;保持均衡的饮食&#xff0c;多吃蔬菜水果&#xff0c;减少油腻和高热量食物的摄入。同时&#xff0c;适当饮水&#xff0c;避免因长时间坐着工作而导致的脱水。尽量不要吃街边摊、大排…

人工智能(AI)技术应用:解锁未来的无限可能

随着信息时代的来临&#xff0c;人工智能(AI)技术成为推动社会进步的重要力量。在医疗领域&#xff0c;人工智能技术已经开始发挥重要作用。通过大数据分析和机器学习&#xff0c;人工智能可以帮助医生更准确地诊断疾病、制定治疗方案&#xff0c;缩短治疗时间&#xff0c;提高…

JuiceSSH结合内网穿透实现移动端设备公网远程访问Linux虚拟机

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

js计算皮尔逊相关系数

代码如下; let XGX {correlationCoefficient(pA, pB) {let covXY -pA * pBlet varX pA * (1-pA) let varY (1-pB)* pBlet res covXY / (Math.sqrt(varX*varY, 2))return res},correlation(x,y){x[0.3,50.2,99.5,199.3,299,398];y[0.1,50,99.9,200,300,400];// 计算均值con…

字典树-Python

字典树 字典树又叫前缀树、单词查找树&#xff0c;树形结构&#xff0c;是哈希树的变种。能够统计、排序和保存大量的字符串&#xff0c;经常被搜索引擎系统用于文本词频统计。优点是利用字符串的公共前缀来减少查询时间&#xff0c;最大程度减少无谓字符串的比较&#xff0c;…

C语言通过IXMLHTTPRequest以get或post方式发送http请求获取服务器文本或xml数据

做过网页设计的人应该都知道ajax。 Ajax即Asynchronous Javascript And XML&#xff08;异步的JavaScript和XML&#xff09;。使用Ajax的最大优点&#xff0c;就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作&#xff0c;并避免了在网络上发…

【量化交易】股市舞者:小明的撮合交易之旅

马西森AES撮合交易系统 在繁华的都市中&#xff0c;小明&#xff0c;一个普通的青年&#xff0c;刚刚赚到了人生的第一桶金——20万。这笔意外的财富&#xff0c;点燃了他对股市的强烈兴趣。他开始如饥似渴地学习金融知识&#xff0c;钻研各种交易策略。 一天&#xff0c;小…

现货黄金做日内交易和波段交易有何差异?

在现货黄金投资中&#xff0c;日内交易和波段交易都是投资者常用的手段。但投资者其实搞不懂两者有何区别&#xff0c;有时甚至不清楚自己做的是日内交易还是波段交易&#xff0c;下面我们就来讨论一下这两种交易方法的异同。 两者的区别主要是在持仓的时间上。日内交易顾名思义…

Python算法题集_接雨水

本文为Python算法题集之一的代码示例 题目42&#xff1a;接雨水 说明&#xff1a;给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,…

【计算机网络】【练习题】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 该题目描述一个网络中传播时延&#xff08;Transmission Delay&#xff09;的例子。题目如下&#xff1a; 二、问题解答&#xff08;个人&#xff09; 笔者第3问采用均值不等式求解。标答中采用求导数的方法求极值。似乎均值…

el-table 动态渲染多级表头;一级表头根据数据动态生成,二级表头固定

一、表格需求&#xff1a; 实现一个动态表头&#xff0c;一级表头&#xff0c;根据数据动态生成&#xff0c;二级表头固定&#xff0c;每列的数据不一样&#xff0c;难点在于数据的处理。做这种表头需要两组数据&#xff0c;一组数据是实现表头的&#xff0c;另一组数据是内容…

WinSCP如何使用公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

文件名翻译工具,文件名称翻译软件

无论是工作、学习还是生活&#xff0c;我们时常会遇到文件名称难以理解的情况。这时&#xff0c;一款优秀的文件名称翻译软件就显得尤为重要。今天&#xff0c;我要为大家介绍一个备受好评软件——文件批量改名高手&#xff0c;这款软件自带翻译功能&#xff0c;可以帮你轻松实…

分布式锁实现(mysql,以及redis)以及分布式的概念(续)redsync包使用

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物 这张尽量结合上一章进行使用&#xff1a;上一章 这章主要是讲如何通过redis实现分布式锁的 redis实现 这里我用redis去实现&#xff1a; 技术&#xff1a;golang&#xff0c;redis&#xff0c;数据结构 …

2024 年 10 款顶级的数据恢复软件榜单

2024年&#xff0c;随着人工智能、云计算等技术的不断发展&#xff0c;数据已经成为我们生活中不可或缺的一部分。然而&#xff0c;数据丢失的风险仍然存在。删除文件、病毒攻击、硬件损坏和其他情况都可能导致数据丢失。而数据恢复软件就成为解决这一问题的有效方案。 2024 年…

springCloud的ribbon和feign

ribbon方式调用 就是将原来的具体地址&#xff0c;改为了通过服务名去调用。注册中心中有多个服务&#xff0c;相同服务名&#xff0c;就会算作可以调用的服务。 首先得有一个注册中心&#xff0c;然后各种服务注册进去&#xff0c;然后利用ribbon或者feign去调用。 ribbon是直…

微认证 openEuler社区开源贡献实践

文章目录 1. 开源与开源社区2. openEuler 社区概述3.参与openEuler社区贡献4.openEuler软件包开发Linux软件管理——源码编译 1. 开源与开源社区 Richard Matthew Stallman&#xff0c;1983年9月推出GNU项目&#xff0c;并发起自由软件运动(free software movement或free/open…

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料…

Dify学习笔记-应用发布(四)

1、发布为公开 Web 站点 使用 Dify 创建 AI 应用的一个好处在于&#xff0c;你可以在几分钟内就发布一个可供用户使用的 Web 应用&#xff0c;该应用将根据你的 Prompt 编排工作。 如果你使用的是自部署的开源版&#xff0c;该应用将运行在你的服务器上 如果你使用的是云服务&…

3.确认弹窗(ConfirmPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7 在开发中&#xff0c;最常用的弹窗之一表示确认弹窗&#xff0c;为了减少重复的开发工作&#xff0c;所以需要基于Popup进行封装。 1.布局 分为标题、确认内容、按钮三个区域&#xff0c;都是可供调整的。 &l…