2016-12-08 123 views
1

我想在我的Xamarin应用程序中开发多语言支持。 我使用了2个Resx文件,这些文件在英语和瑞典语中具有键值,并为共同的appconfig类中的所选语言创建了一个全局变量。Xamarin.Forms应用程序支持多语言

我根据从appconfig选择的语言创建的类TranslateExtension这对于文本转换继承Imarkupextension

[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

的问题是,你永远不会加载英语翻译:

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

对于这两种ResourceManager - 构造函数设置了AppResources_sd资源。将此代码的第一行更改为使用英文资源文件(类似AppResources_en,我认为)。

而减少一些开销,如下图所示我会加载:

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

否则你加载瑞典资源每次,altough用户选择的是英语。

+0

oh.thats不是问题。我只是改变了测试..我忘了撤消它。其他我已经设置了英语默认和选定的索引m chnging它sweden.still它不工作 –

+0

问题是,代码只会在页面加载时执行一次,之后在下拉选择调试器将不会去那里。因此它不会改变。这显而易见..但它的解决方案明白了吗? –