5 điểm bởi GN⁺ 2025-05-20 | 1 bình luận | Chia sẻ qua WhatsApp
  • Thiết lập ngôn ngữ dựa trên IP là một tính năng dựa trên tiền đề sai lầm
  • Địa chỉ IP chỉ cho biết vị trí, không thể phản ánh đúng sở thích ngôn ngữ thực sự của người dùng
  • Header Accept-Language truyền đạt chính xác thông tin về ưu tiên ngôn ngữ
  • Ngôn ngữ UI cần được thiết lập dựa trên tín hiệu đáng tin cậy là header của trình duyệt
  • Quyền lựa chọn ngôn ngữ và sự tôn trọng trải nghiệm của người dùng là nguyên tắc quan trọng nhất

Giới hạn của việc suy đoán ngôn ngữ bằng IP

  • Việc vẫn dùng địa chỉ địa lý IP (GeoIP) để quyết định ngôn ngữ sử dụng là một giả định sai
  • Địa chỉ IP chỉ cung cấp thông tin vị trí của yêu cầu
  • Nó không thể xác định ngôn ngữ mà người dùng thực sự ưu tiên hoặc hiểu được
  • Cách này thường thất bại trong nhiều tình huống như VPN, đi du lịch nước ngoài, sống ở nước ngoài, hoặc các quốc gia có nhiều ngôn ngữ chính thức
  • Đây không phải là sự thông minh mà là gây bất tiện và nhầm lẫn

Khoảng cách giữa số lượng ngôn ngữ chính thức và thực tế

  • Quốc gia và thông tin IP không có quan hệ ánh xạ 1:1 với ngôn ngữ
    • Belgium có 3, Switzerland có 4, India có 22, Canada chính thức có 2, và trên thực tế là một quốc gia đa ngôn ngữ
  • Người dùng có thể sống tại quốc gia đó, ghé thăm, hoặc ngẫu nhiên có lưu lượng được định tuyến qua quốc gia đó
  • Chỉ dựa vào thông tin quốc gia để ép hiển thị một ngôn ngữ UI duy nhất là hành vi sai lầm

Ví dụ về kỹ thuật sai cách

  • Dựa vào dữ liệu sai là một cách phát triển lười biếng
  • Cái cớ “các website lớn cũng làm thế” là không đúng
  • Nếu không thể xử lý một cách chính xác thì thà đừng làm gì còn hơn

Giá trị của header Accept-Language

  • Nhiều người dùng gặp bất tiện vì bị ép hiển thị một ngôn ngữ mới, chẳng hạn do dùng VPN
  • Mọi trình duyệt đều gửi header Accept-Language
    • Ưu tiên ngôn ngữ được xác định theo thiết lập OS hoặc trình duyệt của người dùng
    • Nếu muốn, người dùng có thể tự đặt và thay đổi giá trị này
    • Ví dụ: Accept-Language: en-US,en;q=0.9,de;q=0.8
  • Header này chính xác, miễn phí, đã có sẵn, không cần giấy phép hay bảo trì bổ sung

Cách xử lý ngôn ngữ đúng đắn

  • Cũng như độ phân giải màn hình hay màu sắc, ngôn ngữ cũng phải tôn trọng môi trường của người dùng
  • Việc gán sai ngôn ngữ xảy ra thường xuyên, như hiển thị tiếng Anh cho người dùng tiếng Anh ở Pháp, hiển thị tiếng Hà Lan cho người nói tiếng Pháp ở Brussels, hay hiển thị tiếng Trung cho người dùng VPN ở Hong Kong
  • Điều này dẫn đến than phiền từ người dùng, rời bỏ dịch vụ, hoặc phải mò mẫm trong UI để tìm cách khắc phục tạm thời
  • Những sai lầm này xuất phát từ việc dùng dữ liệu IP không đáng tin cậy làm cơ sở xác định ngôn ngữ

