UNPKG

@google-translate-select/react

Version:

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

1 lines 20.7 kB
{"version":3,"file":"index2.cjs","sources":["../../src/google-translate-select.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react'\nimport cs from 'classnames'\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_SELECT_LANGUAGES,\n GOOGLE_TRANSLATE_STOP_TRANSLATE_CLASSNAME,\n} from '@google-translate-select/constants'\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 '@google-translate-select/theme-chalk/src/index.scss'\nimport type { UseMutationObserverReturn } from '@google-translate-select/utils'\nimport type { IGoogleTranslateProps } from './types/props'\n\nconst ns = createNamespace('select')\n\nexport default function GoogleTranslateSelect(props: IGoogleTranslateProps) {\n const {\n languages = GOOGLE_TRANSLATE_SELECT_LANGUAGES,\n defaultLanguageCode = 'en',\n defaultPageLanguageCode = 'en',\n fetchBrowserLanguage = true,\n animateTimeout = 150,\n dropdownClassName = '',\n dropdownStyles = {},\n showArrow = true,\n trigger = 'hover',\n className = '',\n select,\n } = props\n\n const [visible, setVisible] = useState<boolean>(false)\n const [selectedLanguageCode, changeSelectedLanguageCode] =\n useState<string>('')\n const [jsonCallbackFnName, setJsonCallbackFnName] = useState<string>('')\n const [\n googleTranslateOriginSelectObserve,\n setGoogleTranslateOriginSelectObserve,\n ] = useState<Partial<UseMutationObserverReturn> | null>({})\n const [htmlAttrLangObserve, setHtmlAttrLangObserve] =\n useState<Partial<UseMutationObserverReturn> | null>({})\n const [flag, setFlag] = useState<boolean>(true)\n const [timeoutId, setTimeoutId] = useState<number>(-1)\n\n /**\n * get current select language\n */\n const getSelectedLanguageOption = (code: string) => {\n const selectedLanguageObject = languages.find(\n (language) => language.code === code\n )\n const defaultSelectedLanguageObject = languages.find(\n (language) => language.code === defaultLanguageCode\n )\n\n return selectedLanguageObject\n ? selectedLanguageObject\n : defaultSelectedLanguageObject\n }\n\n const selectedLanguageOption = useMemo(\n () => getSelectedLanguageOption(selectedLanguageCode),\n [selectedLanguageCode]\n )\n\n useEffect(() => {\n createGoogleTranslate()\n createHtmlAttrLangObserve()\n }, [])\n\n useEffect(() => {\n createScript()\n }, [jsonCallbackFnName])\n\n useEffect(() => {\n if (htmlAttrLangObserve?.start) {\n htmlAttrLangObserve.start()\n }\n return () => {\n if (htmlAttrLangObserve?.stop) {\n htmlAttrLangObserve.stop()\n }\n }\n }, [htmlAttrLangObserve])\n\n useEffect(() => {\n if (googleTranslateOriginSelectObserve?.start) {\n googleTranslateOriginSelectObserve.start()\n }\n return () => {\n if (googleTranslateOriginSelectObserve?.stop) {\n googleTranslateOriginSelectObserve.stop()\n }\n }\n }, [googleTranslateOriginSelectObserve])\n\n useEffect(() => {\n if (googleTranslateOriginSelectObserve?.stop) {\n googleTranslateOriginSelectObserve!.stop!()\n }\n }, [flag])\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 const createHtmlAttrLangObserve = () => {\n const observer = 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(selectedLanguageCode)\n }\n }\n })\n removeIcon()\n },\n {\n attributes: true,\n attributeOldValue: true,\n }\n )\n setHtmlAttrLangObserve(observer)\n }\n\n /**\n * GoogleTranslate init\n */\n const createGoogleTranslate = () => {\n createStyle()\n createJsonCallback()\n }\n\n /**\n * pass jsonp callback to GoogleTranslate\n */\n const createScript = () => {\n if (!jsonCallbackFnName) {\n return null\n }\n\n return createScriptTag(\n `${GOOGLE_TRANSLATE_JSSDK_URL}?cb=${jsonCallbackFnName}`\n )\n }\n\n /**\n * create jsonp callback for GoogleTranslate, when GoogleTranslate loaded callback will be triggered\n */\n const createJsonCallback = () => {\n const { jsonpCallbackName } = createGoogleTranslateJsonpCallback(\n {\n pageLanguage: defaultPageLanguageCode,\n },\n setSelectedLanguageCode\n )\n setJsonCallbackFnName(jsonpCallbackName)\n }\n\n /**\n * Use browser language、cookie 'googtrans' to get language code\n */\n const setSelectedLanguageCode = () => {\n const googleCookieLanguage = getGoogleCookieLanguage()\n const browserLanguage = fetchBrowserLanguage\n ? isLanguageCodeInLanguages(getBrowserLanguage())\n : ''\n const isGoogleCookieLanguageExist = !!googleCookieLanguage\n const isFetchBrowserLanguageOpen = fetchBrowserLanguage\n const defaultSelectedCode = defaultLanguageCode || 'en'\n\n const handleLanguageInLanguages = (code: string) => {\n const isLanguageInLanguages = !!languages.find(\n (language) => language.code === code\n )\n return isLanguageInLanguages ? code : defaultSelectedCode\n }\n let selectedCode = defaultSelectedCode\n if (!isGoogleCookieLanguageExist && isFetchBrowserLanguageOpen) {\n selectedCode = handleLanguageInLanguages(browserLanguage)\n } else {\n selectedCode = handleLanguageInLanguages(googleCookieLanguage)\n }\n\n handleTranslate(selectedCode)\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 * 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 = languages.find((language) => language.code === code)\n return result ? code : 'en'\n }\n\n /**\n * After triggering GoogleTranslate Translate, a cookie called 'googtrans' is generated, such as '/en/tr'\n */\n const 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 /**\n * dynamic insert style for GoogleTranslate\n */\n const createStyle = () => {\n return createStyleTag(\n `body { top: 0 !important; } .skiptranslate { display: none !important; }`\n )\n }\n\n const handleDropdownShow = () => {\n if (trigger === 'hover') {\n clearTimeout(timeoutId)\n setTimeoutId(\n window.setTimeout(() => {\n setVisible(true)\n }, animateTimeout)\n )\n }\n }\n\n const handleDropdownHide = () => {\n if (trigger === 'hover') {\n clearTimeout(timeoutId)\n setTimeoutId(\n window.setTimeout(() => {\n setVisible(false)\n }, animateTimeout)\n )\n }\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 const createGoogleTranslateOriginSelectObserve = (code: string) => {\n const observe = 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 (code === (record.addedNodes[0] as HTMLOptionElement).value) {\n triggerTranslate(\n (record.addedNodes[0] as HTMLOptionElement).value\n )\n }\n }\n })\n },\n {\n childList: true,\n subtree: true,\n }\n )\n setGoogleTranslateOriginSelectObserve(observe)\n }\n\n const 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 createGoogleTranslateOriginSelectObserve(selectValue)\n } else {\n googleTranslateOriginalSelectEl.value = selectValue\n GoogleTranslateFireEvent(googleTranslateOriginalSelectEl, 'change')\n setFlag(!flag)\n }\n }\n\n const handleTranslate = (code: string) => {\n triggerTranslate(code)\n changeSelectedLanguageCode(code)\n select && select(getSelectedLanguageOption(code))\n }\n\n const handleDropdownByClick = () => {\n if (trigger === 'click') {\n setVisible((value) => !value)\n }\n }\n\n if (!languages || !languages.length) {\n return null\n }\n\n return (\n <>\n <div\n className={cs([\n ns.b(),\n GOOGLE_TRANSLATE_STOP_TRANSLATE_CLASSNAME,\n className,\n ])}\n >\n <div className={ns.b('dropdown')}>\n <div\n className={ns.be('dropdown', 'activator')}\n onMouseEnter={handleDropdownShow}\n onMouseLeave={handleDropdownHide}\n onClick={handleDropdownByClick}\n >\n <div className={ns.b('language')}>\n <div className={ns.b('flag')}>\n <div className={ns.be('flag', selectedLanguageOption?.code)} />\n </div>\n {selectedLanguageOption?.name}\n </div>\n {showArrow && (\n <div\n className={cs([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 )}\n </div>\n <div\n className={cs([ns.be('dropdown', 'menu'), dropdownClassName])}\n style={{ display: visible ? '' : 'none', ...dropdownStyles }}\n onMouseEnter={handleDropdownShow}\n onMouseLeave={handleDropdownHide}\n onClick={handleDropdownByClick}\n >\n <ul>\n {languages.map((language) => {\n return (\n <li\n key={`language-${language.code}`}\n className={cs([\n ns.be('dropdown', 'menu__item'),\n selectedLanguageCode === language.code ? 'selected' : '',\n ])}\n data-language-code={language.code}\n onClick={() => {\n handleTranslate(language.code)\n }}\n >\n <div className={ns.b('language')}>\n <div className={ns.b('flag')}>\n <div className={ns.be('flag', language.code)}></div>\n </div>\n {language.name}\n </div>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n </div>\n <div id={GOOGLE_TRANSLATE_ORIGINAL_DOM_ID} />\n </>\n )\n}\n"],"names":["ns","createNamespace","GoogleTranslateSelect","props","languages","GOOGLE_TRANSLATE_SELECT_LANGUAGES","defaultLanguageCode","defaultPageLanguageCode","fetchBrowserLanguage","animateTimeout","dropdownClassName","dropdownStyles","showArrow","trigger","className","select","visible","setVisible","useState","selectedLanguageCode","changeSelectedLanguageCode","jsonCallbackFnName","setJsonCallbackFnName","googleTranslateOriginSelectObserve","setGoogleTranslateOriginSelectObserve","htmlAttrLangObserve","setHtmlAttrLangObserve","flag","setFlag","timeoutId","setTimeoutId","getSelectedLanguageOption","code","selectedLanguageObject","language","defaultSelectedLanguageObject","selectedLanguageOption","useMemo","useEffect","createGoogleTranslate","createHtmlAttrLangObserve","createScript","observer","useMutationObserver","records","record","currentValue","oldValue","handleTranslate","removeIcon","createStyle","createJsonCallback","createScriptTag","GOOGLE_TRANSLATE_JSSDK_URL","jsonpCallbackName","createGoogleTranslateJsonpCallback","setSelectedLanguageCode","googleCookieLanguage","getGoogleCookieLanguage","browserLanguage","isLanguageCodeInLanguages","getBrowserLanguage","isGoogleCookieLanguageExist","isFetchBrowserLanguageOpen","defaultSelectedCode","handleLanguageInLanguages","selectedCode","l","googleTranslateCookie","getCookie","GOOGLE_TRANSLATE_COOKIE_NAME","googleTranslateCookieResult","createStyleTag","handleDropdownShow","handleDropdownHide","createGoogleTranslateOriginSelectObserve","observe","GOOGLE_TRANSLATE_ORIGINAL_SELECT_CLASSNAME","triggerTranslate","selectValue","isString","googleTranslateOriginalSelectEl","googleTranslateSelectEl","GoogleTranslateFireEvent","handleDropdownByClick","value","jsxs","Fragment","jsx","cs","GOOGLE_TRANSLATE_STOP_TRANSLATE_CLASSNAME","GOOGLE_TRANSLATE_ORIGINAL_DOM_ID"],"mappings":"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"}