2016-12-08 2 views
1

Я пытаюсь разработать поддержку нескольких языков в своем приложении Xamarin. Я использовал 2 файла Resx, имеющих ключевое значение на английском и шведском языках, и создал одну глобальную переменную для выбранного языка общего класса appconfig.Многоязыковая поддержка в приложении Xamarin.Forms

Я создал класс 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

Проблема заключается в том, что вы никогда не загрузите английский перевод:

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, привязывая его к sweden.если его не работает –

+0

проблема в том, что код будет выполняться только после того, как будет загружена страница whn. После этого на выпадающем меню отладчик не пойдет туда. Так что это не change.thts очевидным .. но whts solution.of it.i cnt выяснить –

Смежные вопросы