所以我用以下解决方案解决了这个问题。不确定它是否是最干净的,但它似乎正在工作。
索引.tsx
function getCookieValue(a: string) {
const b = document.cookie.match(`(^|;)\\s*${a}\\s*=\\s*([^;]+)`);
return b ? b.pop() : '';
}
if (getCookieValue('accepts-cookies') === 'true') {
initI18n(['cookie']);
} else {
initI18n([]);
}
ReactDOM.render(
<YOUR APP>
)
CookieBanner 组件
import { useCookies } from 'react-cookie';
import { initI18n, getLanguage } from '../../../i18n';
...
export const CookieBanner = () => {
...
const [cookies, setCookie] = useCookies();
const updateCookie = (name: string, value: boolean | string) => {
const expires = new Date();
expires.setFullYear(expires.getFullYear() + 1);
setCookie(name, value, { path: '/', expires });
};
const onAccept = () => {
updateCookie('accepts-cookies', true);
const lng = getLanguage();
updateCookie('i18next', lng);
};
return (
...
)
}
i18n.tsx
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import HttpApi from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
i18n
.use(HttpApi)
.use(LanguageDetector)
.use(initReactI18next);
export const initI18n = (caches: string[]): void => {
i18n.init({
detection: {
order: ['querystring', 'cookie', 'path', 'navigator'],
caches
},
<YOUR CONFIG>
})
};
export const getLanguage = (): string => i18n.language || (typeof window !== 'undefined' && window.localStorage.i18nextLng) || 'nl';
解决方案
- 当用户接受 cookie 横幅时,我自己创建 i18next cookie。在 CookieBanner 组件的 OnAccept 函数中,我创建了 2 个 cookie(i18next 和 accept-cookies)
- 用户当前正在查看网站,因此无需在 i18n 中刷新页面或将缓存设置为“cookie”
- 当用户刷新或重新访问网站时,index.tsx 中的 if 语句将检查 cookie 是否被接受,如果接受,将使用 cookie 缓存初始化 i18n。
评论
我现在唯一的问题是,当用户在接受 cookie 后和刷新/重新打开网站之前更改他的语言时,i18n cookie 已设置但 i18n 未通过 cookie 缓存启动,因此它不会将 cookie 更新为新语言。
解决方案是像这样在 onAccept 函数中调用 i18nInit(['cookie'])
const onAccept = () => {
updateCookie(acceptCookieName, true);
updateCookieState(true);
initI18n(['cookie']); <-- ADD THIS LINE
const lng = getLanguage();
updateCookie(i18CookieName, lng);
};
第二次启动 i18n 感觉很奇怪,但它似乎对我有用。如果有人为此问题找到更好的解决方案,请随时发表评论或添加其他解决方案。