Deutsch
Forum

Multilanguage in DLLs

 
- Seite 1 -



Stephan
Sonneborn
Hallo zusammen,

hat jemand von Euch Erfahrungen mit Multilanguage-DLLs? Ich habe in einem Programm das bisher mit komplett unterschiedlichen DLLs gelöst (also eine mit Texten in deutsch, eine in englisch, eine in ...) Das ist von der Verwaltung her sehr aufwendig.
In den DLLs kann man ja eine Sprache mitgeben. Wie kann ich die dann im Programm zuordnen? Ich denke, das wird Windows automatisch machen: ein englisches Windows wird dann die englischen Texte lesen. Aber es gibt ja allein für englisch x verschiedene Spracheinstellungen, welche sollte man in die DLL stellen?

Kann man auch in einem deutschen Windows englische Texte verwenden?

82 kB
Hochgeladen:04.10.2011
Ladeanzahl190
Herunterladen
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
04.10.2011  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


Andreas
Miethe


Das Umstellen auf eine andere Sprache ist eigentlich recht simpel.
Danach ist das Laden der Resourcen immer gleich, egal welche Sprache.

Hier mal ein Beispiel (funktioniert nur auf NT-Systemen )

Download

530 kB
Hochgeladen:15.10.2011
Ladeanzahl260
Herunterladen
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
15.10.2011  
 



Ja, Multi-Language-Strings auslesen geht z.B. mit der API FindResourceEx. Eine weitere Möglichkeit (Enum) zeigt dieser Code von mir: [...] 

Mit dem LemonEd besteht seit neuem die Möglichkeit, auch multi-language-Strings direkt in die eigene Exe einzubauen, per RC-Script oder kompiliert als RES.
 
04.10.2011  
 




Stephan
Sonneborn
Hallo Frank,

danke für Deine Antwort und Dein Beispiel. Damit muss ich mich mal etwas genauer beschäftigen...

Ist es denn grundsätzlich so, dass man die Strings dann einmal mit dem englischen Sprachcode und einmal mit dem deutschen Sprachcode unter einer ID in der DLL ablegen kann?
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
05.10.2011  
 



Ich denke ja, gemacht habe ich es selber noch nicht. Aber Versioninfos und Icons hatte ich testweise in mehreren Sprachen eingebaut, das klappt einwandfrei. Für meinen Editor hatte ich getestet, eines der XProfanicons zu ersetzen und mich gewundert, dass er in der Exe doch immer noch das originale Icon angezeigt hat. Bis mir aufgefallen ist, dass bei Nichtangabe einer Language im Scriptfile deutsch  eingebaut wird, während das Profanicon neutral  eingebaut ist. Hatte dann nachgesehen und das Icon doppelt vorgefunden. Als ich als Sprache dann neutral genommen hatte, klappte es richtig und das Icon wurde ersetzt.
So wird das auch mit den Stringresourcen sein, sonst würde die ganze Language-Unterscheidung ja sinnlos sein. Du kannst die Texte in vielen Sprachen gleichzeitig einbauen und beim Abrufen später mit der Language-ID bestimmen, in welcher Sprache der String geladen wird.
 
05.10.2011  
 




