From 8b49dc78d820195f12fd5520aa3a112fed8bad7b Mon Sep 17 00:00:00 2001 From: AllenTom Date: Sun, 1 Sep 2024 20:11:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增多语言支持 - 优化时间显示 - 调整UI细节 --- .../java/com/aiosman/riderpro/exp/Date.kt | 15 ++++++++----- .../ui/index/tabs/message/MessageList.kt | 14 +++++------- .../riderpro/ui/index/tabs/moment/Moment.kt | 2 +- .../riderpro/ui/index/tabs/profile/Profile.kt | 22 +++---------------- .../ui/index/tabs/search/DiscoverScreen.kt | 6 ++--- .../ui/index/tabs/search/SearchScreen.kt | 7 ++++-- .../com/aiosman/riderpro/ui/like/LikePage.kt | 2 +- .../java/com/aiosman/riderpro/ui/post/Post.kt | 2 +- app/src/main/res/values-zh/strings.xml | 18 +++++++++++++++ app/src/main/res/values/strings.xml | 14 ++++++++++++ 10 files changed, 61 insertions(+), 41 deletions(-) create mode 100644 app/src/main/res/values-zh/strings.xml diff --git a/app/src/main/java/com/aiosman/riderpro/exp/Date.kt b/app/src/main/java/com/aiosman/riderpro/exp/Date.kt index 78dc73a..bdda052 100644 --- a/app/src/main/java/com/aiosman/riderpro/exp/Date.kt +++ b/app/src/main/java/com/aiosman/riderpro/exp/Date.kt @@ -1,7 +1,10 @@ package com.aiosman.riderpro.exp +import android.content.Context import android.icu.text.SimpleDateFormat import android.icu.util.Calendar +import androidx.compose.ui.res.stringResource +import com.aiosman.riderpro.R import com.aiosman.riderpro.data.api.ApiClient import java.util.Date import java.util.Locale @@ -9,7 +12,7 @@ import java.util.Locale /** * 格式化时间为 xx 前 */ -fun Date.timeAgo(): String { +fun Date.timeAgo(context: Context): String { val now = Date() val diffInMillis = now.time - this.time @@ -20,11 +23,11 @@ fun Date.timeAgo(): String { val years = days / 365 return when { - seconds < 60 -> "$seconds seconds ago" - minutes < 60 -> "$minutes minutes ago" - hours < 24 -> "$hours hours ago" - days < 365 -> "$days days ago" - else -> "$years years ago" + seconds < 60 -> context.getString(R.string.second_ago, seconds) + minutes < 60 -> context.getString(R.string.minute_ago, minutes) + hours < 24 -> context.getString(R.string.hour_ago, hours) + days < 365 -> context.getString(R.string.days_ago, days) + else -> SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(this) } } diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/message/MessageList.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/message/MessageList.kt index 86742ad..44f8228 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/message/MessageList.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/message/MessageList.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -50,12 +51,10 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController */ @Composable fun NotificationsScreen() { - val model = MessageListViewModel val navController = LocalNavController.current val systemUiController = rememberSystemUiController() var dataFlow = MessageListViewModel.commentItemsFlow var comments = dataFlow.collectAsLazyPagingItems() - val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues() val navigationBarPaddings = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 48.dp LaunchedEffect(Unit) { @@ -68,7 +67,6 @@ fun NotificationsScreen() { ) { Spacer( modifier = Modifier.padding( -// top = statusBarPaddingValues.calculateTopPadding(), bottom = navigationBarPaddings ) ) @@ -92,21 +90,21 @@ fun NotificationsScreen() { NotificationIndicator( MessageListViewModel.likeNoticeCount, R.drawable.rider_pro_like, - "LIKE" + stringResource(R.string.like_upper) ) { navController.navigate(NavigationRoute.Likes.route) } NotificationIndicator( MessageListViewModel.followNoticeCount, R.drawable.rider_pro_followers, - "FOLLOWERS" + stringResource(R.string.followers_upper) ) { navController.navigate(NavigationRoute.Followers.route) } NotificationIndicator( MessageListViewModel.favouriteNoticeCount, R.drawable.rider_pro_favoriate, - "Favourites" + stringResource(R.string.favourites_upper) ) { navController.navigate(NavigationRoute.FavouritesScreen.route) } @@ -217,7 +215,7 @@ fun NotificationCounterItem(count: Int) { } Spacer(modifier = Modifier.width(24.dp)) - Text("NOTIFICATIONS", fontSize = 18.sp) + Text(stringResource(R.string.notifications_upper), fontSize = 18.sp) Spacer(modifier = Modifier.weight(1f)) if (count > 0) { Box( @@ -314,7 +312,7 @@ fun CommentItem( Spacer(modifier = Modifier.width(8.dp)) } Text( - text = commentItem.date.timeAgo(), + text = commentItem.date.timeAgo(context), fontSize = 14.sp, color = Color(0x66000000) ) diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/moment/Moment.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/moment/Moment.kt index 8069bde..7e0f3a5 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/moment/Moment.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/moment/Moment.kt @@ -344,7 +344,7 @@ fun MomentTopRowGroup(momentEntity: MomentEntity) { verticalAlignment = Alignment.CenterVertically ) { MomentPostLocation(momentEntity.location) - MomentPostTime(momentEntity.time.timeAgo()) + MomentPostTime(momentEntity.time.timeAgo(context)) } } } diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt index 7015618..c8c7626 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt @@ -49,6 +49,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -77,15 +78,12 @@ fun ProfilePage() { val model = MyProfileViewModel var expanded by remember { mutableStateOf(false) } LaunchedEffect(Unit) { - Log.d("ProfilePage", "loadProfile") model.loadProfile() } val moments = model.momentsFlow.collectAsLazyPagingItems() val navController: NavController = LocalNavController.current val scope = rememberCoroutineScope() val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues() - val navigationBarPaddings = - WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 48.dp LazyColumn( modifier = Modifier .fillMaxSize().padding(bottom = with(LocalDensity.current) { @@ -282,7 +280,7 @@ fun UserInformationFollowers(modifier: Modifier, accountProfileEntity: AccountPr ) Text( modifier = Modifier.padding(top = 5.dp), - text = "FOLLOWERS", + text = stringResource(R.string.followers_upper), fontSize = 12.sp, color = Color.Black, style = TextStyle(fontWeight = FontWeight.Bold) @@ -363,7 +361,7 @@ fun UserInformationFollowing(modifier: Modifier, accountProfileEntity: AccountPr ) Text( modifier = Modifier.padding(top = 5.dp), - text = "FOLLOWING", + text = stringResource(R.string.following_upper), fontSize = 12.sp, color = Color.Black, style = TextStyle(fontWeight = FontWeight.Bold) @@ -485,20 +483,6 @@ fun RidingStyleItem(styleContent: String) { } } -@Composable -fun UserMoment(scope: LazyListScope) { - - -// LazyColumn( -// modifier = Modifier -// .fillMaxWidth() -// .weight(1f) -// ){ -// -// -// } -} - @Composable fun MomentPostUnit(momentEntity: MomentEntity) { TimeGroup(momentEntity.time.formatPostTime()) diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/DiscoverScreen.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/DiscoverScreen.kt index 0f0fcff..a0371e3 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/DiscoverScreen.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/DiscoverScreen.kt @@ -66,7 +66,6 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController fun DiscoverScreen() { val model = DiscoverViewModel val navController = LocalNavController.current - val coroutineScope = rememberCoroutineScope() val systemUiController = rememberSystemUiController() val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues() val navigationBarPaddings = @@ -93,7 +92,7 @@ fun DiscoverScreen() { .fillMaxWidth() .padding(top = 16.dp, start = 24.dp, end = 24.dp), ) { - navController.navigate("Search") + navController.navigate(NavigationRoute.Search.route) } Box( modifier = Modifier @@ -112,6 +111,7 @@ fun SearchButton( modifier: Modifier = Modifier, clickAction: () -> Unit = {} ) { + val context = LocalContext.current Box( modifier = modifier .clip(shape = RoundedCornerShape(8.dp)) @@ -131,7 +131,7 @@ fun SearchButton( ) Box { Text( - text = "Search", + text = context.getString(R.string.search), modifier = Modifier.padding(start = 8.dp), color = Color(0xFF9E9E9E), fontSize = 18.sp diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/SearchScreen.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/SearchScreen.kt index 8968e2c..63815f6 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/SearchScreen.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/SearchScreen.kt @@ -51,6 +51,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.paging.compose.collectAsLazyPagingItems import com.aiosman.riderpro.LocalNavController +import com.aiosman.riderpro.R import com.aiosman.riderpro.entity.AccountProfileEntity import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.index.tabs.moment.MomentCard @@ -63,8 +64,9 @@ import kotlinx.coroutines.launch @Preview @Composable fun SearchScreen() { + val context = LocalContext.current val model = SearchViewModel - val categories = listOf("Moment", "User") + val categories = listOf(context.getString(R.string.moment), context.getString(R.string.users)) val coroutineScope = rememberCoroutineScope() val pagerState = rememberPagerState(pageCount = { categories.size }) val selectedTabIndex = remember { derivedStateOf { pagerState.currentPage } } @@ -139,6 +141,7 @@ fun SearchInput( onSearch: () -> Unit = {}, focusRequester: FocusRequester = remember { FocusRequester() } ) { + val context = LocalContext.current Box( modifier = modifier .clip(shape = RoundedCornerShape(8.dp)) @@ -156,7 +159,7 @@ fun SearchInput( Box { if (text.isEmpty()) { Text( - text = "Search", + text = context.getString(R.string.search), modifier = Modifier.padding(start = 8.dp), color = Color(0xFF9E9E9E), fontSize = 18.sp diff --git a/app/src/main/java/com/aiosman/riderpro/ui/like/LikePage.kt b/app/src/main/java/com/aiosman/riderpro/ui/like/LikePage.kt index 741cece..69c2b86 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/like/LikePage.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/like/LikePage.kt @@ -146,7 +146,7 @@ fun ActionNoticeItem( Text(nickName, fontWeight = FontWeight.Bold, fontSize = 16.sp) Spacer(modifier = Modifier.height(5.dp)) Row { - Text(likeTime.timeAgo(), fontSize = 12.sp, color = Color(0x99000000)) + Text(likeTime.timeAgo(context), fontSize = 12.sp, color = Color(0x99000000)) } } CustomAsyncImage( diff --git a/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt b/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt index 5597e2f..26ad1c9 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt @@ -600,7 +600,7 @@ fun CommentItem(commentEntity: CommentEntity, onLike: () -> Unit = {}) { ) { Text(text = commentEntity.name, fontWeight = FontWeight.Bold) Text(text = commentEntity.comment) - Text(text = commentEntity.date.timeAgo(), fontSize = 12.sp, color = Color.Gray) + Text(text = commentEntity.date.timeAgo(context), fontSize = 12.sp, color = Color.Gray) } Column( modifier = Modifier.width(64.dp), diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml new file mode 100644 index 0000000..985e977 --- /dev/null +++ b/app/src/main/res/values-zh/strings.xml @@ -0,0 +1,18 @@ + + + RiderPro + 世界 + %1d分钟前 + %1d秒前 + %1d天前 + %1d小时前 + %1d年前 + 搜索 + 动态 + 用户 + 点赞 + 关注者 + 收藏 + 消息 + 关注中 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cf9de1f..74b49b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,17 @@ RiderPro + Worldwide + %1d minute ago + %1d second ago + %1d days ago + %1d hour ago + %1d year ago + Search + Moment + Users + LIKE + FOLLOWERS + FAVOURITES + NOTIFICATIONS + FOLLOWING \ No newline at end of file