Forum>Software>Aktuelle Rechtschreibkorrektur mit Apple Script

Aktuelle Rechtschreibkorrektur mit Apple Script

Dom Juan
Dom Juan14.01.1919:16
Hallo,
Ich versuche grade ein Apple Script auf die Beine zu bekommen, welches mir nur sagt welche Sprache grade als Rechtschreibkorrektur dient. Aber das hier
tell application "System Preferences"
    activate
    reveal anchor "Text" of pane id "com.apple.preference.keyboard"
    delay 0.5
    tell application "System Events"
        tell pop up button 3 of tab group 1 of window 1 of application process "System Preferences"
            get (value) of menu 1
            print (value) of menu 1
        end tell
    end tell
    quit
end tell
Schlägt fehl. Ab dem " get (value)".
Hilft mir flott wehr? 😃 Danke!
„Mais lorsqu'on en est maître une fois, il n'y a plus rien à dire ni rien à souhaiter.“
0

Kommentare

Dom Juan
Dom Juan14.01.1919:19
Nächste Frage wäre dann übrigens, ob es eine Möglichkeit gibt, dass System Prefs dabei nicht das aktuell offene Programm "verdrängt", sondern den Ablauf im Hintergrund macht.
„Mais lorsqu'on en est maître une fois, il n'y a plus rien à dire ni rien à souhaiter.“
0
Megaseppl14.01.1921:56
Versuch es mal damit:

tell application "System Preferences"
    activate
    reveal anchor "Text" of pane id "com.apple.preference.keyboard"
    delay 0.5
    tell application "System Events"
        tell pop up button 3 of tab group 1 of window 1 of application process "System Preferences"
            display dialog value as string buttons {"Ich hasse Apple Script!"}
        end tell
    end tell
    quit
end tell
0
Megaseppl14.01.1921:59
Und wenn du es nicht im Vordergrund haben willst, benutze dies:

tell application "System Preferences"
    reveal anchor "Text" of pane id "com.apple.preference.keyboard"
    delay 0.5
    tell application "System Events"
        tell pop up button 3 of tab group 1 of window 1 of application process "System Preferences"
            display dialog value as string buttons {"Ich hasse Apple Script immernoch!"}
        end tell
    end tell
    quit
end tell
0
MikeMuc14.01.1922:27
Gibts da echt kein Setting was man da auslesen kann. Also was, was sich mit do script "Defaults read xxx.yyy.zz auslesen läßt? Irgendwo muß das OS doch die Einstellung speichern.
UI-Scripting ist doch immer nur eine Notlösung wenn alle anderen Stricke schon gerissen sind.
+4
Dom Juan
Dom Juan15.01.1906:54
@Megaseppl
Supi, klein Juan dankt Dir 😉

@MikeMuc
Keine Ahnung 🤷🏻‍♂️ Das übersteigt bei weitem meine bescheidenen Kenntnisse 😃
„Mais lorsqu'on en est maître une fois, il n'y a plus rien à dire ni rien à souhaiter.“
0
MikeMuc15.01.1909:44
Dom Juan
??? Den das ist eigentlich deutlich einfacher und kürzer als UI Scripting welches schon beim Update wieder „kaputt“ gehen kann.
In irgendeiner .plist wir die Einstellung schon drin stehen. Und dann ist man mit defaults read um Längen besser dran.
+2
Megaseppl15.01.1912:08
MikeMuc
Dom Juan
??? Den das ist eigentlich deutlich einfacher und kürzer als UI Scripting welches schon beim Update wieder „kaputt“ gehen kann.
In irgendeiner .plist wir die Einstellung schon drin stehen. Und dann ist man mit defaults read um Längen besser dran.
Grundsätzlich gebe ich dir da recht. Dort wird vermutlich aber nur ein sprachneutraler Referenzwert drin stehen statt der Sprachbezeichnung als normaler Namens-String. Im besten Fall ein Language-ISO-Wert oder ein Culture-Wert ("en" bzw. "en-GB"), im schlimmsten Fall nur eine ID oder UID als Referenz.

