diff --git a/README.md b/README.md index 5223b62..3a10978 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ PHP Monitor is a universal application that runs natively on Apple Silicon **and * macOS 11 Big Sur or higher (supports macOS 12 Monterey) * Homebrew is installed in `/usr/local/homebrew` or `/opt/homebrew` * Homebrew `php` formula is installed -* Laravel Valet 2.16 or newer (supports Valet 3) +* Laravel Valet 3 recommended (but compatible with Valet 2) _You may need to update your Valet installation to keep everything working if a major version update of PHP has been released. You can do this by running `composer global update && valet install`. Some features are not supported when running Valet 2._ diff --git a/phpmon/Domain/Menu/MainMenu+Actions.swift b/phpmon/Domain/Menu/MainMenu+Actions.swift index 625f03d..cb8fe05 100644 --- a/phpmon/Domain/Menu/MainMenu+Actions.swift +++ b/phpmon/Domain/Menu/MainMenu+Actions.swift @@ -180,6 +180,20 @@ extension MainMenu { } } + @objc func showPresetHelp() { + BetterAlert().withInformation( + title: "preset_help_title".localized, + subtitle: "preset_help_info".localized, + description: "preset_help_desc".localized + ) + .withPrimary(text: "OK") + .withTertiary(text: "", action: { alert in + NSWorkspace.shared.open(Constants.Urls.FrequentlyAskedQuestions) + alert.close(with: .OK) + }) + .show() + } + @objc func openPhpInfo() { var url: URL? diff --git a/phpmon/Domain/Menu/StatusMenu+Items.swift b/phpmon/Domain/Menu/StatusMenu+Items.swift index 224d729..a9b665e 100644 --- a/phpmon/Domain/Menu/StatusMenu+Items.swift +++ b/phpmon/Domain/Menu/StatusMenu+Items.swift @@ -66,13 +66,41 @@ extension StatusMenu { func addPresetsMenuItem() { if Preferences.custom.presets.isEmpty { + addEmptyPresetHelp() return } - let presets = NSMenuItem(title: "Configuration Presets", action: nil, keyEquivalent: "") + addLoadedPresets() + } + + func addEmptyPresetHelp() { + let presets = NSMenuItem(title: "mi_presets_title".localized, action: nil, keyEquivalent: "") + let presetsMenu = NSMenu() + + presetsMenu.addItem(NSMenuItem(title: "mi_no_presets".localized, action: nil, keyEquivalent: "")) presetsMenu.addItem(NSMenuItem.separator()) - presetsMenu.addItem(HeaderView.asMenuItem(text: "Apply Configuration Presets")) + presetsMenu.addItem(NSMenuItem( + title: "mi_set_up_presets".localized, + action: #selector(MainMenu.showPresetHelp), + keyEquivalent: "") + ) + + presetsMenu.items.forEach { $0.target = MainMenu.shared } + + self.setSubmenu(presetsMenu, for: presets) + self.addItem(presets) + + return + } + + func addLoadedPresets() { + let presets = NSMenuItem(title: "mi_presets_title".localized, action: nil, keyEquivalent: "") + + let presetsMenu = NSMenu() + + presetsMenu.addItem(NSMenuItem.separator()) + presetsMenu.addItem(HeaderView.asMenuItem(text: "mi_apply_presets_title".localized)) for preset in Preferences.custom.presets { let presetMenuItem = PresetMenuItem( @@ -86,13 +114,6 @@ extension StatusMenu { options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil ) { - /* - attributedString.addAttribute( - .font, - value: NSFont.systemFont(ofSize: 12), - range: NSRange(location: 0, length: attributedString.length) - ) - */ presetMenuItem.attributedTitle = attributedString } @@ -102,15 +123,17 @@ extension StatusMenu { presetsMenu.addItem(NSMenuItem.separator()) presetsMenu.addItem(NSMenuItem( - title: "Revert to Previous Configuration...", + title: "mi_revert_to_prev_config".localized, action: PresetHelper.rollbackPreset != nil - ? #selector(MainMenu.rollbackPreset) - : nil, + ? #selector(MainMenu.rollbackPreset) + : nil, keyEquivalent: "" )) presetsMenu.addItem(NSMenuItem.separator()) presetsMenu.addItem(NSMenuItem( - title: "\(Preferences.custom.presets.count) profiles loaded from configuration file", + title: "mi_profiles_loaded".localized( + Preferences.custom.presets.count + ), action: nil, keyEquivalent: "") ) for item in presetsMenu.items { @@ -133,7 +156,7 @@ extension StatusMenu { let xdebugModesMenu = NSMenu() let activeModes = Xdebug.activeModes - xdebugModesMenu.addItem(HeaderView.asMenuItem(text: "Available Modes")) + xdebugModesMenu.addItem(HeaderView.asMenuItem(text: "mi_xdebug_available_modes".localized)) for mode in Xdebug.modes { let item = XdebugMenuItem( @@ -147,9 +170,9 @@ extension StatusMenu { xdebugModesMenu.addItem(item) } - xdebugModesMenu.addItem(HeaderView.asMenuItem(text: "Actions")) + xdebugModesMenu.addItem(HeaderView.asMenuItem(text: "mi_xdebug_actions".localized)) xdebugModesMenu.addItem( - withTitle: "Disable All", + withTitle: "mi_xdebug_disable_all".localized, action: #selector(MainMenu.disableAllXdebugModes), keyEquivalent: "" ) diff --git a/phpmon/Localizable.strings b/phpmon/Localizable.strings index e002bc3..3b88131 100644 --- a/phpmon/Localizable.strings +++ b/phpmon/Localizable.strings @@ -63,6 +63,24 @@ "mi_quit" = "Quit PHP Monitor"; "mi_about" = "About PHP Monitor"; +"mi_presets_title" = "Configuration Presets"; +"mi_apply_presets_title" = "Apply Configuration Presets"; +"mi_revert_to_prev_config" = "Revert to Previous Configuration..."; +"mi_profiles_loaded" = "%i profiles loaded from configuration file"; + +"mi_no_presets" = "No presets available."; +"mi_set_up_presets" = "Learn more about presets..."; + +"mi_xdebug_available_modes" = "Available Modes"; +"mi_xdebug_actions" = "Actions"; +"mi_xdebug_disable_all" = "Disable All Modes"; + +// PRESET LOADING + +"preset_help_title" = "Working with Configuration Presets"; +"preset_help_info" = "You can set up configuration presets in the config.json file, located in ~/.config/phpmon/config.json. These presets can apply a selection of configuration values all at once. This is a powerful feature, but currently needs to be set up manually."; +"preset_help_desc" = "After restarting PHP Monitor, all presets found in the file will be loaded. If no presets appear, the file probably could not be parsed correctly.\n\nYou can click the question mark in this alert to go to the FAQ on GitHub, where you can find more information about this feature, including a sample file."; + // MENU ITEMS (if window is open) "mm_add_folder_as_link" = "Add Folder as Link...";