vue3-translate-select
Version:
🚀 The package offer vue3 library for @google-translate-select!
1 lines • 23.4 kB
Source Map (JSON)
{"version":3,"file":"index5.cjs","sources":["../../src/google-translate-select.vue?vue&type=script&lang.ts"],"sourcesContent":["\nimport {\n computed,\n defineComponent,\n defineExpose,\n onBeforeUnmount,\n onMounted,\n ref,\n unref,\n watch,\n} 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 {\n CreateScriptTagReturn,\n UseMutationObserverReturn,\n} from '@google-translate-select/utils'\n\nconst ns = createNamespace('select')\n\nexport default defineComponent({\n name: ns.n,\n inheritAttrs: false,\n props: googleTranslateProps,\n emits: ['select'],\n setup(props, { emit, attrs }) {\n const googleTranslateSelectEl = ref<HTMLElement | null>(null)\n const visible = ref<boolean>(false)\n const selectedLanguageCode = ref<string>('')\n const hoveredLanguageCode = ref<string>('')\n const setTimeoutId = ref<number>(-1)\n const jsonCallbackFnName = ref<string>('')\n const scriptTag = ref<CreateScriptTagReturn | null>(null)\n const googleTranslateOriginSelectObserve =\n ref<Partial<UseMutationObserverReturn> | null>({})\n const htmlAttrLangObserve = ref<Partial<UseMutationObserverReturn> | null>(\n {}\n )\n const isAnimating = ref<boolean>(false)\n\n const getClass = computed(() => {\n return [ns.b(), GOOGLE_TRANSLATE_STOP_TRANSLATE_CLASSNAME, attrs.class]\n })\n\n const hasLanguages = computed(\n () => props.languages && props.languages.length\n )\n\n /** cache current select language */\n const selectedLanguageOption = computed(() => getSelectedLanguageOption())\n\n /** cache next language for carousel mode */\n const nextLanguageOption = computed(() => getNextLanguageOption())\n\n /**\n * get current select language\n */\n function getSelectedLanguageOption() {\n const selectedLanguageOption = props.languages.find(\n (language) => language.code === unref(selectedLanguageCode)\n )\n if (selectedLanguageOption) {\n return selectedLanguageOption\n } else {\n const defaultSelectedLanguageOption = props.languages.find(\n (language) => language.code === props.defaultLanguageCode\n )\n return defaultSelectedLanguageOption!\n }\n }\n\n /**\n * get next language for carousel mode\n */\n function getNextLanguageOption() {\n if (!props.languages.length) return props.languages[0]\n\n const currentIndex = props.languages.findIndex(\n (language) => language.code === unref(selectedLanguageCode)\n )\n\n // If current language not found, return first language\n if (currentIndex === -1) {\n return props.languages[0]\n }\n\n // If it's the last language, return first; otherwise return next\n const nextIndex =\n currentIndex === props.languages.length - 1 ? 0 : currentIndex + 1\n\n return props.languages[nextIndex]\n }\n\n /**\n * dynamic insert style for GoogleTranslate\n */\n function createStyle() {\n return createStyleTag(\n `body { top: 0 !important; } .skiptranslate { display: none !important; }`\n )\n }\n\n /**\n * create jsonp callback for GoogleTranslate, when GoogleTranslate loaded callback will be triggered\n */\n function createJsonCallback() {\n const pageLanguage = props.defaultPageLanguageCode\n const { jsonpCallbackName } = createGoogleTranslateJsonpCallback(\n {\n pageLanguage,\n },\n setSelectedLanguageCode\n )\n jsonCallbackFnName.value = jsonpCallbackName\n }\n\n /**\n * pass jsonp callback to GoogleTranslate\n */\n function createScript() {\n return createScriptTag(\n props.googleScriptUrl.length\n ? `${props.googleScriptUrl}?cb=${unref(jsonCallbackFnName)}`\n : `${GOOGLE_TRANSLATE_JSSDK_URL}?cb=${unref(jsonCallbackFnName)}`\n )\n }\n\n /**\n * GoogleTranslate init\n */\n function createGoogleTranslate() {\n createStyle()\n createJsonCallback()\n scriptTag.value = createScript()\n }\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 function createGoogleTranslateOriginSelectObserve() {\n googleTranslateOriginSelectObserve.value = 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 selectedLanguageCode.value ===\n (record.addedNodes[0] as HTMLOptionElement).value\n ) {\n triggerTranslate(\n (record.addedNodes[0] as HTMLOptionElement).value\n )\n }\n }\n })\n },\n {\n childList: true,\n subtree: true,\n }\n )\n\n unref(googleTranslateOriginSelectObserve)!.start!()\n }\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 function createHtmlAttrLangObserve() {\n htmlAttrLangObserve.value = 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 handleTranslate(unref(selectedLanguageCode))\n }\n }\n })\n removeIcon()\n },\n {\n attributes: true,\n attributeOldValue: true,\n }\n )\n\n unref(htmlAttrLangObserve)!.start!()\n }\n\n /**\n * Simulates the change event of select to manually trigger GoogleTranslate\n *\n * @param select\n */\n function 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 selectValue == props.defaultLanguageCode &&\n selectedLanguageCode.value &&\n selectValue != selectedLanguageCode.value\n ) {\n // const reloadEvent = new Event('reload')\n\n // window.dispatchEvent(reloadEvent)\n console.log('reload')\n props.reload()\n }\n\n if (\n !googleTranslateSelectEl ||\n !googleTranslateOriginalSelectEl ||\n googleTranslateSelectEl.innerHTML.length === 0 ||\n googleTranslateOriginalSelectEl.options.length === 0\n ) {\n createGoogleTranslateOriginSelectObserve()\n } else {\n googleTranslateOriginalSelectEl.value = selectValue\n GoogleTranslateFireEvent(googleTranslateOriginalSelectEl, 'change')\n unref(googleTranslateOriginSelectObserve) &&\n unref(googleTranslateOriginSelectObserve)!.stop!()\n }\n }\n\n /**\n * Determines whether the current select language exists in the props.languages\n *\n * @param code\n */\n function isLanguageCodeInLanguages(code: string) {\n // 如果 code 不存在于语言列表中默认使用英语\n const result = props.languages.find((language) => language.code === code)\n return result ? code : 'en'\n }\n\n /**\n * Get browser language\n */\n function getBrowserLanguage() {\n const browserLanguage =\n window.navigator.language || document.documentElement.lang || 'en'\n\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 /**\n * After triggering GoogleTranslate Translate, a cookie called 'googtrans' is generated, such as '/en/tr'\n */\n function getGoogleCookieLanguage() {\n const googleTranslateCookie = getCookie(GOOGLE_TRANSLATE_COOKIE_NAME)\n\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 /**\n * Use browser language、cookie 'googtrans' to get language code\n */\n function setSelectedLanguageCode() {\n const isFetchBrowserLanguageOpen = props.fetchBrowserLanguage\n const browserLanguage = isFetchBrowserLanguageOpen\n ? isLanguageCodeInLanguages(getBrowserLanguage())\n : ''\n const googleCookieLanguage = getGoogleCookieLanguage()\n const isGoogleCookieLanguageExist = !!googleCookieLanguage\n\n const handleDefaultLanguage = () => {\n if (props.defaultLanguageCode) {\n return props.defaultLanguageCode\n } else {\n return 'en'\n }\n }\n\n const handleBrowserLanguageInLanguages = () => {\n const isBrowserLanguageInLanguages = !!props.languages.find(\n (language) => language.code === browserLanguage\n )\n if (isBrowserLanguageInLanguages) {\n return browserLanguage\n } else {\n return handleDefaultLanguage()\n }\n }\n\n const handleGoogleCookieLanguageInLanguages = () => {\n const isGoogleCookieLanguageInLanguages = !!props.languages.find(\n (language) => language.code === googleCookieLanguage\n )\n if (isGoogleCookieLanguageInLanguages) {\n return googleCookieLanguage\n } else {\n return handleDefaultLanguage()\n }\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\n handleTranslate(selectedCode)\n }\n\n function handleTranslate(code: string) {\n triggerTranslate(code)\n selectedLanguageCode.value = code\n\n emit('select', getSelectedLanguageOption())\n }\n\n function clearSettimeout() {\n clearTimeout(unref(setTimeoutId))\n setTimeoutId.value = -1\n }\n\n function handleDropdownShowByHover(e: Event) {\n if (props.trigger === 'hover') {\n clearSettimeout()\n setTimeoutId.value = window.setTimeout(() => {\n const target = e.target as HTMLElement\n if (\n unref(googleTranslateSelectEl) &&\n unref(googleTranslateSelectEl)?.contains(target)\n ) {\n visible.value = true\n }\n }, 0)\n }\n }\n\n function handleDropdownHideByHover() {\n if (props.trigger === 'hover') {\n clearSettimeout()\n setTimeoutId.value = window.setTimeout(() => {\n visible.value = false\n }, props.animateTimeout)\n }\n }\n\n function handleDropdownShowOrHideByClick(e: Event) {\n const target = e.target as HTMLElement\n if (\n unref(googleTranslateSelectEl) &&\n unref(googleTranslateSelectEl)?.contains(target)\n ) {\n visible.value = true\n } else {\n visible.value = false\n }\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (props.type === 'carousel') {\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n handleNextLanguage()\n }\n }\n }\n\n function handleNextLanguage() {\n if (!props.languages.length || isAnimating.value) return\n\n const currentIndex = props.languages.findIndex(\n (language) => language.code === selectedLanguageCode.value\n )\n\n // If current language not found, start from first language\n if (currentIndex === -1) {\n handleTranslate(props.languages[0].code)\n return\n }\n\n // If it's the last language, go to first; otherwise go to next\n const nextIndex =\n currentIndex === props.languages.length - 1 ? 0 : currentIndex + 1\n\n // Set animation state\n isAnimating.value = true\n\n // Handle translate with animation delay\n setTimeout(() => {\n handleTranslate(props.languages[nextIndex].code)\n setTimeout(() => {\n isAnimating.value = false\n }, 300) // Animation duration\n }, 50)\n }\n\n onMounted(() => {\n createGoogleTranslate()\n createHtmlAttrLangObserve()\n\n if (props.trigger === 'click')\n document.addEventListener('click', handleDropdownShowOrHideByClick)\n\n if (props.type === 'carousel')\n document.addEventListener('keydown', handleKeyDown)\n })\n\n onBeforeUnmount(() => {\n if (unref(googleTranslateOriginSelectObserve)?.stop) {\n unref(googleTranslateOriginSelectObserve)!.stop!()\n }\n\n if (unref(htmlAttrLangObserve)?.stop) {\n unref(htmlAttrLangObserve)!.stop!()\n }\n\n if (unref(scriptTag)?.unload) {\n unref(scriptTag)!.unload!()\n }\n if (props.trigger === 'click')\n document.removeEventListener('click', handleDropdownShowOrHideByClick)\n\n if (props.type === 'carousel')\n document.removeEventListener('keydown', handleKeyDown)\n })\n\n defineExpose({\n handleTranslate,\n })\n\n watch(\n () => props.isCarouselListenerDisabled,\n (newVal) => {\n if (newVal) {\n document.removeEventListener('keydown', handleKeyDown)\n } else {\n document.addEventListener('keydown', handleKeyDown)\n }\n }\n )\n\n return {\n ns,\n googleTranslateSelectEl,\n visible,\n selectedLanguageCode,\n hoveredLanguageCode,\n isAnimating,\n getClass,\n hasLanguages,\n selectedLanguageOption,\n nextLanguageOption,\n handleTranslate,\n handleDropdownShowByHover,\n handleDropdownHideByHover,\n handleKeyDown,\n handleNextLanguage,\n GOOGLE_TRANSLATE_ORIGINAL_DOM_ID,\n }\n },\n})\n"],"names":["ns","createNamespace","_sfc_main","defineComponent","googleTranslateProps","props","emit","attrs","googleTranslateSelectEl","ref","visible","selectedLanguageCode","hoveredLanguageCode","setTimeoutId","jsonCallbackFnName","scriptTag","googleTranslateOriginSelectObserve","htmlAttrLangObserve","isAnimating","getClass","computed","GOOGLE_TRANSLATE_STOP_TRANSLATE_CLASSNAME","hasLanguages","selectedLanguageOption","getSelectedLanguageOption","nextLanguageOption","getNextLanguageOption","language","unref","currentIndex","nextIndex","createStyle","createStyleTag","createJsonCallback","pageLanguage","jsonpCallbackName","createGoogleTranslateJsonpCallback","setSelectedLanguageCode","createScript","createScriptTag","GOOGLE_TRANSLATE_JSSDK_URL","createGoogleTranslate","createGoogleTranslateOriginSelectObserve","useMutationObserver","GOOGLE_TRANSLATE_ORIGINAL_SELECT_CLASSNAME","records","record","triggerTranslate","createHtmlAttrLangObserve","currentValue","oldValue","handleTranslate","removeIcon","select","selectValue","isString","googleTranslateOriginalSelectEl","GoogleTranslateFireEvent","isLanguageCodeInLanguages","code","getBrowserLanguage","browserLanguage","l","getGoogleCookieLanguage","googleTranslateCookie","getCookie","GOOGLE_TRANSLATE_COOKIE_NAME","googleTranslateCookieResult","isFetchBrowserLanguageOpen","googleCookieLanguage","isGoogleCookieLanguageExist","handleDefaultLanguage","handleBrowserLanguageInLanguages","handleGoogleCookieLanguageInLanguages","selectedCode","clearSettimeout","handleDropdownShowByHover","target","handleDropdownHideByHover","handleDropdownShowOrHideByClick","handleKeyDown","handleNextLanguage","onMounted","onBeforeUnmount","defineExpose","watch","newVal","GOOGLE_TRANSLATE_ORIGINAL_DOM_ID"],"mappings":"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"}