Trong 14 trên 42 ngôn ngữ của chúng tôi, dạng số nhiều được gọi là "one" không chỉ dành cho số 1

Ngôn ngữ

Chuỗi văn bản của một ứng dụng "One habit left today" có một dạng số nhiều tương ứng, "%d habits left today". Android chọn giữa chúng dựa trên phân loại: tiếng Anh dùng "one" cho số 1 và "other" cho mọi trường hợp còn lại. Trong tiếng Nga, phân loại "one" được dùng cho 1, 21, 31, 41 và cứ tiếp tục như vậy. Bộ kiểm tra bản dịch của chúng tôi đã sai hai lần trong cùng một ngày, mỗi lần theo một hướng ngược nhau.

Bản dịch đúng mà nó từ chối

Vào ngày 2 tháng 11, chúng tôi đã chạy lại Bộ công cụ dịch thuật trên ứng dụng ví dụ của nó. Đối với phân loại "one" trong tiếng Nga, mô hình đã viết "Осталась %d привычка на сегодня": "%d habit left today", kèm theo số. Bộ kiểm tra của chúng tôi so sánh nó với dạng "one" trong tiếng Anh, phát hiện thấy có %d mà bản tiếng Anh không có, và từ chối nó vì coi đó là một placeholder được bịa ra. Mô hình đã đúng. Người dùng còn 21 thói quen sẽ nhận được dạng này, nên nó phải hiển thị con số. Chúng tôi đã thay đổi bộ kiểm tra: một dạng có thể thêm số lượng mà dạng "other" trong tiếng Anh sử dụng. Lần chạy tiếp theo đã viết đúng tất cả 350 chuỗi của ứng dụng ví dụ.

Bản dịch sai mà nó lẽ ra đã chấp nhận

Cùng bộ kiểm tra đó đã cho phép trường hợp ngược lại đi qua. Nếu mô hình đã viết "Осталась одна привычка" ("one habit left"), không có gì bị mất trong chuỗi, nên nó được chấp nhận, và người dùng còn 21 thói quen sẽ được thông báo rằng họ còn một. Quy tắc cũ cho phép bất kỳ dạng "one" nào bỏ số, vì trong tiếng Anh "one" chỉ là 1.

Bây giờ bộ kiểm tra biết mỗi phân loại bao gồm những số nào, dựa trên CLDR, các quy tắc số nhiều của Unicode mà Android và ICU sử dụng. Một dạng cho phân loại bao gồm nhiều số phải hiển thị số. Một dạng cho một số duy nhất có thể bỏ số đó: "one" trong tiếng Đức chỉ là 1, nên "Noch eine Gewohnheit" là ổn ở đó.

Nơi "one" không chỉ là 1

Trong 14 trên 41 ngôn ngữ đích mà dữ liệu CLDR trong Babel 2.10 biết, "one" bao gồm nhiều hơn số 1:

Trong các tin nhắn ICU, một nhánh riêng của nó thay đổi điều này. Với =0{…} trong tin nhắn, "one" trong tiếng Pháp chỉ còn lại số 1, và bộ kiểm tra tính đến điều đó.

Đã kiểm tra so với các chuỗi của chính Android

Trước khi phát hành quy tắc, chúng tôi đã chạy thử trên các thông điệp số nhiều trong chuỗi framework của Android: 897 bản dịch trong 39 ngôn ngữ của chúng tôi. Nó không phát hiện lỗi nào. Các dịch giả của Google đặt số vào mọi nhánh bao phủ nhiều số, kể cả nhánh "one" trong tiếng Nga, ngay cả khi tiếng Anh dành riêng một nhánh cho số 1. Khi chúng tôi tự tay bỏ số khỏi một nhánh "one" trong tiếng Nga, công cụ kiểm tra cho biết dạng đó cũng được dùng cho 21, 31, 41 và 51.

Quy tắc này nằm trong translation-checks 1.2.0, miễn phí trên GitHub, dành cho thông điệp ICU, và trong Polyglot 1.2.0 cho cả số nhiều Android và thông điệp ICU. Các kiểm tra khác mà chúng tôi bổ sung tuần này nằm trong ghi chú về các ký tự thuộc hệ chữ viết khác.

Đã cập nhật: