Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Một ứng dụng chỉ có tiếng Anh hay chỉ có tiếng Việt sẽ bỏ lỡ nhiều người dùng. Localization là việc làm cho ứng dụng thích ứng với ngôn ngữ và vùng miền khác nhau. Làm sớm thì nhẹ nhàng, làm muộn thì phải sửa rất nhiều chỗ. Bài viết giới thiệu cách tiếp cận và các lỗi thường gặp.
Internationalization (i18n) là thiết kế ứng dụng sao cho có thể hỗ trợ nhiều ngôn ngữ mà không phải sửa mã. Localization (l10n) là việc thực hiện dịch và điều chỉnh cho từng vùng cụ thể. Bạn làm i18n một lần, rồi l10n cho mỗi ngôn ngữ mới.
Đừng viết chữ trực tiếp trong giao diện như Text('Đăng nhập'). Hãy đưa mọi chuỗi hiển thị vào tệp tài nguyên theo ngôn ngữ, rồi giao diện tham chiếu bằng khóa. Khi cần thêm ngôn ngữ, chỉ cần thêm một tệp dịch.
Flutter dùng tệp ARB (Application Resource Bundle), định dạng JSON. Khai báo trong pubspec.yaml bật generate: true và thêm gói flutter_localizations cùng intl, rồi tạo tệp cấu hình l10n.yaml. Ví dụ hai tệp ARB:
// lib/l10n/app_vi.arb
{
"@@locale": "vi",
"loginButton": "Đăng nhập",
"welcomeUser": "Xin chào, {name}!",
"@welcomeUser": {
"placeholders": { "name": { "type": "String" } }
},
"itemCount": "{count, plural, =0{Không có mục nào} other{{count} mục}}",
"@itemCount": {
"placeholders": { "count": { "type": "int" } }
}
}
// lib/l10n/app_en.arb
{
"@@locale": "en",
"loginButton": "Log in",
"welcomeUser": "Hello, {name}!",
"@welcomeUser": {
"placeholders": { "name": { "type": "String" } }
},
"itemCount": "{count, plural, =0{No items} =1{1 item} other{{count} items}}",
"@itemCount": {
"placeholders": { "count": { "type": "int" } }
}
}
Sau khi tạo mã, sử dụng trong giao diện:
Text(AppLocalizations.of(context)!.welcomeUser('Bem'))
res/values/strings.xml cho ngôn ngữ mặc định và values-vi, values-en... cho từng ngôn ngữ; gọi bằng stringResource(R.string.login) trong Compose.String(localized:) hoặc Text("key") trong SwiftUI.import 'package:intl/intl.dart';
final money = NumberFormat.currency(locale: 'vi_VN', symbol: '₫');
print(money.format(1250000));
final date = DateFormat.yMMMMd('vi').format(DateTime(2025, 3, 8));
Mặc định theo ngôn ngữ thiết bị, nhưng nên có tùy chọn đổi ngôn ngữ trong cài đặt. Lưu lựa chọn và áp dụng ngay không cần khởi động lại nếu có thể. Cũng cần có ngôn ngữ dự phòng khi thiếu bản dịch cho một khóa.
Mô tả ứng dụng, ảnh chụp màn hình và từ khóa trên Google Play và App Store cũng có thể bản địa hóa, giúp người dùng ở mỗi nơi tìm thấy bạn dễ hơn.
Hãy đưa mọi chuỗi ra tệp tài nguyên ngay từ đầu, dùng tham số và plural thay vì nối chuỗi, và thiết kế bố cục chịu được văn bản dài. Làm như vậy việc thêm ngôn ngữ mới sau này chỉ còn là chuyện dịch.
Đừng chỉ dịch rồi tin là xong. Hãy chạy ứng dụng ở từng ngôn ngữ và duyệt mọi màn hình để tìm văn bản bị tràn, bị cắt hoặc còn sót tiếng gốc. Thử đổi ngôn ngữ hệ thống khi ứng dụng đang chạy để chắc nó cập nhật đúng. Một mẹo hay là tạo một ngôn ngữ giả có chuỗi dài hơn nhiều để phát hiện sớm vấn đề bố cục trước khi có bản dịch thật.
Để học cách xây dựng ứng dụng sẵn sàng cho nhiều thị trường, bạn có thể xem các khóa học tại codebem.com.
Nguyễn Đình Cường
0 comment