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 getString: dùng placeholder có thứ tự để dịch nguyên câu

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

Một màn hình hiển thị tên người dùng và tên nhóm. Cách nối các mảnh text trong Kotlin có thể chạy với tiếng Việt nhưng làm người dịch khó đổi thứ tự từ. Giữ nguyên câu trong resource và đánh số placeholder giúp tách cấu trúc ngôn ngữ khỏi thứ tự truyền dữ liệu.

Bài đối chiếu Android String resources, Context.getString và hướng dẫn localization ngày 02/11/2026. Overload getString(int, Object...) có từ API 1. XML đã được parse cục bộ; Kotlin được rà thủ công, chưa build bằng Android SDK, chạy emulator hay instrumentation test. Các câu dịch là ví dụ biên tập, chưa qua người dịch bản địa.

Định nghĩa hợp đồng của hai arguments

Quy ước argument 1 là tên người dùng, argument 2 là tên nhóm. Cả hai là chuỗi text hiển thị. Chúng ta không dùng số lượng nên không xử lý quy tắc số ít, số nhiều trong ví dụ này.

Đặt nội dung mặc định của app demo vào app/src/main/res/values/strings.xml. Nếu file đã tồn tại, thêm các string bên trong phần tử resources hiện tại, không tạo hai root:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="member_summary">%1$s thuộc nhóm %2$s</string>
    <string name="demo_user_name" translatable="false">An</string>
    <string name="demo_team_name" translatable="false">Mobile</string>
</resources>

Tên demo được đánh dấu không dịch để người dịch tập trung vào khuôn câu. Trong ứng dụng thật, chúng thường đến từ dữ liệu nghiệp vụ. Đừng dùng tên resource của demo làm quy tắc lưu toàn bộ tên người dùng trong file XML.

Cho bản dịch đổi vị trí placeholder

Tạo app/src/main/res/values-en/strings.xml cho ví dụ tiếng Anh:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="member_summary">Team %2$s includes %1$s</string>
</resources>

Bản dịch đưa nhóm lên trước nhưng vẫn dùng %2$s cho tên nhóm. Code Kotlin không cần đảo arguments theo từng locale. Giữ một hợp đồng truyền dữ liệu ổn định sẽ dễ review hơn nhiều nhánh nối chuỗi theo ngôn ngữ.

Ví dụ cố ý đổi cả cấu trúc câu để thấy vị trí dữ liệu, không khẳng định đây là bản dịch duy nhất hay phù hợp mọi màn hình. Khi tích hợp sản phẩm, hãy gửi cho người dịch ý nghĩa từng placeholder và ảnh ngữ cảnh.

Lấy câu đã format bằng Context

Hàm dưới nhận Context và TextView của màn hình đã tạo, không cần giả định một ID layout cụ thể:

import android.content.Context
import android.widget.TextView

fun bindMemberSummary(context: Context, target: TextView) {
    val userName = context.getString(R.string.demo_user_name)
    val teamName = context.getString(R.string.demo_team_name)
    target.text = context.getString(
        R.string.member_summary,
        userName,
        teamName,
    )
}

Đặt hàm trong package module app để R là lớp resource do chính app sinh ra; không import android.R. Gọi hàm từ màn hình sau khi có TextView hợp lệ. Context cần phản ánh cấu hình ngôn ngữ đang dùng ở màn hình đó; ví dụ không tự thay đổi locale hay thiết lập ngôn ngữ riêng cho app.

Với dữ liệu demo, câu mong muốn khi dùng resource mặc định là “An thuộc nhóm Mobile”; resource tiếng Anh tạo “Team Mobile includes An”. Đây là kết quả suy ra từ hợp đồng format để kiểm tra trên app, chưa phải output đã quan sát từ thiết bị trong bài.

Kiểm tra trước khi giao bản dịch

Giữ đủ resource mặc định trong values, kể cả khi bạn đã thêm values-en. Android cần bộ mặc định để fallback khi một bản dịch không có key. Hai file có cùng tên member_summary phải giữ đúng ý nghĩa và loại của arguments.

Thử tên rỗng, tên dài, chữ có dấu và ký tự % trong dữ liệu. Dữ liệu được truyền làm argument, không dùng chính chuỗi do người dùng nhập làm format template. Nếu XML chứa ký tự & hoặc < trong text, cần escape theo XML; việc format placeholder không thay cho bước viết XML hợp lệ.

Trên project thật, chạy build và Android lint, đổi ngôn ngữ mặc định/tiếng Anh, rồi quan sát đúng thứ tự và khả năng xuống dòng của TextView. Parse XML cục bộ chỉ xác nhận cấu trúc XML, không kiểm chứng AAPT, resource merging hay cách UI hiển thị.

Những lỗi dễ gặp

%s không đánh số khiến hợp đồng vị trí khó thấy hơn khi câu có nhiều dữ liệu. Đổi loại placeholder trong một bản dịch có thể tạo lỗi format ở runtime. Ghép các mảnh câu riêng lẻ trong code cũng khiến người dịch không thể chủ động đặt dấu câu và đổi thứ tự.

Giữ nguyên câu làm đơn vị dịch, mô tả rõ arguments và kiểm tra cả fallback là ba việc nhỏ giúp phần text dễ duy trì. Nếu chuyển sang nội dung có số lượng, hãy thiết kế plurals riêng thay vì nhân rộng khuôn câu hiện tại.

Nguồn tham khảo

  • Android: string resources và formatting
  • Android: Context.getString và formatArgs
  • Android: localization và bộ resource mặc định

Tags: AndroidKotlinLocalization
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 Intent extra: thiếu dữ liệu khác với giá trị 0

by Suong Nguyen
01/11/2026
0

Kết hợp hasExtra, getIntExtra và kiểm tra phạm vi để phân biệt không truyền dữ liệu, giá trị hợp lệ bằng 0 và dữ liệu sai.

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

Android FileProvider: chia sẻ file cache bằng content URI

by Suong Nguyen
31/10/2026
0

Khai báo thư mục chia sẻ hẹp, tạo content URI và cấp quyền đọc tạm thời khi gửi một file qua Android Sharesheet.

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

Android ACTION_VIEW: mở liên kết HTTPS và xử lý khi không có app nhận

by Suong Nguyen
30/10/2026
0

Mở một URL cố định từ Activity, xử lý ActivityNotFoundException và tránh coi resolveActivity là điều kiện bắt buộc để launch.

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

Android NumberFormat: tách locale, mã tiền tệ và giá trị cần hiển thị

by Suong Nguyen
29/10/2026
0

Định dạng giá trị VND và USD bằng locale rõ ràng, giữ số liệu gốc và phát hiện phần lẻ không phù hợp trước khi hiển thị.

Next Post
Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Object.freeze chỉ đóng băng nông: giải thích bằng assertion

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 onLayout: đo vùng card thay vì lấy chiều rộng cửa sổ
  • Object.freeze chỉ đóng băng nông: giải thích bằng assertion
  • Android getString: dùng placeholder có thứ tự để dịch nguyên câu

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