Resourcen und Culture

schachmat

Erfahrenes Mitglied
Hallo,

ich hab mal versucht das Programm BankautomatInternational aus Kapitel12 des VB2005-Kompendiums zu erweitern und in meinem Projekt zu verwenden. Dabei bin ich auf einige Fragen / Probleme gestoßen. Aber erstmal eine Erklärung, um was es in diesem Programm geht, damit auch alle mitreden können:

Ziel ist es eine Mehrsprachige Anwendung zu erstellen. Dafür wird eine neue Resourcendatei erstellt (BI.resx). In dieser Datei werden die Bezeichnungen der UI-Elemente in der Standardsprache als Zeichenfolgen gespeichert. Für die Sprache Enlisch wird eine neue Resourcendatei mit namen "BI.en-GB.resx" hinzugefügt. Bei allen weiteren Sprachen sollte dieses Format eingehalten werden: "Projektname.Sprache.resx"
Es wird eine Funktion LadeUI() implementiert, in der die entsprechenden Werte gesetzt werden. Vor dem Aufruf dieser Funktion wird immer die CurrentUICulture des aktuellen Threads geändert.

Jetzt das Problem:
In diesem Beispiel wird nur Deutsch und Enlisch "implementiert" und deshalb die Auswahl auch nur auf zwei Radiobuttons beschränkt. Wenn ich aber nun die Auswahl in eine Kombobox packen möchte, die automatisch erkennt, in welchen Sprachen diese Resourcendatei vorhanden ist.... Woher kann ich das rausfinden, in welchen Sprachen diese Resourcendatei vorhanden ist?

Nun noch eine Frage:
Die erste normale Resourcendatei (BI.resx) wird nicht zu einer ".dll" kompiliert (jedenfalls hab ich keine gefunden). Wird die dann direkt in die ".exe" kompiliert?
Jede weitere Sprache wird in ein entsprechendes Unterverzeichniss des Bin\Debug oder Bin\Release Ordners (z.B. "Bin\Debug\en-GB\") kompiliert und liegt dann dort als "Projektname.resources.dll" vor.

Danke schonmal für alle Arten von Antworten (auch für eine Verschiebung ins richtige Unterforum, falls das hier falsch is^^)
 

Nico Graichen

Erfahrenes Mitglied
Hi,

zu Frage 1:
Wie du schon festegestellt hast, wird für jede Sprache eine Resource-Assembly generiert. Anhand der Verzeichnisnamen kannst du nun auch rausfinden, welche Sprachen vorhanden sind. Schau dir dafür mal die Klasse CultureInfo an.

zu Frage 2:
Die Resourcen der Default-Sprache werden direkt in die Assembly kompiliert. alle Resourcen von weiteren Sprachen werden in Satellitenassemblies "ausgelagert" und anhand der Locale dynamisch geladen. Die Satellitenassemblies liegen in Unterverzeichnissen, die entsprechend der Sprache beannt sind.

PS:
Die Resx-Files müssen nicht wie das Projekt heißen. wichtig ist nur, dass alle Resource-Files, die zusammen gehören, den selben STammnamen haben (Bsp.: Form1.de.resx, Form1.en.resx,...)
Zudem haben die Satellitenassemblies nicht den Namen des Projekts, sondern den Namen der Assembly, welche nicht so wie das Projekt heißen muss.
 

schachmat

Erfahrenes Mitglied
gut, ich habs mal mit

Code:
My.Resources.blub.Culture.GetCultures

versucht. Aber da kommt dann wieder die Warnung, dass man "My.Resources.blub.Culture" doch bitteschön gegen "Globalization.Cultures" ersetzen soll und dann bekomm ich ja nicht die Anzahl der Kulturen, die NUR für diese eine Resourcendatei (bzw. ihre verschiedenen Versionen) vorhanden sind. Hab auch alle Möglichkeiten bei dem Parameter ausprobiert.:(

Kann man das beim Erstellen irgendwie umgehen, dass er dann die ganzen Kulturen als Unterordner im Hauptordner hat? wär ja blöd wenn dann in C:\Programme\Subbiproggi\ lauter Unterordner für die Sprachen sind. Kann man die nicht einfach alle in einen Unterordner "Sprachen" verschieben und das dann dem Programm sagen, wo er die findet, oder so?

In dem Beispiel hat der Autor halt geschrieben, dass es eine gute Idee ist, die Sprachresourcen nach dem Projektnamen (der bei mir gleich dem Assemblynamen ist) zu benennen... Trotzdem danke für den Hinweis;)
 

Nico Graichen

Erfahrenes Mitglied
Ich versteh dein Problem nicht. Vielleicht ist dir schon aufgefallen, dass die Sat.-Assemblies alle den selben Namen haben. Was passiert, wenn du die in ein Verzeichnis packst? Sie überschreiben sich gegenseitig.

Schau dir die Klasse CultureInfo richtig an (Konstruktor *winkmitzaunsfeldgeb*). Du hast die Kürzel der Sprachen, beim Starten deines Programms weißt du so auch, welche Sprachen dir zur Verfügung stehen.
 

schachmat

Erfahrenes Mitglied
Also irgendwie bin ich zu blöd oder so...:suspekt:

Vom Konstruktor hats 4 Versionen: Alle erwarten einen Culture-String (z.B. "de-DE") oder einen entsprechenden Integer. Zusätzlich noch optional irgendwas mit Überschreiben oder so.... Da komm ich jetzt nicht wirklich drauf, wie ich dadurch rausfinden soll, in welchen Versionen die entsprechende Resourcendatei vorhanden ist...:rolleyes:

Gibt es eigendlich auch die möglichkeit nur die Sprache zu nehmen. Hab mich gestern noch ein wenig informiert und rausgefunden, dass die ersten beiden Buchstaben die Sprache darstellen und die letzten beiden das Land. In der Schweiz wärs also "de-CH". Da ich die Resourcen aber nur für die Mehrsprachigkeit meines Programmes verwenden möchte, brauch ich ja nur die beiden Sprachbuchstaben... Bringt mir das irgendwas oder wirds deswegen nur noch komplizierter?

Zu dem Ordner: Ich meinte, dass man alles Sprachordner in einen Unterordner Sprachen schiebt:

Code:
\maindir
  \Sprachen
    \de-DE
    \en-GB
...

Dann sollte sich nichts überschreiben und der Hauptordner ist ein wenig aufgeräumter ;)
 

