How to Test Language Switching on Android (Complete Guide)

Android devices ship with dozens of locale configurations, and users frequently change the system language to match personal preference, regional settings, or accessibility needs. When an app fails to

June 03, 2026 · 19 min read · How-To Guides

Why Language Switching Matters on Android

Android devices ship with dozens of locale configurations, and users frequently change the system language to match personal preference, regional settings, or accessibility needs. When an app fails to respond correctly to a locale change, the impact is immediate: UI text appears in the wrong language, date/time formats break, input methods misbehave, and localized resources (strings, drawables, layouts) may be missing, causing crashes or blank screens. These defects are especially costly because they surface only after the user has switched language, a scenario that automated regression suites often overlook if they run with a single, fixed locale.

From a business perspective, language‑related bugs erode trust in markets where localization is a selling point, increase support tickets, and can trigger negative reviews that affect store rankings. For regulated industries (finance, health, government), incorrect translation of legal text or dosage instructions can raise compliance risks. Consequently, testing language switching is not a nicety; it is a core part of functional, accessibility, and security validation.

Test Matrix for Language Switching

A comprehensive matrix helps you decide what to automate, what to verify manually, and where to focus exploratory testing. Below is a detailed table that categorizes tests by objective, risk, and recommended execution mode.

Test IDCategoryDescriptionSteps (high‑level)Expected ResultPriorityExecution Mode
L1Happy PathVerify UI text updates after system locale change1. Set device language to English (US) 2. Launch app 3. Navigate to a screen with localized strings 4. Change system language to Spanish (Spain) via Settings 5. Return to appAll visible text, hints, and labels appear in Spanish; no missing resourcesHighAutomated (UI test)
L2Happy PathConfirm date/time formats adapt to new localeSame as L1, but observe a DatePicker or TextView showing a dateDate follows dd/MM/yyyy for ES, MM/dd/yyyy for ENHighAutomated
L3Happy PathEnsure right‑to‑left (RTL) layout mirrors correctly for ArabicSet language to Arabic (Saudi Arabia) 2. Launch app 3. Check screens with horizontal LinearLayout, RecyclerView, or ActionBarLayout direction flips; icons that are direction‑sensitive (e.g., arrow) point correctlyMediumAutomated + Manual
L4Error PathDetect missing string resources causing crashes1. Add a new language qualifier (e.g., values‑fr) without translating all strings 2. Set device to French 3. Navigate to a screen that references the missing stringApp should display fallback English string or a placeholder, not crashHighAutomated (resource check)
L5Error PathHandle unsupported locale gracefullySet device to a locale not bundled in the app (e.g., values‑xx) 2. Launch appApp falls back to default locale (usually en) and remains functionalMediumManual
L6Edge CaseTest locale change while app is in background1. Launch app and navigate to a deep screen 2. Press Home 3. Change system language 4. Return to app via recent‑tasksUI updates to new language without requiring a restartMediumAutomated (activity lifecycle)
L7Edge CaseVerify dynamic language switch via in‑app picker without system change1. Open settings screen inside app 2. Choose a language from a Spinner 3. Observe immediate UI updateUI reflects chosen language instantly; system locale unchangedLowAutomated
L8AccessibilityConfirm TalkBack reads labels in the selected languageSet language to Japanese, enable TalkBack, navigate to a buttonSpoken feedback matches Japanese labelHighManual (with accessibility scanner)
L9AccessibilityEnsure font scaling respects locale‑specific glyphsSet language to Hindi, increase font size to 200%Text scales without clipping; complex glyphs render correctlyMediumManual
L10Security/PrivacyVerify that locale change does not leak sensitive data via logsSet language to Russian, trigger a login flow, inspect logcat for PIINo username, password, or token appears in logsHighAutomated (log assert)
L11Security/PrivacyCheck that locale‑based resources do not introduce insecure permissionsAdd a drawable with a locale qualifier that requests dangerous permission in manifest (hypothetical)Build fails or lint warning appearsLowStatic analysis
L12RegressionEnsure previously fixed locale bugs stay fixed after code changesRun L1‑L11 on a branch before and after a refactorNo new failures introducedHighCI pipeline

*Notes*:

Happy Path

