Язык текста терминов и программного кода
Технический урок сочетает русское объяснение, английские фразы, названия методов и точный программный код. При чтении голосом эти части могут требовать разного произношения. Но нельзя решить вопрос механическим назначением английского языка каждому латинскому символу: язык человеческого текста и язык программирования выполняют разные роли.
В этом уроке вы уточните языковую разметку a11y-lab после двенадцатой главы. Пример с Alex, Elena и методом Descendants сохраняется. Мы не переписываем идентификаторы ради произношения и не объявляем одинаковое поведение всех скринридеров.
Основной язык документа
У lesson.html уже стоит <html lang="ru">. Это основной язык объяснения. Он помогает программам выбрать языковые правила, но сам не устанавливает наличие подходящего голосового ресурса и не гарантирует определённое произношение каждого имени. Language of Page.
Не заменяйте ru на en только потому, что в коде встречается много латиницы. Основной текст остаётся русским, а назначение страницы определяется им. Ошибочный язык всей статьи способен повлиять на обычные предложения сильнее, чем отсутствие отдельной пометки одного термина.
Атрибут lang использует языковые теги, а не названия библиотек. Его устройство и наследование описаны в MDN. Значение csharp не обозначает человеческий язык C#, а cs означает чешский, поэтому нельзя применять его как краткое имя языка программирования.
Для подсветки кода Markdown использует своё обозначение, например cs или csharp у листинга согласно поддерживаемому инструменту. Это другой механизм. Он помогает классифицировать синтаксис, но не становится автоматически правильным lang для голосового чтения.
Настоящая английская фраза
Предположим, рядом с объяснением нужна самостоятельная английская формулировка. Добавьте в раздел descendants следующий учебный абзац:
<p>Английская формулировка для сравнения:
<span lang="en">Look for Employee nodes below the current element.</span>
По-русски: ищите узлы Employee ниже текущего элемента.
</p>
Английская часть является обычным человеческим предложением, а не копией документации. Её язык явно указан; русский перевод возвращается к основному языку окружающего текста. Такая граница понятнее, чем переключение языка на каждой букве слова Employee.
Критерий Language of Parts уровня AA касается программно определяемого языка отдельных фраз и отрывков, с исключениями для собственных имён, технических терминов, неопределённого языка и слов, вошедших в окружающую речь. W3C. Поэтому он не требует бессмысленного переключения каждого идентификатора.
Если английский абзац содержит несколько связанных предложений, язык можно задать целому p. Если внутри снова появляется русский комментарий, ему нужен собственный понятный контекст. Разметка должна следовать настоящим границам человеческой речи, а не случайным группам латинских символов.
Термин не равен иностранному абзацу
В русском предложении «Метод Descendants выбирает потомков» имя метода является техническим термином. Оно может остаться без отдельного переключения. При первом использовании полезнее объяснить его назначение, чем пытаться управлять каждым звуком. Читатель получает смысл и точное написание.
То же относится к именам Alex и Elena в данных примера. Они являются значениями учебного документа и могут произноситься по-разному. Не меняйте их на другие слова только ради ожидаемого голоса, потому что условие отбора и результат должны сохраняться. При необходимости текст поясняет значение словами, не изменяя исходные данные.
Аббревиатура LINQ тоже не получает обязательную языковую пометку только из-за заглавных латинских букв. Можно назвать её полное значение или устойчивое обозначение в пояснении, если это помогает начинающему. Но скрытая длинная замена через ARIA не должна неожиданно расходиться с видимым именем и способом поиска.
Сравните технический термин и действительно иностранную цитату. Термин участвует в русском объяснении, а цитата является самостоятельной фразой. У неё может быть точное происхождение, которое нужно обозначить отдельно. lang не подтверждает источник, правильность перевода или актуальность технического утверждения.
Точный код остаётся точным
В нашем листинге есть xDoc.Descendants("Employee"). Не заменяйте запись на «иксДок точка Десцендантс» внутри code ради удобной озвучки. Читатель должен видеть, копировать и сопоставлять настоящий синтаксис. Разделители, кавычки и регистр могут быть существенными.
Вместо этого добавьте обычное пояснение после листинга. Оно может назвать исходный объект и операцию: «У объекта xDoc выбираются элементы-потомки с именем Employee». Так механизм становится понятнее без изменения копируемого примера. Голосовое произношение точной строки и содержательная интерпретация являются разными способами чтения.
Не назначайте всему pre длинный aria-label с пересказом программы. Такая подпись может изменить доступное представление и не заменит возможность изучать строки по частям. Основной курс уже дал краткое имя прокручиваемой области; оно обозначает объект, а не подменяет его содержимое.
Для сложного кода полезен последовательный разбор небольших фрагментов. Сначала вводятся исходные данные, затем операция, затем условие и ожидаемый результат. Это преподавательский приём ProfessorWeb, который помогает и визуальному, и голосовому чтению. Он не требует скрытого полного дубля каждой программы.
Тот же подход полезен для сообщений об ошибке. Если программа показывает английскую фразу, приведите её точно и пометьте язык человеческого предложения, затем объясните причину по-русски. Не переводите сообщение внутри копируемого листинга так, будто именно его выдаёт инструмент. Здесь читатель сопоставляет текст с собственной средой, и точное написание помогает найти нужный случай. Доступное объяснение дополняет исходную запись, сохраняя различие между сообщением программы и авторским разбором.
Проверка границ произношения
Будущий маршрут включает название документа, обычный русский абзац, английскую фразу и переход к коду. Запишите выбранный браузер, вспомогательное средство, голос и настройки пунктуации. Они способны влиять на озвучивание технических записей, поэтому без условий наблюдение трудно повторить.
Если английская фраза не сменила произношение, сначала проверьте границу lang и доступные ресурсы языка. Не добавляйте случайные языковые теги ко всей странице. Если слово метода произнесено непривычно, это ещё не означает нарушение языкового критерия: технические термины имеют предусмотренные исключения.
Если же целый русский абзац объявляется по правилам английской речи, это уже другой случай. Найдите, не оказался ли он внутри элемента с наследуемым lang="en". Закрытие нужного контейнера и точная граница помогают исправить причину, не меняя собственно учебный текст.
Для самостоятельного варианта добавьте английский абзац из двух предложений и русский разбор следом. Затем оставьте точный C#-листинг без языковой подмены. Ожидайте понятной структуры и сохранения всех идентификаторов; конкретное произношение станет отдельным наблюдением.
Результат урока — осмысленная языковая разметка, которая различает речь и программу. В последней главе свяжем эту работу с редакционным процессом: как новые материалы сохраняют доступность, а общие шаблоны не теряют её при расширении библиотеки.