# How to Translate Android strings.xml Files Correctly | Vitra.ai

> Android's resource system does most of the work. The failures are escaping, plurals, and format arguments that silently land in the wrong order as well.

**Canonical URL**: https://www.vitra.ai/general/translate-android-strings-xml
**Source**: This is the Markdown rendering of https://www.vitra.ai/general/translate-android-strings-xml, generated at build time from that page.

---

4 min read

# How to Translate Android strings.xml Files Correctly

Android's resource system does most of the work. The failures are escaping, plurals, and format arguments that silently land in the wrong order as well.

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Senior Product Manager , Vitra.ai
Updated Aug 17, 2026

![How to Translate Android strings.xml Files Correctly](https://www.vitra.ai/static/images/blog/translate-android-strings-xml.jpg)

Table of contents

[Resource qualifiers do the routing](#resource-qualifiers-do-the-routing)

[Escaping is where files break](#escaping-is-where-files-break)

[Plurals are a different element](#plurals-are-a-different-element)

[Format arguments must be positional](#format-arguments-must-be-positional)

[What else lives in resources](#what-else-lives-in-resources)

[Layout is the other half](#layout-is-the-other-half)

[Translatable false and non-translatable strings](#translatable-false-and-non-translatable-strings)

[Pseudolocales before translation exists](#pseudolocales-before-translation-exists)

[Where to start](#where-to-start)

[FAQ](#faq)

Contributors

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Senior Product Manager

Subscribe to our newsletter

Subscribe

> **Quick answer —** Android resolves translations through resource qualifiers — values-fr, values-pt-rBR — with no code change needed. The problems are apostrophe escaping, plurals that need a quantity element rather than a string, and positional format arguments.

## Resource qualifiers do the routing

`values/strings.xml` is the default and `values-fr/strings.xml` is French. The system picks the closest match to the device locale and falls back to the default when nothing matches. Region qualifiers use an `r` prefix — `values-pt-rBR`. Getting that wrong means the folder is never selected and the app silently shows the default language.

## Escaping is where files break

An apostrophe must be escaped or the build fails. Double quotes too. An ampersand needs an XML entity. A string starting or ending with a space needs quoting to preserve it.

French and Italian translations trip this constantly because apostrophes are everywhere in both. It fails at build rather than at runtime, which is the better outcome but still blocks a release at the worst moment.

## Plurals are a different element

`<plurals>` with `<item quantity="one">` and `<item quantity="other">`, not a string with a number in it. English needs two quantities; Arabic uses six — zero, one, two, few, many, other.

A translated file supplying only the two English quantities leaves the others unresolved, and the system falls back. This is the most common Android localization defect and it only shows on specific counts.

## Format arguments must be positional

`%1$s` and `%2$d`, not bare `%s` and `%d`, in any string with more than one argument. Word order changes between languages, and positional arguments are how the substitution follows.

Bare specifiers reordered by a translator put the wrong value in each slot, and the result reads plausibly, which is why it survives review.

## What else lives in resources

`strings.xml` is not the only file. Plurals, string arrays, content descriptions for accessibility, and the app name itself. Content descriptions are the most commonly skipped and the ones a screen-reader user depends on.

Store listing text is separate again and lives outside the project entirely.

## Layout is the other half

German labels overflow buttons sized for English. Test with the longest language rather than the average, and use the pseudolocale tooling to catch it before a translation exists.

[mobile app translation](https://www.vitra.ai/features/mobile-app-translation) handles the resource files and [quality control](https://www.vitra.ai/features/quality-control) verifies escaping and plural counts before a build fails on them.

Setup notes are on the [Android strings integration](https://www.vitra.ai/integration/android-string) page, and the iOS equivalent has its own [.strings page](https://www.vitra.ai/integration/ios-string).

## Translatable false and non-translatable strings

Strings used as configuration — an API key name, a format pattern, a debug label — should carry `translatable="false"`. Without it they reach translators, get translated, and break at runtime.

Marking them is a two-minute job that removes an entire class of bug and shrinks what has to be reviewed.

## Pseudolocales before translation exists

Android's pseudolocale expands strings and adds accents without any translation, which surfaces layout breakage before a single word has been translated. Turn it on early rather than discovering the problems with real content.

## Where to start

Search your strings for a number placeholder and confirm each is a plurals element rather than a string. That single check removes the most common Android localization bug.

## FAQ

**How does Android choose a translated strings file?** Through resource qualifiers on the folder name — values-fr, values-pt-rBR — matched against the device locale, falling back to the default when nothing matches. No code change is needed.

**Why does my Android build fail after translation?** Almost always escaping. Apostrophes and double quotes must be escaped and ampersands need an XML entity, which French and Italian translations hit constantly because apostrophes appear everywhere.

**How should plurals be handled in Android?** With a plurals element and quantity items rather than a string containing a number. English needs two quantities and Arabic uses six, so supplying only the English pair leaves the rest falling back.

**Why must format arguments be positional?** Because word order changes between languages. Bare %s and %d reordered by a translator substitute the wrong value into each slot, and the result reads plausibly enough to pass review.

Our blog

## Lastest blog posts

Tool and strategies modern teams need to help their companies grow.

Automotive

[Automotive Brochure Localization by Market](https://www.vitra.ai/automotive/automotive-brochure-localization)
A car brochure is a spec grid, a legal footer and a photo library, all market-specific. What actually has to change, and why the layout decides the schedule.

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Aug 18, 2026

Automotive

[Automotive Campaign Localization Across Markets](https://www.vitra.ai/automotive/automotive-campaign-localization)
Campaigns run through national companies and dealer networks, so one master becomes hundreds of files. Where the offer text and the disclaimers actually break.

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Aug 18, 2026

Automotive

[Car Service Manual Translation for Technicians](https://www.vitra.ai/automotive/automotive-service-manual-translation)
A workshop manual is read mid-repair by someone with the car on a lift. What that demands of procedures, torque figures and fault codes, in every language.

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Aug 18, 2026

[View all posts](https://www.vitra.ai/blog/page/1)

---

## Structured data

```json
{
  "@context": "https://schema.org",
  "@type": "Article",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://www.vitra.ai/general/translate-android-strings-xml"
  },
  "headline": "How to Translate Android strings.xml Files Correctly",
  "image": [
    {
      "@type": "ImageObject",
      "url": "https://www.vitra.ai/static/images/blog/translate-android-strings-xml.jpg"
    }
  ],
  "datePublished": "2026-08-17T00:00:00.000Z",
  "dateModified": "2026-08-17T00:00:00.000Z",
  "author": [
    {
      "@type": "Person",
      "name": "Samhitha J Bhatt"
    }
  ],
  "publisher": {
    "@type": "Organization",
    "name": "Vitra.ai",
    "logo": {
      "@type": "ImageObject",
      "url": "https://www.vitra.ai/static/images/vitra-v-logo.png"
    }
  },
  "description": "Android's resource system does most of the work. The failures are escaping, plurals, and format arguments that silently land in the wrong order as well."
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://www.vitra.ai"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "General",
      "item": "https://www.vitra.ai/general"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "How to Translate Android strings.xml Files Correctly",
      "item": "https://www.vitra.ai/general/translate-android-strings-xml"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How does Android choose a translated strings file?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Through resource qualifiers on the folder name — values-fr, values-pt-rBR — matched against the device locale, falling back to the default when nothing matches. No code change is needed."
      }
    },
    {
      "@type": "Question",
      "name": "Why does my Android build fail after translation?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Almost always escaping. Apostrophes and double quotes must be escaped and ampersands need an XML entity, which French and Italian translations hit constantly because apostrophes appear everywhere."
      }
    },
    {
      "@type": "Question",
      "name": "How should plurals be handled in Android?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "With a plurals element and quantity items rather than a string containing a number. English needs two quantities and Arabic uses six, so supplying only the English pair leaves the rest falling back."
      }
    },
    {
      "@type": "Question",
      "name": "Why must format arguments be positional?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Because word order changes between languages. Bare %s and %d reordered by a translator substitute the wrong value into each slot, and the result reads plausibly enough to pass review."
      }
    }
  ]
}
```
