# crowdin string export failed: placeholder mismatch

## TL;DR

Fixes the Crowdin export failure when a translation's placeholders do not match the source. Correct the translator's placeholders to mirror the source. Use when export names a placeholder mismatch. Not for untranslated strings.

## The error

```text
Error: placeholder mismatch in string cart.items: expected {count}, found {nombre}.
```

## Fix it

### Step 1: Open the failing string

```bash
node -e "console.log('find cart.items in the Crowdin editor and compare source and translation placeholders')"
```

Expected: You see the source uses {count} and the translation uses {nombre}.

### Step 2: Fix the translation placeholders

```bash
node -e "console.log('edit the translation to use {count}, keeping the translated words')"
```

Expected: Placeholders now match the source exactly.

### Step 3: Re-run the export

```bash
node -e "console.log('export the build and confirm it succeeds')"
```

Expected: The export completes.

## When to use this

- Crowdin export fails on a placeholder mismatch
- A translation renamed a placeholder

## When NOT to use this

- Strings are untranslated, that is a completion problem
- The export fails on file format, check the exporter config

## Tool and version compatibility

- Crowdin
- ICU and printf placeholder validation on export

## Variant phrasings

### mismatch in many strings at once

A machine translation pass renamed placeholders globally. Fix with a QA check, not by hand.

### placeholder order differs

Order can differ; only the names must match. Reorder freely.

## Why it happens

Placeholders are the contract between code and translation. If the translation renames {count}, the runtime interpolation finds nothing to substitute, so Crowdin blocks the export rather than shipping strings that would render raw placeholders.

## Edge cases

- Some languages need the placeholder twice; duplicates are fine if names match
- Escaped braces look like placeholders to naive checks
- QA checks can auto-fix common renames before export

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_Wbxd4bY5USTrLVnZdG2wQA
