2009-08-24 9 views
6

Wir haben eine Ressourcendatei mit vielen übersetzten Strings, die an verschiedenen Stellen in unserer Anwendung verwendet werden. Gibt es eine bessere Möglichkeit, beispielsweise den Text einer Schaltfläche an eine bestimmte Zeichenfolge zu binden?C#: Wie man den Text einer Winforms-Schaltfläche an eine Ressource bindet

Derzeit sind wir in der Regel nur in dem Konstruktor so etwas wie dies zu tun, in einem Event-Handler-Laden oder bei einem Verfahren nach einem der Berufenen:

someButton.Text = CommonTexts.SomeString; 
someMenuItem.Text = CommonTexts.SomeOtherString; 

Gibt es einen besseren Weg, es zu tun? Vielleicht im Designer? Oder ist das die empfohlene Vorgehensweise?

Nur um Sie wissen zu lassen, wie wir die eigentliche Übersetzung machen: Wir haben ein Klassenbibliotheksprojekt, das nur resx-Dateien enthält. Die Hauptresx-Dateien sind natürlich in Englisch geschrieben. Wir öffnen dann diese Basis-Resx-Dateien in einer Anwendung namens ResEx, wo wir (oder jemand anders) die Übersetzung in andere Sprachen durchführt. Wenn kompiliert wird, erstellt Visual Studio automatisch Assemblys für jede Sprache, die je nach dem aktuellen Kultursatz automatisch verwendet werden. Das funktioniert ziemlich gut, daher brauche ich nicht wirklich Informationen darüber, wie man die Übersetzung macht und so (obwohl ich natürlich immer auf Verbesserungen neugierig bin). Was ich frage ist, ob es einen besseren Weg gibt, um diese übersetzten Strings von der Ressourcen-Assembly und in alle verschiedenen Text-Eigenschaften zu bekommen.

+0

Re, die Bearbeiten: Die Gegenfrage ist: Warum verwenden Sie nicht das Standard-FormLoad-System? Es ist eingebaut und unsichtbar. –

+1

Weil ich mich gefragt habe, ob es einen besseren Weg gibt. – Svish

Antwort

3

Sie tun können:

using System.Resources; 
using System.Reflection; 

Assembly assembly = this.GetType().Assembly; 
resman = new ResourceManager("StringResources.Strings", assembly); 
btnButton.Text = resman.GetString("ButtonName"); 
+3

Das wäre irgendwie so, wie ich es schon mache, außer viel komplizierter: p – Svish

+0

@Thomas: Ich glaube nicht, dass das Poster bindend ist wie in "Datenbindung". – MusiGenesis

+0

In VS2008 (und wahrscheinlich 2005) stellt der Standardressourcenmanager, den Sie durch das Hinzufügen einer Ressourcendatei zu Ihrem Projekt erhalten, Eigenschaften für den Schlüsselwert zur Verfügung, so dass nur "btnButton.Text = resman.ButtonName" gespeichert wird die Saite. –

0

Ihr Weg ist der beste Weg, dies zu tun, wenn Sie Entwickler, die in den Sprachen, die nicht persönlich fließend sind Sie in Ihre Anwendung zu übersetzen. Ich habe das schon vorher mit einer englischen Applikation gemacht, die ins Spanische, Portugiesische und Chinesische übersetzt werden musste (ich spreche nur eine davon halb flüssig). Die ursprünglichen Formulare wurden alle in Englisch erstellt, und im Load-Ereignis des Formulars durchlief der Code jedes Steuerelement und suchte in einer Übersetzungstabelle nach der Eigenschaft Text jedes Steuerelements und ersetzte sie durch die entsprechende Übersetzung.

Die eingebaute Möglichkeit der Internationalisierung eines Formulars (was im Grunde eine Variante der Formularvererbung ist) setzt voraus, dass der Programmierer die Sprache fließend beherrscht, in die Sie übersetzen müssen, was ziemlich lang ist und Sie benötigt um alle übersetzten Textwerte für jedes Formular und jede Sprache manuell einzugeben. Es macht auch Ihre Binärdatei größer (möglicherweise viel größer), da es eine RESX-Datei für jedes Formular für jede Sprache, die Sie unterstützen, hinzufügt.

0

Versuchen Sie folgendes:

someButton.DataBindings.Add ("Text", CommonTexts, "Somestring");

1

Es gibt ein gutes Tool namens LingoBit Localizer, das den Job für den Bruchteil der Zeit erledigt, die es dauern würde, um alle Ressourcen-Dateien zu erstellen.

Während Sie sich im Entwicklungsprozess befinden, müssen Sie sich nicht um andere Sprachen kümmern. Sie programmieren und legen Eigenschaften einfach so fest, als würden Sie für eine einsprachige Software programmieren. Nachdem Sie fertig sind oder wann immer Sie möchten, führen Sie LingoBit Localizer über Ihre DLL- oder Windows Form-Anwendung aus. Dadurch werden vom Benutzer anzeigbare Strings innerhalb der GUI für Sie in einem Raster angezeigt. Nun könnte vielleicht ein professioneller Übersetzer die Wörter übersetzen, wenn Ihre Programmierer die Sprache, für die die Anwendung übersetzt werden soll, nicht kennen. Dann speichern Sie das Projekt einfach, wenn Sie fertig sind. Dadurch wird eine DLL-Datei erstellt, die Sie einfach zu Ihrem binären Implementierungsverzeichnis hinzufügen. Anschließend wird Ihre Anwendung automatisch auf die richtige Sprache eingestellt, abhängig von den aktuellen Kulturinformationen, auf denen die App basiert. ist installiert oder so. Das spart viel Programmierzeit und Kopfschmerzen.

Ich hoffe, dies hilft, obwohl es keine ressourcenbasierte Lösung ist.

+0

Das ist ein vernünftiger Ansatz für dieses Problem. Wenn nur sie Portugiesisch unterstützt ... – MusiGenesis

+0

Sie können auch VisualLocalize verwenden. Wir benutzen dieses Werkzeug sehr oft. Das Beste daran ist, dass Sie später alle Ihre Dialoge überprüfen können, wenn der übersetzte Text in die Steuerelemente passt. Wenn Sie das Steuerelement nicht in dieser Sprache ändern können, werden die neuen Größen neben dem lokalisierten Text in einer Satellite-Assembly gespeichert. – PVitt

1

Dies wird den Wert des Schlüsselwortes Home extrahieren und in die Text1 Box füllen.

Text1.Text= Resource.Home.ToString(); 
3

Ich verstehe, es ist eine alte Frage, aber immer noch, ich hatte das gleiche Problem (VS 2010), und eine der ersten Links in Google ist dieses Thema.

Um alle Texte in die Ressourcendatei für Formulare zu verschieben, müssen Sie die winform Localizable-Eigenschaft auf True setzen. Und das ist es. :) (c) Kappe. O.

Verwandte Themen