如何根据 Xamarin.Forms xaml 中的本地化语言显示 Picker 项目

How to show Picker items according to localization language in Xamarin.Forms xaml

使用 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>

我不想使用硬编码文本 "Baboon"、"Capuchin Monkey" 等。我想使用本地化字符串作为扩展标记 (x:Static)。

Use of static markup

Default language resource

Spanish language resource

我怎样才能做到这一点?

您可以将 .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>

创建 猴子 class :

public class Monkey
{
    public string Name { set; get; }
}

创建MonkeyModel class:

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;

西班牙语设置效果:

默认语言设置:

解决方法是在实例化视图时将项目直接添加到选取器。

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

@Junior Jiang - 如果您想将它与视图模型绑定一起使用,MSFT 的回答几乎涵盖了它。

不过,您仍然可以直接使用它进入 XAML 和 Localize Text in Xamarin.Forms

基本上,您将再次拥有 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>