четверг, октября 16, 2014

Игрушечка-7 или Локализация-2

Предыдущая “Локализация” была про нехватку стандартных средств XAML для локализации. Нынешняя – про то, что не всегда можно делать так, как кажется логичным.
У элементов интерфейса есть два атрибута – x:Name="MyControl" и x:Uid="MyControl". Первый используется в коде как имя переменной, обозначающей этот элемент, второй – в ресурсах со строками для локализации как префикс имени нужной строки (напр., MyControl.Text и т.д.). Нигде значения этих атрибутов не пересекаются и, по логике, вполне могут иметь одинаковые значения – удобно же, особенно, когда контролов много, оперировать с одинаковыми именами.
Но у изобретателей XAML-парсеров своя логика… До некоторого уровня сложности (количества нагромождений элементов разметки, методов и свойств объектов в программе) она совпадает с моей – всё компилировалось, загружалось на телефон и десктоп, запускалось, локализовалось и работало. С какого-то момента, запустив программку на эмуляторе телефона, получил сообщение о необработанном исключении при парсинге XAML в методе InitializeComponent(). При этом, естественно (метод-то не мой, хоть и можно Студией залезть) внутри него толком ничего узнать не получается. Сообщается, что ошибка в такой-то позиции такой-то строки. И поди догадайся, что строку надо искать в файле, который генерит препроцессор XAML… Вот тут-то, при разглядывании этого файла, и рождаются подозрения, что атрибутам x:Name и x:Uid нужно обязательно задавать разные значения… И действительно, после изменения одного из них XAML начал успешно парситься.
Где это говорилось про одну ОС на всех устройствах? Пускай бы парcер XAML одинаковый был, это, вроде, попроще…

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