---
description: Capacitor plugin to manage the app's language override independently of the device language on Android and iOS.
title: Capacitor App Language Plugin for Android & iOS - Capawesome
image: https://capawesome.io/docs/assets/images/social/sdks/capacitor/app-language.png
---

<!doctype html> 

[Skip to content ](#capacitor-app-language-plugin) 

[📲 Introducing **Build Sharing** — get your builds onto testers' devices with a link & QR code. No account required. ](/blog/share-mobile-app-builds-with-testers/) 

* [ SDKs ](/docs/sdks/)
* [ iOS ](#ios)
* [ Configuration ](#configuration)
* [ Usage ](#usage)
* [ API ](#api)
* [ Platform Behavior ](#platform-behavior)
* [ FAQ ](#faq)
* [ Related Plugins ](#related-plugins)
* [ Newsletter ](#newsletter)
* [ Changelog ](#changelog)
* [ License ](#license)
* [ App Launcher ](/docs/sdks/capacitor/app-launcher/)
* [ App Review ](/docs/sdks/capacitor/app-review/)
* [ App Shortcuts ](/docs/sdks/capacitor/app-shortcuts/)
* [ App Tracking Transparency ](/docs/sdks/capacitor/app-tracking-transparency/)
* [ App Update ](/docs/sdks/capacitor/app-update/)
* [ Apple Sign-In ](/docs/sdks/capacitor/apple-sign-in/)
* [ Asset Manager ](/docs/sdks/capacitor/asset-manager/)
* [ Audio Player ](/docs/sdks/capacitor/audio-player/)
* [ Audio Recorder ](/docs/sdks/capacitor/audio-recorder/)
* [ Audio Session ](/docs/sdks/capacitor/audio-session/)
* [ Background Task ](/docs/sdks/capacitor/background-task/)
* [ Badge ](/docs/sdks/capacitor/badge/)
* [ Barometer ](/docs/sdks/capacitor/barometer/)
* [ Battery ](/docs/sdks/capacitor/battery/)
* [ Biometrics ](/docs/sdks/capacitor/biometrics/)
* [ Bluetooth Low Energy ](/docs/sdks/capacitor/bluetooth-low-energy/)
* [ Clipboard ](/docs/sdks/capacitor/clipboard/)
* [ Cloudinary ](/docs/sdks/capacitor/cloudinary/)
* [ Compass ](/docs/sdks/capacitor/compass/)
* [ Contacts ](/docs/sdks/capacitor/contacts/)
* [ Datetime Picker ](/docs/sdks/capacitor/datetime-picker/)
* [ Device Info ](/docs/sdks/capacitor/device-info/)
* [ Dialog ](/docs/sdks/capacitor/dialog/)
* [ Exif ](/docs/sdks/capacitor/exif/)
* [ Facebook Sign-In ](/docs/sdks/capacitor/facebook-sign-in/)
* [ File Compressor ](/docs/sdks/capacitor/file-compressor/)
* [ File Opener ](/docs/sdks/capacitor/file-opener/)
* [ File Picker ](/docs/sdks/capacitor/file-picker/)
* [ Firebase ](/docs/sdks/capacitor/firebase/)
* [ Formbricks ](/docs/sdks/capacitor/formbricks/)
* [ Geocoder ](/docs/sdks/capacitor/geocoder/)
* [ Google Sign-In ](/docs/sdks/capacitor/google-sign-in/)
* [ Grafana Faro ](/docs/sdks/capacitor/grafana-faro/)
* [ Gyroscope ](/docs/sdks/capacitor/gyroscope/)
* [ Haptics ](/docs/sdks/capacitor/haptics/)
* [ Home Indicator ](/docs/sdks/capacitor/home-indicator/)
* [ In-App Browser ](/docs/sdks/capacitor/in-app-browser/)
* [ Install Referrer ](/docs/sdks/capacitor/install-referrer/)
* [ Keep Awake ](/docs/sdks/capacitor/keep-awake/)
* [ libSQL ](/docs/sdks/capacitor/libsql/)
* [ Light Sensor ](/docs/sdks/capacitor/light-sensor/)
* [ Live Update ](/docs/sdks/capacitor/live-update/)
* [ Localization ](/docs/sdks/capacitor/localization/)
* [ Mail Composer ](/docs/sdks/capacitor/mail-composer/)
* [ Managed Configurations ](/docs/sdks/capacitor/managed-configurations/)
* [ Maps Launcher ](/docs/sdks/capacitor/maps-launcher/)
* [ Media Session ](/docs/sdks/capacitor/media-session/)
* [ ML Kit ](/docs/sdks/capacitor/mlkit/)
* [ Navigation Bar ](/docs/sdks/capacitor/navigation-bar/)
* [ Network ](/docs/sdks/capacitor/network/)
* [ NFC ](/docs/sdks/capacitor/nfc/)
* [ Node.js ](/docs/sdks/capacitor/nodejs/)
* [ OAuth ](/docs/sdks/capacitor/oauth/)
* [ Passkeys ](/docs/sdks/capacitor/passkeys/)
* [ Password Autofill ](/docs/sdks/capacitor/password-autofill/)
* [ PDF Generator ](/docs/sdks/capacitor/pdf-generator/)
* [ PDF Viewer ](/docs/sdks/capacitor/pdf-viewer/)
* [ Pedometer ](/docs/sdks/capacitor/pedometer/)
* [ Permissions ](/docs/sdks/capacitor/permissions/)
* [ Phone Dialer ](/docs/sdks/capacitor/phone-dialer/)
* [ Photo Editor ](/docs/sdks/capacitor/photo-editor/)
* [ Photo Manipulator ](/docs/sdks/capacitor/photo-manipulator/)
* [ PixLive ](/docs/sdks/capacitor/pixlive/)
* [ PostHog ](/docs/sdks/capacitor/posthog/)
* [ Printer ](/docs/sdks/capacitor/printer/)
* [ Privacy Screen ](/docs/sdks/capacitor/privacy-screen/)
* [ Proximity Sensor ](/docs/sdks/capacitor/proximity-sensor/)
* [ Purchases ](/docs/sdks/capacitor/purchases/)
* [ RealtimeKit ](/docs/sdks/capacitor/realtimekit/)
* [ Root Detection ](/docs/sdks/capacitor/root-detection/)
* [ Screen Brightness ](/docs/sdks/capacitor/screen-brightness/)
* [ Screen Orientation ](/docs/sdks/capacitor/screen-orientation/)
* [ Screen Reader ](/docs/sdks/capacitor/screen-reader/)
* [ Screenshot ](/docs/sdks/capacitor/screenshot/)
* [ Secure Preferences ](/docs/sdks/capacitor/secure-preferences/)
* [ Settings Launcher ](/docs/sdks/capacitor/settings-launcher/)
* [ Shake ](/docs/sdks/capacitor/shake/)
* [ Silent Mode ](/docs/sdks/capacitor/silent-mode/)
* [ SIM ](/docs/sdks/capacitor/sim/)
* [ SMS Composer ](/docs/sdks/capacitor/sms-composer/)
* [ Speech Recognition ](/docs/sdks/capacitor/speech-recognition/)
* [ Speech Synthesis ](/docs/sdks/capacitor/speech-synthesis/)
* [ Share Target ](/docs/sdks/capacitor/share-target/)
* [ Square Mobile Payments ](/docs/sdks/capacitor/square-mobile-payments/)
* [ SQLite ](/docs/sdks/capacitor/sqlite/)
* [ Superwall ](/docs/sdks/capacitor/superwall/)
* [ System WebView ](/docs/sdks/capacitor/system-webview/)
* [ Text Interaction ](/docs/sdks/capacitor/text-interaction/)
* [ Text Zoom ](/docs/sdks/capacitor/text-zoom/)
* [ Thermal State ](/docs/sdks/capacitor/thermal-state/)
* [ Toast ](/docs/sdks/capacitor/toast/)
* [ Torch ](/docs/sdks/capacitor/torch/)
* [ Vault ](/docs/sdks/capacitor/vault/)
* [ Volume ](/docs/sdks/capacitor/volume/)
* [ Wallet ](/docs/sdks/capacitor/wallet/)
* [ Wifi ](/docs/sdks/capacitor/wifi/)
* [ Zip ](/docs/sdks/capacitor/zip/)
* [ Cordova ](/docs/sdks/cordova/)
* [ Cloud ](/docs/cloud/)
* [ Integrations ](/docs/cloud/live-updates/integrations/)
* Concepts
* Reference
* [ Troubleshooting ](/docs/cloud/live-updates/troubleshooting/)
* [ FAQ ](/docs/cloud/live-updates/faq/)
* [ Native Builds ](/docs/cloud/native-builds/)
* [ Set Up Environments ](/docs/cloud/native-builds/environments/)
* [ Overwrite Native Configurations ](/docs/cloud/native-builds/native-configurations/)
* [ Auto-Increment Build Numbers ](/docs/cloud/native-builds/auto-incrementing-build-numbers/)
* [ Configure the Web Build Script ](/docs/cloud/native-builds/web-build-script/)
* [ Build from a Monorepo ](/docs/cloud/native-builds/monorepo/)
* [ Use pnpm, Yarn, or bun ](/docs/cloud/native-builds/package-managers/)
* [ Install Private npm Packages ](/docs/cloud/native-builds/npm-private-registry/)
* [ Override the Java Version ](/docs/cloud/native-builds/override-java-version/)
* [ Custom iOS Provisioning Profiles ](/docs/cloud/native-builds/custom-ios-provisioning-profiles/)
* [ Build without Git ](/docs/cloud/native-builds/build-without-git/)
* [ Access Git Behind a Firewall ](/docs/cloud/native-builds/firewall-access/)
* [ Integrations ](/docs/cloud/native-builds/integrations/)
* Reference
* [ Troubleshooting ](/docs/cloud/native-builds/troubleshooting/)
* [ FAQ ](/docs/cloud/native-builds/faq/)
* [ App Store Publishing ](/docs/cloud/app-store-publishing/)
* [ Submit a Build ](/docs/cloud/app-store-publishing/submit-a-build/)
* [ Submit Automatically After a Build ](/docs/cloud/app-store-publishing/submit-automatically/)
* [ Troubleshooting ](/docs/cloud/app-store-publishing/troubleshooting/)
* [ FAQ ](/docs/cloud/app-store-publishing/faq/)
* [ Automations ](/docs/cloud/automations/)
* [ Reference ](/docs/cloud/automations/reference/)
* [ Troubleshooting ](/docs/cloud/automations/troubleshooting/)
* [ FAQ ](/docs/cloud/automations/faq/)
* [ Assist ](/docs/cloud/assist/)
* [ CLI ](/docs/cloud/cli/)
* APIs and SDKs
* [ Webhooks ](/docs/cloud/webhooks/)
* [ Integrations ](/docs/cloud/integrations/)
* Account
* [ Organization ](/docs/cloud/organizations/)
* [ Two-Factor Enforcement ](/docs/cloud/organizations/two-factor-authentication/)
* [ Audit Logs ](/docs/cloud/organizations/audit-logs/)
* [ Billing ](/docs/cloud/organizations/billing/)
* [ License Keys ](/docs/cloud/license-keys/)
* [ AI ](/docs/ai/)
* [ Insiders ](/docs/insiders/)
* [ Billing & Plans ](/docs/insiders/billing-and-plans/)
* [ FAQ ](/docs/insiders/faq/)
* [ License ](https://capawesome.io/legal/eula/)
* [ Support ](/docs/support/)
* [ Contributing ](/docs/contributing/)
* Contributing code
* [ Code of Conduct ](/docs/contributing/code-of-conduct/)
* [ Questions ](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#creating-a-discussion)
* [ Blog ](/blog/)
* Categories

* [ iOS ](#ios)
* [ Configuration ](#configuration)
* [ Usage ](#usage)
* [ API ](#api)
* [ Platform Behavior ](#platform-behavior)
* [ FAQ ](#faq)
* [ Related Plugins ](#related-plugins)
* [ Newsletter ](#newsletter)
* [ Changelog ](#changelog)
* [ License ](#license)

# Capacitor App Language Plugin[¶](#capacitor-app-language-plugin "Permanent link")

Capacitor plugin to manage the app's own language override, independent of the device language.

[ ![Deliver Live Updates to your Capacitor app with Capawesome Cloud](../../../assets/external/cloud.capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.69628c3f.png) ](https://cloud.capawesome.io/) 

## Features[¶](#features "Permanent link")

* 🌐 **Language override**: Set the app's language independently of the device language (Android).
* 🔎 **Read language**: Read the app's current language override.
* ♻️ **Reset**: Clear the override so the app follows the device language again (Android).
* ⚙️ **Settings**: Deep-link to the app's system settings page where the user can change the app language.
* 📦 **CocoaPods & SPM**: Supports CocoaPods and Swift Package Manager for iOS.
* 🔁 **Up-to-date**: Always supports the latest Capacitor version.
* 🤝 **Compatibility**: Works alongside the [Localization](https://capawesome.io/docs/sdks/capacitor/localization/) plugin, which reads the user's localization preferences.

Missing a feature? Just [open an issue](https://github.com/capawesome-team/capacitor-plugins/issues) and we'll take a look!

## Use Cases[¶](#use-cases "Permanent link")

The App Language plugin is typically used whenever an app offers its own language selection, for example:

* **In-app language switcher**: Let users pick the app language from a settings screen instead of changing the device language (Android).
* **Consistent native dialogs**: Make sure natively rendered strings like permission dialogs and notifications match the language of your web UI.
* **Settings deep link**: Guide iOS users to the app's system settings page, where they can change the app language.
* **System default option**: Offer a "system default" entry that clears the override so the app follows the device language again (Android).

## Compatibility[¶](#compatibility "Permanent link")

| Plugin Version | Capacitor Version | Status         |
| -------------- | ----------------- | -------------- |
| 0.x.x          | \>=8.x.x          | Active support |

## Installation[¶](#installation "Permanent link")

You can use our **AI-Assisted Setup** to install the plugin. Add the [Capawesome Skills](https://github.com/capawesome-team/skills) to your AI tool using the following command:

`[](#%5F%5Fcodelineno-0-1)npx skills add capawesome-team/skills --skill capacitor-plugins
`

Then use the following prompt:

`` [](#%5F%5Fcodelineno-1-1) Use the `capacitor-plugins` skill from `capawesome-team/skills` to install the `@capawesome/capacitor-app-language` plugin in my project.
 ``

If you prefer **Manual Setup**, install the plugin by running the following commands and follow the platform-specific instructions below:

`[](#%5F%5Fcodelineno-2-1)npm install @capawesome/capacitor-app-language
[](#%5F%5Fcodelineno-2-2)npx cap sync
`

This plugin only affects **natively rendered** strings (e.g. permission dialogs, notifications, or plugin-presented sheets). The language of your web UI should be handled by your app's i18n library.

### Android[¶](#android "Permanent link")

#### Variables[¶](#variables "Permanent link")

This plugin will use the following project variables (defined in your app's `variables.gradle` file):

* `$androidxAppCompatVersion` version of `androidx.appcompat:appcompat` (default: `1.7.1`)

#### Locale Configuration[¶](#locale-configuration "Permanent link")

To integrate the app language into the system settings (Android 13+), declare the supported locales in a `res/xml/locales_config.xml` file and reference it from the `<application>` tag in your `AndroidManifest.xml`:

`[](#%5F%5Fcodelineno-3-1)<!-- res/xml/locales_config.xml -->
[](#%5F%5Fcodelineno-3-2)<?xml version="1.0" encoding="utf-8"?>
[](#%5F%5Fcodelineno-3-3)<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
[](#%5F%5Fcodelineno-3-4)    <locale android:name="en" />
[](#%5F%5Fcodelineno-3-5)    <locale android:name="de" />
[](#%5F%5Fcodelineno-3-6)</locale-config>
`

`[](#%5F%5Fcodelineno-4-1)<application
[](#%5F%5Fcodelineno-4-2)    ...
[](#%5F%5Fcodelineno-4-3)    android:localeConfig="@xml/locales_config">
`

To persist the selected language across app restarts on Android 12 and below, add the following `<service>` inside the `<application>` tag of your `AndroidManifest.xml`:

`[](#%5F%5Fcodelineno-5-1)<service
[](#%5F%5Fcodelineno-5-2)    android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
[](#%5F%5Fcodelineno-5-3)    android:enabled="false"
[](#%5F%5Fcodelineno-5-4)    android:exported="false">
[](#%5F%5Fcodelineno-5-5)    <meta-data
[](#%5F%5Fcodelineno-5-6)        android:name="autoStoreLocales"
[](#%5F%5Fcodelineno-5-7)        android:value="true" />
[](#%5F%5Fcodelineno-5-8)</service>
`

> \[!NOTE\] Setting the language recreates the current activity, which reloads the web view.

### iOS[¶](#ios "Permanent link")

On iOS, the app language can only be changed by the **user** in the system settings. The `setLanguage(...)` and `resetLanguage(...)` methods are therefore not available. Use `openSettings(...)` to deep-link the user to the app's settings page.

The per-app language row is only shown in the system settings if the app bundle provides **more than one** localization. Declare the supported localizations in the `Info.plist` file of your app:

`[](#%5F%5Fcodelineno-6-1)<key>CFBundleLocalizations</key>
[](#%5F%5Fcodelineno-6-2)<array>
[](#%5F%5Fcodelineno-6-3)    <string>en</string>
[](#%5F%5Fcodelineno-6-4)    <string>de</string>
[](#%5F%5Fcodelineno-6-5)</array>
`

## Configuration[¶](#configuration "Permanent link")

No configuration required for this plugin.

## Usage[¶](#usage "Permanent link")

The following examples show how to get, set, and reset the app language override and open the app's settings page.

### Get the current language override[¶](#get-the-current-language-override "Permanent link")

Read the BCP 47 language tag of the app's current language override. Returns `null` if no override is set and the app follows the device language:

`[](#%5F%5Fcodelineno-7-1)import { AppLanguage } from '@capawesome/capacitor-app-language';
[](#%5F%5Fcodelineno-7-2)
[](#%5F%5Fcodelineno-7-3)const getLanguage = async () => {
[](#%5F%5Fcodelineno-7-4)  const { languageTag } = await AppLanguage.getLanguage();
[](#%5F%5Fcodelineno-7-5)  return languageTag;
[](#%5F%5Fcodelineno-7-6)};
`

### Set the app language[¶](#set-the-app-language "Permanent link")

Set the app's language override, independent of the device language. Note that this recreates the current activity, which reloads the web view. Only available on Android:

`[](#%5F%5Fcodelineno-8-1)import { AppLanguage } from '@capawesome/capacitor-app-language';
[](#%5F%5Fcodelineno-8-2)
[](#%5F%5Fcodelineno-8-3)const setLanguage = async () => {
[](#%5F%5Fcodelineno-8-4)  await AppLanguage.setLanguage({ languageTag: 'de-DE' });
[](#%5F%5Fcodelineno-8-5)};
`

### Reset the language override[¶](#reset-the-language-override "Permanent link")

Clear the override so the app follows the device language again. Only available on Android:

`[](#%5F%5Fcodelineno-9-1)import { AppLanguage } from '@capawesome/capacitor-app-language';
[](#%5F%5Fcodelineno-9-2)
[](#%5F%5Fcodelineno-9-3)const resetLanguage = async () => {
[](#%5F%5Fcodelineno-9-4)  await AppLanguage.resetLanguage();
[](#%5F%5Fcodelineno-9-5)};
`

### Open the app's settings page[¶](#open-the-apps-settings-page "Permanent link")

Deep-link the user to the app's page in the system settings. On iOS, this is where the user can change the app language:

`[](#%5F%5Fcodelineno-10-1)import { AppLanguage } from '@capawesome/capacitor-app-language';
[](#%5F%5Fcodelineno-10-2)
[](#%5F%5Fcodelineno-10-3)const openSettings = async () => {
[](#%5F%5Fcodelineno-10-4)  await AppLanguage.openSettings();
[](#%5F%5Fcodelineno-10-5)};
`

## API[¶](#api "Permanent link")

* [getLanguage()](#getlanguage)
* [openSettings()](#opensettings)
* [resetLanguage()](#resetlanguage)
* [setLanguage(...)](#setlanguage)
* [Interfaces](#interfaces)

### getLanguage()[¶](#getlanguage "Permanent link")

`[](#%5F%5Fcodelineno-11-1)getLanguage() => Promise<GetLanguageResult>
`

Get the app's current language override.

The language override is independent of the device language and only affects natively rendered strings (e.g. permission dialogs).

**Returns:** `Promise<[GetLanguageResult](#getlanguageresult)>`

**Since:** 0.1.0

---

### openSettings()[¶](#opensettings "Permanent link")

`[](#%5F%5Fcodelineno-12-1)openSettings() => Promise<void>
`

Open the app's settings page in the system settings.

On iOS, this is where the user can change the app's language (the language row is only shown if the app bundle provides more than one localization).

**Since:** 0.1.0

---

### resetLanguage()[¶](#resetlanguage "Permanent link")

`[](#%5F%5Fcodelineno-13-1)resetLanguage() => Promise<void>
`

Reset the app's language override so the app follows the device language again.

Resetting the language recreates the current activity, which reloads the web view.

Only available on Android.

**Since:** 0.1.0

---

### setLanguage(...)[¶](#setlanguage "Permanent link")

`[](#%5F%5Fcodelineno-14-1)setLanguage(options: SetLanguageOptions) => Promise<void>
`

Set the app's language override.

Setting the language recreates the current activity, which reloads the web view.

On iOS, the language can only be changed by the user in the system settings (see the `openSettings(...)` method).

Only available on Android.

| Param       | Type                                      |
| ----------- | ----------------------------------------- |
| **options** | [SetLanguageOptions](#setlanguageoptions) |

**Since:** 0.1.0

---

### Interfaces[¶](#interfaces "Permanent link")

#### GetLanguageResult[¶](#getlanguageresult "Permanent link")

| Prop            | Type           | Description                                                                                                                         | Since |
| --------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----- |
| **languageTag** | string \| null | The BCP 47 language tag of the app's language override. Returns null if no override is set and the app follows the device language. | 0.1.0 |

#### SetLanguageOptions[¶](#setlanguageoptions "Permanent link")

| Prop            | Type   | Description                                                    | Since |
| --------------- | ------ | -------------------------------------------------------------- | ----- |
| **languageTag** | string | The BCP 47 language tag to set as the app's language override. | 0.1.0 |

## Platform Behavior[¶](#platform-behavior "Permanent link")

Setting the app language programmatically is only supported on Android. On iOS, the language can only be changed by the user in the system settings.

| Method           | Android | iOS             | Web             |
| ---------------- | ------- | --------------- | --------------- |
| getLanguage()    | ✅       | ✅               | ❌ Unimplemented |
| setLanguage(...) | ✅       | ❌ Unimplemented | ❌ Unimplemented |
| resetLanguage()  | ✅       | ❌ Unimplemented | ❌ Unimplemented |
| openSettings()   | ✅       | ✅               | ❌ Unimplemented |

## FAQ[¶](#faq "Permanent link")

### Why can't I set the app language programmatically on iOS?[¶](#why-cant-i-set-the-app-language-programmatically-on-ios "Permanent link")

On iOS, the app language can only be changed by the user in the system settings, so the `setLanguage(...)` and `resetLanguage(...)` methods are not available there. Use `openSettings()` to deep-link the user to the app's settings page, where the language can be changed.

### Does this plugin translate my web UI?[¶](#does-this-plugin-translate-my-web-ui "Permanent link")

No. The language override only affects natively rendered strings, such as permission dialogs, notifications, or plugin-presented sheets. The language of your web UI should be handled by your app's i18n library.

### Why is the language row not shown in the iOS system settings?[¶](#why-is-the-language-row-not-shown-in-the-ios-system-settings "Permanent link")

The per-app language row only appears if the app bundle provides more than one localization. Declare the supported localizations under the `CFBundleLocalizations` key in your app's `Info.plist`, as described in the [Installation](#installation) section.

### Why does my app reload after calling `setLanguage`?[¶](#why-does-my-app-reload-after-calling-setlanguage "Permanent link")

Setting or resetting the language recreates the current activity on Android, which reloads the web view. This is expected behavior and cannot be avoided.

### How does the selected language persist across app restarts on Android?[¶](#how-does-the-selected-language-persist-across-app-restarts-on-android "Permanent link")

On Android 13 and above, the override is integrated with the system settings via a `locales_config.xml` file. On Android 12 and below, you need to add the `AppLocalesMetadataHolderService` service to your `AndroidManifest.xml` to persist the selected language, as described in the [Installation](#installation) section.

### How is this plugin different from the Localization plugin?[¶](#how-is-this-plugin-different-from-the-localization-plugin "Permanent link")

The [Localization](https://capawesome.io/docs/sdks/capacitor/localization/) plugin reads the user's localization preferences, such as preferred locales, time zone, and regional formatting settings. The App Language plugin manages the app's own language override, independent of the device language. The two plugins work well together.

### Can I use this plugin with Ionic, React, Vue or Angular?[¶](#can-i-use-this-plugin-with-ionic-react-vue-or-angular "Permanent link")

Yes, the plugin is framework-agnostic. It works in any Capacitor app regardless of the web framework, including Ionic with Angular, React, or Vue, as well as plain JavaScript projects.

## Related Plugins[¶](#related-plugins "Permanent link")

* [Localization](https://capawesome.io/docs/sdks/capacitor/localization/): Read the user's localization preferences, such as preferred locales, time zone, and regional formatting settings.
* [Settings Launcher](https://capawesome.io/docs/sdks/capacitor/settings-launcher/): Open native settings screens.

## Newsletter[¶](#newsletter "Permanent link")

Stay up to date with the latest news and updates about the Capawesome, Capacitor, and Ionic ecosystem by subscribing to our [Capawesome Newsletter](https://cloud.capawesome.io/newsletter/).

## Changelog[¶](#changelog "Permanent link")

See [CHANGELOG.md](https://github.com/capawesome-team/capacitor-plugins/blob/main/packages/app-language/CHANGELOG.md).

## License[¶](#license "Permanent link")

See [LICENSE](https://github.com/capawesome-team/capacitor-plugins/blob/main/packages/app-language/LICENSE).

July 8, 2026 

Back to top

```json
{"@context": "https://schema.org", "@graph": [{"@type": "TechArticle", "@id": "https://capawesome.io/docs/sdks/capacitor/app-language/#article", "headline": "Capacitor App Language Plugin for Android & iOS", "name": "Capacitor App Language Plugin for Android & iOS", "description": "Capacitor plugin to manage the app's language override independently of the device language on Android and iOS.", "inLanguage": "en", "url": "https://capawesome.io/docs/sdks/capacitor/app-language/", "mainEntityOfPage": "https://capawesome.io/docs/sdks/capacitor/app-language/", "author": {"@type": "Organization", "name": "Capawesome", "url": "https://capawesome.io", "logo": {"@type": "ImageObject", "url": "https://capawesome.io/assets/images/logo.svg"}}, "publisher": {"@type": "Organization", "name": "Capawesome", "url": "https://capawesome.io", "logo": {"@type": "ImageObject", "url": "https://capawesome.io/assets/images/logo.svg"}}, "about": {"@id": "https://capawesome.io/docs/sdks/capacitor/app-language/#software"}}, {"@type": "SoftwareSourceCode", "@id": "https://capawesome.io/docs/sdks/capacitor/app-language/#software", "name": "Capacitor App Language Plugin for Android & iOS", "description": "Capacitor plugin to manage the app's language override independently of the device language on Android and iOS.", "url": "https://capawesome.io/docs/sdks/capacitor/app-language/", "programmingLanguage": "TypeScript", "runtimePlatform": "Capacitor", "codeRepository": "https://github.com/capawesome-team", "author": {"@type": "Organization", "name": "Capawesome", "url": "https://capawesome.io", "logo": {"@type": "ImageObject", "url": "https://capawesome.io/assets/images/logo.svg"}}, "publisher": {"@type": "Organization", "name": "Capawesome", "url": "https://capawesome.io", "logo": {"@type": "ImageObject", "url": "https://capawesome.io/assets/images/logo.svg"}}}]}
{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Why can't I set the app language programmatically on iOS?", "acceptedAnswer": {"@type": "Answer", "text": "On iOS, the app language can only be changed by the user in the system settings, so the setLanguage(...) and resetLanguage(...) methods are not available there. Use openSettings() to deep-link the user to the app's settings page, where the language can be changed."}}, {"@type": "Question", "name": "Does this plugin translate my web UI?", "acceptedAnswer": {"@type": "Answer", "text": "No. The language override only affects natively rendered strings, such as permission dialogs, notifications, or plugin-presented sheets. The language of your web UI should be handled by your app's i18n library."}}, {"@type": "Question", "name": "Why is the language row not shown in the iOS system settings?", "acceptedAnswer": {"@type": "Answer", "text": "The per-app language row only appears if the app bundle provides more than one localization. Declare the supported localizations under the CFBundleLocalizations key in your app's Info.plist, as described in the Installation section."}}, {"@type": "Question", "name": "Why does my app reload after calling setLanguage?", "acceptedAnswer": {"@type": "Answer", "text": "Setting or resetting the language recreates the current activity on Android, which reloads the web view. This is expected behavior and cannot be avoided."}}, {"@type": "Question", "name": "How does the selected language persist across app restarts on Android?", "acceptedAnswer": {"@type": "Answer", "text": "On Android 13 and above, the override is integrated with the system settings via a locales_config.xml file. On Android 12 and below, you need to add the AppLocalesMetadataHolderService service to your AndroidManifest.xml to persist the selected language, as described in the Installation section."}}, {"@type": "Question", "name": "How is this plugin different from the Localization plugin?", "acceptedAnswer": {"@type": "Answer", "text": "The Localization plugin reads the user's localization preferences, such as preferred locales, time zone, and regional formatting settings. The App Language plugin manages the app's own language override, independent of the device language. The two plugins work well together."}}, {"@type": "Question", "name": "Can I use this plugin with Ionic, React, Vue or Angular?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, the plugin is framework-agnostic. It works in any Capacitor app regardless of the web framework, including Ionic with Angular, React, or Vue, as well as plain JavaScript projects."}}], "url": "https://capawesome.io/docs/sdks/capacitor/app-language/"}
```
