如何根据 Xamarin.Forms xaml 中的本地化语言显示选取器项目
Posted
技术标签:
【中文标题】如何根据 Xamarin.Forms xaml 中的本地化语言显示选取器项目【英文标题】:How to show Picker items according to localization language in Xamarin.Forms xaml 【发布时间】:2020-05-06 00:08:57 【问题描述】:使用 xaml 创建选取器的标准方法如下。
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/picker/populating-itemssource
<Picker x:Name="picker"
Title="Select a monkey"
TitleColor="Red">
<Picker.ItemsSource>
<x:Array Type="x:Type x:String">
<x:String>Baboon</x:String>
<x:String>Capuchin Monkey</x:String>
<x:String>Blue Monkey</x:String>
<x:String>Squirrel Monkey</x:String>
<x:String>Golden Lion Tamarin</x:String>
<x:String>Howler Monkey</x:String>
<x:String>Japanese Macaque</x:String>
</x:Array>
</Picker.ItemsSource>
</Picker>
我不想使用硬编码文本作为“狒狒”、“卷尾猴”等。我想使用本地化字符串作为扩展标记 (x:Static)。
Use of static markup
Default language resource
Spanish language resource
我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:您可以将 .resx
绑定到 ViewModel ,然后为 Picker
绑定 ViewModel 来实现。
创建两个.resx
文件,一个是英文的。
<data name="Baboon" xml:space="preserve">
<value>Baboon</value>
</data>
<data name="Blue" xml:space="preserve">
<value>Blue Monkey</value>
</data>
<data name="Capuchin" xml:space="preserve">
<value>Capuchin Monkey</value>
</data>
<data name="Golden" xml:space="preserve">
<value>Golden Lion Tamarin</value>
</data>
<data name="Howler" xml:space="preserve">
<value>Howler Monkey</value>
</data>
<data name="Japanese" xml:space="preserve">
<value>Japanese Monkey</value>
</data>
<data name="Squirrel" xml:space="preserve">
<value>Squirrel Monkey</value>
</data>
另一个是西班牙语
<data name="Baboon" xml:space="preserve">
<value>Babuino</value>
</data>
<data name="Blue" xml:space="preserve">
<value>Mono azul</value>
</data>
<data name="Capuchin" xml:space="preserve">
<value>Mono capuchino</value>
</data>
<data name="Golden" xml:space="preserve">
<value>Tamarin León Dorado</value>
</data>
<data name="Howler" xml:space="preserve">
<value>Mono aullador</value>
</data>
<data name="Japanese" xml:space="preserve">
<value>Mono japonés</value>
</data>
<data name="Squirrel" xml:space="preserve">
<value>Mono ardilla</value>
</data>
创建 Monkey 类:
public class Monkey
public string Name set; get;
创建MonkeyModel类:
public class MonkeyModel
public List<Monkey> Monkeys set; get;
public MonkeyModel()
Monkeys = new List<Monkey>();
Monkeys.Add(new Monkey() Name = AppResources.Blue );
Monkeys.Add(new Monkey() Name = AppResources.Capuchin );
Monkeys.Add(new Monkey() Name = AppResources.Baboon );
Monkeys.Add(new Monkey() Name = AppResources.Squirrel );
Monkeys.Add(new Monkey() Name = AppResources.Golden );
Monkeys.Add(new Monkey() Name = AppResources.Howler );
Monkeys.Add(new Monkey() Name = AppResources.Japanese );
现在在 Xaml 选择器绑定数据:
<Picker x:Name="picker"
Title="Select a monkey"
ItemDisplayBinding="Binding Name"
TitleColor="Red" />
在内容页面中绑定上下文:
MonkeyModel monkeyModel = new MonkeyModel();
picker.ItemsSource = monkeyModel.Monkeys;
西班牙语设置效果:
默认语言设置:
【讨论】:
非常感谢您的帮助,很有道理。在阅读您的答案之前,我已经以一种简单的方式实现了这一点。只是我在实例化视图时直接将项目(添加默认资源字符串)添加到选择器中。 @humbertropolis Okey,如果回答对您有帮助,请记得投票 :-)【参考方案2】:@Junior Jiang - 如果您想将它与视图模型绑定一起使用,MSFT 的答案几乎涵盖了它。
但是,您仍然可以通过 Localize Text in Xamarin.Forms 将其直接用于 XAML。
基本上,您将再次拥有 2 个或更多带有翻译的资源文件,您可以直接在 XAML 中调用已翻译的字符串,如下所示:
<ContentPage ...
xmlns:resources="clr-namespace:LocalizationDemo.Resx">
<Label Text="x:Static resources:AppResources.NotesLabel" />
<Entry Placeholder="x:Static resources:AppResources.NotesPlaceholder" />
<Button Text="x:Static resources:AppResources.AddButton" />
</ContentPage>
【讨论】:
【参考方案3】:一种解决方法是在实例化视图时将项目直接添加到选择器。
1-) 普通本地化资源,
default language "en-US"
English resources
Spanish resources
2-) Declare a basic picker
3-) Populate the picker in the corresponding view controller
结果:
English
Spanish
【讨论】:
以上是关于如何根据 Xamarin.Forms xaml 中的本地化语言显示选取器项目的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin Forms - TabbedPage 平台特定的 xaml 代码到代码隐藏
如何使用 xamarin.forms-shell 在 XAML 中动态绑定类型为 <ShellContent> 的 Tab.Items 列表