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
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
- 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.
- Enable Developer Options: Tap Build number seven times, then enable “USB debugging”.
- Grant ADB permission: On the device, allow USB debugging when prompted.
- Install the app under test: Use
adb install -r app-debug.apk. - 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
- 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.
- 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).
- 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) and relaunch.
- 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.
- 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.
- 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).
- Repeat for Additional Locales
- Cycle through a representative set: Spanish, German, Japanese, Arabic, Hindi, and a pseudo‑locale (e.g.,
en-XAfor accented characters).
- Cleanup
- Reset device language to original.
- Clear app data (
adb shell pm clear) to avoid state interference for the next test round.
Observables to Verify
- String equality: Compare captured strings with those in
values‑./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
contentDescriptionandtextattributes 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 {
// 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
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
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
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
assertEquals("Missing keys for locale " + loc, baseKeys, localeKeys);
}
}
private Set
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