Happy‑path tests confirm that the app behaves as expected when the system language changes under normal conditions. They cover text substitution, format adaptation, and layout direction. Automating these tests is straightforward because the expected state is deterministic and can be asserted via UI‑element properties or string resources.

Error Paths

Error‑path exercises probe missing or incomplete localization. A classic failure mode is a crash when the app attempts to load a string that lacks a translation for the current locale. By deliberately omitting translations for a subset of resources, you can verify that the app falls back gracefully (either to the default locale or to a placeholder) rather than throwing a Resources.NotFoundException.

Edge Cases

Edge cases include background locale switches, in‑app language pickers, and rapid successive changes. These scenarios test the robustness of the activity lifecycle, configuration propagation, and any caching mechanisms the app might employ (e.g., ViewModels that retain stale strings).

Accessibility

Accessibility validation ensures that services like TalkBack, Switch Access, and dynamic font scaling operate correctly with each locale. Some languages require complex script shaping (Indic, Arabic) or have longer words that can overflow containers; checking these prevents clipping or truncated spoken feedback.

Security/Privacy

Although less obvious, locale switching can affect security surfaces. Logs that inadvertently include locale‑specific formatting (e.g., formatting a token with a locale‑dependent number format) may expose patterns useful to an attacker. Additionally, malicious resource injection through a crafted locale qualifier is theoretically possible if the app loads external assets without validation.

Manual Testing Approach

Manual testing remains indispensable for exploratory checks, visual verification, and accessibility validation. Below is a step‑by‑step procedure you can follow on a physical device or an emulator.

Setup Devices/Emulators

  1. Install multiple system images: In Android Studio’s SDK Manager, download system images for API levels you intend to support (e.g., 30, 33, 34) with the “Google Play” variant to guarantee access to the Settings app.
  2. Enable Developer Options: Tap Build number seven times, then enable “USB debugging”.
  3. Grant ADB permission: On the device, allow USB debugging when prompted.
  4. Install the app under test: Use adb install -r app-debug.apk.
  5. Optional – Install Locale Test Apps: Apps like “MoreLocale 2” or “Custom Locale” can set locales not exposed through the Settings UI, useful for edge‑case testing.

Step‑by‑Step Procedure

  1. Baseline Capture
  1. System Language Switch
  1. App Re‑Entry
  1. Validate Each Screen
  1. Accessibility Check
  1. Font Scaling Test
  1. Repeat for Additional Locales
  1. Cleanup

Observables to Verify

Manual testing shines when you need to judge visual aesthetics, spot subtle truncation, or confirm that accessibility services interpret localized content correctly.

Automated Testing Approaches

Automation provides repeatability and speed, especially for regression suites that run on every commit. Android offers several layers for testing language switching, from unit‑level resource checks to full UI‑level instrumentation.

Instrumentation Tests with Espresso/UIAutomator

Espresso synchronizes with the UI thread and is ideal for validating that views display the correct text after a locale change. UIAutomator works across app boundaries and can interact with the system Settings app to change the locale.

Example: Changing locale via UIAutomator and validating with Espresso


// LocaleSwitchTest.kt
@RunWith(AndroidJUnit4::class)
class LocaleSwitchTest {

    @get:Rule
    val activityRule = ActivityScenarioRule(MainActivity::class.java)

