2009-08-24 11 views
6

Nous avons un fichier de ressources avec beaucoup de chaînes traduites utilisés différents endroits dans notre application. Existe-t-il un meilleur moyen de lier par exemple le texte d'un bouton à une certaine chaîne?C#: Comment lier le texte d'un bouton winforms à une ressource

Actuellement nous sommes habituellement en train de faire quelque chose comme ça dans le constructeur, dans un gestionnaire d'événements de charge ou dans une méthode appelée par l'un de ceux:

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

Y at-il une meilleure façon de le faire? Peut-être dans le concepteur? Ou est-ce la façon recommandée de le faire? Juste pour vous faire savoir comment nous faisons la traduction réelle: Nous avons un projet de bibliothèque de classes qui ne contient que des fichiers resx. Les principaux fichiers resx sont écrits en anglais (bien sûr). Nous ouvrons ensuite ces fichiers de base resx dans une application appelée ResEx où nous (ou quelqu'un d'autre) fait la traduction dans d'autres langues. Une fois compilé, Visual Studio crée automatiquement des assemblys pour chaque langue qui sont utilisés automatiquement en fonction du jeu de culture en cours. Cela fonctionne assez bien, donc je n'ai pas vraiment besoin d'informations sur la façon de faire la traduction et autres (bien que je suis toujours curieux d'apporter des améliorations bien sûr). Ce que je demande, c'est s'il y a une meilleure façon d'obtenir ces chaînes traduites de l'assemblage de ressources et dans toutes les propriétés Text.

+0

Re, le Edit: La question du compteur est: pourquoi n'utilisez-vous pas le système FormLoad par défaut? C'est construit et invisible. –

+1

Parce que je me demandais s'il y avait un meilleur moyen. – Svish

Répondre

3

Vous pouvez faire:

using System.Resources; 
using System.Reflection; 

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

Ce serait un peu comme je le fais déjà, sauf beaucoup plus complexe: p – Svish

+0

@ Thomas: Je ne pense pas que l'affiche signifiait se lier comme dans "liaison de données". – MusiGenesis

+0

Dans VS2008 (et probablement 2005) le gestionnaire de ressources par défaut que vous obtenez en ajoutant un fichier de ressources à votre projet expose les propriétés nommées pour la valeur de clé, ce qui serait simplement "btnButton.Text = resman.ButtonName", ce qui évite les fautes de frappe. la chaîne –

0

Votre est la meilleure façon de le faire si vous avez les développeurs qui ne sont pas personnellement parlant couramment les langues que vous traduisez votre application en. Je l'ai déjà fait avec une application en anglais qui devait être traduite en espagnol, portugais et chinois (je ne parle que l'un d'entre eux de façon semi-fluide). Les formulaires originaux ont tous été créés en anglais, et dans l'événement Load du formulaire, le code a parcouru chaque contrôle et recherché la propriété Text de chaque contrôle dans une feuille de calcul de traductions, et l'a remplacée par la traduction appropriée. La manière intégrée d'internationaliser un formulaire (qui est fondamentalement une variante de l'héritage de forme) suppose que le programmeur parle couramment le langage que vous devez traduire, ce qui est assez long, et il vous faut entrer manuellement toutes les valeurs de texte traduites pour chaque formulaire et chaque langue. Cela rend également votre binaire plus grand (potentiellement beaucoup plus grand), puisqu'il ajoute un fichier .resx pour chaque formulaire pour chaque langue que vous prenez en charge.

0

Essayez ceci:

someButton.DataBindings.Add ("Texte", CommonTexts, "SomeString");

1

Il existe un bon outil appelé LingoBit Localizer qui fait le travail pour la fraction du temps qu'il faudrait pour construire tous les fichiers sources.

Vous n'avez pas à vous préoccuper des autres langues pendant le processus de développement, vous devez simplement coder et définir les propriétés comme vous le feriez si vous programmiez un logiciel unilingue. Lorsque vous avez terminé ou lorsque vous le souhaitez, vous exécutez LingoBit Localizer sur votre application DLL ou Windows Form. Cela va obtenir des chaînes affichables par l'utilisateur à une grille pour vous dans son interface graphique. Maintenant, peut-être un traducteur professionnel pourrait-il utiliser pour traduire les mots si vos programmeurs ne connaissent pas la langue pour laquelle l'application doit être traduite. Ensuite, vous enregistrez simplement le projet lorsque vous avez terminé. Cela créera un fichier DLL que vous ajouterez simplement à votre répertoire de déploiement binaire, puis votre application se réglera automatiquement dans la bonne langue en fonction des informations de culture actuelles sur lesquelles l'application. est installé ou alors. Cela économise beaucoup de temps de programmation et de maux de tête.

Espérons que cela aide même si ce n'est pas une solution basée sur les ressources.

+0

C'est une approche raisonnable à ce problème. Si seulement ils supportaient le portugais ... – MusiGenesis

+0

Vous pouvez également utiliser VisualLocalize. Nous utilisons très souvent cet outil. La bonne chose ici est que vous pouvez plus tard vérifier toutes vos boîtes de dialogue si le texte traduit entre dans les contrôles et sinon vous pouvez redimensionner le contrôle seulement dans cette langue et les nouvelles tailles seront stockées en dehors du texte localisé dans un assemblage satellite. – PVitt

1

Cela va extraire la valeur du mot-clé Home et remplir dans la boîte Text1.

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

Je comprends, il est une question ancienne, mais encore, j'ai eu la même question (VS 2010), et l'un des premiers liens dans Google est ce sujet. Pour déplacer tous les textes vers les fichiers de ressources de formulaires, vous devez définir la propriété Propriété de la propriété winform sur Vrai. Et c'est tout. :) (c) Cap. O.

Questions connexes