AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Windows Sprache ermitteln

Ein Thema von TUX_der_Pinguin · begonnen am 9. Jul 2008 · letzter Beitrag vom 6. Feb 2009
Antwort Antwort
Seite 1 von 3  1 23      
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

Windows Sprache ermitteln

  Alt 9. Jul 2008, 13:51
Hallo,
ich möchte gern in meiner Software Fehlermeldungen einbinden diese sollen jenachdem welche Sprache in Windows eingestellt ist
angezeigt werden. Z.b. wenn bei einem Datei öffnen versuch die Routine abbricht weil die Datei nicht gefunden werden kann soll
folgende Meldung erscheinen...

Deutsch: "Die Datei "test.txt" konnte nicht gefunden werden!"
Englisch: "File "test.txt" not found!"

So jetzt habe ich hier im Forum gesucht und habe auch etwas gefunden ich bin mir nur noch nicht ganz sicher ob das der richtige ansatzt ist.

Hier mal eine kleine Testanwendung für die unterschiedlichen Möglichkeiten.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bla:array[0..1023] of Char;

implementation

{$R *.dfm}

function GetLanguageNameByID(AID: Integer): WideString;
begin
  SetLength(Result,MAX_PATH);
  SetLength(Result, VerLanguageNameW(AID,@Result[1], length(Result)));
end;

function GetWindowsLanguage(LCTYPE: LCTYPE {type of information}): string;
var
  Buffer : PChar;
  Size : integer;
begin
  Size := GetLocaleInfo (LOCALE_USER_DEFAULT, LCType, nil, 0);
  GetMem(Buffer, Size);
  try
    GetLocaleInfo (LOCALE_USER_DEFAULT, LCTYPE, Buffer, Size);
    Result := string(Buffer);
  finally
    FreeMem(Buffer);
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  LabeledEdit1.Text := GetLanguageNameByID(GetSystemDefaultLangID);   //Deutsch (Deutschland)
  LabeledEdit2.Text := GetLanguageNameByID(GetUserDefaultLangID);   //Englisch (USA)

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SENGCOUNTRY, @bla, sizeof(bla));
  Memo1.Lines.Add('Name des Landes (Englisch) : '+bla);         

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SENGLANGUAGE, @bla, sizeof(bla));
  Memo1.Lines.Add('Name der Sprache auf Englisch: '+bla);

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SLANGUAGE, @bla, sizeof(bla));
  Memo1.Lines.Add('Name der Sprache lokalisiert : '+bla);

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SNATIVELANGNAME, @bla, sizeof(bla));
  Memo1.Lines.Add('Orginalname der Sprache : '+bla);

  GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SNATIVECTRYNAME , @bla, sizeof(bla));
  Memo1.Lines.Add('Orginalname des Landes : '+bla);


  Memo1.Lines.Add('');
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_ILANGUAGE));
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_SLANGUAGE));
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_SENGLANGUAGE));
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_SABBREVLANGNAME));
  Memo1.Lines.Add(GetWindowsLanguage(LOCALE_SNATIVELANGNAME));

end;


end.
Jetzt habe ich mein "Deutsches" Windows XP in den Reginal Einstellungen auf Englisch umgestellt und erhalte, als Ergebnis folgendes.

Delphi-Quellcode:
LabeledEdit1.Text := GetLanguageNameByID(GetSystemDefaultLangID);   //Deutsch (Deutschland)
LabeledEdit2.Text := GetLanguageNameByID(GetUserDefaultLangID);   //Englisch (USA)
Im Memofeld erscheinen dann folgende Informationen...
Zitat:
Name des Landes (Englisch) : Germany
Name der Sprache auf Englisch: German
Name der Sprache lokalisiert : Deutsch (Deutschland)
Orginalname der Sprache : Deutsch
Orginalname des Landes : Deutschland

0409
Englisch (USA)
English
ENU
English

Wenn ich die System Sprache abfrage ist klar das die Sprache angezeigt wird in der das Windows Installiert wird auch wenn
die Sprache umgestellt ist, oder aber ich zeige die Meldungen in der Sprache an die der Benutzer eingestellt hat. Dies
muß ich für mich entscheiden was mir sinnvoller erscheint.

Ein Problem ist aber noch wie Frage ich auf "Deutsch" oder "Englisch" ab, wenn es eine andere Länderinstalltion ist Beisp.
"Deutsch (Schweiz)" oder "English (Great Briten)" usw.

