|
|
@@ -148,6 +148,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
148
|
148
|
private let savedJobsStack = NSStackView()
|
|
149
|
149
|
private let settingsPageContainer = NSView()
|
|
150
|
150
|
private weak var appearanceModeSegment: NSSegmentedControl?
|
|
|
151
|
+ private weak var languagePopUp: NSPopUpButton?
|
|
151
|
152
|
private let cvMakerPageContainer = NSView()
|
|
152
|
153
|
private lazy var cvMakerPageView: CVMakerPageView = {
|
|
153
|
154
|
CVMakerPageView()
|
|
|
@@ -316,6 +317,12 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
316
|
317
|
freeJobSearchQuotaLabel.textColor = Theme.secondaryText
|
|
317
|
318
|
|
|
318
|
319
|
appearanceModeSegment?.selectedSegment = AppAppearanceManager.shared.mode.segmentIndex
|
|
|
320
|
+ if let langPopUp = languagePopUp {
|
|
|
321
|
+ let saved = UserDefaults.standard.string(forKey: Self.languageUserDefaultsKey) ?? "en"
|
|
|
322
|
+ if let index = Self.supportedLanguages.firstIndex(where: { $0.code == saved }) {
|
|
|
323
|
+ langPopUp.selectItem(at: index)
|
|
|
324
|
+ }
|
|
|
325
|
+ }
|
|
319
|
326
|
cvMakerPageView.applyCurrentAppearance()
|
|
320
|
327
|
profilesListPageView.applyCurrentAppearance()
|
|
321
|
328
|
myProfilePageView.applyCurrentAppearance()
|
|
|
@@ -1758,8 +1765,11 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
1758
|
1765
|
|
|
1759
|
1766
|
let themeSegment = makeAppearanceModeSegment()
|
|
1760
|
1767
|
appearanceModeSegment = themeSegment
|
|
|
1768
|
+ let langPopUp = makeLanguagePopUp()
|
|
|
1769
|
+ languagePopUp = langPopUp
|
|
1761
|
1770
|
let appearanceSection = makeSettingsSection(rows: [
|
|
1762
|
|
- makeSettingsRow(title: "Theme", systemImage: "circle.lefthalf.filled", accessory: themeSegment, tapAction: nil)
|
|
|
1771
|
+ makeSettingsRow(title: "Theme", systemImage: "circle.lefthalf.filled", accessory: themeSegment, tapAction: nil),
|
|
|
1772
|
+ makeSettingsRow(title: "Language", systemImage: "character.bubble", accessory: langPopUp, tapAction: nil)
|
|
1763
|
1773
|
])
|
|
1764
|
1774
|
|
|
1765
|
1775
|
let appearanceStack = NSStackView(views: [appearanceTitle, appearanceSection])
|
|
|
@@ -1830,6 +1840,49 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
1830
|
1840
|
AppAppearanceManager.shared.mode = mode
|
|
1831
|
1841
|
}
|
|
1832
|
1842
|
|
|
|
1843
|
+ private static let languageUserDefaultsKey = "com.appforindeed.preferredLanguage"
|
|
|
1844
|
+
|
|
|
1845
|
+ private static let supportedLanguages: [(code: String, title: String)] = [
|
|
|
1846
|
+ ("en", "English"),
|
|
|
1847
|
+ ("es", "Español"),
|
|
|
1848
|
+ ("fr", "Français"),
|
|
|
1849
|
+ ("de", "Deutsch"),
|
|
|
1850
|
+ ("pt", "Português"),
|
|
|
1851
|
+ ("zh", "中文"),
|
|
|
1852
|
+ ("ja", "日本語"),
|
|
|
1853
|
+ ("ko", "한국어"),
|
|
|
1854
|
+ ("ar", "العربية"),
|
|
|
1855
|
+ ("hi", "हिन्दी")
|
|
|
1856
|
+ ]
|
|
|
1857
|
+
|
|
|
1858
|
+ private func makeLanguagePopUp() -> NSPopUpButton {
|
|
|
1859
|
+ let popup = NSPopUpButton(frame: .zero, pullsDown: false)
|
|
|
1860
|
+ popup.translatesAutoresizingMaskIntoConstraints = false
|
|
|
1861
|
+ popup.removeAllItems()
|
|
|
1862
|
+
|
|
|
1863
|
+ for lang in Self.supportedLanguages {
|
|
|
1864
|
+ popup.addItem(withTitle: lang.title)
|
|
|
1865
|
+ popup.lastItem?.representedObject = lang.code
|
|
|
1866
|
+ }
|
|
|
1867
|
+
|
|
|
1868
|
+ let saved = UserDefaults.standard.string(forKey: Self.languageUserDefaultsKey) ?? "en"
|
|
|
1869
|
+ if let index = Self.supportedLanguages.firstIndex(where: { $0.code == saved }) {
|
|
|
1870
|
+ popup.selectItem(at: index)
|
|
|
1871
|
+ }
|
|
|
1872
|
+
|
|
|
1873
|
+ popup.target = self
|
|
|
1874
|
+ popup.action = #selector(languageChanged(_:))
|
|
|
1875
|
+ popup.setContentHuggingPriority(.required, for: .horizontal)
|
|
|
1876
|
+ popup.setContentCompressionResistancePriority(.required, for: .horizontal)
|
|
|
1877
|
+ return popup
|
|
|
1878
|
+ }
|
|
|
1879
|
+
|
|
|
1880
|
+ @objc private func languageChanged(_ sender: NSPopUpButton) {
|
|
|
1881
|
+ guard let code = sender.selectedItem?.representedObject as? String else { return }
|
|
|
1882
|
+ UserDefaults.standard.set(code, forKey: Self.languageUserDefaultsKey)
|
|
|
1883
|
+ UserDefaults.standard.set([code], forKey: "AppleLanguages")
|
|
|
1884
|
+ }
|
|
|
1885
|
+
|
|
1833
|
1886
|
private func makeSettingsSection(rows: [NSView]) -> NSView {
|
|
1834
|
1887
|
let section = NSStackView()
|
|
1835
|
1888
|
section.orientation = .vertical
|