2016-06-09 8 views
1

Ich habe die folgende Liste in meinem viewModel. Um jedoch mehrere Sprachen zu unterstützen, möchte ich, dass diese Zeichenfolge von string.xml stammt. Ist es möglich?Get String.xml Werte im ViewModel - MvvmCross

private List<Thing> _items = new List<Thing>() 
{ 
    new Thing("Open"), 
    new Thing("Close"), 
}; 
+0

https://developer.xamarin.com/guides/xamarin-forms/advanced/localization/ – Jason

+0

Das bedeutet, dass Sie Ihre Strings über Projekte (Android/IOS, usw.) dupliziert haben müssen. Wenn Sie Ihre Gebietsschemas nur an einem Ort (Ihrem PCL) haben möchten, können Sie diese Bibliothek verwenden: https://github.com/xleon/I18N-Portable – xleon

Antwort

5

Wenn Sie bauen nativen Android und iOS apps Sie die Schnittstelle haben könnte:

public interface ILocalization { 
    string GetLocalizedString(string key); 
} 

Und in den Android- und iOS-Projekte, die Sie eine Klasse, die die Schnittstelle implementiert, Android:

public class LocalizationAndroid : ILocalization 
{ 
    public Activity context; 

    public LocalizationAndroid(Activity _context) { 
     context = _context; 
    } 

    public string GetLocalizedString(string key) 
    { 
     var resourceId = (int)typeof(Resource.String).GetField(key).GetValue(null); 
     return context.GetString(resourceId); 
    } 
} 

iOS:

public class LocalizationIOS : ILocalization 
{ 
    public string GetLocalizedString(string key) 
    { 
     return NSBundle.MainBundle.LocalizedString(key, null); 
    } 
} 

Und dann übergeben Sie eine Instanz der Klasse (in Ihrer Sicht instanziiert) an das Ansichtsmodell, um die Zeichenfolgen zu erhalten. Die Zeichenfolgen müssen an der Datei Localizable.strings für das iOS-Projekt und an der Datei Strings.xml für das Android-Projekt platziert werden.

Auf der Ansichtsmodell würden Sie haben:

public class MyViewModel 
{ 
    public ILocalization LocalizationObject; 

    private List<Thing> _items; 

    public MyViewModel(ILocalization _localizationObject) 
    { 
     LocalizationObject = _localizationObject; 
     _items.Add(new Thing(LocalizationObject.GetLocalizedString("Open"))); 
     _items.Add(new Thing(LocalizationObject.GetLocalizedString("Closed"))); 
    } 
} 

Diese, in Anbetracht der Tatsache, dass Sie die beiden Strings „Öffnen“ und „geschlossen“ für die „Open“ und „Geschlossen“ Tasten auf den Strings hinzugefügt .xml (Android) und Localizable.strings (iOS).

+0

könnten Sie bitte auch einen Beispielcode von 'ViewModel' side as anzeigen Gut. – hotspring

+0

edited die Antwort auf die ViewModel Teil –

+0

Sind 'LocalizationAndroid' und' ILocalizationAndroid' im Android-Projekt nicht in der Portable-Klasse? – hotspring

Verwandte Themen