Translator hotkey: Option + ` (key left of 1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -54,7 +54,7 @@ struct FuncPill: View {
|
|||||||
withAnimation(.easeOut(duration: 0.18)) { showSystem = true }
|
withAnimation(.easeOut(duration: 0.18)) { showSystem = true }
|
||||||
}
|
}
|
||||||
FuncRow(symbol: "character.bubble", color: "#60A5FA", title: "Переводчик",
|
FuncRow(symbol: "character.bubble", color: "#60A5FA", title: "Переводчик",
|
||||||
subtitle: "выделенный текст RU ↔ EN", hint: "⌃⌥R") {
|
subtitle: "выделенный текст RU ↔ EN", hint: "⌥`") {
|
||||||
open = false
|
open = false
|
||||||
showSystem = false
|
showSystem = false
|
||||||
TranslatorRun.start(state: state)
|
TranslatorRun.start(state: state)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ enum ShortcutAction: String, CaseIterable, Sendable {
|
|||||||
case muteToggle = "muteToggle" // ⌃⌥M — mute / unmute sounds
|
case muteToggle = "muteToggle" // ⌃⌥M — mute / unmute sounds
|
||||||
case desktopToggle = "desktopToggle" // ⌃⌥D — send Mochi to desktop / bring back
|
case desktopToggle = "desktopToggle" // ⌃⌥D — send Mochi to desktop / bring back
|
||||||
case wardrobeToggle = "wardrobeToggle" // ⌃⌥G — open / close wardrobe
|
case wardrobeToggle = "wardrobeToggle" // ⌃⌥G — open / close wardrobe
|
||||||
case translate = "translate" // ⌃⌥R — translate the selected text (BroV)
|
case translate = "translate" // ⌥` — translate the selected text (BroV)
|
||||||
|
|
||||||
// MARK: UserDefaults keys
|
// MARK: UserDefaults keys
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ enum ShortcutLogic {
|
|||||||
.muteToggle: ShortcutSpec(keyCode: 46, nsFlags: ShortcutSpec.ctrlOpt), // ⌃⌥M
|
.muteToggle: ShortcutSpec(keyCode: 46, nsFlags: ShortcutSpec.ctrlOpt), // ⌃⌥M
|
||||||
.desktopToggle: ShortcutSpec(keyCode: 2, nsFlags: ShortcutSpec.ctrlOpt), // ⌃⌥D
|
.desktopToggle: ShortcutSpec(keyCode: 2, nsFlags: ShortcutSpec.ctrlOpt), // ⌃⌥D
|
||||||
.wardrobeToggle: ShortcutSpec(keyCode: 5, nsFlags: ShortcutSpec.ctrlOpt), // ⌃⌥G
|
.wardrobeToggle: ShortcutSpec(keyCode: 5, nsFlags: ShortcutSpec.ctrlOpt), // ⌃⌥G
|
||||||
.translate: ShortcutSpec(keyCode: 15, nsFlags: ShortcutSpec.ctrlOpt), // ⌃⌥R
|
.translate: ShortcutSpec(keyCode: 50, nsFlags: ShortcutSpec.optBit), // ⌥` (key left of 1)
|
||||||
]
|
]
|
||||||
|
|
||||||
// MARK: - Load / save (UserDefaults)
|
// MARK: - Load / save (UserDefaults)
|
||||||
@@ -199,7 +199,7 @@ enum ShortcutLogic {
|
|||||||
0:"A", 1:"S", 2:"D", 3:"F", 4:"H", 5:"G", 6:"Z", 7:"X",
|
0:"A", 1:"S", 2:"D", 3:"F", 4:"H", 5:"G", 6:"Z", 7:"X",
|
||||||
8:"C", 9:"V", 11:"B", 12:"Q", 13:"W", 14:"E", 15:"R", 16:"Y",
|
8:"C", 9:"V", 11:"B", 12:"Q", 13:"W", 14:"E", 15:"R", 16:"Y",
|
||||||
17:"T", 31:"O", 32:"U", 33:"[", 34:"I", 35:"P", 37:"L", 38:"J",
|
17:"T", 31:"O", 32:"U", 33:"[", 34:"I", 35:"P", 37:"L", 38:"J",
|
||||||
40:"K", 45:"N", 46:"M", 30:"]", 49:"Space",
|
40:"K", 45:"N", 46:"M", 30:"]", 49:"Space", 50:"`", 27:"-", 29:"0",
|
||||||
36:"↩", 51:"⌫", 53:"⎋",
|
36:"↩", 51:"⌫", 53:"⎋",
|
||||||
123:"←", 124:"→", 125:"↓", 126:"↑",
|
123:"←", 124:"→", 125:"↓", 126:"↑",
|
||||||
18:"1", 19:"2", 20:"3", 21:"4", 23:"5", 22:"6", 26:"7", 28:"8", 25:"9",
|
18:"1", 19:"2", 20:"3", 21:"4", 23:"5", 22:"6", 26:"7", 28:"8", 25:"9",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import SwiftUI
|
|||||||
import AppKit
|
import AppKit
|
||||||
import Translation
|
import Translation
|
||||||
|
|
||||||
// MARK: - Translator (Func → Переводчик, ⌃⌥R)
|
// MARK: - Translator (Func → Переводчик, ⌥`)
|
||||||
//
|
//
|
||||||
// Takes the text selected in the front app (Accessibility; falls back to a simulated ⌘C
|
// Takes the text selected in the front app (Accessibility; falls back to a simulated ⌘C
|
||||||
// with the clipboard restored afterwards; then to whatever is already on the clipboard),
|
// with the clipboard restored afterwards; then to whatever is already on the clipboard),
|
||||||
@@ -26,8 +26,8 @@ enum TranslatorRun {
|
|||||||
guard let source = await SelectionGrabber.grab(), !source.isEmpty else {
|
guard let source = await SelectionGrabber.grab(), !source.isEmpty else {
|
||||||
state.translation = TranslationResult(source: "", toRussian: true,
|
state.translation = TranslationResult(source: "", toRussian: true,
|
||||||
error: SelectionGrabber.trusted
|
error: SelectionGrabber.trusted
|
||||||
? "Не нашёл выделенного текста. Выдели текст в приложении и нажми ⌃⌥R."
|
? "Не нашёл выделенного текста. Выдели текст в приложении и нажми ⌥`."
|
||||||
: "Дай BroV доступ: Системные настройки → Конфиденциальность → Универсальный доступ → BroV. Потом выдели текст и нажми ⌃⌥R.",
|
: "Дай BroV доступ: Системные настройки → Конфиденциальность → Универсальный доступ → BroV. Потом выдели текст и нажми ⌥`.",
|
||||||
loading: false)
|
loading: false)
|
||||||
show(state)
|
show(state)
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user