| Autor |
Beitrag |
CodexX
      
Beiträge: 118
WinXP
Delphi XE
|
Verfasst: Di 23.09.08 23:48
Hallo,
kommt man irgendwie an die Text-Strings, die in Windows verwendet werden, dynamisch ran?
Diese sind ja je nach Windows-Sprache unterschiedlich, stehen aber hoffentlich immer an der gleichen Stelle. D.h. wenn bekannt wäre, wo ein bestimmter String steht, ließe sich dieser im eigenen Programm dynamisch verwenden. Ich will jetzt nicht mein ganzes Programm daran ausrichten, benötige das aber an 2 Stellen.
Also ein Beispiel: In einem Kontext-Menü steht "Eigenschaften", in einem englischen Windows steht da "Properties" und ich möchte nun genau diesen String auslesen. Geht das irgendwie?
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mi 24.09.08 00:01
das wirst wohl knicken müssen. dazu gibt es aber eigene komponenten. suchen im forum hilft...
|
|
CodexX 
      
Beiträge: 118
WinXP
Delphi XE
|
Verfasst: Mi 24.09.08 13:06
Das war jetzt weder freundlich, noch informativ oder hilfreich. Vielleicht solltest Du Dir überlegen, auf solche Art von Postings in Zukunft zu verzichten.
Ich weiß durchaus, wie man die Suche verwendet und wenn ich hier frage, bedeutet das, dass ich nach längerem Suchen nichts gefunden habe.
Ich hoffe, jemand anders hat einen besseren Vorschlag...
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.09.08 13:12
Wo war das jetzt nicht hilfreich? Nur weil er gesagt hat, dass es nicht geht, war das keine Hilfe? Und als unfreundlich würde ich das jetzt auch nicht bezeichnen. Es war eine nüchterne, neutrale Antwort.
|
|
CodexX 
      
Beiträge: 118
WinXP
Delphi XE
|
Verfasst: Mi 24.09.08 13:29
Luckie hat folgendes geschrieben: | | Wo war das jetzt nicht hilfreich? |
Äh, bin ich irgendwie weiter? Mir wurde nur gerade gesagt, dass es nicht geht ("das wirst wohl knicken müssen."), dass es geht ("dazu gibt es aber eigene komponenten.") und dass ich gefälligst selber suchen soll ("suchen im forum hilft..."). Ich glaub nicht, dass Du Dich über so eine Antwort geradezu gefreut hättest.
Aber Luckie, ich glaube nicht, dass es notwendig ist, Diskussionen über den Antwortstil weiter anzuregen. Ich würde mich viel lieber über die Problemstellung unterhalten als über Posting(un)arten.
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mi 24.09.08 13:40
@CodexX: Ich entschuldige mich, wenn es als unfreundlich verstanden wurde. Ganz sicher wollte ich nicht unfreundlich sein.
Da ich selbst es nicht leiden kann, wenn man riesige Texte als Antwort erhält mit Informationen, die in einen Satz gepasst hätten, habe ich mich - wie immer - kurz und knapp ausgedrückt
Gerne antworte ich auch ein wenig ausführlicher:
Nein, du wirst nicht auf Windowsinformationen /-dienste /-strings /-inhalte oder was auch immer zurückgreifen können.
Daher gibt es zwei Alternativen:
1) Du erstellst dir ein Array mit einer Liste mit Strings für jede Sprache (ein String für jede Beschriftung), die du dann entsprechend setzt.
Delphi-Quelltext 1: 2: 3: 4: 5:
| ... Label1.Caption:= strlstTranslated[langSelected][0]; Edit45.Caption:= strlstTranslated[langSelected][1]; Panel3.Caption:= strlstTranslated[langSelected][2]; ... |
strlstTranslated -> array für deine Sprachen
Darin dann jeweils eine Liste mit den Strings
2) Eine vorgefertigte Komponente nutzen. Hierzu gibt es etliche, daher mein Verweis auf die Forensuche (sollte kein Anpöbeln sein, sondern ein Hinweis, dass es im Forum solche Kompos gibt).
Ansonsten mal Googlen, hatte da selbst mal nach gesucht und einige gefunden (leider alle kostenpflichtig).
Also nochmals Sorry für eventuelle Mißverständnisse...
|
|
CodexX 
      
