Format specifiers
Keep %@, %d, positional markers, and escaped percent signs aligned with the source.
Translate only new and changed strings, then catch malformed resources, placeholder drift, and incomplete plurals in the localization files already in your Xcode project.
$ forthwith check
[ERROR] Placeholder mismatch · checkout.items
App/es.lproj/Localizable.strings:42 expected %d
Install path
Install the CLI, open the root of your Xcode repository, and run one command. Forthwith discovers supported localization resources without requiring a project config.
Use Homebrew on macOS, the install script on Linux, or Scoop on Windows.
Keep the check beside your source code and existing localization resources.
Review actionable findings locally before creating an account or changing a file.
brew install Forthwith-LLC/forthwith/forthwith
cd path/to/your-project
forthwith check
Framework-aware validation
The local validator understands the fragile details that make otherwise fluent translations fail at runtime. Findings include file locations and practical next steps.
Keep %@, %d, positional markers, and escaped percent signs aligned with the source.
Find keys absent from a target locale and translations whose value is empty.
Check required plural categories and the variables that connect .stringsdict entries.
Surface malformed files and duplicate keys with the exact resource location.
Sample diff
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.
--- 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
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.
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
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.
We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect