【发布时间】:2021-02-23 15:21:24
【问题描述】:
我正在尝试将谷歌翻译元素添加到我的 Gatsby 网站。本质上,我试图让以下代码在 Gatsby 中工作:
<div id="google_translate_element"></div>
<script type="text/javascript">
function googleTranslateElementInit() {
new google.translate.TranslateElement({pageLanguage: 'en'}, 'google_translate_element');
}
</script>
<script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
我对 Gatsby 比较陌生,想知道实现这一目标的正确(或至少是可行的)方法。
我尝试过的
- 在装载时调用 Javascript 代码
const Footer = () => {
useEffect(() => {
const script = document.createElement("script")
script.src = "//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"
script.async = true
document.body.appendChild(script)
googleTranslateElementInit(() => {
new google.translate.TranslateElement({pageLanguage: 'en'}, 'google_translate_element')
})
return () => {
document.body.removeChild(script)
}
}, [])
return <div id="google_translate_element"></div>
}
这不起作用,因为 googleTranslateElementInit 和 google 未定义。
- 将
<script移动到<Helmet>组件
<Helmet>
<script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
<script type="text/javascript">
{googleTranslateElementInit(() => {
new google.translate.TranslateElement({pageLanguage: 'en'}, 'google_translate_element')
})}
</script>
</Helmet>
产生与 (1) 相同的错误
- 将 Javascript 添加到
html.js的<body>标记的开头
<body {...props.bodyAttributes}>
<script
dangerouslySetInnerHTML={{
__html: `
function googleTranslateElementInit() {
new google.translate.TranslateElement({pageLanguage: 'en'}, 'google_translate_element');
}
`
}}
/>
<script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
这在我第一次加载网站时起作用。刷新后,按钮不见了。它仅在我启动开发服务器后第一次加载页面时出现。我还尝试制作具有相同结果的生产版本。
我已经被这个问题困扰了很长时间,如果有任何建议,我将不胜感激。
【问题讨论】:
标签: javascript gatsby google-translate