| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent bc6c385 commit fe0a2ed
12 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -78,7 +78,7 @@ const monthNames = computed(() => [ | |||
| 78 | 78 | const typeChartData = computed<EChartPieData>(() => { | |
| 79 | 79 | const sorted = [...messageTypes.value].sort((a, b) => b.count - a.count) | |
| 80 | 80 | return { | |
| 81 | - labels: sorted.map((item) => getMessageTypeName(item.type)), | ||
| 81 | + labels: sorted.map((item) => getMessageTypeName(item.type, t)), | ||
| 82 | 82 | values: sorted.map((item) => item.count), | |
| 83 | 83 | } | |
| 84 | 84 | }) | |
@@ -89,7 +89,7 @@ const typeSummary = computed(() => { | |||
| 89 | 89 | const sorted = [...messageTypes.value].sort((a, b) => b.count - a.count) | |
| 90 | 90 | ||
| 91 | 91 | return sorted.map((item) => ({ | |
| 92 | - name: getMessageTypeName(item.type), | ||
| 92 | + name: getMessageTypeName(item.type, t), | ||
| 93 | 93 | count: item.count, | |
| 94 | 94 | percentage: total > 0 ? Math.round((item.count / total) * 100) : 0, | |
| 95 | 95 | })) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -25,32 +25,42 @@ export enum MessageType { | |||
| 25 | 25 | OTHER = 99, | |
| 26 | 26 | } | |
| 27 | 27 | ||
| 28 | - /** 消息类型名称映射 */ | ||
| 29 | - const MESSAGE_TYPE_NAMES: Record<number, string> = { | ||
| 30 | - [MessageType.TEXT]: '文字', | ||
| 31 | - [MessageType.IMAGE]: '图片', | ||
| 32 | - [MessageType.VOICE]: '语音', | ||
| 33 | - [MessageType.VIDEO]: '视频', | ||
| 34 | - [MessageType.FILE]: '文件', | ||
| 35 | - [MessageType.EMOJI]: '表情', | ||
| 36 | - [MessageType.LINK]: '链接', | ||
| 37 | - [MessageType.LOCATION]: '位置', | ||
| 38 | - [MessageType.RED_PACKET]: '红包', | ||
| 39 | - [MessageType.TRANSFER]: '转账', | ||
| 40 | - [MessageType.POKE]: '拍一拍', | ||
| 41 | - [MessageType.CALL]: '通话', | ||
| 42 | - [MessageType.SHARE]: '分享', | ||
| 43 | - [MessageType.REPLY]: '回复', | ||
| 44 | - [MessageType.FORWARD]: '转发', | ||
| 45 | - [MessageType.CONTACT]: '名片', | ||
| 46 | - [MessageType.SYSTEM]: '系统', | ||
| 47 | - [MessageType.RECALL]: '撤回', | ||
| 48 | - [MessageType.OTHER]: '其他', | ||
| 28 | + /** 消息类型 i18n key 映射 */ | ||
| 29 | + const MESSAGE_TYPE_KEYS: Record<number, string> = { | ||
| 30 | + // 基础消息类型 | ||
| 31 | + [MessageType.TEXT]: 'text', | ||
| 32 | + [MessageType.IMAGE]: 'image', | ||
| 33 | + [MessageType.VOICE]: 'voice', | ||
| 34 | + [MessageType.VIDEO]: 'video', | ||
| 35 | + [MessageType.FILE]: 'file', | ||
| 36 | + [MessageType.EMOJI]: 'emoji', | ||
| 37 | + [MessageType.LINK]: 'link', | ||
| 38 | + [MessageType.LOCATION]: 'location', | ||
| 39 | + // 交互消息类型 | ||
| 40 | + [MessageType.RED_PACKET]: 'redPacket', | ||
| 41 | + [MessageType.TRANSFER]: 'transfer', | ||
| 42 | + [MessageType.POKE]: 'poke', | ||
| 43 | + [MessageType.CALL]: 'call', | ||
| 44 | + [MessageType.SHARE]: 'share', | ||
| 45 | + [MessageType.REPLY]: 'reply', | ||
| 46 | + [MessageType.FORWARD]: 'forward', | ||
| 47 | + [MessageType.CONTACT]: 'contact', | ||
| 48 | + // 系统消息类型 | ||
| 49 | + [MessageType.SYSTEM]: 'system', | ||
| 50 | + [MessageType.RECALL]: 'recall', | ||
| 51 | + // 其他 | ||
| 52 | + [MessageType.OTHER]: 'other', | ||
| 49 | 53 | } | |
| 50 | 54 | ||
| 51 | - /** 获取消息类型名称 */ | ||
| 52 | - export function getMessageTypeName(type: MessageType | number): string { | ||
| 53 | - return MESSAGE_TYPE_NAMES[type] || '未知' | ||
| 55 | + /** | ||
| 56 | + * 获取消息类型名称 | ||
| 57 | + * @param type 消息类型 | ||
| 58 | + * @param t 可选的 i18n t 函数,传入时使用 common.messageType.* 键 | ||
| 59 | + */ | ||
| 60 | + export function getMessageTypeName(type: MessageType | number, t?: (key: string) => string): string { | ||
| 61 | + const key = MESSAGE_TYPE_KEYS[type] | ||
| 62 | + if (t && key) return t(`common.messageType.${key}`) | ||
| 63 | + return t ? t('common.messageType.unknown') : '未知' | ||
| 54 | 64 | } | |
| 55 | 65 | ||
| 56 | 66 | /** 小时活跃度 */ | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -3,6 +3,7 @@ | |||
| 3 | 3 | * ECharts 日历热力图组件(GitHub 贡献图风格) | |
| 4 | 4 | */ | |
| 5 | 5 | import { computed, ref, watch, onMounted, onUnmounted } from 'vue' | |
| 6 | + import { useI18n } from 'vue-i18n' | ||
| 6 | 7 | import * as echarts from 'echarts/core' | |
| 7 | 8 | import { HeatmapChart } from 'echarts/charts' | |
| 8 | 9 | import { CalendarComponent, TooltipComponent, VisualMapComponent } from 'echarts/components' | |
@@ -30,6 +31,7 @@ const props = withDefaults(defineProps<Props>(), { | |||
| 30 | 31 | height: 180, | |
| 31 | 32 | }) | |
| 32 | 33 | ||
| 34 | + const { t, locale } = useI18n() | ||
| 33 | 35 | const isDark = useDark() | |
| 34 | 36 | const chartRef = ref<HTMLElement | null>(null) | |
| 35 | 37 | let chartInstance: echarts.ECharts | null = null | |
@@ -70,7 +72,7 @@ const option = computed<ECOption>(() => ({ | |||
| 70 | 72 | formatter: (params: any) => { | |
| 71 | 73 | const date = params.data[0] | |
| 72 | 74 | const value = params.data[1] | |
| 73 | - return `${date}<br/>消息: ${value}` | ||
| 75 | + return `${date}<br/>${t('views.message.calendarTooltipMessages')}: ${value}` | ||
| 74 | 76 | }, | |
| 75 | 77 | }, | |
| 76 | 78 | visualMap: { | |
@@ -111,13 +113,35 @@ const option = computed<ECOption>(() => ({ | |||
| 111 | 113 | show: true, | |
| 112 | 114 | color: isDark.value ? '#9ca3af' : '#6b7280', | |
| 113 | 115 | fontSize: 10, | |
| 116 | + nameMap: [ | ||
| 117 | + t('common.month.jan'), | ||
| 118 | + t('common.month.feb'), | ||
| 119 | + t('common.month.mar'), | ||
| 120 | + t('common.month.apr'), | ||
| 121 | + t('common.month.may'), | ||
| 122 | + t('common.month.jun'), | ||
| 123 | + t('common.month.jul'), | ||
| 124 | + t('common.month.aug'), | ||
| 125 | + t('common.month.sep'), | ||
| 126 | + t('common.month.oct'), | ||
| 127 | + t('common.month.nov'), | ||
| 128 | + t('common.month.dec'), | ||
| 129 | + ], | ||
| 114 | 130 | }, | |
| 115 | 131 | dayLabel: { | |
| 116 | 132 | show: true, | |
| 117 | 133 | firstDay: 1, // 从周一开始 | |
| 118 | 134 | color: isDark.value ? '#6b7280' : '#9ca3af', | |
| 119 | 135 | fontSize: 10, | |
| 120 | - nameMap: ['日', '一', '二', '三', '四', '五', '六'], | ||
| 136 | + nameMap: [ | ||
| 137 | + t('common.weekday.sun'), | ||
| 138 | + t('common.weekday.mon'), | ||
| 139 | + t('common.weekday.tue'), | ||
| 140 | + t('common.weekday.wed'), | ||
| 141 | + t('common.weekday.thu'), | ||
| 142 | + t('common.weekday.fri'), | ||
| 143 | + t('common.weekday.sat'), | ||
| 144 | + ], | ||
| 121 | 145 | }, | |
| 122 | 146 | splitLine: { | |
| 123 | 147 | show: false, | |
@@ -153,8 +177,8 @@ function handleResize() { | |||
| 153 | 177 | chartInstance?.resize() | |
| 154 | 178 | } | |
| 155 | 179 | ||
| 156 | - // 监听数据和主题变化 | ||
| 157 | - watch([() => props.data, isDark], () => { | ||
| 180 | + // 监听数据、主题、语言变化 | ||
| 181 | + watch([() => props.data, isDark, locale], () => { | ||
| 158 | 182 | updateChart() | |
| 159 | 183 | }) | |
| 160 | 184 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -40,6 +40,28 @@ | |||
| 40 | 40 | "members": "members", | |
| 41 | 41 | "days": "days" | |
| 42 | 42 | }, | |
| 43 | + "messageType": { | ||
| 44 | + "text": "Text", | ||
| 45 | + "image": "Image", | ||
| 46 | + "voice": "Voice", | ||
| 47 | + "video": "Video", | ||
| 48 | + "file": "File", | ||
| 49 | + "emoji": "Emoji", | ||
| 50 | + "link": "Link", | ||
| 51 | + "location": "Location", | ||
| 52 | + "redPacket": "Red Packet", | ||
| 53 | + "transfer": "Transfer", | ||
| 54 | + "poke": "Poke", | ||
| 55 | + "call": "Call", | ||
| 56 | + "share": "Share", | ||
| 57 | + "reply": "Reply", | ||
| 58 | + "forward": "Forward", | ||
| 59 | + "contact": "Contact", | ||
| 60 | + "system": "System", | ||
| 61 | + "recall": "Recalled", | ||
| 62 | + "other": "Other", | ||
| 63 | + "unknown": "Unknown" | ||
| 64 | + }, | ||
| 43 | 65 | "weekday": { | |
| 44 | 66 | "mon": "Mon", | |
| 45 | 67 | "tue": "Tue", | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -37,6 +37,7 @@ | |||
| 37 | 37 | "heatmapHint": "Shows chat time patterns", | |
| 38 | 38 | "calendarHeatmap": "Message Calendar", | |
| 39 | 39 | "calendarHint": "Daily message distribution", | |
| 40 | + "calendarTooltipMessages": "Messages", | ||
| 40 | 41 | "lengthDetailTitle": "Short Messages (1-25 chars)", | |
| 41 | 42 | "lengthDetailHint": "Per character", | |
| 42 | 43 | "lengthGroupedTitle": "Length Range Distribution", | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -40,6 +40,28 @@ | |||
| 40 | 40 | "members": "个成员", | |
| 41 | 41 | "days": "天" | |
| 42 | 42 | }, | |
| 43 | + "messageType": { | ||
| 44 | + "text": "文字", | ||
| 45 | + "image": "图片", | ||
| 46 | + "voice": "语音", | ||
| 47 | + "video": "视频", | ||
| 48 | + "file": "文件", | ||
| 49 | + "emoji": "表情", | ||
| 50 | + "link": "链接", | ||
| 51 | + "location": "位置", | ||
| 52 | + "redPacket": "红包", | ||
| 53 | + "transfer": "转账", | ||
| 54 | + "poke": "拍一拍", | ||
| 55 | + "call": "通话", | ||
| 56 | + "share": "分享", | ||
| 57 | + "reply": "回复", | ||
| 58 | + "forward": "转发", | ||
| 59 | + "contact": "名片", | ||
| 60 | + "system": "系统", | ||
| 61 | + "recall": "撤回", | ||
| 62 | + "other": "其他", | ||
| 63 | + "unknown": "未知" | ||
| 64 | + }, | ||
| 43 | 65 | "weekday": { | |
| 44 | 66 | "mon": "周一", | |
| 45 | 67 | "tue": "周二", | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -37,6 +37,7 @@ | |||
| 37 | 37 | "heatmapHint": "展示聊天时间规律", | |
| 38 | 38 | "calendarHeatmap": "消息日历", | |
| 39 | 39 | "calendarHint": "每日消息分布", | |
| 40 | + "calendarTooltipMessages": "消息", | ||
| 40 | 41 | "lengthDetailTitle": "短消息分布 (1-25字)", | |
| 41 | 42 | "lengthDetailHint": "逐字统计", | |
| 42 | 43 | "lengthGroupedTitle": "长度区间分布", | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -56,8 +56,8 @@ const { dailyChartData } = useDailyTrend(props.dailyActivity) | |||
| 56 | 56 | // 消息类型图表数据 | |
| 57 | 57 | const typeChartData = computed<EChartPieData>(() => { | |
| 58 | 58 | return { | |
| 59 | - labels: props.messageTypes.map((t) => getMessageTypeName(t.type)), | ||
| 60 | - values: props.messageTypes.map((t) => t.count), | ||
| 59 | + labels: props.messageTypes.map((item) => getMessageTypeName(item.type, t)), | ||
| 60 | + values: props.messageTypes.map((item) => item.count), | ||
| 61 | 61 | } | |
| 62 | 62 | }) | |
| 63 | 63 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -208,7 +208,7 @@ onMounted(() => { | |||
| 208 | 208 | icon="i-heroicons-plus-circle" | |
| 209 | 209 | @click="showIncrementalImportModal = true" | |
| 210 | 210 | > | |
| 211 | - {{ t('analysis.incrementalImport', '增量导入') }} | ||
| 211 | + {{ t('analysis.tooltip.incrementalImport') }} | ||
| 212 | 212 | </UButton> | |
| 213 | 213 | <UButton | |
| 214 | 214 | color="primary" | |
@@ -217,7 +217,7 @@ onMounted(() => { | |||
| 217 | 217 | icon="i-heroicons-chat-bubble-bottom-center-text" | |
| 218 | 218 | @click="openChatRecordViewer" | |
| 219 | 219 | > | |
| 220 | - {{ t('analysis.chatViewer', '聊天记录查看器') }} | ||
| 220 | + {{ t('analysis.tooltip.chatViewer') }} | ||
| 221 | 221 | </UButton> | |
| 222 | 222 | <UTooltip :text="t('analysis.tooltip.sessionIndex')"> | |
| 223 | 223 | <UButton | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -54,8 +54,8 @@ const { dailyChartData } = useDailyTrend(props.dailyActivity) | |||
| 54 | 54 | // 消息类型图表数据 | |
| 55 | 55 | const typeChartData = computed<EChartPieData>(() => { | |
| 56 | 56 | return { | |
| 57 | - labels: props.messageTypes.map((t) => getMessageTypeName(t.type)), | ||
| 58 | - values: props.messageTypes.map((t) => t.count), | ||
| 57 | + labels: props.messageTypes.map((item) => getMessageTypeName(item.type, t)), | ||
| 58 | + values: props.messageTypes.map((item) => item.count), | ||
| 59 | 59 | } | |
| 60 | 60 | }) | |
| 61 | 61 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments