LOCALIZEZONE KNOWLEDGE

Bản địa hóa Flutter bằng ARB: Hướng dẫn thực hành

Rà soát nguồn: 4 tháng 10 năm 2026

Trả lời nhanh

Viết thông điệp hoàn chỉnh trong ARB, giữ mã ổn định và metadata giải thích ngữ cảnh, kiểu biến. Dùng quy trình Flutter sinh API, rồi thử ngôn ngữ, nhánh và bố cục. Kiểm JSON khác với kiểm cú pháp thông điệp. Câu tiếng Việt, ngày tháng và hành trình khách vẫn cần rà trong sản phẩm; sinh mã chưa phải nghiệm thu cuối.

Điểm cần nhớ

  • Giữ thông điệp, metadata và cấu hình cùng nhau.
  • Bảo vệ tên biến, giải thích giá trị.
  • Thử không, một, nhiều theo nhiệm vụ.
  • Select chỉ dùng dữ liệu ứng dụng biết thật.
  • Kiểm đường dẫn sinh theo SDK dự án.
  • Tách widget có sẵn với nội dung riêng.
Điện thoại hiển thị ứng dụng trên nền vàng

ARB cung cấp gì cho Flutter?

ARB là gói tài nguyên dựa trên JSON với thuộc tính liên quan. Đặc tả nêu mục tài nguyên và mục thuộc tính tùy chọn.[1] Trong Flutter, chúng giúp giải thích thông điệp và đầu vào sinh mã.

Tách catalog riêng khỏi bản dịch widget có sẵn. API Material liệt kê hỗ trợ tiếng Việt.[2] Điều đó không tự dịch màn hình, lỗi hay thuật ngữ sản phẩm. Kiểm kê và nêu ai phụ trách nội dung riêng.

Gồm nhãn hỗ trợ tiếp cận, trạng thái rỗng, validation và thông báo. Trang đầu tiếng Việt nhưng lỗi tiếng Anh vẫn chưa trọn hành trình. Xác định chữ trong ảnh và dữ liệu backend vì generator không tự tìm mọi nguồn ngoài.

Cần thống nhất cấu hình nào trước?

Nêu template, thư mục ARB, nơi xuất, tên lớp và locale hỗ trợ. Flutter hướng dẫn generate: true, l10n.yaml và gen-l10n.[3] Kiểm với SDK dự án, không sao hướng dẫn cũ mà bỏ giả định.

Mẫu l10n.yaml dưới dùng lib/l10n và template app_en.arb:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart

Pubspec cần dependency và bật generation phù hợp. Đây chưa phải tệp dependency hoàn chỉnh, chưa khóa SDK đã thử. Lưu phiên bản thật khi phát hành.

Tài liệu migration Flutter mô tả chuyển import khỏi package tổng hợp flutter_gen vào mã nguồn ứng dụng.[4] Xem đầu ra hiện tại rồi import đúng. Không thêm tùy chọn migration đã cũ chỉ vì cấu hình lịch sử có.

Tệp nguồn và tiếng Việt cần chứa gì?

Giữ mã, định nghĩa biến đồng bộ khi dịch câu hoàn chỉnh. Tập mẫu có chào, đếm tài liệu và select, không phải ứng dụng hỗ trợ hoàn chỉnh. Template app_en.arb:

{
  "@@locale": "en",
  "welcome": "Welcome, {name}.",
  "@welcome": {
    "description": "Greeting using the supplied display name.",
    "placeholders": {"name": {"type": "String"}}
  },
  "documents": "{count, plural, =0{No documents attached} =1{1 document attached} other{{count} documents attached}}",
  "@documents": {
    "description": "Number of documents attached to this request.",
    "placeholders": {"count": {"type": "num"}}
  },
  "agentUpdate": "{gender, select, female{She will review your request.} male{He will review your request.} other{Our team will review your request.}}",
  "@agentUpdate": {
    "description": "Use only an explicitly known staff value; otherwise other.",
    "placeholders": {"gender": {"type": "String"}}
  }
}

Bản app_vi.arb tương ứng:

{
  "@@locale": "vi",
  "welcome": "Chào {name}.",
  "@welcome": {
    "description": "Greeting using the supplied display name.",
    "placeholders": {"name": {"type": "String"}}
  },
  "documents": "{count, plural, =0{Chưa đính kèm tài liệu} =1{Đã đính kèm 1 tài liệu} other{Đã đính kèm {count} tài liệu}}",
  "@documents": {
    "description": "Number of documents attached to this request.",
    "placeholders": {"count": {"type": "num"}}
  },
  "agentUpdate": "{gender, select, female{Nhân viên tư vấn sẽ xem xét yêu cầu.} male{Nhân viên tư vấn sẽ xem xét yêu cầu.} other{Đội ngũ sẽ xem xét yêu cầu.}}",
  "@agentUpdate": {
    "description": "Use only an explicitly known staff value; otherwise other.",
    "placeholders": {"gender": {"type": "String"}}
  }
}

