Jump to content

Lokalisierung in View oder in ViewModel

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

Diesen Beitrag teilen


Link zum Beitrag
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

Diesen Beitrag teilen


Link zum Beitrag
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.

Diesen Beitrag teilen


Link zum Beitrag
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.

Diesen Beitrag teilen


Link zum Beitrag
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.

 

Diesen Beitrag teilen


Link zum Beitrag
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>

 

Diesen Beitrag teilen


Link zum Beitrag
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 = ...

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden


×