If your app serves multiple markets, your onboarding needs to work in every language and culture. Localization goes beyond translation: it includes layout direction (RTL for Arabic and Hebrew), date and currency formats, cultural expectations about data collection, and region-specific compliance. Deep links can carry locale information so the onboarding starts in the right language before the user has to choose.
For personalization, see Personalized Onboarding Flows with Deep Link Data. For SEO considerations with smart banners, see Smart Banners and SEO: Avoiding Google Penalties. For general onboarding principles, see Onboarding Best Practices for Mobile Apps in 2026.
Language Detection
Priority Order
Detect the user's preferred language using multiple signals:
function detectLanguage(deepLinkParams) {
// 1. Explicit locale from deep link (highest priority)
if (deepLinkParams && deepLinkParams.locale) {
return deepLinkParams.locale;
}
// 2. Device language setting
const deviceLocale = getDeviceLocale(); // e.g., 'es_MX'
if (isSupportedLocale(deviceLocale)) {
return deviceLocale;
}
// 3. Device language (without region)
const language = deviceLocale.split('_')[0]; // 'es'
if (isSupportedLanguage(language)) {
return language;
}
// 4. IP-based geolocation
const geoLocale = getLocaleFromIP();
if (geoLocale && isSupportedLocale(geoLocale)) {
return geoLocale;
}
// 5. Default
return 'en';
}
Deep Links with Locale
Pass locale information in campaign and referral deep links. For localization techniques applied specifically to smart banners, see Banner Localization: Reaching Global Users.
https://go.yourapp.com/signup?locale=ja&utm_campaign=japan_launch
https://go.yourapp.com/refer/ABC123?locale=pt_BR&referrer_name=Carlos
This ensures the onboarding starts in the correct language even before the device locale is read.
Translation Beyond Text
What Needs Localization
| Element | Example | Notes |
|---|---|---|
| UI text | Buttons, labels, instructions | Professional translation, not machine |
| Error messages | "Invalid email" | Culturally appropriate tone |
| Placeholder text | "Enter your name" | Name format varies by culture |
| Images/illustrations | People, gestures, symbols | Avoid culture-specific imagery |
| Screenshots | Feature previews | Re-capture for each language |
| Currency | $, EUR, JPY | Format and symbol |
| Date format | MM/DD vs. DD/MM | Match regional convention |
| Phone format | Country code, digit grouping | Auto-format by region |
| Name fields | First/Last vs. Family/Given | Order varies by culture |
Name Field Localization
In Western cultures, "First Name" comes before "Last Name." In East Asian cultures, family name comes first:
function NameFields({ locale }) {
const isEastAsian = ['ja', 'ko', 'zh'].includes(locale.split('_')[0]);
if (isEastAsian) {
return (
<>
<Input label={t('family_name')} />
<Input label={t('given_name')} />
</>
);
}
return (
<>
<Input label={t('first_name')} />
<Input label={t('last_name')} />
</>
);
}
RTL Support
Layout Mirroring
For Arabic, Hebrew, Urdu, and other RTL languages, the entire layout needs to mirror:
function OnboardingScreen({ locale, children }) {
const isRTL = ['ar', 'he', 'fa', 'ur'].includes(locale.split('_')[0]);
return (
<View style={[styles.container, isRTL && styles.rtl]}>
<I18nManager isRTL={isRTL}>
{children}
</I18nManager>
</View>
);
}
RTL considerations for onboarding:
- Progress bars fill from right to left
- "Next" button appears on the left
- Carousels swipe in the opposite direction
- Icons with directional meaning (arrows, navigation) flip
- Text alignment switches
Testing RTL
Test onboarding in an RTL language to catch:
- Text overflow (Arabic text is often 20-30% longer than English)
- Icon alignment issues
- Animation direction
- Form field alignment
Cultural Adaptation
Data Collection Norms
Different cultures have different expectations about what data is appropriate to collect during signup:
| Region | Typical Expectation | Onboarding Implication |
|---|---|---|
| US | Name, email, optional phone | Standard form |
| EU | Minimal data, explicit consent | GDPR consent, minimal fields |
| Japan | Formal address, company name | More structured form |
| Middle East | Gender (for service customization) | Include gender field |
| China | Phone number primary (not email) | Phone-first signup |
Phone-First vs. Email-First
Some markets prefer phone-based signup:
function SignupForm({ locale }) {
const phoneFirstRegions = ['CN', 'IN', 'ID', 'BR', 'NG'];
const region = locale.split('_')[1] || getRegionFromIP();
if (phoneFirstRegions.includes(region)) {
return (
<Form>
<PhoneInput
defaultCountryCode={getCountryCode(region)}
label={t('phone_number')}
autoFocus
/>
<Text>{t('we_will_send_verification_code')}</Text>
</Form>
);
}
return (
<Form>
<Input label={t('email')} type="email" autoFocus />
<Input label={t('password')} type="password" />
</Form>
);
}
Social Login Availability
Not all social login providers work in every market:
| Provider | Strong Markets | Weak/Unavailable |
|---|---|---|
| Global (except China) | China (blocked) | |
| Apple | US, EU, Japan | Lower adoption in some markets |
| China | Outside China | |
| LINE | Japan, Thailand, Taiwan | Outside Asia |
| KakaoTalk | South Korea | Outside Korea |
function SocialLoginOptions({ region }) {
const options = [];
if (region !== 'CN') options.push(<GoogleSignIn />);
options.push(<AppleSignIn />);
if (region === 'CN') options.push(<WeChatSignIn />);
if (region === 'JP') options.push(<LineSignIn />);
if (region === 'KR') options.push(<KakaoSignIn />);
return <View>{options}</View>;
}
Region-Specific Compliance
GDPR (EU/EEA)
For users in the EU, onboarding must include explicit consent:
function GDPRConsent({ onAccept }) {
const [consent, setConsent] = useState({
necessary: true, // Always on
analytics: false,
marketing: false,
});
return (
<Screen>
<Heading>{t('privacy_choices')}</Heading>
<ConsentToggle
label={t('necessary_cookies')}
description={t('required_for_app')}
value={true}
disabled={true}
/>
<ConsentToggle
label={t('analytics')}
description={t('helps_improve_app')}
value={consent.analytics}
onChange={(v) => setConsent({ ...consent, analytics: v })}
/>
<ConsentToggle
label={t('marketing')}
description={t('personalized_offers')}
value={consent.marketing}
onChange={(v) => setConsent({ ...consent, marketing: v })}
/>
<Button onPress={() => onAccept(consent)}>{t('continue')}</Button>
</Screen>
);
}
LGPD (Brazil)
Similar to GDPR but with specific requirements for data processing justification.
PIPL (China)
China's Personal Information Protection Law requires:
- Separate consent for processing sensitive personal information
- Clear disclosure of cross-border data transfers
- Data localization for certain categories
Localized Onboarding Copy
Translation Quality
Machine translation is not enough for onboarding copy. Onboarding text needs to:
- Sound natural in the target language
- Use culturally appropriate tone (formal vs. informal)
- Avoid idioms that don't translate
- Match the brand voice in each language
String Management
// translations/en.json
{
"welcome_headline": "Welcome to [App]",
"welcome_subtext": "The simplest way to manage your projects.",
"signup_cta": "Get Started",
"skip": "Skip for Now"
}
// translations/ja.json
{
"welcome_headline": "[App]へようこそ",
"welcome_subtext": "プロジェクト管理をシンプルに。",
"signup_cta": "始める",
"skip": "後で"
}
// translations/ar.json
{
"welcome_headline": "مرحباً بك في [App]",
"welcome_subtext": "أبسط طريقة لإدارة مشاريعك.",
"signup_cta": "ابدأ الآن",
"skip": "تخطي"
}
Measuring Localized Onboarding
Metrics by Locale
async function onboardingByLocale(dateRange) {
const locales = await getActiveLocales();
for (const locale of locales) {
const users = await getUsers(dateRange, { locale });
const completed = users.filter(u => u.onboardingCompleted);
const activated = users.filter(u => u.activated);
console.log(locale, {
users: users.length,
completion: (completed.length / users.length * 100).toFixed(1) + '%',
activation: (activated.length / users.length * 100).toFixed(1) + '%',
});
}
}
If a specific locale has significantly lower completion rates, investigate: is the translation poor? Are there layout issues? Is a region-specific step causing friction? For a detailed guide on diagnosing and fixing completion rate problems, see Improving Onboarding Completion Rates.
For deep linking features, see Tolinku deep linking. For onboarding use cases, see the onboarding documentation.
Get deep linking tips in your inbox
One email per week. No spam.