aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android plurals: vì sao getQuantityString cần truyền count hai lần?

Suong Nguyen by Suong Nguyen
26/10/2026
in Lập trình Mobile
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Một thông báo số lượng có thể đúng bằng tiếng Việt nhưng sai khi ứng dụng chuyển sang tiếng Anh. Một lỗi khác là đã chọn đúng plural mà màn hình vẫn hiện placeholder hoặc phát sinh lỗi format. Hai việc chọn dạng ngữ pháp và đưa số vào chuỗi cần được phân biệt rõ.

Bài dùng một thông báo số mục trong giỏ hàng để minh họa. Tài liệu Android được đối chiếu ngày 26/10/2026. XML đã qua kiểm tra cú pháp tại máy; Kotlin được rà theo API nhưng chưa build resource hoặc chạy app trên thiết bị. Các câu hiển thị bên dưới là kỳ vọng của ví dụ, không phải kết quả kiểm thử APK đã thực hiện.

1. Để resource quyết định ngữ pháp

Tài liệu string resources mô tả plural theo quy tắc ngữ pháp của locale. Các tên zero, one, two, few, many và other không phải một bảng if cố định theo giá trị số. Chẳng hạn, thêm nhánh zero không khiến tiếng Anh tự dùng nó cho số 0.

Vì vậy, không nối một danh từ rồi tự thêm hậu tố trong Kotlin. Tạo resource theo ngôn ngữ và để hệ thống chọn nhánh cần dùng. Bản dịch cũng cần được review theo câu đầy đủ, không chỉ dịch từng từ rời.

2. Có bộ resource mặc định đầy đủ

Ví dụ chọn tiếng Anh làm bộ mặc định tại res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="cart_empty">Your cart is empty.</string>
    <plurals name="cart_items">
        <item quantity="one">%1$d item in the cart.</item>
        <item quantity="other">%1$d items in the cart.</item>
    </plurals>
</resources>

Thêm res/values-vi/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="cart_empty">Giỏ hàng đang trống.</string>
    <plurals name="cart_items">
        <item quantity="one">%1$d mục trong giỏ hàng.</item>
        <item quantity="other">%1$d mục trong giỏ hàng.</item>
    </plurals>
</resources>

Trong bản Việt của ví dụ, hai nhánh dùng cùng cách diễn đạt. Đây không phải chỉ thị buộc Android chọn one; lựa chọn vẫn theo locale. Tên resource và placeholder được giữ nhất quán để code dùng chung.

Hướng dẫn localization nhấn mạnh vai trò bộ resource mặc định khi locale không có bản dịch phù hợp. Chỉ có values-en không đồng nghĩa bạn đã cung cấp một bộ mặc định đầy đủ. Hãy xác định ngôn ngữ mặc định của sản phẩm rồi đặt tất cả resource cần thiết vào bộ đó.

3. Tách quantity khỏi format argument

Trong module Android của bạn, thay import R mẫu bằng namespace đúng của dự án:

import android.content.Context
import com.example.app.R

fun cartMessage(context: Context, count: Int): String {
    require(count >= 0) { "count must be non-negative" }
    if (count == 0) {
        return context.getString(R.string.cart_empty)
    }
    return context.resources.getQuantityString(
        R.plurals.cart_items,
        count,
        count
    )
}

Count thứ nhất sau resource ID dùng để chọn plural. Count còn lại là đối số điền vào %1$d. Nếu chuỗi có placeholder mà chỉ truyền quantity, bạn chưa cung cấp đầy đủ dữ liệu cho bước format. Tài liệu Android giải thích cùng sự phân biệt này cho cả API resource và hàm plural trong Compose.

Nếu thông báo không có số cần format, lời gọi sẽ có nhu cầu tham số khác. Đừng thêm hoặc bỏ một count chỉ để đoạn code trông ngắn; hãy xem chuỗi resource và overload đang dùng có khớp nhau không.

4. Empty state là quyết định sản phẩm riêng

