Systemsprache nutzen?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Systemsprache nutzen?

Beitrag von Komoluna »

Hallo Leute

Ich wüsste gerne wie man (als Programm) die Systemsprache herausfinden kann, denn ich entwickle gerade ein Multi-Language-Programm
was beim ersten Programmstart die Systemsprache herausfinden soll.

Die Lösung sollte am besten Plattform-unabhängig sein.

Vielen Dank schonmal im voraus.

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Systemsprache nutzen?

Beitrag von theo »

Code: Alles auswählen

uses gettext;
 
...
var l,fbl:String;
begin
  GetLanguageIDs(l,fbl);
  ShowMessage(fbl);
end;

Benutzeravatar
jwdietrich
Beiträge: 173
Registriert: Mo 20. Okt 2008, 20:50
OS, Lazarus, FPC: macOS 10.4-14.1, Windows 2000-11, Raspbian (L 3.7.0, FPC 3.2.2)
CPU-Target: PowerPC, Intel, ARM
Wohnort: Hattingen, NRW
Kontaktdaten:

Re: Systemsprache nutzen?

Beitrag von jwdietrich »

theo hat geschrieben:

Code: Alles auswählen

uses gettext;
 
...
var l,fbl:String;
begin
  GetLanguageIDs(l,fbl);
  ShowMessage(fbl);
end;
Also, am Mac funktioniert das nicht, da werden leere Strings zurückgegeben.

Plattformunabhängig ist diese Lösung also nicht.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Systemsprache nutzen?

Beitrag von theo »

jwdietrich hat geschrieben:
Also, am Mac funktioniert das nicht, da werden leere Strings zurückgegeben.

Plattformunabhängig ist diese Lösung also nicht.
http://lazarus-ccr.sourceforge.net/docs ... geids.html" onclick="window.open(this.href);return false;

Benutzeravatar
jwdietrich
Beiträge: 173
Registriert: Mo 20. Okt 2008, 20:50
OS, Lazarus, FPC: macOS 10.4-14.1, Windows 2000-11, Raspbian (L 3.7.0, FPC 3.2.2)
CPU-Target: PowerPC, Intel, ARM
Wohnort: Hattingen, NRW
Kontaktdaten:

Re: Systemsprache nutzen?

Beitrag von jwdietrich »

theo hat geschrieben:
jwdietrich hat geschrieben:
Also, am Mac funktioniert das nicht, da werden leere Strings zurückgegeben.

Plattformunabhängig ist diese Lösung also nicht.
http://lazarus-ccr.sourceforge.net/docs ... geids.html" onclick="window.open(this.href);return false;
Das mag ja sein, aber es funktioniert nicht.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Systemsprache nutzen?

Beitrag von theo »

jwdietrich hat geschrieben:
Das mag ja sein, aber es funktioniert nicht.
Sind beide Parameter der Funktion leer? Dann schau doch mal, was da schief läuft auf deinem System.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Systemsprache nutzen?

Beitrag von Scotty »

Die Funktion greift auf die Systemvariablen LC und LANG zurück.

Code: Alles auswählen

procedure GetLanguageIDs(var Lang, FallbackLang: string);
begin
  lang := GetEnvironmentVariable('LC_ALL');
  if Length(lang) = 0 then
  begin
    lang := GetEnvironmentVariable('LC_MESSAGES');
    if Length(lang) = 0 then
    begin
      lang := GetEnvironmentVariable('LANG');
      if Length(lang) = 0 then
        exit;   // no language defined via environment variables
    end;
  end;
  FallbackLang := Copy(lang, 1, 2);
end;
Du kannst diese Variablen per "export" in der Konsole anzeigen lassen. Interessant ist auch die Funktion locale (https://developer.apple.com/library/mac ... ale.1.html).

Benutzeravatar
jwdietrich
Beiträge: 173
Registriert: Mo 20. Okt 2008, 20:50
OS, Lazarus, FPC: macOS 10.4-14.1, Windows 2000-11, Raspbian (L 3.7.0, FPC 3.2.2)
CPU-Target: PowerPC, Intel, ARM
Wohnort: Hattingen, NRW
Kontaktdaten:

Re: Systemsprache nutzen?

Beitrag von jwdietrich »

Nach stundenlangem Recherchieren habe ich jetzt eine Lösung gefunden, die zumindest für Mac OS X und Windows funktioniert. Für Linux muss noch eine Lösung gesucht werden.

Code: Alles auswählen

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  gettext
{$IFDEF win32}
, Windows
{$ELSE}
  {$IFDEF LCLCarbon}
, MacOSAll
  {$ENDIF}
{$ENDIF}
;        
...
 

Code: Alles auswählen

var 
  l, fbl: String;
{$IFDEF LCLCarbon}
  theLocaleRef: CFLocaleRef;
  locale: CFStringRef;
  buffer: StringPtr;
  bufferSize: CFIndex;
  encoding: CFStringEncoding;
  success: boolean;
{$ENDIF}
...
 

Code: Alles auswählen

begin
  {$IFDEF win32}
    GetLanguageIDs(l,fbl);
  {$ELSE}
    {$IFDEF LCLCarbon}
      theLocaleRef := CFLocaleCopyCurrent;
      locale := CFLocaleGetIdentifier(theLocaleRef);
      encoding := 0;
      bufferSize := 256;
      buffer := new(StringPtr);
      success := CFStringGetPascalString(locale, buffer, bufferSize, encoding);
      if success then
        fbl := string(buffer^)
      else
        fbl := '';
    {$ENDIF}
  {$ENDIF}
  ShowMessage(fbl);
end;
Dateianhänge
Systemsprache.zip
Miniprojekt für Lazarus
(127.73 KiB) 93-mal heruntergeladen

Benutzeravatar
jwdietrich
Beiträge: 173
Registriert: Mo 20. Okt 2008, 20:50
OS, Lazarus, FPC: macOS 10.4-14.1, Windows 2000-11, Raspbian (L 3.7.0, FPC 3.2.2)
CPU-Target: PowerPC, Intel, ARM
Wohnort: Hattingen, NRW
Kontaktdaten:

Re: Systemsprache nutzen?

Beitrag von jwdietrich »

Anbei nun eine erweiterte Fassung der Routine, die jetzt auch unter Linux läuft (getestet mit openSUSE 11):

Code: Alles auswählen

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  gettext
{$IFDEF win32}
, Windows
{$ELSE}
  {$IFDEF LCLCarbon}
, MacOSAll
  {$ENDIF}
{$ENDIF}
;

Code: Alles auswählen

var 
  l, fbl: String;
{$IFDEF LCLCarbon}
  theLocaleRef: CFLocaleRef;
  locale: CFStringRef;
  buffer: StringPtr;
  bufferSize: CFIndex;
  encoding: CFStringEncoding;
  success: boolean;
{$ENDIF}

Code: Alles auswählen

begin
  {$IFDEF LCLCarbon}
    theLocaleRef := CFLocaleCopyCurrent;
    locale := CFLocaleGetIdentifier(theLocaleRef);
    encoding := 0;
    bufferSize := 256;
    buffer := new(StringPtr);
    success := CFStringGetPascalString(locale, buffer, bufferSize, encoding);
    if success then
      l := string(buffer^)
    else
      l := '';
    fbl := Copy(l, 1, 2);
    dispose(buffer);
  {$ELSE}
  {$IFDEF LINUX}
      fbl := Copy(GetEnvironmentVariable('LC_CTYPE'), 1, 2);
    {$ELSE}
      GetLanguageIDs(l,fbl);
    {$ENDIF}
  {$ENDIF}
    ShowMessage(fbl);
end;
Der Code ist jetzt also insofern plattformunabhängig als er unter Windows, Desktop Linux und Mac OS X läuft. Es liefert einen Zwei-Buchstaben-ISO-Code für die aktuell eingestellte Sprache des Betriebssystems zurück, z. B. "de" für Deutsch oder "en" für Englisch.

Um Android, Solaris und BSD muss sich jemand anders kümmern, da mir hier die Expertise fehlt. Wahrscheinlich funktioniert es dort so ähnlich wie unter Linux.
Dateianhänge
Systemsprache.zip
Aktualisiertes Beispiel für Lazarus 1.0 oder 1.0.2
(127.4 KiB) 83-mal heruntergeladen

Antworten