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]