NotchTerminal supports multiple languages with automatic system detection and manual override capability.
| Code | Language | Status |
|---|---|---|
en |
English | Default |
es |
Spanish | ✅ |
fr |
French | ✅ |
ja |
Japanese | ✅ |
zh-Hans |
Simplified Chinese | ✅ |
By default, NotchTerminal automatically detects the system language using:
let preferredLanguages = Locale.preferredLanguagesIf the system language is not supported, it falls back to English (en).
Users can manually select their preferred language in Settings → General → Language:
- System Default: Uses the system's language setting
- Manual Selection: Choose from available languages (English, Spanish, French, Japanese, Simplified Chinese)
The user's selection is stored in UserDefaults with the key userLanguageOverride.
Located in NotchTerminal/Services/LanguageManager.swift:
@Observable
@MainActor
final class LanguageManager: ObservableObject {
static let shared = LanguageManager()
var currentLanguage: String { ... }
var systemLanguage: String { ... }
var userHasSelectedLanguage: Bool { ... }
func setLanguage(_ languageCode: String) { ... }
func resetToSystemLanguage() { ... }
func displayName(for languageCode: String) -> String { ... }
}- Singleton Pattern:
LanguageManager.sharedprovides global access - Auto-detection: Reads from
Locale.preferredLanguages - Persistence: User preference saved in
UserDefaults - Reactive Updates: Uses
@Observablefor SwiftUI integration
Add the new language code to supportedLanguageCodes:
private let supportedLanguageCodes = ["en", "es", "fr", "ja", "zh-Hans", "de"] // Add "de" for GermanCreate a new .lproj folder and Localizable.strings file:
mkdir NotchTerminal/NotchTerminal/de.lprojCopy en.lproj/Localizable.strings and translate all keys:
/* General */
"app.name" = "NotchTerminal";
"settings.general" = "General";
/* ... */
Text("settings.general".localized)let title = NSLocalizedString("settings.general", bundle: .main, value: "settings.general", comment: "")let title = "settings.general".localized(in: "es") // Returns Spanish versionNotchTerminal/
├── Services/
│ └── LanguageManager.swift # Language detection & management
├── en.lproj/
│ └── Localizable.strings # English (default)
├── es.lproj/
│ └── Localizable.strings # Spanish
├── fr.lproj/
│ └── Localizable.strings # French
├── ja.lproj/
│ └── Localizable.strings # Japanese
├── zh-Hans.lproj/
│ └── Localizable.strings # Simplified Chinese
└── Settings/
└── SettingsView.swift # Language picker UI
| Key | Type | Description |
|---|---|---|
userLanguageOverride |
String? | User-selected language code (nil = system default) |
- Language changes take effect immediately in the Settings UI
- Some UI elements may require app restart for full effect
- The system language is read at runtime, not compile time
- Fallback to English for any missing translations