Conversation
- 로그인 화면에서 스플래시 화면과 동일한 이미지 에셋을 활용하도록 변경합니다. - 구글 로그인 버튼을 제작하고 영어 버전이면 구글 로그인 버튼을 표시하도록 합니다.
- 약관동의 화면에서 요소 간 간격 조절 - 가이드 화면에서 title, subtitle을 하나로 변경
- 웹뷰 한국어 링크, 영어 링크 분리 (기본 : 영어 링크) - 영어 번역
- 일부 리소스 네이밍 변경 - 화면 내 리소스, 다이얼로그 등 컴포넌트 내 리소스 분리 - 불필요 리소스 삭제
- 일부 리소스 네이밍 변경 - 화면 내 리소스, 다이얼로그 등 컴포넌트 내 리소스 분리 - 불필요 리소스 삭제
- 일부 리소스 네이밍 변경 - 화면 내 리소스, 다이얼로그 등 컴포넌트 내 리소스 분리 - 불필요 리소스 삭제
- 일부 리소스 네이밍 변경 - 화면 내 리소스, 다이얼로그 등 컴포넌트 내 리소스 분리 - 불필요 리소스 삭제
|
""" WalkthroughThis update introduces full English localization for the app, restructuring Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant LoginScreen
participant LoginViewModel
User->>LoginScreen: Tap Google login button
LoginScreen->>LoginViewModel: Send LoginWithGoogle intent
LoginViewModel->>LoginViewModel: handleIntent(LoginWithGoogle)
LoginViewModel->>LoginViewModel: loginWithGoogle(context)
Note right of LoginViewModel: (Implementation pending)
Assessment against linked issues
Assessment against linked issues: Out-of-scope changes
Suggested labels
Suggested reviewers
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (2)
🔇 Additional comments (1)
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 2
🔭 Outside diff range comments (3)
app/src/main/java/com/sopt/clody/presentation/ui/component/dialog/FailureDialog.kt (1)
34-36: Hard-coded default message breaks new i18n effortsA literal Korean string is still embedded as the default
message. With English now the fallback locale, this text will surface untranslated on non-Korean devices.-fun FailureDialog( - message: String = "일시적인 오류가 발생했어요.\n잠시 후 다시 시도해주세요.", +fun FailureDialog( + /* Pass `null` to fall back on a localized default string inside the body */ + message: String? = null,And inside the composable (right before
Text(message)):val displayMessage = message ?: stringResource(R.string.failure_dialog_default_message)Then bind
displayMessageto theText.Remember to add
failure_dialog_default_messageto bothvalues/andvalues-ko/files.app/src/main/java/com/sopt/clody/presentation/ui/component/FailureScreen.kt (1)
29-31: Hard-coded Korean fallback breaks new English default – externalize the string
messagedefaults to a literal Korean sentence, which defeats the intent of making English the default locale. BecausestringResource()can’t be called as a default argument (it needs aCompositionLocal), prefer a nullable parameter and perform the fallback inside the composable:-fun FailureScreen( - message: String = "일시적인 오류가 발생했어요.\n잠시 후 다시 시도해주세요.", +fun FailureScreen( + message: String? = null, ... ) { ... - Text( - text = message, + Text( + text = message ?: stringResource(R.string.failure_screen_msg_default),Add
failure_screen_msg_defaultto bothvalues/strings.xmlandvalues-ko/strings.xml.app/src/main/java/com/sopt/clody/presentation/ui/setting/notificationsetting/component/NotificationSettingTimePicker.kt (1)
39-42: Hard-coded “오전/오후” breaks English localisation
amPmItemsis still populated with the Korean literals"오전"and"오후".
With English now the default, users will see mixed-language UI.- val amPmItems = remember { listOf("오전", "오후") } + val amPmItems = remember { + listOf( + stringResource(R.string.timepicker_am), // "AM" + stringResource(R.string.timepicker_pm), // "PM" + ) + }You’ll need to create
timepicker_am/timepicker_pmin bothvalues/(EN) andvalues-ko/.
🧹 Nitpick comments (10)
app/src/main/java/com/sopt/clody/presentation/ui/replyloading/component/QuickReplyAdButton.kt (1)
38-45: Add a content description for accessibility
Iconis marked withcontentDescription = null, but the graphic is actionable (the whole chip is clickable). Screen-reader users won’t get any context. Provide a localized description:-Icon( - painter = painterResource(id = R.drawable.ic_replyloading_player), - contentDescription = null, +Icon( + painter = painterResource(id = R.drawable.ic_replyloading_player), + contentDescription = stringResource(R.string.reply_loading_ic_player_desc),app/src/main/java/com/sopt/clody/presentation/ui/setting/component/AccountManagementRevokeOption.kt (1)
31-37: Enlarge tap target – moveclickableto the entire rowOnly the small “Revoke” text is interactive; UX guidelines recommend a 48 dp target. Apply the modifier to
Rowinstead:-Row( - modifier = Modifier.padding(24.dp), -) { +Row( + modifier = Modifier + .fillMaxWidth() + .clickable( + onClick = { updateRevokeDialog(true) }, + indication = null, + interactionSource = remember { MutableInteractionSource() }, + ) + .padding(24.dp), +) { ... - Text( - text = stringResource(R.string.account_management_btn_revoke), - modifier = Modifier.clickable( - onClick = { updateRevokeDialog(true) }, - indication = null, - interactionSource = remember { MutableInteractionSource() }, - ), + Text( + text = stringResource(R.string.account_management_btn_revoke), color = ClodyTheme.colors.gray05, style = ClodyTheme.typography.body4Medium, )app/src/main/java/com/sopt/clody/presentation/ui/home/component/YearAndMonthTitle.kt (1)
26-26: Consider locale-aware date formatting instead of string placeholderUsing a hard-coded string resource like
"%d.%d"(assuming that’s the value ofhome_year_month_format) may not respect locale-specific order, separators, or digit styles.
For internationalisation you can replace this withjava.time:-val text = stringResource(R.string.home_year_month_format, selectedYear, selectedMonth) +val locale = LocalConfiguration.current.locales[0] +val text = YearMonth.of(selectedYear, selectedMonth) + .format(DateTimeFormatter.ofPattern("yyyy MMMM", locale))This automatically honours RTL languages, month names, etc.
app/src/main/java/com/sopt/clody/presentation/ui/splash/SplashScreen.kt (1)
152-160: Confirm button in Hard-update dialog still uses Soft-update key
HardUpdateDialog’s confirm button pullsdialog_soft_update_confirm:Text(stringResource(R.string.dialog_soft_update_confirm))For naming consistency (and possible future copy tweaks), consider introducing
dialog_hard_update_confirmand switching to it.- Text(stringResource(R.string.dialog_soft_update_confirm)) + Text(stringResource(R.string.dialog_hard_update_confirm))Minor, but keeps the resource taxonomy tidy.
app/src/main/java/com/sopt/clody/presentation/ui/diarylist/component/DailyDiaryCard.kt (2)
79-83: Localise the content-description string.
contentDescription = "clover"is user-visible in accessibility services.
Pull this text fromstrings.xml(e.g.@string/desc_clover_icon) so screen-reader users get the correct language.
181-186: Same for the kebab-menu icon.
contentDescription = "kebab menu"should also be a localised string resource.app/src/main/java/com/sopt/clody/presentation/ui/diarylist/screen/DiaryListScreen.kt (1)
198-204: Resource-key swap LGTM – consider the “Massage” typo.The dialog now references the new
dialog_diary_delete_*keys correctly – looks good.Unrelated but visible here: the named parameters
titleMassage / descriptionMassageinClodyDialogare misspelt. If you ever touch that API again, renaming totitleMessage / descriptionMessagewould remove the long-standing typo.app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt (1)
240-244: Dialog keys swapped in – only the typo comment applies.Like earlier:
titleMassage / descriptionMassagetypos persist. Worth cleaning across the codebase when feasible.app/src/main/java/com/sopt/clody/presentation/ui/replydiary/ReplyDiaryScreen.kt (1)
190-193: Dialog resource keys migrated – typo persists.Strings are hooked up properly, but again the parameter names
titleMassage / descriptionMassageare misspelt.app/src/main/java/com/sopt/clody/presentation/ui/setting/screen/SettingScreen.kt (1)
33-37: Functional locale-based URL selection with room for improvement.The current implementation works well for Korean/English support. However, the simple "ko" check with English fallback may not scale well for future internationalization efforts.
Consider using a more robust locale handling approach:
- val currentLang = Locale.getDefault().language - val notice = if (currentLang == "ko") SettingOptionUrls.NOTICES_URL.krUrl else SettingOptionUrls.NOTICES_URL.enUrl + fun getLocalizedUrl(urls: SettingOptionUrls): String { + return when (Locale.getDefault().language) { + "ko" -> urls.krUrl + else -> urls.enUrl + } + } + val notice = getLocalizedUrl(SettingOptionUrls.NOTICES_URL)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (4)
app/src/main/res/drawable-ko/img_splash_logo.pngis excluded by!**/*.pngapp/src/main/res/drawable-xhdpi/img_splash_logo.pngis excluded by!**/*.pngapp/src/main/res/drawable/img_google_button_logo.pngis excluded by!**/*.pngapp/src/main/res/drawable/img_splash_logo.pngis excluded by!**/*.png
📒 Files selected for processing (40)
app/src/main/java/com/sopt/clody/presentation/ui/auth/component/button/GoogleButton.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/auth/component/timepicker/BottomSheetTimePicker.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/auth/guide/GuideScreen.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/auth/signup/page/NicknamePage.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/auth/signup/page/TermsOfServicePage.kt(4 hunks)app/src/main/java/com/sopt/clody/presentation/ui/auth/timereminder/TimeReminderScreen.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/component/FailureScreen.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/component/bottomsheet/DiaryDeleteSheet.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/component/dialog/FailureDialog.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/component/timepicker/YearMonthPicker.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/diarylist/component/DailyDiaryCard.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/diarylist/component/DiaryListTopAppBar.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/diarylist/screen/DiaryListScreen.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/home/calendar/component/DailyDiaryListItem.kt(3 hunks)app/src/main/java/com/sopt/clody/presentation/ui/home/component/CloverCount.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/home/component/DiaryStateButton.kt(5 hunks)app/src/main/java/com/sopt/clody/presentation/ui/home/component/YearAndMonthTitle.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt(5 hunks)app/src/main/java/com/sopt/clody/presentation/ui/login/LoginContract.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/login/LoginScreen.kt(7 hunks)app/src/main/java/com/sopt/clody/presentation/ui/login/LoginViewModel.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/replydiary/ReplyDiaryScreen.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/replyloading/component/QuickReplyAdButton.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/replyloading/screen/ReplyLoadingScreen.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/component/AccountManagementLogoutOption.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/component/AccountManagementNicknameOption.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/component/AccountManagementRevokeOption.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/component/NicknameChangeBottomSheet.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/notificationsetting/component/NotificationSettingTimePicker.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/notificationsetting/screen/NotificationSettingScreen.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/screen/AccountManagementScreen.kt(3 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/screen/SettingOptionUrls.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/setting/screen/SettingScreen.kt(5 hunks)app/src/main/java/com/sopt/clody/presentation/ui/splash/SplashScreen.kt(2 hunks)app/src/main/java/com/sopt/clody/presentation/ui/writediary/component/bottomsheet/DeleteWriteDiaryBottomSheet.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/writediary/component/button/AddDiaryEntryFAB.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/writediary/component/button/SendButton.kt(1 hunks)app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryScreen.kt(4 hunks)app/src/main/res/values-ko/strings.xml(1 hunks)app/src/main/res/values/strings.xml(1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (3)
app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt (1)
app/src/main/java/com/sopt/clody/presentation/ui/component/button/ClodyButton.kt (1)
ClodyButton(15-44)
app/src/main/java/com/sopt/clody/presentation/ui/auth/signup/page/TermsOfServicePage.kt (2)
app/src/main/java/com/sopt/clody/presentation/ui/home/calendar/component/HorizontalDivider.kt (1)
HorizontalDivider(14-26)app/src/main/java/com/sopt/clody/presentation/ui/setting/navigation/SettingNavigation.kt (1)
navigateToWebView(66-71)
app/src/main/java/com/sopt/clody/presentation/ui/login/LoginScreen.kt (1)
app/src/main/java/com/sopt/clody/presentation/ui/auth/component/button/KaKaoButton.kt (1)
KaKaoButton(26-59)
🪛 detekt (1.23.8)
app/src/main/java/com/sopt/clody/presentation/ui/login/LoginViewModel.kt
[warning] 95-96: This empty block of code can be removed.
(detekt.empty-blocks.EmptyFunctionBlock)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (43)
app/src/main/java/com/sopt/clody/presentation/ui/component/dialog/FailureDialog.kt (1)
86-88: Resource-key rename looks goodKey change to
failure_dialog_btn_confirmis consistent with the new naming scheme.app/src/main/java/com/sopt/clody/presentation/ui/auth/signup/page/NicknamePage.kt (1)
89-90: Consistent resource key – no further action
nickname_btn_nextaligns with the new convention; behaviour untouched.app/src/main/java/com/sopt/clody/presentation/ui/writediary/component/bottomsheet/DeleteWriteDiaryBottomSheet.kt (1)
64-67: Resource key updated correctly
bottom_sheet_diary_deletefollows the refactor; implementation unchanged.app/src/main/java/com/sopt/clody/presentation/ui/writediary/component/button/AddDiaryEntryFAB.kt (1)
89-92: Key rename acknowledged
write_diary_fab_add_entrymatches new naming pattern; no issues spotted.app/src/main/java/com/sopt/clody/presentation/ui/writediary/component/button/SendButton.kt (1)
38-41: Send button text key updated correctly
write_diary_btn_sendis consistent; nothing else changed.app/src/main/java/com/sopt/clody/presentation/ui/component/FailureScreen.kt (1)
62-62: String-key rename looks good
failure_screen_btn_refreshfollows the new_btn_convention and the call site is correct.app/src/main/java/com/sopt/clody/presentation/ui/component/bottomsheet/DiaryDeleteSheet.kt (1)
75-76: Resource key update aligned and correctThe new key
bottom_sheet_diary_deletematches the naming guidelines; nothing else to address.app/src/main/java/com/sopt/clody/presentation/ui/home/component/CloverCount.kt (1)
21-21: Allhome_total_cloverstrings include a single placeholder
Verified that both app/src/main/res/values/strings.xml and app/src/main/res/values-ko/strings.xml definehome_total_cloverwith exactly one%1$dplaceholder, matching the singlecloverCountargument. No further changes needed.app/src/main/java/com/sopt/clody/presentation/ui/setting/component/AccountManagementLogoutOption.kt (1)
44-45: Resources updated correctly—obsolete key removed
- Verified new
account_management_btn_logoutexists in:
- app/src/main/res/values/strings.xml (line 97)
- app/src/main/res/values-ko/strings.xml (line 97)
- Confirmed no remaining references to
account_management_logout_buttonNo further action required.
app/src/main/java/com/sopt/clody/presentation/ui/setting/notificationsetting/screen/NotificationSettingScreen.kt (1)
80-89: Toast resource ID verified and old ID removed
toast_notification_setting_time_changeis defined in:
- app/src/main/res/values/strings.xml
- app/src/main/res/values-ko/strings.xml
- No remaining references to
notification_setting_change_success_toastwere found.All locales are covered and the old ID is fully removed—this is good to merge.
app/src/main/java/com/sopt/clody/presentation/ui/setting/component/AccountManagementNicknameOption.kt (1)
46-47: Synchronise resource migrationSame comment as for the logout option – ensure
account_management_btn_change_nicknameis defined for all locales and delete the old key to prevent confusion.app/src/main/java/com/sopt/clody/presentation/ui/auth/timereminder/TimeReminderScreen.kt (1)
148-167: Button & skip text ids updated – run lint to catch leftoversThe renaming (
time_reminder_btn_complete,time_reminder_btn_skip) looks good.
Please run Android-lint /gradlew :app:lintDebugafter the rename; it will flag any unreplaced usages and missing translations early.app/src/main/java/com/sopt/clody/presentation/ui/diarylist/component/DiaryListTopAppBar.kt (1)
53-53: Consistent string resource rename confirmed
- No occurrences of
diarylist_selected_year_monthremain in the codebase.- The new key
diary_list_selected_year_monthis used in
•app/src/main/java/com/sopt/clody/presentation/ui/diarylist/component/DiaryListTopAppBar.kt:53- Definitions exist in
•app/src/main/res/values/strings.xml:76
•app/src/main/res/values-ko/strings.xml:76All references have been updated. Good to merge.
app/src/main/java/com/sopt/clody/presentation/ui/auth/component/timepicker/BottomSheetTimePicker.kt (2)
76-76: Good naming convention improvement.The
bottom_sheet_prefix properly categorizes this string resource for bottom sheet components.
146-146: Semantic verification: “Done” is a suitable, context-agnostic label for confirmation
- The string
bottom_sheet_year_month_picker_btn_confirmresolves to “Done” (완료 in Korean).- It’s only referenced in the year/month and time picker bottom sheets.
- “Done” functions as a generic confirmation across both components, so no change is needed.
app/src/main/java/com/sopt/clody/presentation/ui/login/LoginContract.kt (1)
15-15: LGTM! Clean integration following established patterns.The Google login intent addition follows the same pattern as the existing Kakao login intent, maintaining consistency in the contract design.
app/src/main/java/com/sopt/clody/presentation/ui/component/timepicker/YearMonthPicker.kt (2)
72-72: Good naming convention alignment.The
bottom_sheet_prefix properly categorizes this resource and aligns with the broader naming convention improvements.
136-136: Consistent resource sharing pattern.This confirms the shared usage of
bottom_sheet_year_month_picker_btn_confirmbetween time picker and year/month picker components, which is appropriate if they use identical confirmation text.app/src/main/java/com/sopt/clody/presentation/ui/login/LoginViewModel.kt (1)
49-49: Intent handling properly integrated.The Google login intent is correctly handled in the when expression, maintaining consistency with the existing pattern.
app/src/main/java/com/sopt/clody/presentation/ui/setting/component/NicknameChangeBottomSheet.kt (1)
86-91: Verify that the renamed string IDs exist in every localeBoth
bottom_sheet_nickname_change_titleandbottom_sheet_nickname_change_confirmare now the single source of truth for this bottom-sheet’s title and CTA.
Please double-check that
- They are defined in the default (English)
strings.xml,- They still exist in the Korean
values-ko/strings.xml, and- No dangling reference to the old keys remains elsewhere in the codebase.
A quick
rgor IDE-wide search will catch misses before CI does.Also applies to: 162-167
app/src/main/java/com/sopt/clody/presentation/ui/setting/notificationsetting/component/NotificationSettingTimePicker.kt (1)
69-74: Same diligence as above—confirm new IDs are declared
bottom_sheet_notification_time_change_titleandbottom_sheet_notification_time_change_confirmmust exist in allvalues*/strings.xml.
Please run an IDE “Find Usage” orrgsearch to purge legacy keys (time_picker_title,notification_setting_timepicker_confirm).Also applies to: 147-149
app/src/main/java/com/sopt/clody/presentation/ui/home/component/DiaryStateButton.kt (1)
34-35: String-ID renames look correctAll button labels point to the new
home_btn_*keys, matching the naming convention introduced in this PR. No functional impact detected.Also applies to: 44-45, 54-55, 63-64, 72-73
app/src/main/java/com/sopt/clody/presentation/ui/diarylist/component/DailyDiaryCard.kt (1)
88-96: Updated keys look correct – no functional issues detected.The new
diary_list_*resource IDs compile, resolve correctly, and keep the runtime behaviour intact.
Nice job aligning them with the new naming convention.app/src/main/java/com/sopt/clody/presentation/ui/replyloading/screen/ReplyLoadingScreen.kt (2)
182-185: New string IDs compile & behave as intended.The three phase-messages now use dedicated keys (
reply_loading_*_description) – clearer separation, no logic change. ✔️
220-221: Button label key updated correctly.
reply_loading_btn_openresolves and the named-argument call order is still valid.
Nothing else to flag.app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt (3)
175-211: Bottom-sheet strings updated – all good.Every new
bottom_sheet_home_initial_draft_*key is referenced correctly. No runtime impact.
224-229: Toast string key updated – no issues.The toast displays the new
toast_home_draft_alarm_enabledmessage without behavioural changes.
269-272: Diary-delete dialog keys migrated – works as expected.All four
dialog_diary_delete_*keys are wired up correctly. 👍app/src/main/java/com/sopt/clody/presentation/ui/replydiary/ReplyDiaryScreen.kt (1)
155-156: Key rename is correct; placeholder still intact.
reply_titlekeeps the%splaceholder for the nickname – verified, no formatting issues.app/src/main/java/com/sopt/clody/presentation/ui/setting/screen/AccountManagementScreen.kt (1)
177-177: LGTM! Systematic string resource key improvements.The string resource key updates follow a consistent naming convention (
toast_*,dialog_*) which improves maintainability and makes resource organization more intuitive. This aligns well with the broader internationalization effort.Also applies to: 189-192, 203-206
app/src/main/java/com/sopt/clody/presentation/ui/auth/guide/GuideScreen.kt (1)
103-105: LGTM! Clear button text resource naming.Adding the
btn_prefix to button text resources (guide_btn_next,guide_btn_start) makes the resource purpose explicit and aligns with the systematic naming convention being applied throughout the app.app/src/main/java/com/sopt/clody/presentation/ui/writediary/screen/WriteDiaryScreen.kt (1)
284-287: LGTM! Improved dialog and toast resource organization.The string resource updates follow a systematic approach:
- Dialog resources now consistently use
dialog_*prefix for better grouping- Toast messages have more descriptive, context-specific names (
toast_write_diary_entry_*)This enhances maintainability and makes the resource structure more intuitive.
Also applies to: 303-306, 359-359, 370-370
app/src/main/java/com/sopt/clody/presentation/ui/auth/signup/page/TermsOfServicePage.kt (2)
76-76: LGTM! Consistent resource naming and improved spacing.The button text resource update to
terms_btn_nextfollows the systematic naming convention. The spacing adjustments (18dp, 24dp) improve the visual hierarchy of the terms agreement section.Also applies to: 113-113, 122-122
49-52: No null-safety issues with SettingOptionUrlsThe
SettingOptionUrlsenum defines bothenUrlandkrUrlas non-nullableStringparameters, and each entry provides concrete URL literals. The Kotlin type system guarantees these values can’t be null at runtime.resolve_review_comment
app/src/main/res/values-ko/strings.xml (2)
1-196: Excellent Korean localization implementation.This comprehensive Korean resource file demonstrates several strengths:
- Well-organized structure with clear section comments for different app screens
- Consistent naming convention that aligns with the updated English resource keys
- Proper Korean formatting for dates, times, and cultural conventions
- Appropriate use of placeholders for dynamic content (
%1$s,%1$d)- Natural Korean translations that maintain the app's tone and user experience
The organization by usage context (login, onboarding, home, etc.) makes maintenance straightforward.
7-7: Verify intentional English text in Korean locale.The Google login button text remains in English (
"Sign Up With Google") even in the Korean resource file. Please confirm this is intentional for brand consistency or if it should be localized to Korean.app/src/main/java/com/sopt/clody/presentation/ui/setting/screen/SettingOptionUrls.kt (1)
3-23: Excellent internationalization approach for URL management.The enum class design cleanly separates language-specific URLs and provides a maintainable structure for internationalization. The implementation is well-structured and follows good practices.
app/src/main/java/com/sopt/clody/presentation/ui/auth/component/button/GoogleButton.kt (2)
26-59: Good implementation following established patterns.The GoogleButton composable is well-structured and follows the same layout pattern as the existing KaKaoButton.
54-54: Verify typography consistency with KaKaoButton.The GoogleButton uses
body2SemiBoldtypography while the existing KaKaoButton (fromapp/src/main/java/com/sopt/clody/presentation/ui/auth/component/button/KaKaoButton.ktline 32) usesbody1SemiBold. Ensure this difference is intentional for design consistency.app/src/main/java/com/sopt/clody/presentation/ui/login/LoginScreen.kt (3)
63-64: Good separation of login callbacks for different providers.The updated composable signature properly separates Kakao and Google login callbacks, providing clear separation of concerns for different authentication providers.
94-112: Appropriate staged implementation for Google login.The commented-out language-based login button switching logic provides a clear path for future Google login activation while keeping the current Kakao-only flow stable. This staged approach is prudent for feature rollout.
132-135: Simplified logo implementation.The change from multiple logo images to a single
img_splash_logowith explicit sizing improves maintainability and consistency.app/src/main/res/values/strings.xml (1)
1-196: Comprehensive and well-organized English localization.The English translation of the strings.xml file is thorough and well-structured:
- Clear usage-based organization with helpful comments
- Consistent naming conventions following
screen_component_descriptionpattern- Natural English translations appropriate for UI context
- Proper addition of new strings like
signup_btn_googlefor new features- Good categorization of general resources, dialogs, toasts, and bottom sheets
This provides a solid foundation for the app's internationalization.
| private suspend fun loginWithGoogle(context: Context) { | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Implement Google login or add TODO documentation.
The empty loginWithGoogle function creates a misleading impression that Google login is supported. Consider either implementing the functionality or adding a TODO comment to clarify the incomplete state.
private suspend fun loginWithGoogle(context: Context) {
+ // TODO: Implement Google login functionality
+ // Similar to loginWithKakao implementation
}Would you like me to help draft the Google login implementation based on the existing Kakao login pattern, or would you prefer to track this as a separate issue?
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private suspend fun loginWithGoogle(context: Context) { | |
| } | |
| private suspend fun loginWithGoogle(context: Context) { | |
| // TODO: Implement Google login functionality | |
| // Similar to loginWithKakao implementation | |
| } |
🧰 Tools
🪛 detekt (1.23.8)
[warning] 95-96: This empty block of code can be removed.
(detekt.empty-blocks.EmptyFunctionBlock)
🤖 Prompt for AI Agents
In app/src/main/java/com/sopt/clody/presentation/ui/login/LoginViewModel.kt at
lines 95-96, the loginWithGoogle function is currently empty, which may mislead
about Google login support. To fix this, either implement the Google login logic
following the existing Kakao login pattern or add a clear TODO comment inside
the function indicating that the implementation is pending and will be added
later.
| text = stringResource( | ||
| id = R.string.daily_diary_day_of_week_format, | ||
| id = R.string.home_daily_diary_day_of_week, | ||
| dayOfWeek.toKoreanShortLabel(), | ||
| ), | ||
| style = ClodyTheme.typography.body2Medium, |
There was a problem hiding this comment.
🛠️ Refactor suggestion
toKoreanShortLabel() is now mismatched with EN default
dayOfWeek.toKoreanShortLabel() returns a Korean char (월/화/…).
With English resources active, the format string home_daily_diary_day_of_week will produce something like "Mon (월)" rather than "Mon".
Options:
- Add an English helper (
toEnglishShortLabel()) and use the correct one based onLocale. - Pass the raw
DayOfWeekand let the string resource handle localisation via%1$tAformatting.
Either way, avoid hard-coding Korean when the app runs in EN.
🤖 Prompt for AI Agents
In
app/src/main/java/com/sopt/clody/presentation/ui/home/calendar/component/DailyDiaryListItem.kt
around lines 56 to 60, the use of dayOfWeek.toKoreanShortLabel() hardcodes
Korean characters which causes incorrect display when the app locale is English.
To fix this, either implement a toEnglishShortLabel() method and select the
label based on the current Locale, or pass the raw DayOfWeek object to the
string resource and use locale-aware formatting like %1$tA to let the resource
handle localization properly. This will ensure the day of week displays
correctly in both Korean and English locales.
MoonsuKang
left a comment
There was a problem hiding this comment.
수고하셨습니다~
언어 분기하는것에 대한 생각:
Provider Pattern을 도입하면 Context 의존성과 중복 분기를 제거할 수 있어서 적용하는게 나중에 생각해도 좋아보임다.
예시를 보여드리자면,
interface LanguageProvider {
fun getLoginType(): LoginType
fun getWebViewLink(): String
fun getNicknameMaxLength(): Int
}class LanguageProviderImpl @Inject constructor(
@ApplicationContext private val context: Context,
) : LanguageProvider {
private val locale: Locale
get() = context.resources.configuration.locales[0]
private fun isKorean(): Boolean = locale.language == "ko"
override fun getLoginType(): LoginType {
return if (isKorean()) LoginType.KAKAO else LoginType.GOOGLE
}
override fun getWebViewLink(): String {
return ""
}
override fun getNicknameMaxLength(): Int {
return if (isKorean()) 8 else 15
}
}이런식으로 구현해서 싱글톤으로 주입받아 사용하면 ViewModel이나 도메인 계층에서 분기처리를 할 수 있을 것 같습니다잉.
그래서 만약 다른게 추가된다? 그러면 Provider만 수정하면 되니까 OCP도 잘 지킬 수 있을 것 같아유
| modifier = modifier | ||
| .fillMaxWidth() | ||
| .height(48.dp) | ||
| .padding(horizontal = 24.dp), |
There was a problem hiding this comment.
P5
없애도 똑같지 않을까염?
그리고 만약 내부여백이 필요하면
contentPadding = PaddingValues(horizontal = 24.dp)
요게 더 좋을 것 같습니다잉
| ) { | ||
| val systemUiController = rememberSystemUiController() | ||
| val backgroundColor = ClodyTheme.colors.white | ||
| val currentLang = Locale.getDefault().language |
There was a problem hiding this comment.
P5
요건 아까 이야기 나놨던 방식으로 해보죠~
📌 ISSUE
closed #293
📄 Work Description
✨ PR Point
strings.xml 파일의 구조를 보면 단일 화면에서만 쓰이는 일반적인 리소스들을 먼저 정의하고,
( 네이밍 :
화면명_기능설명)밑에는 다이얼로그나 바텀시트 등의 컴포넌트들에서 쓰이는 리소스들을 정의했습니다.
( 네이밍 :
컴포넌트명_(사용화면)_기능설명)어떤 공식 문서를 참고하거나 한게 아니라, 이렇게 하면 좋겠다 생각한 바대로 진행하다보니 중간중간 어.. 이래도 되는건가? 싶긴했는데 보고 편하게 피드백 주시면 감사하겠습니다 ㅜㅜ
추가로 파일 맨 밑에 기타로 빼놓은 리소스들은 추후 수정 가능성 있어보이는 것들이라 그렇게 해놨습니다!
📸 ScreenShot/Video
Summary by CodeRabbit
New Features
Enhancements
Bug Fixes
Documentation