如何根据 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 XAML

Xamarin Forms - TabbedPage 平台特定的 xaml 代码到代码隐藏

如何使用 xamarin.forms-shell 在 XAML 中动态绑定类型为 <ShellContent> 的 Tab.Items 列表

XAML中的Xamarin.Forms ListView AutoHeight

Xamarin.Forms 在 XAML 中使用局部变量

如何用xamarin.forms xaml