AGB  ·  Datenschutz  ·  Impressum  







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

mehrsprachige Resourcen nutzen

Ein Thema von himitsu · begonnen am 26. Dez 2007 · letzter Beitrag vom 29. Feb 2008
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#7

Re: mehrsprachige Resourcen nutzen

  Alt 3. Jan 2008, 03:40
Zitat von Dezipaitor:
Heutzutage sollte ein gutes Programm dynamisch die Sprache wechseln können. ... Resourcen können zudem leicht zu einem Übersetzungsbüro gesendet werden, ohne dass man gleich den Quellcode mitschicken muss.
drum mach ich mir ja die ganze Arbeit
und bis auf einige wenige Fehlermeldungen ist im aktuellem Programm nun auch alles in die .rc/.res-Datei ausgelagert.

Für zukünftige Programme muß ich mir noch überlegen sowas (z.B. wie dein großes Werk) einzusetzen,
aber in dem kleine, Programm wäre das für mich viel zu groß für dieses minimalistische Programm.

Außerdem bräuchte ich dann wieder ein paar Zusatzfunktion zu LoadLocalizedString
- rausfinden was für Psrachen vorhanden sind
- auswählen welche Sprache verwendet werden soll
(irgendwie muß man ja erstmal PrimaryLanguageId und SubLanguageId festlegen)

Dann mal 'ne Frage: Warum hast du PrimaryLanguageId und SubLanguageId getrennt und nicht zusammen als als LANGID definiert?


Im Anhang mal mein neues Demo-/Testprojekt, wo nun auch mal ein paar Wrapper-Funktionen für FindResourceLang enthalten sind.
ComboBox=0 für automatische Auswahl, sonst entsprechende Sprache

Hab mich nun entschieden die "Fehlerbehandlung" aus FindResourceLang rauszunehmen.

(Haupt)Funktionen:
Code:
[b]Const[/b] frDefaultLang = LANG_ENGLISH or (SUBLANG_ENGLISH_US shl 10);

[b]Var[/b] frGUILang: LANGID = LANG_NEUTRAL or (SUBLANG_NEUTRAL shl 10);

[b]Function[/b] FindResourceLang([b]Var LangResList: TEnumResRec[/b]): Integer;
[b]Function[/b] FindResourceLangEx([b]Var LangResList: TEnumResRecEx[/b]): Integer;

[color=blue]// wrapper functions for FindResourceLang(Ex)[/color]

[b]Function[/b] LoadStringLangW(hModule: HINST; [b]uID: LongWord[/b];
  [b]lpBuffer: PWideChar[/b]; nBufferMax: Integer; Lang: LANGID): Integer;
[b]Function[/b] LoadStringLangW(hModules: TResLangModules; [b]uID: LongWord[/b];
  [b]lpBuffer: PWideChar[/b]; nBufferMax: Integer; Lang: LANGID): Integer;

[b]Function[/b] LoadStringLangW(hModule: HINST; [b]uID: LongWord[/b]; Lang: LANGID): [b]WideString[/b];
[b]Function[/b] LoadStringLangW(hModules: TResLangModules; [b]uID: LongWord[/b]; Lang: LANGID): [b]WideString[/b];

[b]Function[/b] LoadResourceLang(hModule: HINST; [b]ResType: PWideChar[/b];
  [b]ResName: PWideChar[/b]; Lang: LANGID; [b]Out ResSize: LongInt[/b]): [b]Pointer[/b];
[b]Function[/b] LoadResourceLang(hModules: TResLangModules; [b]ResType: PWideChar[/b];
  [b]ResName: PWideChar[/b]; Lang: LANGID; [b]Out ResSize: LongInt[/b]): [b]Pointer[/b];

[color=blue]// wrapper functions for FindResourceLang(Ex) with error string[/color]
...

[color=blue]// wrapper functions for FindResourceLang(Ex) with exception
// check result of FindResourceLang(Ex), LoadStringLangW and LoadResourceLang[/color]
...
einige Beispielaufrufe:
Delphi-Quellcode:
S := LoadStringLangW(HInstance, {StringID}, {LangID});

If LoadStringLangW(HInstance, {StringID}, @Buffer, Length(Buffer), {LangID}) > 0 Then
  S := PWideChar(@Buffer);

Modules := frClearModules;
Modules[0] := HInstance;
Modules[1] := GetModuleHandle('LangDLL.dll');
If LoadStringLangW(Modules, {StringID}, @Buffer, Length(Buffer), {LangID}) > 0 Then
  S := PWideChar(@Buffer);

P := LoadResourceLang(HInstance, {ResType}, {ResID}, {LangID}, ResLen);
If P <> nil Then Begin
  //P = pointer to resource
  //ResLen = size of resource

S := LoadStringLangW(HInstance, {StringID}, {LangID});
Try
  // If S = '' Then Raise ...
  CheckResourceLang({StringID}, S);
Except

i := LoadStringLangW(HInstance, {StringID}, @Buffer, Length(Buffer), {LangID});
Try
  // If i = 0 Then Raise ...
  CheckResourceLang(103, i);
  //Buffer = String
Except

LangResList.hModule := HInstance;
LangResList.ResType := {ResType};
LangResList.ResName := {ResID};
i := FindResourceLang(LangResList);
Try
  // If i < 0 Then Raise ...
  CheckResourceLang(LangResList, i);
  //LangResList.LangIDs = Strings
Except

LangResList.hModule := HInstance;
LangResList.ResType := {ResType};
LangResList.ResName := {ResID};
FindResourceLang(LangResList);
Try
  // If Length(LangResList.LangIDs) = 0 Then Raise ...
  CheckResourceLang(LangResList);
  //LangResList.LangIDs = Strings
Except
[edit=sakura] Anhang auf Wunsch entfernt, neuer weiter unten. Mfg, sakura[/edit]
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


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 06:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz