---
title: "Translate Android and Apple strings"
description: "Translate Android strings.xml, iOS .strings and .stringsdict, and Xcode String Catalogs. Keys, comments and format specifiers stay, and plural forms are written per language."
canonical: "https://ai-glot.com/docs/formats/android-and-apple-strings"
updated: "2026-10-12"
---

# Translate Android and Apple strings

Mobile app strings come in four formats here: Android resources (`.xml` in `res/values`, up to **12 MB**), iOS and macOS `.strings` and `.stringsdict` (up to **4 MB**) and Xcode String Catalogs (`.xcstrings`, up to **8 MB**). Resource names and keys are structure and never change. Format specifiers such as `%1$s`, `%d` and `%@` are kept in the translated string, and plural forms are written for the categories each target language uses.

> **Tip: Try it free**
>
> Drop a file of up to 2 MB on the free translators for [Android XML](https://ai-glot.com/file-formats/android-xml-translation), [iOS strings](https://ai-glot.com/file-formats/ios-strings-translation) (`.strings` and `.stringsdict`) or [Xcode String Catalogs](https://ai-glot.com/file-formats/xcstrings-translation) to try them with no account, five files a day. The app, the API and the CLI take the full ceiling for each format.

## What is translated, and what is left alone

| Format                | Translated                              | Left as it was                                                                 |
| --------------------- | --------------------------------------- | ------------------------------------------------------------------------------ |
| Android `strings.xml` | Strings, plurals and string-array items | `name` attributes, `translatable="false"` strings, items with `xliff:g` markup |
| iOS `.strings`        | The value of each pair                  | Keys, developer comments, escapes (newline, tab, quote, backslash)             |
| iOS `.stringsdict`    | Every plural form                       | Keys, and the dictionary structure                                             |
| Xcode `.xcstrings`    | Each key and language entry             | Keys, comments, states, substitutions and device variations                    |

Plural handling is the main difference from a generic tool. Russian gains `few` and `many`, Polish and Arabic gain their own categories, and Japanese keeps only `other`. Quantities a language never uses are removed from Android files.

## What you can ask

**An Android app**

Translates strings, plurals and arrays and keeps argument order.

Translate strings.xml into French. Keep format specifiers such as %1$s and %d, and leave the app\_name string unchanged.

**Only the new strings**

A release catch-up that leaves reviewed work alone.

Translate only the strings that are missing from the German file and keep the existing German translations.

**An iOS Localizable.strings**

Keeps developer comments and escapes.

Translate the values into Spanish. Keep %@ and %1$@ unchanged and leave the comments as they are.

**Plural rules**

For .stringsdict: writes the plural categories of the target language.

Translate the plural rules into Polish and write every plural category Polish needs.

**A String Catalog, several languages**

Fills the catalog for German, Japanese and Portuguese in one job.

Fill the missing translations for German, Japanese and Portuguese. Leave the keys, the comments and the strings that are already translated unchanged.

## Good to know

- **Android, `.strings` and `.stringsdict` hold one language: one target language per upload.** If you ask for two, the plan translates one and says so. Run the file once for each values folder or `.lproj` you ship: the [glossary](/docs/platform/glossaries) carries over.
- **String Catalogs hold every language in one file**, so they are the exception: several languages can be filled in one job.
- **Where the file goes.** An Android result goes into `res/values-fr/strings.xml` or the qualifier you need, and `.strings` into the matching `.lproj`.
- **Format specifiers.** Positional ones, such as `%1$s`, keep their index so a translator can reorder a sentence without breaking the argument order.
- **A generic `.xml` file** that is not an Android resource is read as [other XML](/docs/formats/xml).
- **Output filter.** Not available for these formats: the whole file comes back.

## Related

- [JSON](/docs/formats/json) for Flutter ARB, and [gettext PO](/docs/formats/gettext-po) for another catalog format.
- [.NET and Qt](/docs/formats/dotnet-and-qt) and [XLIFF](/docs/formats/xliff-and-cat-tools) for other localization files.
- [All file formats](/docs/formats)
