【sgGoogleTranslate】自定义组件:基于Vue.js用谷歌Google Translate翻译插件实现网站多国语言开发

简介: 【sgGoogleTranslate】自定义组件:基于Vue.js用谷歌Google Translate翻译插件实现网站多国语言开发


sgGoogleTranslate源码

<template>
  <div :id="$options.name"> </div>
</template>
<script>
export default {
  name: "sgGoogleTranslate",
  props: ["languages", "currentLanguage"],
  data() {
    return {
      //语言列表,遵循 ISO 639-1 标准,俩位的code(参考:https://zh.wikipedia.org/wiki/ISO_639-1)
      defaultLanguages: [
        { code: "en", name: "English", cname: "英语", ename: "English", },
        { code: "af", name: "Afrikaans", cname: "南非语", ename: "Afrikaans", },
        { code: "sq", name: "Gjuha shqipe", cname: "阿尔巴尼亚语", ename: "Albanian", },
        { code: "ar", name: "العربية", cname: "阿拉伯语", ename: "Arabic", },
        { code: "hy", name: "Հայերեն", cname: "亚美尼亚语", ename: "Armenian", },
        { code: "az", name: "Азәрбајҹан дили", cname: "阿塞拜疆语", ename: "Azerbaijani", },
        { code: "eu", name: "Euskara", cname: "巴斯克语", ename: "Basque", },
        { code: "be", name: "беларуская мова", cname: "白俄罗斯语", ename: "Belarusian", },
        { code: "bg", name: "български език", cname: "保加利亚语", ename: "Bulgarian", },
        { code: "ca", name: "Català", cname: "加泰罗尼亚语", ename: "Catalan", },
        { code: "zh-CN", name: "Chinese (Simplified)", cname: "中文 (简体)", ename: "Chinese (Simplified)", },
        { code: "zh-TW", name: "Chinese (Traditional)", cname: "中文 (繁体)", ename: "Chinese (Traditional)", },
        { code: "hr", name: "Српскохрватски језик", cname: "克罗地亚语", ename: "Croatian", },
        { code: "cs", name: "čeština", cname: "捷克语", ename: "Czech", },
        { code: "da", name: "Danmark", cname: "丹麦语", ename: "Danish", },
        { code: "nl", name: "Nederlands", cname: "荷兰语", ename: "Dutch", },
        { code: "et", name: "eesti keel", cname: "爱沙尼亚语", ename: "Estonian", },
        { code: "tl", name: "Filipino", cname: "菲律宾语", ename: "Filipino", },
        { code: "fi", name: "Finnish", cname: "芬兰语", ename: "Finnish", },
        { code: "fr", name: "Français", cname: "法语", ename: "French", },
        { code: "de", name: "Deutsch", cname: "德语", ename: "German", },
        { code: "el", name: "Ελληνικά", cname: "希腊语", ename: "Greek", },
        { code: "hu", name: "magyar", cname: "匈牙利语", ename: "Hungarian", },
        { code: "id", name: "Indonesia", cname: "印度尼西亚语", ename: "Indonesian", },
        { code: "ga", name: "Irish", cname: "爱尔兰语", ename: "Irish", },
        { code: "it", name: "Italiano", cname: "意大利语", ename: "Italian", },
        { code: "ja", name: "にほんご", cname: "日语", ename: "Japanese", },
        { code: "ko", name: "한국어", cname: "韩语", ename: "Korean", },
        { code: "lt", name: "lietuvių kalba", cname: "立陶宛语", ename: "Lithuanian", },
        { code: "ms", name: "Malay", cname: "马来西亚语", ename: "Malay", },
        { code: "no", name: "norsk", cname: "挪威语", ename: "Norwegian", },
        { code: "pl", name: "Polski", cname: "波兰语", ename: "Polish", },
        { code: "pt", name: "Português", cname: "葡萄牙语", ename: "Portuguese", },
        { code: "ro", name: "limba română", cname: "罗马尼亚语", ename: "Romanian", },
        { code: "ru", name: "Русский", cname: "俄语", ename: "Russian", },
        { code: "es", name: "Español", cname: "西班牙语", ename: "Spanish", },
        { code: "sv", name: "Swedish", cname: "瑞典语", ename: "Swedish", },
        { code: "th", name: "ภาษาไทย", cname: "泰语", ename: "Thai", },
        { code: "tr", name: "Turkish", cname: "土耳其语", ename: "Turkish", },
        { code: "uk", name: "українська мова", cname: "乌克兰语", ename: "Ukrainian", },
      ],
    };
  },
  mounted() {
    //google翻译插件初始化
    window[this.$options.name] = () => {
      new window.google.translate.TranslateElement(
        {
          pageLanguage: this.currentLanguage || "auto",//默认页面源语言code:zh-CN 简体中文
          includedLanguages: (this.languages || this.defaultLanguages).map(v => v.code).join(','),
          autoDisplay: true,
          layout: google.translate.TranslateElement.InlineLayout.horizontal
        },
        this.$options.name
      );
    };
    this.loadJS(`https://translate.google.com/translate_a/element.js?cb=${this.$options.name}`);//如果该网址无法在国内访问,将无法使用google翻译插件
  },
  methods: {
    loadJS(url, callback) {
      let script = document.createElement("script");
      script.type = "text/javascript";
      script.src = url;
      script.onload = script.onreadystatechange = function () {
        if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
          callback && callback();
          script.onload = script.onreadystatechange = null;
        }
      };
      document.querySelector("html").appendChild(script);
    },
  },
};
</script>
<style lang="scss" >
body {
  top: revert !important;
}
.skiptranslate iframe {
  display: none;
}
.goog-te-gadget {
  height: 50px;
  overflow: hidden;
  pointer-events: none;
  .goog-te-combo {
    pointer-events: auto;
    box-sizing: border-box;
    padding: 10px;
    background-color: white;
    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
    border-radius: 4px;
    margin-bottom: 10px !important; //把“由Google强力驱动”几个字隐藏掉
  }
}
</style>

