
在构建多语言web应用时,国际化(i18n)是不可或缺的一环。react-i18next是一个功能强大且灵活的库,用于在react应用中实现国际化。通常,我们会在react组件中使用usetranslation hook来获取翻译函数t,并直接在jsx中调用它。然而,当应用程序的导航菜单或类似配置数据存储在独立的javascript文件中时,如何将这些静态数据中的标题进行国际化,成为了一个常见挑战。直接在非react组件的纯javascript数据文件中使用usetranslation是不可行的,因为它是一个hook,必须在函数组件内部调用。
本教程将提供一种优雅的解决方案,使你能够在不改变数据文件结构本质的情况下,实现导航标题的动态翻译。
核心思想是将数据文件中的具体显示文本替换为抽象的“翻译键”(Translation Key)。这些键将作为在翻译资源文件中查找对应文本的标识符。当组件渲染这些数据时,它会使用useTranslation Hook提供的t函数,根据当前语言环境和翻译键动态获取并显示正确的翻译文本。
具体步骤如下:
首先,我们需要修改存储导航数据的NavbarData.js文件。请注意,这个文件是一个纯JavaScript数组,不应导入或使用React Hook(如useTranslation)。我们将title属性的值替换为简短、描述性的翻译键。
更新前的 NavbarData.js 示例:
import React from 'react';
import startpageIcon from './Icons/startpage.svg';
import performance from './Icons/performance.svg';
import fraud from './Icons/fraud.svg';
// import { useTranslation } from 'react-i18next'; // 此行应移除
export const NavbarData = [
{
title: 'Operational Overview', // 实际文本
path: '/monitoringoverview',
icon: <img src={startpageIcon} alt="" />,
cName: 'nav-text'
},
{
title: "Performance Quality", // 实际文本
path: "/performancequality",
icon: <img src={performance} alt="" />,
cName: 'nav-text'
},
{
title: "Fraud and Anomalies", // 实际文本
path: "/fraud",
icon: <img src={fraud} alt="" />,
cName: 'nav-text'
},
];更新后的 NavbarData.js 示例:
import React from 'react';
import startpageIcon from './Icons/startpage.svg';
import performance from './Icons/performance.svg';
import fraud from './Icons/fraud.svg';
export const NavbarData = [
{
title: 'operationalOverview', // 翻译键
path: '/monitoringoverview',
icon: <img src={startpageIcon} alt="" />,
cName: 'nav-text'
},
{
title: "performanceQuality", // 翻译键
path: "/performancequality",
icon: <img src={performance} alt="" />,
cName: 'nav-text'
},
{
title: "fraudAndAnomalies", // 翻译键
path: "/fraud",
icon: <img src={fraud} alt="" />,
cName: 'nav-text'
},
];说明: 我们移除了useTranslation的导入,并将title的值从可读的字符串更改为小驼峰命名的翻译键。这些键将作为在翻译文件中查找对应文本的标识符。
接下来,在Navbar.js组件中,当遍历NavbarData并渲染每个导航项时,我们将使用useTranslation Hook提供的t函数来翻译item.title。
关键修改点:
更新后的 Navbar.js 相关部分示例:
import React, { useState, useEffect } from "react";
import { Link, useLocation } from "react-router-dom";
import { NavbarData } from "./NavbarData"; // 导入更新后的数据
import { IconContext } from "react-icons";
import "./Navbar.css";
// ...其他导入
import { useTranslation } from 'react-i18next'; // 确保已导入
//Navbar function
function Navbar() {
// ...其他useState和useEffect
// i18n
// 使用 keyPrefix 简化翻译键,所有在此 t 函数中调用的键都会自动加上 "navbar.titles" 前缀
const { t, i18n } = useTranslation("default", { keyPrefix: "navbar.titles" });
const lngs = {
en: {nativeName: 'English'},
fr: {nativeName: 'French'}
};
// ...getPageTitleByUrl, userConfigPageTitle, useEffect, handleLanguageChange
return (
<>
<IconContext.Provider value={{ color: "undefined" }}>
{/* ...navbar header */}
<nav className={sidebar ? "nav-menu active" : "nav-menu"}>
<ul className="nav-menu-items" onClick={showSidebar}>
{NavbarData.map((item, index) => {
return (
<li key={index} className={item.cName}>
<Link to={item.path}>
<span className="navbutton-text">
<span className="navbutton-icon">{item.icon}</span>
{t(item.title)} {/* 在这里应用 t() 函数 */}
</span>
</Link>
</li>
);
})}
</ul>
</nav>
</IconContext.Provider>
</>
);
}
export default Navbar;说明: 通过在useTranslation中设置keyPrefix: "navbar.titles",我们告诉react-i18next,所有通过此t函数进行的翻译查找都应以navbar.titles作为前缀。这意味着,当t(item.title)被调用时,如果item.title是operationalOverview,实际查找的键将是navbar.titles.operationalOverview。这有助于保持翻译文件结构的清晰和组织性。
最后,我们需要在你的翻译资源文件(例如public/locales/en/default.json和public/locales/fr/default.json,具体路径取决于你的i18n.init()配置)中定义这些翻译键及其对应的文本。
en.json (或 default.json for English) 示例:
{
"navbar": {
"titles": {
"operationalOverview": "Operational Overview",
"performanceQuality": "Performance Quality",
"fraudAndAnomalies": "Fraud and Anomalies"
},
"criminalRecords": "Criminal Records",
"logout": "Logout"
}
}fr.json (或 default.json for French) 示例:
{
"navbar": {
"titles": {
"operationalOverview": "Aperçu Opérationnel",
"performanceQuality": "Qualité des Performances",
"fraudAndAnomalies": "Fraudes et Anomalies"
},
"criminalRecords": "Casier Judiciaire",
"logout": "Déconnexion"
}
}说明:
通过将外部数据文件中的实际文本替换为翻译键,并在渲染组件中利用react-i18next的t函数和keyPrefix功能,我们成功地实现了React应用中外部数据结构的国际化。这种方法保持了数据文件的纯净性,将翻译逻辑与数据定义分离,提高了代码的可维护性和可扩展性,使得管理多语言应用变得更加高效和便捷。
以上就是在React应用中实现i18n:将翻译集成到外部数据文件的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号