DichHay.comDịch Hay
Dịch phần mềm và ứng dụng

Số nhiều khi dịch ứng dụng: vì sao "1 items" vẫn còn và cách xử lý cho mọi ngôn ngữ

Tiếng Việt không chia số nhiều, tiếng Anh có hai dạng, tiếng Nga ba, tiếng Ả Rập sáu. Cách chuỗi plural hoạt động, quy tắc CLDR và lỗi số đếm hay gặp khi bản địa hoá.

Close-up of a Vietnamese hand arranging rows of identical wooden counting blocks on a pale linen tablecloth, overhead soft light, warm beige and teal tones, minimalist composition

Mỗi ngôn ngữ có quy tắc riêng về cách danh từ thay đổi theo số lượng. Tiếng Việt không đổi: một tin nhắn, ba tin nhắn. Tiếng Anh có hai dạng: 1 message, 3 messages. Tiếng Nga có ba dạng chính cho số nguyên tuỳ chữ số tận cùng, tiếng Ba Lan tương tự, tiếng Ả Rập có tới sáu nhóm. Ứng dụng muốn hiển thị đúng phải dùng chuỗi số nhiều (plural) — một khoá chứa nhiều biến thể, mỗi biến thể cho một nhóm số — và để thư viện chọn biến thể theo quy tắc của từng ngôn ngữ.

Lỗi "1 items" hay "You have 1 new messages" vẫn xuất hiện trong nhiều ứng dụng vì lập trình viên viết cứng một dạng, hoặc viết điều kiện "nếu bằng 1 thì số ít, còn lại số nhiều" — đúng với tiếng Anh nhưng sai với phần lớn ngôn ngữ khác. Bài này giải thích nguồn quy tắc chuẩn, cách dịch chuỗi số nhiều khi tiếng Việt là nguồn hoặc đích, và những trường hợp mà ngay cả chuỗi plural đúng chuẩn vẫn ra câu lạ.

Các nhóm số nhiều theo quy tắc của Unicode CLDR

Kho dữ liệu ngôn ngữ chung của Unicode (CLDR) định nghĩa sáu nhóm có tên cố định: zero, one, two, few, many, other. Mỗi ngôn ngữ chỉ dùng một số nhóm, và ranh giới của nhóm được định nghĩa bằng quy tắc số học chứ không chỉ bằng con số. Bảng dưới đây tóm lược vài ngôn ngữ hay gặp; khi làm thật, luôn tra bảng quy tắc CLDR hiện hành vì quy tắc có thể được tinh chỉnh qua các phiên bản.

Ngôn ngữCác nhóm dùngGhi chú
Tiếng Việt, tiếng Nhật, tiếng Hàn, tiếng Trung, tiếng TháiotherMột dạng duy nhất cho mọi số
Tiếng Anh, tiếng Đứcone, otherone chỉ áp cho đúng số 1
Tiếng Phápone, many, otherSố 0 và 1 đều thuộc nhóm one — "0 fichier" chứ không phải "0 fichiers"
Tiếng Nga, tiếng Ukrainaone, few, many, otherTheo chữ số tận cùng: 1, 21, 31 dùng một dạng; 2–4, 22–24 dạng khác; 5–20 dạng khác nữa
Tiếng Ba Lanone, few, many, otherGiống tiếng Nga ở nhóm few nhưng số 1 chỉ đúng khi đứng một mình, không áp cho 21
Tiếng Ả Rậpzero, one, two, few, many, otherCó dạng riêng cho số 0 và số 2

Điều quan trọng với người đặt dịch: số lượng biến thể là thuộc tính của ngôn ngữ đích, không phải của ngôn ngữ nguồn. Tệp tiếng Việt chỉ có một dạng, nhưng khi dịch sang tiếng Nga, khoá đó phải nở ra bốn dạng. Nếu công cụ hay định dạng tệp không cho thêm nhóm, bản dịch tiếng Nga chắc chắn sai ở một phần các con số.

Chuỗi số nhiều được viết thế nào trong tệp

Android dùng thẻ plurals trong tệp XML: một khoá, bên trong có các mục item đánh dấu quantity là one, few, other… Nền tảng của Apple dùng tệp .stringsdict hoặc danh mục chuỗi mới, nơi một khoá chứa từ điển các biến thể. Ứng dụng web thường dùng cú pháp ICU MessageFormat, viết gọn trong một chuỗi dạng {count, plural, one {# tin nhắn} other {# tin nhắn}}, hoặc quy ước hậu tố khoá như _one, _other của một số thư viện JSON.

Người dịch không cần viết cú pháp từ đầu nhưng phải nhận ra cấu trúc để chỉ dịch phần chữ. Trong ví dụ ICU ở trên, các từ plural, one, other là từ khoá, không dịch; dấu thăng là chỗ thư viện điền con số đã định dạng; dấu ngoặc nhọn phải cân. Khi dịch sang ngôn ngữ cần nhiều nhóm hơn bản nguồn, người dịch thêm nhánh few hoặc many — việc này công cụ dịch chuyên dụng thường tự gợi ý dựa trên ngôn ngữ đích.

Chiều ngược lại cũng cần chú ý. Khi tiếng Anh là nguồn và tiếng Việt là đích, tệp nguồn có hai nhánh one và other nhưng tiếng Việt chỉ có other. Một số công cụ vẫn bắt điền cả hai nhánh; điền giống nhau là an toàn. Một số công cụ chỉ giữ nhánh other cho tiếng Việt — cũng đúng. Sai lầm là xoá hẳn cấu trúc plural và dịch thành chuỗi thường, khiến tệp đích không khớp kiểu với tệp nguồn.

Những lỗi số đếm hay gặp dù đã dùng chuỗi plural

Dùng nhóm one như nghĩa "số ít". Người viết nhánh one là "Bạn có một tin nhắn mới" — viết chữ "một" thay cho dấu thăng. Với tiếng Anh thì vô hại vì one chỉ ứng với 1, nhưng nếu chép cấu trúc đó sang tiếng Nga, nhánh one áp cho cả 21, 31, 101 và màn hình sẽ nói "một" khi thật ra là 21. Luôn giữ con số trong mọi nhánh trừ khi tài liệu ngôn ngữ đích nói khác.

Số 0 bị bỏ quên. Tiếng Anh viết "0 messages" nghe máy móc; nhiều sản phẩm muốn hiện "Chưa có tin nhắn nào". Đó là quyết định trải nghiệm, nên làm bằng một điều kiện riêng trong mã hoặc nhánh =0 trong ICU, không nên nhét vào nhánh zero vì phần lớn ngôn ngữ không dùng nhóm zero.

Số thập phân và phân số. "1.5 hours" trong tiếng Anh dùng nhánh other; tiếng Pháp lại xếp 1,5 vào nhóm one. Quy tắc CLDR có tính tới phần thập phân; thư viện cũ hoặc tự viết thì không. Gặp chuỗi có số lẻ như khoảng cách, cân nặng, giờ, nên kiểm riêng.

Số nhiều lồng nhau. "%d files in %d folders" có hai số, mỗi số chi phối một danh từ. Một chuỗi plural chỉ chọn theo một biến. Cách đúng là tách thành hai chuỗi plural rồi ghép bằng một chuỗi có biến đặt tên, hoặc viết lại câu thành "Tệp: %d · Thư mục: %d".

Danh từ đi kèm thay đổi loại từ trong tiếng Việt. Tiếng Việt không chia số nhiều nhưng cần loại từ đúng: "3 chiếc ghế", "3 bộ hồ sơ", "3 lượt xem". Nếu danh từ là biến, loại từ cố định trong chuỗi sẽ sai với một số giá trị. Giải pháp thường là bỏ loại từ ("3 sản phẩm", "3 mục") hoặc chuyển danh từ thành tiêu đề cột.

Kiểm tra chuỗi số nhiều trước khi phát hành

Danh sách dưới đây dùng được cho người kiểm thử ngôn ngữ, kể cả khi không đọc được ngôn ngữ đích, miễn có người bản xứ xác nhận kết quả:

  1. Liệt kê mọi khoá plural trong tệp nguồn; với mỗi ngôn ngữ đích, đối chiếu số nhánh với bảng quy tắc CLDR của ngôn ngữ đó.
  2. Dựng bộ số kiểm thử đại diện cho mọi nhóm: 0, 1, 2, 3, 5, 11, 21, 22, 25, 101, 1.5. Với tiếng Nga và tiếng Ba Lan, các số 21, 22, 25 là quan trọng nhất.
  3. Đưa ứng dụng vào trạng thái hiển thị từng con số đó, hoặc dùng màn hình gỡ lỗi cho phép nhập số thử.
  4. Chụp màn hình từng trường hợp và nhờ người bản xứ đọc.
  5. Kiểm định dạng số đi kèm: dấu phân cách hàng nghìn và thập phân theo vùng (tiếng Việt dùng dấu chấm cho hàng nghìn, dấu phẩy cho phần thập phân).
  6. Ghi lại chuỗi nào đang viết cứng điều kiện "bằng 1" trong mã để chuyển sang thư viện plural.

Bước 6 thường phát hiện nhiều lỗi hơn cả năm bước trên cộng lại, vì chuỗi plural trong tệp có thể đúng mà mã lại không gọi tới nó. Khi tìm trong mã thấy các câu so sánh số lượng với 1 nằm cạnh lệnh lấy chuỗi, gần như chắc chắn đó là chỗ cần sửa. Khi dịch sang các ngôn ngữ có nhiều nhóm số nhiều, Dịch Hay gửi kèm bộ ảnh chụp theo từng con số kiểm thử để người bản xứ duyệt một lượt.

Khi tiếng Việt là ngôn ngữ nguồn

Doanh nghiệp Việt Nam viết ứng dụng bằng tiếng Việt trước thường không nghĩ tới số nhiều, vì tiếng mẹ đẻ không cần. Đến lúc dịch sang tiếng Anh mới phát hiện hàng trăm chuỗi kiểu "%d sản phẩm" là chuỗi thường. Dịch thành "%d products" thì sai với số 1; dịch thành "%d product(s)" thì đúng mà xấu, và không áp được cho tiếng Nga hay tiếng Ả Rập về sau.

Cách làm bền là trong lúc viết tiếng Việt, đánh dấu mọi chuỗi có con số đứng trước danh từ đếm được và khai báo chúng là chuỗi plural ngay từ đầu, dù tiếng Việt chỉ có một nhánh. Việc này gần như không tốn thêm công khi viết, nhưng tiết kiệm cả một đợt sửa mã khi mở thêm ngôn ngữ. Người viết nội dung tiếng Việt cũng nên tránh những cấu trúc mà ngôn ngữ khác khó dịch, như ghép con số vào giữa một cụm danh từ dài.

Thêm một việc nên làm sớm: thống nhất cách viết số trong chuỗi nguồn tiếng Việt. Có đội viết "3 sản phẩm", có đội viết "ba sản phẩm" cho số nhỏ theo thói quen văn viết. Trong giao diện, con số luôn nên là biến được định dạng bởi thư viện, không viết bằng chữ, vì người dịch và thư viện plural chỉ làm việc được với con số. Chữ số viết bằng chữ chỉ hợp ở văn bản dài như bài hướng dẫn, nơi không có biến. Quy ước này nên ghi vào hướng dẫn văn phong cùng lúc với quy ước xưng hô và viết hoa, để mọi người viết nội dung trong đội làm giống nhau từ bản đầu tiên.

Một mẹo cho người viết nguồn: thay vì "Bạn có 3 đơn chờ xử lý và 2 đơn đang giao", hãy tách thành hai dòng thông tin hoặc hai chuỗi plural riêng. Câu ngắn, một con số một chuỗi, là dạng thân thiện nhất với mọi ngôn ngữ đích.

Số nhiều ngoài con số: danh sách, đại từ và động từ

Số lượng không chỉ ảnh hưởng tới danh từ. Trong tiếng Anh, động từ đi theo chủ ngữ: "1 person likes this", "3 people like this". Trong tiếng Pháp và tiếng Tây Ban Nha, tính từ và quá khứ phân từ cũng chia theo số và giống. Một chuỗi plural tốt chứa cả câu, để người dịch chia mọi thành phần cho khớp trong từng nhánh — đó là lý do không nên tách phần "likes this" thành một chuỗi riêng.

Danh sách tên cũng là một dạng số nhiều. "An, Bình và 3 người khác đã thích ảnh của bạn" cần biết cách nối danh sách theo ngôn ngữ: tiếng Anh dùng dấu phẩy và "and", tiếng Việt dùng dấu phẩy và "và", một số ngôn ngữ dùng dấu nối riêng. Thư viện quốc tế hoá hiện đại có hàm định dạng danh sách theo vùng; ứng dụng tự nối bằng dấu phẩy và chữ "and" viết cứng sẽ để lại chữ "and" giữa câu tiếng Việt.

Với tiếng Việt, cần chú ý thêm cách dùng "các" và "những". Bản dịch máy hay thêm "các" trước mọi danh từ số nhiều của tiếng Anh, sinh ra "Xoá các mục đã chọn" ở chỗ chỉ có một mục được chọn. Nếu số lượng có thể là 1, hãy viết trung tính: "Xoá mục đã chọn".

Câu hỏi thường gặp

Tiếng Việt chỉ có một dạng, vậy người dịch tiếng Việt có cần quan tâm plural không?

Có, theo hai cách. Khi dịch sang tiếng Việt, cần giữ đúng cấu trúc plural của tệp để không làm hỏng định dạng, và chọn cách viết đúng với mọi số, tránh "các" khi số có thể là 1. Khi tiếng Việt là nguồn, cần khai báo chuỗi có số là plural từ đầu để người dịch các ngôn ngữ khác có chỗ điền đủ nhánh.

Quy tắc số nhiều CLDR có thay đổi không?

Có thể được tinh chỉnh giữa các phiên bản, ví dụ bổ sung nhóm cho số lớn hoặc số thập phân ở một số ngôn ngữ. Thư viện của hệ điều hành và trình duyệt cập nhật theo. Khi dự án dùng thư viện tự đóng gói, nên kiểm phiên bản dữ liệu CLDR đi kèm và cập nhật định kỳ.

Có nên viết "sản phẩm(s)" hoặc "item(s)" cho nhanh không?

Cách này chấp nhận được cho công cụ nội bộ nhưng không nên dùng cho sản phẩm hướng tới người dùng. Nó không giải quyết được ngôn ngữ có nhiều hơn hai dạng, và người dùng bản xứ nhận ra ngay đây là ứng dụng chưa được bản địa hoá cẩn thận.

Làm sao kiểm số nhiều tiếng Nga khi không có ai biết tiếng Nga trong nhóm?

Dựng bộ số kiểm thử theo quy tắc CLDR, chụp màn hình từng trường hợp và gửi cho người dịch hoặc người kiểm thử bản xứ xác nhận. Không cần đọc được tiếng Nga để biết mỗi nhánh có được hiển thị đúng con số hay không; phần ngữ pháp trong từng nhánh thì phải có người bản xứ.

Số tiền có cần chuỗi plural không?

Thường không cần cho tiếng Việt và tiếng Anh vì đơn vị tiền ít khi chia số, nhưng một số ngôn ngữ chia cả tên đơn vị tiền theo số. An toàn nhất là dùng hàm định dạng tiền tệ theo vùng của thư viện, để nó tự đặt ký hiệu, dấu phân cách và vị trí ký hiệu tiền đúng quy ước.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Gửi yêu cầu dịch

Cho biết loại dịch vụ, ngôn ngữ và nơi bản dịch sẽ dùng. Chúng tôi xem yêu cầu, liên hệ lại để nhận tệp mẫu hoặc chương trình sự kiện và báo phương án phù hợp.

Thông tin chỉ dùng để liên hệ về yêu cầu dịch của bạn. Đừng dán tài liệu mật vào ô ghi chú — chúng tôi sẽ hướng dẫn cách gửi tệp an toàn khi liên hệ lại.