UNPKG

@google-translate-select/vue2

Version:

🚀 The package offer vue2 library for @google-translate-select!

1 lines 20.3 kB
{"version":3,"file":"index4.cjs","sources":["../../src/google-translate-select.vue"],"sourcesContent":["<template>\n <div\n v-if=\"hasLanguages\"\n ref=\"googleTranslateSelectEl\"\n :class=\"getClass\"\n @mouseenter=\"handleDropdownShowByHover\"\n @mouseleave=\"handleDropdownHideByHover\"\n >\n <div :class=\"[ns.b('dropdown')]\">\n <div :class=\"[ns.be('dropdown', 'activator')]\">\n <div :class=\"[ns.b('language')]\">\n <div :class=\"[ns.b('flag')]\">\n <div :class=\"[ns.be('flag', selectedLanguageOption.code)]\" />\n </div>\n {{ selectedLanguageOption.name }}\n </div>\n <div\n v-if=\"showArrow\"\n :class=\"[ns.b('icon'), visible ? ns.is('reverse') : '']\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\n <path\n fill=\"currentColor\"\n d=\"M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.592 30.592 0 0 0-42.752 0z\"\n />\n </svg>\n </div>\n </div>\n <transition name=\"google-translate-select-zoom-in-top\">\n <div\n v-show=\"visible\"\n :class=\"[ns.be('dropdown', 'menu'), dropdownClassName]\"\n :style=\"dropdownStyle\"\n >\n <ul>\n <li\n v-for=\"language in languages\"\n :key=\"`language-${language.code}`\"\n :class=\"[\n ns.be('dropdown', 'menu__item'),\n hoveredLanguageCode === language.code ? 'hover' : '',\n selectedLanguageCode === language.code ? 'selected' : '',\n ]\"\n :data-language-code=\"language.code\"\n @click=\"() => handleTranslate(language.code)\"\n @mouseenter.stop=\"() => (hoveredLanguageCode = language.code)\"\n @mouseleave.stop=\"() => (hoveredLanguageCode = '')\"\n >\n <div :class=\"[ns.b('language')]\">\n <div :class=\"[ns.b('flag')]\">\n <div :class=\"[ns.be('flag', language.code)]\" />\n </div>\n {{ language.name }}\n </div>\n </li>\n </ul>\n </div>\n </transition>\n </div>\n <div :id=\"GOOGLE_TRANSLATE_ORIGINAL_DOM_ID\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport Vue from 'vue'\nimport {\n GoogleTranslateFireEvent,\n createGoogleTranslateJsonpCallback,\n createNamespace,\n createScriptTag,\n createStyleTag,\n getCookie,\n isString,\n removeIcon,\n useMutationObserver,\n} from '@google-translate-select/utils'\nimport {\n GOOGLE_TRANSLATE_COOKIE_NAME,\n GOOGLE_TRANSLATE_JSSDK_URL,\n GOOGLE_TRANSLATE_ORIGINAL_DOM_ID,\n GOOGLE_TRANSLATE_ORIGINAL_SELECT_CLASSNAME,\n GOOGLE_TRANSLATE_STOP_TRANSLATE_CLASSNAME,\n} from '@google-translate-select/constants'\nimport '@google-translate-select/theme-chalk/src/index.scss'\nimport { googleTranslateProps } from './types'\nimport type { UseMutationObserverReturn } from '@google-translate-select/utils'\nimport type { Language as ILanguage } from '@google-translate-select/constants'\n\ninterface Data {\n googleTranslateSelectEl: HTMLElement | null\n visible: boolean\n selectedLanguageCode: string\n hoveredLanguageCode: string\n setTimeoutId: number\n jsonCallbackFnName: string\n googleTranslateOriginSelectObserve: Partial<UseMutationObserverReturn> | null\n htmlAttrLangObserve: Partial<UseMutationObserverReturn> | null\n ns: typeof ns\n GOOGLE_TRANSLATE_ORIGINAL_DOM_ID: string\n}\n\nconst ns = createNamespace('select')\n\nexport default Vue.extend<\n Data,\n Record<string, any>,\n Record<string, any>,\n Record<string, any>\n>({\n name: ns.n,\n inheritAttrs: false,\n props: googleTranslateProps,\n data() {\n return {\n googleTranslateSelectEl: null,\n visible: false,\n selectedLanguageCode: '',\n hoveredLanguageCode: '',\n setTimeoutId: -1,\n jsonCallbackFnName: '',\n scriptTag: null,\n googleTranslateOriginSelectObserve: {},\n htmlAttrLangObserve: {},\n ns,\n GOOGLE_TRANSLATE_ORIGINAL_DOM_ID,\n }\n },\n computed: {\n getClass() {\n return [\n ns.b(),\n GOOGLE_TRANSLATE_STOP_TRANSLATE_CLASSNAME,\n this.$attrs.class,\n ]\n },\n hasLanguages() {\n return this.languages && this.languages.length\n },\n selectedLanguageOption() {\n return this.getSelectedLanguageOption()\n },\n },\n mounted() {\n this.googleTranslateSelectEl = this.$refs[\n 'googleTranslateSelectEl'\n ] as HTMLElement\n this.createGoogleTranslate()\n this.createHtmlAttrLangObserve()\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this\n if (this.trigger === 'click')\n document.addEventListener('click', _this.handleDropdownShowOrHideByClick)\n },\n // @ts-ignore\n beforeUnmount() {\n if (this.googleTranslateOriginSelectObserve?.stop) {\n this.googleTranslateOriginSelectObserve!.stop!()\n }\n\n if (this.htmlAttrLangObserve?.stop) {\n this.htmlAttrLangObserve!.stop!()\n }\n\n if (this.scriptTag?.unload) {\n this.scriptTag.unload()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this\n if (this.trigger === 'click')\n document.removeEventListener(\n 'click',\n _this.handleDropdownShowOrHideByClick\n )\n },\n methods: {\n /**\n * get current select language\n */\n getSelectedLanguageOption() {\n const selectedLanguageOption = this.languages.find(\n (language: ILanguage) => language.code === this.selectedLanguageCode\n )\n if (selectedLanguageOption) {\n return selectedLanguageOption\n } else {\n const defaultSelectedLanguageOption = this.languages.find(\n (language: ILanguage) => language.code === this.defaultLanguageCode\n )\n return defaultSelectedLanguageOption\n }\n },\n /**\n * dynamic insert style for GoogleTranslate\n */\n createStyle() {\n return createStyleTag(\n `body { top: 0 !important; } .skiptranslate { display: none !important; }`\n )\n },\n /**\n * create jsonp callback for GoogleTranslate, when GoogleTranslate loaded callback will be triggered\n */\n createJsonCallback() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this\n const pageLanguage = this.defaultPageLanguageCode\n const { jsonpCallbackName } = createGoogleTranslateJsonpCallback(\n {\n pageLanguage,\n },\n _this.setSelectedLanguageCode\n )\n _this.jsonCallbackFnName = jsonpCallbackName\n },\n /**\n * pass jsonp callback to GoogleTranslate\n */\n createScript() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this\n return createScriptTag(\n `${GOOGLE_TRANSLATE_JSSDK_URL}?cb=${_this.jsonCallbackFnName}`\n )\n },\n /**\n * GoogleTranslate init\n */\n createGoogleTranslate() {\n this.createStyle()\n this.createJsonCallback()\n this.scriptTag = this.createScript()\n },\n /**\n * Triggers translations by observe changes in the DOM of GoogleTranslate's original select.\n *\n * Because the callback function passed in JSONP can only be called after the GOOGLE_TRANSLATE_JSSDK_URL resource is loaded,\n * and the GOOGLE_TRANSLATE_JSSDK_URL will import the resource that generated the original DOM, observe is used here🤓\n */\n createGoogleTranslateOriginSelectObserve() {\n this.googleTranslateOriginSelectObserve = useMutationObserver(\n document.querySelector(GOOGLE_TRANSLATE_ORIGINAL_SELECT_CLASSNAME)!,\n (records) => {\n records.forEach((record) => {\n if (\n record.addedNodes[0] &&\n (record.addedNodes[0] as HTMLOptionElement).value\n ) {\n if (\n this.selectedLanguageCode ===\n (record.addedNodes[0] as HTMLOptionElement).value\n ) {\n this.triggerTranslate(\n (record.addedNodes[0] as HTMLOptionElement).value\n )\n }\n }\n })\n removeIcon()\n },\n {\n childList: true,\n subtree: true,\n }\n )\n this.googleTranslateOriginSelectObserve!.start!()\n },\n /**\n * When GoogleTranslate's original executes, the attribute 'lang' of HTML will have an auto state,\n * in order to overwrite the auto state, we call the 'handleTranslate' again\n */\n createHtmlAttrLangObserve() {\n this.htmlAttrLangObserve = useMutationObserver(\n document.querySelector('html')!,\n (records) => {\n records.forEach((record) => {\n if (record.attributeName === 'lang') {\n const currentValue = (record.target as HTMLElement).getAttribute(\n 'lang'\n )\n const oldValue = record.oldValue\n // 修复auto的中间状态,如果页面当中内容较多,gt会有一个翻译的过程,就会抛出lang = auto,此时我们手动再触发一次翻译覆盖掉上次未进行完的翻译操作\n if (\n oldValue !== currentValue &&\n oldValue &&\n oldValue !== 'auto' &&\n currentValue === 'auto'\n ) {\n this.handleTranslate(this.selectedLanguageCode)\n }\n }\n })\n },\n {\n attributes: true,\n attributeOldValue: true,\n }\n )\n\n this.htmlAttrLangObserve!.start!()\n },\n /**\n * Simulates the change event of select to manually trigger GoogleTranslate\n *\n * @param select\n */\n triggerTranslate(select: HTMLSelectElement | string) {\n if (!select) {\n return\n }\n const selectValue = isString(select) ? select : select.value ?? ''\n const googleTranslateOriginalSelectEl = document.querySelector(\n GOOGLE_TRANSLATE_ORIGINAL_SELECT_CLASSNAME\n ) as HTMLSelectElement | null\n const googleTranslateSelectEl = document.querySelector(`.${ns.b()}`)\n\n if (\n !googleTranslateSelectEl ||\n !googleTranslateOriginalSelectEl ||\n googleTranslateSelectEl.innerHTML.length === 0 ||\n googleTranslateOriginalSelectEl.options.length === 0\n ) {\n this.createGoogleTranslateOriginSelectObserve()\n } else {\n googleTranslateOriginalSelectEl.value = selectValue\n GoogleTranslateFireEvent(googleTranslateOriginalSelectEl, 'change')\n this.googleTranslateOriginSelectObserve &&\n this.googleTranslateOriginSelectObserve!.stop!()\n }\n },\n /**\n * Determines whether the current select language exists in the props.languages\n *\n * @param code\n */\n isLanguageCodeInLanguages(code: string) {\n // 如果 code 不存在于语言列表中默认使用英语\n const result = this.languages.find(\n (language: ILanguage) => language.code === code\n )\n return result ? code : 'en'\n },\n /**\n * Get browser language\n */\n getBrowserLanguage() {\n const browserLanguage =\n window.navigator.language || document.documentElement.lang || 'en'\n const filterLanguages = ['zh-CN', 'zh-TW']\n if (filterLanguages.every((l) => l !== browserLanguage)) {\n if (browserLanguage.indexOf('-') > -1) {\n return browserLanguage.split('-')[0]\n }\n }\n return browserLanguage\n },\n /**\n * After triggering GoogleTranslate Translate, a cookie called 'googtrans' is generated, such as '/en/tr'\n */\n getGoogleCookieLanguage() {\n const googleTranslateCookie = getCookie(GOOGLE_TRANSLATE_COOKIE_NAME)\n if (googleTranslateCookie) {\n const googleTranslateCookieResult = googleTranslateCookie.split('/')\n return googleTranslateCookieResult[2]\n ? googleTranslateCookieResult[2]\n : 'en'\n } else {\n return ''\n }\n },\n /**\n * Use browser language、cookie 'googtrans' to get language code\n */\n setSelectedLanguageCode() {\n const isFetchBrowserLanguageOpen = this.fetchBrowserLanguage\n const browserLanguage = isFetchBrowserLanguageOpen\n ? this.isLanguageCodeInLanguages(this.getBrowserLanguage())\n : ''\n const googleCookieLanguage = this.getGoogleCookieLanguage()\n const isGoogleCookieLanguageExist = !!googleCookieLanguage\n const handleDefaultLanguage = () => {\n if (this.defaultLanguageCode) {\n return this.defaultLanguageCode\n } else {\n return 'en'\n }\n }\n const handleBrowserLanguageInLanguages = () => {\n const isBrowserLanguageInLanguages = !!this.languages.find(\n (language: ILanguage) => language.code === browserLanguage\n )\n if (isBrowserLanguageInLanguages) {\n return browserLanguage\n } else {\n return handleDefaultLanguage()\n }\n }\n const handleGoogleCookieLanguageInLanguages = () => {\n const isGoogleCookieLanguageInLanguages = !!this.languages.find(\n (language: ILanguage) => language.code === googleCookieLanguage\n )\n if (isGoogleCookieLanguageInLanguages) {\n return googleCookieLanguage\n } else {\n return handleDefaultLanguage()\n }\n }\n let selectedCode = handleDefaultLanguage()\n if (!isGoogleCookieLanguageExist) {\n // 首次\n if (isFetchBrowserLanguageOpen)\n selectedCode = handleBrowserLanguageInLanguages()\n } else {\n // 非首次\n // 越过浏览器语言判断直接去列表中匹配\n selectedCode = handleGoogleCookieLanguageInLanguages()\n }\n this.handleTranslate(selectedCode)\n },\n handleTranslate(code: string) {\n this.triggerTranslate(code)\n this.selectedLanguageCode = code\n this.$emit('select', this.getSelectedLanguageOption())\n },\n clearSettimeout() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this\n window.clearTimeout(_this.setTimeoutId)\n this.setTimeoutId = -1\n },\n handleDropdownShowByHover(e: Event) {\n if (this.trigger === 'hover') {\n this.clearSettimeout()\n this.setTimeoutId = window.setTimeout(() => {\n const target = e.target as HTMLElement\n if (\n this.googleTranslateSelectEl &&\n this.googleTranslateSelectEl.contains(target)\n ) {\n this.visible = true\n }\n }, 0)\n }\n },\n handleDropdownHideByHover() {\n if (this.trigger === 'hover') {\n this.clearSettimeout()\n this.setTimeoutId = window.setTimeout(() => {\n this.visible = false\n }, this.animateTimeout)\n }\n },\n handleDropdownShowOrHideByClick(e: Event) {\n const target = e.target as HTMLElement\n if (\n this.googleTranslateSelectEl &&\n this.googleTranslateSelectEl.contains(target)\n ) {\n this.visible = true\n } else {\n this.visible = false\n }\n },\n },\n})\n</script>\n"],"names":["ns","createNamespace","__vue2_script","Vue","googleTranslateProps","GOOGLE_TRANSLATE_ORIGINAL_DOM_ID","GOOGLE_TRANSLATE_STOP_TRANSLATE_CLASSNAME","_this","_a","_b","_c","selectedLanguageOption","language","createStyleTag","pageLanguage","jsonpCallbackName","createGoogleTranslateJsonpCallback","createScriptTag","GOOGLE_TRANSLATE_JSSDK_URL","useMutationObserver","GOOGLE_TRANSLATE_ORIGINAL_SELECT_CLASSNAME","records","record","removeIcon","currentValue","oldValue","select","selectValue","isString","googleTranslateOriginalSelectEl","googleTranslateSelectEl","GoogleTranslateFireEvent","code","browserLanguage","l","googleTranslateCookie","getCookie","GOOGLE_TRANSLATE_COOKIE_NAME","googleTranslateCookieResult","isFetchBrowserLanguageOpen","googleCookieLanguage","isGoogleCookieLanguageExist","handleDefaultLanguage","handleBrowserLanguageInLanguages","handleGoogleCookieLanguageInLanguages","selectedCode","target"],"mappings":"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"}