Autor Beitrag
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.10.05 12:12 
Ich habe im Internet eine Demo für einen Assistenten in CSharp gefunden. Ich habe ihn auch gleich mal um einen Hilfebutton und eine Bitmap im Header erweitert. :) Aber nun würde ich ihn auch gern mehrsprachig gestalten, damit er auf einem deutschen Windows bspw. die Buttons < Zurück, Weiter > usw. benutzt, auf einem englischen dagegen aber < Back und Next > usw. Ich komme aber leider damit nicht voran. :(

Laut .NET Framework SDK wären wohl Satellitenassemblies das richtige dafür. Ich habe nun auch die Beschriftungen in eine Strings.resources-Datei gesteckt und patche nach dem Erstellen der Controls die entsprechenden Buttons
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private void PatchButtonCaptions()
{
  try
  {
    this.helpButton.Text   = ResourcesHelper.GetString("HelpButtonCaption");
    this.backButton.Text   = ResourcesHelper.GetString("BackButtonCaption");
    this.nextButton.Text   = ResourcesHelper.GetString("NextButtonCaption");
    this.finishButton.Text = ResourcesHelper.GetString("FinishButtonCaption");
    this.cancelButton.Text = ResourcesHelper.GetString("CancelButtonCaption");
  }
  catch(Exception ex)
  {
    MessageBox.Show(ex.ToString());
  }
}


Nun habe ich dann also die Strings in der Ressourcendatei übersetzt und als Strings.de-DE.resources gespeichert. Dem SDK zufolge muss ich daraus nun eine Satellitenassembly erzeugen:
ausblenden Quelltext
1:
2:
al /t:lib /embed:Strings.de-DE.resources /culture:de-DE /template:Wizard.UI.dll
  /out:Wizard.UI.de-DE.dll

Bis hier klappt das auch alles. Nur zeigt mir das Programm nicht die Beschriftungen an, egal ob ich die Assembly in das gleiche Verzeichnis oder (wie im SDK erwähnt) in einen Unterordner namens "de-DE" stecke. Ich habe sogar schon versucht, die Sprache zu beeinflussen, indem ich in der ResourcesHelper-Klasse manuell den Befehl:
ausblenden C#-Quelltext
1:
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");					

aufrufe. Einen Effekt hatte das freilich nicht. :cry:

Kennt jemand die Lösung für mein Problem?


Moderiert von user profile iconraziel: Topic aus C# - Die Sprache verschoben am Sa 15.10.2005 um 13:34
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Sa 15.10.05 09:59 
Morgen Mathias,

ich hab das mal versucht nachzuvollziehen. Da könnte der Fehler liege:
user profile iconMathiasSimmack hat folgendes geschrieben:
ausblenden Quelltext
1:
al /t:lib /embed:Strings.de-DE.resources /culture:de-DE /template:Wizard.UI.dll /out:Wizard.UI.de-DE.dll					

Die Library muss, glaub ich, den gleichen Namen wie die Anwendung tragen, ohne diese Culture-ID. Da somit alle Libraries den gleichen Namen tragen, müssen sie in einen Unterordner, wie im SDK steht ;) Außerdem solltest du eine neutrale Fallback-String-Resource (die mit resgen erzeugte resource-Datei) in das Projekt mit einlinken, damit jemand aus einer nicht-unterstützten Region keine Exception präsentiert bekommt. Falls das immer noch nicht fruchtet, schau dir mal das Beispielprojekt %.NET-SDK%\Samples\Tutorials\resourceandlocalization\worldcalc an.

Gruß,
raziel

_________________
JSXGraph
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.10.05 11:36 
*hust*
user profile iconMathiasSimmack hat folgendes geschrieben:
egal ob ich die Assembly in das gleiche Verzeichnis oder (wie im SDK erwähnt) in einen Unterordner namens "de-DE" stecke.

Das mit dem Dateinamen habe ich auch schon probiert :) Und die so genannte fallback resource ist ja die normale Strings.resources-Datei in der Hauptassembly. Und genau die sehe ich ja auch ständig; sprich: die englischen Buttontexte.

Die Demo habe ich mir auch angesehen. Wenn ich mich recht erinnere, wird dort die CultureInfo manuell im Programm geändert bzw. erweitert. Aber genau das will ich ja nicht, denn der Assistent soll, abhängig von der Sprache des OS, selbst die korrekte Ressource wählen. Und wenn ich die Erläuterungen im SDK richtig verstehe, kann das .NET Framework das auch.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.10.05 13:01 
So, Problem gelöst. :)

1. Die Satellitenassembly muss offenbar zwingend <AssemblyName>.resources.dll heißen. In meinem Fall also Wizard.UI.resources.dll.

2. Wie raziel richtig schrieb, gehört sie in einen Unterordner, der sich nach der Sprache richtet. Ich habe im ersten Beitrag gezeigt, dass ich als Kultur de-DE nutze. Inzwischen verwende ich allgemein de, demzufolge muss der Ordner auch "de" heißen.

3. Der wichtigste Punkt überhaupt: Mit dem Reflector habe ich mal nachgeschaut, wie meine Strings überhaupt gespeichert werden. In meinem Fall lautet der vollständige Name der Resource Wizard.UI.resources.Strings.resources.
Ich muss den Namen für die deutschen Resourcen deswegen entsprechend anpassen: Wizard.UI.resources.Strings.de.resources. Wie die Datei an sich heißt, ist unerheblich, wichtig ist hier wirklich nur das .de. im internen Namen, der in der Assembly gespeichert werden soll. Und das macht man, indem man bei Al.exe nicht nur die Ressourcendatei sondern auch den gewünschten Ressourcennamen angibt:
ausblenden Quelltext
1:
2:
3:
4:
5:
%AL% /t:lib
  /embed:Strings.de.resources,Wizard.UI.resources.Strings.de.resources
  /culture:de
  /fileversion:1.1.0.0
  /out:Wizard.UI.resources.dll

Voilà. Mein Assistent präsentiert sich mit deutschen Buttons. :)