2009-08-24 11 views
6

Abbiamo un file di risorse con molte stringhe tradotte utilizzate in vari punti della nostra applicazione. C'è un modo migliore per legare per esempio il testo di un pulsante a una determinata stringa?C#: Come associare il testo di un pulsante Winforms a una risorsa

Attualmente stiamo di solito solo facendo qualcosa di simile nel costruttore, in un gestore di eventi Load o in un metodo chiamato da uno di quelli:

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

Esiste un modo migliore per farlo? Forse nel designer? O è questo il modo consigliato di farlo?


Solo per farvi sapere come facciamo la traduzione attuale: Abbiamo un progetto di libreria di classi che contiene solo file resx. I principali file resx sono scritti in inglese (ovviamente). Quindi apriamo quei file resx di base in un'applicazione chiamata ResEx dove noi (o qualcun altro) facciamo la traduzione in altre lingue. Quando compilato, Visual Studio crea automaticamente gli assembly per ogni lingua che vengono utilizzati automaticamente in base al set di cultura corrente. Funziona abbastanza bene, quindi non ho davvero bisogno di informazioni su come eseguire la traduzione e così via (anche se sono sempre curioso di migliorare ovviamente). Quello che sto chiedendo è se c'è un modo migliore per ottenere quelle stringhe tradotte dall'assieme risorse e in tutte le varie proprietà Text.

+0

Re, la modifica: la domanda del contatore è: perché non si utilizza il sistema FormLoad predefinito? È integrato e invisibile. –

+1

Perché mi stavo chiedendo se ci fosse un modo migliore. – Svish

risposta

3

si può fare:

using System.Resources; 
using System.Reflection; 

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

Questo sarebbe lo stesso modo in cui lo faccio già, ad eccezione di molto più complesso: p – Svish

+0

@Thomas: Non penso che il poster significhi binding come in "data binding". – MusiGenesis

+0

In VS2008 (e probabilmente nel 2005) il gestore risorse predefinito che si ottiene dall'aggiunta di un file di risorse al progetto espone proprietà denominate per il valore della chiave, quindi sarebbe semplicemente "btnButton.Text = resman.ButtonName", risparmiando preoccupazioni sugli errori di battitura la stringa. –

0

Il tuo modo è il modo migliore per farlo se si dispone di sviluppatori che non sono personalmente fluente in lingue che stai tradurre l'applicazione in. L'ho già fatto con un'applicazione inglese che doveva essere tradotta in spagnolo, portoghese e cinese (ne parlo solo in modo semi-fluente). I moduli originali sono stati tutti creati in inglese e, nell'evento Load del modulo, il codice ha iterato attraverso ogni controllo e ha cercato la proprietà Text di ciascun controllo in un foglio di calcolo delle traduzioni e lo ha sostituito con la traduzione appropriata.

Il modo integrato di internazionalizzare un modulo (che è fondamentalmente una variante dell'ereditarietà della forma) presuppone che il programmatore sia fluente nella lingua a cui è necessario tradurre, il che è piuttosto lungo e richiede per inserire manualmente tutti i valori del testo tradotto per ogni modulo e ogni lingua. Inoltre, rende il file binario più grande (potenzialmente molto più grande), poiché aggiunge un file .resx per ogni modulo per ogni lingua supportata.

0

Prova questo:

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

1

C'è un buon strumento chiamato LingoBit Localizer che fa il lavoro per la frazione del tempo necessario per creare tutti i file di risorse.

Non è necessario preoccuparsi di altre lingue durante il processo di sviluppo, è sufficiente codificare e impostare le proprietà come si farebbe se si stesse programmando per un software monolingue. Dopo aver finito, o quando lo si desidera, si esegue LingoBit Localizer tramite l'applicazione DLL o Windows Form. Questo otterrà le stringhe visualizzabili dall'utente in una griglia per te all'interno della sua GUI. Ora, forse un traduttore professionista potrebbe usare per tradurre le parole se i tuoi programmatori non conoscono la lingua per la quale l'applicazione deve essere tradotta. Quindi, si salva semplicemente il progetto quando hai finito. Questo creerà un file DLL che aggiungerai semplicemente alla tua directory di distribuzione binaria, quindi l'applicazione si imposterà automaticamente nella lingua giusta in base alle informazioni cultura correnti su cui è installata l'app. è installato o così. Ciò consente di risparmiare un sacco di tempo di programmazione e mal di testa.

Spero che questo aiuti anche se non è una soluzione basata sulle risorse.

+0

Questo è un approccio ragionevole a questo problema. Se solo avessero supportato il portoghese ... – MusiGenesis

+0

Puoi anche usare VisualLocalize. Usiamo questo strumento molto spesso. La cosa bella qui è che puoi in seguito controllare tutte le tue finestre di dialogo se il testo tradotto si adatta ai controlli e se non puoi ridimensionare il controllo solo in questa lingua e le nuove dimensioni saranno memorizzate da parte il testo localizzato in un assemblaggio satellitare. – PVitt

1

Questo estrarrà il valore della parola chiave Home e popolerà nella casella Text1.

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

ho capito, è una vecchia questione, ma ancora, ho avuto lo stesso problema (VS 2010), e uno dei primi collegamenti in Google è questo argomento.

Per spostare tutti i testi nel file di risorse dei moduli, è necessario impostare la proprietà Localizza Winform su True. E questo è tutto. :) (c) Cap. O.

Problemi correlati