Ich könnte mir das so vorstellen, ob das aber so vernünftig funktioniert...
Delphi-Quellcode:
GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SENGLANGUAGE, @bla, sizeof(bla));
if bla = 'Deutschthen
  ShowMessage('Datei "test.txt" konnte nicht gefunden werden');

if bla = 'Englishthen
  ShowMessage('File not found!');

So Richtig zufrieden bin ich da irgendwie nicht mit, ob ich das jetzt alles so richtig habe oder es da noch ein anderer Ansatz vorhanden ist.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 14:04
Zitat von TUX_der_Pinguin:
Ein Problem ist aber noch wie Frage ich auf "Deutsch" oder "Englisch" ab, wenn es eine andere Länderinstalltion ist Beisp.
"Deutsch (Schweiz)" oder "English (Great Briten)" usw.
Also das würde ich nun nicht mehr unterscheiden. Oder willst du auch noch Sprachdateien in Scheizer Deutsch und Österreichisch beilegen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 14:23
Das will ich ja grade nicht, ich will sicher sein das ich eine Abfrage habe die auf die ganze "Familie" abfragt egal ob das
ein Österreichisches oder ein Windows aus Lichtenstein ist.

Ich habe jetzt eine Abfrage genommen die mit 'LOCALE_SNATIVELANGNAME' arbeitet.

if AnsiLowerCase(GetWindowsLanguage(LOCALE_SNATIVELANGNAME)) = 'deutschthen ... Ich war mir halt nur nicht sicher ob das alles so klappt weil es ja die unterschiedlichen Ländern mit der gleichen Sprache gibt.
z.B. die Abkürzungen 'LOCALE_SABBREVLANGNAME' bringen mir nichts da "Niederländisch (Niederlande)" mit NLD und "Niederländisch (Belgien)" mit NLB abgekürzt wird.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#4

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 14:33
GetKeyboardLayout:

Man kann noch GetKeyboardLayout abfragen, dann hast Du das gesuchte Land.

oder so:

