C sei deine Sprache

Vor einiger Zeit wollte ich gerne dieses schöne Script https://github.com/joshpetit/rofi-mixer zur Audio-Steuerung in meinem Window-Manager QTile benutzen.
An sich soll da eine Auswahl kommen über welches Gerät man denn gerne Audio abspielen möchte, bei mir war die Liste leider leer.
Zu meinem Glück handelt es sich hier um Python-Code und das Programm ist auch nicht all zu groß, der relevante Code ist in etwa das was hier passiert:

def list_sinks_sources():
    res = os.popen(f"pactl list {dev_type}s")
    lines = res.read()
    res = os.popen(f"pactl get-default-{dev_type}")
    def_device = res.read().strip()

    last_device_match = ""
    last_volume_match = ""
    last_volume_percent = ""
    last_mute_match = ""
    prefix = ""
    mute_icon = ""
    rofi_info = ""

    description_re = re.compile(r"\s*Description: ")
    volume_re = re.compile(r"\s*Volume: ")
    mute_re = re.compile(r"\s*Mute: ")

    for line in lines.splitlines():
        if description_re.match(line):

Wichtig davon waren die Zeilen 4, 15 und 20, also

res = os.popen(f"pactl list {dev_type}s")
lines = res.read()
description_re = re.compile(r"\s*Description: ")
if description_re.match(line):

Praktisch wird:

pactl list sinks

aufgerufen, was alle "Sinks" aka. Ausgaberäte auflistet.

Anschließend wird ein regulärer Ausdruck erstellt der nach "Description" sucht und die jeweils aktuelle Zeile der Ausgabe von pactl daraufhin geprüft.
Was immer in Description steht wird dann als Ausgabegerät zur Auswahl dem Benutzer angezeigt (der Teil ist hier nicht kopiert).

Wenn ich auf meinem System manuell "pactl list sinks" ausführe bekomme ich folgende Ausgabe:

Ziel #0
	Status: SUSPENDED
	Name: alsa_output.pci-0000_c4_00.6.HiFi__hw_Generic_1__sink
	Beschreibung: Family 17h (Models 10h-1fh) HD Audio Controller Speaker + Headphones
	Treiber: module-alsa-card.c
	Abtastwert-Angabe: s16le 2ch 44100Hz
	Kanalzuordnung: front-left,front-right
	Besitzer-Modul: 9
	Stumm: nein
	Lautstärke: front-left: 58872 /  90% / -2,79 dB,   front-right: 58872 /  90% / -2,79 dB
	       Verteilung 0,00

Wenn ich darin wie das obige Program nach "Description" suche, werde ich keinen Erfolg haben, obwohl ich lauter Sinks angezeigt bekomme.
Der Grund ist einfach, mein System ist auf "Deutsch" konfiguriert, mehrere Kommandozeilenprogramme sind lokalisiert (u.a. eben pactl) und geben entsprechend Daten in der Landessprach aus.

Das muss man bedenken wenn man externe Tools in Scripten aufruft.

Man kann das Problem umgehen, in dem man bei der Ausfürung die Umgebungsvariable "LANG" auf "C" setzt.
Die Umgebungsvariable LANG definiert die Sprache die genutzt werden soll.
Man könnte sie auch auf "en_us.utf-8" setzen, aber es ist nicht gesagt das die entsprechenden Lokalsierungen installiert sind. "C" hingegen sollte im Prinzip immer installiert sein und ist gedacht für Ausgaben die an Programme gemacht werden.

In obigem Programm wurde das Problem behoben, durch ein einfaches am Beginn des Scriptes:

os.environ["LANG"] = "C"

seit dem funktioniert es auch auf meinem Computer (die Änderungen sind zwischenzeitlich upstream gemerged).