import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import zh from './locales/zh.json';
import en from './locales/en.json';
import ja from './locales/ja.json';
i18n
.use(initReactI18next)
.init({
resources: {
zh: { translation: zh },
en: { translation: en },
ja: { translation: ja }
},
lng: 'zh',
fallbackLng: 'en',
interpolation: {
escapeValue: false
},
detection: {
order: ['navigator', 'localStorage', 'cookie'],
caches: ['localStorage', 'cookie']
}
});
export default i18n;
import React from 'react';
import { useTranslation } from 'react-i18next';
function Header() {
const { t } = useTranslation();
return (
<div className="header">
<h1>{t('welcome')}</h1>
<nav>
<a href="/">{t('nav.home')}</a>
<a href="/about">{t('nav.about')}</a>
<a href="/contact">{t('nav.contact')}</a>
</nav>
</div>
);
}
function Greeting({ name }) {
const { t } = useTranslation();
return (
<div>
{/* 带参数的翻译 */}
<p>{t('greeting', { name })}</p>
</div>
);
}
function LanguageSwitcher() {
const { i18n } = useTranslation();
const changeLanguage = (lng) => {
i18n.changeLanguage(lng);
};
return (
<div className="language-switcher">
<button onClick={() => changeLanguage('zh')}>中文</button>
<button onClick={() => changeLanguage('en')}>English</button>
<button onClick={() => changeLanguage('ja')}>日本語</button>
</div>
);
}
import { format } from 'date-fns';
import { zhCN, enUS, ja } from 'date-fns/locale';
function LocalizedDate() {
const { i18n } = useTranslation();
const currentDate = new Date();
const getLocale = () => {
switch (i18n.language) {
case 'zh': return zhCN;
case 'en': return enUS;
case 'ja': return ja;
default: return enUS;
}
};
const formattedDate = format(currentDate, 'yyyy 年 MM 月 dd 日 EEEE', { locale: getLocale() });
return (
<div>
<p>{formattedDate}</p>
</div>
);
}
function LocalizedNumber({ number }) {
const { i18n } = useTranslation();
const formattedNumber = new Intl.NumberFormat(i18n.language).format(number);
return (
<div>
<p>{formattedNumber}</p>
</div>
);
}
function LocalizedCurrency({ amount, currency }) {
const { i18n } = useTranslation();
const formattedCurrency = new Intl.NumberFormat(i18n.language, {
style: 'currency',
currency: currency
}).format(amount);
return (
<div>
<p>{formattedCurrency}</p>
</div>
);
}
function App() {
const { i18n } = useTranslation();
React.useEffect(() => {
const rtlLanguages = ['ar', 'he', 'fa'];
document.documentElement.dir = rtlLanguages.includes(i18n.language) ? 'rtl' : 'ltr';
}, [i18n.language]);
return (
<div>
<LanguageSwitcher />
<Header />
<Greeting name="张三" />
<LocalizedDate />
<LocalizedNumber number={1234567.89} />
<LocalizedCurrency amount={100} currency="CNY" />
</div>
);
}
*.{js,jsx,ts,tsx}',
],
output: './locales',
options: {
lngs: ['zh', 'en', 'ja'],
defaultLng: 'zh',
ns: ['translation'],
defaultValue: (lng, ns, key) => key,
resourceKeySeparator: '.',
nsSeparator: ':',
interpolation: {
prefix: '{{',
suffix: '}}'
}
}
};
*/