Quy trình bản địa hóa cho giao diện web và native bền vững
Một quy trình bản địa hóa thực tế: tổ chức khóa dịch, xác định quyền sở hữu rõ ràng, xử lý dạng số nhiều, và chạy QA để giao diện web và native không bị hỏng.

Những gì sai khi bản địa hóa không được quản lý
Bản địa hóa thiếu quản lý thường thất bại theo những cách nhỏ khó chịu trước, rồi sau đó theo những cách tốn kém. Một nhãn vừa vặn hôm qua thì hôm nay bị tràn. Một khóa thiếu xuất hiện dưới dạng định danh thô. Một dạng số nhiều nghe ổn trong tiếng Anh lại trở nên sai, thậm chí là thô lỗ, trong ngôn ngữ khác.
Đa số nhóm kết thúc bằng cách sửa cùng những vấn đề đó trong áp lực:
- Nút bị cắt chữ, tiêu đề bị cụt, hoặc văn bản chồng lên icon
- Khóa thiếu rơi về tiếng Anh hoặc hiển thị tên khóa
- Dạng số nhiều sai (ví dụ: "1 items") và ngữ pháp bị hỏng trong các ngôn ngữ phân biệt giống
- Từ ngữ không nhất quán cho cùng một khái niệm trên nhiều màn hình
- Sửa lỗi phút chót vì một màn hình được phát hành thiếu bản dịch
Màn hình web và native thường hỏng theo những cách khác nhau. Trên web, layout linh hoạt có thể che giấu vấn đề cho đến khi một viewport hoặc trình duyệt cụ thể phơi bày nó. Văn bản có thể xuống hàng bất ngờ, làm đẩy nút xuống, hoặc phá vỡ lưới. Trên app native, khoảng cách nghiêm ngặt hơn. Một bản dịch dài có thể đẩy các phần tử quan trọng ra khỏi màn hình, va chạm với kích thước font truy cập, hoặc bị cắt vì một component không tự co giãn.
Một quy trình bản địa hóa vững chắc ngăn hầu hết điều này bằng cách làm cho khóa ổn định, bản dịch dễ rà soát và kiểm tra UI trở nên thường xuyên. Nó giúp bạn phát hành cập nhật ít bất ngờ hơn. Điều nó không thể sửa là văn bản nguồn mơ hồ. Nếu bản gốc không rõ ràng (như "Open" hoặc "Apply" mà không có ngữ cảnh), bản dịch vẫn là một phỏng đoán.
Một định nghĩa đơn giản về thành công không phải là "mọi thứ được dịch." Mà là:
- UI đọc được trên cả web và native
- Cập nhật nhanh vì khóa không liên tục thay đổi
- QA phát hiện vấn đề trước người dùng
Ví dụ: nếu màn hình giỏ hàng hiển thị "{count} item(s)", chuỗi không quản lý dẫn đến dạng số nhiều vụng về và khoảng cách bị vỡ. Cách tiếp cận có quản lý bắt buộc quy tắc chia số nhiều đúng và phát hiện nút tăng 30% ở tiếng Đức trước khi phát hành.
Quyết định quyền sở hữu và một nguồn chân lý duy nhất
Quy trình bản địa hóa tan vỡ nhanh nhất khi không ai trả lời được câu hỏi: “Văn bản thực sự là gì?” Chọn một nguồn chân lý duy nhất cho chuỗi và làm cho điều đó rõ ràng đến mức nhàm chán. Nguồn đó có thể là file trong repo, một nền tảng dịch thuật, hoặc bảng nội bộ, nhưng phải là một nơi thắng mọi tranh cãi.
Định rõ vai trò theo quyết định, không theo chức danh. Ai đó cần phê duyệt ý nghĩa và giọng điệu (thường Product hoặc Marketing). Ai đó cần giữ khóa ổn định và dùng được trong mã (thường Engineering). Ai đó cần bảo vệ ràng buộc UI (thường Design), đặc biệt khi web và native hành xử khác nhau.
Một phân chia đơn giản tránh hầu hết xung đột:
- Người tạo khóa: người phát hành màn hình tạo khóa mới khi UI cần văn bản mới.
- Người duyệt văn bản: PM hoặc chủ copy ký duyệt văn bản gốc tiếng Anh.
- Biên tập viên dịch: dịch viên có thể thay đổi bản dịch, nhưng không được đổi tên khóa.
- Thay đổi khóa: chỉ chủ sở hữu khóa mới được huỷ hoặc gộp khóa, kèm ghi chú giải thích lý do.
Đặt kỳ vọng thời gian phản hồi để phát hành không bị tắc. Ví dụ: yêu cầu khóa mới được xác nhận trong vòng 1 ngày làm việc, duyệt văn bản nguồn trong 2 ngày, và sửa lỗi quan trọng (UI vỡ, văn bản pháp lý sai) trong vài giờ.
Ví dụ cụ thể: đội của bạn xây flow “Reset password” mới cho cả web và native. Developer thêm khóa, PM phê duyệt văn bản tiếng Anh cuối cùng, và dịch viên điền các ngôn ngữ khác. Nếu dịch viên nhận thấy “Reset” nên là “Change”, họ cập nhật bản dịch, nhưng khóa vẫn giữ nguyên. Nếu PM muốn tái sử dụng văn bản qua nhiều màn hình, chỉ chủ khóa được thực hiện thay đổi cấu trúc để tránh hỏng lặng lẽ.
Chiến lược khóa: tái sử dụng, ổn định và ranh giới màn hình
Quy trình bản địa hóa tốt bắt đầu với một quy tắc: khóa là định danh, không phải câu tiếng Anh. Hãy đối xử với chúng như mã số linh kiện. Nếu bạn thay đổi lời sau này, khóa thường nên giữ nguyên.
Tạo khóa mới khi ý nghĩa khác nhau. Tái sử dụng khóa khi ý nghĩa giống nhau, ngay cả khi màn hình khác nhau. “Save” trên màn hình profile và “Save” trên màn hình cài đặt có thể dùng chung khóa nếu đều có nghĩa “lưu thay đổi”. Nhưng “Save” nghĩa là “đánh dấu” (bookmark) thì phải khác khóa, vì dịch viên có thể cần động từ khác.
Tách nhãn UI ngắn khỏi nội dung dài hơn. Nhãn nút, chú giải trợ giúp và thông báo lỗi thường dịch khác và có giới hạn ký tự khác nhau. Giữ chúng là các khóa riêng giúp điều chỉnh giọng điệu và dấu câu mà không làm vỡ màn hình khác.
Ranh giới màn hình mà không ép cùng cách diễn đạt
Hướng tới tái sử dụng giữa web và native, nhưng đừng ép khi nền tảng cần ngôn ngữ khác. Hộp thoại cấp quyền native thường cần rõ ràng, trang trọng hơn tooltip web. Trong trường hợp đó, giữ cùng khái niệm nhưng dùng khóa riêng theo nền tảng để mỗi UI đọc tự nhiên.
Một mẫu thực tế là nhóm khóa theo tính năng và loại UI, rồi tái sử dụng trong ranh giới đó:
- Tái sử dụng trong cùng tính năng khi ý nghĩa giống hệt
- Tách khóa theo loại UI (label vs help vs error vs system prompt)
- Dùng biến thể nền tảng chỉ khi cách diễn đạt phải khác
- Giữ khóa ổn định và chỉ thay đổi văn bản hiển thị
- Thêm ghi chú ngữ cảnh (nơi xuất hiện, giới hạn ký tự)
Ví dụ, hành động “Delete customer” có thể có trong panel admin web và app hiện trường native. Bạn có thể tái sử dụng nhãn hành động cốt lõi, nhưng giữ khóa riêng cho văn bản xác nhận native nếu cần cảnh báo mạnh hơn hoặc dòng ngắn hơn.
Đặt tên và tổ chức khóa dịch
Một hệ thống đặt tên tốt làm cho bản địa hóa trở nên nhàm chán theo cách tốt nhất. Mọi người tìm chuỗi nhanh, dịch viên có ngữ cảnh, và khóa ổn định ngay cả khi copy thay đổi.
Dùng quy ước dễ đọc trả lời bốn câu hỏi: ở đâu, là gì, để làm gì, và có phải biến thể không. Mẫu đơn giản vận hành trên web và native là:
\u003cproduct_or_domain\u003e.\u003cscreen_or_flow\u003e.\u003ccomponent\u003e.\u003cpurpose\u003e[.\u003cvariant\u003e]
Ví dụ, trong portal khách hàng: portal.login.button.submit hoặc portal.orders.empty_state.title. Điều này nhóm khóa theo màn hình hoặc flow mà vẫn dễ tìm theo component.
Khóa xấu là quá mơ hồ hoặc gắn quá chặt với văn bản tiếng Anh hiện tại:
- Tốt:
portal.profile.field.email.label - Xấu:
emailText(không có phạm vi, không rõ mục đích) - Xấu:
please_enter_your_email(vỡ khi copy thay đổi) - Tốt:
portal.checkout.error.payment_failed - Xấu:
error_12
Biến thể nên rõ ràng, không lạm dụng dấu câu hay kiểu chữ hỗn hợp. Nếu cần nhãn ngắn hơn cho header mobile, thêm hậu tố biến thể: ...title.short vs ...title.long. Nếu cần khác kiểu chữ hoa, ưu tiên khóa riêng như ...button.save và ...button.save_titlecase chỉ khi nền tảng không thể biến đổi văn bản an toàn.
Các placeholder cũng cần quy tắc để dịch viên không đoán mò.
- Dùng placeholder đặt tên:
{user_name},{count},{date} - Không bao giờ nối chuỗi: đừng dựng chuỗi như "Hello " + name
- Giữ đơn vị trong chuỗi khi phụ thuộc ngôn ngữ:
{count} itemschứ không phải{count}+ " items" - Định rõ định dạng cho phép: ISO dates, tiền tệ, hoặc định dạng ngày theo nền tảng
- Thêm ghi chú ngắn cho chuỗi khó (ví dụ,
{count}có thể là zero hay không)
Quy tắc chia số nhiều và ngữ pháp giúp tránh sửa lại
Chia số nhiều là chỗ quy trình thường vỡ đầu tiên. Nhiều đội cho rằng mọi ngôn ngữ chỉ có “một” và “nhiều”, rồi thấy UI nghe sai hoặc cần sửa gấp. Một số ngôn ngữ có nhiều dạng chia số. Tiếng Anh chủ yếu dùng one và other, nhưng tiếng Nga, Ba Lan, Ả Rập, Séc có thể dùng few, many hoặc zero. Nếu bạn mã hóa một mẫu đơn giản từ đầu, sẽ phải viết lại chuỗi trên web và native sau đó.
Chọn một chuẩn cho chuỗi plural và áp dụng nhất quán ở mọi nơi (web, iOS, Android, backend). Cách thực tế là lưu một khóa với các dạng plural thay vì nhiều khóa cho từng dạng. Dựa trên các danh mục CLDR để khớp quy tắc ngôn ngữ thực tế.
Một quy tắc ngăn sửa lại: đừng ghép câu UI từ các mảnh như "You have " + count + " messages". Trật tự từ có thể đổi, và một số ngôn ngữ yêu cầu đuôi khác hoặc cách thay đổi dựa trên số.
Mẫu khóa thực tế
Với bộ đếm tin nhắn, định nghĩa một khóa ổn định và truyền số làm tham số. Rồi cung cấp các dạng cần thiết cho dịch viên theo từng ngôn ngữ.
- Dùng một khóa cho một khái niệm (ví dụ:
inbox.message_count) - Hỗ trợ dạng CLDR (zero, one, two, few, many, other)
- Luôn dùng placeholder (ví dụ:
{count}) trong câu hoàn chỉnh - Thêm ghi chú cho dịch viên khi ý nghĩa không rõ (là “messages” hay “unread messages”?)
Giới tính và cách ngữ pháp
Đôi khi chia số nhiều chưa đủ. Nếu UI xưng hô người dùng ("Welcome, Alex") hoặc tham chiếu vai trò ("assigned to him/her"), một số ngôn ngữ cần từ khác theo giới tính. Một số ngôn ngữ thay đổi đuôi theo cách cú pháp (ví dụ, sau một giới từ).
Khi đó xảy ra, tạo chuỗi riêng cho những ngữ pháp thật sự khác, không chỉ phong cách. Mục tiêu là ít khóa hơn nhưng cũng ít bất ngờ hơn trong QA khi một bản dịch “đúng” mà đọc không hợp ngữ cảnh.
Ràng buộc định dạng và layout giữa các nền tảng
Một bản dịch có thể đúng ngữ pháp nhưng vẫn phá layout. Web và native render văn bản khác nhau, nên quy trình của bạn cần bao gồm quy tắc định dạng và kiểm tra layout, không chỉ chuỗi dịch.
Chuẩn hóa cách hiển thị số, tiền và ngày. Tránh dựng chúng bằng nối chuỗi như "$" + amount hoặc cứng định dạng ngày trong nhãn. Dùng formatter theo locale để dấu phân tách và thứ tự khớp kỳ vọng (1,000.50 vs 1 000,50; ngày-tháng-năm vs tháng-ngày-năm). Múi giờ là bẫy phổ biến: lưu timestamp theo UTC, format theo múi giờ người dùng, và ghi rõ khi thời gian thuộc múi giờ cụ thể (ví dụ thời gian nhận hàng tại cửa hàng).
Hướng văn bản là yếu tố phá vỡ thầm lặng khác. Nếu bạn hỗ trợ ngôn ngữ viết phải-trái (RTL), lên kế hoạch cho layout đảo chiều và dấu câu có vẻ “dịch chuyển”. Icon chỉ hướng (mũi tên, nút quay lại, bước tiến độ) thường cần lật. Hãy làm một lượt kiểm tra RTL nhanh trong review, ngay cả khi bạn chưa hỗ trợ RTL đầy đủ.
Trên mobile, font và khoảng cách có thể dịch chuyển nhiều hơn web. Một chuỗi vừa vặn trên web có thể xuống hàng lạ trong SwiftUI hoặc Kotlin. Quyết định kích thước font tối thiểu an toàn, cho phép nhãn xuống hàng khi hợp lý, và định fallback font cho các bảng chữ mà font mặc định không bao phủ.
Truy cập cũng cần kiểm tra theo locale. Screen reader có thể đọc số, chữ viết tắt và văn bản đa ngôn ngữ theo cách bất ngờ.
Các rào chắn layout ngăn hầu hết vấn đề:
- Thiết kế cho việc mở rộng văn bản (30–50%) và tránh nút cố định chiều rộng.
- Giữ giá trị động (đếm, giá, ngày) là token đã format riêng.
- Dùng bộ format số và ngày gốc của nền tảng, không tự pattern riêng.
- Test một locale RTL và một locale có chữ dài trước khi phát hành.
- Chạy kiểm tra screen-reader trên luồng chính (login, checkout, settings).
Ví dụ: nhãn “Total: $1,234.50” có thể cần trở thành “1 234,50 €” với ký hiệu sau giá trị, khoảng cách khác, và pause phù hợp cho screen reader giữa “Total” và số tiền.
Quy trình từng bước từ màn hình mới đến phát hành
Quy trình bản địa hóa cần bắt đầu sớm hơn nhiều đội tưởng: khi màn hình còn đang thiết kế. Nếu bạn chờ đến khi UI “xong”, bạn sẽ vội dịch, phát hành chữ bị cắt, hoặc hardcode chuỗi “tạm thời”.
Bắt đầu bằng việc thêm khóa dịch khi bạn thiết kế mỗi nhãn, nút và thông báo. Viết văn bản mặc định bằng ngôn ngữ cơ sở và đính kèm ngữ cảnh ngắn như nơi xuất hiện và hành động mong đợi. Một khóa như checkout.pay_button chỉ hữu ích nếu dịch viên biết đó là động từ (“Pay”) hay nhãn (“Payment”).
Triển khai UI dùng placeholder và ngôn ngữ mặc định làm fallback. Giữ biến rõ ràng (như {name} hoặc {count}) và tránh ghép câu. Đó là cách nhanh nhất khiến ngữ pháp vỡ qua ngôn ngữ.
Khi gửi chuỗi đi dịch, kèm những gì dịch viên cần để chính xác: ảnh chụp màn hình cho từng màn hình (hoặc video ngắn nếu văn bản thay đổi), giới hạn ký tự cho chỗ chật (tabs, nút, badge), ghi chú về giọng điệu và thuật ngữ, và danh sách placeholder động cùng ý nghĩa.
Khi bản dịch quay về, merge sớm và build cả phiên bản web và native. Làm kiểm tra UI nhanh trên các màn hình rủi ro cao nhất: login, onboarding, checkout và settings. Tìm chữ bị cắt, phần tử chồng chéo, khóa thiếu và dạng số nhiều sai.
Cuối cùng, phát hành và giám sát. Theo dõi khóa thiếu, sự kiện fallback về ngôn ngữ mặc định, và các màn hình thường xuyên bị tràn chữ.
Cho dịch viên những gì họ cần để chính xác
Bản dịch chính xác bắt đầu trước khi một từ được dịch. Nếu dịch viên chỉ thấy khóa và câu tiếng Anh, họ sẽ phỏng đoán. Đó là cách bạn có từ đúng chỗ sai, và UI cảm thấy lạc lõng hoặc thô lỗ.
Một “gói ngữ cảnh” đơn giản loại bỏ hầu hết đoán mò. Với mỗi chuỗi, thêm nơi nó xuất hiện (màn hình và component), mục tiêu người dùng, và giọng điệu (thân mật, trang trọng, cấp bách). Ghi rõ đó là nhãn nút, thông báo lỗi, mục menu hay chú giải — những loại này dịch khác nhau.
Khi chỗ trống hạn chế, nói rõ ngay. Web và native vỡ theo cách khác nhau, nên xác định giới hạn khi cần: nhãn nút ngắn, tiêu đề tab, toast, và bất cứ thứ gì trong card cố định. Nếu chuỗi phải nằm trên một hàng, ghi rõ. Nếu được phép xuống hàng, nói chỗ an toàn để xuống.
Đánh dấu các phần “không dịch” rõ ràng. Tên sản phẩm, tên gói, mã coupon, trường API và placeholder như {name} phải giữ nguyên. Không có hướng dẫn, dịch viên có thể địa phương hóa chúng và app sẽ mất ý nghĩa.
Gói thực tế cho mỗi chuỗi:
- Ảnh màn hình hoặc tên màn hình (ví dụ: “Checkout - Payment method”)
- Loại và ý định (nút xác nhận thanh toán)
- Ghi chú giọng điệu (bình tĩnh, trấn an)
- Ràng buộc (tối đa 18 ký tự, một dòng)
- Tokens được bảo vệ (tên sản phẩm, tích hợp,
{amount})
Xử lý văn bản pháp lý và nội dung hỗ trợ như luồng riêng. Văn bản pháp lý thường cần phê duyệt và cập nhật chậm hơn, nên tách khỏi chuỗi UI sản phẩm và version cẩn thận. Bài trợ giúp và đoạn help dài thường cần dịch dạng dài hơn và có thể nằm trong hệ thống hoặc file khác.
Ví dụ: nút “Continue” trên mobile có thể cần giới hạn chặt hơn web. Nếu dịch viên biết điều đó, họ sẽ chọn động từ ngắn hơn cho những ngôn ngữ mở rộng thay vì ép phải redesign muộn.
Vòng lặp QA và review ngăn UI vỡ
Lỗi UI từ bản địa hóa hiếm khi trông như một “bug” ngay. Chúng thường là nhãn thiếu, nút xuống hai dòng, hoặc placeholder hiện sai giá trị. Quy trình tốt bao gồm các bước QA phát hiện những vấn đề đó trước khi người dùng thấy.
Bắt đầu với pseudo-localization trong build dev. Thay chuỗi thực bằng phiên bản dài hơn, có dấu để lộ ràng buộc (như "[!!! Šéttïñĝš !!!]") và làm phồng độ dài 30–50%. Điều này nhanh chóng phơi bày cắt chữ, chồng chéo và chuỗi cứng mã trên cả web và native.
Thêm kiểm tra tự động ở mỗi build. Chúng bắt những lỗi nhàm chán mà con người bỏ sót khi review hàng trăm dòng:
- Khóa thiếu ở bất kỳ locale nào (fallback che giấu vấn đề đến sau)
- Khóa không dùng (dấu hiệu bạn đang drift và ship text chết)
- Không khớp placeholder ("Hello, {name}" vs "Hello, {username}")
- Dạng plural không hợp lệ cho locale (zero, one, few, many)
- Mẫu bị cấm như HTML thô trong chuỗi mobile
Rồi dùng một vòng sign-off thủ công rõ ràng. Product xác nhận ý nghĩa và giọng cho các màn hình then chốt, trong khi QA kiểm tra layout và tương tác.
Giữ ma trận test nhỏ nhưng nghiêm ngặt. Đừng test mọi thứ. Test những chỗ dễ vỡ trước: đăng nhập/đăng ký, đặt lại mật khẩu, thanh toán và xác nhận, cài đặt và sửa profile, thông báo và trạng thái trống, và mọi màn hình có bảng, badge hoặc nút nhỏ.
Khi báo cáo vấn đề, làm cho việc sửa dễ dàng bằng cách cụ thể: kèm locale, thiết bị và phiên bản OS (hoặc trình duyệt và chiều rộng), văn bản mong đợi, văn bản thực tế, và ảnh chụp màn hình chỗ bị cắt. Nếu liên quan plural hoặc placeholder, dán khóa chính xác và chuỗi xuất ra.
Sai lầm phổ biến và cách tránh
Hầu hết lỗi bản địa hóa không phải là “vấn đề dịch.” Đó là vấn đề quy trình thể hiện dưới dạng UI vỡ, text thiếu hoặc thông điệp khó hiểu.
Cạm bẫy phổ biến là đổi tên khóa khi bạn chỉ muốn thay wording. Khóa phải là ID ổn định, không phải văn bản. Nếu bạn đổi checkout.button.pay thành checkout.button.pay_now, mọi bản dịch cũ trở thành “thiếu” và bạn mất lịch sử. Giữ khóa, cập nhật chuỗi ngôn ngữ gốc, và thêm ngữ cảnh nếu ý nghĩa thay đổi.
Một vấn đề thường gặp khác là hardcode chuỗi trên một nền tảng. Nhóm web dùng khóa, nhưng mobile chen vào văn bản tĩnh cho một sửa nhanh. Một tháng sau, người dùng thấy cảnh báo tiếng Anh trên iOS. Đặt quy tắc “không hardcode chuỗi hiển thị cho người dùng” chung cho web và native.
Placeholder gây lỗi tinh tế khi bạn giả định trật tự từ. Tiếng Anh chấp nhận "{count} items", nhưng ngôn ngữ khác có thể cần trật tự khác hoặc từ bổ sung. Dùng placeholder đặt tên (không vị trí) và giữ nhất quán across nền tảng.
Sai lầm cần bắt sớm:
- Xử lý khóa như copy rồi phá vỡ dịch hiện có. Giữ khóa ổn định.
- Dùng một khóa cho hai ý nghĩa. Tách khi intent khác nhau.
- Trộn kiểu placeholder (có cái đặt tên, có cái số). Chuẩn hóa.
- Chỉ test tiếng Anh. Luôn check ít nhất một locale chuỗi dài và một locale chữ ngắn.
- Phát hành mà không có fallback. Định trước hành vi khi khóa thiếu.
Test chỉ một ngôn ngữ “dài” không đủ. Tiếng Đức thường mở rộng UI, trong khi tiếng Trung có thể lộ ra vấn đề khoảng cách. Làm qua nhanh cả hai, và test các trường hợp lẻ plural như 0, 1, 2.
Thống nhất fallback trước khi phát hành. Ví dụ: nếu tiếng Pháp thiếu, fallback về tiếng Anh, log khóa thiếu, và chỉ chặn release nếu màn hình quan trọng có khoảng trống.
Checklist nhanh và bước tiếp theo thực tế
Một quy trình bản địa hóa khỏe mạnh khi các kiểm tra nhỏ và có thể lặp lại. Mục tiêu đơn giản: ít chuỗi bất ngờ hơn, ít layout vỡ hơn, ít vội dịch phút chót hơn.
Trước khi merge thay đổi UI, rà nhanh các lỗi “oops” thường gặp:
- Khóa mới theo quy tắc đặt tên và nằm đúng namespace (màn hình hoặc feature).
- Placeholder khớp chính xác giữa các ngôn ngữ (cùng biến, cùng ý nghĩa).
- Dạng plural đầy đủ cho các ngôn ngữ bạn hỗ trợ (không chỉ singular/plural tiếng Anh).
- Không còn text hardcoded trong UI (bao gồm lỗi và trạng thái trống).
- Văn bản mới hoặc thay đổi có ngữ cảnh cơ bản (ảnh chụp màn hình hoặc ghi chú rõ ràng).
Trước khi phát hành, chạy QA release ngắn tập trung vào chỗ bản địa hóa vỡ trước. Giữ giới hạn thời gian nhưng nhất quán: luồng người dùng hàng đầu trên mọi nền tảng bạn phát hành, một kiểm tra RTL, màn hình chuỗi dài (cài đặt, pháp lý, onboarding, bảng, nút hẹp), và format ngày/số/tiền trong vài locale.
Đặt nhịp phù hợp với đội bạn. Nhiều đội cập nhật bản dịch hàng tuần, rồi đóng chuỗi 1–2 ngày trước release. Mục tiêu là tránh trộn sửa copy phút chót với QA cuối cùng.
Bước tiếp theo sinh lợi nhanh: viết ra quy ước (đặt tên khóa, placeholder, quy tắc plural, quyền sở hữu), rồi chạy một màn hình pilot end-to-end và điều chỉnh theo lỗi gặp phải.
Nếu bạn xây across backend, web UI và mobile native trong một nền tảng như AppMaster, dễ giữ khóa và placeholder nhất quán vì cùng màn hình và logic có thể chia sẻ một quy ước. Giữ quy ước đó ổn định là điều khiến bản địa hóa trở nên thói quen chứ không mong manh.
Câu hỏi thường gặp
Bắt đầu bằng một nơi lưu trữ chuỗi ổn định, một quy ước đặt tên khóa đồng thuận, và quy tắc rằng khóa không đổi chỉ vì văn bản tiếng cơ sở thay đổi. Sau đó thêm một quy trình QA nhỏ để bắt các vấn đề thiếu khóa, tràn chữ và lỗi chia số nhiều trước khi phát hành.
Chọn một hệ thống làm nguồn duy nhất khi có xung đột — ví dụ tệp dịch trong repo hoặc một bản xuất từ nền tảng dịch thuật. Quy định rõ mọi người chỉnh sửa nội dung qua nguồn đó, còn mã chỉ tiêu thụ dữ liệu từ nó.
Quyết định theo trách nhiệm, không theo chức danh: một người phê duyệt ý nghĩa và giọng điệu ở ngôn ngữ gốc, một người quản lý cấu trúc khóa và việc deprecate, và biên dịch viên chỉ chỉnh giá trị dịch. Cách này tránh việc đổi tên khóa lặng lẽ và thay đổi copy phút cuối làm vỡ build.
Tạo khóa mới khi ý nghĩa thay đổi, ngay cả khi tiếng Anh trông giống nhau. Tái sử dụng khóa khi ý nghĩa thực sự giống hệt giữa các màn hình, vì điều đó giữ sự nhất quán và giảm công bảo trì.
Dùng khóa như định danh, không phải câu tiếng Anh — thêm phạm vi như feature, screen/flow, component và mục đích. Ví dụ portal.checkout.button.pay vẫn hữu dụng ngay cả khi dòng chữ nút thay đổi về sau.
Thất bại với chia số nhiều thường vì nhiều ngôn ngữ có nhiều hơn hai dạng. Lưu một khóa cho một khái niệm với các dạng chia số phù hợp (theo CLDR) và giữ {count} trong câu hoàn chỉnh để dịch viên có thể sắp xếp lại từ an toàn.
Đừng ghép câu bằng cách nối các mảnh như "Hello " + name, vì trật tự từ và kết thúc có thể thay đổi theo ngôn ngữ. Sử dụng placeholder đặt tên như {user_name} nhất quán ở mọi nơi và ghi chú rõ ý nghĩa từng placeholder.
Giả định văn bản có thể dài hơn 30–50% và thiết kế thành phần có thể bọc hoặc giãn. Sau đó kiểm tra một locale có chuỗi dài và kích cỡ font truy cập để bắt kịp việc cắt bớt và chồng chéo trên web và native.
Pseudo-localize trong giai đoạn phát triển để phơi bày chuỗi cứng mã hóa và lỗi layout, rồi thêm kiểm tra tự động cho các khóa thiếu, khóa không dùng, sai placeholder và dạng số nhiều không hợp lệ. Giữ review thủ công tập trung vào các luồng dễ vỡ nhất như đăng nhập, thanh toán và cài đặt.
Quay về ngôn ngữ gốc tạm thời và log các khóa thiếu để bạn sửa nhanh mà không chặn mọi phát hành. Nhưng với màn hình quan trọng hoặc văn bản pháp lý, an toàn hơn là chặn phát hành nếu dịch thiếu hoặc lỗi thời.


