2010-10-04 10 views
8

Ho una domanda molto comune. Qual è il modo migliore per eseguire la localizzazione in un'app WPF. Beh, ho cercato anche in SO e Binged. Ma non sono riuscito a trovare alcun suggerimento che sia davvero semplice ed elegante.Localizzazione WPF in XAML, qual è il modo semplice, facile ed elegante di farlo?

supponga che devo visualizzare nell'interfaccia utente qualcosa di simile:

In inglese: Orgnanization - Beoing

In francese: Organizzazione - Beoing

<StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Organization -"></TextBlock> 
     <TextBlock Text="{Binding Path=OrganizationName}"> 
     </TextBlock> 
    </StackPanel> 

Fondamentalmente, ho bisogno di assegnare il localizzato text to Organization Label TextBlock. Devo separare il trattino da "Organizzazione -" e inserirlo in un'etichetta separata?

Come faccio?

+5

'Organizzazione' non è francese! -> 'organizzazione' –

risposta

0

Abbiamo un'applicazione in grado di passare le lingue dell'interfaccia utente in fase di esecuzione e ha la capacità di utilizzare nuove lingue dell'interfaccia utente copiando le risorse appropriate in una determinata directory. L'uso di alcune risorse compilate per questo è troppo rigido in termini di distribuzione ecc. Quindi abbiamo le nostre risorse linguistiche in un ResourceDictionary come System: Stringhe - un ResourceDictionary in un file XAML separato per ogni lingua. I file XAML sono contrassegnati come Contenuto in VS e copiati. Puoi utilizzarli come DynamicResources in XAML o tramite un'istanza di Localizer in C#. Questo concetto è molto utile nella nostra applicazione.

1

Date un'occhiata a questo white paper, se non ricordo male si spiega come utilizzare il dizionario delle risorse in XAML per la localizzazione -

Questo progetto comprende un whitepaper con esempi di codice per aiutare di Windows Presentation Foundation (WPF Gli sviluppatori localizzano le loro applicazioni . Il whitepaper confronta LocBaml e gli approcci classici di Resx con pro e contro.

http://wpflocalization.codeplex.com/

2

mi legano tutte le etichette, ecc nella mia applicazione ad un oggetto che uso per la visualizzazione dei diversi linguaggi. Conservo tutte le stringhe in un database e recupero le stringhe corrette in base alla lingua selezionata dall'utente. Questo ha il vantaggio di aggiornarsi istantaneamente durante l'esecuzione. In questo modo l'utente non ha bisogno di riavviare l'applicazione come faresti se decidessi di rendere le finestre "Localizzabili".

+0

Per modificare in fase di esecuzione, controllare [LocalizationExtension] (https://wpflocalizeextension.codeplex.com/). – Peter

6

Creare un progetto WpfApplication1

Creare una cartella 'localizzazione'

Aggiungi un file di risorse (Strings.resx) in 'localizzazione \' e aggiungere la stringa 'OrganizationText' e il valore 'Organizzazione'

Quando si compila, viene generato un file designer.cs. Sfortunatamente, tutti i metodi in questo file sono interni e abbiamo bisogno dell'accesso pubblico per abilitare i riferimenti alle stringhe da wpf. Per fare ciò, sostituisci lo "strumento personalizzato" .resx con "PublicResXFileCodeGenerator" (> = vs2008) e crea nuovamente. Usa questo xaml in MainWindow.XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:localization="clr-namespace:WpfApplication1.Localization" 
     Title="MainWindow" Height="350" Width="525"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{x:Static localization:Strings.OrganizationText}"/> 
     </StackPanel> 
</Window> 

Per aggiungere il '-', è necessario utilizzare MultiBinding (vedi here)

+0

Bene Il tuo approccio non funziona. Sto affrontando questo errore Una prima eccezione di tipo "System.Windows.Markup.XamlParseException" si è verificata in PresentationFramework.dll Ulteriori informazioni: "Fornisci valore su" System.Windows.Markup.StaticExtension "ha generato un'eccezione." Numero di riga '30' e posizione di linea '26'. –

+1

Ho appena creato questo progetto e funziona come un fascino (vs 2013, net 4.5 e net 4 pure). Hai aggiunto il nome e il valore "OrganizationText" nel file string.resx? (risposta modificata con ulteriori dettagli) –

+2

OK. Ho trovato che la risorsa dovrebbe essere pubblica. È interno per impostazione predefinita. –

0

Ho fatto una soluzione completa localizzazione che supporta anche la traduzione XAML attraverso una serie di MarkupExtensions (incl editor di traduzione.) . Utilizza un dizionario con tutti i testi tradotti (comprese le forme singolari/plurali) a cui è possibile accedere tramite MarkupExtensions da XAML o metodi regolari di altro codice. Le MarkupExtensions supportano anche la modifica della lingua in fase di esecuzione e si aggiornano anche quando il file del dizionario sottostante viene modificato.

Altre funzionalità sono la data/ora localizzata e la formattazione numerica e gli helper tipografici.

Sto utilizzando questa libreria con successo in alcune applicazioni e prevedo di utilizzarla in altre app in futuro.

http://dev.unclassified.de/source/txlib

Problemi correlati