Localization
Scarf 2.1 added full UI translations on top of English. Seven languages ship in the box and more can be contributed via a plain GitHub PR — no translation-management tool, no account to create.
ScarfGo (iOS) is English-only in v2.5. The iOS strings are extracted but no translations are contributed yet. Localizing the iOS app is on the ScarfGo Roadmap — most of the strings already exist in
Localizable.xcstrings, so contributing iOS translations would lean on the same workflow described below.
Supported languages
| Locale | Name | Status |
|---|---|---|
en |
English | Source |
zh-Hans |
Simplified Chinese | AI-translated, native-speaker review welcome |
de |
German | AI-translated, native-speaker review welcome |
fr |
French | AI-translated, native-speaker review welcome |
es |
Spanish | AI-translated, native-speaker review welcome |
ja |
Japanese | AI-translated, native-speaker review welcome |
pt-BR |
Brazilian Portuguese | AI-translated, native-speaker review welcome |
Canadian French users are served by base fr — fr-CA will be added only if a concrete Québec-specific punctuation/terminology bug surfaces.
Which language Scarf speaks
Scarf respects the macOS system language by default. To override per-app:
System Settings → General → Language & Region → Applications → + → select Scarf + pick a preferred language.
The override takes effect on next app launch.
What's translated vs. what stays verbatim
The catalog has 644 source strings. Of those, 583 are translated per locale. The remaining ~60 deliberately fall through to English at runtime:
- Brand / proper nouns — Scarf, Hermes, Anthropic, Claude, Sparkle, OAuth, SSH, MCP, HTTP, URL, API, Docker, Daytona, Singularity, BlueBubbles, Discord, Slack, Telegram, WhatsApp, Signal, Matrix, Feishu, Mattermost, iMessage, Home Assistant.
- Format-only tokens —
%lld,%@,·,•,%@ → %@,••••••••••(masked-value placeholder). - Config-literal placeholders —
my_server,new-name,npx,sk-…,hermes profile show,~/.hermes/…. - User / Hermes data passthroughs — session titles, memory contents, log lines, shell commands shown in UI, file paths.
The rule is: if translating would be wrong (brand names) or meaningless (data passthroughs), the site stays verbatim. Everything else gets localized.
Contributing a new language
The full step-by-step is in the main repo's CONTRIBUTING.md → Adding a Language. Summary:
- Fork the repo and create a branch.
- Add the locale to
knownRegionsinscarf/scarf.xcodeproj/project.pbxproj(e.g. additafter"pt-BR"). - Drop a new JSON file at
tools/translations/<locale>.json— copy an existing one (saytools/translations/es.json) as a starting point. Each entry maps the English source string to your translation. Keys you omit fall back to English at runtime — do that for proper nouns and for anything technical that shouldn't translate. - Preserve format specifiers exactly:
%@,%lld,%d, positional%1$@/%2$lld, etc. If word order needs to change in your language, use the positional forms. - Add your locale to
tools/merge-translations.py'sLOCALESlist and runpython3 tools/merge-translations.py— this writes your translations intoscarf/scarf/Localizable.xcstrings. - Translate
scarf/scarf/InfoPlist.xcstrings(the macOS microphone-permission prompt) for your locale. Add a newstringUnitunderlocalizations. - Build (
xcodebuild -project scarf/scarf.xcodeproj -scheme scarf build) and sanity-check in Xcode: Scheme → Run → App Language → your locale. Walk the main views (Dashboard, Chat, Settings) and look for clipping or obvious leaks. - Open a PR including the new JSON, the updated catalog, and the pbxproj / script changes. Mention which routes you spot-checked.
AI translation is fine for a first pass — it's how the initial six locales landed. Native-speaker review improves quality and is always welcome, either as a follow-up PR or as review comments on the initial one.
Improving an existing translation
Found a weird or wrong translation? Easiest path:
- Open
tools/translations/<locale>.jsonon GitHub. - Click the pencil icon to edit in the browser.
- Change the offending entry.
- Submit as a PR. No build needed — the
merge-translations.pyscript runs as part of the PR-validation flow.
One-liner fixes are welcome. Please don't feel you need to review the whole file before sending a PR for a single weird string.
Under the hood
Scarf uses Apple's modern String Catalog (.xcstrings) — unified plural / format / variation support in a single file, exportable to XLIFF if a translator wants to work in their favorite TMS. The source catalog lives at scarf/scarf/Localizable.xcstrings; Info.plist keys live at scarf/scarf/InfoPlist.xcstrings.
Per-locale JSON under tools/translations/ is the canonical source of truth for translations. The merge script is idempotent — translators iterate on the JSON and re-merge without worrying about catalog internals.
Deeper dev-facing notes on which SwiftUI patterns silently bypass localization (and how to avoid them when adding new UI) are in scarf/docs/I18N.md.
Last updated: 2026-04-25 — Scarf v2.5.0 (added iOS English-only note + ScarfGo Roadmap link)
Getting Started
ScarfGo (iOS)
User Guide
- Dashboard
- Insights & Activity
- Chat
- Slash Commands
- Memory & Skills
- Projects & Profiles
- Project Templates
- Template Catalog
- Template Ideas
- Platforms / Personalities / Quick Commands
- Servers & Remote
- MCP, Plugins, Webhooks, Tools
- Gateway / Cron / Health / Logs
Architecture
- Overview
- Core Services
- Design System
- Data Model
- Transport Layer
- ScarfCore Package
- Sidebar & Navigation
- ACP Subprocess
Developer Guide
Reference
Troubleshooting
Contributing
- Contributing
- Wiki Maintenance
- ScarfGo Roadmap (dev reference)
Release History
Legal & Support
Wiki edited via the local .wiki-worktree/ clone. See Wiki Maintenance for the workflow. Last sync: 2026-04-20.