Co oznacza to kryterium
Podaj domyślny język każdej strony, dokumentu lub programu w sposób, który oprogramowanie może odczytać. Polski tekst powinien mieć oznaczenie odpowiadające polszczyźnie. Po zmianie języka całego ekranu oznaczenie musi odpowiadać nowej treści. Przycisk „Polski”, kodowanie UTF-8 i polskie litery nie zastępują metadanych języka.
| ID / potrzeba | Bariera i korzyść |
|---|---|
blindness / Niewidzenie |
Czytnik może wybrać reguły wymowy odpowiadające językowi, zamiast pozostawiać rozpoznanie treści samemu użytkownikowi. Informacja językowa wspiera także przetwarzanie brajlowskie. |
low-vision / Słabowidzenie |
Osoba łącząca wzrok z odczytem głosowym otrzymuje podstawę do poprawnego odczytu tekstu. Samo powiększenie go nie rozwiązuje problemu wymowy. |
cognitive / Pamięć i koncentracja |
Osoby korzystające z TTS przy trudnościach czytania lub uczenia się mogą łatwiej rozumieć wypowiedź w odpowiednim języku. Nie zakładamy tych potrzeb u wszystkich osób tej kategorii. |
Nie przypisujemy automatycznie motoryki, rozróżniania barw ani słuchu do tego tekstowego scenariusza. Ustawienie języka daje odbiornikowi informację; nie gwarantuje dostępności konkretnego głosu ani identycznej jakości każdego syntezatora.
Przykłady błędów i poprawek
Pracownia pokazuje odbiór syntetycznego zamówienia P-104: ul. Ogrodowa 8, piątek 10:00–18:00. Oba warianty mają te same teksty, układ i działania; różnica dotyczy języka semantyki całego ekranu. Przyciski „Polski” i „English” mają własne języki etykiet w każdym wariancie. Jawny wybór języka niezależnie od systemu pokazuje tę jedną funkcję, a nie pełne zarządzanie lokalizacją produktu.
Problem: bad przekazuje en przy polskiej treści i pl po przejściu na angielski. Oba tagi są poprawne składniowo, ale nie odpowiadają treści. Odbiornik otrzymuje błędną podstawę odczytu. Poprawka: aktualizuj Semantics.localeForSubtree razem z tekstami całego ekranu, także przy powrocie i resecie.
| Trasa / wariant | Język polskiego ekranu → po English | Oczekiwana ocena warunku |
|---|---|---|
/3-1-1/pickup/good |
pl → en |
Informacja językowa zgodna z treścią |
/3-1-1/pickup/bad |
en → pl |
Poprawne tagi, ale odwrotny język; celowa bariera |
/3-1-1/pickup/control |
pl-PL → en-GB |
Bardziej szczegółowe poprawne tagi odpowiadają tym tekstom |
Nieznany wariant wraca do good. Przycisk „Zmień wariant” przechodzi good → bad → control i przywraca PL; reset wraca do wariantu trasy oraz PL. Demonstracja nie zapisuje preferencji ani nie zmienia zamówienia.

Good PL, iPhone 17 Simulator / iOS 26.5, 2026-10-03. Nagłówek, informacja i instrukcja mają w odczycie UIKit język pl. Kadr pokazuje treść ekranu; nie potwierdza jej wymowy.

Bad PL z tej samej próby ujawnia w UIKit en przy polskim tekście. Różnicę języka potwierdzają metadane, a nie wygląd kontrolki. Jawny wybór PL pozostawia celowy błąd wariantu.

Po systemowo syntetyzowanym tap XCTest UIKit odczytał en; Polski i reset przywróciły pl. Nie wykonano VoiceOver i nie przygotowano audio.
Historyczny przykład WWW
We wcześniejszej próbie z 2026-10-03 te same dane pokazano w HTML. Good miał html lang="pl", po English — en. Bad nie miał języka korzenia; języki dwóch przycisków nie obejmowały całej strony. Poprawka dodaje właściwy lang na html i aktualizuje go razem z treścią i tytułem. Wygląd good/bad w PL był identyczny bajtowo, co odpowiada niewidocznej zmianie metadanych.
| Wariant | Początkowy język korzenia → po English | Oczekiwany wynik badania 3.1.1 |
|---|---|---|
good |
pl → en |
PASS warunku demonstracji: język dostępny i zgodny z treścią |
bad |
brak → brak | FAIL warunku demonstracji: brak domyślnej informacji autora; języki dwóch przycisków nie obejmują całej strony |
wrong |
en → pl |
FAIL: tag jest poprawny, ale wskazuje odwrotny język |
empty |
pusta wartość → pusta wartość | FAIL: język nieznany |
invalid |
pl_PL → pl_PL |
FAIL: niepoprawny zapis; nie wnioskować o zgodności z samej obecności atrybutu |
control |
pl-PL → en-GB |
PASS warunku: poprawne bardziej szczegółowe tagi odpowiadają tym tekstom |
parts |
pl → en |
PASS domyślnego języka; w PL widoczny krótki angielski slogan bez własnego lang, osobny problem 3.1.2 |

