# Localization

> The chat speaks 34 languages, right to left included, and follows the device language.

Source: https://conciergesdk.com/docs/localization/

Every SDK ships the chat's built-in text (titles, the composer placeholder, buttons, delivery status, offline banners, card labels, the AI label and notice, accessibility labels) in 34 languages. Nothing to install or translate: the chat follows the user's language out of the box, even when your app itself is English only.

## Languages

English, Spanish, Portuguese (Brazil), Portuguese (Portugal), French, German, Italian, Dutch, Swedish, Danish, Norwegian Bokmål, Finnish, Polish, Czech, Slovak, Hungarian, Romanian, Ukrainian, Russian, Turkish, Greek, Hebrew, Arabic, Persian, Hindi, Bengali, Indonesian, Malay, Thai, Vietnamese, Japanese, Korean, Chinese (Simplified) and Chinese (Traditional).

Arabic, Hebrew and Persian lay the chat out right to left: mirrored header, bubbles on the opposite sides, tails and icons flipped. Message text keeps its own direction, so an English reply in an Arabic chat still reads left to right.

## How the language is picked

| Platform | Default |
|---|---|
| iOS | The user's preferred languages, including the per-app language from Settings. |
| Android | The app's locale list, including `AppCompatDelegate.setApplicationLocales` and the Android 13+ per-app language. |
| React Native | The native SDK's rule when it is linked; in Expo Go, the OS languages, then `Intl`. |
| Flutter | The native SDK's rule (the plugin always uses the native chat). |
| Web | `navigator.languages`. |

The SDK takes the first preferred language it ships. A region or script it does not ship falls back to the language: `es-MX` and `es-419` use Spanish, `de-AT` uses German, `zh-TW` and `zh-HK` use Traditional Chinese, `zh-CN` Simplified. Plain `pt` and `pt-BR` use Brazilian Portuguese, other Portuguese regions European Portuguese. Old codes (`iw`, `in`, `no`) work. A language the SDK does not ship moves on to the user's next preferred language, then English.

Dates, times, "Today", "in 2 hours" and plural forms ("3 photos", "5 unread") come from the platform's own formatters and plural rules in the chat's language.

## Choose the language yourself

Set a BCP 47 tag to override the device, or `nil` / `null` to follow it again. An open chat updates in place on iOS and Android.

```swift
// iOS
Concierge.locale = "ja"
```

```kotlin
// Android
Concierge.locale = "pt-BR"
```

```ts
// React Native
Concierge.configure({ appKey: 'app_...', locale: 'ar' });
Concierge.setLocale('de'); // later, or null to follow the device
```

```dart
// Flutter
Concierge.configure(appKey: 'app_...', locale: 'he');
Concierge.setLocale('ko'); // later, or null to follow the device
```

```ts
// Web
Concierge.configure({ appKey: 'app_...', locale: 'zh-Hant' });
```

## Your dashboard text

The chat title and welcome you set in the dashboard show exactly as you wrote them, in every language. If you never changed them, the chat shows its built-in title and greeting in the user's language instead of the English defaults. Local overrides (`Concierge.appearance` on iOS and Android, `setAppearance` on React Native, Flutter and the web) always win.

Per-language dashboard text is not available yet. If you need a translated welcome today, set it locally from your app with the language you already know.

## The AI label

Replies from the AI agent always carry an AI label in the chat's language (for example "AI assistant", "Asistente de IA", "KI-Assistent", "AIアシスタント", "مساعد ذكاء اصطناعي"), and the notice at the top of the chat says replies may come from an AI. No setting hides them. The agent itself writes in the language the user writes in; see [AI agent and knowledge](https://conciergesdk.com/docs/ai-agent.md#languages).
