11<script setup lang="ts">
22import { computed , onBeforeUnmount , onMounted , ref } from ' vue'
33import { withBase } from ' vuepress/client'
4+ import { useLocale } from ' ../composables/useLocale.js'
5+
6+ const { currentLocale } = useLocale ()
7+
8+ interface LocaleStrings {
9+ loading: string
10+ waitingFirstSync: string
11+ unknown: string
12+ unknownError: string
13+ noGroupsTitle: string
14+ noGroupsMsg: (limit : number ) => string
15+ lastSync: string
16+ groupId: string
17+ memberCount: string
18+ copyGroupId: string
19+ copied: string
20+ copyFailed: string
21+ viewAllGroups: string
22+ fullOrUnavailable: string
23+ groupName: (id : string ) => string
24+ dateLocale: string
25+ numberLocale: string
26+ }
27+
28+ const t = computed <LocaleStrings >(() => {
29+ const strings: Record <import (' ../composables/useLocale.js' ).Locale , LocaleStrings > = {
30+ zh: {
31+ loading: ' 正在获取 QQ 群信息...' ,
32+ waitingFirstSync: ' 等待首次更新' ,
33+ unknown: ' 未知' ,
34+ unknownError: ' 未知错误' ,
35+ noGroupsTitle: ' 暂时没有可加入的 QQ 群' ,
36+ noGroupsMsg : (limit : number ) => ` 当前没有人数低于 ${limit } 的群,或群信息还未完成同步。请稍后再试。 ` ,
37+ lastSync: ' 最近同步' ,
38+ groupId: ' 群号' ,
39+ memberCount: ' 当前人数' ,
40+ copyGroupId: ' 复制群号' ,
41+ copied: ' 已复制' ,
42+ copyFailed: ' 复制失败' ,
43+ viewAllGroups: ' 查看全部群状态' ,
44+ fullOrUnavailable: ' 已满或不可加入' ,
45+ groupName : (id : string ) => ` QQ群 ${id } ` ,
46+ dateLocale: ' zh-CN' ,
47+ numberLocale: ' zh-CN' ,
48+ },
49+ en: {
50+ loading: ' Fetching QQ group info...' ,
51+ waitingFirstSync: ' Waiting for first sync' ,
52+ unknown: ' Unknown' ,
53+ unknownError: ' Unknown error' ,
54+ noGroupsTitle: ' No QQ groups available' ,
55+ noGroupsMsg : (limit : number ) => ` No groups with fewer than ${limit } members available, or group data has not synced yet. Please try again later. ` ,
56+ lastSync: ' Last Sync' ,
57+ groupId: ' Group ID' ,
58+ memberCount: ' Members' ,
59+ copyGroupId: ' Copy Group ID' ,
60+ copied: ' Copied' ,
61+ copyFailed: ' Copy Failed' ,
62+ viewAllGroups: ' View All Groups' ,
63+ fullOrUnavailable: ' Full or Unavailable' ,
64+ groupName : (id : string ) => ` QQ Group ${id } ` ,
65+ dateLocale: ' en-US' ,
66+ numberLocale: ' en-US' ,
67+ },
68+ ja: {
69+ loading: ' QQ グループ情報を取得中...' ,
70+ waitingFirstSync: ' 初回同期待ち' ,
71+ unknown: ' 不明' ,
72+ unknownError: ' 不明なエラー' ,
73+ noGroupsTitle: ' 現在参加可能な QQ グループはありません' ,
74+ noGroupsMsg : (limit : number ) => ` 現在、人数が ${limit } 未満のグループがないか、グループ情報の同期が完了していません。しばらくしてからもう一度お試しください。 ` ,
75+ lastSync: ' 最終同期' ,
76+ groupId: ' グループID' ,
77+ memberCount: ' 現在の人数' ,
78+ copyGroupId: ' グループIDをコピー' ,
79+ copied: ' コピー済み' ,
80+ copyFailed: ' コピー失敗' ,
81+ viewAllGroups: ' 全グループの状態を表示' ,
82+ fullOrUnavailable: ' 満員または参加不可' ,
83+ groupName : (id : string ) => ` QQグループ ${id } ` ,
84+ dateLocale: ' ja-JP' ,
85+ numberLocale: ' ja-JP' ,
86+ },
87+ }
88+ return strings [currentLocale .value ]
89+ })
490
591interface QQGroup {
692 group_id: string
@@ -41,7 +127,7 @@ const memberLimit = computed(() => groupData.value?.member_limit ?? 2000)
41127
42128const updatedAt = computed (() => {
43129 const value = groupData .value ?.updated_at
44- return value ? formatDate (value ) : ' 等待首次更新 '
130+ return value ? formatDate (value ) : t . value . waitingFirstSync
45131})
46132
47133onMounted (async () => {
@@ -57,7 +143,7 @@ onMounted(async () => {
57143
58144 groupData .value = await response .json ()
59145 } catch (error ) {
60- errorMessage .value = error instanceof Error ? error .message : ' 未知错误 '
146+ errorMessage .value = error instanceof Error ? error .message : t . value . unknownError
61147 } finally {
62148 loading .value = false
63149 }
@@ -67,7 +153,7 @@ function formatDate(value: string): string {
67153 const date = new Date (value )
68154 if (Number .isNaN (date .getTime ())) return value
69155
70- return new Intl .DateTimeFormat (' zh-CN ' , {
156+ return new Intl .DateTimeFormat (t . value . dateLocale , {
71157 year: ' numeric' ,
72158 month: ' 2-digit' ,
73159 day: ' 2-digit' ,
@@ -77,15 +163,15 @@ function formatDate(value: string): string {
77163}
78164
79165function formatCount(value ? : number ): string {
80- return typeof value === ' number' && Number .isFinite (value ) ? value .toLocaleString (' zh-CN ' ) : ' 未知 '
166+ return typeof value === ' number' && Number .isFinite (value ) ? value .toLocaleString (t . value . numberLocale ) : t . value . unknown
81167}
82168
83169function hasMemberCount(group : QQGroup ): boolean {
84170 return typeof group .member_count === ' number' && Number .isFinite (group .member_count )
85171}
86172
87173function formatGroupMemberCount(group : QQGroup ): string {
88- if (! hasMemberCount (group )) return ' 未知 '
174+ if (! hasMemberCount (group )) return t . value . unknown
89175
90176 const maxMemberCount = group .max_member_count ?? memberLimit .value
91177 return ` ${group .member_count }/${maxMemberCount } `
@@ -99,7 +185,7 @@ function hasFewRemainingSlots(group: QQGroup): boolean {
99185}
100186
101187function formatGroupName(group : QQGroup ): string {
102- return group .group_name || ` QQ群 ${ group .group_id } `
188+ return group .group_name || t . value . groupName ( group .group_id )
103189}
104190
105191async function copyGroupId(groupId : string ): Promise <void > {
@@ -161,22 +247,22 @@ function copyTextWithFallback(value: string): void {
161247}
162248
163249function copyButtonLabel(groupId : string ): string {
164- if (copiedGroupId .value === groupId ) return ' 已复制 '
165- if (copyErrorGroupId .value === groupId ) return ' 复制失败 '
166- return ' 复制群号 '
250+ if (copiedGroupId .value === groupId ) return t . value . copied
251+ if (copyErrorGroupId .value === groupId ) return t . value . copyFailed
252+ return t . value . copyGroupId
167253}
168254 </script >
169255
170256<template >
171257 <section class =" qq-group" >
172- <div v-if =" loading" class =" qq-group__state" >正在获取 QQ 群信息... </div >
258+ <div v-if =" loading" class =" qq-group__state" >{{ t.loading }} </div >
173259
174260 <div v-else-if =" !selectedGroup" class =" qq-group__empty" >
175- <h2 >暂时没有可加入的 QQ 群 </h2 >
261+ <h2 >{{ t.noGroupsTitle }} </h2 >
176262 <p >
177- {{ errorMessage || `当前没有人数低于 ${ memberLimit} 的群,或群信息还未完成同步。请稍后再试。` }}
263+ {{ errorMessage || t.noGroupsMsg( memberLimit) }}
178264 </p >
179- <p class =" qq-group__meta" >最近同步 :{{ updatedAt }}</p >
265+ <p class =" qq-group__meta" >{{ t.lastSync }} :{{ updatedAt }}</p >
180266 </div >
181267
182268 <div v-else class =" qq-group__content" >
@@ -185,15 +271,15 @@ function copyButtonLabel(groupId: string): string {
185271
186272 <dl class =" qq-group__stats" >
187273 <div >
188- <dt >群号 </dt >
274+ <dt >{{ t.groupId }} </dt >
189275 <dd >{{ selectedGroup.group_id }}</dd >
190276 </div >
191277 <div >
192- <dt >当前人数 </dt >
278+ <dt >{{ t.memberCount }} </dt >
193279 <dd >{{ formatCount(selectedGroup.member_count) }} / {{ formatCount(selectedGroup.max_member_count) }}</dd >
194280 </div >
195281 <div >
196- <dt >最近同步 </dt >
282+ <dt >{{ t.lastSync }} </dt >
197283 <dd >{{ updatedAt }}</dd >
198284 </div >
199285 </dl >
@@ -205,7 +291,7 @@ function copyButtonLabel(groupId: string): string {
205291 </div >
206292
207293 <details v-if =" groups.length > 1" class =" qq-group__details" >
208- <summary >查看全部群状态 </summary >
294+ <summary >{{ t.viewAllGroups }} </summary >
209295 <ul >
210296 <li v-for =" group in groups" :key =" group.group_id" >
211297 <span >
@@ -219,7 +305,7 @@ function copyButtonLabel(groupId: string): string {
219305 >
220306 {{ formatGroupMemberCount(group) }}
221307 </strong >
222- <em v-else >{{ group.error || '已满或不可加入' }}</em >
308+ <em v-else >{{ group.error || t.fullOrUnavailable }}</em >
223309 <button type =" button" @click =" copyGroupId(group.group_id)" >
224310 {{ copyButtonLabel(group.group_id) }}
225311 </button >
0 commit comments