Skip to content

[Feat/#293] 영어 버전 앱 국제화를 진행합니다.#298

Merged
SYAAINN merged 14 commits intodevelopfrom
feat/#293-en-localization
Jul 15, 2025
Merged

[Feat/#293] 영어 버전 앱 국제화를 진행합니다.#298
SYAAINN merged 14 commits intodevelopfrom
feat/#293-en-localization

Conversation

@SYAAINN
Copy link
Contributor

@SYAAINN SYAAINN commented Jul 12, 2025

📌 ISSUE

closed #293

📄 Work Description

  • 영어 버전을 위한 구글 로그인 버튼 제작
  • strings.xml 한국어 -> 영어 번역
  • 영어 버전을 기본 리소스로 설정하여 시스템 언어 설정이 한국어가 아닐 경우 영어 버전
  • 일부 UI 수정
  • strings.xml 리소스 네이밍 수정 및 파일 내 코드 위치 정리
    • 화면 내 title이나 버튼 내 글자같은 일반적인 리소스
    • 다이얼로그, 토스트, 바텀시트 등 컴포넌트 속 리소스

✨ PR Point

strings.xml 파일의 구조를 보면 단일 화면에서만 쓰이는 일반적인 리소스들을 먼저 정의하고,
( 네이밍 : 화면명_기능설명 )
밑에는 다이얼로그나 바텀시트 등의 컴포넌트들에서 쓰이는 리소스들을 정의했습니다.
( 네이밍 : 컴포넌트명_(사용화면)_기능설명 )
어떤 공식 문서를 참고하거나 한게 아니라, 이렇게 하면 좋겠다 생각한 바대로 진행하다보니 중간중간 어.. 이래도 되는건가? 싶긴했는데 보고 편하게 피드백 주시면 감사하겠습니다 ㅜㅜ

추가로 파일 맨 밑에 기타로 빼놓은 리소스들은 추후 수정 가능성 있어보이는 것들이라 그렇게 해놨습니다!

📸 ScreenShot/Video

  • N/A

Summary by CodeRabbit

  • New Features

    • Added support for Google login alongside Kakao login, including a new Google sign-in button in the authentication UI.
    • Implemented locale-based selection for Terms of Service and Privacy Policy URLs, displaying the appropriate language version based on device settings.
    • Introduced Korean and English language support for all app UI text.
  • Enhancements

    • Updated button labels, dialog texts, and UI messages for improved clarity and consistency across the app.
    • Refined onboarding and settings flows with more descriptive and language-appropriate strings.
    • Improved UI spacing and replaced multiple logo images with a single, consistently sized logo in the login screen.
  • Bug Fixes

    • Corrected and unified string resource keys for better localization and maintainability.
  • Documentation

    • Added comprehensive Korean and English string resources for full localization coverage.

SYAAINN added 12 commits July 5, 2025 16:19
- 로그인 화면에서 스플래시 화면과 동일한 이미지 에셋을 활용하도록 변경합니다.
- 구글 로그인 버튼을 제작하고 영어 버전이면 구글 로그인 버튼을 표시하도록 합니다.
- 약관동의 화면에서 요소 간 간격 조절
- 가이드 화면에서 title, subtitle을 하나로 변경
- 웹뷰 한국어 링크, 영어 링크 분리 (기본 : 영어 링크)
- 영어 번역
- 일부 리소스 네이밍 변경
- 화면 내 리소스, 다이얼로그 등 컴포넌트 내 리소스 분리
- 불필요 리소스 삭제
- 일부 리소스 네이밍 변경
- 화면 내 리소스, 다이얼로그 등 컴포넌트 내 리소스 분리
- 불필요 리소스 삭제
- 일부 리소스 네이밍 변경
- 화면 내 리소스, 다이얼로그 등 컴포넌트 내 리소스 분리
- 불필요 리소스 삭제
- 일부 리소스 네이밍 변경
- 화면 내 리소스, 다이얼로그 등 컴포넌트 내 리소스 분리
- 불필요 리소스 삭제
@SYAAINN SYAAINN requested a review from MoonsuKang July 12, 2025 11:16
@SYAAINN SYAAINN self-assigned this Jul 12, 2025
@SYAAINN SYAAINN added ✨ FEAT 기능 개발 🔥 민재 민재 labels Jul 12, 2025
@coderabbitai
Copy link

coderabbitai bot commented Jul 12, 2025

"""

Walkthrough

This update introduces full English localization for the app, restructuring strings.xml as the default English resource and adding a comprehensive Korean resource file. Numerous UI components are updated to use new or renamed string resource keys. Additionally, locale-aware logic is introduced for URLs and terms, and initial support for Google login is added to the authentication flow.

Changes

File(s) Change Summary
app/src/main/res/values/strings.xml, app/src/main/res/values-ko/strings.xml Replaced default strings with English; added Korean localization; updated and renamed string keys.
.../auth/component/button/GoogleButton.kt Added new composable for Google login button and preview.
.../login/LoginContract.kt, .../login/LoginScreen.kt, .../login/LoginViewModel.kt Added Google login intent and handler; updated UI and callbacks for Google login support.
.../auth/guide/GuideScreen.kt Removed subtitle from onboarding data; updated button string keys.
.../auth/signup/page/NicknamePage.kt, .../auth/signup/page/TermsOfServicePage.kt Updated button string keys; made terms/privacy URLs locale-aware; adjusted spacers.
.../auth/timereminder/TimeReminderScreen.kt Updated button and skip text string keys.
.../component/FailureScreen.kt, .../component/bottomsheet/DiaryDeleteSheet.kt Updated button string keys.
.../component/dialog/FailureDialog.kt Updated dialog button string key.
.../component/timepicker/YearMonthPicker.kt, .../auth/component/timepicker/BottomSheetTimePicker.kt Updated picker title and button string keys.
.../diarylist/component/DailyDiaryCard.kt, .../diarylist/component/DiaryListTopAppBar.kt Updated diary list string resource keys.
.../diarylist/screen/DiaryListScreen.kt Updated diary delete dialog string keys.
.../home/calendar/component/DailyDiaryListItem.kt, .../home/component/CloverCount.kt Updated home screen string resource keys.
.../home/component/DiaryStateButton.kt, .../home/component/YearAndMonthTitle.kt Updated diary state and title string keys.
.../home/screen/HomeScreen.kt Updated all popup/dialog string resource keys.
.../replydiary/ReplyDiaryScreen.kt Updated reply dialog and title string keys.
.../replyloading/component/QuickReplyAdButton.kt, .../replyloading/screen/ReplyLoadingScreen.kt Updated loading and ad button string keys.
.../setting/component/AccountManagementLogoutOption.kt, .../setting/component/AccountManagementNicknameOption.kt, .../setting/component/AccountManagementRevokeOption.kt Updated account management button string keys.
.../setting/component/NicknameChangeBottomSheet.kt Updated nickname change bottom sheet string keys.
.../setting/notificationsetting/component/NotificationSettingTimePicker.kt, .../setting/notificationsetting/screen/NotificationSettingScreen.kt Updated notification setting string keys.
.../setting/screen/AccountManagementScreen.kt, .../setting/screen/SettingScreen.kt Updated toast/dialog string keys; introduced locale-aware URLs and renamed callbacks for settings.
.../setting/screen/SettingOptionUrls.kt Replaced URL singleton with enum for locale-aware URLs.
.../splash/SplashScreen.kt Updated update dialog string keys.
.../writediary/component/bottomsheet/DeleteWriteDiaryBottomSheet.kt, .../writediary/component/button/AddDiaryEntryFAB.kt, .../writediary/component/button/SendButton.kt Updated write diary button string keys.
.../writediary/screen/WriteDiaryScreen.kt Updated dialog and toast string keys.

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)
Loading

Assessment against linked issues

Objective Addressed Explanation
strings.xml 번역 및 개선 (#293)
영어 버전을 default(기본 리소스)로 설정, 한국어 버전은 대체 리소스 (#293)

Assessment against linked issues: Out-of-scope changes

Code Change (file_path) Explanation
Addition of Google login UI and intent (.../auth/component/button/GoogleButton.kt, .../login/LoginContract.kt, .../login/LoginScreen.kt, .../login/LoginViewModel.kt) Google login support is not mentioned in the linked issue, which is focused solely on localization.

Suggested labels

🌊 문수

Suggested reviewers

  • MoonsuKang

Poem

A bunny hops through code so bright,
Translating strings from day to night.
Now English leads, with Korean near,
Locale-aware, the path is clear!
And with a Google login hop,
This rabbit’s work will never stop.
🐰🌐✨
"""


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fdbe733 and eb7a018.

📒 Files selected for processing (3)
  • 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/button/KaKaoButton.kt (1 hunks)
  • app/src/main/java/com/sopt/clody/presentation/ui/login/LoginScreen.kt (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • app/src/main/java/com/sopt/clody/presentation/ui/auth/component/button/GoogleButton.kt
  • app/src/main/java/com/sopt/clody/presentation/ui/login/LoginScreen.kt
🔇 Additional comments (1)
app/src/main/java/com/sopt/clody/presentation/ui/auth/component/button/KaKaoButton.kt (1)

34-34: Excellent refactor for component reusability!

Removing the built-in .fillMaxWidth() and .padding(horizontal = 24.dp) modifiers and keeping only the essential .height(48.dp) is a great design improvement. This change:

  • Follows the separation of concerns principle by moving layout responsibilities to the parent component
  • Makes the KaKaoButton more flexible and reusable in different contexts
  • Aligns with modern Compose best practices where components should be as composable as possible

The external padding control (as mentioned in the AI summary for LoginScreen) provides better flexibility for different use cases.

✨ Finishing Touches
  • 📝 Generate Docstrings

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need 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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 efforts

A 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 displayMessage to the Text.

Remember to add failure_dialog_default_message to both values/ and values-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

message defaults to a literal Korean sentence, which defeats the intent of making English the default locale. Because stringResource() can’t be called as a default argument (it needs a CompositionLocal), 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_default to both values/strings.xml and values-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

amPmItems is 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_pm in both values/ (EN) and values-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

Icon is marked with contentDescription = 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 – move clickable to the entire row

Only the small “Revoke” text is interactive; UX guidelines recommend a 48 dp target. Apply the modifier to Row instead:

-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 placeholder

Using a hard-coded string resource like "%d.%d" (assuming that’s the value of home_year_month_format) may not respect locale-specific order, separators, or digit styles.
For internationalisation you can replace this with java.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 pulls dialog_soft_update_confirm:

Text(stringResource(R.string.dialog_soft_update_confirm))

For naming consistency (and possible future copy tweaks), consider introducing
dialog_hard_update_confirm and 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 from strings.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 / descriptionMassage in ClodyDialog are misspelt. If you ever touch that API again, renaming to titleMessage / descriptionMessage would 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 / descriptionMassage typos 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 / descriptionMassage are 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

📥 Commits

Reviewing files that changed from the base of the PR and between b9605b9 and fdbe733.

⛔ Files ignored due to path filters (4)
  • app/src/main/res/drawable-ko/img_splash_logo.png is excluded by !**/*.png
  • app/src/main/res/drawable-xhdpi/img_splash_logo.png is excluded by !**/*.png
  • app/src/main/res/drawable/img_google_button_logo.png is excluded by !**/*.png
  • app/src/main/res/drawable/img_splash_logo.png is 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 good

Key change to failure_dialog_btn_confirm is 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_next aligns 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_delete follows 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_entry matches 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_send is 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_refresh follows 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 correct

The new key bottom_sheet_diary_delete matches the naming guidelines; nothing else to address.

app/src/main/java/com/sopt/clody/presentation/ui/home/component/CloverCount.kt (1)

21-21: All home_total_clover strings include a single placeholder
Verified that both app/src/main/res/values/strings.xml and app/src/main/res/values-ko/strings.xml define home_total_clover with exactly one %1$d placeholder, matching the single cloverCount argument. 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_logout exists 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_button

No 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_change is 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_toast were 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 migration

Same comment as for the logout option – ensure account_management_btn_change_nickname is 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 leftovers

The renaming (time_reminder_btn_complete, time_reminder_btn_skip) looks good.
Please run Android-lint / gradlew :app:lintDebug after 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_month remain in the codebase.
  • The new key diary_list_selected_year_month is 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:76

All 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_confirm resolves 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_confirm between 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 locale

Both bottom_sheet_nickname_change_title and bottom_sheet_nickname_change_confirm are now the single source of truth for this bottom-sheet’s title and CTA.
Please double-check that

  1. They are defined in the default (English) strings.xml,
  2. They still exist in the Korean values-ko/strings.xml, and
  3. No dangling reference to the old keys remains elsewhere in the codebase.

A quick rg or 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_title and bottom_sheet_notification_time_change_confirm must exist in all values*/strings.xml.
Please run an IDE “Find Usage” or rg search 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 correct

All 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_open resolves 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_enabled message 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_title keeps the %s placeholder 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_next follows 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 SettingOptionUrls

The SettingOptionUrls enum defines both enUrl and krUrl as non-nullable String parameters, 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:

  1. Well-organized structure with clear section comments for different app screens
  2. Consistent naming convention that aligns with the updated English resource keys
  3. Proper Korean formatting for dates, times, and cultural conventions
  4. Appropriate use of placeholders for dynamic content (%1$s, %1$d)
  5. 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 body2SemiBold typography while the existing KaKaoButton (from app/src/main/java/com/sopt/clody/presentation/ui/auth/component/button/KaKaoButton.kt line 32) uses body1SemiBold. 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_logo with 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_description pattern
  • Natural English translations appropriate for UI context
  • Proper addition of new strings like signup_btn_google for new features
  • Good categorization of general resources, dialogs, toasts, and bottom sheets

This provides a solid foundation for the app's internationalization.

Comment on lines +95 to +96
private suspend fun loginWithGoogle(context: Context) {
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Suggested change
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.

Comment on lines 56 to 60
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,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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:

  1. Add an English helper (toEnglishShortLabel()) and use the correct one based on Locale.
  2. Pass the raw DayOfWeek and let the string resource handle localisation via %1$tA formatting.

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.

Copy link
Contributor

@MoonsuKang MoonsuKang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다~
언어 분기하는것에 대한 생각:
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),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P5
없애도 똑같지 않을까염?
그리고 만약 내부여백이 필요하면
contentPadding = PaddingValues(horizontal = 24.dp)
요게 더 좋을 것 같습니다잉

) {
val systemUiController = rememberSystemUiController()
val backgroundColor = ClodyTheme.colors.white
val currentLang = Locale.getDefault().language
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P5
요건 아까 이야기 나놨던 방식으로 해보죠~

@SYAAINN SYAAINN merged commit 2945955 into develop Jul 15, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ FEAT 기능 개발 🔥 민재 민재

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 영어 버전 앱 국제화를 진행합니다.

2 participants