Menu

Quốc gia và ngôn ngữ khác nhau: ba tầng bản địa hóa

Quốc gia và ngôn ngữ là hai trục khác nhau, không suy ra được từ nhau. Bài này tách bản địa hoá thành ba tầng và chỉ cách lấy mẫu trên hai trục đó cho đúng.

Đăng ngày

  • bản địa hoá
  • ngôn ngữ
  • kiểm thử

Trong dữ liệu thử, quốc gia và ngôn ngữ khác nhau về bản chất, dù trên giao diện chúng thường nằm cạnh nhau. Một bên mô tả dữ liệu được ghi theo quy ước nào, bên kia mô tả chữ được viết bằng thứ tiếng gì. Trộn hai trục này thành một cặp cố định là nguyên nhân của những lỗi rất khó lần ra, và bài này chỉ cách tách chúng ra để kiểm thử.

Vì sao không thể suy ra quốc gia từ ngôn ngữ?

Quan hệ giữa hai trục này là quan hệ nhiều nhiều, không phải một một. Một quốc gia có thể dùng nhiều ngôn ngữ chính thức trong các giấy tờ của mình, và một ngôn ngữ có thể được dùng chính thức ở nhiều nơi khác nhau. Biết ngôn ngữ của người dùng không cho bạn biết dữ liệu của họ phải được xử lý theo quy ước nào.

Điều này có nghĩa là mọi bảng tra cứu kiểu một ngôn ngữ ứng với một quốc gia đều sẽ sai ở một số trường hợp. Những trường hợp đó có thể ít, nhưng chúng thường rơi đúng vào nhóm người dùng mà sản phẩm của bạn phục vụ.

Ngược lại, cũng không thể suy ra ngôn ngữ từ quốc gia. Một nơi có thể có nhiều ngôn ngữ chính thức, và người dùng ở đó hoàn toàn có thể chọn một thứ tiếng khác với ngôn ngữ của phần lớn dân cư. Cả hai chiều suy diễn đều hỏng.

Hệ quả cho dữ liệu thử là bạn cần hai trường riêng. Ngay cả khi giao diện chỉ cho người dùng chọn một mục, dữ liệu bên dưới vẫn nên lưu hai giá trị độc lập, vì chúng sẽ phục vụ hai phần khác nhau của hệ thống.

Bản địa hoá thật ra có ba tầng

Từ bản địa hoá thường bị dùng để chỉ mọi thứ liên quan tới địa phương, và đó là lý do nó gây nhầm lẫn. Tách ra thì có ba tầng, và ba tầng này có thể không trùng nhau trong cùng một phiên làm việc.

Tầng Mô tả điều gì Ví dụ về việc nó quyết định
Ngôn ngữ giao diện Chữ mà người dùng đọc Nhãn nút, thông báo lỗi, thứ tự các mục trong menu
Vùng nội dung Nội dung nào được hiển thị Danh mục sản phẩm, đơn vị đo, quy định được nhắc tới
Định dạng dữ liệu Giá trị được ghi theo quy ước nào Cách viết ngày, cách đặt dấu phân cách số, cách sắp tên riêng

Ba tầng này độc lập với nhau. Một người dùng có thể đọc giao diện bằng thứ tiếng này, xem nội dung của vùng khác, và nhập dữ liệu theo quy ước của một nơi thứ ba. Hệ thống nào gộp cả ba vào một lựa chọn duy nhất sẽ không biểu diễn được tình huống đó.

Trong kiểm thử, mỗi tầng cần một khẳng định riêng. Nếu bạn chỉ kiểm tra rằng giao diện đổi ngôn ngữ đúng, bạn chưa biết gì về việc định dạng dữ liệu có đi theo vùng hay không.

Thẻ ngôn ngữ và mã vùng chia việc cho nhau

Trong các hệ thống có yếu tố quốc tế, hai loại nhãn này thường bị dùng lẫn. Thẻ ngôn ngữ trả lời câu hỏi văn bản được viết bằng thứ tiếng nào. Mã vùng trả lời câu hỏi dữ liệu được hiểu theo tập quy ước nào.

Vì trả lời hai câu hỏi khác nhau, chúng không thể thay thế cho nhau. Dùng thẻ ngôn ngữ làm công tắc định dạng là một lỗi thiết kế, và lỗi này không biểu hiện ra ngoài cho tới khi có người dùng rơi vào tổ hợp mà hai nhãn không trùng nhau.

Cách làm rõ ràng là giữ hai trường tách biệt ở mọi tầng: trong dữ liệu lưu, trong tham số truyền giữa các thành phần, và trong tên của các hàm xử lý. Khi tên hàm nói rõ nó nhận vùng hay nhận ngôn ngữ, người viết sau khó truyền nhầm hơn nhiều.

Cũng nên có quy tắc mặc định cho trường hợp người dùng chưa chọn vùng. Mặc định đó nên lấy từ một nguồn có căn cứ, và phải được ghi lại, chứ không nên là kết quả của một phép suy diễn ngầm từ ngôn ngữ.

