Feature/#45 - 온보딩/잠금 네비게이션 라우팅 및 OnboardingStatusClient 구현 - #52
Conversation
Walkthrough온보딩 완료 상태를 UserDefaults에 저장하고 TCA 의존성으로 연결했습니다. 앱은 상태에 따라 온보딩, 잠금, 메인 화면을 전환하며, 관련 화면·윈도우·로컬라이즈 설정을 갱신합니다. Changes온보딩 상태 저장과 의존성 연결
온보딩·잠금 상태 전환
온보딩 화면과 앱 화면 분기
앱 셸 및 표시 리소스
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant AppFeature
participant OnboardingStatusClient
participant OnboardingContainerFeature
participant OnboardingFeature
participant LockFeature
AppFeature->>OnboardingStatusClient: hasCompleted()
OnboardingStatusClient-->>AppFeature: 완료 여부 반환
AppFeature->>OnboardingContainerFeature: 온보딩 상태 설정
OnboardingContainerFeature->>OnboardingFeature: 단계 액션 전달
OnboardingFeature-->>OnboardingContainerFeature: completed
OnboardingContainerFeature->>LockFeature: 잠금 상태 생성
LockFeature-->>OnboardingContainerFeature: unlockCompleted
OnboardingContainerFeature-->>AppFeature: completed
AppFeature->>OnboardingStatusClient: setCompleted()
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (3 warnings)
✅ Passed checks (2 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (3)
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift (1)
15-15: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value스토어 접근 범위를 최소화하세요.
각 View는
init(store:)로만 Store를 주입받고 파일 내부에서만 사용하므로@Bindable private var store로 제한하세요.MainView는 기존 호출 형태를 유지하도록 내부init(store:)를 명시적으로 추가하면 됩니다.
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift#L15-L15:public을 제거하고private으로 제한하세요.
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingContainerView.swift#L14-L14:public을 제거하고private으로 제한하세요.
Projects/DVPresentation/Sources/Features/Lock/LockView.swift#L14-L14:public을 제거하고private으로 제한하세요.
Projects/DVPresentation/Sources/Features/Main/MainView.swift#L14-L14:private으로 제한하고 필요한init(store:)를 추가하세요.As per path instructions, "접근 제어가 가능한 가장 엄격한 수준인지 확인하세요."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift` at line 15, 스토어 접근 범위를 각 View 파일 내부로 제한하세요. Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift:15-15의 OnboardingView, Projects/DVPresentation/Sources/Features/Onboarding/OnboardingContainerView.swift:14-14의 OnboardingContainerView, Projects/DVPresentation/Sources/Features/Lock/LockView.swift:14-14의 LockView에서 `@Bindable` store의 public 접근 제어자를 private으로 변경하세요. Projects/DVPresentation/Sources/Features/Main/MainView.swift:14-14의 MainView도 private으로 변경하고, 기존 init(store:) 호출 형태를 유지하도록 명시적인 내부 초기화를 추가하세요.Source: Path instructions
Projects/Devault/Sources/Composition/Dependencies/OnboardingStatusClient+Live.swift (1)
3-6: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value모듈 import를 알파벳 순으로 정렬해 주세요.
DVData,DVDomain,DVPresentation순으로 정리하면 파일 구성 규칙과 일치합니다.수정 예시
import ComposableArchitecture -import DVPresentation -import DVDomain import DVData +import DVDomain +import DVPresentationAs per path instructions, "모듈 임포트가 알파벳 순으로 정렬되어 있는지 확인하세요."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/Devault/Sources/Composition/Dependencies/OnboardingStatusClient`+Live.swift around lines 3 - 6, Sort the module imports at the top of OnboardingStatusClient+Live.swift alphabetically, placing DVData, DVDomain, and DVPresentation in that order while preserving the ComposableArchitecture import according to the file’s import-ordering convention.Source: Path instructions
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingFeature.swift (1)
86-92: 🎯 Functional Correctness | 🔵 Trivial실제 동기화 결과로 완료를 결정해 주세요.
현재는 3초 후 항상 완료 처리하므로 동기화 실패·취소 상황도 다음 단계로 진행됩니다. 목업 범위를 넘는 동작이라면 동기화 클라이언트의 성공 결과에서만
.syncingCompleted를 전송하고, 실패 시 재시도 상태를 제공해야 합니다. 원하시면 해당 의존성과 실패 상태까지 포함한 리듀서 구성을 제안하겠습니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/DVPresentation/Sources/Features/Onboarding/OnboardingFeature.swift` around lines 86 - 92, Update the .didTapEnableSync effect to use the actual iCloud synchronization client result instead of clock.sleep and unconditional .syncingCompleted. Send .syncingCompleted only after a successful sync, and transition to the existing or newly added retry state on failure or cancellation, including the required sync dependency in the reducer configuration.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Projects/DVDesign/Sources/Foundations/Color/View`+DVColor.swift:
- Around line 14-16: Update the dvScreenBackground declaration to explicitly use
public access control, and ensure its containing extension uses the default
access level instead of public extension. Preserve the method signature and
implementation.
In `@Projects/DVPresentation/Sources/Features/AppFeature.swift`:
- Around line 16-19: AppFeature.State의 onboarding, locked, main 프로퍼티를 외부에서 변경할 수
없도록 필요한 accessor 수준으로 setter 접근을 제한하고, .task 재전송을 포함한 모든 route 전환 전에 세 상태를 모두
nil로 초기화한 뒤 대상 상태만 설정하세요. reducer 외부에서도 onboarding·locked·main 중 하나만 non-nil이라는
불변식이 유지되도록 기존 전환 흐름을 수정하세요.
---
Nitpick comments:
In
`@Projects/Devault/Sources/Composition/Dependencies/OnboardingStatusClient`+Live.swift:
- Around line 3-6: Sort the module imports at the top of
OnboardingStatusClient+Live.swift alphabetically, placing DVData, DVDomain, and
DVPresentation in that order while preserving the ComposableArchitecture import
according to the file’s import-ordering convention.
In `@Projects/DVPresentation/Sources/Features/Onboarding/OnboardingFeature.swift`:
- Around line 86-92: Update the .didTapEnableSync effect to use the actual
iCloud synchronization client result instead of clock.sleep and unconditional
.syncingCompleted. Send .syncingCompleted only after a successful sync, and
transition to the existing or newly added retry state on failure or
cancellation, including the required sync dependency in the reducer
configuration.
In `@Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift`:
- Line 15: 스토어 접근 범위를 각 View 파일 내부로 제한하세요.
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift:15-15의
OnboardingView,
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingContainerView.swift:14-14의
OnboardingContainerView,
Projects/DVPresentation/Sources/Features/Lock/LockView.swift:14-14의 LockView에서
`@Bindable` store의 public 접근 제어자를 private으로 변경하세요.
Projects/DVPresentation/Sources/Features/Main/MainView.swift:14-14의 MainView도
private으로 변경하고, 기존 init(store:) 호출 형태를 유지하도록 명시적인 내부 초기화를 추가하세요.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 599fd296-1603-416b-96ca-bd0f217b7670
📒 Files selected for processing (28)
.gitignoreProjects/DVData/Sources/RepositoryImpl/Settings/SettingsRepositoryImpl.swiftProjects/DVData/Sources/RepositoryImpl/Settings/UserDefaultsKey.swiftProjects/DVDesign/Resources/progress.lottieProjects/DVDesign/Sources/Components/DVButton.swiftProjects/DVDesign/Sources/Components/DVCategory.swiftProjects/DVDesign/Sources/Components/DVStepIndicator.swiftProjects/DVDesign/Sources/Foundations/Color/View+DVColor.swiftProjects/DVDomain/Sources/Repository/Interface/SettingsRepository.swiftProjects/DVDomain/Sources/UseCase/Impl/Settings/OnboardingStatusUseCaseImpl.swiftProjects/DVDomain/Sources/UseCase/Interface/Settings/OnboardingStatusUseCase.swiftProjects/DVPresentation/Project.swiftProjects/DVPresentation/Sources/Dependencies/OnboardingStatusClient.swiftProjects/DVPresentation/Sources/Features/AppFeature.swiftProjects/DVPresentation/Sources/Features/AppView.swiftProjects/DVPresentation/Sources/Features/Lock/LockFeature.swiftProjects/DVPresentation/Sources/Features/Lock/LockView.swiftProjects/DVPresentation/Sources/Features/Main/MainView.swiftProjects/DVPresentation/Sources/Features/Onboarding/OnboardingContainerFeature.swiftProjects/DVPresentation/Sources/Features/Onboarding/OnboardingContainerView.swiftProjects/DVPresentation/Sources/Features/Onboarding/OnboardingFeature.swiftProjects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swiftProjects/DVPresentation/Sources/Features/Sidebar/SidebarFeature.swiftProjects/DVPresentation/Sources/Features/Sidebar/SidebarView.swiftProjects/Devault/Sources/Composition/Dependencies/OnboardingStatusClient+Live.swiftProjects/Devault/Sources/DevaultApp.swiftTuist/Package.swiftTuist/ProjectDescriptionHelpers/TargetDependency+External.swift
OnboardingView, LockView에서 DVStepIndicator를 제거하고 OnboardingContainerView에서 단일 인스턴스로 공유하여 온보딩→잠금 화면 전환 시 애니메이션 연속성 확보
onboardingStatus에 따라 첫 진입 시 온보딩 또는 잠금 화면으로 분기하고 각 delegate action에 따라 다음 scene으로 전환
|
|
🚨 Critical (반드시 수정)
|
1. hasCompleted, setCompleted 클로저에 @sendable 추가 2. setCompleted() → .run { _ in onboardingStatus.setCompleted() } 3. Step: CaseIterable 추가, 3 → Step.allCases.count - 1, 4 → Step.allCases.count 4. isPostOnboarding 제거 — DVStepIndicator 표시는 뷰 계층으로 결정 5. public internal(set) → var (internal)
모두 반영 완료했습니다! |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Projects/DVPresentation/Sources/Features/Lock/LockFeature.swift (1)
45-46: 🔒 Security & Privacy | 🔴 Critical | 🏗️ Heavy lift인증 성공 전에는 잠금 해제 delegate를 보내면 안 됩니다.
현재 버튼 탭만으로
.unlockCompleted를 보내며, 부모는 즉시 메인 화면으로 전환합니다. 생체 인증/시스템 인증이 성공한 경우에만 delegate를 전송하도록 인증 의존성을 연결하세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/DVPresentation/Sources/Features/Lock/LockFeature.swift` around lines 45 - 46, Update the .didTapUnlock handling in LockFeature so it initiates the configured biometric/system authentication instead of immediately sending .delegate(.unlockCompleted). Send the unlockCompleted delegate only from the authentication-success path, while preserving the locked state when authentication fails or is cancelled.
🧹 Nitpick comments (2)
Projects/Devault/Sources/Composition/Dependencies/OnboardingStatusClient+Live.swift (1)
3-6: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value임포트 순서를 정렬해 주세요.
DVData,DVDomain,DVPresentation순으로 정렬하면 됩니다. As per path instructions, "모듈 임포트가 알파벳 순으로 정렬되어 있는지 확인하세요."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/Devault/Sources/Composition/Dependencies/OnboardingStatusClient`+Live.swift around lines 3 - 6, 정렬 대상인 모듈 임포트를 알파벳 순서인 DVData, DVDomain, DVPresentation 순으로 재배치하고, ComposableArchitecture 임포트는 기존 위치를 유지하세요.Source: Path instructions
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift (1)
117-142: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win브랜드 아이콘/로고 뷰를 공용 View 파일로 추출해 주세요.
동일한 UI가 두 화면에 복제되어 변경 시 디자인이 쉽게 어긋납니다.
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift#L117-L142: 로컬appIcon및appIconWithLogoView를 공용 뷰로 교체하세요.Projects/DVPresentation/Sources/Features/Lock/LockView.swift#L48-L59: 동일 공용 뷰를 사용하도록 교체하세요.As per path instructions, "동일한 뷰가 2곳 이상 사용되거나, 독립적인 State/로직을 갖거나, 50줄 이상이면 별도 View 파일 분리를 제안하세요."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift` around lines 117 - 142, Extract the duplicated brand icon/logo UI into a shared View file, preserving the existing appIcon styling and DeVault logo typography. In Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift:117-142, remove the local appIcon and appIconWithLogoView implementations and use the shared view; in Projects/DVPresentation/Sources/Features/Lock/LockView.swift:48-59, replace the duplicate UI with the same shared view.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Projects/DVPresentation/Resources/Localizable.xcstrings`:
- Around line 4-56: Localizable.xcstrings의 새 로컬라이즈 항목을 완성하세요. sourceLanguage가
en인 각 영문 키에 지원 로케일에 맞는 en 및 ko stringUnit을 추가하고, “목록을 불러오지 못했어요”와 “시크릿이 없어요”는
의도된 한국어 키인지 확인해 en 번역을 추가하거나 소스 언어 키에서 제거하세요.
---
Outside diff comments:
In `@Projects/DVPresentation/Sources/Features/Lock/LockFeature.swift`:
- Around line 45-46: Update the .didTapUnlock handling in LockFeature so it
initiates the configured biometric/system authentication instead of immediately
sending .delegate(.unlockCompleted). Send the unlockCompleted delegate only from
the authentication-success path, while preserving the locked state when
authentication fails or is cancelled.
---
Nitpick comments:
In
`@Projects/Devault/Sources/Composition/Dependencies/OnboardingStatusClient`+Live.swift:
- Around line 3-6: 정렬 대상인 모듈 임포트를 알파벳 순서인 DVData, DVDomain, DVPresentation 순으로
재배치하고, ComposableArchitecture 임포트는 기존 위치를 유지하세요.
In `@Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift`:
- Around line 117-142: Extract the duplicated brand icon/logo UI into a shared
View file, preserving the existing appIcon styling and DeVault logo typography.
In
Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift:117-142,
remove the local appIcon and appIconWithLogoView implementations and use the
shared view; in
Projects/DVPresentation/Sources/Features/Lock/LockView.swift:48-59, replace the
duplicate UI with the same shared view.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 7649378e-3cbf-41ee-a595-7cd20999f966
📒 Files selected for processing (19)
Projects/DVData/Sources/RepositoryImpl/Settings/SettingsRepositoryImpl.swiftProjects/DVData/Sources/RepositoryImpl/Settings/UserDefaultsKey.swiftProjects/DVDesign/Sources/Foundations/Color/View+DVColor.swiftProjects/DVDomain/Sources/Repository/Interface/SettingsRepository.swiftProjects/DVDomain/Sources/UseCase/Impl/Settings/OnboardingStatusUseCaseImpl.swiftProjects/DVDomain/Sources/UseCase/Interface/Settings/OnboardingStatusUseCase.swiftProjects/DVPresentation/Project.swiftProjects/DVPresentation/Resources/Localizable.xcstringsProjects/DVPresentation/Sources/Dependencies/OnboardingStatusClient.swiftProjects/DVPresentation/Sources/Features/AppFeature.swiftProjects/DVPresentation/Sources/Features/AppView.swiftProjects/DVPresentation/Sources/Features/Lock/LockFeature.swiftProjects/DVPresentation/Sources/Features/Lock/LockView.swiftProjects/DVPresentation/Sources/Features/Onboarding/OnboardingContainerFeature.swiftProjects/DVPresentation/Sources/Features/Onboarding/OnboardingContainerView.swiftProjects/DVPresentation/Sources/Features/Onboarding/OnboardingFeature.swiftProjects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swiftProjects/Devault/Sources/Composition/Dependencies/OnboardingStatusClient+Live.swiftProjects/Devault/Sources/DevaultApp.swift
🚧 Files skipped from review as they are similar to previous changes (8)
- Projects/DVDomain/Sources/Repository/Interface/SettingsRepository.swift
- Projects/DVDomain/Sources/UseCase/Interface/Settings/OnboardingStatusUseCase.swift
- Projects/Devault/Sources/DevaultApp.swift
- Projects/DVData/Sources/RepositoryImpl/Settings/SettingsRepositoryImpl.swift
- Projects/DVPresentation/Sources/Features/AppView.swift
- Projects/DVPresentation/Sources/Dependencies/OnboardingStatusClient.swift
- Projects/DVPresentation/Sources/Features/Onboarding/OnboardingFeature.swift
- Projects/DVPresentation/Sources/Features/AppFeature.swift
| "Access your secrets on all your\nApple devices, securely encrypted." : { | ||
|
|
||
| }, | ||
| "Content" : { | ||
| "comment" : "The title of the main content section in the preview.", | ||
| "isCommentAutoGenerated" : true | ||
| }, | ||
| "Create Project" : { | ||
|
|
||
| }, | ||
| "De" : { | ||
|
|
||
| }, | ||
| "Detail" : { | ||
|
|
||
| }, | ||
| "Development" : { | ||
| "If Touch ID is unavailable,\nsystem password will be used" : { | ||
|
|
||
| }, | ||
| "Enterprise" : { | ||
| "LOGO" : { | ||
|
|
||
| }, | ||
| "Failed to load projects" : { | ||
| "No expire" : { | ||
|
|
||
| }, | ||
| "Individual" : { | ||
| "Placeholder row %@" : { | ||
|
|
||
| }, | ||
| "Production" : { | ||
| "Project" : { | ||
|
|
||
| }, | ||
| "Staging" : { | ||
| "Project Name" : { | ||
|
|
||
| }, | ||
| "Team" : { | ||
| "Save" : { | ||
|
|
||
| }, | ||
| "Sidebar" : { | ||
| "comment" : "The text that appears in the sidebar of the main view.", | ||
| "isCommentAutoGenerated" : true | ||
| "Select Project" : { | ||
|
|
||
| }, | ||
| "SSL Required" : { | ||
|
|
||
| }, | ||
| "This may take a moment..." : { | ||
|
|
||
| }, | ||
| "Vault" : { | ||
|
|
||
| }, | ||
| "목록을 불러오지 못했어요" : { | ||
|
|
||
| }, | ||
| "The project list couldn't be loaded. Please try again later." : { | ||
| "시크릿이 없어요" : { |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== file excerpt =="
if [ -f Projects/DVPresentation/Resources/Localizable.xcstrings ]; then
sed -n '1,90p' Projects/DVPresentation/Resources/Localizable.xcstrings
else
echo "file not found"
fi
echo
echo "== xcstrings files =="
git ls-files '*xcstrings' || true
echo
echo "== localization metadata search =="
rg -n '"sourceLanguage"|"localizations"|"KO"|"ko"|"en"' -g '*xcstrings' . || true
echo
echo "== localizable key usages =="
rg -n '"목록을 불러오지 못했어요"|"시크릿이 없어요"|"Access your secrets on all your|App Store Review|Content"|"Create Project"|"No expire"|"Placeholder row"|"This may take a moment"|LOGO|Project Name|SSL Required' .Repository: DevaultProject/Devault-macOS
Length of output: 3662
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
import json, pathlib
p = pathlib.Path("Projects/DVPresentation/Resources/Localizable.xcstrings")
if not p.exists():
print("missing")
raise SystemExit
data = json.loads(p.read_text())
print("sourceLanguage:", data.get("sourceLanguage"))
for key, obj in data.get("strings", {}).items():
if key in [
"Access your secrets on all your\nApple devices, securely encrypted.",
"Content",
"Create Project",
"De",
"Detail",
"If Touch ID is unavailable,\nsystem password will be used",
"LOGO",
"No expire",
"Placeholder row %@",
"Project",
"Project Name",
"Save",
"Select Project",
"SSL Required",
"This may take a moment...",
"Vault",
"목록을 불러오지 못했어요",
"시크릿이 없어요",
]:
local = obj.get("localizations", {})
print(key)
for locale, lodata in local.items():
print(" ", locale, lodata.get("stringUnit", {}))
PYRepository: DevaultProject/Devault-macOS
Length of output: 485
로컬라이즈 단위를 채워 주세요.
sourceLanguage가 en인데 새 영문 키에는 ko 번역이 없고, 목록을 불러오지 못했어요/시크릭이 없어요도 en 번역 없이 한국어가 소스 키로 남아 있습니다. Localizable.xcstrings가 앱 로케일용인지 확인하고, 지원 대상 로케일에는 en/ko stringUnit을 추가하거나 의도하지 않은 소스 언어 키는 제거해 주세요.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Projects/DVPresentation/Resources/Localizable.xcstrings` around lines 4 - 56,
Localizable.xcstrings의 새 로컬라이즈 항목을 완성하세요. sourceLanguage가 en인 각 영문 키에 지원 로케일에 맞는
en 및 ko stringUnit을 추가하고, “목록을 불러오지 못했어요”와 “시크릿이 없어요”는 의도된 한국어 키인지 확인해 en 번역을
추가하거나 소스 언어 키에서 제거하세요.
There was a problem hiding this comment.
client 구현과 함께 다음 이슈에서 처리할 예정
There was a problem hiding this comment.
@dlguszoo 알겠습니다. 이번 PR 범위에서는 보류하고, 클라이언트 구현 이슈에서 Localizable.xcstrings의 en/ko stringUnit과 소스 키 언어를 함께 정리하면 됩니다.
원하시면 해당 후속 GitHub 이슈를 생성해 드릴까요?
✨ What’s this PR?
📌 관련 이슈 (Related Issue)
🧶 주요 변경 내용 (Summary)
📸 스크린샷 (Optional)
2026-07-24.2.31.30.mov
2026-07-24.2.30.20.mov
🧪 테스트 / 검증 내역
💬 기타 공유 사항
🙇🏻♀️ 리뷰 가이드 (선택)
Summary by CodeRabbit
새로운 기능
개선