利用Google翻译实现网站国际化——js插件

2023-11-12

文章描述了很多作者的思路,显得繁琐和冗余,若无兴趣请直接下载资源,查阅最终解决方案

==========================最终解决方案==========================

代码静态化已经全部完成(包括面板语言文件),已添加完备的注释,请直接查阅;

下载插件js谷歌翻译插件,示例请使用“本地静态资源.html”需要修改第62行资源请求路径才能正常使用,“原始版本.html”的资源路径可能被墙了或被谷歌移除了不能正常使用

代码给出了一个自定义按钮的示例,和原始方式,所有代码均有完整的注释,请放心查阅和修改

代码预览

先说背景

  • 网站已经使用常见的方式实现中英国际化,即每种语言写一套对应的语言文件,但后期要求实现多国语言国际化,如果还按照之前的方式,工作量大。
  • 且不便于维护,某个词改了统统都要改。

//推荐一个github项目:GitHub - hujingshuang/MTrans: Multi-source Translation

因此有没有一种简单易用的及时翻译插件,类似于谷歌浏览器自带的翻译工具那种,一点即可全文翻译。

最后在网上找到了一些,要么没有文档介绍,要么就需要npm安装,nodejs支持啥的,但是我对前端并不精通,就继续找,最后找到了谷歌插件(官方已经不再维护更新:https://translate.google.com/manager/website/),简单易用。

使用方法,在页面加入以下代码即可

//更新一下2019-04-10
一个简单的demo,现已整合部分静态资源,加快访问速度,请在文章底部下载

<html>
<body>
我爱你
<!--把button放在右下角,这个是可以随意修改的,你可以改成一个链接一个图片之类的-->
<div id="google_translate_element" style="position:absolute;bottom:10px;right:10px;z-index:2000;opacity:0.7"></div>
<script>
function googleTranslateElementInit() {
 
	new google.translate.TranslateElement(
		{
                //这个参数不起作用,看文章底部更新,翻译面板的语言
                //pageLanguage: 'zh-CN',
            //这个是你需要翻译的语言,比如你只需要翻译成越南和英语,这里就只写en,vi
			includedLanguages: 'en,zh-CN,hr,cs,da,nl,fr,de,el,iw,hu,ga,it,ja,ko,pt,ro,ru,sr,es,th,vi',
            //选择语言的样式,这个是面板,还有下拉框的样式,具体的记不到了,找不到api~~
			layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
            //自动显示翻译横幅,就是翻译后顶部出现的那个,有点丑,这个属性没有用的话,请看文章底部的其他方法
			autoDisplay: true, 
			//还有些其他参数,由于原插件不再维护,找不到详细api了,将就了,实在不行直接上dom操作
		}, 
		'google_translate_element'//触发按钮的id
	);
 
}
</script>
<script src="https://translate.google.cn/translate_a/element.js?cb=googleTranslateElementInit"></script>
</body>

</html>

没错,这样就行了,来看看页面效果:

demo效果:

真实项目效果:

效果非常好。

==========================追更20180914==========================

今天又遇见一个问题,记录下,是关于清除cookie的。

由于原生google翻译插件样式不太友好,所以自己用代码追加覆盖原来的样式,

改成一个工具栏,并且去除原来顶部的操作框(参数autoDisplay:false即可,如无效请看文章底部的其他处理方法),

 去除这个顶部操作框

改成这种

工具栏html,只是个例子
<div id="toolbox" class="toolbox" @click="hideFeedback()">
    <ul @click.stop>
        <li id="google_translate_element">
        </li>
        <li class="qr-code">
            <img src="${staticPath}/static/images/app.svg"/>
            <p>APP</p>
        </li>
        <div class="qr-code-wrap">
            <img src="${staticPath}/static/images/QR-Code.jpg"/>
        </div>
        <li @click.capture="toFeedback()">
            <img src="${staticPath}/static/images/feedback.svg"/>
            <p>Feedback</p>
        </li>
        <li @click.capture="scrollTop()">
            <img src="${staticPath}/static/images/scrolltop.svg"/>
            <p>Top</p>
        </li>
    </ul>
    <div id="feedback" v-show="feedbackShow">
        <div class="shade-bg"></div>
        <div class="signin-wrap">
            <div class="signin-container">
                <div class="signin-content" @click.stop>
                    <div class="signin-header">Feedback</div>
                    <div class="signin-body">
                        <form class="signin-form">
                            <label>` + i18n['feedbackContent'] + `</label>
                            <textarea name="feedbackContent"  v-model="feedbackContent" placeholder="please input feedback content..."></textarea>
                            <div class="submit" @click="feedbackSubmit">` + i18n['button.feedbackSubmit'] + `</div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
var googleTranslate;
            googleTranslate = new google.translate.TranslateElement(
                {
                    layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
                    autoDisplay:false
                },
                'google_translate_element'
            );

但是去了顶部操作框后,必须加一个清除翻译的按钮,经测试发现,谷歌翻译插件的翻译生命周期存于cookie中,

所以这里我加了一个清除按钮,访问页面时先getCookie("googtrans"),如果有值就添加一个按钮

<template v-if="googtrans && googtrans!=''"><div class="lang-change" @click="cleartrans"><span>ClearG</span></div></template>

点击按钮就清除cookie并且刷新

...
cleartrans: function(){
    delCookie("googtrans");
    window.location.reload();
}
...
//这里一定要注意,cookie三要素:时间,路径,域名,
//删除cookie直接把时间设为过去的时间即可

function getCookie(name) {
		var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
		if (arr = document.cookie.match(reg))
			return unescape(arr[2]);
		else
			return null;
	}

    function delCookie(name) {
        var Days = 30;
        var exp = new Date();
        exp.setTime(exp.getTime() - Days * 24 * 60 * 60 * 30);

        //这里一定要注意,如果直接访问ip的话,不用注明域名domain
        //但访问的是域名例如www.baidu.com时,翻译插件的cookie同时存在于一级和二级域名中
        //即删除翻译cookie时要把domain=www.baidu.com和domain=.baidu.com两个cookie一起删除才行
        var domain = document.domain;
        var domainIsIp = false;
        var dd = domain.split(".");
        if(dd.length==4){
        	domainIsIp=true;
        }
        document.cookie = name + "='';path=/;expires="+ exp.toUTCString();
        if(domainIsIp==false){
        	domain="."+dd[1]+"."+dd[2];
        	document.cookie = name + "='';domain="+domain+";expires="+exp.toGMTString()+";path=/";
        }
	}

大功告成~

==========================2019-01-26追更==========================

有网友比较关心样式和初始化语言的问题,因为虽然功能不错但是原样式太丑了,这里统一回复一下怎么改样式,首先注意几点:

1、原版插件不再维护更新,之前给过一份静态资源但评价不太好,且源码混淆严重,阅读困难,修改不易,请自行下载修改静态资源

2、关于初始化语言,因为pageLanguage: 'zh-CN'这个参数就是用来指定当前页面的初始语言,一开始就是英文页面那当然是en

3、有网友表示autoDisplay:false无法去除顶部横幅,这里给出其他方法,通过控制台分析html,然后使用自己的style覆盖掉原来的样式即可

<style>
body{
	top:0px!important; 
    min-height: 0px!important;
}
.goog-te-banner-frame{
	display:none
}
</style>

4、语言翻译生命周期是存在cookie中的,清除修改翻译语言什么的,可以直接修改cookie,但是记得操作cookie后要刷新页面才会生效

==========================2019-08-15统一回复样式问题==========================

根据评论,原样式有如图三个问题

 解决方式如下(因缺失API官方文档,都是无奈之下的强制操作,源码大部分逻辑操作在element_main.js中):

<style>
/*解决问题3*/
body{
	top:0px!important; 
    min-height: 0px!important;
}
/*解决问题2*/
.goog-text-highlight{
	background-color: transparent!important;
	-webkit-box-shadow: 0 0px 0px rgba(0, 0, 0, 0)!important;
	-moz-box-shadow: 0 0px 0px rgba(0, 0, 0, 0)!important;
	box-shadow: 0 0px 0px rgba(0, 0, 0, 0)!important;
}
/*解决问题1*/
.goog-te-banner-frame{
	display:none
}
</style>

===============2019-10-23继续更新一个问题翻译面板的语言,感谢csdn网友ITmanba的提示和帮助=================

问题描述

其实这个是由这两个资源决定的

=====================静态化资源下载=======================

请到文章顶部链接下载

按照压缩包内的html示例调用即可,

这里只将部分耗时较长的js和容易请求失败的文件放在了本地,其他的png,gif还是通过网络访问的

翻译后控制台还是会一些报错,请求访问失败,不影响正常使忽略即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用Google翻译实现网站国际化——js插件 的相关文章

随机推荐

  • 管窥广电总局的TVOS,又一个Android定制版?

    原文地址 http news cecb2b com info 20140711 2515776 shtml 2014年149号通知 国家新闻出版广电总局关于大力开展智能电视操作系统TVOS1 0规模应用试验 加快推动广播电视终端标准化智能化
  • 解决flex布局弹性布局使用justify-content:space-between后最后一行多个元素排版问题

    解决flex布局弹性布局使用justify content space between后最后一行多个元素排版问题 1 当一行有三个元素的时候直接加个伪类 原图 想要实现的效果 html代码 div class floor centerLis
  • SQL 查询优化之 WHERE 和 LIMIT 使用索引的奥秘

    奇怪的慢sql 我们先来看2条sql 第一条 select from acct trans log WHERE acct id 1000000000009000757 order by create time desc limit 0 10
  • 为什么Java源文件中的public类 必须与文件名相同

    每个编译单元 文件 只能有一个public类 这么做的意思是 每个编译单元只能有一个公开的接口 而这个接口就由其public类来表示 而非public修饰的类都是为了给public修饰的类所做支撑的 从软件架构设计和安全性设计上得出的结论
  • 最新Mysql8.0.27安装配置基本使用

    目录 下载MySQL 配置目录文件 初始化Mysql 安装Mysql 配置环境 基本使用 下载MySQL 官方下载地址 https dev mysql com downloads 下载后解压 路径自定义 并新建文件夹data 配置目录文件
  • Vulkan教程翻译之十 创建 Descriptor Set

    原文链接 https vulkan lunarg com doc sdk 1 2 131 2 windows tutorial html 09 init descriptor set html 创建 Descriptor Set 这一章节的
  • haproxy搭建web集群

    目录 HAProxy HAProxy的主要特性 HAProxy负载均衡调度策略 HAProxy的配置文件解读 HAProxy部署 1 安装环境 2 下载haproxy安装包 并安装 3 新建haproxy用户 并在 etc 下创建hapro
  • linux 目录创建与删除 centos7

    root wyflinux tmp cd tmp 进入 tmp 目录 选择在tmp联系目录创建 root wyflinux tmp mkdir p test1 test2 test3 test4 mkdir p 直接创建多级目录 递回 ro
  • 【数据库系统概论】第四、五章:数据库安全性、完整性

    视频 参考资料 内容来自参考链接和视频 文章目录 第四章 数据库安全性 安全性概述 安全性控制 试图机制 审计 数据加密 第五章 数据库完整性 正确性 相容性 三大完整性 第四章 数据库安全性 安全性概述 不安全因素 非授权用户对数据库的恶
  • 用Unity3D实现太阳系仿真

    用Unity3D模拟太阳系仿真 模拟要求 写一个程序 实现一个完整的太阳系 其他星球围绕太阳的转速必须不一样 且不在一个法平面上 操作步骤 1 创建如下结构 sun 里包括8大行星 并且设置好距离和大小 建立结构 建议用2D显示来直观设置距
  • 收藏

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文转自 视觉算法 图片来源于网络 语义分割在自然数据集的分割效果不断进步 有研究逐步应用到了遥感领域 尤其是高分辨率遥感影像 由于遥感图像具有海量数据 尺度依赖 空间相
  • 《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.17集群(多主多从)》

    一 架构图 如下图所示 二 环境信息 1 部署规划 主机名 K8S版本 系统版本 内核版本 IP地址 备注 k8s master 63 1 24 17 Ubuntu 20 04 5 LTS 5 15 0 69 generic 192 168
  • 两个数的简单计算器

    两个数的简单计算器 本题要求编写一个简单计算器程序 可根据输入的运算符 对2个整数进行加 减 乘 除或求余运算 题目保证输入和输出均不超过整型范围 方法一 include
  • 13.网络爬虫—多进程详讲(实战演示)

    网络爬虫 多进程详讲 一 进程的概念 二 创建多进程 三 进程池 四 线程池 五 多进程和多线程的区别 六 实战演示 北京新发地线程池实战 前言 个人简介 以山河作礼 Python领域新星创作者 CSDN实力新星认证 第一篇文章 1 认识网
  • iso文件添加服务器,服务器挂载本地iso文件

    RHEL6 3配置文件共享 2 autofs服务 在上篇博文中我们介绍了利用NFS服务设置文件共享 在客户端必须要先将服务器端的NFS共享目录挂载到本地 然后才能使用 其实在Linux系统中还为我们提供了另外一种更为简单的使用NFS共享的方
  • Java对象深拷贝的几种方式

    对象拷贝 项目开发过程中很多时候需要进行对象复制 可是有的时候会发生复制后的对象 在原对象改变后也相应发生改变 这种时候就有问题了 所以很有必要了解对象的深拷贝 以及深拷贝的几种方式 new 对象 手动 new 新的对象 一个属性一个属性的
  • 掌财社:Flask怎么实现注册登录项目?

    注册和登录功能是绝大多数web应用都需要实现的功能 是相当基础的功能模块 注册登录功能实现需要注意的地方也有很多 今天小编带来了一篇flask实现注册登录功能的项目的简单实现的文章 希望能给正在学习flask的小伙伴一点帮助 本文主要介绍了
  • 调试共享几何图形池

    没有这一节的资料 但是代码该调试到这里了 随意调试着玩吧 环境变量本机都没有设置 看这个意思 似乎是只需要一个几何体 所有的瓦片用类似于matrixTransform gt addChild node 的方式 看看创建 上一层 为什么是第0
  • 买卖股票的最佳时机含手续费--贪心算法

    LeetCode 买卖股票的最佳时机含手续费 给定一个整数数组 prices 其中第 i 个元素代表了第 i 天的股票价格 非负整数 fee 代表了交易股票的手续费用 你可以无限次地完成交易 但是你每笔交易都需要付手续费 如果你已经购买了一
  • 利用Google翻译实现网站国际化——js插件

    文章描述了很多作者的思路 显得繁琐和冗余 若无兴趣请直接下载资源 查阅最终解决方案 最终解决方案 代码静态化已经全部完成 包括面板语言文件 已添加完备的注释 请直接查阅 下载插件js谷歌翻译插件 示例请使用 本地静态资源 html 需要修改