Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: mehrsprachige Resourcen nutzen

  Alt 3. Jan 2008, 04: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]
$2B or not $2B
  Mit Zitat antworten Zitat