ÿÿ Localize Paywall | React Native SDK | Tài liệu Adapty

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

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

Mã ngôn ngữ (locale code) được dùng khi Adapty chá»n bản địa hóa 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 tùy ná»n tảng, vì vậy Adapty sá»­ dụng má»™t chuẩn ná»™i bá»™ thống nhất trên má»i ná»n tảng được há»— trợ. Hiểu được chuẩn đó sẽ giúp bạn dá»± Ä‘oán ngưá»i dùng sẽ nhận được bản địa hóa nào.

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

Äối vá»›i mã ngôn ngữ, Adapty sá»­ dụng tiêu chuẩn BCP 47 được chỉnh sá»­a nhẹ: má»—i mã bao gồm các subtag viết thưá»ng, phân cách bằng dấu gạch nối. 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 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 kết quả, Adapty lấy phần chuỗi trước dấu gạch ngang đầu tiên (pt trong pt-br) và tìm kiếm bản địa hóa tương ứng
  4. Nếu vẫn không tìm thấy, Adapty trả vỠbản địa hóa mặc định en

Theo cách này, 'pt_BR', pt-BR và pt-br Ä‘á»u được ánh xạ đến cùng má»™t bản địa hóa.

Triển khai bản địa hóa

Trong SDK v4, bạn không cần truyá»n mã ngôn ngữ khi tải má»™t flow.

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

const flow = await adapty.getFlow('placement_id');
const config = flow.remoteConfigs?.find((c) => c.lang === 'en') ?? flow.remoteConfigs?.[0];
// read your values from config?.data

Các quy tắc khớp mã locale ở trên mô tả cách Adapty chuẩn hóa các mã lang được lưu 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ã locale phát huy vai trò — chẳng hạn, khi bạn cần lấy đúng paywall theo ngôn ngữ hiện tại của ứng dụng.

Vì mã locale 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á»™ chung 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 địa hóa, và Ä‘iá»u gì xảy ra tiếp theo — để luôn nhận được kết quả như mong đợi.

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 được Ä‘iá»u chỉnh nhẹ cá»§a tiêu chuẩn BCP 47: má»—i mã gồm các subtag viết thưá»ng, được phân tách bằng dấu gạch ngang. Má»™t vài 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 nhận được lệnh gá»i từ SDK phía client cùng vá»›i mã ngôn ngữ và bắt đầu tìm kiếm bản dịch 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 dịch có mã ngôn ngữ khớp hoàn toàn
  3. Nếu không tìm thấy, chúng tôi lấy chuá»—i con trước dấu gạch ngang đầu tiên (pt trong trưá»ng hợp pt-br) và tìm kiếm bản dịch khá»›p vá»›i chuá»—i con đó
  4. Nếu vẫn không tìm thấy, chúng tôi trả vỠbản dịch mặc định en Theo 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 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 tệp 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 tệp bản địa hóa. Sau đó, trích xuất giá trị cá»§a key đó khi gá»i SDK, như sau:

// 1. Modify your localization files (e.g., using react-i18next)

/*
en.json
*/
{
  "adapty_paywalls_locale": "en"
}

/*
es.json
*/
{
  "adapty_paywalls_locale": "es"
}

/*
pt-BR.json
*/
{
  "adapty_paywalls_locale": "pt-br"
}

// 2. Extract and use the locale code

const MyComponent = () => {
  const { t } = useTranslation();
  
  const fetchPaywall = async () => {
    const locale = t('adapty_paywalls_locale');
    // pass locale code to adapty.getPaywall or adapty.getPaywallForDefaultAudience method
    const paywall = await adapty.getPaywallForDefaultAudience('placement_id', locale);
  };
};

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

Triển khai bản địa hóa: 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 nhau) mà không cần phải xác định rõ mã ngôn ngữ cho từng bản địa hóa. Thay vào đó, bạn có thể trích xuất mã ngôn ngữ từ thiết bị, ví dụ thông qua react-native-localize:


const fetchPaywall = async () => {
  // getLocales() returns the user's preferred locales in BCP-47 format (e.g., 'en-US', 'pt-BR')
  const locale = RNLocalize.getLocales()[0].languageTag;
  // pass locale code to adapty.getPaywall or adapty.getPaywallForDefaultAudience method
  const paywall = await adapty.getPaywallForDefaultAudience('placement_id', locale);
};

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 khu vá»±c hiện tại không giống nhau. Nếu bạn muốn bản địa hóa được chá»n đúng, bạn cần dá»±a vào logic phân giải cá»§a Apple — hoạt động tá»± động khi bạn dùng cách tiếp cận được khuyến nghị vá»›i các file chuá»—i đã bản địa hóa — hoặc tá»± xây dá»±ng lại logic đó.
  2. Locale cá»§a thiết bị có thể không khá»›p vá»›i bất kỳ bản địa hóa nào bạn đã cấu hình trong Adapty. Trong trưá»ng hợp đó, SDK sẽ dùng kết quả khá»›p theo subtag đầu tiên, hoặc cuối cùng là en — có thể không phải ngôn ngữ mặc định bạn muốn hiển thị cho ngưá»i dùng đó. Should you decide to use this approach anyway — make sure you’ve covered all the relevant use cases.
ÿÿÿÿ