Metadata mẫu là hợp đồng kỹ thuật chung. Với nền tảng dịch thật, xác nhận nó được giữ, lấy từ template hay duy trì riêng. Ngôn ngữ khách thấy và ngôn ngữ ghi chú của nhóm là hai quyết định khác nhau.

Rà biến và mô tả như thế nào?

Giữ tên, kiểu, cho phép đổi vị trí câu tự nhiên. Flutter mô tả biến trở thành đầu vào phương thức được sinh.[3] Người rà cần hiểu dữ liệu, không chỉ đếm ngoặc.

Name là người, tổ chức hay nhãn? Mẫu dùng tên hiển thị được cung cấp, không suy danh xưng. Count là tài liệu đính kèm, không phải lượt tải, số trang hay bản dịch xong. Những khác biệt này ảnh hưởng thông điệp.

Mô tả cần giải quyết mơ hồ: màn hình, sự kiện xác nhận và bước tiếp theo. “Chữ nút” kém rõ hơn mô tả nút gửi yêu cầu hay mở xem trước. Giữ vấn đề nguồn để hỏi, không buộc người dịch đoán trạng thái.

TrườngCâu hỏi ràCần ổn định
Mã thông điệpĐại diện nhiệm vụ gì?Nơi gọi, tham chiếu sinh
Mô tảGiải quyết điểm mơ hồ không?Ngữ cảnh cần qua bàn giao
Tên biếnỨng dụng cấp giá trị gì?Mã generator cần
Kiểu biếnGiá trị cấp có tương thích?Hợp đồng kỹ thuật
SelectorTrạng thái nào biết rõ?Khóa nhánh, nghĩa dự phòng
Chữ hiển thịKhớp sự kiện xác nhận?Nghĩa kinh doanh đúng

Số nhiều và select tiếng Việt nên hoạt động ra sao?

Dùng câu đầy đủ với nhánh generator cấu hình cần, rà từng trạng thái có nghĩa. Flutter mô tả plural, select.[3] Nhánh không và một trong mẫu là lựa chọn sản phẩm, không khẳng định ngữ pháp Việt luôn cần tách.

Không tài liệu là trạng thái rỗng. Một và nhiều nêu cùng sự kiện đính kèm với số khác. Tách khỏi máy chủ đã nhận hay xử lý báo giá thành công. Chọn tệp tại máy chưa chắc tải lên xong.

Mẫu gender minh họa khi nguồn đa ngôn ngữ dùng nhánh đó. Tiếng Việt có thể viết trung tính ở hai nhánh. Không suy giới tính từ tên, email hoặc vẻ ngoài. Nếu không cần khác biệt, thông điệp trung tính có thể tốt hơn thu thêm dữ liệu.

Thử nhánh dự phòng với giá trị chưa biết. Kiểm phân biệt hoa thường trong generator và mã gọi. Không nghĩ Female chắc khớp female. Ghi giá trị cho phép trong hợp đồng ứng dụng.

Dùng mã được sinh như thế nào?

Dùng lớp sinh cho delegate và supported locales, lấy thông điệp dưới ngữ cảnh đã khởi tạo. Mẫu giả định đầu ra lib/l10n/app_localizations.dart. Mã ARB cung cấp tên phương thức.

import 'package:flutter/material.dart';
import 'l10n/app_localizations.dart';

void main() => runApp(const LocalizationDemo());

class LocalizationDemo extends StatelessWidget {
  const LocalizationDemo({super.key});

  @override
  Widget build(BuildContext context) => MaterialApp(
    localizationsDelegates: AppLocalizations.localizationsDelegates,
    supportedLocales: AppLocalizations.supportedLocales,
    home: Builder(builder: (context) {
      final text = AppLocalizations.of(context)!;
      return Scaffold(
        body: SafeArea(child: Column(children: [
          Text(text.welcome('Lan')),
          Text(text.documents(3)),
          Text(text.agentUpdate('other')),
        ])),
      );
    }),
  );
}

Đây là mẫu tích hợp cần xác minh trong dự án cấu hình, chưa build SDK cho bài này. Chạy generation và analysis trong môi trường thật. Không sửa phương thức sinh thay cho ARB vì lần sinh sau có thể ghi lại.

Tiếng Việt cần thử gì trên giao diện?

Thử dấu, xuống dòng, giá trị động và toàn hành trình. Tài nguyên đúng chưa chứng minh font hoặc widget hẹp hiển thị tốt. Dùng thuật ngữ thống nhất với tài liệu hỗ trợ.

