ÿÿ Quản lý Localizations & Locale Codes | Tài liệu Adapty

Sử dụng localizations và locale codes trong Flutter SDK

Tại sao Ä‘iá»u này quan trá»ng

Mã ngôn ngữ (locale code) được sá»­ dụng khi Adapty chá»n bản dịch cho má»™t flow, và khi bạn Ä‘á»c Remote Config cho má»™t paywall tùy chỉnh.

Mã ngôn ngữ khá phức tạp và có thể khác nhau giữa các ná»n tảng, vì vậy Adapty sá»­ dụng má»™t tiêu chuẩn ná»™i bá»™ thống nhất trên má»i ná»n tảng được há»— trợ. Hiểu được tiêu chuẩn đó sẽ giúp bạn dá»± Ä‘oán bản dịch nào ngưá»i dùng sẽ nhận được.

Tiêu chuẩn mã ngôn ngữ tại Adapty

Äối vá»›i mã ngôn ngữ, Adapty sá»­ dụng má»™t phiên bản Ä‘iá»u chỉnh nhá» cá»§a tiêu chuẩn BCP 47: má»—i mã bao gồm các subtag viết thưá»ng, phân cách bằng dấu gạch ngang. Má»™t số ví dụ: en (tiếng Anh), pt-br (tiếng Bồ Äào Nha (Brazil)), zh (tiếng Trung Giản thể), zh-hant (tiếng Trung Phồn thể).

Khớp mã ngôn ngữ

Khi Adapty tìm kiếm bản địa hóa phù hợp vá»›i ngôn ngữ cá»§a ngưá»i dùng, quá trình diá»…n ra như sau:

  1. Chuá»—i ngôn ngữ được chuyển thành chữ thưá»ng và tất cả dấu gạch dưới (_) được thay thế bằng dấu gạch ngang (-)
  2. Adapty tìm kiếm bản địa hóa có mã ngôn ngữ khớp hoàn toàn
  3. Nếu không tìm thấy, Adapty lấy chuỗi con trước dấu gạch ngang đầu tiên (pt từ pt-br) và tìm kiếm bản địa hóa phù hợp
  4. Nếu vẫn không tìm thấy, Adapty trả vỠbản địa hóa mặc định en

Nhá» cách này, 'pt_BR', pt-BR và pt-br Ä‘á»u được phân giải vá» cùng má»™t bản địa hóa.

Triển khai localization

Trong SDK v4, bạn không cần truyá»n mã locale khi lấy má»™t flow.

  • Paywall dùng Flow Builder và Paywall Builder: Adapty tá»± động xác định localization dá»±a trên thiết bị và các localization bạn đã cấu hình trong builder. Render flow bằng createFlowView — không cần mã locale.
  • Paywall tùy chỉnh (remote config): getFlow trả vá» tất cả các localization đã cấu hình trong flow.remoteConfigs. Má»—i mục có mã locale và ná»™i dung config (chuá»—i data, hoặc dictionary đã được parse). Hãy chá»n mục phù hợp vá»›i ngưá»i dùng, kèm theo logic fallback cá»§a riêng bạn:

final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
final config = flow.remoteConfigs.firstWhereOrNull((c) => c.locale == 'en') ??
    flow.remoteConfig; // the first remote config, if present
// read your values from config?.dictionary

Các quy tắc khớp mã locale ở trên mô tả cách Adapty chuẩn hóa các mã locale được lưu trữ trên mỗi Remote Config.

Tại sao Ä‘iá»u này quan trá»ng

Có má»™t vài tình huống mà mã ngôn ngữ (locale code) trở nên quan trá»ng — ví dụ, khi bạn cần lấy đúng paywall phù hợp vá»›i ngôn ngữ hiện tại cá»§a ứng dụng.

Vì mã ngôn ngữ khá phức tạp và có thể khác nhau tùy từng ná»n tảng, chúng tôi sá»­ dụng má»™t tiêu chuẩn ná»™i bá»™ thống nhất cho tất cả các ná»n tảng được há»— trợ. Tuy nhiên, chính vì sá»± phức tạp đó, bạn cần hiểu rõ mình Ä‘ang gá»­i gì lên server để nhận đúng bản ngôn ngữ mong muốn — và Ä‘iá»u gì xảy ra tiếp theo — để luôn nhận được kết quả như kỳ vá»ng.

Tiêu chuẩn mã ngôn ngữ tại Adapty

