You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

i18next国际化问题:API/data.js数据的多语言切换方案咨询

解决i18next处理API/data.js数据多语言切换的问题

你遇到的核心问题是:useTranslation是React Hook,只能在React组件或自定义Hook中调用,普通的JS模块(比如你的data.js)不属于React组件上下文,直接调用t函数会失效或报错。下面是几种实用的解决方案:

方案1:本地data.js存储翻译key,组件渲染时转换(推荐)

把data.js里的多语言文本换成对应的翻译key,不要直接调用t函数,等到React组件渲染时再用t函数解析。

修改后的data.js

const data = [
    {
        id: 1,
        titleKey: 'singleCard.0.title',
        categoryKey: 'singleCard.0.category',
        price: 15.99,
        img: '../images/item-1.jpeg',
        descKey: 'singleCard.0.desc',
    },
    {
        id: 2,
        titleKey: 'singleCard.1.title',
        categoryKey: 'singleCard.1.category',
        price: 13.99,
        img: '../images/item-2.jpeg',
        descKey: 'singleCard.1.desc',
    },
    // 其他数据项同理替换
];

export default data;

在React组件中渲染

import { useTranslation } from "react-i18next";
import data from './data.js';

function ItemList() {
    const { t } = useTranslation();

    return (
        <div className="item-list">
            {data.map(item => (
                <div key={item.id} className="item-card">
                    <h3>{t(item.titleKey)}</h3>
                    <p>{t(item.categoryKey)}</p>
                    <p>${item.price}</p>
                    <img src={item.img} alt={t(item.titleKey)} />
                    <p>{t(item.descKey)}</p>
                </div>
            ))}
        </div>
    );
}

export default ItemList;

语言切换时,组件会自动重新渲染,t函数会读取当前语言的对应翻译值,完美适配状态变化。

方案2:API返回数据的处理

根据API返回的格式不同,分两种情况处理:

情况A:API返回翻译key

和本地data.js的处理逻辑一致,在组件中用t函数解析key即可。

情况B:API返回多语言对象

如果API直接返回包含多语言的结构(比如{en: "xxx", zh: "xxx"}),可以通过i18n.language获取当前语言,直接取值:

import { useTranslation } from "react-i18next";
import { useEffect, useState } from "react";

function ItemList() {
    const { i18n } = useTranslation();
    const [items, setItems] = useState([]);

    useEffect(() => {
        // 模拟API请求
        fetch('/api/items')
            .then(res => res.json())
            .then(data => setItems(data));
    }, []);

    return (
        <div className="item-list">
            {items.map(item => (
                <div key={item.id} className="item-card">
                    {/* 优先取当前语言, fallback到英文 */}
                    <h3>{item.title[i18n.language] || item.title.en}</h3>
                    <p>{item.category[i18n.language] || item.category.en}</p>
                    {/* 其他字段渲染 */}
                </div>
            ))}
        </div>
    );
}

方案3:非组件模块直接使用i18n实例(不推荐)

如果一定要在普通JS模块中处理翻译,可以直接导入i18n配置实例调用t函数,但注意这种方式不会自动响应语言切换,需要手动监听更新:

data.js封装成生成函数

import i18n from './i18n'; // 导入你的i18n配置文件

export function generateData() {
    return [
        {
            id: 1,
            title: i18n.t('singleCard.0.title'),
            category: i18n.t('singleCard.0.category'),
            price: 15.99,
            img: '../images/item-1.jpeg',
            desc: i18n.t('singleCard.0.desc'),
        },
        // 其他数据项
    ];
}

组件中监听语言变化更新数据

import { useTranslation } from "react-i18next";
import { useEffect, useState } from "react";
import { generateData } from './data.js';

function ItemList() {
    const { i18n } = useTranslation();
    const [items, setItems] = useState([]);

    useEffect(() => {
        // 语言切换时重新生成数据
        setItems(generateData());
    }, [i18n.language]);

    // 渲染逻辑...
}

这种方式需要手动维护数据更新,不如方案1简洁,仅适合特殊场景。

内容的提问来源于stack exchange,提问作者Pasha Mammadov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:23:14