Tách ngôn ngữ, quốc gia, tiền tệ. Giao diện Việt chưa chứng minh khách ở Việt Nam hoặc trả VND. Định dạng ngày, tiền theo quy tắc sản phẩm, giữ dữ liệu gốc. Rà hướng dẫn cùng validation và phục hồi lỗi.

Không thêm đại từ thân mật máy móc vào mọi câu. Chọn giọng sản phẩm nhất quán. Onboarding, biểu mẫu và lỗi có ràng buộc khác nhưng không đổi nghĩa cùng sự kiện.

Đồng nghiệp trao đổi trước màn hình máy tính

Danh sách kiểm phát hành gồm gì?

Tách container, tài nguyên sinh và hành vi. Lưu kiểm đã làm, việc chưa giải quyết. Bảng là trường hợp tự xây dựng, thay cho đánh dấu chung “dịch xong”.

KiểmTình huốngBằng chứng đạt
JSONParse hai ARBKhông lỗi, mất thông điệp
MetadataSo mã, định nghĩa biếnTên, kiểu tương thích
Cú phápChạy generator dự ánSDK thật nhận biểu thức
CountDựng 0, 1, nhiềuĐúng sự kiện, giá trị
SelectGiá trị biết và chưa biếtĐúng nhánh hoặc dự phòng
Ngôn ngữĐổi và mở lại màn hìnhChữ riêng, widget theo chính sách
Bố cụcTên dài, cỡ chữ lớnĐọc và thao tác được
Hành trìnhĐính kèm, gỡ, gửiThông điệp theo trạng thái

Gồm tệp bị từ chối, gỡ tệp, lỗi mạng, mở lại app. Count không được mô tả dữ liệu cũ. Câu dịch đúng vẫn gây hiểu sai nếu ứng dụng chọn sai thông điệp.

Tự động so mã cần và metadata trước generation, rồi thử thông điệp qua widget hoặc integration test. Xem màn hình cho phần dữ liệu không phát hiện được. Ảnh kiểm phải gắn bản dựng và ngôn ngữ đã thử.

LocalizeZone nên dự trù ARB thế nào?

Gửi template, bản đích, SDK và màn hình khi hỏi bản địa hóa phần mềm. Nên thử nhãn, biến có kiểu, plural, select và lỗi đại diện trước giao toàn catalog.

Qua trang báo giá, nêu ngôn ngữ, nguồn, lịch và lớp rà. Nêu ai sinh, tích hợp. Dịch, kiểm tài nguyên và thử app liên quan nhưng khác đầu vào, bằng chứng.

Khi mã, kiểu hoặc nhánh nguồn đổi, rà đích và nơi gọi. Chuỗi mới không tự kế thừa phê duyệt bản cũ. Giữ cập nhật gắn quy trình đã thống nhất.

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

Flutter hỗ trợ tiếng Việt tự dịch màn hình riêng không?

Không. Component có sẵn khác nội dung sản phẩm.[2] Duy trì catalog riêng và thử cả hai trên hành trình.

Người dịch đổi tên biến được không?

Chỉ khi có thay đổi kỹ thuật thống nhất. Giữ tên, kiểu; đổi thứ tự câu thay vì phá hợp đồng.

Vì sao tách không và một?

Đó là ví dụ thông điệp đính kèm theo sản phẩm. Rà nghĩa và nhánh other, không coi quy tắc ngữ pháp Việt chung.

Có bắt buộc đại từ giới tính không?

Không. Có thể dùng trung tính. Chỉ dùng khác biệt đã biết, cần thiết, không suy danh tính.

JSON hợp lệ bảo đảm gen-l10n chạy được chưa?

Chưa. Còn biểu thức, metadata và cấu hình. Kiểm trong SDK thật trước khẳng định thành công.

Cần gửi gì đầu tiên?

ARB đại diện, nguồn, màn hình, SDK và ngôn ngữ. Nêu có rà generation, thử ứng dụng không.

Nguồn và phương pháp

Đối chiếu ARB và Flutter ngày 4 tháng 10 năm 2026. Cặp tài nguyên, Dart và bảng rà là ví dụ tự xây dựng. Có thể kiểm JSON, metadata tại máy; chưa chạy Flutter generation, Dart analysis, thiết bị hay app sản xuất cho bài này. Đọc migration trong bối cảnh phiên bản, không xem là cấu hình vĩnh viễn.

Tài liệu tham khảo

[1] Google app-resource-bundle project. Application Resource Bundle Specification.

[2] Flutter API documentation. GlobalMaterialLocalizations class.

[3] Flutter documentation. Internationalizing Flutter apps.

[4] Flutter breaking-change documentation. Localized messages are generated into source, not a synthetic package.

Bài viết liên quan