WWW/macOS, 2026-10-03, good po kliknięciu English. DOM odczytał en przy stałym URL i navigationStart; AX w tym eksporcie nie ujawniał języka. To wcześniejszy materiał desktopowy, nie test native iOS.
Kiedy obowiązuje i gdzie są wyjątki
- Wymaganie normatywne: programowo dostępny domyślny język ludzki każdej strony. Nie jest to język programowania, kodowanie znaków ani kraj hostingu. W samym 3.1.1 nie ma listy wyjątków dla nazw własnych, terminów technicznych lub „niezbędności”.
- Wskazówka Understanding: na stronie wielojęzycznej przyjmujemy język używany najwięcej; przy równym udziale — pierwszy użyty. To wskazówka do oceny, nie mechaniczny próg procentowy. Krótkie nazwy, numery i pojedynczy slogan nie muszą zmieniać języka domyślnego.
- Technika H57: poprawny tag języka zgodny z BCP 47 na
html, zgodny z językiem treści.plipl-PLmogą oznaczać tę samą polską stronę; region nie jest zawsze obowiązkowy.pl_PLnie jest poprawnym zapisem HTML/BCP 47.enjest poprawnym tagiem, lecz błędnym oznaczeniem dominującej polskiej treści. - Atrybut pusty oznacza nieznany język; samo istnienie
langnie zalicza kryterium. Nazwa języka wpisana zwykłym tekstem, kodowanie UTF-8,dir, nazwa pliku i przycisk wyboru języka nie zastępują programowej informacji.undnie identyfikuje ustalonego polskiego języka tej demonstracji. langdziedziczy się przez potomków, o ile go nie nadpisano.body langnie obejmuje tekstu whead, np. tytułu. W zwykłymtext/htmlpodstawą jestlang; dla XML/XHTML trzeba uwzględnićxml:langi sposób serwowania. W razie obu atrybutów nie dopuszczaj konfliktu. Demonstracja używa wyłącznie HTML, bez XML.- HTTP
Content-Languagemoże opisywać odbiorców zasobu; SVR5 jest techniką doradczą. Nie traktuj samego nagłówka ani przestarzałegometa http-equiv="Content-Language"jako zamiennika H57. Fixture nie wysyła tego nagłówka, żeby nie opierać wyniku na fallbacku przeglądarki. - Granica 3.1.2, poziom AA: język obcego fragmentu bada się osobno. Polska strona z krótkim angielskim zdaniem i
html lang="pl"może spełniać badany warunek 3.1.1 mimo problemu z oznaczeniem tego zdania. Nie oznaczaj całej strony jako angielskiej, aby naprawić tylko fragment. To konieczny kontekst, bez osobnego researchu 3.1.2. - SPA może zmieniać całą treść bez zmiany URL. Oznaczenie musi odpowiadać aktualnemu dominującemu językowi; sprawdzaj też pierwszą odpowiedź, powrót i przeładowanie. W osadzonym dokumencie HTML sprawdź jego własny korzeń; język aplikacji gospodarza nie zastępuje oznaczenia dokumentu.
- PDF16 opisuje domyślny język przez
/Langw katalogu dokumentu. PDF19 dotyczy oznaczania zakresu tekstu i wymaga sprawdzenia pokrycia/dziedziczenia; nie należy utożsamiać języka jednego akapitu z językiem całego PDF. Nazwa pliku lub język okna czytnika PDF nie są metadanymi dokumentu. Nie wykonano próby PDF.
Platformy
Domyślna podstawa: WCAG 2.2. Poza WWW użyto informacyjnej Group Note WCAG2ICT z 2025-12-11; zastępuje stronę dokumentem lub oprogramowaniem. Oprogramowanie może korzystać z ustawienia języka platformy, jeżeli rzeczywiście prezentuje UI w tym języku, albo ujawniać język inną metodą wspieraną przez technologie asystujące. Sam odczyt ustawienia bez zgodnej treści nie wystarcza.
| ID / środowisko | Podstawa / kryterium | Stan | Warunek, adaptacja i uzasadnienie | Weryfikacja |
|---|---|---|---|---|
web / WWW |
WCAG 2.2 / 3.1.1 | dotyczy | Każda strona; bez adaptacji. Obejmuje też przeglądarkę telefonu. Język służy odbiornikowi treści. | AI 2026-10-03; WWW desktop wykonane, web w telefonie NOT-RUN |
mobile / aplikacje mobilne |
WCAG 2.2 + WCAG2ICT 2025-12-11 / 3.1.1 | dotyczy | Domyślny język oprogramowania; ustawienie platformy i zgodny UI lub programowe ujawnienie języka. Hybryda: HTML i native oceniać osobno. | AI 2026-10-03; Flutter/iOS Simulator wykonane; VoiceOver, fizyczne urządzenie i Android NOT-RUN |
desktop / aplikacje desktopowe |
WCAG 2.2 + WCAG2ICT 2025-12-11 / 3.1.1 | dotyczy | Adaptacja do oprogramowania jak wyżej; przeglądarka uruchomiona na desktopie nie dowodzi działania natywnego programu. | AI 2026-10-03; native NOT-RUN |
document / dokumenty cyfrowe |
WCAG 2.2 + WCAG2ICT 2025-12-11 / 3.1.1 | dotyczy | Domyślny język dokumentu; metadane formatu zamiast atrybutu HTML, np. katalog PDF. | AI 2026-10-03; odbiornik dokumentu NOT-RUN |
other / oprogramowanie kiosku lub TV |
WCAG 2.2 + WCAG2ICT 2025-12-11 / 3.1.1 | dotyczy warunkowo | Określić web/native oraz dostęp do AT. Przy zamkniętej funkcjonalności własny odczyt we właściwym języku może realizować intencję; wymaga osobnej oceny. To zakres oprogramowania, nie sprzętu. | AI 2026-10-03; konkretne urządzenie NOT-RUN |
Oddzielne mapowanie EN 301 549
To kontekst edukacyjny, nie wybór podstawy prawnej audytu. Każdy wiersz zweryfikowany przez AI 2026-10-03; test odbiornika według EN oraz przegląd człowieka NOT-RUN. Nie przenosimy warunków między wersjami ani z EN do WCAG2ICT.
| Środowisko | Podstawa / klauzula | Stan i zakres |
|---|---|---|
web |
EN 301 549 V3.2.1 (2021-03), 9.3.1.1 | dotyczy; język strony według WCAG 2.1 |
document |
EN V3.2.1, 10.3.1.1, tabela 10.11 | dotyczy; język dokumentu dostępny programowo |
mobile, desktop, other — native otwarte |
EN V3.2.1, 11.3.1.1.1, tabela 11.10 | dotyczy warunkowo; UI wspiera AT do odczytu; język oprogramowania, ustawienie platformy z odpowiadającą treścią albo wspierane ujawnienie |
other — zamknięte, także zamknięte funkcje pozostałego native |
EN V3.2.1, 11.3.1.1.2 → 5.1.3.14 | dotyczy warunkowo; własne wyjście mowy jako dostęp niewizualny |
web |
EN V4.1.1 (2026-09), 9.3.1.1 | dotyczy; język strony według WCAG 2.2 |
document |
EN V4.1.1, 10.3.1.1, tabela 10.14 | dotyczy; język dokumentu poza WWW |
mobile, desktop, other — native otwarte |
EN V4.1.1, 11.3.1.1, tabela 11.14 | dotyczy warunkowo; funkcjonalność otwarta na programowy dostęp AT; język oprogramowania, adaptacja locale/UI |
other — zamknięte, także zamknięte funkcje pozostałego native |
EN V4.1.1, 5.1.3.14; rozdzielenie w 11.5.1 | dotyczy warunkowo; własna mowa przy dostępie niewizualnym; nie używać numeru 11.3.1.1.2 z V3.2.1 |
W obu sprawdzonych wersjach 5.1.3.14 wiąże język mowy z prezentowaną treścią, z odrębnymi wyjątkami dotyczącymi nazw/terminów, treści zewnętrznej w językach bez wsparcia syntezatora, języka niedostępnego do wyboru niewizualnie oraz jawnego wyboru przez użytkownika innego języka mowy. Te wyjątki nie są wyjątkami WCAG 3.1.1. Zamknięte urządzenie i doświadczenie jego mowy nie były badane. „Nie dotyczy badanego scenariusza” oznacza tutaj brak zamkniętej funkcjonalności w obu własnych demonstracjach, a nie brak zastosowania 3.1.1 na platformie. Żaden wiersz nie oznacza braku odpowiednika tego kryterium.
Klasyfikacja jest edukacyjna i nie ustala obowiązków prawnych.
Rozwiązania w technologiach
HTML / CSS
W dokumencie serwowanym jako text/html:
<!doctype html>
<html lang="pl">
<head>
<meta charset="utf-8" />
<title>Odbiór zamówienia</title>
</head>
<body>
<h1>Odbiór zamówienia</h1>
<p>Zamówienie P-104 jest gotowe.</p>
</body>
</html>Przy zmianie języka aktualizuj korzeń razem z treścią i tytułem, korzystając z tego samego wyboru języka. W demonstracji robi to render(language); serwer oznacza już pierwszą odpowiedź. Produkcyjna implementacja powinna zachować język także przy bezpośrednim wejściu i ponownym ładowaniu, zgodnie z własnym sposobem utrwalania preferencji. Demonstracja celowo resetuje na PL po reload; nie implementuje preferencji użytkownika.
Flutter / Dart
Przy lokalizacji konfiguruj supportedLocales, delegaty lokalizacji i rzeczywiste tłumaczenia. Domyślne wsparcie CupertinoApp to en-US; samo wpisanie polskich napisów nie zapewnia spójnej konfiguracji. TextStyle.locale służy do doboru regionalnych glifów i nie zastępuje informacji semantycznej. Dla polskiego poddrzewa w SDK obsługującym localeForSubtree, np. wewnątrz istniejącego CupertinoPageScaffold:
import 'package:flutter/cupertino.dart';
Widget collectionInfo() => Semantics(
localeForSubtree: const Locale('pl', 'PL'),
child: const Text('Zamówienie P-104 jest gotowe.'),
);Język semantyki musi odpowiadać także etykietom i podpowiedziom w tym poddrzewie. Po zmianie wersji/locale sprawdź platformowy odbiornik i rzeczywisty czytnik. Przegląd API oraz źródła SDK 3.44.9 wykonano 2026-10-03. Powyższy mechanizm jest użyty w działającej demonstracji Flutter, ze zmianą języka obejmującą cały ekran i osobnymi językami wyboru PL/EN. Analiza, build i uruchomienie Cupertino/iOS Simulator PASS; natywny accessibilityLanguage odczytano. Sam edukacyjny wrapper nie był osobno kompilowany; Android i VoiceOver NOT-RUN.
iOS / SwiftUI
Użyj zasobów lokalizacji/String Catalog, które odpowiadają wybranemu językowi aplikacji. Text z kluczem lokalizowanym pobiera tekst ze wspieranych lokalizacji; .environment(\.locale, ...) jest kontekstem lokalizacji, nie samodzielnym dowodem języka wypowiedzi VoiceOver.
import SwiftUI
struct CollectionInfo: View {
var body: some View {
Text("collection_ready")
}
}Warunek osadzenia: klucz collection_ready w String Catalog ma tłumaczenia, np. polskie „Zamówienie P-104 jest gotowe.”; język aplikacji i zasoby są spójne. Dla istniejącego elementu UIKit, który celowo ma język inny niż ustawienie użytkownika, oficjalne accessibilityLanguage określa język odczytu label/value/hint:
import UIKit
let info = UILabel()
info.text = "Zamówienie P-104 jest gotowe."
info.accessibilityLanguage = "pl-PL"Właściwość dotyczy tego elementu; pozostałe elementy również wymagają właściwej informacji języka. Nie zakładaj dziedziczenia przez dowolne kontenery bez odczytu odbiornika. Dokumentacja SwiftUI i nagłówek UIKit dostępnego SDK sprawdzone 2026-10-03; kompilacja i działanie NOT-RUN. Nie wykonano natywnego builda ani testu na symulatorze/fizycznym iPhonie.
Android / Jetpack Compose
Najprostsza ścieżka adaptacji WCAG2ICT: korzystaj z ustawień języka platformy/aplikacji i prezentuj cały UI w tym języku, w tym nazwy dostępności. Compose pobiera teksty z zasobów; w komponencie:
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
@Composable
fun CollectionInfo() {
Text(stringResource(R.string.collection_ready))
}Warunek osadzenia: własny namespace R, klucz collection_ready i zgodne zasoby values/strings.xml, values-pl/strings.xml; właściwa konfiguracja wspieranych języków, także przy preferencjach per-app. Samo contentDescription z tekstem nie określa języka. Własny wybór języka niezależny od platformy wymaga sprawdzenia wspieranego mechanizmu ujawniania, nie założenia, że czytnik rozpozna go automatycznie. Przegląd oficjalnej dokumentacji Compose i języków per-app 2026-10-03; kompilacja i działanie NOT-RUN. Androida nie uruchamiano.
React Native
Na iOS można jawnie opisać język elementu za pomocą accessibilityLanguage:
import { Text } from 'react-native';
export function CollectionInfo() {
return (
<Text accessibilityLanguage="pl-PL">Zamówienie P-104 jest gotowe.</Text>
);
}Dokumentacja określa ten prop jako iOS i wymaga BCP 47. Nie przenoś go na Androida jako dowodu; tam zadbaj o spójność platformowego języka i lokalizacji aplikacji, a niezależny wybór zweryfikuj w odbiorniku. Oznaczenie jednego elementu nie obejmuje automatycznie pozostałych ekranów. Przegląd dokumentacji 2026-10-03; typecheck/build i działanie NOT-RUN. Żadnego projektu React Native nie uruchamiano.
Osadzony HTML w każdej z tych technologii korzysta z rozwiązania webowego we własnym dokumencie. Lokalne testy przeglądarki nie potwierdzają WebView tych frameworków. Brak buildów fragmentów edukacyjnych jest jawnym zakresem materiału, bez obowiązku tworzenia czterech aplikacji.
Jak sprawdzić
Dla głównego przykładu mobilnego ustal język treści, odczytaj odpowiadające węzły UIKit, aktywuj English/Polski i reset, przełącz wariant bez zmiany tekstu, ponownie odczytaj. Oczekuj zgodności pól z tabelą mobilną, także po cyklu i bezpośrednim wejściu; niewykonany odsłuch pozostaje osobnym krokiem. Poniższa procedura rozwija wariant webowy.
- Ustal dominujący język aktualnej strony z treści, wliczając istotne nazwy i komunikaty, bez wnioskowania z kraju lub URL. Przy remisie zastosuj wskazówkę pierwszego języka i zapisz kontekst oceny.
- Sprawdź informację domyślną: w HTML
html[lang], w innym formacie właściwe metadane/API. Rozróżnij brak, pustą wartość, błędny tag i tag poprawny, lecz niezgodny z tekstem. Sprawdź dziedziczenie i nadpisania; język przycisku wyboru nie zalicza całej strony. - Zmień język całej treści, wróć, przeładuj i otwórz bezpośrednio. Oczekuj zgodności oznaczenia z każdym stanem; sprawdź pierwszą odpowiedź i DOM po renderowaniu. W demonstracji good/control/parts mają poprawny język domyślny, bad/wrong/empty/invalid odtwarzają celowy błąd.
- Oddziel język obcych fragmentów od domyślnego języka.
partsma poprawny domyślny PL; brak oznaczenia krótkiego angielskiego zdania nie jest tu FAIL 3.1.1. Nazwy własne i numery nie uzasadniają automatycznego przełączenia języka całej strony. - Gdy potwierdzasz doświadczenie AT, użyj rzeczywistego czytnika, zapisz jego język/ustawienia/głosy i wynik odczytu. Oczekuj odczytu zgodnego z językiem; ten krok pozostaje NOT-RUN. Nie zastępuj go screenshotem,
:lang, AX ani wygenerowanym audio.
Wyniki źródłowej próby mobilnej
Próba 2026-10-03: Flutter 3.44.9 / Dart 3.12.2, iPhone 17 Simulator / iOS 26.5, Xcode 27.0 / SDK 27.0. Ramka 402 × 874 pt, PNG 1206 × 2622 px, skala 3, pion, jasny wygląd, tekst large. Pasek 09:41 jest ustawieniem prezentacyjnym, a nie czasem przechwycenia.
| Sprawdzenie | Rzeczywisty wynik / granice |
|---|---|
flutter analyze --no-pub |
PASS, brak problemów |
flutter test --no-pub --reporter expanded --name '^(?!.*android).*' test/*-test.dart |
PASS, 25 testów, w tym nowy 3.1.1 i regresje; mechanika hosta, nie test iOS AT |
flutter build ios --simulator --debug --no-codesign --no-pub |
PASS; finalny Runner zainstalowany na dedykowanym Simulatorze |
| XCTest build-for-testing i test-without-building | PASS, 1 test/0 failures; uruchomione UI, 19 odczytów UIKit, 37 tap, 3 PNG, smoke wcześniejszej trasy 2.5.3 |
| Finalny język odbiornika | Good pl→en→pl; bad en→pl→en; control pl-PL→en-GB→pl-PL; cykl/reset/fallback zgodne z trwającym stanem |
| Ocena pary | AI: good/control prawidłowo ujawniają język tego ekranu; bad celowo podaje odwrotny język. PASS testu odtworzenia błędu nie oznacza PASS bad |
| Kontrola dowodów i zdjęć | PASS integralności oraz pól obserwowanych; 3 PNG obejrzane przez AI, rzeczywiste stany bez splash/AI/retuszu |
| VoiceOver, wymowa/brajl, fizyczny iPhone, Android, człowiek | NOT-RUN; bez deklaracji zgodności całej aplikacji |
Wcześniejsza rozbieżność: przy zmianie wariantu bez zmiany tekstu test widgetu widział nowy język, a natywny odbiornik zachowywał poprzedni. Pierwszy XCTest technicznie PASS sprawdzał obecność odczytu i akcje; nie był finalnym potwierdzeniem języka. Dodano ValueKey(locale.toLanguageTag()) na nadrzędnym Semantics, aby odtworzyć poddrzewo również przy zmianie samego języka. Ponowne historyczne analiza, testy, build i XCTest z asercjami natywnych języków dały wynik końcowy. Nie ustalono ogólnej przyczyny w silniku.
Wyniki wcześniejszej próby WWW
Próba 2026-10-03: Codex In-app Browser na macOS 27.0, Chrome/154.0.0.0, 1280 × 720 CSS px, DPR 1; Python 3.9.6 i Node 22.22.3. Materiał pochodzi z desktopowej przeglądarki, bez emulacji telefonu.
| Sprawdzenie | Zaobserwowany wynik / zakres |
|---|---|
| Przegląd wymagania, Understanding/technik, ACT, WCAG2ICT i API | Wykonany przez AI 2026-10-03; nie jest przeglądem człowieka |
| Serwer HTTP | PASS: 8 odpowiedzi wariantów/fallback, lang przed JS, UTF-8/no-store, brak Content-Language; nieznana ścieżka 404 |
| Driver przeglądarki | PASS: 29 odczytów DOM/AX, 14 kliknięć; 7 wariantów × PL/EN/reset/reload oraz fallback |
Dziedziczenie :lang |
PASS mechaniki demonstracji: pl/en/pl-PL/en-GB odpowiednio dziedziczą; brak/puste/pl_PL nie wskazują PL/EN. Wrong dziedziczy błędnie deklarowany język |
| Stabilność par | PASS: identyczne visibleBody w good/bad/wrong/empty/invalid/control dla odpowiadających stanów; URL i navigationStart stałe przy PL→EN |
| Wejścia | PASS: 14 eventów oczekiwanych przycisków, isTrusted=true; to wejście syntetyzowane przeglądarką, nie ręczny klik człowieka |
| Obrazy / konsola | 4 surowe JPEG obejrzane przez AI; pełna treść, bez splash/pustego ekranu; good/bad identyczne bajtowo; 0 błędów i ostrzeżeń konsoli |
| Kontrola zachowanych dowodów | PASS: obserwacje, odpowiedzi powiązane z renderem, hashe kodu/assetów i 319 wcześniejszych plików; nie powtarza UI |
| Normatywny warunek demonstracji | AI: good/control/parts spełniają domyślną informację językową; bad/wrong/empty/invalid jej nie spełniają. PASS testu odtworzenia celowej usterki nie oznacza PASS błędnej strony |
| VoiceOver / TTS / brajl / inne przeglądarki | NOT-RUN; brak doświadczenia odbiornika i dowodu wymowy |
| Zakres pierwotnej próby poza WWW | NOT-RUN w próbie WWW; późniejszy Flutter/iOS opisano osobno powyżej; pozostałe odbiorniki i fizyczne urządzenie nadal NOT-RUN |
| Przegląd człowieka | NOT-RUN; status rejestru „w trakcie” |
Weryfikacja i ograniczenia
Reguła deterministyczna wykryje brak/pustą wartość, część błędów BCP 47 i konflikty metadanych. Nie potwierdzi sama, że poprawny tag odpowiada językowi treści; wrong przechodzi samo sprawdzenie obecności i składni. ACT b5c3f8/bf051a badają określone aspekty HTML; dopasowanie języka treści w regule ucwvc8 ma status proponowany, więc nie przedstawiamy go jako zatwierdzonej automatycznej metody kompletnego audytu.
Heurystyka językowa lub AI może wskazać rozbieżność na podstawie tekstu, lecz ma ograniczenia przy krótkich treściach, podobnych językach, nazwach, transliteracji i równych proporcjach. W tej demonstracji języki ustalono z własnych pełnych tekstów PL/EN; checker odtwarza oczekiwania autora i nie jest ogólnym detektorem języka. Ocena człowieka rozstrzyga niejasny kontekst.
AX bez pola języka ani sam odczyt nazwy/roli z XCTest nie potwierdza języka. Mobilny observer UIKit rzeczywiście odczytuje accessibilityLanguage, ale jako instrument działający wewnątrz aplikacji nie zastępuje niezależnego doświadczenia czytnika. DOM daje właściwe dane autora dla H57, lecz :lang nie mierzy jakości wypowiedzi ani nie dowodzi dostępności głosu. Nie zaliczaj braku danych jako PASS i nie uznawaj dobrego odczytu uzyskanego zgadywaniem za dowód poprawnego oznaczenia. Brak testu na innej platformie nie jest jej wyłączeniem.
Mobilny observer przechodził przez rzeczywiste obiekty UIKit wewnątrz debug Runnera, odczytując accessibilityLanguage i atrybutowane etykiety, wartości oraz podpowiedzi. Nie otrzymywał locale z Dart ani nie ustawiał języka. Limit wynosił 40 poziomów/500 węzłów; finalne odczyty nie były ucięte. ensureSemantics utrzymywało strukturę, nie włączało VoiceOver. Odczyt wskazywał VoiceOver=false i preferencje en-US/pl-US; brak osobnego runu speechLanguage nie oznacza braku języka, gdy element ma właściwe accessibilityLanguage. Odczyty warstw są sekwencyjne.
Dawny checker WWW ściśle wiąże pierwotny draft i wspólny kod; późniejsze korekty źródeł zgłasza jako drift. Checker mobilny zachowuje integralność wcześniejszych mediów i odczytów, bez utożsamienia WWW z mobile i bez powtórzenia UI. Przegląd interpretacji przez człowieka oraz rzeczywista wymowa PL → EN → PL w czytniku pozostają NOT-RUN.
Jak sprawdza Clearship
Clearship na Androidzie porównuje język rozpoznawalnych tekstów ekranu z programowym językiem odczytanym z zakresów LocaleSpan, ustawienia aplikacji i systemu. Metoda language-2 działa deterministycznie, bez AI. Wskazuje niezgodność domyślnego języka, gdy niezgodne akapity obejmują co najmniej połowę liter analizowanej treści. Ta reguła techniczna nie jest procentowym progiem WCAG.
Pomiar kontrolny Androida z 8 października 2026 r. spełnił próg metody: 6/6 usterek i 0 fałszywych alarmów na 739 poprawnych ekranach. Jednostką analizy jest zbadany ekran, nie cały program. Tekst krótszy niż rozpoznawalny akapit, język spoza obsługiwanych 60 języków, brak sygnału, sprzeczne dane i pominięte stany wymagają dalszej oceny.
Metoda nie bada języka dokumentu WWW w WebView, cyklu zmiany języka, tekstu w obrazach, wartości pól ani podpowiedzi. Węzeł bez zakresu obok węzłów z zakresami może mieć niepewny język i trafia do człowieka. Na iOS sonda XCUITest nie dostarcza informacji języka; wynik jest poniżej progu i wymaga człowieka. Wewnętrzny observer UIKit edukacyjnej demonstracji nie jest sondą aplikacji klienta ani testem VoiceOver.