71 lines
1.4 KiB
TypeScript
71 lines
1.4 KiB
TypeScript
import i18n from 'i18next';
|
|||
|
|
import { initReactI18next } from 'react-i18next';
|
||
|
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||
|
|
|
||
|
|
import zh from './locales/zh.json';
|
||
|
|
import en from './locales/en.json';
|
||
|
|
|
||
|
|
const LANGUAGE_KEY = '@app_language';
|
||
|
|
|
||
|
|
// 语言配置类型
|
||
|
|
export interface LanguageOption {
|
||
|
|
key: string;
|
||
|
|
label: string;
|
||
|
|
value: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 语言选项
|
||
|
|
export const LANGUAGES: LanguageOption[] = [
|
||
|
|
{
|
||
|
|
key: 'zh',
|
||
|
|
label: '中文',
|
||
|
|
value: 'zh',
|
||
|
|
},
|
||
|
|
{
|
||
|
|
key: 'en',
|
||
|
|
label: 'English',
|
||
|
|
value: 'en',
|
||
|
|
},
|
||
|
|
];
|
||
|
|
|
||
|
|
// 获取存储的语言
|
||
|
|
export const getStoredLanguage = async (): Promise<string> => {
|
||
|
|
try {
|
||
|
|
const language = await AsyncStorage.getItem(LANGUAGE_KEY);
|
||
|
|
return language || 'zh';
|
||
|
|
} catch (error) {
|
||
|
|
return 'zh';
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// 保存语言选择
|
||
|
|
export const saveLanguage = async (language: string): Promise<void> => {
|
||
|
|
try {
|
||
|
|
await AsyncStorage.setItem(LANGUAGE_KEY, language);
|
||
|
|
} catch (error) {
|
||
|
|
console.error('保存语言失败:', error);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// 初始化 i18n
|
||
|
|
i18n
|
||
|
|
.use(initReactI18next)
|
||
|
|
.init({
|
||
|
|
compatibilityJSON: 'v3',
|
||
|
|
resources: {
|
||
|
|
zh: { translation: zh },
|
||
|
|
en: { translation: en },
|
||
|
|
},
|
||
|
|
lng: 'zh',
|
||
|
|
fallbackLng: 'zh',
|
||
|
|
interpolation: {
|
||
|
|
escapeValue: false,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
// 从存储中加载语言设置
|
||
|
|
getStoredLanguage().then((language) => {
|
||
|
|
i18n.changeLanguage(language);
|
||
|
|
});
|
||
|
|
|
||
|
|
export default i18n;
|