Beiträge: 118
WinXP
Delphi XE
|
Verfasst: Mi 24.09.08 14:04
Hallo platzwart, danke schön, das hört sich doch alles gleich ganz anders an.
Jetzt verstehe ich auch, was Du mit Komponenten dafür meinst. Mein Programm ist bereits multilingual, das ist ja nicht das Problem.
| Zitat: | | Nein, du wirst nicht auf Windowsinformationen /-dienste /-strings /-inhalte oder was auch immer zurückgreifen können. |
Warum? Sind diese verschlüsselt, stehen die jedes Mal an einer anderen Stelle?
Kann man da nicht einfach in irgendeiner Resource-Datei oder DLL und die Strings per Index o.ä. abfragen?
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mi 24.09.08 14:21
Nun ja. Folgende Überlegung: Es gäbe solche Ressourcendateien. Dann würdest du die irgendwie auslesen und in dein Programm einfügen. Aber was machst du dann mit Ausdrücken, die nicht von Microsoft übersetzt wurden? Was machst du, wenn Microsoft ein Update herausbringt, was dazu führt, dass Strings verloren gehen / hinzu kommen. Was machst du mit Benutzern, die alle Unterschiedliche Windowsversionen und somit unterschiedliche Übersetzungen haben (Win 95/98/NT/ME/2000/XP/Vista)? Vor allem könnte so ein Update kommen, wenn du es nicht vermutest und müsstest es dann eh wieder umbasteln... (Wer sagt überhaupt, dass in allen Sprachen alles gleichsinnig übersetzt ist? Ich erinnere mich, dass das "Minesweeper" in der ital. Version von Windows anders hieß ("Rosengarten" oder so in der Art, wo man anstatt Minen Blumen hatte...^^)
Ich glaube, du tust dir selbst einen Gefallen, wenn du dir was selbst zusammenbastelst, dann hast du die größtmögliche Flexibilität und bist nicht abhängig von irgendwas...
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 24.09.08 14:29
Es gibt sogenannte Resourcen-Strings (Siehe Stichwort resourcestring). Sowas haben die Windows-DLLs auch. Man brauch nur die jeweilige String-ID und kann dan darüber über die WinAPI sich eine Lokalisierung in seiner gewünschten Sprache geben lassen, sofern diese installiert ist.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 24.09.08 14:56
ich hab dann noch mal was von der Funtion GNUgettext gehört in diesem zusammenhang. vielleicht hilft dir das auch weiter. am besten mal googeln und in der forumssuche suchen!
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
CodexX 
      
Beiträge: 118
WinXP
Delphi XE
|
Verfasst: Mi 24.09.08 15:18
elundril hat folgendes geschrieben: | | ich hab dann noch mal was von der Funtion GNUgettext gehört in diesem zusammenhang. vielleicht hilft dir das auch weiter. am besten mal googeln und in der forumssuche suchen! |
So wie ich das sehe, hilft das "nur" beim Lokalisieren der eigenen Anwendung, nicht aber um die Windowstexte auszulesen.
BenBE hat folgendes geschrieben: | | Es gibt sogenannte Resourcen-Strings (Siehe Stichwort resourcestring). Sowas haben die Windows-DLLs auch. Man brauch nur die jeweilige String-ID und kann dan darüber über die WinAPI sich eine Lokalisierung in seiner gewünschten Sprache geben lassen, sofern diese installiert ist. |
Das klingt gut! In genau der Richtung habe ich schon vor dem Posten der Frage gesucht, aber leider nichts brauchbares gefunden. Weißt Du, in welcher Windows-DLL die ganzen Standard-Strings des Explorers stehen?
Edit: Ok, ich sehe gerade, dass die Strings schön verteilt sind: explorer.exe, shell32.dll, netshell.dll, ...
Ich schaue mal, ob ich ab jetzt alleine klar komme, oder ob ich das dennoch nicht extrahiert bekomme...
--- Moderiert von Narses: Beiträge zusammengefasst---
Juhu, es geht!
Also wen es interessiert:
1. Mit dem Resource Hacker kann man die entsprechenden DLLs in der Sektion "String Table" durchstöbern und sich die Index-Werte herausschreiben, die man benötigt.
2. Mit der folgenden Funktion lassen sich dann die zugehörigen Texte extrahieren (lib ist der Pfad der DLL/EXE, id ist der Index):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function GetStringFromDLL(const lib: string; id: LongWord): string; var hLib: THandle; buf: array [Byte] of Char; begin hLib := LoadLibraryEx(PChar(lib), 0, LOAD_LIBRARY_AS_DATAFILE); if LongBool(hLib) then begin try SetString(Result, buf, LoadString(hLib, id, @buf[0], SizeOf(buf))); finally FreeLibrary(hLib); end; end; end; |
|
|
|