Delphi-Quellcode:
const
  IDAfrikaans = $0436; IDAlbanian = $041C;
  IDArabicAlgeria = $1401; IDArabicBahrain = $3C01;
  IDArabicEgypt = $0C01; IDArabicIraq = $0801;
  IDArabicJordan = $2C01; IDArabicKuwait = $3401;
  IDArabicLebanon = $3001; IDArabicLibya = $1001;
  IDArabicMorocco = $1801; IDArabicOman = $2001;
  IDArabicQatar = $4001; IDArabic = $0401;
  IDArabicSyria = $2801; IDArabicTunisia = $1C01;
  IDArabicUAE = $3801; IDArabicYemen = $2401;
  IDArmenian = $042B; IDAssamese = $044D;
  IDAzeriCyrillic = $082C; IDAzeriLatin = $042C;
  IDBasque = $042D; IDByelorussian = $0423;
  IDBengali = $0445; IDBulgarian = $0402;
  IDBurmese = $0455; IDCatalan = $0403;
  IDChineseHongKong = $0C04; IDChineseMacao = $1404;
  IDSimplifiedChinese = $0804; IDChineseSingapore = $1004;
  IDTraditionalChinese = $0404; IDCroatian = $041A;
  IDCzech = $0405; IDDanish = $0406;
  IDBelgianDutch = $0813; IDDutch = $0413;
  IDEnglishAUS = $0C09; IDEnglishBelize = $2809;
  IDEnglishCanadian = $1009; IDEnglishCaribbean = $2409;
  IDEnglishIreland = $1809; IDEnglishJamaica = $2009;
  IDEnglishNewZealand = $1409; IDEnglishPhilippines = $3409;
  IDEnglishSouthAfrica = $1C09; IDEnglishTrinidad = $2C09;
  IDEnglishUK = $0809; IDEnglishUS = $0409;
  IDEnglishZimbabwe = $3009; IDEstonian = $0425;
  IDFaeroese = $0438; IDFarsi = $0429;
  IDFinnish = $040B; IDBelgianFrench = $080C;
  IDFrenchCameroon = $2C0C; IDFrenchCanadian = $0C0C;
  IDFrenchCotedIvoire = $300C; IDFrench = $040C;
  IDFrenchLuxembourg = $140C; IDFrenchMali = $340C;
  IDFrenchMonaco = $180C; IDFrenchReunion = $200C;
  IDFrenchSenegal = $280C; IDSwissFrench = $100C;
  IDFrenchWestIndies = $1C0C; IDFrenchZaire = $240C;
  IDFrisianNetherlands = $0462; IDGaelicIreland = $083C;
  IDGaelicScotland = $043C; IDGalician = $0456;
  IDGeorgian = $0437; IDGermanAustria = $0C07;
  IDGerman = $0407; IDGermanLiechtenstein = $1407;
  IDGermanLuxembourg = $1007; IDSwissGerman = $0807;
  IDGreek = $0408; IDGujarati = $0447;
  IDHebrew = $040D; IDHindi = $0439;
  IDHungarian = $040E; IDIcelandic = $040F;
  IDIndonesian = $0421; IDItalian = $0410;
  IDSwissItalian = $0810; IDJapanese = $0411;
  IDKannada = $044B; IDKashmiri = $0460;
  IDKazakh = $043F; IDKhmer = $0453;
  IDKirghiz = $0440; IDKonkani = $0457;
  IDKorean = $0412; IDLao = $0454;
  IDLatvian = $0426; IDLithuanian = $0427;
  IDMacedonian = $042F; IDMalaysian = $043E;
  IDMalayBruneiDarussalam = $083E; IDMalayalam = $044C;
  IDMaltese = $043A; IDManipuri = $0458;
  IDMarathi = $044E; IDMongolian = $0450;
  IDNepali = $0461; IDNorwegianBokmol = $0414;
  IDNorwegianNynorsk = $0814; IDOriya = $0448;
  IDPolish = $0415; IDBrazilianPortuguese = $0416;
  IDPortuguese = $0816; IDPunjabi = $0446;
  IDRhaetoRomanic = $0417; IDRomanianMoldova = $0818;
  IDRomanian = $0418; IDRussianMoldova = $0819;
  IDRussian = $0419; IDSamiLappish = $043B;
  IDSanskrit = $044F; IDSerbianCyrillic = $0C1A;
  IDSerbianLatin = $081A; IDSesotho = $0430;
  IDSindhi = $0459; IDSlovak = $041B;
  IDSlovenian = $0424; IDSorbian = $042E;
  IDSpanishArgentina = $2C0A; IDSpanishBolivia = $400A;
  IDSpanishChile = $340A; IDSpanishColombia = $240A;
  IDSpanishCostaRica = $140A; IDSpanishDominicanRepublic = $1C0A;
  IDSpanishEcuador = $300A; IDSpanishElSalvador = $440A;
  IDSpanishGuatemala = $100A; IDSpanishHonduras = $480A;
  IDMexicanSpanish = $080A; IDSpanishNicaragua = $4C0A;
  IDSpanishPanama = $180A; IDSpanishParaguay = $3C0A;
  IDSpanishPeru = $280A; IDSpanishPuertoRico = $500A;
  IDSpanishModernSort = $0C0A; IDSpanish = $040A;
  IDSpanishUruguay = $380A; IDSpanishVenezuela = $200A;
  IDSutu = $0430; IDSwahili = $0441;
  IDSwedishFinland = $081D; IDSwedish = $041D;
  IDTajik = $0428; IDTamil = $0449;
  IDTatar = $0444; IDTelugu = $044A;
  IDThai = $041E; IDTibetan = $0451;
  IDTsonga = $0431; IDTswana = $0432;
  IDTurkish = $041F; IDTurkmen = $0442;
  IDUkrainian = $0422; IDUrdu = $0420;
  IDUzbekCyrillic = $0843; IDUzbekLatin = $0443;
  IDVenda = $0433; IDVietnamese = $042A;
  IDWelsh = $0452; IDXhosa = $0434;
  IDZulu = $0435;

function GetWindowsLanguage: string;
var
  langid: Cardinal;
  langcode: string;
  CountryName: array[0..4] of char;
  LanguageName: array[0..4] of char;
  works: boolean;
