Обновить пользовательский интерфейс после нового языка Xamarin - PullRequest
0 голосов
/ 14 мая 2019

Пересмотреть все значения на странице xaml, рассчитанные с помощью расширения-разметки

Я пытаюсь реализовать это решение, но у меня есть коллекция ObservableCollection, которая содержит заголовок для привязки в моем просмотре списка на моей странице MasterDetails, и он не работает. Я действительно понятия не имею, как реализовать это, но только для одного лейбла я сделал это успешно. Если кто-то может мне помочь. Спасибо

Мой список товаров:

public ObservableCollection<MainMenuViewItem> MenuItems {
            get {
                return new ObservableCollection<MainMenuViewItem>(new[]
                {
                    new MainMenuViewItem { Id = 0, Title = Translator.TranslatorInstance["lblHome"], TargetType=typeof(HybridWebView),ViewModelType=HybridViewTypeEnum.Home },
                    new MainMenuViewItem { Id = 1, Title = Translator.TranslatorInstance["lblListOfDeliverySlip"], TargetType=typeof(HybridWebView),ViewModelType=HybridViewTypeEnum.ListDeliverySlip },
                    new MainMenuViewItem { Id = 2, Title = Translator.TranslatorInstance["lblSettings"], TargetType=typeof(ParametersView)}
                });
            }
        }

Мой взгляд

<ListView Grid.Row="1" x:Name="MenuListPage" SeparatorVisibility="None" 
              HasUnevenRows="true" ItemsSource="{Binding MenuItems}" >
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout Padding="15,10" HorizontalOptions="FillAndExpand">
                                <Label VerticalOptions="FillAndExpand" 
                                VerticalTextAlignment="Center" 
                                Text="{Binding Title, StringFormat='{0}',Source={x:Static translate:Translator.TranslatorInstance}}" 
                                FontSize="24"/>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

Класс перевода и расширения

/// <summary>
        /// Current culture info
        /// </summary>
        public static CultureInfo CultureInfoApp { get; private set; }

        // Path of folder where is store each file language + Name of file without .en ( language code ) 
        private const string ResourceId = "Landauer.Mobile.Ressources.Language.LanguageRessource"; 

        // Instanciation differed of Ressourcemanager
        public static readonly Lazy<ResourceManager> RessourceManagerLanguage = new Lazy<ResourceManager>(() => new ResourceManager(ResourceId, IntrospectionExtensions.GetTypeInfo(typeof(TranslateExtension)).Assembly));

        /// <summary>
        /// Match to the name of the label into .resx file
        /// </summary>
        public string Text { get; set; }

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="text"></param>
        public TranslateExtension()
        {
            if (Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Android)
            {
                // Get dependency in each specific platform
                CultureInfoApp = DependencyService.Get<ILanguage>().GetCurrentCultureInfo();
            }
            //Text = text;
        }

        object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
        {
            return ProvideValue(serviceProvider);
        }

        public BindingBase ProvideValue(IServiceProvider serviceProvider)
        {
            var binding = new Binding
            {
                Mode = BindingMode.OneWay,
                Path = $"[{Text}]",
                Source = Translator.TranslatorInstance,
            };
            return binding;
        }

И наконец мой класс переводчика:

public static Translator TranslatorInstance => _uniqueInstance;

        /// <summary>
        /// When TranslateExtension you create new Binding(), call this "Callback"
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public string this[string text]
        {
            get
            {
                return TranslateExtension.RessourceManagerLanguage.Value.GetString(text, TranslateExtension.CultureInfoApp);
            }
        }

        /// <summary>
        /// Implementation of notifications
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// At each time you set language use this method to refresh UI
        /// </summary>
        public void Invalidate()
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
        }

1 Ответ

0 голосов
/ 15 мая 2019

Вам нужно установить культуру ресурса при смене языка.

Ваш класс экземпляра языка должен также вызывать обработчик изменения свойства при установке языка.

, поэтому создайтеметод в классе экземпляра, как показано ниже, и вызов при изменении языковых настроек ..

public void SetCultureInfo(CultureInfo cultureInfo)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
    }

Во время смены языка код должен быть таким, как показано ниже

var ci = CultureInfo.CreateSpecificCulture("ar");
                NativeLangUtil.SetLocale(ci); // updating Native 
                Resx.Lang.Strings.Culture = ci; //For .net Resources to work
                Application.Current.Properties["Lang"] = ci.TwoLetterISOLanguageName;// 
                LangResourceLoader.Instance.SetCultureInfo(ci); //for our use

Вы можетенайти пример реализации здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...