Đoán định dạng theo ngôn ngữ sẽ vấp phải những gì?

Lỗi kinh điển là lấy ngôn ngữ làm căn cứ để chọn quy tắc định dạng. Người dùng chọn một thứ tiếng, hệ thống suy ra một quốc gia, và từ đó áp một bộ quy tắc lên dữ liệu của họ. Cách này chạy được với phần lớn người dùng, và đó chính là lý do nó tồn tại lâu.

Nhưng khi hai trục lệch nhau, kết quả là dữ liệu hợp lệ bị từ chối. Người dùng nhập đúng theo quy ước của nơi họ ở, còn hệ thống lại kiểm tra theo quy ước của nơi mà nó đoán ra. Thông báo lỗi sẽ nói rằng dữ liệu sai, trong khi thứ sai nằm ở phép đoán.

Loại lỗi này đặc biệt khó tìm vì nó chỉ xuất hiện ở tổ hợp ít gặp. Bộ kiểm thử thông thường lấy mỗi ngôn ngữ một quốc gia sẽ không bao giờ chạm tới tổ hợp gây lỗi, và vì thế lỗi có thể tồn tại rất lâu.

Một cách phòng ngừa đơn giản là tách hẳn hai phép tra cứu trong mã. Cho dù tổ hợp hiếm, hệ thống vẫn phải xử lý được trường hợp thẻ ngôn ngữ và mã vùng không khớp nhau, kể cả khi giao diện chưa có chỗ để người dùng chọn riêng.

Ma trận kiểm thử nên lấy mẫu thế nào

Ma trận đúng là tích của hai trục, không phải một danh sách các cặp cố định. Nói cách khác, bạn chọn một tập ngôn ngữ, chọn một tập vùng, rồi lấy mẫu trên tích đó thay vì ghép mỗi ngôn ngữ với một vùng duy nhất.

Cách lấy mẫu này cho phép bạn phủ được cả tổ hợp lệch, vốn là nơi sinh ra lỗi. Nó cũng giúp bộ kiểm thử gọn hơn, vì bạn không cần thử mọi cặp mà chỉ cần chọn vài cặp ở các góc khác nhau của ma trận.

Trục ngôn ngữ nên được lấy mẫu theo độ khác biệt của văn bản, vì đó là thứ nó thật sự ảnh hưởng. Trục vùng nên được lấy mẫu theo độ khác biệt của quy ước dữ liệu. Hai cách lấy mẫu này không cần giống nhau, và việc chúng khác nhau là bình thường.

Cũng nên có vài ca cố định cho những tổ hợp đã từng gây lỗi. Những ca này không cần nhiều, nhưng phải được giữ lâu dài, vì chúng là ký ức của hệ thống về một lần sai cụ thể.

Mọi cặp ngôn ngữ và vùng nêu trong bài chỉ là ví dụ do bài tự dựng ra để minh hoạ cách lấy mẫu. Chúng không đại diện cho phân bố người dùng thật ở bất kỳ đâu, không gắn với tổ chức hay cá nhân nào, và không được dùng làm căn cứ cho quyết định thật.

Phần dành cho nhà phát triển: để định dạng đi theo vùng

Nguyên tắc ngắn gọn là định dạng dữ liệu đi theo vùng, còn chữ hiển thị đi theo ngôn ngữ. Khi hai đường đi này tách nhau trong mã, rất nhiều lỗi tự biến mất.

Vài điểm nên chốt:

  • Đặt tên trường và tên hàm sao cho đọc lên là biết nó nhận vùng hay nhận ngôn ngữ.
  • Giữ hai giá trị này riêng trong dữ liệu, kể cả khi giao diện chỉ hỏi một lần.
  • Không suy vùng từ ngôn ngữ ở bất kỳ tầng nào, kể cả trong phần hiển thị.
  • Kiểm thử ít nhất vài ca mà hai trục lệch nhau, và giữ chúng lại làm ca hồi quy.
  • Ghi lại quy tắc mặc định khi người dùng chưa chọn, cùng lý do chọn quy tắc đó.

Nếu cần tham chiếu thêm về cách dữ liệu tên riêng và văn bản khác nhau theo từng nơi, bài dữ liệu tên theo từng nơi trong chuyên mục danh tính đi sâu vào phần đó. Còn để chọn và kiểm thử ô nhập nơi cư trú, bài kiểm thử trường chọn quốc gia nói kỹ hơn về chính cái điều khiển ấy.

Bước tiếp theo

Hãy thử tìm trong mã của bạn một chỗ duy nhất đang vừa chọn ngôn ngữ vừa chọn định dạng. Tách nó thành hai nhánh, rồi thêm một ca kiểm thử cho tổ hợp lệch. Sau đó, bài nhóm khu vực và phân hạng thị trường giải thích cách gom các vùng thành nhóm để dễ quản lý hơn, và danh mục quốc gia và vùng lãnh thổ là nơi bạn mở ra để đối chiếu cách trình bày của từng nơi khi cần kiểm tra thủ công.

Đọc tiếp

Bài viết về Định dạng địa chỉ và danh tính theo quốc gia