Trong hàm mẫu, số 0 được xử lý bằng string cart_empty. Đó là lựa chọn giao diện muốn dùng thông báo “giỏ hàng đang trống”, không phải một mẹo sửa plural rule. Bạn cũng có thể chọn hiển thị số lượng bằng plural ở trường hợp 0 nếu sản phẩm muốn vậy.

Không mã hóa quy tắc giao diện “không có mục” bằng cách chỉ thêm quantity zero rồi kỳ vọng mọi locale dùng nhánh đó. Quy tắc ngữ pháp và trạng thái UI có thể cần hai đường xử lý riêng, như ví dụ đang thể hiện.

Require trong ví dụ coi số âm là lỗi đầu vào của chương trình. Nếu dữ liệu từ nơi khác có thể không hợp lệ, xác thực ở ranh giới nhận dữ liệu và quyết định phản hồi phù hợp; đừng dùng plurals để che một số lượng sai.

Kiểm tra trên ứng dụng

Thử count bằng 0, 1 và 2 cho cả locale Việt và Anh. Với nhánh số 0 của hàm mẫu, kỳ vọng là câu empty state. Với 1 và 2 ở tiếng Anh, kiểm tra item/items; với tiếng Việt, kiểm tra số được chèn đúng và câu không còn placeholder.

Tiếp tục thử một locale chưa có file riêng để kiểm tra fallback về bộ mặc định. Xác nhận màn hình lấy resource từ context phù hợp cấu hình ngôn ngữ hiện tại của app, và có dựng lại text sau khi đổi ngôn ngữ.

Lỗi thường gặp

Nếu gặp lỗi format, rà loại placeholder và danh sách đối số. Nếu mất resource ở một locale, kiểm tra tên key và bộ values mặc định. Nếu câu số 0 không như mong đợi, xem bạn đang cần plural theo ngữ pháp hay một empty state riêng.

Không đưa một chuỗi đã dịch vào Kotlin chỉ vì bản Việt hiện chưa cần biến đổi danh từ. Khi ngôn ngữ hoặc yêu cầu câu chữ thay đổi, resource giúp nhóm review và kiểm thử có hệ thống hơn.

Kết luận

Quantity chọn dạng ngữ pháp, còn format argument đưa dữ liệu vào câu. Giữ resource mặc định đầy đủ, để bản dịch quản lý câu chữ và xử lý empty state có chủ đích sẽ giúp luồng hiển thị số lượng dễ bảo trì hơn.

Nguồn tham khảo

  • Android: quantity strings và formatting
  • Android: localization và default resources

Tags: AndroidLocalizationPlurals
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android WorkManager định kỳ: chu kỳ sáu giờ không phải giờ chạy chính xác

by Suong Nguyen
25/10/2026
0

Dùng PeriodicWorkRequest và unique work để hiểu lịch nền có ràng buộc, tránh kỳ vọng chạy chính xác theo đồng hồ hoặc tạo trùng lịch.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android SavedStateHandle: giữ bộ lọc khi process bị hệ thống tạo lại

by Suong Nguyen
24/10/2026
0

Phân biệt ViewModel, SavedStateHandle và lưu trữ bền vững để phục hồi đúng trạng thái tìm kiếm trên Android.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android Photo Picker: chọn ảnh bằng URI và quản lý quyền đọc đúng vòng đời

by Suong Nguyen
23/10/2026
0

Tạo luồng chọn một ảnh bằng Activity Result, xử lý hủy chọn và giữ quyền URI khi cần upload nền.

Minh hoạ điều hướng giữa các màn hình trong React Native bằng stack và tab

Deep link mobile an toàn: đúng domain chưa đủ, còn route và quyền đọc

by Suong Nguyen
22/10/2026
0

Tách xác minh domain, phân tích route và kiểm tra quyền để link mở đúng màn hình mà không tự cấp quyền truy cập dữ liệu.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native Image: cover và contain khác nhau trong cùng một khung ảnh
  • JavaScript sort: vì sao số 10 đứng trước 2 và mảng gốc bị đổi?
  • Android plurals: vì sao getQuantityString cần truyền count hai lần?

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply