Systemsprache nutzen?
-
- Beiträge: 565
- Registriert: So 26. Aug 2012, 09:03
- OS, Lazarus, FPC: Windows(10), Linux(Arch)
- CPU-Target: 64Bit
Systemsprache nutzen?
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
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.
Rekursion: siehe Rekursion.
Re: Systemsprache nutzen?
Code: Alles auswählen
uses gettext;
...
var l,fbl:String;
begin
GetLanguageIDs(l,fbl);
ShowMessage(fbl);
end;
- 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?
Also, am Mac funktioniert das nicht, da werden leere Strings zurückgegeben.theo hat geschrieben:Code: Alles auswählen
uses gettext; ... var l,fbl:String; begin GetLanguageIDs(l,fbl); ShowMessage(fbl); end;
Plattformunabhängig ist diese Lösung also nicht.
Re: Systemsprache nutzen?
http://lazarus-ccr.sourceforge.net/docs ... geids.html" onclick="window.open(this.href);return false;jwdietrich hat geschrieben:
Also, am Mac funktioniert das nicht, da werden leere Strings zurückgegeben.
Plattformunabhängig ist diese Lösung also nicht.
- 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?
Das mag ja sein, aber es funktioniert nicht.theo hat geschrieben:http://lazarus-ccr.sourceforge.net/docs ... geids.html" onclick="window.open(this.href);return false;jwdietrich hat geschrieben:
Also, am Mac funktioniert das nicht, da werden leere Strings zurückgegeben.
Plattformunabhängig ist diese Lösung also nicht.
Re: Systemsprache nutzen?
Sind beide Parameter der Funktion leer? Dann schau doch mal, was da schief läuft auf deinem System.jwdietrich hat geschrieben:
Das mag ja sein, aber es funktioniert nicht.
-
- 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?
Die Funktion greift auf die Systemvariablen LC und LANG zurück.
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).
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;
- 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?
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
- 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?
Anbei nun eine erweiterte Fassung der Routine, die jetzt auch unter Linux läuft (getestet mit openSUSE 11):
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.
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;
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