    @Test
    fun `app updates UI after system language change to Spanish`() {
        // 1. Launch app in default locale (English)
        val scenario = activityRule.scenario
        scenario.onActivity {
            // Store initial English text for later comparison
            val hello = findViewById<TextView>(R.id.hello_text).text.toString()
            assertEquals("Hello", hello)
        }

        // 2. Use UIAutomator to open Settings and change language
        val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
        uiDevice.pressHome()
        // Open Settings
        val settingsIntent = Intent().apply {
            action = Settings.ACTION_LOCALE_SETTINGS
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
        }
        val context = InstrumentationRegistry.getInstrumentation().targetContext
        context.startActivity(settingsIntent)

        // Wait for Settings UI
        uiDevice.wait(Until.hasObject(By.desc("Language & input")), 5000)
        // Navigate to Language list (implementation varies by OEM; here we assume stock Android)
        uiDevice.findObject(new UiSelector().text("Languages")).click()
        uiDevice.wait(Until.hasObject(By.text("Español (España)")), 5000)
        uiDevice.findObject(new UiSelector().text("Español (España)")).click()
        // Set as primary (drag to top) – simplified: just select and back
        uiDevice.pressBack()

## Why Language Switching Matters on Android  
Android devices ship with dozens of locale configurations, and users frequently change the system language to match personal preference, regional settings, or accessibility needs. When an app fails to respond correctly to a locale change, the impact is immediate: UI text appears in the wrong language, date/time formats break, input methods misbehave, and localized resources (strings, drawables, layouts) may be missing, causing crashes or blank screens. These defects are especially costly because they surface only after the user has switched language, a scenario that automated regression suites often overlook if they run with a single, fixed locale.  

From a business perspective, language‑related bugs erode trust in markets where localization is a selling point, increase support tickets, and can trigger negative reviews that affect store rankings. For regulated industries (finance, health, government), incorrect translation of legal text or dosage instructions can raise compliance risks. Consequently, testing language switching is not a nicety; it is a core part of functional, accessibility, and security validation.  

## Test Matrix for Language Switching  

A comprehensive matrix helps you decide what to automate, what to verify manually, and where to focus exploratory testing. Below is a detailed table that categorizes tests by objective, risk, and recommended execution mode.  

| Test ID | Category | Description | Steps (high‑level) | Expected Result | Priority | Execution Mode |
|---------|----------|-------------|--------------------|-----------------|----------|----------------|
| L1 | Happy Path | Verify UI text updates after system locale change | 1. Set device language to English (US) 2. Launch app 3. Navigate to a screen with localized strings 4. Change system language to Spanish (Spain) via Settings 5. Return to app | All visible text, hints, and labels appear in Spanish; no missing resources | High | Automated (UI test) |
| L2 | Happy Path | Confirm date/time formats adapt to new locale | Same as L1, but observe a DatePicker or TextView showing a date | Date follows `dd/MM/yyyy` for ES, `MM/dd/yyyy` for EN | High | Automated |
| L3 | Happy Path | Ensure right‑to‑left (RTL) layout mirrors correctly for Arabic | Set language to Arabic (Saudi Arabia) 2. Launch app 3. Check screens with horizontal LinearLayout, RecyclerView, or ActionBar | Layout direction flips; icons that are direction‑sensitive (e.g., arrow) point correctly | Medium | Automated + Manual |
| L4 | Error Path | Detect missing string resources causing crashes | 1. Add a new language qualifier (e.g., values‑fr) without translating all strings 2. Set device to French 3. Navigate to a screen that references the missing string | App should display fallback English string or a placeholder, **not** crash | High | Automated (resource check) |
| L5 | Error Path | Handle unsupported locale gracefully | Set device to a locale not bundled in the app (e.g., values‑xx) 2. Launch app | App falls back to default locale (usually en) and remains functional | Medium | Manual |
| L6 | Edge Case | Test locale change while app is in background | 1. Launch app and navigate to a deep screen 2. Press Home 3. Change system language 4. Return to app via recent‑tasks | UI updates to new language without requiring a restart | Medium | Automated (activity lifecycle) |
| L7 | Edge Case | Verify dynamic language switch via in‑app picker without system change | 1. Open settings screen inside app 2. Choose a language from a Spinner 3. Observe immediate UI update | UI reflects chosen language instantly; system locale unchanged | Low | Automated |
| L8 | Accessibility | Confirm TalkBack reads labels in the selected language | Set language to Japanese, enable TalkBack, navigate to a button | Spoken feedback matches Japanese label | High | Manual (with accessibility scanner) |
| L9 | Accessibility | Ensure font scaling respects locale‑specific glyphs | Set language to Hindi, increase font size to 200% | Text scales without clipping; complex glyphs render correctly | Medium | Manual |
| L10 | Security/Privacy | Verify that locale change does not leak sensitive data via logs | Set language to Russian, trigger a login flow, inspect logcat for PII | No username, password, or token appears in logs | High | Automated (log assert) |
| L11 | Security/Privacy | Check that locale‑based resources do not introduce insecure permissions | Add a drawable with a locale qualifier that requests dangerous permission in manifest (hypothetical) | Build fails or lint warning appears | Low | Static analysis |
| L12 | Regression | Ensure previously fixed locale bugs stay fixed after code changes | Run L1‑L11 on a branch before and after a refactor | No new failures introduced | High | CI pipeline |

*Notes*:  
- Priority reflects impact on user experience and likelihood of occurrence.  
- Execution Mode suggests where the test yields the best ROI; however, many tests can be duplicated across modes for added confidence.  

### Happy Path  
Happy‑path tests confirm that the app behaves as expected when the system language changes under normal conditions. They cover text substitution, format adaptation, and layout direction. Automating these tests is straightforward because the expected state is deterministic and can be asserted via UI‑element properties or string resources.  

### Error Paths  
Error‑path exercises probe missing or incomplete localization. A classic failure mode is a crash when the app attempts to load a string that lacks a translation for the current locale. By deliberately omitting translations for a subset of resources, you can verify that the app falls back gracefully (either to the default locale or to a placeholder) rather than throwing a `Resources.NotFoundException`.  

### Edge Cases  
Edge cases include background locale switches, in‑app language pickers, and rapid successive changes. These scenarios test the robustness of the activity lifecycle, configuration propagation, and any caching mechanisms the app might employ (e.g., ViewModels that retain stale strings).  

### Accessibility  
Accessibility validation ensures that services like TalkBack, Switch Access, and dynamic font scaling operate correctly with each locale. Some languages require complex script shaping (Indic, Arabic) or have longer words that can overflow containers; checking these prevents clipping or truncated spoken feedback.  

### Security/Privacy  
Although less obvious, locale switching can affect security surfaces. Logs that inadvertently include locale‑specific formatting (e.g., formatting a token with a locale‑dependent number format) may expose patterns useful to an attacker. Additionally, malicious resource injection through a crafted locale qualifier is theoretically possible if the app loads external assets without validation.  

## Manual Testing Approach  

Manual testing remains indispensable for exploratory checks, visual verification, and accessibility validation. Below is a step‑by‑step procedure you can follow on a physical device or an emulator.  

### Setup Devices/Emulators  
1. **Install multiple system images**: In Android Studio’s SDK Manager, download system images for API levels you intend to support (e.g., 30, 33, 34) with the “Google Play” variant to guarantee access to the Settings app.  
2. **Enable Developer Options**: Tap Build number seven times, then enable “USB debugging”.  
3. **Grant ADB permission**: On the device, allow USB debugging when prompted.  
4. **Install the app under test**: Use `adb install -r app-debug.apk`.  
5. **Optional – Install Locale Test Apps**: Apps like “MoreLocale 2” or “Custom Locale” can set locales not exposed through the Settings UI, useful for edge‑case testing.  

### Step‑by‑Step Procedure  
1. **Baseline Capture**  
   - Set device language to English (US).  
   - Launch the app and navigate to each primary flow (login, home, settings, checkout).  
   - Take screenshots or record a short video for later comparison.  

2. **System Language Switch**  
   - Open **Settings → System → Languages & input → Languages**.  
   - Add a new language (e.g., French (France)) and drag it to the top to make it primary.  
   - Confirm the system UI changes language (settings menus, quick settings).  

3. **App Re‑Entry**  
   - Return to the app via recent‑tasks or launcher.  
   - Observe whether the UI updates instantly. If not, force‑stop the app (`adb shell am force-stop <package>`) and relaunch.  

4. **Validate Each Screen**  
   - For every screen visited in the baseline, check:  
     - All visible text matches the target language.  
     - Images with locale qualifiers (e.g., `drawable‑fr`) appear if applicable.  
     - Date/time pickers, number formatters, and currency symbols reflect the locale.  
     - Layout direction for RTL languages (if applicable).  
   - Note any missing strings, clipped text, or misaligned components.  

5. **Accessibility Check**  
   - Enable TalkBack (`Settings → Accessibility → TalkBack`).  
   - Navigate through the app using swipe gestures.  
   - Listen for spoken labels; verify they are in the correct language and not garbled.  

6. **Font Scaling Test**  
   - Go to **Settings → Accessibility → Font size** and set to Largest or Largest + 20%.  
   - Re‑evaluate screens for clipping, especially in languages with tall glyphs (e.g., Devanagari).  

7. **Repeat for Additional Locales**  
   - Cycle through a representative set: Spanish, German, Japanese, Arabic, Hindi, and a pseudo‑locale (e.g., `en‑XA` for accented characters).  

8. **Cleanup**  
   - Reset device language to original.  
   - Clear app data (`adb shell pm clear <package>`) to avoid state interference for the next test round.  

### Observables to Verify  
- **String equality**: Compare captured strings with those in `values‑<locale>/strings.xml`.  
- **Resource qualifiers**: Confirm that drawables, layouts, and raw files with locale qualifiers are selected correctly (use Android Studio’s Layout Inspector or `adb shell dumpsys activity activities`).  
- **Configuration propagation**: Ensure that `Configuration.getLocales()` returns the expected list after each change (can be checked via a small debug activity that logs the configuration).  
- **Accessibility node properties**: Verify that `contentDescription` and `text` attributes of View nodes are localized.  

Manual testing shines when you need to judge visual aesthetics, spot subtle truncation, or confirm that accessibility services interpret localized content correctly.  

## Automated Testing Approaches  

Automation provides repeatability and speed, especially for regression suites that run on every commit. Android offers several layers for testing language switching, from unit‑level resource checks to full UI‑level instrumentation.  

### Instrumentation Tests with Espresso/UIAutomator  
Espresso synchronizes with the UI thread and is ideal for validating that views display the correct text after a locale change. UIAutomator works across app boundaries and can interact with the system Settings app to change the locale.  

**Example: Changing locale via UIAutomator and validating with Espresso**  

// LocaleSwitchTest.kt

@RunWith(AndroidJUnit4::class)

class LocaleSwitchTest {

@get:Rule

val activityRule = ActivityScenarioRule(MainActivity::class.java)

@Test

fun app updates UI after system language change to Spanish() {

// 1. Launch app in default locale (English)

val scenario = activityRule.scenario

scenario.onActivity {

val hello = findViewById(R.id.hello_text).text.toString()

assertEquals("Hello", hello)

}

// 2. Use UIAutomator to open Settings and change language

val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

uiDevice.pressHome()

val settingsIntent = Intent().apply {

action = Settings.ACTION_LOCALE_SETTINGS

flags = Intent.FLAG_ACTIVITY_NEW_TASK

}

val context = InstrumentationRegistry.getInstrumentation().targetContext

context.startActivity(settingsIntent)

// Wait for Settings UI

uiDevice.wait(Until.hasObject(By.desc("Language & input")), 5000)

uiDevice.findObject(new UiSelector().text("Languages")).click()

uiDevice.wait(Until.hasObject(By.text("Español (España)")), 5000)

uiDevice.findObject(new UiSelector().text("Español (España)")).click()

uiDevice.pressBack()

uiDevice.pressBack() // return to launcher

// 3. Relaunch app

activityRule.scenario.onActivity {

// Text should now be in Spanish

val hello = findViewById(R.id.hello_text).text.toString()

assertEquals("Hola", hello)

}

}

}



Key points in the snippet:  
- UIAutomator drives the system Settings app to change the locale.  
- After returning to the app under test, Espresso asserts that a TextView now shows the Spanish string.  
- The test is self‑contained and can be run on any emulator or physical device with API 21+.  

### Using ADB Commands for Locale Changes  
For faster, headless locale switches you can bypass the Settings UI entirely with `adb`. This is useful in CI pipelines or when you need to test many locales in a loop.  

# Set locale to French (France)

adb shell setprop persist.sys.language fr

adb shell setprop persist.sys.country FR

adb shell stop && adb shell start # restart UI to apply

# Verify current locale

adb shell getprop persist.sys.language # should print fr

adb shell getprop persist.sys.country # should print FR



After changing the locale, launch your app and run Espresso checks as usual. Note that a full UI restart (`stop`/`start`) is required on some devices; on others, broadcasting `android.intent.action.LOCALE_CHANGED` suffices:  

adb shell am broadcast -a android.intent.action.LOCALE_CHANGED



### Unit‑Level Resource Validation  
Before UI tests run, you can catch missing translations early with a unit test that parses the `strings.xml` files.  

// LocaleResourceTest.java

@Test

public void allLocalesHaveSameKeySet() throws IOException {

Resources res = InstrumentationRegistry.getInstrumentation().getTargetContext().getResources();

Set baseKeys = getStringKeys(res, Locale.US);

String[] locales = {"fr", "de", "ja", "ar", "hi"};

for (String loc : locales) {

Locale l = new Locale(loc.split("_")[0], loc.length() > 2 ? loc.substring(3) : "");

Set localeKeys = getStringKeys(res, l);

assertEquals("Missing keys for locale " + loc, baseKeys, localeKeys);

}

}

private Set getStringKeys(Resources res, Locale locale) {

Configuration config = new Configuration();

config.setLocale(locale);

Context ctx = res.getConfiguration().getLocale().equals(locale)

? res.getConfiguration()

: res.getConfiguration(); // fallback

// Use AssetManager to get raw XML and parse keys – simplified here

return res.getStringArray(R.array.all_string_keys); // assume you maintain a master list

}



If you maintain a master list of string IDs (e.g., via a generated `R.string` int array), the test can compare key sets across all locale folders and fail the build when a translation is missing.  

### CI Integration  
Add the locale‑switch UI test to your instrumented test suite and run it on a matrix of locales using Firebase Test Lab or a local emulator farm. Example `gradle` command:  

./gradlew connectedAndroidTest \

-Pandroid.testInstrumentationRunnerArguments.locale=fr_FR,de_DE,ja_JP,ar_SA,hi_IN



In your test runner, read the argument and apply `Configuration.setLocale` before launching the activity under test.  

### Playwright/WebView Hybrid (if your app hosts web content)  
For apps that embed a WebView, you can drive language changes from the web side using Playwright while the native side remains unchanged.  

// playwright-test.js

const { chromium } = require('playwright');

(async () => {

const browser = await chromium.launch();

const context = await browser.newContext({

locale: 'fr-FR',

timezoneId: 'Europe/Paris',

});

const page = await context.newPage();

await page.goto('https://example.com');

const text = await page.innerText('h1');

expect(text).toBe('Bonjour'); // assuming the site translates

await browser.close();

})();



Though this focuses on the web layer, it demonstrates how you can verify that localized web resources respect the locale you set at the browser context level.  

## Autonomous, Persona‑Driven Exploration with SUSA  

While scripted tests cover known scenarios, real users exhibit varied behaviors that can trigger hidden bugs—especially when language switching interacts with navigation patterns, input methods, or accessibility tools. An autonomous QA platform like **SUSA** can complement scripted efforts by exploring the app with multiple user personas, each embodying distinct interaction styles.  

### How SUSA Handles Language Switching  
When you point SUSA at an APK or a web URL, it builds a state‑graph of screens as it taps, types, scrolls, and responds to system dialogs. The engine respects the current device locale, but it also randomly changes the locale during a session to simulate a user who switches languages mid‑flow. Because Susa does not rely on pre‑written scripts, it can discover issues such as:  

- A screen that assumes a fixed string length and overflows after a language change.  
- A background service that caches locale‑specific data and fails to invalidate it when the locale changes.  
- A third‑party SDK that initializes with the locale at app start and never updates, causing mismatched UI (e.g., a map SDK showing English labels while the rest of the app is in Japanese).  

### Persona Profiles Relevant to Language  
Susa ships with built‑in personas; the following are especially useful for language‑switch testing:  

| Persona | Behavior Traits | What It Uncovers |
|---------|----------------|------------------|
| Curious | Taps every visible element, explores deep nested menus | Finds hidden settings screens where locale‑dependent strings are missing. |
| Impatient | Performs rapid actions, often triggers back presses quickly | Detects race conditions where a locale change is intercepted mid‑animation, leaving UI in a mixed state. |
| Novice | Prefers default actions, avoids advanced gestures | Highlights reliance on system language picker versus in‑app picker; reveals if novice users cannot locate the language setting. |
| Elderly | Uses larger font sizes, enables accessibility features | Shows whether scaled fonts break layout in specific locales (e.g., Indic scripts). |
| Accessibility | Activates TalkBack, Switch Access, and explores with assistive tech | Confirms that spoken feedback and focus order stay correct after a locale switch. |
| Adversarial | Attempts invalid inputs, tries to force crashes | May trigger locale‑specific error paths, such as passing a malformed locale string to a third‑party library. |
| Power User | Uses shortcuts, copies/pastes, toggles developer options | Finds bugs that appear only when developer options like “Don’t keep activities” are combined with locale changes. |

During a run, Susa logs each locale switch, the

Test Your App Autonomously

Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.

Try SUSA Free