|
|
@@ -148,6 +148,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
private let savedJobsStack = NSStackView()
|
|
|
private let settingsPageContainer = NSView()
|
|
|
private weak var appearanceModeSegment: NSSegmentedControl?
|
|
|
+ private weak var languagePopUp: NSPopUpButton?
|
|
|
private let cvMakerPageContainer = NSView()
|
|
|
private lazy var cvMakerPageView: CVMakerPageView = {
|
|
|
CVMakerPageView()
|
|
|
@@ -316,6 +317,12 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
freeJobSearchQuotaLabel.textColor = Theme.secondaryText
|
|
|
|
|
|
appearanceModeSegment?.selectedSegment = AppAppearanceManager.shared.mode.segmentIndex
|
|
|
+ if let langPopUp = languagePopUp {
|
|
|
+ let saved = UserDefaults.standard.string(forKey: Self.languageUserDefaultsKey) ?? "en"
|
|
|
+ if let index = Self.supportedLanguages.firstIndex(where: { $0.code == saved }) {
|
|
|
+ langPopUp.selectItem(at: index)
|
|
|
+ }
|
|
|
+ }
|
|
|
cvMakerPageView.applyCurrentAppearance()
|
|
|
profilesListPageView.applyCurrentAppearance()
|
|
|
myProfilePageView.applyCurrentAppearance()
|
|
|
@@ -1758,8 +1765,11 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
|
|
|
let themeSegment = makeAppearanceModeSegment()
|
|
|
appearanceModeSegment = themeSegment
|
|
|
+ let langPopUp = makeLanguagePopUp()
|
|
|
+ languagePopUp = langPopUp
|
|
|
let appearanceSection = makeSettingsSection(rows: [
|
|
|
- makeSettingsRow(title: "Theme", systemImage: "circle.lefthalf.filled", accessory: themeSegment, tapAction: nil)
|
|
|
+ makeSettingsRow(title: "Theme", systemImage: "circle.lefthalf.filled", accessory: themeSegment, tapAction: nil),
|
|
|
+ makeSettingsRow(title: "Language", systemImage: "character.bubble", accessory: langPopUp, tapAction: nil)
|
|
|
])
|
|
|
|
|
|
let appearanceStack = NSStackView(views: [appearanceTitle, appearanceSection])
|
|
|
@@ -1830,6 +1840,49 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
AppAppearanceManager.shared.mode = mode
|
|
|
}
|
|
|
|
|
|
+ private static let languageUserDefaultsKey = "com.appforindeed.preferredLanguage"
|
|
|
+
|
|
|
+ private static let supportedLanguages: [(code: String, title: String)] = [
|
|
|
+ ("en", "English"),
|
|
|
+ ("es", "Español"),
|
|
|
+ ("fr", "Français"),
|
|
|
+ ("de", "Deutsch"),
|
|
|
+ ("pt", "Português"),
|
|
|
+ ("zh", "中文"),
|
|
|
+ ("ja", "日本語"),
|
|
|
+ ("ko", "한국어"),
|
|
|
+ ("ar", "العربية"),
|
|
|
+ ("hi", "हिन्दी")
|
|
|
+ ]
|
|
|
+
|
|
|
+ private func makeLanguagePopUp() -> NSPopUpButton {
|
|
|
+ let popup = NSPopUpButton(frame: .zero, pullsDown: false)
|
|
|
+ popup.translatesAutoresizingMaskIntoConstraints = false
|
|
|
+ popup.removeAllItems()
|
|
|
+
|
|
|
+ for lang in Self.supportedLanguages {
|
|
|
+ popup.addItem(withTitle: lang.title)
|
|
|
+ popup.lastItem?.representedObject = lang.code
|
|
|
+ }
|
|
|
+
|
|
|
+ let saved = UserDefaults.standard.string(forKey: Self.languageUserDefaultsKey) ?? "en"
|
|
|
+ if let index = Self.supportedLanguages.firstIndex(where: { $0.code == saved }) {
|
|
|
+ popup.selectItem(at: index)
|
|
|
+ }
|
|
|
+
|
|
|
+ popup.target = self
|
|
|
+ popup.action = #selector(languageChanged(_:))
|
|
|
+ popup.setContentHuggingPriority(.required, for: .horizontal)
|
|
|
+ popup.setContentCompressionResistancePriority(.required, for: .horizontal)
|
|
|
+ return popup
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc private func languageChanged(_ sender: NSPopUpButton) {
|
|
|
+ guard let code = sender.selectedItem?.representedObject as? String else { return }
|
|
|
+ UserDefaults.standard.set(code, forKey: Self.languageUserDefaultsKey)
|
|
|
+ UserDefaults.standard.set([code], forKey: "AppleLanguages")
|
|
|
+ }
|
|
|
+
|
|
|
private func makeSettingsSection(rows: [NSView]) -> NSView {
|
|
|
let section = NSStackView()
|
|
|
section.orientation = .vertical
|