用例

<template>
  <div>
    <sgGoogleTranslate />
    <br><br>
    <p> 我一路向北,离开有你的季节,你说你好累,已无法再爱上谁。风在山路吹,过往的画面全都是不对,细数惭愧,我伤你几回。 </p>
    <br>
    <p> 我想我是太过依赖,在挂电话的刚才,坚持学单纯的小孩,静静看守这份爱,知道不能太依赖,怕你会把我宠坏,你的香味一直徘徊,我舍不得离开。 </p>
    <br>
    <p> 缓缓飘落的枫叶像思念,为何挽回要赶在冬天来之前,爱你穿越时间,两行来自秋末的眼泪,让爱渗透了地面我要的只是你在我身边。 </p>
  </div>
</template>
<script>
import sgGoogleTranslate from "./sgGoogleTranslate";
export default { components: { sgGoogleTranslate, }, }; 
</script>

最原始的多国语言方法

image.png


相关文章
|
3月前
|
前端开发 JavaScript 开发者
JavaScript:无处不在的Web语言
JavaScript:无处不在的Web语言
|
9月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
524 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
6月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
504 17
|
6月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
306 0
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
597 161
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
886 159
|
10月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
401 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
287 64
|
9月前
|
人工智能 编解码 自然语言处理
Gemma3:Google开源多模态神器,轻量高效,精通140+语言,解锁文本与图像任务
在当今快速发展的 AI 领域,多模态模型正逐渐成为推动技术革新的重要力量。Google 最新推出的 Gemma 3 模型,凭借其轻量级、多模态的特性,为文本生成和图像理解任务带来了全新的可能性。它不仅支持文本和图像输入,还具备强大的语言处理能力,覆盖超过 140 种语言,并且能够在资源有限的设备上高效运行。从问答到摘要,从推理到图像分析,Gemma 3 正在重新定义 AI 模型的边界,为开发者和研究人员提供了一个极具潜力的工具。
852 0
|
11月前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
916 1

热门文章

最新文章

推荐镜像

更多