在ViewModel中获取String.xml值 - MvvmCross

cas*_*las 1 xamarin.android mvvmcross xamarin

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

private List<Thing> _items = new List<Thing>()
{
   new Thing("Open"),
   new Thing("Close"),
};
Run Code Online (Sandbox Code Playgroud)

Hen*_*ros 5

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

public interface ILocalization {
    string GetLocalizedString(string key);
}
Run Code Online (Sandbox Code Playgroud)

在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

iOS版:

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

然后将类的一个实例(在视图中实例化)传递给视图模型以获取字符串.字符串必须放在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")));
    }
}
Run Code Online (Sandbox Code Playgroud)

考虑到你为Strings.xml(Android)和Localizable.strings(iOS)上的"Open"和"Closed"键添加了两个字符串"Open"和"Closed"这一事实.