在ViewModel中获取String.xml值 - MvvmCross

时间:2016-06-09 18:40:58

标签: xamarin xamarin.android mvvmcross

我的viewModel中有以下列表。但是,为了支持多种语言,我希望此字符串来自string.xml。可能吗?

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

1 个答案:

答案 0 :(得分:5)

如果您正在构建原生的Android和iOS应用程序,则可以使用界面:

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

在Android和iOS项目中,您有一个实现界面的类: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);
    }
}

然后将类的一个实例(在视图中实例化)传递给视图模型以获取字符串。字符串必须放在iOS项目的 Localizable.strings 文件和Android项目的 Strings.xml 文件中。

在ViewModel上你会得到:

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")));
    }
}

考虑到你添加了两个字符串&#34; Open&#34;和&#34;关闭&#34;对于&#34; Open&#34;和&#34;关闭&#34; Strings.xml (Android)和 Localizable.strings (iOS)上的键。