Eleganter fände ich über die Klasse NSSpellChecker und dessen Funktion language() die aktuelle Sprache auszulesen. Da muss man die plist nicht kennen.
Wird aber in Apple Script nicht gehen.
0
MikeMuc15.01.1914:09
So, nun bin rich bin wenig neugierig geworden.
In dem fraglichen Menü steht bei mit (10.12.6 entweder "Automatisch nach Sprache" oder ein Sprachname.

Megaseppl:
ja, da hast du ebenfalls (teilweise) Recht. Mit
do shell script "defaults read Apple Global Domain NSPreferredSpellServerLanguage" ergibt
- bei Canadian English "en_CA" und
- bei Deutsch "de"
- bei "Automatisch nach Sprache" ebenfalls "de" wenn Deutsch die Systemsprache ist.
Damit wäre prinzipiell schon mal die Sprache geklärt. Fehlt nur noch die "Übersetzungstabelle" aus der man über das Kürzel die jeweilige aktuelle Landessprache auslesen kann... Ich bin mir sicher, das unser geliebtes System irgendwo diese Tabelle irgendwo versteckt hat und man die auch auslesen kann.

So, nach einiger Suche bin ich hier gelandet und aus dem letzen Codefetzen dort habe ich das hier abgeleitet:
set aLocaleID to do shell script "defaults read NSGlobalDomain NSPreferredSpellServerLanguage"
use framework "Foundation"

set aLocale to (current application's NSLocale's currentLocale())
set aLocaleDesc to (aLocale's displayNameForKey:(current application's NSLocaleIdentifier) value:aLocaleID)
set aDict to (current application's NSDictionary's dictionaryWithDictionary:{desc:aLocaleDesc, code:aLocaleID})
log aLocaleDesc as list

Ob die Teile mit "current Application's" noch verbesserungsbedürftig sind, kann ich mangels Wissen nicht entscheiden. Vielleicht gibt es da auch ein "current System" oder so. Aber immerhin kommt schon mal ein lesbarer Text anstatt eines Kürzels raus
+1
Dom Juan
Dom Juan19.01.1913:55
Ok, ich bins nochmal.
Ich nutze das Script mit BetterTouchTool in der Touch Bar. Dort wird ein Widget angezeigt mit den Einstellungen "Run Script and Return Value". Das habe ich meinen Bedürfnissen mit Eure Hilfe folgendermaßen angepasst:
tell application "System Preferences"
    reveal anchor "Text" of pane id "com.apple.preference.keyboard"
    delay 0.5
    tell application "System Events"
        tell pop up button 3 of tab group 1 of window 1 of application process "System Preferences"
            if value is "Automatic by language" then
                return "🌐"
            else if (value) is "Français" then
                return "🇫🇷"
            else if (value) is "Deutsch" then
                return "🇩🇪"
            else if (value) is "Italiano" then
                return "🇮🇹"
            else if (value) is "U.S. English" then
                return "🇺🇸"
            else
                return "❔"
            end if
        end tell
        quit
    end tell
    quit
end tell
Funktioniert auch hervorragend, bis auf ein Detail - System Prefs wird nicht beendet.
Hab ich im Code was verschlafen, oder ist das ein Programmierproblem im Widget seitens der BTT Developer?
„Mais lorsqu'on en est maître une fois, il n'y a plus rien à dire ni rien à souhaiter.“
0
Dom Juan
Dom Juan19.01.1914:13
Mist, war zu langsam um meinen Vorherigen Beitrag zu löschen. Da das Script läuft sobald das Widget erscheint wird die App wohl wieder neu gestartet.
Ein Workaround der funktioniert ist, dem Knopf der die Touch Bar Gruppe schließt eine Folgeaktion zu verpassen, die System Preferences beendet.
Frage dazu.
tell application "System Preferences"
    quit
end tell
Ist mir da etwas zu stumpf. Ich hätte System Prefs gerne nur geschlossenen, wenn der Textreiter auch offen ist um mir Unfälle zu ersparen, wenn die Prefs mal in nem anderen Fenster offen sind.
tell application "System Preferences"
    if exists anchor "Text" of pane id "com.apple.preference.keyboard" then
        quit application "System Preferences"
    else
        donothing
    end if
end tell
Schließt die App aber ganz brutal, egal ob der Text anchor jetzt offen ist oder nicht ☹️ Hat jemand die Güte einem Laien zu erklären warum?
„Mais lorsqu'on en est maître une fois, il n'y a plus rien à dire ni rien à souhaiter.“
0
Weia19.01.1917:00
Dom Juan
Schließt die App aber ganz brutal, egal ob der Text anchor jetzt offen ist oder nicht ☹️ Hat jemand die Güte einem Laien zu erklären warum?
Es ist aber von Effizienz, Schnelligkeit usw. doch – entschuldige – wirklich grotesk, die Applikation System Preferences zu bemühen, nur um einen defaults-Wert herauszufinden. Das geht viel einfacher und ohne solche Komplikationen direkt, und MikeMuc hat ja auch schon beschrieben, wie.
+2
Weia19.01.1917:06
Dom Juan
@MikeMuc
Keine Ahnung 🤷🏻‍♂️ Das übersteigt bei weitem meine bescheidenen Kenntnisse 😃
Also, wer es schafft, AppleScript zu verstehen, dem sollte doch nicht mal die allgemeine Relativitätstheorie nennenswerte Mühen bereiten. Mir jedenfalls ist Ersteres in Gegensatz zu Letzterem nie gelungen.

+2
Dom Juan
Dom Juan19.01.1917:44
Sicherlich. Leider beschränken sich ,eine Scriptkenntnisse auf Variablen, und das grobe Verstehen wenn ich was lese - von Schreiben ist da noch keine Rede. Daher verstehe ich MikeMucs gut gemeintem Beitrag zwar, kann ihn jedoch nicht alleine in ein funktionierendes Script umwandeln. Und da meine UI Lösung funktioniert hab ichs dabei belassen 🤷🏻‍♂️
Deswegen begnüge ich mich momentan mit der Hilfestellung, wie ich ein bestimmtes Programm nur dann beende, wenn ein bestimmtes Fenster mit einem bestimmten Reiter offen ist 😇
Sollte sich jemand die Mühe machen wollen, und mir einen Crashkurs über Scripting zu machen der mir bei meinem Problemchen hilft ist das natürlich auch willkommen - nur erwarte ich dies von niemandem 🙂 Ich bin mit einer Zeile UI Scripting happy!
„Mais lorsqu'on en est maître une fois, il n'y a plus rien à dire ni rien à souhaiter.“
0
Weia19.01.1919:38
Hier ist eine Shellskript-Version für Deine gewünschte Funktionalität:

#!/bin/sh

MULTI=`defaults read -g NSSpellCheckerAutomaticallyIdentifiesLanguages`

if [ $MULTI -eq 1 ]; then echo 🌐
else
    MULTI=`defaults read -g NSPreferredSpellServerLanguage` 
    if   [ $MULTI = fr ]; then echo 🇫🇷
    elif [ $MULTI = de ]; then echo 🇩🇪
    elif [ $MULTI = it ]; then echo 🇮🇹
    elif [ $MULTI = en ]; then echo 🇺🇸
    else echo ❔
    fi
fi

Sollte selbsterklärend sein.

Ich kenne BetterTouchTool nicht und weiß daher nicht, ob es auch mit Shellskripten umgehen kann.

Falls nein, gibt es ja wohl auch eine AppleScript-Funktion, um ein Shellskript auszuführen. Das überlasse ich aber anderen – wie gesagt, ich mag AppleScript nicht mal mit der Kneifzange anfassen…
+2
Dom Juan
Dom Juan19.01.1920:11
Ist selbsterklärend, danke Dir! Ist auch unbedeutend (etwa 3x) schneller als mein UI 😯
Auf das Risiko hin erschlagen zu werden, zwei Dinge:
  • Ich habe noch ein importiertes Lexikon (da macOS die entsprechende Sprache nicht standardmäßig mitliefert) welches mit in die erkannte Liste sollte. Wie kann ich den entsprechenden Wert auslesen?
  • Gibt es ein Script, mit dem ich die Sprache auch ändern könnte?
Mit Apple Script geht das dann (zugegebener Maßen sehr be💩) mit dem Script
tell application "System Preferences"
    reveal anchor "Text" of pane id "com.apple.preference.keyboard"
    delay 0.5
    tell application "System Events"
        tell pop up button 3 of tab group 1 of window 1 of application process "System Preferences"
            if (value) is not "Deutsch" then
                click
                click menu item "Deutsch" of menu 1
            else if (value) is "Français" then
                click
                click menu item "Automatic by Language" of menu 1
            end if
        end tell
    end tell
    quit
end tell
Geht sowas auch mit einem Shellskript? (*hoff*)
Danke für die Hilfsbereitschaft und Geduld mit einem Studenten 👍🏼
„Mais lorsqu'on en est maître une fois, il n'y a plus rien à dire ni rien à souhaiter.“
+1
Weia19.01.1920:47
Dom Juan
Ich habe noch ein importiertes Lexikon (da macOS die entsprechende Sprache nicht standardmäßig mitliefert) welches mit in die erkannte Liste sollte. Wie kann ich den entsprechenden Wert auslesen?
Wenn Du die Sprache in den Systemeinstellungen eingestellt hast, gibst Du in einem Terminal-Fenster
defaults read -g NSPreferredSpellServerLanguage
ein und drückst Return. Dann sollte im Terminal-Fenster eine de usw. vergleichbare Ausgabe zu lesen sein, evtl. auch mit mehr Zeichen (britisches Englisch wäre z.B. en_GB).
Gibt es ein Script, mit dem ich die Sprache auch ändern könnte?
Grundsätzlich ist das supersimpel und ganz entsprechend; Du ersetzt einfach read durch write und gibst am Ende den gewünschten Wert an. Das „Komplizierteste“ ist zu berücksichtigen, dass Automatisch nach Sprache nicht eine unter vielen möglichen gleichberechtigten Spracheinstellungen ist (wie das Pop-Up in den Systemeinstellungen nahelegt), sondern eine übergeordnete Einstellung, die alle spezifischen Spracheinstellungen außer Kraft setzt.

Also: Um Automatisch nach Sprache zu aktivieren, kannst Du im Terminal (oder einem Skript)
defaults write -g NSSpellCheckerAutomaticallyIdentifiesLanguages 1
eingeben; welche spezifische Sprache ausgewählt war (und intern bleibt!), ist dabei egal.

Willst Du zu der zuvor schon eingestellten spezifischen Sprache zurück, würdest Du einfach
defaults write -g NSSpellCheckerAutomaticallyIdentifiesLanguages 0
eingeben.

Willst Du zugleich (so wie im Pop-Up in den Systemeinstellungen) auch angeben, welche spezifische Sprache genutzt werden soll, so würdest Du z.B. für Deutsch
defaults write -g NSSpellCheckerAutomaticallyIdentifiesLanguages 0; defaults write -g NSPreferredSpellServerLanguage de
eingeben. (Zumindest auf meinem ollen macOS 10.9. bemerken die Systemeinstellungen das allerdings erst nach einem Neustart …)

Der größte Aufwand wäre (wie so oft) bei einem entsprechenden Skript dann die Nutzerschnittstelle. Sprich, ich weiß nicht, wie der Mechanismus ist, mit dem Du dem Skript dann würdest mitteilen wollen, welche Sprache ausgewählt werden soll. Je nachdem müsste dem Skript dann ein entsprechender Parameter beim Aufruf übergeben werden, und das Skript müsste den auswerten und je nachdem die entsprechenden defaults-Werte wählen.
+3
Dom Juan
Dom Juan19.01.1921:01
Alles gut! Danke Dir!!!
Mit dem Path /bin/bash und dem Parameter -c läuft das wie geschmiert!!
„Mais lorsqu'on en est maître une fois, il n'y a plus rien à dire ni rien à souhaiter.“
0
Weia19.01.1921:17
Dom Juan
Alles gut!
Prima!
Danke Dir!!!
Bitte.
0
Weia20.01.1915:32
Nur zur Vermeidung von Missverständnissen, falls hier später mal jemand drauf stößt:
Weia
(Zumindest auf meinem ollen macOS 10.9. bemerken die Systemeinstellungen das allerdings erst nach einem Neustart …)
Damit ist ein Neustart des Programms Systemeinstellungen gemeint und nicht etwa ein Neustart von macOS. Alle anderen Programme reagieren auch sofort angemessen, nur die Systemeinstellungen rechnen eben nicht damit, dass sich jemand anderes erdreistet, „ihre“ Werte zu verändern.
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.

OK MacTechNews.de verwendet Cookies unter anderem für personalisierte Inhalte, Seitenanalyse und bei der Auslieferung von Google-Anzeigen. Dies war zwar schon immer so, auf Wunsch der EU muss nun jedoch explizit darauf hingewiesen werden. Durch Nutzung der Website erklären Sie sich damit einverstanden. Weitere Informationen