Localization 在MvvmCross ViewModels中本地化文本

Localization 在MvvmCross ViewModels中本地化文本,localization,xamarin.ios,xamarin.android,windows-phone-8,mvvmcross,Localization,Xamarin.ios,Xamarin.android,Windows Phone 8,Mvvmcross,我想从ViewModels中获取所有本地化文本(因为它通常是动态的),我想知道如何使用转换器从用于本地化的json文件中获取文本。例如,在下面的代码中,我希望LocalisedString使用当前在静态文本绑定的视图中使用的转换器- public string MyText // used in the binding in the View { get { string exclamation; if (MyValue <= 3.3)

我想从ViewModels中获取所有本地化文本(因为它通常是动态的),我想知道如何使用转换器从用于本地化的json文件中获取文本。例如,在下面的代码中,我希望LocalisedString使用当前在静态文本绑定的视图中使用的转换器-

public string MyText // used in the binding in the View
{
    get
    {
        string exclamation;

        if (MyValue <= 3.3)
        {
            exclamation = LocalisedString("Rubbish!");
        }
        else if (OverallScore > 3.3 && OverallScore <= 6.6)
        {
            exclamation = LocalisedString("Good!");
        }
        else
        {
            exclamation = LocalisedString("Excellent!");
        }

        return exclamation;
    }
}
视图中绑定中使用的公共字符串MyText// { 得到 { 字符串感叹号;
如果(MyValue 3.3&&OverallScore,也许您应该返回枚举而不是字符串,并在视图中处理本地化问题。

注意:这个答案是关于vNext的-应该很容易移植回主控……这方面的差异并没有那么大


MvvmCross内置了文本本地化机制

唯一使用它的公共示例是会议示例


此示例包括共享和ViewModel特定的Json文件-

这些Json文件都包含简单的键值对,如:

{
"Title":"SQLBits X",
"Welcome":"Welcome",
"Sessions":"Sessions",
"Sponsors":"Sponsors",
"Tweets":"Tweets",
"Favorites":"Favorites"
}
它们作为内容或资产链接到Droid、Touch和WP……所有这些都由平台使用ResourceLoader插件访问


要在运行时使用这些JSON文件,核心项目将它们加载到:

这些属性在数据绑定中使用:

  • 指定是使用SharedTextSource还是使用TextSource的路径
  • MvxLanguageBinderConverter作为转换器
  • 文本键作为转换器参数
例如,在Droid中,这是:

<TextView
  style="@style/AboutPageBodyText"
  local:MvxBind="{'Text':{'Path':'TextSource','Converter':'Language','ConverterParameter':'Title'}}"
  />
这方面的代码实际上是:

 var valueToFormat = 42;
 var whichFormat = "TimeAgo.DaysAgo";

 var textProvider = this.GetService<IMvxTextProvider>();
 var format = textProvider.GetText(Constants.GeneralNamespace, Constants.Shared, whichFormat);

 return string.Format(format, valueToFormat)
var-valueToFormat=42;
var whichFormat=“TimeAgo.DaysAgo”;
var textProvider=this.GetService();
var format=textProvider.GetText(Constants.generalmespace,Constants.Shared,whichFormat);
返回字符串.Format(Format,valueToFormat)

语言绑定器和ValueConverter实际上是非常简单的代码

因此,如果您需要,可以随意为您的应用程序构建更复杂的东西



其他跨平台文本本地化技术也可以使用——我本人特别希望有一天能尝试一下白话——

,因为它是一款跨平台应用程序(iPhone、Android和Win)我们试图避免在视图中做太多的事情,以至于不得不同意不同意。在我看来,本地化严格来说是一个视图问题,因为每个平台处理它的方式不同,并且对每个平台都有不同的指导。在ViewModel级别处理它会将您的视图与ViewModel绑定,这是MVVM试图避免的问题。我假设绑定从视图到虚拟机属性,不管怎么说,都会把你联系在一起……只需添加另一个链接主题——非常感谢——我会在接下来的几天里尝试整理它——我会带着我的结果回来。太好了——我现在一切都很好,正如你所说,在endFab中非常简单——如果你认为有什么遗漏或误导的地方,请感受一下免费写博客,或者在维基上发表评论,或者:)斯图尔特,你有没有试过白话?
<TextView
  style="@style/AboutPageBodyText"
  local:MvxBind="{'Text':{'Path':'TextSource','Converter':'Language','ConverterParameter':'Title'}}"
  />
<TextView
  style="@style/AboutPageBodyText"
  local:MvxBind="Text TextSource, Converter=Language, ConverterParameter='Title'"
  />
{
"TimeAgo.JustNow":"just now",
"TimeAgo.SecondsAgo":"{0}s ago",
"TimeAgo.MinutesAgo":"{0}m ago",
"TimeAgo.HoursAgo":"{0}h ago",
"TimeAgo.DaysAgo":"{0}d ago",
"TimeAgo.Never":"never"
}
 var valueToFormat = 42;
 var whichFormat = "TimeAgo.DaysAgo";

 var textProvider = this.GetService<IMvxTextProvider>();
 var format = textProvider.GetText(Constants.GeneralNamespace, Constants.Shared, whichFormat);

 return string.Format(format, valueToFormat)