Äối vá»›i mã ngôn ngữ, Adapty sá»­ dụng chuẩn BCP 47 được chỉnh sá»­a nhẹ: má»—i mã bao gồm các subtag viết thưá»ng, ngăn cách nhau bằng dấu gạch ngang. Má»™t số ví dụ: en (tiếng Anh), pt-br (tiếng Bồ Äào Nha (Brazil)), zh (tiếng Trung giản thể), zh-hant (tiếng Trung phồn thể).

Äối sánh mã ngôn ngữ

Khi Adapty nhận được lệnh gá»i từ SDK phía client kèm theo mã ngôn ngữ và bắt đầu tìm kiếm bản bản địa hóa tương ứng cá»§a paywall, quá trình diá»…n ra như sau:

  1. Chuá»—i ngôn ngữ đầu vào được chuyển thành chữ thưá»ng và tất cả dấu gạch dưới (_) được thay thế bằng dấu gạch ngang (-)
  2. Chúng tôi tìm kiếm bản bản địa hóa có mã ngôn ngữ khớp hoàn toàn
  3. Nếu không tìm thấy kết quả khớp, chúng tôi lấy chuỗi con trước dấu gạch ngang đầu tiên (pt trong pt-br) và tìm kiếm bản bản địa hóa tương ứng
  4. Nếu vẫn không tìm thấy kết quả khá»›p, chúng tôi trả vá» bản bản địa hóa mặc định en Bằng cách này, má»™t thiết bị iOS gá»­i 'pt_BR', má»™t thiết bị Android gá»­i pt-BR, và má»™t thiết bị khác gá»­i pt-br Ä‘á»u sẽ nhận được cùng má»™t kết quả.

Nếu bạn Ä‘ang tìm hiểu vá» bản địa hóa, có thể bạn đã làm việc vá»›i các file chuá»—i đã được bản địa hóa trong dá»± án cá»§a mình. Trong trưá»ng hợp đó, chúng tôi khuyến nghị bạn thêm má»™t cặp key-value vá»›i mã locale Adapty tương ứng vào má»—i file cho từng bản địa hóa. Sau đó, trích xuất giá trị cá»§a key đó khi gá»i SDK, như ví dụ dưới đây:

// 1. Modify your app_en.arb, app_es.arb, app_pt_br.arb files

/*
app_en.arb
*/
"adapty_paywalls_locale": "en",

/*
app_es.arb
*/
"adapty_paywalls_locale": "es",

/*
app_pt_br.arb
*/
"adapty_paywalls_locale": "pt-br",

// 2. Extract and use the locale code
final locale = AppLocalizations.of(context)!.adapty_paywalls_locale;
// pass locale code to AdaptyUI.getViewConfiguration or Adapty.getPaywall method

Bằng cách này, bạn có thể đảm bảo kiểm soát hoàn toàn ngôn ngữ nào sẽ được tải vá» cho từng ngưá»i dùng trong ứng dụng cá»§a bạn.

Triển khai bản địa hóa theo cách khác

Bạn có thể đạt được kết quả tương tá»± (nhưng không hoàn toàn giống) mà không cần định nghÄ©a rõ ràng mã ngôn ngữ cho từng bản địa hóa. Äiá»u đó có nghÄ©a là trích xuất mã ngôn ngữ từ các đối tượng khác mà ná»n tảng cá»§a bạn cung cấp, như sau:

final locale = Localizations.localeOf(context).languageCode;
// pass locale code to AdaptyUI.getViewConfiguration or Adapty.getPaywall method

Lưu ý rằng chúng tôi không khuyến nghị cách tiếp cận này vì một số lý do:

  1. Trên iOS, ngôn ngữ ưu tiên và locale hiện tại không giống nhau. Nếu muốn bản địa hóa được chá»n đúng, bạn cần dá»±a vào logic cá»§a Apple — hoạt động tá»± động nếu bạn dùng cách tiếp cận được khuyến nghị vá»›i các file string đã bản địa hóa — hoặc tá»± tái tạo lại logic đó.
  2. Rất khó dá»± Ä‘oán chính xác những gì server cá»§a Adapty sẽ nhận được. Ví dụ: trên iOS, có thể lấy được má»™t locale như ar_OM@numbers='latn' từ thiết bị và gá»­i lên server. Khi đó, thay vì nhận được bản địa hóa ar-om như mong muốn, bạn sẽ nhận được ar — Ä‘iá»u này có thể nằm ngoài kỳ vá»ng. Should you decide to use this approach anyway — make sure you’ve covered all the relevant use cases.
ÿÿÿÿ