feat(i18n): 实现应用国际化支持,添加中英文翻译

- 为所有UI组件添加国际化支持,替换硬编码文本
- 新增useI18n钩子函数统一管理翻译
- 完善中英文翻译资源,覆盖统计、用药、通知设置等模块
- 优化Tab布局使用翻译键值替代静态文本
- 更新药品管理、个人资料编辑等页面的多语言支持
This commit is contained in:
richarjiang
2025-11-13 11:09:55 +08:00
parent 416d144387
commit 2dca3253e6
21 changed files with 1669 additions and 366 deletions

View File

@@ -7,6 +7,7 @@ import { Image } from 'expo-image';
import { useRouter } from 'expo-router';
import LottieView from 'lottie-react-native';
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
Animated,
StyleSheet,
@@ -26,6 +27,7 @@ const WaterIntakeCard: React.FC<WaterIntakeCardProps> = ({
style,
selectedDate
}) => {
const { t } = useTranslation();
const router = useRouter();
const { waterStats, dailyWaterGoal, waterRecords, addWaterRecord, getWaterRecordsByDate } = useWaterDataByDate(selectedDate);
const [quickWaterAmount, setQuickWaterAmount] = useState(150); // 默认值,将从用户偏好中加载
@@ -89,7 +91,7 @@ const WaterIntakeCard: React.FC<WaterIntakeCardProps> = ({
const targetDate = selectedDate || dayjs().format('YYYY-MM-DD');
await getWaterRecordsByDate(targetDate);
} catch (error) {
console.error('页面聚焦时加载数据失败:', error);
console.error('Failed to load data on focus:', error);
}
};
@@ -185,11 +187,11 @@ const WaterIntakeCard: React.FC<WaterIntakeCardProps> = ({
source={require('@/assets/images/icons/IconGlass.png')}
style={styles.titleIcon}
/>
<Text style={styles.title}></Text>
<Text style={styles.title}>{t('statistics.components.water.title')}</Text>
</View>
{isToday && (
<TouchableOpacity style={styles.addButton} onPress={handleQuickAddWater}>
<Text style={styles.addButtonText}>+ {quickWaterAmount}ml</Text>
<Text style={styles.addButtonText}>{t('statistics.components.water.addButton', { amount: quickWaterAmount })}</Text>
</TouchableOpacity>
)}
</View>
@@ -254,14 +256,14 @@ const WaterIntakeCard: React.FC<WaterIntakeCardProps> = ({
<AnimatedNumber
value={currentIntake}
style={styles.currentIntake}
format={(value) => `${Math.round(value)}ml`}
format={(value) => `${Math.round(value)}${t('statistics.components.water.unit')}`}
resetToken={selectedDate}
/>
) : (
<Text style={styles.currentIntake}></Text>
<Text style={styles.currentIntake}>--</Text>
)}
<Text style={styles.targetIntake}>
/ {targetIntake}ml
/ {targetIntake}{t('statistics.components.water.unit')}
</Text>
</View>