Initial commit: expo-popcore-app

This commit is contained in:
imeepos
2025-12-25 16:25:55 +08:00
commit 02d0c807cd
160 changed files with 39560 additions and 0 deletions

125
lib/i18n.ts Normal file
View File

@@ -0,0 +1,125 @@
import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import AsyncStorage from '@react-native-async-storage/async-storage'
import { NativeModules, Platform } from 'react-native'
// 导入语言资源
import zhCN from '../locales/zh-CN.json'
import enUS from '../locales/en-US.json'
// 定义支持的语言
export const SUPPORTED_LANGUAGES = {
'zh-CN': '简体中文',
'en-US': 'English',
} as const
export type SupportedLanguage = keyof typeof SUPPORTED_LANGUAGES
// 获取系统语言Android 和 iOS 兼容)
const getSystemLanguage = (): string => {
try {
let locale: string | undefined
if (Platform.OS === 'ios') {
// iOS: 从 SettingsManager 获取
const settings = NativeModules.SettingsManager?.settings
locale = settings?.AppleLocale || settings?.AppleLanguages?.[0]
} else if (Platform.OS === 'android') {
// Android: 从 I18nManager 获取
locale = NativeModules.I18nManager?.localeIdentifier
}
if (locale) {
// 处理语言代码格式,例如 'zh_CN' -> 'zh-CN', 'en_US' -> 'en-US'
const normalized = locale.replace('_', '-').toLowerCase()
if (normalized.startsWith('zh')) {
return 'zh-CN'
} else if (normalized.startsWith('en')) {
return 'en-US'
}
}
} catch (error) {
// 静默处理错误,使用默认语言
console.warn('Error getting system language:', error)
}
return 'zh-CN' // 默认返回中文
}
// AsyncStorage 语言检测器(兼容 Android 和 iOS
const languageDetector = {
type: 'languageDetector' as const,
async: true,
detect: async (callback: (lng: string) => void) => {
try {
// 1. 优先使用用户保存的语言设置
const savedLanguage = await AsyncStorage.getItem('app_language')
if (savedLanguage) {
// 兼容旧的语言代码格式
if (savedLanguage === 'zh' || savedLanguage === 'zh-CN') {
callback('zh-CN')
return
} else if (savedLanguage === 'en' || savedLanguage === 'en-US') {
callback('en-US')
return
}
}
// 2. 如果没有保存的语言,尝试使用系统语言
const systemLang = getSystemLanguage()
callback(systemLang)
} catch (error) {
console.error('Error detecting language:', error)
// 3. 如果出错,使用默认语言
callback('zh-CN')
}
},
init: () => {},
cacheUserLanguage: async (lng: string) => {
try {
// AsyncStorage 在 Android 和 iOS 上都正常工作
await AsyncStorage.setItem('app_language', lng)
} catch (error) {
console.error('Error saving language:', error)
}
},
}
// i18n配置
i18n.use(languageDetector)
.use(initReactI18next)
.init({
// 语言资源
resources: {
'zh-CN': {
translation: zhCN,
},
'en-US': {
translation: enUS,
},
},
// 默认语言
fallbackLng: 'zh-CN',
// 调试模式(开发环境开启)
debug: false,
// 兼容性配置:使用 v3 格式处理复数,避免 Android 端 Intl.PluralRules 不支持的问题
compatibilityJSON: 'v3',
// 插值配置
interpolation: {
escapeValue: false, // React已经处理了XSS防护
},
// 命名空间配置
defaultNS: 'translation',
ns: ['translation'],
// 键值分隔符
keySeparator: '.',
nsSeparator: ':',
})
export default i18n