Xamarin.Forms应用程序中的多语言支持

时间:2016-12-08 07:57:22

标签: xamarin multilingual

我正在尝试在我的Xamarin应用程序中开发多语言支持。 我在英语和瑞典使用了2个具有键值的Resx文件,并为普通appconfig类中的所选语言创建了一个全局变量。

我创建了一个类TranslateExtension,根据Imarkupextension中选定的语言继承appconfig进行文本转换。

[ContentProperty("Text")]
public class TranslateExtension : IMarkupExtension
  {
    public string Text { get; set; }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        if (Text == null)
            return null;


        ResourceManager rt1 = new ResourceManager(typeof(Resources.AppResources));
        if (AppConfig.SelectedLanguage == "Swedish")
        {
            rt1 = new ResourceManager(typeof(Resources.AppResources_sd));
        }

        var translation = rt1.GetString(Text);
        return translation;


    }
}

现在我在XAML页面

中绑定它的文本值
 <StackLayout>
<Picker x:Name="pickerForLanguage"   BackgroundColor="White" HeightRequest="40" Title="Select Language"  SelectedIndexChanged="SellectedLanguage">
  <Picker.Items>
    <x:String>English</x:String>
    <x:String>Swedish</x:String>
  </Picker.Items>
</Picker>
<Label Text="{resources:TranslateExtension Greeting}"  />

Home.xaml.cs

 public void SellectedLanguage(object sender, EventArgs e)
    {
        if (pickerForLanguage.SelectedIndex == -1)
        {
            AppConfig.SelectedLanguage = "English";
        }
        else
        {
            AppConfig.SelectedLanguage = "Swedish";
        }

    }

第一次加载页面时,文本会从appconfig转换为所选语言。当我从下拉列表中更改语言时,它将仅在appconfig中更改所选语言的值。它不会调用TranslateExtension值,并且在第一次之后不会更改。

1 个答案:

答案 0 :(得分:0)

问题是,你从不加载英文翻译:

// first import all necessary types from package `collection.mutable`
import collection.mutable.{ HashMap, MultiMap, Set }

// to create a `MultiMap` the easiest way is to mixin it into a normal
// `Map` instance
val mm = new HashMap[Int, Set[String]] with MultiMap[Int, String]

// to add key-value pairs to a multimap it is important to use
// the method `addBinding` because standard methods like `+` will
// overwrite the complete key-value pair instead of adding the
// value to the existing key
mm.addBinding(1, "a")
mm.addBinding(2, "b")
mm.addBinding(1, "c")

对于ResourceManager rt1 = new ResourceManager(typeof(Resources.AppResources_sd)); if (AppConfig.SelectedLanguage == "Swedish") { rt1 = new ResourceManager(typeof(Resources.AppResources_sd)); } - 构造函数,您可以设置ResourceManager资源。更改此代码的第一行以使用英语资源文件(我认为类似AppResources_sd)。

为了减少一些开销,我会加载它,如下所示:

AppResources_en

否则,每次加载瑞典语资源,尽管用户选择了英语。