Internationalisierung
-
Moin leute,
ich habe ein Problem mit multithreading und internationalisierung.
Und zwar wir deine Methode x per asynchronen aufruf in einem Neuen Thread gestarte und hat daher die Culture "de-DE" ich möchte jetzt aber anhand eines ENUMS verschiedene Text als Fehlermeldungen mittels Messagebox ausgeben. Die Texte sind alle in resx-Dateien abgespeichert so das ich zugriff auf die Verschiedenen Sprachen eigentlich habe. Jedoch bekommme ich bei den folgenden verschiedenen Varianten immer den Deutschen text ausgegeben.
Variante 1: string loginError = LoginRes.SP_InvalidLogin; Variante 2: Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("it-IT"); Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("it-IT"); string loginError = LoginRes.SP_InvalidLogin; Variante 3: ResourceManager rm = new ResourceManager("IB.xxx.xxx.xxx.LoginRes.LoginRes", typeof(LoginRes).Assembly); string loginError = rm.GetString("SP_InvalidLogin", new System.Globalization.CultureInfo("it-IT"))
könnt Ihr mir sagen was ich da falsch mache????
Danke schonmal für eure Hilfe.
MfG
blind
-
Hallo,
setze mal LoginRes.Culture:
LoginRes.Culture = new System.Globalization.CultureInfo("it-IT"); string loginError = LoginRes.SP_InvalidLogin;
Sieh dir einfach mal die Resources.Designer.cs (bzw. bei dir dann LoginRes.Designer.cs) an (bzw. debugge dadrin ;-).
Eigentlich müßte aber auch die 3. Variante so funktionieren (da dies ja genau dem obigen Code intern entspricht). Bist du denn sicher, daß der Text 'SP_Invalid_Login' übersetzt wurde (in der italienischen Ressource-DLL)?
P.S. Bei Multithreading mußt du dir jedoch im klaren sein, daß mein obiger Code nicht unbedingt sicher ist (wegen der statischen Culture-Property) - falls mehrere Threads diesen Wert zeitnah ändern...
-
Moin,
das hatte ich auch schon probiert nur da bekomme ich auch immer die Deutsche Ressource. Ob die Übersetzung in der DLL ist weis ich nicht genau zumindest steht sie aber in der LoginRes.it.resx und auf die sollte er ja auch mit it-IT zugreifen.
MfG
blind1985
-
Hallo,
liegt die DLL denn auch im richtigen Verzeichnis (d.h. im Ordner "it-IT" bei deiner EXE)?
Und dann könntest du noch mit dem "Windows Resource Localization Editor" (unter "Microsoft Windows SDK Tools") oder dem Zeta Resource Editor die DLL inhaltlich überprüfen (oder mal ein paar andere Strings ausprobieren).
-
Moin,
ne extra dll für die Ressource kann ich nicht finden.
Die Resource-Dateien liegen aber auch im Projekte und der 4. Ordner ebene und sind nicht die Projekt-Resourcen. Wenn ich die Resource mit dem Zeta-tool öffne sehe ich auch den String übersetzt und ja ich habe es auch schon mit anderen Strings aus der selben Resource versucht. Dieses geht auch leider nicht.Hast du noch ne andere Idee??
Früher hatten wir den aufruf nicht über ein Interface gesteuert sondern aus einem Masterdialog. Und da hatte ein Invoke gereicht. Jedoch kann ich ja auf einer Interface-Klasse kein invoke aufrufen.
Dieses nur noch zur info
MfG
blind1985
-
Hallo,
wenn du keine Ressource-DLLs hast, dann kann er diese natürlich auch nicht benutzen
Also beim Erzeugen des Projektes müssen ja die entsprechenden Ressource-DLLs erstellt werden (sog. Satellite-Assemblies) und dies müssen dann (wie schon geschrieben) in den entsprechenden Ordnern liegen:
Application.exe en-UK Application.resources.dll it-IT Application.resources.dll
Edit: nur die Ressourcen der Originalsprache sind in der "Application.exe" eingebettet (damit man ja zur Laufzeit beliebige Sprachen hinzufügen kann).
-
ne application.resource.dll git es natürlich. Aber ich bin eh gerade dabei und versuche da mit nem neuen Thread zu machen dessen Culture ich vor dem Start setzt. Dann kann er auch drauf zugreifen. Habe da nur das Problem, das die Thread-Methode so algemein wie möglich sein soll ich Ihr also anstatt von IBText.test auch LoginRes.SP_InvalidLogin geben kann.
Ich mache das momentan so das ich mir ein object array aufbaue in dem ich im ersten object den Typ der Resource gebe und im 2. den String mit dem Key-Namen.
Nur möchte ich den Keynamen amliebsten aus der Schreibweise LoginRes.SP_InvalidLogin dynamisch auslesen. Weist du wie man das machen kann?
Hier nochaml kurz der arrayaufbau als code
object obj = new object(); object[] objarray = new object[2]; Type resType = typeof(IBText); objarray[0] = resType; objarray[1] = "Test"; //Diese zeile soll eigendlich aus der Form IBText.Test gelesen werden. obj = objarray;
Danke schonmal
blind1985