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

Sử dụng localization và mã locale trong Unity SDK

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

Có má»™t vài trưá»ng hợp mà mã locale phát huy tác dụng — ví dụ, khi bạn cần lấy paywall phù hợp vá»›i localization 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á»™ cho tất cả các ná»n tảng được há»— trợ. Tuy nhiên, do sá»± phức tạp này, Ä‘iá»u quan trá»ng là bạn phải hiểu rõ mình Ä‘ang gá»­i gì đến máy chá»§ cá»§a chúng tôi để nhận được localization đúng, và Ä‘iá»u gì xảy ra tiếp theo — để bạn luôn nhận được kết quả như mong đợi.

Tiêu chuẩn mã locale tại Adapty

Äối vá»›i mã locale, Adapty sá»­ dụng 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, 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ể).

Cách khớp mã locale

Khi Adapty nhận được yêu cầu từ SDK phía client kèm mã locale và bắt đầu tìm kiếm localization tương ứng cho paywall, quá trình diễn ra như sau:

  1. Chuá»—i locale đầ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 localization có mã locale 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 cho pt-br) và tiếp tục tìm kiếm
  4. Nếu vẫn không tìm thấy, chúng tôi trả vỠlocalization mặc định en

Nhá» vậ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 nhận được kết quả như nhau.

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

// 1. Modify your localization files (e.g., using Unity's Localization package)

/*
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
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using AdaptySDK;

public class PaywallManager : MonoBehaviour
{
    public async void FetchPaywall()
    {
        // Get the current locale from Unity's Localization system
        var locale = LocalizationSettings.SelectedLocale;
        var localeCode = GetAdaptyLocaleCode(locale);
        
        // Pass locale code to Adapty.GetPaywall or Adapty.GetPaywallForDefaultAudience method
        Adapty.GetPaywall("placement_id", localeCode, (paywall, error) => {
            if (error != null) {
                // handle the error
                return;
            }
            // Use the paywall
        });
    }
    
    private string GetAdaptyLocaleCode(Locale locale)
    {
        // Convert Unity locale to Adapty format
        var localeIdentifier = locale.Identifier.Code;
        return localeIdentifier.ToLower().Replace('_', '-');
    }
}

Cách này giúp bạn kiểm soát hoàn toàn localization nào sẽ được trả vá» cho từng ngưá»i dùng trong ứng dụng.

Triển khai localization: cách khác

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

using UnityEngine;
using System.Globalization;
using AdaptySDK;

public class PaywallManager : MonoBehaviour
{
    public void FetchPaywall()
    {
        var localeCode = GetSystemLocaleCode();
        
        // Pass locale code to Adapty.GetPaywall or Adapty.GetPaywallForDefaultAudience method
        Adapty.GetPaywall("placement_id", localeCode, (paywall, error) => {
            if (error != null) {
                // handle the error
                return;
            }
            // Use the paywall
        });
    }
    
    private string GetSystemLocaleCode()
    {
        // Get the system's current culture
        var culture = CultureInfo.CurrentCulture;
        var languageCode = culture.TwoLetterISOLanguageName;
        var regionCode = culture.Name.Contains('-') ? culture.Name.Split('-')[1] : null;
        
        if (!string.IsNullOrEmpty(regionCode))
        {
            return $"{languageCode}-{regionCode.ToLower()}";
        }
        
        return languageCode;
    }
}

Lưu ý rằng chúng tôi không khuyến nghị cách này vì một vài 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 localization được chá»n đúng, bạn phải hoặc dá»±a vào logic cá»§a Apple (vốn hoạt động tá»± động nếu dùng cách khuyến nghị vá»›i các file chuá»—i đã localize), hoặc tá»± tái tạo lại logic đó.
  2. Khó dá»± Ä‘oán chính xác máy chá»§ cá»§a Adapty sẽ nhận được gì. Chẳng hạn, trên iOS, có thể lấy được locale như ar_OM@numbers='latn' từ thiết bị và gá»­i đến máy chá»§. Vá»›i yêu cầu này, bạn sẽ không nhận được localization ar-om như mong đợi, mà thay vào đó là ar — Ä‘iá»u này có thể ngoài ý muốn.

Nếu bạn vẫn quyết định dùng cách này — hãy đảm bảo đã kiểm tra tất cả các trưá»ng hợp sá»­ dụng liên quan.

ÿÿÿÿ