Zum Inhalt springen

Lokalisierung in View oder in ViewModel


steinadler

Empfohlene Beiträge

Hallo,

 

ich nutze in meiner Software das MVVM-Pattern.

In einem Fenster möchte ich ein Datagrid mit Werten anzeigen (Name, Wert, Einheit). Nun stellt sich mir die Frage, wo ich die Liste erzeuge: im ViewModel oder in der View?

Erzeuge ich sie im ViewModel müsste ich die Liste dort entsprechend der eingestellten Sprache befüllen und Darstellung des Zahlenformats jeweils angeben.

Erzeuge ich die Liste im Xaml (View), kümmert sich meine LanguageEngine um die Sprache - ich scheitere nur bisher daran, diese Liste so umzusetzen.

 

Hat jemand eine Idee?

Bearbeitet von steinadler
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

wenn die Ausgabe eines Datums mit der aktuell, gesetzten Sprache formatiert werden soll, reicht doch z.B.:

<TextBlock Text="{Binding Date, StringFormat='{}{0:d}'}"/>

Mit dem Befehl an beliebiger Stelle

Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");

wird die aktuelle Sprache der Anwendung entsprechend gesetzt. Dann wird aus z.B. 11/09/2017 -> 09.11.2017.

Die Einheit würde ich als Resource hinterlegen und diese auch per Binding einbinden. Mit dem Ändern der CurrentCulture wird die entsprechende Übersetzung der Resource angezeigt, sofern diese verfügbar ist. (https://msdn.microsoft.com/en-us/library/aa992030(v=vs.100).aspx)

 

Gehst du allerdings nicht den Weg über die CurrentCulture, musst du dich komplett selbst drum kümmern und deine Strings und Formatierungen alle selbst im ViewModel hinterlegen. Ein anderen Wege kenne ich zumindest gerade nicht. 

 

EDIT: Die Liste würde ich im ViewModel erzeugen. Die Art der Darstellung wie beschreiben im xaml und in Resourcendateien.

Bearbeitet von Mttkrb
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb Mttkrb:

Gehst du allerdings nicht den Weg über die CurrentCulture, musst du dich komplett selbst drum kümmern und deine Strings und Formatierungen alle selbst im ViewModel hinterlegen. Ein anderen Wege kenne ich zumindest gerade nicht. 

Genau das ist der Punkt.

Im Moment habe ich ein Tool, das alle Zeichenfolgen im XAML in ResourceDictionary packt. Dort stehen dann die zugehörigen Übersetzungen drin. Ändere ich einen Eintrag im ResourceDictionary (dies passiert auch beim Änderun der Sprache), wird dann die GUI aktualisiert.

Mir widerstrebt nur im Moment, dass ich die Liste im ViewModel je nach Sprache zusammenbauen muss.

 

Ich dachte eher an soetwas:

xaml:

<array>
  <item group="common" text="englishNamedParameter" value="{Binding myParameter1}" unit="s" stringformat="f3" />
  <item ... />
</array>

 

somit würde die automatische Übersetzung wieder passen. Nur soetwas bekomme ich momentan nicht an das DataGrid gebunden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann könnte man doch per MultiBinding und passendem Converter sich die Ausgabe zusammenbasteln. Das sieht nicht wirklich schön aus, könnte aber reichen.

<TextBlock>
            <TextBlock.Text>
                <MultiBinding MultiValueConverter="{StaticResource CustomLocalizingConverter}">
                    <Binding>
                        <Binding.Source>
                            <sys:String>common</sys:String>
                        </Binding.Source>
                    </Binding>
                    <Binding>
                        <Binding.Source>
                            <sys:String>englishNamedParameter</sys:String>
                        </Binding.Source>
                    </Binding>
                    <Binding Path="myParameter1"/>
                    <Binding>
                        <Binding.Source>
                            <sys:String>s</sys:String>
                        </Binding.Source>
                    </Binding>
                    <Binding>
                        <Binding.Source>
                            <sys:String>f3</sys:String>
                        </Binding.Source>
                    </Binding>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>

Oder Du erstellst dir ein eigenes TextBlockControl, dass die Parameter entgegen nimmt  und daraus den gewünschten Text anzeigst.

<own:MyCustomTextBlock 
  group="common" 
  text="englishNamedParameter" 
  value="{Binding myParameter1}"
  unit="s" 
  stringformat="f3"/>

Dieses Control wird anschließend als Template in das Grid eingefügt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Mttkrb:

Oder Du erstellst dir ein eigenes TextBlockControl, dass die Parameter entgegen nimmt  und daraus den gewünschten Text anzeigst.


<own:MyCustomTextBlock 
  group="common" 
  text="englishNamedParameter" 
  value="{Binding myParameter1}"
  unit="s" 
  stringformat="f3"/>

Dieses Control wird anschließend als Template in das Grid eingefügt.

Sowas wird es wohl werden müssen. Nur benötige ich dann ja für jeden einzelnen Parameter eine entsprechende MyCustomTextBlock-Instanz. An ein DataGrid kann man soweit ich weiß nicht ein Template je Zeile binden.

Wollte halt gern ein DataGrid, um - ähnlich wie beim VS-Eigenschaftenfenster - das schön gruppieren zu können.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Pro Zeile wird das Template nicht gesetzt. Höchstens pro Spalte :-D

<DataGrid Name="myGrid" AutoGenerateColumns="False">
	<DataGrid.Columns>
  		<DataGridTemplateColumn Header="englishNamedParameter">
  			<DataGridTemplateColumn.CellTemplate>
  				<DataTemplate>
                  <own:MyCustomTextBlock 
                    group="common" 
                    text="englishNamedParameter" 
                    value="{Binding myParameter1}"
                    unit="s" 
                    stringformat="f3"/>
                  </DataTemplate>
    		</DataGridTemplateColumn.CellTemplate>
    	</DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

den jeweiligen Wert, ja.

Also Wenn das Binding von ItemsSource des DataGrid an z.B. folgende Collection "MyGridItems" gesetzt ist und dies wie folgt definiert ist:

public class MyListItem { 
  public double myParameter1 {get;set;}
}

....
  
  IEnumerable<MyListItem> MyGridItems = ...

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...