언어 설정 화면 추가 및 언어 헤더 적용
설정에서 시스템/한국어/영어/일본어 선택을 지원한다. 선택 시 Accept-Language 헤더와 UI locale을 즉시 반영한다. 언어 변경 후 스플래시를 거쳐 메인으로 소프트 재시작한다.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
//
|
||||
// LanguageSettingsViewModel.swift
|
||||
// SodaLive
|
||||
//
|
||||
// Created by Junie (AI) on 2025/12/16.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
final class LanguageSettingsViewModel: ObservableObject {
|
||||
// 저장된(현재 적용된) 언어
|
||||
@Published var selected: LanguageOption = .system
|
||||
// 사용자가 화면에서 선택 중인 언어(적용 버튼 누르기 전 임시 상태)
|
||||
@Published var pending: LanguageOption = .system
|
||||
|
||||
private let service: LanguageService
|
||||
|
||||
init(service: LanguageService = LanguageContainer.service) {
|
||||
self.service = service
|
||||
}
|
||||
|
||||
func onAppear() {
|
||||
Task { await loadCurrent() }
|
||||
}
|
||||
|
||||
private func loadCurrent() async {
|
||||
let locale = await service.currentLocale()
|
||||
let option = map(locale: locale)
|
||||
await MainActor.run {
|
||||
self.selected = option
|
||||
self.pending = option
|
||||
}
|
||||
}
|
||||
|
||||
func select(_ option: LanguageOption) {
|
||||
// 즉시 저장/적용하지 않고, 사용자가 '적용' 버튼을 누를 때까지 대기
|
||||
self.pending = option
|
||||
}
|
||||
|
||||
/// 선택한 언어를 저장/적용하고, 앱을 소프트 재시작하여 즉시 반영
|
||||
func applyAndRestart() async {
|
||||
let toApply = pending
|
||||
await service.applyLanguage(toApply)
|
||||
await MainActor.run {
|
||||
self.selected = toApply
|
||||
// 앱 소프트 재시작(스플래시 -> 메인)
|
||||
AppState.shared.softRestart()
|
||||
}
|
||||
}
|
||||
|
||||
private func map(locale: Locale) -> LanguageOption {
|
||||
let id = locale.identifier
|
||||
if id.hasPrefix("ko") { return .ko }
|
||||
if id.hasPrefix("ja") { return .ja }
|
||||
if id.hasPrefix("en") { return .en }
|
||||
return .system
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user