3.1.2Poziom AA

Język części treści

Language of Parts

Język każdego fragmentu i zwrotu można określić programowo, z wyjątkami dla nazw, terminów i słów opisanych w kryterium.

Komu pomaga
NiewidzeniePamięć i koncentracja
Zastosowanie
WWWAplikacje mobilneAplikacje desktopoweDokumenty cyfroweInne urządzenia

Warunki i wyjątki opisano w artykule.

Wersja
WCAG 2.2, wprowadzone w 2.0
Zasada / wytyczna
Zrozumiałość / 3.1
Stan researchu
Draft AI. Bez przeglądu człowieka.
Redakcja artykułu
· wersja robocza
Na tej stronie

Co oznacza to kryterium

Oznacz język fragmentu, który jest w innym języku niż jego otoczenie, żeby oprogramowanie mogło dobrać sposób odczytu. Właściwy język może być dziedziczony po rodzicu. Wymaganie obejmuje również pojedyncze słowo celowo użyte w obcym języku, z czterema wyjątkami opisanymi dalej. Nie nakazuje tłumaczenia treści.

Potrzeby opisują bariery w tym przykładzie, a nie normatywną klasyfikację osób.

ID / etykieta Bariera i korzyść
blindness — Niewidzenie Użytkownik mowy lub brajla potrzebuje właściwych reguł języka, aby rozpoznać obcy fragment.
cognitive — Pamięć i koncentracja Osoba korzystająca z syntezy mowy przy trudnościach czytania, dekodowania znaków i rozumienia tekstu łatwiej rozpozna poprawnie odczytany zwrot. Etykieta słownika nie obejmuje wszystkich potrzeb językowych.

Nie przypisujemy automatycznie motoryki, rozróżniania barw ani słuchu. W napisach identyfikacja zmiany języka może pomagać rozpoznać język ścieżki; w tej demonstracji nie ma multimediów i nie badano napisów. Powiększenie nie jest przedmiotem tej próby.

Przykłady błędów i poprawek

Pracownia pokazuje syntetyczne zamówienie P-104 przy ul. Ogrodowej 8. Użytkownik czyta „Please bring your order number.” i uruchamia „Pokaż instrukcję: Collect your order”. Każdy wariant wyświetla ten sam polski komunikat z P-104. Good i bad mają identyczne teksty, wygląd, dane i funkcję; różnią się metadanymi języka.

Problem: w bad angielska instrukcja dziedziczy pl, a angielska część nazwy przycisku nie ma języka zakresu. Odbiornik nie otrzymuje właściwej informacji o zmianie języka. Poprawka: oznacz całą instrukcję jako en, a w mieszanej etykiecie przypisz en wyłącznie angielskiej części, pozostawiając polski prefiks jako pl. Tłumaczenie instrukcji nie jest poprawką omawianego błędu metadanych.

Wariant / scena Różnica i oczekiwany odczyt
good / fragment Angielska instrukcja ma localeForSubtree: en; UIKit odczytuje en.
good / mieszana etykieta Węzeł zachowuje pl, a angielski zakres label ma LocaleStringAttribute(en) → accessibilitySpeechLanguage=en.
bad / te same dwa fragmenty Instrukcja błędnie dziedziczy pl; angielski zakres etykiety nie ma atrybutu języka. Przycisk nadal działa. To celowo przygotowana bariera, nie wynik badania komercyjnej app.
control / dziedziczenie Rodzic instrukcji ma en, dziecko nie deklaruje własnego locale, a jego UIKit język wynosi en. Mieszana etykieta pozostaje oznaczona jak good.
każdy / wyjątki Nazwa Pracownia i format PDF pozostają w polskim otoczeniu; brak dodatkowej deklaracji nie jest sam w sobie naruszeniem.
WWW / pojedyncze słowo „Hello” jest świadomie angielskim powitaniem; good/control mają lang=en, bad dziedziczy pl.
WWW / mieszany link Polskie „Instrukcja:” i angielska fraza wewnątrz linku; poprawny wewnętrzny markup nie gwarantuje zachowania języków w izolowanej liście linków AT.

Nieznana para wraca do good. Zwykłe przyciski wykonują pełny cykl good → bad → control → good i reset. Control potwierdza prawidłowe dziedziczenie, a nazwa Pracownia i termin PDF służą kontroli wyjątków.

Good na iOS Simulator: angielska instrukcja i mieszana polsko-angielska etykieta w Pracowni.

Fallback good, 2026-10-04, iPhone 17 Simulator / iOS 26.5. UIKit odczytał en dla instrukcji i angielski zakres [18,36) UTF-16 w polskiej nazwie przycisku. Kadr pokazuje słowa, nie niewidoczne zakresy języka.

Bad na iOS Simulator: ta sama instrukcja i mieszana etykieta.

Bad, ta sama próba: instrukcja ma pl, a mieszana etykieta nie ma angielskiego atrybutu zakresu. Przycisk nadal działa. Brak metadanych nie jest widoczny na samym obrazie.

WWW good: angielska instrukcja, mieszana etykieta, Hello i link z tekstem w dwóch językach.

WWW/macOS, 2026-10-04, surowy kadr przed akcją. DOM potwierdza własne i dziedziczone lang; wypowiedzi i lista linków rzeczywistego czytnika nie były badane. Plik 1265 × 712 px pochodzi z viewportu 1280 × 720 CSS px.

Kiedy obowiązuje i gdzie są wyjątki

Normatywne wymaganie obejmuje język każdego fragmentu i zwrotu. Programowe określenie oznacza dane autora, które oprogramowanie i technologie asystujące mogą wydobyć i przedstawić w różnych modalnościach. Widoczny podpis „po angielsku” pomaga człowiekowi, lecz sam nie zastępuje metadanych języka.

Wyjątki dotyczą nazw własnych, terminów technicznych, słów o nieustalonym języku i słów lub zwrotów należących już do języka bezpośredniego otoczenia. Pracownia jako nazwa punktu i PDF jako termin techniczny nie wymagają wymuszenia obcego języka. Pojedynczy wyraz nie jest automatycznie zwolniony: „Hello” przy podpisie „Angielskie powitanie” wskazuje celową zmianę. Zapożyczenie oceniać w jego konkretnym otoczeniu, nie tylko według etymologii.

Domyślny język strony lub programu jest tematem 3.1.1. Poprawne dziedziczenie może zapewnić język części treści, jeżeli odpowiada jej rzeczywistemu językowi. W tej parze domyślny pl jest poprawny w obu wersjach; błąd dotyczy wyłącznie angielskich fragmentów. Region nie jest obowiązkowy, jeśli podstawowy tag wystarcza do identyfikacji języka; nie używać nieprawidłowych tagów jako poprawki.

H58 jest pomocniczą techniką dla HTML: ustalić język treści z uwzględnieniem dziedziczenia, sprawdzić tag według BCP 47 i dopasowanie do tekstu. PDF19 jest techniką dla tagged PDF: zakres /Lang ma obejmować właściwy fragment; trzeba zachować kolejność i zweryfikować odczyt ustawień i dostępności. Żadna technika nie jest jedynym obowiązkowym sposobem spełnienia SC. W pełnym Understanding nie wskazano osobnej techniki F dla tego kryterium; opisane niżej błędy są własnymi odtworzeniami, bez nadawania im wymyślonych numerów F.

Język, nazwa dostępna i wymowa

W niektórych trybach AT nazwa dostępna jest płaskim tekstem. Lista linków może zgubić wewnętrzne języki nawet przy prawidłowym lang w dziecku linku. Taka granica narzędzia nie oznacza automatycznie błędu autora: ocena musi sprawdzić markup i sposób oznaczenia zmiany, a nie wyłącznie dźwięk. Przeniesienie lang na cały element może pomagać w prostym przypadku jednego języka; przy mieszanej etykiecie nie wolno przez to oznaczyć polskiego prefiksu jako angielskiego.

Odwrotnie, poprawnie brzmiący głos może zgadnąć język i nie dowodzi metadanych. W natywnym środowisku ustawione Locale nie dowodzi programowego określenia bez dostępnego dla AT mostu. Odczyt accessibilityLanguage i accessibilitySpeechLanguage potwierdza określone właściwości UIKit, lecz nie potwierdza rzeczywistego odsłuchu VoiceOver, wyboru głosu ani wszystkich trybów użytkownika.

