Skip to main content

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

  • September 5, 2025
  • 2 replies
  • 52 views

Forum|alt.badge.img

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
  • September 14, 2025

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