All supported frameworks
iOS workflow

Translate and validate iOS localization files

Translate only new and changed strings, then catch malformed resources, placeholder drift, and incomplete plurals in the localization files already in your Xcode project.

Localizable.strings

$ forthwith check

[ERROR] Placeholder mismatch · checkout.items

App/es.lproj/Localizable.strings:42 expected %d

Local scan · no account · no upload
Native .strings and .stringsdict files
Validation stays on your machine
Changed-string translation

Install path

Check the repository you already have

Install the CLI, open the root of your Xcode repository, and run one command. Forthwith discovers supported localization resources without requiring a project config.

  1. 1

    Install the Forthwith CLI

    Use Homebrew on macOS, the install script on Linux, or Scoop on Windows.

  2. 2

    Open the repository root

    Keep the check beside your source code and existing localization resources.

  3. 3

    Run forthwith check

    Review actionable findings locally before creating an account or changing a file.

macOS quick start

No configuration required
brew install Forthwith-LLC/forthwith/forthwith
cd path/to/your-project
forthwith check
Linux and Windows install options The first check never changes files.

Framework-aware validation

Protect the syntax iOS expects

The local validator understands the fragile details that make otherwise fluent translations fail at runtime. Findings include file locations and practical next steps.

Format specifiers

Keep %@, %d, positional markers, and escaped percent signs aligned with the source.

Missing keys

Find keys absent from a target locale and translations whose value is empty.

Plural forms

Check required plural categories and the variables that connect .stringsdict entries.

Resource syntax

Surface malformed files and duplicate keys with the exact resource location.

Sample diff

Review localization like any other code change

Paid translation and repair write directly to native resources. The result is a small Git diff your team can inspect in the same pull request as the product change.

  • Native files stay in their expected location.
  • Placeholders remain visible to reviewers.
  • Only new, changed, or repaired entries appear in the diff.
App/es.lproj/Localizable.strings Generated change
--- a/App/es.lproj/Localizable.strings+++ b/App/es.lproj/Localizable.strings@@ -18,2 +18,3 @@ "checkout.title" = "Finalizar compra";+"checkout.items" = "%d artículos en tu cesta"; "checkout.pay" = "Pagar %@";

CI recipe

Block broken iOS locales in pull requests

Run the same local validator on every pull request. The job remains read-only and needs no paid account, secret, or network call to Forthwith.

Validation needs no Forthwith token. Exit code 1 fails the job when errors are found; --warnings-as-errors also treats warnings as release blockers.

.github/workflows/localization.yml GitHub Actions
name: iOS localization

on: pull_request

jobs:
  localization:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Forthwith
        run: curl -fsSL https://raw.githubusercontent.com/Forthwith-LLC/forthwith-releases/main/install.sh | bash
      - name: Validate localization files
        run: forthwith check --warnings-as-errors

When you are ready to translate

Move from a local report to a reviewable locale update

Initialize the project, choose target languages, and run forthwith translate. Forthwith processes only new, changed, and missing strings by default, then writes the result to your iOS resources.