Platformy

Warunek demonstracji: świadomie użyta angielska instrukcja w polskim otoczeniu. Stan „dotyczy warunkowo” opisuje warunek treści i wyjątków; NOT-RUN opisuje wykonanie, nie wyłączenie platformy. Ocena zastosowania: AI, 2026-10-04; przegląd człowieka NOT-RUN. Nie oceniano podstawy prawnej ani EN 301 549; nie przenosimy jej wyłączeń do WCAG2ICT.

ID / środowisko Podstawa / kryterium Stan, zakres, adaptacja i uzasadnienie Wykonanie
web — WWW WCAG 2.2, SC 3.1.2 Dotyczy warunkowo; bez zmiany wymagania. HTML lang i dziedziczenie obejmują fragmenty, także w przeglądarce telefonu. Minimalny HTML w przeglądarce Codex/macOS, DOM i AX; AT NOT-RUN.
mobile — Aplikacje mobilne WCAG 2.2 przez WCAG2ICT 2.2, Group Note 2025-12-11, §3.1.2 Dotyczy warunkowo; „treść” obejmuje oprogramowanie. Wymagane metadane wspierane przez AT. Sam locale układu lub zasobów nie potwierdza mostu dostępności. Flutter/Cupertino, iOS Simulator; natywne gettery UIKit. Android, physical i AT NOT-RUN.
desktop — Aplikacje desktopowe Ta sama interpretacja WCAG2ICT, §3.1.2 Dotyczy warunkowo; oprogramowanie musi udostępnić język fragmentu przez wspierany mechanizm. Niektóre technologie bez takiej metody nie mogą spełnić tego wymagania. NOT-RUN; brak builda macOS/Windows/Linux.
document — Dokumenty cyfrowe poza WWW Ta sama interpretacja WCAG2ICT, §3.1.2 Dotyczy warunkowo; „treść” obejmuje dokument. Język główny może być dziedziczony; odmienny wymaga właściwych metadanych. Tagged PDF może użyć /Lang na strukturze lub sekwencji marked content. NOT-RUN; nie utworzono ani nie otwarto PDF/Word.
other — Oprogramowanie kiosku z zamkniętą funkcjonalnością WCAG2ICT 2.2, §3.1.2 i dodatek closed functionality Dotyczy warunkowo; odrębna adaptacja intencji: poprawna wymowa zapewniona innym mechanizmem, np. self-voicing. Trzeba wykazać prawidłową wymowę obcych części. Nie jest to dowolne zwolnienie kiosków, aplikacji ani treści webowej. NOT-RUN; nie badano kiosku, głosu ani sprzętu.

W hybrydzie część webową i natywną oceniać osobno. Nawet jeśli środowisko nie potrafi przekazać języka fragmentu do AT, nie jest to nowy wyjątek od SC. WCAG2ICT jest wskazówką interpretacyjną, nie normą ustanawiającą obowiązki prawne.

Rozwiązania w technologiach

Wszystkie zakresy stringów trzeba wyliczać ponownie po lokalizacji; nie kopiować indeksów z jednego tłumaczenia. Odróżniać język renderowania od języka semantyki. Poniższe fragmenty są edukacyjne; statusy dotyczą dokładnie podanego wykonania.

Flutter / Dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/semantics.dart';

Widget instruction(VoidCallback open) {
  const prefix = 'Pokaż instrukcję: ';
  const phrase = 'Collect your order';
  const label = '$prefix$phrase';
  return Semantics(
    localeForSubtree: const Locale('pl'),
    attributedLabel: AttributedString(label, attributes: [
      LocaleStringAttribute(
        range: TextRange(start: prefix.length, end: label.length),
        locale: const Locale('en'),
      ),
    ]),
    button: true, onTap: open, excludeSemantics: true,
    child: CupertinoButton(onPressed: open, child: const Text(label)),
  );
}

Dla całej angielskiej instrukcji wystarcza Semantics(localeForSubtree: Locale('en'), child: Text(...)). excludeSemantics przy własnej atrybutowanej nazwie usuwa dublowanie etykiety dziecka, więc trzeba zachować rolę i rzeczywiste działanie. Tekst AttributedString jest nazwą, nie zmianą widocznego napisu.

Przegląd SDK Flutter 3.44.9 potwierdza API. W engine iOS LocaleStringAttribute mapuje się na UIAccessibilitySpeechAttributeLanguage w NSRange, a locale węzła na accessibilityLanguage. Rzeczywisty przykład wykorzystuje obie metody. Kompilacja i runtime dotyczą tego pliku i jego kontekstu, nie oddzielnego fragmentu w karcie. Analiza/host/build iOS oraz odczyt UIKit: wyniki poniżej; VoiceOver NOT-RUN.

iOS / SwiftUI

Nie zakładamy niepotwierdzonego modyfikatora SwiftUI dla języka zakresu etykiety. Poniżej UIViewRepresentable osadza UIKit i jawnie nadaje język całego węzła oraz atrybut angielskiej części:

import SwiftUI
import UIKit

struct MixedInstruction: UIViewRepresentable {
    func makeUIView(context: Context) -> UILabel {
        let view = UILabel()
        view.numberOfLines = 0
        view.isAccessibilityElement = true
        return view
    }
    func updateUIView(_ view: UILabel, context: Context) {
        let text = "Pokaż instrukcję: Collect your order"
        let attributed = NSMutableAttributedString(string: text)
        let range = (text as NSString).range(of: "Collect your order")
        guard range.location != NSNotFound else { return }
        attributed.addAttribute(.accessibilitySpeechLanguage,
                                value: "en", range: range)
        view.text = text
        view.accessibilityLanguage = "pl"
        view.accessibilityAttributedLabel = attributed
    }
}

To tekstowy przykład etykiety, nie działający przycisk SwiftUI. Dla akcji zastosować te same właściwości do rzeczywistej kontrolki UIKit z callbackiem; nie nadawać tekstowi roli przycisku bez funkcji. Nie scalać później całego widoku w płaską nazwę, która utraci atrybuty. Dokumentacja UIKit/SwiftUI i lokalne nagłówki SDK sprawdzone 2026-10-04; kompilacja fragmentu, runtime SwiftUI, AT: NOT-RUN. Build Fluttera nie potwierdza tego mostu.

Android / Jetpack Compose

Nie wymyślamy semantics.language. Minimalny most przez AndroidView utrzymuje CharSequence z zakresami języka w natywnym tekście:

import android.text.SpannableString
import android.text.Spanned
import android.text.style.LocaleSpan
import android.widget.TextView
import androidx.compose.runtime.Composable
import androidx.compose.ui.viewinterop.AndroidView
import java.util.Locale

@Composable
fun MixedInstruction() {
    AndroidView(factory = { TextView(it) }, update = { view ->
        val prefix = "Pokaż instrukcję: "
        val text = SpannableString(prefix + "Collect your order")
        text.setSpan(LocaleSpan(Locale("pl")), 0, prefix.length,
                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        text.setSpan(LocaleSpan(Locale.ENGLISH), prefix.length, text.length,
                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        view.text = text
    })
}

LocaleSpan istnieje od API 17; wariant z LocaleList od API 24 nie jest tu potrzebny. To natywny tekst, nie implementacja całej funkcji przycisku. Dla instrukcji „Please bring…” nadać LocaleSpan(en) całemu zakresowi. Nie zastępować atrybutowanego text zwykłym contentDescription, który może stracić zakresy. Przegląd dokumentacji Android Views, LocaleSpan i AndroidView: wykonany. Odtworzenie zakresów w AccessibilityNodeInfo i TalkBack zależy od odbiornika i wymaga testu. Kompilacja, runtime Android/Compose, AT: NOT-RUN, bez nowej aplikacji Android.

React Native

import React from 'react';
import { Text } from 'react-native';

export function EnglishInstruction() {
  return (
    <Text accessible={true} accessibilityLanguage="en">
      Please bring your order number.
    </Text>
  );
}

accessibilityLanguage jest iOS-only i przyjmuje tag BCP 47; dotyczy label/value/hint elementu. Nie deklarujemy analogicznego wsparcia na Androidzie. Dla mieszanej nazwy polski/angielski sam język całego elementu nie wystarcza. Potrzebny jest wspierany most do atrybutowanej etykiety UIKit lub natywnego CharSequence Androida; przekazywane teksty i zakresy muszą odzwierciedlać prawdziwą kontrolkę i zachować jej działanie. Fragment pokazuje wyłącznie oddzielną angielską instrukcję, nie gwarantuje języków zagnieżdżonych Text po scaleniu dostępnej nazwy. Oficjalna dokumentacja sprawdzona; typecheck, kompilacja, runtime RN i AT: NOT-RUN. Nie przypisano wersji RN, której nie użyto.

HTML / CSS

<html lang="pl">
  <body>
    <p lang="en">Please bring your order number.</p>
    <button>Pokaż instrukcję: <span lang="en">Collect your order</span></button>
    <p>Angielskie powitanie: <span lang="en">Hello</span>.</p>
    <div lang="en"><p>Please bring your order number.</p></div>
  </body>
</html>

Pierwszy akapit ma własne oznaczenie; ostatni poprawnie dziedziczy. CSS nie nadaje języka i nie usuwa potrzeby lang. W mieszanym linku język na zagnieżdżonym span prawidłowo opisuje treść; odsłuch listy linków pozostaje osobną obserwacją AT. Pełny przykład WWW ma działające przyciski i cykl/reset, a powyższy fragment jest tylko strukturą edukacyjną. Rzeczywisty DOM/AX i wejścia wykonano; walidator HTML i ACT NOT-RUN.

W tagged PDF analogiczny fragment wymaga /Lang na właściwym StructElem lub właściwości sekwencji Span marked content. Sam /Lang katalogu dokumentu dotyczy domyślnego języka 3.1.1; nie rozwiązuje obcej frazy. Eksport Word→PDF może utracić oznaczenia: obejrzeć strukturę i odczyt w odbiorniku, nie tylko ustawienie narzędzia autora. Wykonanie dokumentowe NOT-RUN; to opis zastosowania PDF19, bez stworzenia dodatkowego dokumentu.

Jak sprawdzić

  1. Ustal domyślny język i znajdź rzeczywiście odmienne fragmenty, również pojedyncze słowa, nazwy kontrolek, wartości, wskazówki i treść dodawaną po działaniu. Oceń wyjątki w kontekście.
  2. Sprawdź dane autora: HTML i dziedziczenie w rzeczywistym DOM albo metadane dokumentu/oprogramowania przekazane do wspieranego API. Nie oceniaj języka przez sam wygląd, font, CSS lub wybrane locale zasobów.
  3. Dla tej demonstracji uruchom nieznaną parę /3-1-2/unknown/bad i oczekuj fallback good. Odczytaj UIKit, uruchom instrukcję, reset, cykl do bad i control, ponownie akcję i reset. WWW: ?variant=unknown; bad otwórz Enter, pozostałe przyciski kliknij.
  4. Porównaj tę samą treść: good/control mają en przy instrukcji i angielski zakres mieszanej nazwy; bad ma tylko pl i brak angielskiego run. Kontrola dziedziczenia nie wymaga osobnej deklaracji dziecka. Wyjątki pozostają polskie. Zapisz stan przed asercjami.
  5. W osobnej próbie wspieranego AT z głosami PL/EN sprawdź zwykły odczyt, fokus przycisku i listę linków. Gdy wymowa nie odpowiada markup, odróżnij ograniczenie AT od błędu autora. Ta próba pozostaje NOT-RUN; żadnego syntetycznego głosu nie przedstawiono jako VoiceOver.

Wyniki źródłowych prób

Próby 2026-10-04: Flutter 3.44.9 / Dart 3.12.2, Xcode 27.0 / SDK 27.0, iPhone 17 Simulator / iOS 26.5. Ramka 402 × 874 pt, PNG 1206 × 2622 px. WWW: Codex/macOS, 1280 × 720 CSS px / DPR 1; wersji silnika nie ustalono. Rzeczywiste wyniki dotyczą tej demonstracji i nie potwierdzają wszystkich odbiorników.

Sprawdzenie / środowisko Rzeczywisty wynik / dowód
Flutter 3.44.9 / Dart 3.12.2, analiza końcowa PASS końcowej analizy. Pierwszy FAIL zachowany poniżej.
Istniejąca host suite, bez Androida PASS: 67 testów hostowych. Nie zastępuje urządzenia.
Build Flutter iOS Simulator debug i drivery v1/v2 PASS buildu aplikacji i obu driverów przed instalacją.
iOS v1, iPhone 17 / iOS 26.5, Xcode 27.0 / SDK 27.0 FAIL 9,819 s test / 28,819 s orkiestracja; 1 STATE/1 TREE/2 INPUT/1 PNG.
iOS v2, to samo dedykowane urządzenie PASS: 1 test, 0 failures, 64,151 s test / 71,116 s orkiestracja; 9 STATE/9 TREE/19 INPUT/6 PNG.
Przekazanie języka do UIKit PASS w badanym zakresie: good/control passage=en, bad=pl; mieszana etykieta pl ma en na UTF-16 [18,36) tylko good/control. W każdym odczycie wymagano obecności badanych elementów. VoiceOver=false w 10 zapisanych stanach obu prób; AT NOT-RUN.
WWW, loopback 8432, CUA/IAB Codex/macOS PASS demonstracji: 10 DOM/10 AX, 9 wejść (8 click, 1 Enter), 6 JPEG; zapisane obserwacje i wejścia. isTrusted=true, identyczne teksty i funkcje good/bad, kontrola dziedziczenia i Hello. Viewport 1280×720 / DPR 1. Wersja silnika nieustalona.
Oględziny mediów Wykonane AI: wszystkie 13, w tym 1 historyczny PNG; 7 PNG 1206×2622, 6 JPEG 1265×712 (rozmiar pliku zwróconego przez CUA; viewport DOM 1280×720). Brak splasha, pustego ekranu lub retuszu. Drzewo ma Window 402×874; skala 3 wynika z relacji PNG/ramki.
Integralność i linki PASS odczytowej kontroli zapisanych wyników. Nie jest wynikiem całego SC.

Zachowane nieudane próby: pierwsza analiza FAIL na const Semantics, ponieważ konstruktor nie jest const. Po usunięciu const analiza końcowa PASS. XCTest v1 FAIL oczekiwał offsetu 17 zamiast rzeczywistych 18 jednostek UTF-16 polskiego prefiksu. Surowy odczyt już zawierał prawidłowy tekst i run en. V2 obliczał NSString.range(of:) z rzeczywistej etykiety; zmiana dotyczyła markeru i drivera, bez zmiany produktu lub buildu aplikacji po v1.

Przygotowawczy odczyt WWW również FAIL: readonly scope nie udostępniał navigator.userAgent. Nie było akcji ani zapisu medium. Observer ograniczono do dostępnego DOM, a kolejne odczyty zapisano przed oceną. Nie zgadywano wersji silnika. Oczekiwania good/bad znajdują się w asercjach, a nie w surowych danych.

Weryfikacja i ograniczenia

Metoda Zakres i ograniczenie
Screenshot / OCR Pokazuje treść i kontekst; nie potwierdza niewidocznych metadanych. Rozpoznanie języka jest hipotezą, szczególnie przy krótkich słowach i wyjątkach.
UIKit publiczne gettery Dostarczają accessibilityLanguage, attributed label/value/hint i zakresy UTF-16 z prawdziwych obiektów po mostku Flutter. Nie kopiują locale z Dart, nie ustawiają produktu, nie generują mowy. VoiceOver=false nie oznacza testu czytnika.
DOM / AX DOM potwierdza własne i dziedziczone lang; spłaszczona nazwa AX sama nie dowodzi braku wewnętrznego markup. Zbadano prosty DOM tej demonstracji, bez uniwersalnej analizy shadow/flat tree.
Checker demonstracji Deterministycznie kontroluje zapisane teksty, języki, zakresy, działania, integralność i linki. Zna oczekiwania, nie jest ACT, modelem AI, człowiekiem ani zaślepionym walidatorem.
Ocena AI Interpretacja wyjątków i zastosowania pozostaje draftem wymagającym przeglądu. Nie wykonano oceny skuteczności AI na niezależnych przypadkach.

ACT de46e4: zatwierdzona reguła, wersja 2023-12-20. Bada niepuste lang w HTML body flat tree, z niepustym tekstem dziedziczącym język, widocznym lub obecnym w AX; uwzględnia także dostępny tekst. Sprawdza znany główny tag, nie pełną składnię BCP 47 ani dopasowanie do faktycznego języka. en-US-GB może przejść dzięki znanemu en, mimo błędnej składni regionów. Brak lang i empty są poza zakresem, a treść nadal może naruszać SC. PASS albo inapplicable wymagają dalszego badania; nie certyfikują 3.1.2.

ACT off6ek: reguła proponowana, aktualizacja 2026-01-19. Bada istniejące lang ze znanym głównym tagiem i tekst dziedziczący ten język. Główny tag ma odpowiadać najbardziej rozpowszechnionemu językowi liczonymi słowami; słowo może należeć do kilku języków i remisy są dopuszczone. Dzieci z własnym lang wypadają z tekstu rodzica. Nie wykrywa brakujących deklaracji. Background wyraźnie dopuszcza PASS przy niespełnionym SC, natomiast tabela mapping twierdzi all-passed=satisfied; zapisujemy tę rozbieżność i przyjmujemy ostrożne ograniczenie z Background. Nie wyciągamy pełnego wyniku SC z PASS tej reguły. Silnik ACT obu reguł: NOT-RUN.

Natywne gettery odczytują język i zakresy z rzeczywistych obiektów po mostku Flutter, bez eksportowania oczekiwanej oceny. VoiceOver=false w dziesięciu zapisanych stanach obu prób pozostaje informacją o ustawieniu, nie wynikiem czytnika. Kadry są surowe; nie tworzono filmu ani syntetycznej mowy. Sekwencja zapisanych tap/click/Enter i stany po działaniu potwierdzają wspólną funkcję, a nie jakość odczytu głosowego.

Zakres Status
Przegląd człowieka: norma, wyjątki, draft, pary i API NOT-RUN
Zaślepiony walidator / niezależny benchmark NOT-RUN; nie zlecono benchmarku
Silnik ACT / uniwersalna ocena składni BCP 47 NOT-RUN
VoiceOver/TalkBack, zwykły odczyt i lista linków, audio NOT-RUN
Physical iPhone, Android, desktop, dokument, kiosk/self-voicing NOT-RUN
SwiftUI/Compose/RN: kompilacja i runtime edukacyjnych fragmentów NOT-RUN
Zmiana języków, głosów i pozostałych ustawień OS NOT-RUN; użyto istniejących odczytanych ustawień

Jak sprawdza Clearship

Na Androidzie Clearship porównuje język rozpoznanych fragmentów z informacją LocaleSpan i językiem aplikacji. Deterministyczna metoda language-2 używa lokalnego rozpoznawania tekstu, bez AI. Dłuższy obcy fragment bez właściwego oznaczenia albo z błędnym oznaczeniem jest kandydatem usterki. Krótkie fragmenty, nazwy własne, tytuły i sprzeczne zakresy wymagają człowieka; minimum trzech słów i dwunastu liter jest parametrem tej metody, a nie wyjątkiem WCAG dla pojedynczych słów.

Pomiar kontrolny Androida z 8 października 2026 r. spełnił próg: 6/6 usterek, 2 fałszywe alarmy na 739 poprawnych ekranach. Rozpoznanie czterech wyjątków pozostaje ograniczone; tytuły pisane zdaniowo, dłuższe zapożyczenia i podobne języki mogą prowadzić do pomyłek. Metoda nie bada WWW w WebView, tekstów w obrazach, wartości pól, podpowiedzi ani cyklu zmiany języka.

Na iOS sonda XCUITest nie udostępnia accessibilityLanguage i atrybutowanych zakresów języka; pomiar pozostaje poniżej progu i wymaga oceny człowieka. Odczyt wewnętrznego observera UIKit demonstracji edukacyjnej nie potwierdza możliwości sondy Clearship ani rzeczywistej wymowy VoiceOver.

Powiązane kryteria