package language import ( "voicesnap/internal/config" "voicesnap/internal/model" ) type LanguageOption struct { ID string `json:"id"` DisplayName string `json:"displayName"` NativeName string `json:"nativeName"` UILocale string `json:"uiLocale"` } type LanguageSettings struct { LanguageMode string `json:"languageMode"` LanguageID string `json:"languageID"` EffectiveLanguageID string `json:"effectiveLanguageID"` UILocale string `json:"uiLocale"` DefaultModelID string `json:"defaultModelID"` Options []LanguageOption `json:"options"` } func Resolve(languageMode, languageID string, detector SystemLocaleDetector) LanguageSettings { mode := config.NormalizeLanguageMode(languageMode) configuredID := model.NormalizeLanguageID(languageID) effectiveID := configuredID if mode == config.LanguageModeAuto { detected := "" if detector != nil { detected = detector.Detect() } effectiveID = NormalizeLocale(detected) } profile, err := model.GetLanguageProfile(effectiveID) if err != nil { profile, _ = model.GetLanguageProfile(model.DefaultLanguageID) effectiveID = model.DefaultLanguageID } return LanguageSettings{ LanguageMode: mode, LanguageID: configuredID, EffectiveLanguageID: effectiveID, UILocale: profile.UILocale, DefaultModelID: profile.DefaultModelID, Options: languageOptions(), } } func languageOptions() []LanguageOption { profiles := model.ListLanguageProfiles() options := make([]LanguageOption, 0, len(profiles)) for _, profile := range profiles { options = append(options, LanguageOption{ ID: profile.ID, DisplayName: profile.DisplayName, NativeName: profile.NativeName, UILocale: profile.UILocale, }) } return options }