begin
  // The return value of GetLocaleInfo is compared with 3 = 2 characters and a zero
  works := 3 = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, LanguageName, SizeOf(LanguageName));
  works := works and (3 = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, CountryName,
    SizeOf(CountryName)));
  if works then begin
    // Windows 98, Me, NT4, 2000, XP and newer
    LangCode := PChar(@LanguageName[0]);
    if lowercase(LangCode)='nothen LangCode:='nb';
    LangCode:=LangCode + '_' + PChar(@CountryName[0]);
  end else begin
    // This part should only happen on Windows 95.
    langid := GetThreadLocale;
    case langid of
      IDBelgianDutch: langcode := 'nl_BE';
      IDBelgianFrench: langcode := 'fr_BE';
      IDBrazilianPortuguese: langcode := 'pt_BR';
      IDDanish: langcode := 'da_DK';
      IDDutch: langcode := 'nl_NL';
      IDEnglishUK: langcode := 'en_GB';
      IDEnglishUS: langcode := 'en_US';
      IDFinnish: langcode := 'fi_FI';
      IDFrench: langcode := 'fr_FR';
      IDFrenchCanadian: langcode := 'fr_CA';
      IDGerman: langcode := 'de_DE';
      IDGermanLuxembourg: langcode := 'de_LU';
      IDGreek: langcode := 'el_GR';
      IDIcelandic: langcode := 'is_IS';
      IDItalian: langcode := 'it_IT';
      IDKorean: langcode := 'ko_KO';
      IDNorwegianBokmol: langcode := 'nb_NO';
      IDNorwegianNynorsk: langcode := 'nn_NO';
      IDPolish: langcode := 'pl_PL';
      IDPortuguese: langcode := 'pt_PT';
      IDRussian: langcode := 'ru_RU';
      IDSpanish, IDSpanishModernSort: langcode := 'es_ES';
      IDSwedish: langcode := 'sv_SE';
      IDSwedishFinland: langcode := 'sv_FI';
    else
      langcode := 'C';
    end;
  end;
  Result := langcode;
end;
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 15:09
Auch mit "GetKeyBoardLayout" wird es nicht gehen, ich habe jetzt den Test mit Vista Ultimate gemacht, dort läßt sich
die Sprache ja "komplett" umstellen. Rufe ich jetzt meine Testanwendung auf, wenn ich Vista auf Englisch umstelle, so
zeigt mir die Anwendung als Sprache "Deutsch" an was ja korrekt ist, weil die Regional Einstellungen sind ja auch alle
auf Deutsch. Ich brauche aber die Sprache in der das Betriebssystem arbeitet.

Wenn man z.B. mit Application.MessageBox() einen Dialog anzeigen läßt so werden die Buttons ja auch in der jeweiligen
Sprache eingestellt (Beisp. "Ja/Nein" bzw. "Yes/No") und genau sowas will ich für meine eigenen Dialoge auch haben.

Nur wie bekomme ich herraus in welcher Sprache das Windows vorliegt. Ich hätte gern unabhängig von den Regional Einstellungen
die eingestellte Sprache.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#6

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 15:12
Guck noch mal auf meinen Beitrag...
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#7

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 16:08
Ich würde es versuchen mit:

LOCALE_SISO639LANGNAME - 'ISO abbreviated language name

http://de.wikipedia.org/wiki/ISO_639
http://alis.isoc.org/langues/iso639.de.htm

LOCALE_SISO3166CTRYNAME - 'ISO abbreviated country name

http://de.wikipedia.org/wiki/ISO_3166
http://www.iso.org/iso/country_codes...e_elements.htm

So wie es auch hathor von gnugettext übernommen hat.

Nachtrag:

Zitat von TUX_der_Pinguin:
Nur wie bekomme ich herraus in welcher Sprache das Windows vorliegt. Ich hätte gern unabhängig von den Regional Einstellungen
die eingestellte Sprache.
Vermutlich indem Du LOCALE_USER_DEFAULT gegen LOCALE_SYSTEM_DEFAULT austauscht.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 16:10
Zitat von hathor:
Man kann noch GetKeyboardLayout abfragen, dann hast Du das gesuchte Land.
Das kann aber auch daneben gehen. Es gibt Programmierer, die Deutsch als Sprache eingestelllt haben, aber ein amerikanisches Keyboardlayout benutzen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 16:14
Warum nimmst Du nicht fertige Sachen dafür?
z.B. Multilizer oder Gnu Gettext?
Da macht die Komponente die Spracherkennung.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Windows Sprache ermitteln

  Alt 9. Jul 2008, 16:17
Ich denke, Lokalisierung macht man am besten mit Ressourcen. LoadString lädt immer den String in der System-Sprache (wobei ich nicht weiß, ob das die Installationssprache ist oder die der Regionaleinstellungen), sofern er vorliegt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz