Hai tiêu chí tách bạch:
- 3.1.1 Language of Page (mức A): ngôn ngữ mặc định của trang phải khai báo được bằng máy — tức lang trên thẻ <html>.
- 3.1.2 Language of Parts (mức AA): mỗi đoạn nội dung thuộc ngôn ngữ khác phải tự khai báo lang của nó.
<html lang="vi">
<p>Anh ấy nói <span lang="en">let us circle back on that</span> rồi tắt máy.</p>
</html>Lý do rất cụ thể: screen reader đổi bộ phát âm theo lang. Trang để lang="en" mà nội dung tiếng Việt sẽ được đọc bằng giọng Anh — ra một chuỗi âm vô nghĩa. Đây là lỗi mặc định của nhiều template Next.js vì app/layout.tsx sinh sẵn <html lang="en">.
Với app đổi ngôn ngữ tại chỗ, lang phải đổi theo:
const { locale } = useLanguage()
useEffect(() => { document.documentElement.lang = locale }, [locale])Dùng mã BCP 47: vi, en, en-US, zh-Hans. Sai chính tả (vn thay vì vi) thì coi như không khai báo.
Ngoại lệ của 3.1.2: tên riêng, thuật ngữ kỹ thuật, và từ nước ngoài đã thành từ mượn trong ngôn ngữ chính. Nghĩa là không cần bọc lang="en" quanh mọi chữ deploy, commit, bug trong bài viết tiếng Việt — chỉ cần cho câu hoặc đoạn thực sự bằng tiếng Anh.
Lưu ý thêm: lang cũng đổi cách trình duyệt chọn font, ngắt dòng, và dấu nháy kép thông minh — sửa nó thường sửa luôn vài lỗi trình bày.