среда, 2 сентября 2015 г.

Локализация Windows 10 Universal Apps

В данный момент работаю над приложением, которое должно стать универсальным приложением Windows 10. В целом все приятно, НО. Локализация теперь делается по-другому. Нужно создать ResourceLoader и из него брать по строке нужные ресурсы. Но это не очень удобно, потому что по умолчанию вам предлагается создавать элементы в XAML, и используя x:uid их локализовывать. В файле ресурса при этом надо использовать что-то вроде TextView1.Content ну и справа значение. По мне так это не очень удобно, потому что слегка лишает ресурсы семантичности (смысла) + есть уже наработанные ресурсы (при портировании), которые организованы по-другому.

Но из этой ситуации есть простой выход: создаем конвертер.

То есть, в нашей вьюмодели создаем некое проперти, например LS (Localized String), тип которого это класс следующего вида:

public class LocalizationHelper : INotifyPropertyChanged {
        private string _localizedString;
        public string LocalizedString {
            get { return _localizedString; }
            set {
                if ( value != _localizedString ) {
                    _localizedString = value;
                    NotifyPropertyChanged( "LocalizedString" );
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged( String propertyName ) {
            PropertyChangedEventHandler handler = PropertyChanged;
            if ( null != handler ) {
                handler( this, new PropertyChangedEventArgs( propertyName ) );
            }
        }
    } 

Далее создаем конвертер:

 public sealed class StringToLocalizedStringConverter : IValueConverter {
        public object Convert( object value, Type targetType, object parameter, string language ) {
            if ( parameter == null ) {
                return "";
            }
            else {
                return App.RsLoader.GetString( ( string ) parameter ); // У меня в APP лежит ResourceLoader
            }
        }

        public object ConvertBack( object value, Type targetType, object parameter, string language ) {
            throw new NotImplementedException();
        }
    } 

Ну и в конце концов в XAML вставляем следующее:  Text="{Binding LS.LocalizedString, Converter={StaticResource StringToLocalizedStringConverter}, ConverterParameter='СТРОКА_В_РЕСУРСЕ'}" Обратите внимание на то, что в конце применяются одинарные кавычки - с двойными будет ошибка.

В дезайн моде ничего не видно, это один из недостатков данного способа.

P.S. В блоггере неудобно код писать, надо видимо переходить на новую блог платформу. Я часто пробовал Ghost... да и на английском учится писать надо. 

Комментариев нет:

Отправить комментарий