【问题标题】:Language Switcher with React and Next带有 React 和 Next 的语言切换器
【发布时间】:2021-06-13 02:54:12
【问题描述】:

我在语言之间切换的想法是单击标志(单击时,标志会随着语言发生变化)。到目前为止我做得很好,flag和url路径也在切换,但我无法在翻译之间进行切换。

为了处理 url,我使用构建 Next 选项 i18n,而对于实际语言翻译,我使用 react-i18next。

我的 i18next 文件非常简单:

i18n.use(LanguageDetector)
    .use(initReactI18next)
    .init({
        resources: {
            en: {
                translation: translations_EN_homePage,
            },
            da: {
                translation: translations_DA_homePage,
            },},});

改变语言钩子和handleOnclick函数:

const [language, setLanguage] = useState('en');

const handleOnclick = (e) => {
    e.preventDefault();
    setLanguage(e.target.value);
    i18n.changeLanguage(e.target.value);
};

最后解决我的按钮 = 标志

                    <button
                        value={language === 'en' ? 'da' : 'en'}
                        onClick={() => {
                            const locale = router.locale === 'en' ? 'da' : 'en';
                            setCookie(locale);
                            {handleOnclick}
                            router.push(
                                `/${locale}`,
                                `/${locale}`,
                                {locale: false,}}} >
                        {router.locale === 'en' ? (
                            <img
                                src={menuItems.data.body[5].items[0].image.url}/>
                        ) : (
                            <img src={menuItems.data.body[4].items[0].image.url} />
                        )}
                    </button>

为什么handleOnclick 功能不起作用?当我只使用 2 个按钮进行测试时,它在翻译时完全正常,那么它在哪里冲突?

我不想使用的 handleOnclick 函数示例:

               <button value="da" onClick={handleOnclick}>
                    Danish
                </button>
                <button value="en" onClick={handleOnclick}>
                    English
                </button>

【问题讨论】:

    标签: reactjs typescript internationalization i18next react-i18next


    【解决方案1】:

    您实际上并没有打电话给handleOnclick。你只有{handleOnclick},它什么都不做。您需要调用该函数。为此,您的onClick 回调必须接受事件e,以便它可以将其传递给handleOnclick。您还缺少 ) 的结尾括号 router.push

    这应该可行:

    <button
        value={language === 'en' ? 'da' : 'en'}
        onClick={(e) => {
            const locale = router.locale === 'en' ? 'da' : 'en';
            setCookie(locale);
            handleOnclick(e);
            router.push(
                `/${locale}`,
                `/${locale}`,
                { locale: false, }
            );
        }}
    >
        {router.locale === 'en' ? (
            <img src={menuItems.data.body[5].items[0].image.url} />
        ) : (
            <img src={menuItems.data.body[4].items[0].image.url} />
        )}
    </button>
    

    但是让你的一些逻辑内联而一些在一个单独的函数中是很奇怪的。我会一起移动它。

    您不需要使用e.target.value,因为value 派生自language。看起来您只是在两个选项之间切换。

    e.preventDefault 在这里也不是真正需要的,因为按钮单击没有我们需要像链接单击或表单提交那样阻止的默认事件。

    我不熟悉react-i18next 包,所以我不知道您的i18nrouter 变量的类型。似乎我们甚至不需要在此组件中使用 language 状态,因为您从 router.locale 获取语言。

    const language = router.locale ?? 'en';
    
    const handleOnclick = () => {
        const newLang = language === 'en' ? 'da' : 'en';
        i18n.changeLanguage(newLang);
        setCookie(newLang);
        router.push( // is this correct?
            `/${newLang}`,
            `/${newLang}`,
            { locale: false, }
        );
    };
    
    return (
        <button
            onClick={handleOnclick}
        >
            {language === 'en' ? ( // you could combine some logic here
                <img src={menuItems.data.body[5].items[0].image.url} />
            ) : (
                <img src={menuItems.data.body[4].items[0].image.url} />
            )}
        </button>
    )
    

    【讨论】:

    • 你说得非常对,我在两种逻辑之间挣扎,我找不到如何组合它们的方法。我很欣赏你的解释,因为它让我明白了。您指出的第二个选项只需稍作改动即可。谢谢!它还清理了我的代码!
    • 您可以通过组合两个 img 标签来进一步清理它。在渲染之外分配 const flagIndex = language === 'en' ? 5 : 4,虽然我不知道为什么你有这些看似任意的数字作为你的密钥。还有 const langString = language === ‘en’ ? “英语”:“丹麦语”,如果您在其他地方没有的话。如果您多次编写 === ‘en’ 检查,也许您需要一个 isEnglish 布尔值。您可以根据索引渲染标志 添加某种工具提示或标题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多