Nico Graichen

Erfahrenes Mitglied
Schau dir mal den Culture-String an und die Namen der Verzeichnisse! Fällt dir dann was auf?
Beim STarten deines Programms kannst du doch über alle Unterverzeichnisse (Stichwort name der Verzeichnisse ;)) laufen und weißt daher auch, für welche Sprachen du Resourcen hast (CultureInfo instanzieren, Name abfragen).

Die Resource-DLLs kannst du auch nur für die Sprache generieren. Für Deutsch dann eben nur de (statt de-DE für Deutsch (Deutschland)). Wie genau du das machen willst, liegt an dir. Bedenke dabei aber auch unterschiedlich Formatierungen bei den Zahlen in unterschiedlichen Regionen einer Sprache (Bsp.: Schweiz).

Das Verschieben in ein Verzeichnis geht nicht, es werden nur direkt die Verzeichnisse im Ausführungsverzeichnis durchsucht, nicht tiefer.
Ich seh da jedoch nicht wirklich ein Problem, wenn es ein paar Unterverzeichnisse gibt.
 

schachmat

Erfahrenes Mitglied
ok... jetzt hab ichs verstanden.... ich soll die verzeichnisse durchgehen.... Ich dachte die ganze Zeit, dass es da sowas wie GetCultures in der Klasse geben müsste oder so...

Kann ich diese Sateliten-Assemblies nicht auch manuell, dafür aber aus einem bestimmten Ordner laden? Das geht doch bestimmt.... fragt sich blos wie ^^

Währungen brauch ich für mein Programm noch nicht... und in den Resourcen wird schließlich nur die Sprache gespeichert. Die Währungsinfos kann ich mir dann gegebenenfalls noch mittels CultureInfo generieren.
 

Neue Beiträge