|
@@ -310,6 +310,8 @@ final class ViewController: NSViewController {
|
|
|
private var launchSplashMinimumDelayWorkItem: DispatchWorkItem?
|
|
private var launchSplashMinimumDelayWorkItem: DispatchWorkItem?
|
|
|
private var launchSplashShownAt: Date?
|
|
private var launchSplashShownAt: Date?
|
|
|
private var hasDismissedLaunchSplash = false
|
|
private var hasDismissedLaunchSplash = false
|
|
|
|
|
+ private var chromeLanguageCode: String?
|
|
|
|
|
+ private var hasReconciledLaunchLanguage = false
|
|
|
|
|
|
|
|
private var mainContentHost: NSView?
|
|
private var mainContentHost: NSView?
|
|
|
/// Pin constraints for the current page inside `mainContentHost`; deactivated before each swap so relayout never stacks duplicates.
|
|
/// Pin constraints for the current page inside `mainContentHost`; deactivated before each swap so relayout never stacks duplicates.
|
|
@@ -590,6 +592,7 @@ final class ViewController: NSViewController {
|
|
|
|
|
|
|
|
override func viewDidLoad() {
|
|
override func viewDidLoad() {
|
|
|
super.viewDidLoad()
|
|
super.viewDidLoad()
|
|
|
|
|
+ AppLanguageManager.syncWithSystemLanguageOnLaunch()
|
|
|
aiCompanionSpeechSynthesizer.delegate = self
|
|
aiCompanionSpeechSynthesizer.delegate = self
|
|
|
loadAiCompanionLocalRecordings()
|
|
loadAiCompanionLocalRecordings()
|
|
|
// Sync toggle + palette with current macOS appearance on launch.
|
|
// Sync toggle + palette with current macOS appearance on launch.
|
|
@@ -608,15 +611,18 @@ final class ViewController: NSViewController {
|
|
|
beginUsageTrackingSessionIfNeeded()
|
|
beginUsageTrackingSessionIfNeeded()
|
|
|
observeAppLifecycleForUsageTrackingIfNeeded()
|
|
observeAppLifecycleForUsageTrackingIfNeeded()
|
|
|
registerWidgetNotificationObservers()
|
|
registerWidgetNotificationObservers()
|
|
|
|
|
+ registerLanguageChangeObserverIfNeeded()
|
|
|
AppLanguageManager.applyGlobalLayoutDirection()
|
|
AppLanguageManager.applyGlobalLayoutDirection()
|
|
|
setupRootView()
|
|
setupRootView()
|
|
|
buildMainLayout()
|
|
buildMainLayout()
|
|
|
|
|
+ chromeLanguageCode = AppLanguageManager.effectiveLanguageCode
|
|
|
showLaunchSplashIfNeeded()
|
|
showLaunchSplashIfNeeded()
|
|
|
startStoreKit()
|
|
startStoreKit()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override func viewDidAppear() {
|
|
override func viewDidAppear() {
|
|
|
super.viewDidAppear()
|
|
super.viewDidAppear()
|
|
|
|
|
+ reconcileLanguageAfterLaunchIfNeeded()
|
|
|
DesktopWidgetWindowManager.shared.restore()
|
|
DesktopWidgetWindowManager.shared.restore()
|
|
|
hasViewAppearedOnce = true
|
|
hasViewAppearedOnce = true
|
|
|
presentLaunchPaywallIfNeeded()
|
|
presentLaunchPaywallIfNeeded()
|
|
@@ -812,6 +818,7 @@ private extension ViewController {
|
|
|
splitContainer.addArrangedSubview(sidebar)
|
|
splitContainer.addArrangedSubview(sidebar)
|
|
|
splitContainer.addArrangedSubview(mainPanel)
|
|
splitContainer.addArrangedSubview(mainPanel)
|
|
|
}
|
|
}
|
|
|
|
|
+ chromeLanguageCode = AppLanguageManager.effectiveLanguageCode
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@objc private func sidebarItemClicked(_ sender: NSClickGestureRecognizer) {
|
|
@objc private func sidebarItemClicked(_ sender: NSClickGestureRecognizer) {
|
|
@@ -851,6 +858,33 @@ private extension ViewController {
|
|
|
showSidebarPage(page)
|
|
showSidebarPage(page)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private func registerLanguageChangeObserverIfNeeded() {
|
|
|
|
|
+ NotificationCenter.default.addObserver(
|
|
|
|
|
+ self,
|
|
|
|
|
+ selector: #selector(appLanguageDidChange(_:)),
|
|
|
|
|
+ name: .appLanguageDidChange,
|
|
|
|
|
+ object: nil
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @objc private func appLanguageDidChange(_ notification: Notification) {
|
|
|
|
|
+ guard let builtWith = chromeLanguageCode else { return }
|
|
|
|
|
+ guard builtWith != AppLanguageManager.effectiveLanguageCode else { return }
|
|
|
|
|
+ reloadTheme()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private func reconcileLanguageAfterLaunchIfNeeded() {
|
|
|
|
|
+ guard hasReconciledLaunchLanguage == false else { return }
|
|
|
|
|
+ hasReconciledLaunchLanguage = true
|
|
|
|
|
+ DispatchQueue.main.async { [weak self] in
|
|
|
|
|
+ guard let self else { return }
|
|
|
|
|
+ let builtWith = self.chromeLanguageCode ?? AppLanguageManager.effectiveLanguageCode
|
|
|
|
|
+ AppLanguageManager.reconcileLanguageAfterLaunch()
|
|
|
|
|
+ guard builtWith != AppLanguageManager.effectiveLanguageCode else { return }
|
|
|
|
|
+ self.reloadTheme()
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private func registerWidgetNotificationObservers() {
|
|
private func registerWidgetNotificationObservers() {
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(widgetOpenJoinMeetingsPageRequested), name: .widgetOpenJoinMeetingsPage, object: nil)
|
|
NotificationCenter.default.addObserver(self, selector: #selector(widgetOpenJoinMeetingsPageRequested), name: .widgetOpenJoinMeetingsPage, object: nil)
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(widgetOpenSchedulePageRequested), name: .widgetOpenSchedulePage, object: nil)
|
|
NotificationCenter.default.addObserver(self, selector: #selector(widgetOpenSchedulePageRequested), name: .widgetOpenSchedulePage, object: nil)
|
|
@@ -4751,6 +4785,18 @@ private extension ViewController {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ let normalized = identifier.replacingOccurrences(of: "_", with: "-")
|
|
|
|
|
+ let base = normalized.split(separator: "-").first.map(String.init) ?? normalized
|
|
|
|
|
+ for item in popup.itemArray {
|
|
|
|
|
+ guard let value = item.representedObject as? String else { continue }
|
|
|
|
|
+ let itemNormalized = value.replacingOccurrences(of: "_", with: "-")
|
|
|
|
|
+ let itemBase = itemNormalized.split(separator: "-").first.map(String.init) ?? itemNormalized
|
|
|
|
|
+ if itemNormalized == normalized || itemBase == base {
|
|
|
|
|
+ popup.select(item)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@objc private func settingsPageAppLanguageChanged(_ sender: NSPopUpButton) {
|
|
@objc private func settingsPageAppLanguageChanged(_ sender: NSPopUpButton) {
|