整体思路
- 代码分割:利用React的代码分割技术,将不同语言的资源文件分割成独立的代码块,避免一次性加载所有语言包。
- 动态加载:在需要使用特定语言时,动态加载对应的语言包。
- 缓存机制:为避免重复加载相同的语言包,实现一个简单的缓存机制。
详细实现方案
- 创建语言资源文件:为每种语言创建独立的JSON文件,例如
en.json
、zh.json
等,文件内容为键值对形式的翻译文本。
- 使用React.lazy和Suspense:通过
React.lazy
实现动态导入语言包,并使用Suspense
处理加载过程中的等待状态。
- 缓存实现:使用一个对象来存储已加载的语言包,每次加载前先检查缓存。
代码示例
- 语言资源文件(例如
en.json
)
{
"greeting": "Hello",
"farewell": "Goodbye"
}
- 语言加载函数
const languageCache = {};
const loadLanguage = async (language) => {
if (languageCache[language]) {
return languageCache[language];
}
const lang = await import(`./locales/${language}.json`);
languageCache[language] = lang;
return lang;
};
- React组件中使用
import React, { lazy, Suspense } from'react';
const LanguageProvider = ({ children, initialLanguage = 'en' }) => {
const [currentLanguage, setCurrentLanguage] = React.useState(initialLanguage);
const LanguageComponent = lazy(() => loadLanguage(currentLanguage));
return (
<Suspense fallback={<div>Loading language...</div>}>
<LanguageComponent>{children}</LanguageComponent>
</Suspense>
);
};
export default LanguageProvider;
- 应用使用示例
import React from'react';
import ReactDOM from'react-dom';
import LanguageProvider from './LanguageProvider';
const App = () => {
return (
<LanguageProvider initialLanguage="en">
{/* 应用内容 */}
</LanguageProvider>
);
};
ReactDOM.render(<App />, document.getElementById('root'));