# How to Translate iOS .strings and .stringsdict Files | Vitra.ai

> Two file types, one job. Strings handles the simple cases and stringsdict handles plurals, which is where most iOS localizations fall short as well.

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

---

4 min read

# How to Translate iOS .strings and .stringsdict Files

Two file types, one job. Strings handles the simple cases and stringsdict handles plurals, which is where most iOS localizations fall short as well.

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

![How to Translate iOS .strings and .stringsdict Files](https://www.vitra.ai/static/images/blog/translate-ios-strings-file.jpg)

Table of contents

[Two files, different jobs](#two-files-different-jobs)

[Format specifiers must survive](#format-specifiers-must-survive)

[Escaping and the semicolon](#escaping-and-the-semicolon)

[Keys, comments and context](#keys-comments-and-context)

[InfoPlist and app store text are separate](#infoplist-and-app-store-text-are-separate)

[Why continuous beats batch here](#why-continuous-beats-batch-here)

[The route through](#the-route-through)

[Storyboards carry their own strings](#storyboards-carry-their-own-strings)

[Right-to-left is more than text direction](#right-to-left-is-more-than-text-direction)

[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 —** iOS localization uses .strings for straightforward key-value pairs and .stringsdict for anything with a plural or a variable quantity. Translating only the .strings file leaves every count-dependent sentence wrong in languages with more plural forms than English.

## Two files, different jobs

A `.strings` file is `"key" = "value";` — one line per string, quoted, semicolon terminated. Simple and well understood. `.stringsdict` is a plist that handles [plural rules](https://www.vitra.ai/general/internationalization-vs-localization). `You have 1 message` versus `You have 5 messages` is not two strings, it is one rule with several forms, and English needs two while Arabic needs six.

Teams translate the .strings file, ship, and then discover that every sentence containing a number reads wrongly in half their languages.

## Format specifiers must survive

`%@` for objects, `%d` for integers, `%1$@` for positional. They pass straight through to the formatter. Where a language needs a different word order, switch to the positional form rather than reordering bare specifiers. Reordering `%@ %d` without positional indices substitutes the arguments into the wrong slots, and it looks correct in review because the specifiers are all still present.

## Escaping and the semicolon

Quotes inside a value need escaping, and every line ends with a semicolon. A missing semicolon does not fail loudly — the file may parse up to that point and silently drop everything after it.

That is the classic symptom of a partially translated screen: one string wrong somewhere above, and the rest of the file never loaded.

## Keys, comments and context

The key is the lookup. Comments above an entry are the only context a translator gets, and they are where a developer can say "this is a button, keep it under twelve characters."

Length constraints matter more on mobile than anywhere. A label that fits an iPhone in English will not fit in German, and there is no reflow to rescue it.

## InfoPlist and app store text are separate

`InfoPlist.strings` carries permission prompts — the sentence explaining why the app wants the camera. Those are user-facing, reviewed by Apple, and easy to forget.

The App Store listing is separate again and lives outside the bundle entirely.

## Why continuous beats batch here

An app ships every fortnight and changes a handful of strings each time. [translation memory](https://www.vitra.ai/features/translation-memory) returns the unchanged ones instantly, so localization tracks the release cadence instead of falling a version behind it.

## The route through

Upload both file types, protect specifiers, set plural rules per language, review against screen widths.

[document translation](https://www.vitra.ai/features/document-translation) handles the formats, [quality control](https://www.vitra.ai/features/quality-control) checks specifiers and plural counts.

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

## Storyboards carry their own strings

Interface Builder stores strings per storyboard. With base internationalisation enabled, each language gets a strings file generated from the storyboard rather than a duplicate of the whole thing.

Teams that translate only code-level strings ship an app where every programmatic label is localized and every label placed in a storyboard is still in English.

## Right-to-left is more than text direction

Arabic and Hebrew flip the whole interface, not just the words. Leading and trailing constraints mirror, icons that imply direction need replacing, and anything positioned with absolute left or right values stays where it was.

Test one screen in a right-to-left language early. It reveals layout assumptions no amount of string review will.

## Where to start

Find every string in your app that contains a number and confirm it is in stringsdict rather than strings. That single check fixes the most visible class of iOS localization bug.

## FAQ

**What is the difference between .strings and .stringsdict?** The .strings file holds simple key-value pairs and .stringsdict holds plural rules. Any sentence whose wording depends on a count belongs in stringsdict, because English needs two plural forms and Arabic needs six.

**Why is half my screen untranslated?** Usually a missing semicolon. A .strings file may parse up to the malformed line and silently drop everything after it, so one bad entry near the top leaves the rest of the file unloaded.

**How should format specifiers be reordered?** By switching to positional form like %1$@ rather than moving bare specifiers. Reordering %@ and %d without indices substitutes arguments into the wrong slots and still looks correct in review.

**Are permission prompts part of the same file?** No, they live in InfoPlist.strings. They are user-facing, reviewed by Apple and easy to miss, and the App Store listing is separate again and sits outside the app bundle.

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-ios-strings-file"
  },
  "headline": "How to Translate iOS .strings and .stringsdict Files",
  "image": [
    {
      "@type": "ImageObject",
      "url": "https://www.vitra.ai/static/images/blog/translate-ios-strings-file.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": "Two file types, one job. Strings handles the simple cases and stringsdict handles plurals, which is where most iOS localizations fall short 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 iOS .strings and .stringsdict Files",
      "item": "https://www.vitra.ai/general/translate-ios-strings-file"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is the difference between .strings and .stringsdict?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The .strings file holds simple key-value pairs and .stringsdict holds plural rules. Any sentence whose wording depends on a count belongs in stringsdict, because English needs two plural forms and Arabic needs six."
      }
    },
    {
      "@type": "Question",
      "name": "Why is half my screen untranslated?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Usually a missing semicolon. A .strings file may parse up to the malformed line and silently drop everything after it, so one bad entry near the top leaves the rest of the file unloaded."
      }
    },
    {
      "@type": "Question",
      "name": "How should format specifiers be reordered?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "By switching to positional form like %1$@ rather than moving bare specifiers. Reordering %@ and %d without indices substitutes arguments into the wrong slots and still looks correct in review."
      }
    },
    {
      "@type": "Question",
      "name": "Are permission prompts part of the same file?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No, they live in InfoPlist.strings. They are user-facing, reviewed by Apple and easy to miss, and the App Store listing is separate again and sits outside the app bundle."
      }
    }
  ]
}
```
