我正在尝试在我的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
值,并且在第一次之后不会更改。
答案 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
否则,每次加载瑞典语资源,尽管用户选择了英语。