Giải pháp thực tế

  • Đọc Accept-Language
  • Tôn trọng giá trị đó
  • Cho phép người dùng tự đổi ngôn ngữ nếu muốn (tùy chọn có thể được lưu trong cookie hoặc tham số URL)
  • Chỉ dùng thông tin GeoIP cho tiền tệ, vận chuyển, yếu tố pháp lýkhông áp dụng cho ngôn ngữ

Kết luận

  • Nếu là phần mềm dành cho con người sử dụng, thì không nên đoán sở thích của người dùng
  • Hãy triển khai một cách chính xác, hoặc tốt hơn là đừng cung cấp tính năng chỉ định ngôn ngữ

1 bình luận

 
GN⁺ 2025-05-20
Ý kiến trên Hacker News
  • Tôi thấy các website phớt lờ header Accept-Language thật sự rất khó chịu. Các website đa ngôn ngữ thường còn dịch cả nút chuyển ngôn ngữ hoặc danh sách ngôn ngữ sang ngôn ngữ hiện tại, gây bối rối; trong trường hợp này tôi nghĩ Wikipedia là hình mẫu tiêu chuẩn. Wikipedia dùng biểu tượng đa ngôn ngữ rõ ràng, danh sách hiển thị tên mỗi ngôn ngữ bằng chính ngôn ngữ đó, và đặt các ngôn ngữ được đề xuất ở trên cùng. Không nên đoán trước ngôn ngữ. Làm như Wikipedia thì sẽ hữu ích

    • Tôi ghét trải nghiệm khi đi vào đúng trang mình muốn qua công cụ tìm kiếm, rồi đột nhiên bị hiện modal yêu cầu chọn quốc gia, và sau khi chọn thì lại bị ép chuyển về trang chủ của site khu vực. Một số site có nút đóng (X), nhưng nhiều nơi còn không có nên rất bực

    • Danh sách ngôn ngữ của Wikipedia có vẻ không hẳn được sắp theo "thứ tự bảng chữ cái". Ví dụ đôi khi các ngôn ngữ được đề xuất như "中文", "Italiano" xuất hiện ở trên, còn phần còn lại trông như được nhóm theo địa lý hoặc hệ chữ viết. Dù không phải thứ tự bảng chữ cái “chuẩn” của chính ngôn ngữ đó, Wikipedia vẫn bản địa hóa rất tốt. Điểm quan trọng là khi hiển thị tên ngôn ngữ bằng chính ngôn ngữ đó thì khái niệm thứ tự bảng chữ cái "chính xác" trở nên khá phức tạp

    • Wikipedia nhớ ngôn ngữ mà người dùng đã chọn trước đó và đưa nó lên đầu. Trải nghiệm người dùng đúng nghĩa

    • Tôi từng gặp trường hợp ứng dụng YouTube đột nhiên đổi ngôn ngữ sang Amharic. Tài liệu hỗ trợ của Google thì chỉ cho biết nút English nằm ở đâu, nhưng với người không biết Amharic như tôi thì hướng dẫn đó hoàn toàn vô nghĩa. Ngay cả ứng dụng dịch trên iPhone cũng không nhận ra ngôn ngữ này. Nếu chỉ có một biểu tượng đa ngôn ngữ phổ quát thì đã có thể xử lý dễ dàng

    • Trớ trêu là ngay cả Universal Language Selector (U.S.L) cuối cùng cũng chủ yếu dùng thông tin quốc gia theo IP của người dùng để quyết định ngôn ngữ đề xuất. Cách này nhiều khi không chính xác. Theo FAQ của U.S.L, họ xác định quốc gia xuất phát bằng IP rồi đề xuất các ngôn ngữ chính

  • Tôi ghét kiểu thiết kế giả định rằng ai cũng chỉ dùng một ngôn ngữ. Tôi có thể đọc tốt bốn ngôn ngữ, và thường thích nguyên bản hơn là bản dịch. Dự đoán ngôn ngữ theo IP sai rất thường xuyên. Tôi đã thiết lập các ngôn ngữ mình dùng rồi, nên đúng ra điều đó phải được tôn trọng. YouTube còn mặc định áp dụng AI dubbing tự động, khiến tôi cứ phải nghe nửa chừng rồi quay lại tắt đi. Không tốn quá nhiều thời gian nhưng cực kỳ khó chịu

    • AI dubbing của YouTube thật sự có chất lượng tệ nhất. Tôi mất 5 phút mới nhận ra giọng nói trong video chính là phần audio của nội dung. Tôi cũng ghét việc tiêu đề video bị dịch. Tôi đang xem một video nói tiếng Anh mà tiêu đề lại hiện bằng một ngôn ngữ đâu đâu

    • Dù tôi đặt ngôn ngữ Google là tiếng Tây Ban Nha, YouTube vẫn tự động dịch mọi thứ sang tiếng Anh. Tôi muốn xem nội dung nguyên bản để cải thiện tiếng Tây Ban Nha, nhưng YouTube lại khiến việc đó khó hơn

  • Tôi thực sự khó chịu với tính năng YouTube tự động dịch tiêu đề video sang ngôn ngữ cài đặt của tôi. Tôi hiểu tiếng Anh, nên chẳng cần bị dịch làm gì

    • Nếu tôi không hiểu ngôn ngữ của chữ viết đó, thì khả năng cao video ấy vốn không dành cho tôi. Phần lớn video hướng đến quốc tế đều có bằng tiếng Anh, nên nếu tác giả muốn thì hẳn họ đã tự dịch rồi. Hơn nữa, tiêu đề video vốn thiếu ngữ cảnh nên dịch cũng không chuẩn. Trước đây có video tiếng Bồ Đào Nha "Vamos assistir uma conexão com o passado" mà thực ra là "Let's play A Link to the Past"; để đoán ra tiêu đề tiếng Anh, tôi còn phải dịch ngược lại rồi suy ra. Tính năng này có thể tăng khả năng tiếp cận, nhưng ít nhất cũng phải có tùy chọn tắt

    • Thuật toán YouTube có thể đang khuyến khích dùng tính năng này, thậm chí thưởng cho nó vì lý do khả năng tiếp cận, nhưng tôi vẫn thích tiêu đề tiếng Anh hơn là một tiêu đề tiếng Na Uy dịch máy xấu xí. Theo trải nghiệm của tôi, cứ thấy tiêu đề dịch máy kiểu này là tôi cài không nhận đề xuất kênh đó nữa

    • Máy tính của tôi là của người Đức nhưng được đặt sang tiếng Anh. Thế mà YouTube vẫn phát giọng dịch máy, hoặc dịch các video/quảng cáo tiếng Đức sang tiếng Anh theo kiểu rất kỳ quặc. Nhiều trường hợp thật sự rất lạ và gượng gạo

    • Không chỉ tiêu đề mà cả track audio cũng bị dịch mới là vấn đề. Khi một YouTuber tôi hay xem có cung cấp các track audio do fan làm bằng nhiều ngôn ngữ, tôi luôn phải tự chuyển lại sang bản gốc. Dịch máy thường làm mất lối chơi chữ hoặc hàm ý văn hóa. Đôi khi muốn đổi track ngôn ngữ còn phải tua lại từ đầu video, lại thêm chuyện xung đột với extension trình duyệt. Giá mà có giao diện cho phép bật/tắt tự do thay vì đặt các bản dịch này làm mặc định

    • Giờ ngay cả Google, Kagi v.v. cũng hiển thị kết quả tìm Reddit đã được dịch. Tôi tưởng mình tìm thấy câu trả lời được viết bằng ngôn ngữ của mình, nhưng thực ra chỉ là bài tiếng Anh được dịch máy

  • Trên hết, trong mọi trường hợp đều nên tránh áp dụng dịch tự động làm mặc định. Chỉ cần hiển thị rõ danh sách các ngôn ngữ thực sự đã được dịch sẵn là đủ. Nút dịch vốn đã có trong trình duyệt, người dùng muốn thì tự bật. Tiếng Anh không phải ngôn ngữ thứ nhất hay thứ hai của tôi, nhưng tôi vẫn đọc tốt. Tôi không muốn phải lục trong đống bản dịch tự động để tìm nút xem nguyên bản tiếng Anh. Ở các locale khác hiếm khi gặp chuyện này, mà ngược lại tiếng Anh lại gặp rất nhiều. Nếu đã dùng dịch máy thì nên thực sự thử chạy qua và kiểm tra xem ý định có khớp với kết quả hay không

    • Reddit hiển thị nội dung tự động dịch sang tiếng Pháp, nhưng phong cách rất riêng của Reddit gần như không thể chuyển tải trọn vẹn ngay cả khi con người dịch. Dù hoàn toàn không biết tiếng Anh, những bản dịch tự động như vậy cũng không đáng đọc. Tính năng xem nguyên bản hoặc đổi ngôn ngữ cũng khó tìm tùy theo thiết bị hay ứng dụng, chưa kể Reddit còn cứ dụ cài app

    • Dịch máy trong vài năm gần đây đã tiến bộ rất nhiều, tới mức ngay cả người bản ngữ đôi khi cũng không nhận ra đó là bản dịch

  • Điều khiến tôi khó chịu nhất là Google. Google biết tôi là ai, có đang đi du lịch không, và ngôn ngữ tôi thích là tiếng Anh, thế mà ở một số trang vẫn hiển thị theo ngôn ngữ địa phương. Tôi ước Google tận dụng dữ liệu theo dõi đó để cải thiện trải nghiệm người dùng nhiều hơn

    • Tôi là người dùng tiếng Catalan, nhưng tiếng Tây Ban Nha chưa từng được thêm vào tài khoản Google hay ngôn ngữ hệ thống/trình duyệt của tôi, vậy mà lúc nào cũng bị ép hiện tiếng Tây Ban Nha. Tôi sống ở Mỹ nhưng khi tìm kiếm liên quan đến Catalan thì Wikipedia tiếng Tây Ban Nha lại được ưu tiên hiển thị. Cách hành xử này của công cụ tìm kiếm lúc nào cũng tệ. Nó gây vấn đề cho những người như con tôi không biết tiếng Tây Ban Nha, cũng như cho các vùng nói tiếng Catalan không thuộc Tây Ban Nha. Đặc biệt, Google Gemini còn coi nội dung tiếng Catalan là nguy hiểm và chặn hội thoại. Trước kia Google rất nhạy cảm với sự đa dạng, nhưng giờ thì không còn nữa

    • Gần đây Google trên map review v.v. lại không dịch ngôn ngữ địa phương sang tiếng Anh mà cứ để nguyên. Có vẻ họ nghĩ tôi ở đó lâu thì chắc biết ngôn ngữ nước đó, nhưng rất nhiều lúc tôi thật sự cần tiếng Anh. Kết quả tìm kiếm cũng vậy. Việc tôi dùng ngôn ngữ địa phương đôi khi chỉ đơn giản là để tìm hiểu tình hình địa phương, nhưng Google lại không phản ánh được kiểu hành vi người dùng này

    • Tôi từng tranh luận trực tiếp chuyện này với một kỹ sư Google. Anh ấy nói rằng do Google dùng quy trình render hai bước nên ở trang chính họ chưa thể tận dụng thông tin người dùng để phản ánh sở thích ngôn ngữ, nhưng tôi thấy điều đó vô lý vì header Accept-Language đã có ngay trong request ban đầu

    • Google biết tôi sống ở Anh và dùng tiếng Anh. Thế nhưng khi tôi đăng nhập trên TV khách sạn ở Tây Ban Nha để xem video YouTube tiếng Anh thì lại hiện quảng cáo tiếng Tây Ban Nha. Cảm giác như Google biết rõ đó là ngôn ngữ tôi không hiểu nhưng vẫn cố làm vậy vì nhà quảng cáo

    • Cứ hễ dùng thiết bị hay trình duyệt mới là Google và các dịch vụ của họ lại khởi đầu bằng tiếng Hebrew. Tôi vẫn luôn đổi lại sang tiếng Anh, nhưng lần nào cũng phải làm lại; tôi đọc được Hebrew, nhưng vẫn thích dùng tiếng Anh như một ngôn ngữ phổ quát hơn

  • Mọi trình duyệt đều có thể gửi header Accept-Language để báo ngôn ngữ người dùng ưu tiên, và nếu quan tâm thì người dùng còn có thể tự chỉnh nó. Nhưng Accept-Language không giải quyết được mọi thứ. Lý do là phần lớn người dùng đa ngôn ngữ không có một thứ tự ưu tiên tuyệt đối, mà ưu tiên theo từng chủ đề. Ví dụ dù thông thạo tiếng Pháp, tôi vẫn không muốn đọc bản dịch tiếng Pháp của tin tức tiếng Anh. Chủ site không cần cố làm tính năng quá phức tạp; chỉ cần cung cấp giao diện đổi ngôn ngữ rõ ràng và nhanh là đủ. Wikipedia làm rất tốt điều này

    • Trên thực tế, quan trọng hơn các cơ chế như Accept-Language là cung cấp bản dịch hoàn chỉnh thay vì kiểu dịch tự động nửa vời. Với UI và nội dung do chính site tạo ra thì nên duy trì bản dịch chính thức; còn nội dung do người dùng tạo thì không nên tự động dịch, mà phải để lộ có chọn lọc qua nút dịch của trình duyệt hoặc tương tự. Tôi khuyến nghị dùng Accept-Language để chọn ngôn ngữ ưu tiên ban đầu, đồng thời cung cấp tùy chọn chuyển ngôn ngữ rõ ràng. Mỗi phiên bản ngôn ngữ của Wikipedia về bản chất là một site riêng với nội dung được viết lại riêng biệt

    • Accept-Language còn cho phép gán trọng số theo từng ngôn ngữ (q value). Website nên cho phép người dùng ghi đè ngôn ngữ mà trình duyệt yêu cầu, và trình duyệt cũng nên cung cấp các lựa chọn theo từng site như "mặc định của site", "ngôn ngữ hệ thống", "yêu cầu tiếng Anh" v.v. Lý tưởng nhất là website công khai rõ danh sách ngôn ngữ được hỗ trợ trong manifest.json hoặc nơi tương tự, rồi để phía client xử lý việc chọn ngôn ngữ

    • Giả định rằng người dùng sẽ đặt Accept-Language theo ngôn ngữ thuận tiện nhất với họ trong thực tế là khá yếu. Đa số website còn chẳng hỗ trợ Accept-Language tử tế, nên khó mà nghĩ người dùng có chiến lược gì lớn lao khi chỉnh cài đặt đó

  • Tôi từng triển khai hệ thống chọn ngôn ngữ mặc định bằng Accept-Language cho các website liên quan đến chính phủ để hỗ trợ đa ngôn ngữ và khả năng tiếp cận. Nhưng PM đã phớt lờ quyết định này và khóa mặc định chỉ còn EN (tiếng Anh). Kiểm toán viên accessibility yêu cầu phải dùng Accept-Language, và khi phát hiện phần đã triển khai bị đảo ngược, họ chỉ trích rất gay gắt. Kết quả là nhờ mấy chuyện ngớ ngẩn như vậy mà tôi có thêm vài tuần hợp đồng làm việc

  • Tôi cũng muốn kể một nỗi khổ về ngôn ngữ của mình. Trong gia đình tôi có người chỉ nói tiếng Nhật. Quốc gia tài khoản Apple của tôi là Finland. Tôi muốn xem phim The Martian với gia đình, nhưng vì track audio chỉ hiển thị các ngôn ngữ được hỗ trợ ở quốc gia tài khoản nên không thể chọn lồng tiếng Nhật. Không thể đổi quốc gia tài khoản nếu đang có gói đăng ký Apple TV còn hiệu lực. Cuối cùng cả nhà không thể xem cùng nhau

    • Tôi đoán có lẽ là do vấn đề cấp phép theo khu vực. Bản lồng tiếng đó có thể không được cấp phép để dùng tại Finland

    • Netflix cũng từng có chuyện tương tự. Ở Finland, phải đặt ngôn ngữ tài khoản sang tiếng Anh thì mới xem được Kim's Convenience. Ngay cả khi dùng phụ đề tiếng Anh, nếu UI là tiếng Phần Lan thì cũng không thể truy cập nội dung đó

  • Tôi từng tự phát triển hệ thống dùng Accept-Language để cung cấp bản dịch gần nhất nhằm hỗ trợ khả năng tiếp cận cho người dùng. Ví dụ nếu không có tiếng Bồ Đào Nha (Portugal) thì tự động cung cấp tiếng Bồ Đào Nha Brazil (biến thể Brazil). Về mặt kỹ thuật nó hoạt động tốt và triển khai cũng thú vị, nhưng trên thực tế thì đa số người dùng vẫn chỉ muốn tiếng Anh bất kể Accept-Language là gì, còn tùy chọn đổi ngôn ngữ tuy có ở footer nhưng chưa đủ dễ thấy. Vì vậy giờ tôi đổi sang hỏi trực tiếp người dùng, và mức độ hài lòng đã tăng lên đáng kể

    • "Hỏi trực tiếp" nghĩa là cứ mỗi lần vào site mà chưa lưu cookie thì lại hiện popup chọn ngôn ngữ đúng không? Mấy popup kiểu đó rất thiếu nhất quán, có cái còn không có nổi nút X thì chỉ biết cảm ơn nếu có. Trong 95 trên 100 trường hợp, chỉ cần ngôn ngữ tôi đã bấm để vào là đủ; nếu cần thì chỉ việc cho lựa chọn ngôn ngữ ở góc trên bên phải hoặc footer là tiện rồi. Mong là đừng dùng popup hay modal

    • Tốt nhất là dùng Accept-Language làm mặc định và thêm quyền lựa chọn cho người dùng. Tôi đồng ý với việc bỏ icon trong thiết kế chuyển ngôn ngữ, nhưng hơi tiếc nếu gộp nhiều vùng vào chung một ngôn ngữ

    • Phần lớn người dùng cứ để nguyên ngôn ngữ mặc định của OS, thậm chí còn không biết đổi thế nào, và dùng mãi thành quen

  • Ở nước ngoài thì mấy vấn đề này thật sự ngớ ngẩn, mà ngay cả ở nước mình, các bản localize như tài liệu lập trình cũng thường khác nội dung và chất lượng bản dịch kém. Lý tưởng nhất là tôi muốn xem nguyên bản tiếng Anh. Gần đây kết quả tìm kiếm cũng bắt đầu xuất hiện ngày càng nhiều nội dung dịch máy. Reddit cũng mới áp dụng kiểu này. Nếu tôi cố tình dùng từ khóa không phải tiếng Anh, là vì tôi muốn tìm thông tin đặc thù của chính ngôn ngữ đó

    • Có vẻ đội Reddit đã xây tính năng với giả định người dùng chỉ biết tiếng mẹ đẻ ở quốc gia mình. Nhưng trên thế giới, nhiều người hiểu nhiều ngôn ngữ nên đâu cần phải làm vậy

    • Tôi cũng từng nổi giận vì tính năng tự động chuyển ngôn ngữ theo ngôn ngữ người dùng trên tài liệu MongoDB. Trong kết quả tìm kiếm thì hiện bằng tiếng Anh, nhưng vừa mở trang là JS đổi ngay sang tiếng Bồ Đào Nha Brazil. Rồi khi tải xong hoàn toàn thì lại quay về tiếng Anh, trong khi URL vẫn là /pt-br/. Chưa kể chất lượng bản dịch rõ ràng mang mùi tự động hóa. Tôi là người dùng tiếng Bồ Đào Nha của Portugal nên những khác biệt nhỏ như vậy lại càng khó chịu