Skip to main content

Feature Request: Add Programmatic Language/Locale Override Parameter for Paywalls

  • Sep 5, 2025 2:28 PM UTC
  • 2 replies
  • 193 views

Forum|alt.badge.img+2

Hi RevenueCat Team! 👋

I'd love to request a highly needed feature that would significantly improve the user experience for apps with custom language selection functionality.

## The Problem

Currently, RevenueCat paywalls automatically determine their display language based on the device's system locale settings. While this works great for most cases, it creates a major UX issue for apps that allow users to change the app language independently from their device settings.

*Current limitations:*
- Paywalls always use device locale, ignoring in-app language preferences
- No way to programmatically specify which localization to display
- Users see paywalls in different languages than their chosen app language
- Particularly problematic for language learning apps, international apps, and apps targeting multilingual users

## Proposed Solution

Add an optional locale or language parameter to paywall presentation methods across all platforms:

*iOS (Swift):*
swift
.presentPaywallIfNeeded(
    requiredEntitlementIdentifier: "pro",
    locale: Locale(identifier: "es-ES"), // New parameter
    purchaseCompleted: { customerInfo in }
)


*React Native:*
javascript
RevenueCatUI.presentPaywall({
    locale: 'fr-FR', // New parameter
    offering: offering
});


*Android:*
kotlin
PaywallDialog(
    PaywallDialogOptions.Builder()
        .setLocale("de-DE") // New parameter
        .build()
)


## Use Cases & Business Impact

1. *Language Learning Apps*: Users learning Spanish should see Spanish paywalls regardless of their English device settings
2. *International Apps*: Apps serving multiple markets need precise control over paywall language
3. *Improved Conversion*: Language consistency between app and paywall increases user trust and conversion rates
4. *User Experience*: Eliminates confusion when paywall language doesn't match app language

## Community Demand

I've seen multiple developers requesting this feature:
- GitHub Issue #1223 in react-native-purchases
- Several community posts about localization problems
- Developers building workarounds or considering custom paywalls due to this limitation

## Technical Details

The feature should:
- Accept standard language codes (ISO 639-1) and locale identifiers (BCP 47)
- Fall back to device locale if specified locale isn't available
- Fall back to default paywall locale if neither works
- Work with all existing paywall localization configurations in RC dashboard

## Current Workaround Status

Unfortunately, there are no reliable workarounds. The current system only considers:
- Device language settings

This post has been closed for comments

2 replies

alejandra-wetsch
RevenueCat Staff
Forum|alt.badge.img+6

Hey ​@harwinder-singh-cedda9, 

Thank you for reaching out and for providing so many details! 

I have great news for you. This feature is now available in the following SDK versions: 

  • React Native: 9.4.0
  • Android: 9.5.0
  • iOS: 5.37.0

Below you will find how to implement this for each SDK.
iOS

// During configuration
let builder = Configuration
.builder(withAPIKey: "")
.with(preferredUILocaleOverride: "de_DE")

// At any time as long as the SDK is already configured
// Override locale at runtime; will automatically clear cache when the locale changes
Purchases.shared.overridePreferredUILocale("de_DE")

// Revert to system default
Purchases.shared.overridePreferredUILocale(null);

Android

// During configuration
val configuration = PurchasesConfiguration.Builder(context, apiKey)
.preferredUILocaleOverride("es-ES") // or "es_ES" - both formats supported
.build()
Purchases.configure(configuration)

// Ay any other time as long as the SDK is configured
// Set preferred locale (automatically clears cache if changed)
Purchases.sharedInstance.overridePreferredUILocale("de-DE")

// Revert to system default
Purchases.sharedInstance.overridePreferredUILocale(null)

React Native

// During configuration
Purchases.configure({
apiKey: '<YOUR_API_KEY>',
// other configuration options...
preferredUILocaleOverride: 'es-ES' // both "es-ES" and "es_ES" formats supported
});

// At any time as long as the SDK is configured
// Override locale at runtime; will automatically clear cache when the locale changes
await Purchases.overridePreferredLocale('de-DE');

// Revert to system default
await Purchases.overridePreferredLocale(null);

When the cache gets cleared, offerings will get refetched.

I hope this helps!


Forum|alt.badge.img+7
  • Active Member
  • Sep 14, 2025 6:49 PM UTC

Thanks for this, what I’m looking for. I’m working in an older codebase, ObjectiveC.  trying to figure out how to get the syntax right to convert this to objc:

 

 

Purchases.shared.overridePreferredUILocale("de_DE")

I tried this but it’s not correct:

[[RCPurchases sharedPurchases] overridePreferredUILocale:@”de_DE"];

Thanks

D