Sprache / Land für Benutzer ändern

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Wie kann ich für einen Benutzer die Systemsprache und die Landeseinstellungen ändern?

    Jaja, Raspberry-Pi-Konfiguration, schon klar. Nein, das Problem ist etwas komplexer.

    Ich habe auf dem System den Standardbenutzer mit eingestellten Landes- und Spracheinstellungen. Ich habe Lighttpd installiert und eingerichtet für cgi. Ich habe ein cgi-binary, welches Daten an Webseiten ausliefert.

    Starte ich das Programm unter dem Standardbenutzer, werden die Monatsnamen korrekt in Deutsch ausgegeben. Wird es allerdings von der Webseite angefragt, also über Lighttpd gestartet, liefert es die Monatsnamen in Englisch.

    Es scheint also, dass das Programm - logischerweise - nicht als Standardbenutzer läuft, sondern wahrscheinlich als Benutzer www-data. Nun müsste ich für diesen Benutzer die Länder- und Spracheinstellungen ebenfalls auf Deutsch ändern. Das scheint aber nicht zu gehen. Alle Anleitungen zu locale gehen davon aus, dass es nur eine Ländereinstellung gibt und diese für alle gilt.

    Wie bekomme ich den Raspberry dazu, dass mein Programm mit den eingestellten Ländereinstellungen arbeiten kann?


    Workaround wäre, dass ich im Programm die Ländereinstellungen fest auf Deutsch setze. Das kann aber nicht der Sinn von Lokalisierung sein, oder?

  • Ich weiss es auch nicht, aber ich erinnere mich, dass ich in einem ähnlichen Fall mit PHP in der php.ini sowas wie intl.default_locale = de_DE.UTF-8 setzen musste.

    In einem andern Fall, wo ein HTTP-Server mit Mono realisiert war, musste ich beim Starten des Servers eine Environment-Variable setzen um die richtige Sprache zu bekommen. Das hat dann irgendwie so ausgesehen:
    [font="arial, sans-serif"]

    Code
    env LANG=de_DE.UTF-8 mono HttpServer.exe

    [/font]
    Im Moment habe ich keinen Raspi verfügbar wo ich mal kurz testen könnte. Wenn du das Programm selber geschrieben hast oder den Quell-Code hast, dann dürfte das Setzen der Locales eigentlich nicht so schwierig sein.

    N.B. In meinem oben erwähnten Fall mit Mono hat das allerdings zu Problemen mit MySQL geführt, da dadurch falsche Werte in der DB gespeichert wurden und die Programme angepasst werden mussten um solche Probleme zu vermeiden.

    Einmal editiert, zuletzt von pgloor (5. Juni 2017 um 15:31)

  • Ja, natürlich kann ich die Spracheinstellungen im Programm fest auf Deutsch setzen. Muss ich mit Datumstrenner und Zahlentrenner auch schon machen, weil es einfach Mist ist, wenn ein Programm deutsches Datumsformat in eine Datei schreibt und ein anderes Programm versucht englisches Datumsformat zu lesen.

    Aber dafür habe ich doch eigentlich die Lokalisierung im Betriebssystem, damit ich mich darum nicht kümmern muss und das Programm das nimmt, was der Benutzer eingestellt hat.

  • Ich hab ein bisschen mit einem selber geschriebenem Datums-Server rum gespielt und kann das Problem bisher nicht ganz nachvollziehen. Bei mir wird IMMER die systemweit gesetzte Default-Einstellung (aus /etc/default/locale) übernommen. Bis jetzt habe ich allerdings noch keinen Versuch mit einem Daemon der unter www-data läuft gemacht, sondern nur mit Aufrufen in der Art "sudo -u www-data <befehl>". Es ist natürlich möglich, dass damit jeweils die aktuellen Settings des Users übergeben werden.

    Ich werde morgen mal einen Versuch mit einem Daemon machen und mir vielleicht auch mal Lighttpd genauer unter die Lupe nehmen. Was jedenfalls bei mir immer ohne Probleme ging waren Programm-Starts der folgenden Art:

    Code
    sudo -u www-data /bin/bash -c 'LANG=en_US.UTF-8 /opt/datum_server/bin/datum_server'

    Gibt "Monday" gefolgt vom Datum und der aktuellen Zeit zurück.

    Code
    sudo -u www-data /bin/bash -c 'LANG=de_CH.UTF-8 /opt/datum_server/bin/datum_server'

    Gibt "Montag" gefolgt vom Datum und der aktuellen Zeit zurück.

    /opt/datum_server/bin/datum_server ist ein simpler WebServer den ich in Go geschrieben habe, der nichts anderes macht, als bei einer Anfrage die Shell mit dem Befehl "date '+%A, %d.%m.%Y, %H:%M:%S' "aufzurufen und die Ausgabe des Befehls an den Browser zurückzugeben.

  • sudo -u www-data ./meinprogram in der Bash gibt genauso deutsche Monatsnamen aus wie ./meinprogram als Standarduser ausgeführt oder als root ausgeführt.

    Nur über den Webserver aufgerufen kommen englische Namen. Lighttpd scheint die Lokalisierungseinstellungen nicht weiterzugeben. Dann bleibt offenbar nur, das fest oder über eine Konfig-Datei im Programm selbst zu machen.

  • Wie werden die Daten denn vom Server abgerufen?

    Also so ein lighty sollte ja bspw. auf die im Browser angegebene Locale reagieren. Wird nun der Aufruf aber nicht via Browser, sondern von einem Script auf einem anderen Server ausgeführt, dann gehe ich davon aus, dass EN als Fallback genutzt wird oder aber dieser andere Server bspw. mit en_US die Anfrage an den Datumsserver sendet.

    Klar, möglicherweise wäre eine harte Verdrahtung von de_DE im Server denkbar, aber das wäre die unschönste Variante in meinen Augen (und wie das konkret funktioniert konnten meine letzten 5 Minuten Internet-Recherche auch nicht wirklich herausfinden).

    .NET-, Unity3D-, Web-Dev.
    Mikrocomputer-Hobbyist.

  • Aufgerufen wird aus dem Browser mit 192.168.2.99/cgi-bin/meinprog.cgi. Das cgi liefert dann einen Text zurück, der angezeigt wird.

    Egal ob von einem anderen Rechner oder vom Firefox auf dem Raspi, bei letzterem auch mit localhost, es wird immer das englische Format ausgegeben.

    Ich würde nicht "im Server" hart verdrahten, ich würde meinem Programm sagen, dass es halt die deutschen Monatsnamen ausgibt. Das Programm ist in Lazarus / Freepascal geschrieben und da kann ich die Formateinstellungen modifizieren.

  • Okay, aber du hattest geschrieben, dass die Daten von einer Webseite eingebunden werden? Oder meinst du einfach nur, dass du dein Skript via Browser aufrufst?

    .NET-, Unity3D-, Web-Dev.
    Mikrocomputer-Hobbyist.

  • Zum Testen rufe ich das direkt im Browser über den Link auf. Eigentlich soll das in eine Webseite eingebunden werden, die ebenfalls auf dem Raspi liegt und in der per JS (request.open("GET", "cgi-bin/meinprog.cgi?t=" + dummy, true);) regelmäßig Daten aktualisiert werden sollen, indem Elemente nachgeladen werden.

    Das funktioniert soweit auch, die Daten werden ausgeliefert und in die Seite eingebunden. Nur wird halt die falsche Monatskennung ausgegeben, weil mein Programm denkt es läuft auf einem Rechner mit englischer Landes- und Spracheinstellung. Aber eben nur, wenn es vom Webserver, sprich Lighttpd ausgeführt wird.

  • Hallo Timm,

    Lösungsvorschlag im Lazarus-Forum auf Deine dort auch gepostete Frage.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hmm... ich hätte jetzt auch erwartet, dass das was im Lazarus-Forum steht funktioniert. Ansonsten habe ich heute noch etwas rum gespielt und auch keine Erklärung gefunden, warum für die Daemons die Locales nicht gelten. Es ist bei meinem eigenen Programm nicht anders, wenn ich es als Deamon mit dem User www-data (gleich aufgesetzt wie Lighttpd) laufen lasse.

    Grundsätzlich funktioniert es aber nicht schlecht, wenn man in einem Script z.B. einfach LC_ALL=de_DE.UTF-8 dem date Befehl voranstellt. In anderen Programmiersprachen ist es vielleicht etwas aufwändiger. Mich hat es noch auf die Idee gebracht, die Sprache des Web-Browsers abzufragen und diese zu verwenden. Mein CGI Bash-Script findest du im Anhang.

    Nebenbei erwähnt, lohnt es sich, sich mal die Manuals von date anzuschauen. Es gibt verschiedene Teile, die entsprechend den Locales ausgegeben werden, so lässt ich eigentlich ganz gut individuelle Datum/Zeit Ausgaben zusammenstellen, ohne dass viel Programmiert werden muss.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!