H.Brill
Geht es hier nur darum, Menüeinträge oder Buttons auf die
jeweilige Sprache zu ändern ?
Wenn das nicht zu viele Einträge sind, würde ich es einfach
mit Bereichen# und mit Franks XProfan_Datengenerator machen.
Man kann ja einen Menüeintrag zur Umstellung Deutsch/Englisch
machen. Weil es mich auch interessiert, habe ich mal eine Deutsch.txt
und eine Englisch.txt mit dem Editor angelegt und mit dem Generator
übersetzt. Die Strings bekommt man ja leicht wieder :
KompilierenMarkierenSeparieren
Cls
Declare Deutsch#, Englisch#,Eintrag$, position%, pos2%
Dim Deutsch#,32
Dim Englisch#,24
Clear Deutsch#
Clear Englisch#
Long Deutsch#,0=1702125892,1725332585,1852141158,1701860220,1701340009,1232891506,225404526,10
Long Englisch#,0=1701603654,1701859196,1632861294,1216111990,1869376613,2573
Print String$(Deutsch#,0)
Print String$(Englisch#, 0)
Waitkey
Dispose Deutsch#, Englisch#
End
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
06.10.2011  
 



Nachteil ist aber, dass die Texe so nicht mehr leicht editierbar sind...

Hab das mal getestet, es ist kein Problem, Strings mehrsprachig in die eigene Exe einzubauen. Mein Testscript (RC) hierzu:

LANGUAGE 0, SUBLANG_NEUTRAL
STRINGTABLE
{
1000, "Good morning"
1001, "How are you?"
}

LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
STRINGTABLE
{
1000, "Guten Morgen"
1001, "Wie geht es dir?"
}

21 kB
Hochgeladen:06.10.2011
Ladeanzahl107
Herunterladen
 
06.10.2011  
 




Stephan
Sonneborn
Ich taste mich mal langsam ran:
Wenn ich eine bestimmte Sprache einstellen will, muss ich mittels FindResourceEx das Handle auf die DLL, einen Zeiger auf den ResourcenTyp, einen Zeiger auf die ID innerhalb des Resourcentyps und die Sprache mitgeben.
Also insgesamt 4 Parameter:
KompilierenMarkierenSeparieren
DEF FindResourceEx(4) !"System-Dll-Name2.dll", "FindResoureceEx"

Aber in welcher System-DLL finde ich die FindResourceEx-Funktion?

Um die Sprache als ID zu übergeben, macht die Funktion MakeLangID() aus den Klartexten (z.B. "LANG_GERMAN" und "SUBLANG_GERMAN") eine ID.
KompilierenMarkierenSeparieren
DEF MakeLangID(2) !"System-Dll-Name2.dll", "MakeLangID"

Auch stellt sich die Frage: welche System-DLL stellt die MakeLangID zur Verfügung?
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
09.10.2011  
 




Detlef
Jagolski
In der Kernel32.
KompilierenMarkierenSeparieren
Def FindResourceEx(4) !"KERNEL32","FindResourceExA"

Aus der API Hilfe:

The MAKELANGID macro creates a language identifier from a primary language identifier and a sublanguage identifier.

WORD MAKELANGID(

USHORT usPrimaryLanguage,// primary language identifier
USHORT usSubLanguage// sublanguage identifier
);

Parameters

usPrimaryLanguage

Specifies the primary language identifier. This parameter can be one of the following values:

LANG_AFRIKAANSLANG_ICELANDIC
LANG_ALBANIANLANG_INDONESIAN
LANG_ARABICLANG_ITALIAN
LANG_BASQUELANG_JAPANESE
LANG_BELARUSIANLANG_KOREAN
LANG_BULGARIANLANG_LATVIAN
LANG_CATALANLANG_LITHUANIAN
LANG_CHINESELANG_NEUTRAL
LANG_CROATIANLANG_NORWEGIAN
LANG_CZECHLANG_POLISH
LANG_DANISHLANG_PORTUGUESE
LANG_DUTCHLANG_ROMANIAN
LANG_ENGLISHLANG_RUSSIAN
LANG_ESTONIANLANG_SERBIAN
LANG_FAEROESELANG_SLOVAK
LANG_FARSILANG_SLOVENIAN
LANG_FINNISHLANG_SPANISH
LANG_FRENCHLANG_SWEDISH
LANG_GERMANLANG_THAI
LANG_GREEKLANG_TURKISH
LANG_HEBREWLANG_UKRANIAN
LANG_HUNGARIANLANG_VIETNAMESE

For a user-defined language, usPrimaryLanguage can be a value in the range 0x0200 to 0x03FF. All other values are reserved for system use.

usSubLanguage

Specifies the sublanguage identifier. This parameter can be one of the following values:

SUBLANG_ARABIC_SAUDI_ARABIASUBLANG_GERMAN
SUBLANG_ARABIC_IRAQSUBLANG_GERMAN_SWISS
SUBLANG_ARABIC_EGYPTSUBLANG_GERMAN_AUSTRIAN
SUBLANG_ARABIC_LIBYASUBLANG_GERMAN_LUXEMBOURG
SUBLANG_ARABIC_ALGERIASUBLANG_GERMAN_LIECHTENSTEIN
SUBLANG_ARABIC_MOROCCOSUBLANG_ITALIAN
SUBLANG_ARABIC_TUNISIASUBLANG_ITALIAN_SWISS
SUBLANG_ARABIC_OMANSUBLANG_KOREAN
SUBLANG_ARABIC_YEMENSUBLANG_KOREAN_JOHAB
SUBLANG_ARABIC_SYRIASUBLANG_NEUTRAL
SUBLANG_ARABIC_JORDANSUBLANG_NORWEGIAN_BOKMAL
SUBLANG_ARABIC_LEBANONSUBLANG_NORWEGIAN_NYNORSK
SUBLANG_ARABIC_KUWAITSUBLANG_PORTUGUESE
SUBLANG_ARABIC_UAESUBLANG_PORTUGUESE_BRAZILIAN
SUBLANG_ARABIC_BAHRAINSUBLANG_SERBIAN_LATIN
SUBLANG_ARABIC_QATARSUBLANG_SERBIAN_CYRILLIC
SUBLANG_CHINESE_TRADITIONALSUBLANG_SPANISH
SUBLANG_CHINESE_SIMPLIFIEDSUBLANG_SPANISH_MEXICAN
SUBLANG_CHINESE_HONGKONGSUBLANG_SPANISH_MODERN
SUBLANG_CHINESE_SINGAPORESUBLANG_SPANISH_GUATEMALA
SUBLANG_DEFAULTSUBLANG_SPANISH_COSTA_RICA
SUBLANG_DUTCHSUBLANG_SPANISH_PANAMA
SUBLANG_DUTCH_BELGIANSUBLANG_SPANISH_DOMINICAN_
REPUBLIC
SUBLANG_ENGLISH_USSUBLANG_SPANISH_VENEZUELA
SUBLANG_ENGLISH_UKSUBLANG_SPANISH_COLOMBIA
SUBLANG_ENGLISH_AUSSUBLANG_SPANISH_PERU
SUBLANG_ENGLISH_CANSUBLANG_SPANISH_ARGENTINA
SUBLANG_ENGLISH_NZSUBLANG_SPANISH_ECUADOR
SUBLANG_ENGLISH_EIRESUBLANG_SPANISH_CHILE
SUBLANG_ENGLISH_SOUTH_
AFRICASUBLANG_SPANISH_URUGUAY
SUBLANG_ENGLISH_JAMAICASUBLANG_SPANISH_PARAGUAY
SUBLANG_ENGLISH_CARIBBEANSUBLANG_SPANISH_BOLIVIA
SUBLANG_ENGLISH_BELIZESUBLANG_SPANISH_EL_SALVADOR
SUBLANG_ENGLISH_TRINIDADSUBLANG_SPANISH_HONDURAS
SUBLANG_FRENCHSUBLANG_SPANISH_NICARAGUA
SUBLANG_FRENCH_BELGIANSUBLANG_SPANISH_PUERTO_RICO
SUBLANG_FRENCH_CANADIANSUBLANG_SWEDISH
SUBLANG_FRENCH_SWISSSUBLANG_SWEDISH_FINLAND
SUBLANG_FRENCH_LUXEMBOURGSUBLANG_SYS_DEFAULT

For a user-defined sublanguage, usSubLanguage can be a value in the range 0x20 to 0x3F. All other values are reserved for system use.

Return Values

The return value is a language identifier.

Remarks

The following three combinations of usPrimaryLanguage and usSubLanguage have special meaning:

Primary language IDSublanguage IDMeaning
LANG_NEUTRALSUBLANG_NEUTRALLanguage neutral
LANG_NEUTRALSUBLANG_DEFAULTUser default language
LANG_NEUTRALSUBLANG_SYS_DEFAULTSystem default language

The MAKELANGID macro is defined as follows:

#define MAKELANGID(p, s) ((((WORD) (s)) << 10) | (WORD) (p))
KompilierenMarkierenSeparieren
Def &SUBLANG_ARABIC_ALGERIA  5
Def &SUBLANG_ARABIC_BAHRAIN  15
Def &SUBLANG_ARABIC_EGYPT  3
Def &SUBLANG_ARABIC_IRAQ  2
Def &SUBLANG_ARABIC_JORDAN  11
Def &SUBLANG_ARABIC_KUWAIT  13
Def &SUBLANG_ARABIC_LEBANON  12
Def &SUBLANG_ARABIC_LIBYA  4
Def &SUBLANG_ARABIC_MOROCCO  6
Def &SUBLANG_ARABIC_OMAN  8
Def &SUBLANG_ARABIC_QATAR  16
Def &SUBLANG_ARABIC_SAUDI_ARABIA  1
Def &SUBLANG_ARABIC_SYRIA  10
Def &SUBLANG_ARABIC_TUNISIA  7
Def &SUBLANG_ARABIC_UAE  14
Def &SUBLANG_ARABIC_YEMEN  9
Def &SUBLANG_CHINESE_HONGKONG  3
Def &SUBLANG_CHINESE_SIMPLIFIED  2
Def &SUBLANG_CHINESE_SINGAPORE  4
Def &SUBLANG_CHINESE_TRADITIONAL  1
Def &SUBLANG_DEFAULT  1
Def &SUBLANG_DUTCH  1
Def &SUBLANG_DUTCH_BELGIAN  2
Def &SUBLANG_ENGLISH_AUS  3
Def &SUBLANG_ENGLISH_BELIZE  10
Def &SUBLANG_ENGLISH_CAN  4
Def &SUBLANG_ENGLISH_CARIBBEAN  9
Def &SUBLANG_ENGLISH_EIRE  6
Def &SUBLANG_ENGLISH_JAMAICA  8
Def &SUBLANG_ENGLISH_NZ  5
Def &SUBLANG_ENGLISH_SOUTH_AFRICA  7
Def &SUBLANG_ENGLISH_TRINIDAD  11
Def &SUBLANG_ENGLISH_UK  2
Def &SUBLANG_ENGLISH_US  1
Def &SUBLANG_FRENCH  1
Def &SUBLANG_FRENCH_BELGIAN  2
Def &SUBLANG_FRENCH_CANADIAN  3
Def &SUBLANG_FRENCH_LUXEMBOURG  5
Def &SUBLANG_FRENCH_SWISS  4
Def &SUBLANG_GERMAN  1
Def &SUBLANG_GERMAN_AUSTRIAN  3
Def &SUBLANG_GERMAN_LIECHTENSTEIN  5
Def &SUBLANG_GERMAN_LUXEMBOURG  4
Def &SUBLANG_GERMAN_SWISS  2
Def &SUBLANG_ITALIAN  1
Def &SUBLANG_ITALIAN_SWISS  2
Def &SUBLANG_KOREAN  1
Def &SUBLANG_KOREAN_JOHAB  2
Def &SUBLANG_NEUTRAL  0
Def &SUBLANG_NORWEGIAN_BOKMAL  1
Def &SUBLANG_NORWEGIAN_NYNORSK  2
Def &SUBLANG_PORTUGUESE  2
Def &SUBLANG_PORTUGUESE_BRAZILIAN  1
Def &SUBLANG_SERBIAN_CYRILLIC  3
Def &SUBLANG_SERBIAN_LATIN  2
Def &SUBLANG_SPANISH  1
Def &SUBLANG_SPANISH_ARGENTINA  11
Def &SUBLANG_SPANISH_BOLIVIA  16
Def &SUBLANG_SPANISH_CHILE  13
Def &SUBLANG_SPANISH_COLOMBIA  9
Def &SUBLANG_SPANISH_COSTA_RICA  5
Def &SUBLANG_SPANISH_DOMINICAN_REPUBLIC  7
Def &SUBLANG_SPANISH_ECUADOR  12
Def &SUBLANG_SPANISH_EL_SALVADOR  17
Def &SUBLANG_SPANISH_GUATEMALA  4
Def &SUBLANG_SPANISH_HONDURAS  18
Def &SUBLANG_SPANISH_MEXICAN  2
Def &SUBLANG_SPANISH_MODERN  3
Def &SUBLANG_SPANISH_NICARAGUA  19
Def &SUBLANG_SPANISH_PANAMA  6
Def &SUBLANG_SPANISH_PARAGUAY  15
Def &SUBLANG_SPANISH_PERU  10
Def &SUBLANG_SPANISH_PUERTO_RICO  20
Def &SUBLANG_SPANISH_URUGUAY  14
Def &SUBLANG_SPANISH_VENEZUELA  8
Def &SUBLANG_SWEDISH  1
Def &SUBLANG_SWEDISH_FINLAND  2
Def &SUBLANG_SYS_DEFAULT  2
Def &LANG_AFRIKAANS  54
Def &LANG_ALBANIAN  28
Def &LANG_ARABIC  1
Def &LANG_BASQUE  45
Def &LANG_BELARUSIAN  35
Def &LANG_BULGARIAN  2
Def &LANG_CATALAN  3
Def &LANG_CHINESE  4
Def &LANG_CROATIAN  26
Def &LANG_CZECH  5
Def &LANG_DANISH  6
Def &LANG_DUTCH  19
Def &LANG_ENGLISH  9
Def &LANG_ESTONIAN  37
Def &LANG_FAEROESE  56
Def &LANG_FARSI  41
Def &LANG_FINNISH  11
Def &LANG_FRENCH  12
Def &LANG_GERMAN  7
Def &LANG_GREEK  8
Def &LANG_HEBREW  13
Def &LANG_HUNGARIAN  14
Def &LANG_ICELANDIC  15
Def &LANG_INDONESIAN  33
Def &LANG_ITALIAN  16
Def &LANG_JAPANESE  17
Def &LANG_KOREAN  18
Def &LANG_LATVIAN  38
Def &LANG_LITHUANIAN  39
Def &LANG_NEUTRAL  0
Def &LANG_NORWEGIAN  20
Def &LANG_POLISH  21
Def &LANG_PORTUGUESE  22
Def &LANG_ROMANIAN  24
Def &LANG_RUSSIAN  25
Def &LANG_SERBIAN  26
Def &LANG_SLOVAK  27
Def &LANG_SLOVENIAN  36
Def &LANG_SPANISH  10
Def &LANG_SWEDISH  29
Def &LANG_SYSTEM_DEFAULT  2048
Def &LANG_THAI  30
Def &LANG_TURKISH  31
Def &LANG_UKRAINIAN  34
Def &LANG_USER_DEFAULT  1024
Def &LANG_VIETNAMESE  42
Declare  MAKELANGID#
Dim MAKELANGID#,4
Word MAKELANGID#,0 = &LANG_GERMAN, &SUBLANG_GERMAN
Dispose MAKELANGID#
FindResourceEx(hModule,lpType,lpName,wLanguage(MAKELANGID#))
 
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
09.10.2011  
 




Andreas
Miethe


Und so geht's kürzer :
KompilierenMarkierenSeparieren
 $H windows.ph
DEF MakeLangID(2) (@&(2) << 10) | @&(1)
cls
Print MakeLangID(~LANG_GERMAN,~SUBLANG_GERMAN)
waitinput
end
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
09.10.2011  
 




Detlef
Jagolski
Und ich dachte die Lösung von Andreas erklärt sich durch

The MAKELANGID macro is defined as follows:

#define MAKELANGID(p, s) ((((WORD) (s)) << 10) | (WORD) (p))


von alleine.
 
XProfan X2
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
09.10.2011  
 




Stephan
Sonneborn
Hallo Detlef, hallo Andreas,
vielen Dank für Eure Hilfe, aber irgendwie stehe ich immer noch aufm Schlauch:
Ich hab eine DLL gebastelt mit einer STRING-Resource in den Sprachcodes Neutral, GERMAN und ENGLISH.

In allen dreien habe ich Texte hinterlegt:
100,Neutral; 100,Deutsch; 100,English

Mittels
KompilierenMarkierenSeparierenwollte ich dann auf die Texte zugreifen.Wie müsste denn der Pointer "PointerAufID" aussehen?
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
10.10.2011  
 




Detlef
Jagolski
Aus der API Hilfe von FindResourceEX:

Points to a null-terminated string specifying the name of the resource. For more information, see the Remarks section.

KompilierenMarkierenSeparieren
var PointerAufID$ = "Name der Resource" + Chr$(0)
FindResourceEX(DllName&, ~RT_STRING,Addr(PointerAufID$), MAKELANGID(~Neutral, ~SUBLANG_Neutral))

Gruß

Detlef
 
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
11.10.2011  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

18.771 Betrachtungen

Unbenanntvor 0 min.
Kutsche27.02.2020
Stephan Sonneborn31.10.2019
Walter06.02.2018
Boroberto22.04.2016
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie