Syncing iOS localization gaps with Google Sheets and GitHub PR placeholders
Workflow preview
$20/month : Unlimited workflows
2500 executions/month
THE #1 IN WEB SCRAPING
Scrape any website without limits
HOSTINGER
Early Deal
DISCOUNT 20% Try free
DISCOUNT 20%
Self-hosted n8n
Unlimited workflows - from $4.99/mo
#1 hub for scraping, AI & automation
6000+ actors - $5 credits/mo
Important notice
This workflow is provided as-is. Please review and test before using in production.
Overview
Fill iOS localization gaps from .strings → Google Sheets and PR with placeholders (GitHub)
This n8n workflow automatically identifies missing translations in .strings files across iOS localizations (e.g., Base.lproj vs fr.lproj) and generates a report in Google Sheets. Optionally, it creates a GitHub PR to insert placeholder strings ("__TODO_TRANSLATE__") so builds don't fail. Supports DRY_RUN mode.
Who’s it for
- iOS teams who want fast feedback on missing translations.
- Localization managers who want a shared sheet to assign work to translators.
How it works
- A GitHub Webhook triggers on push or pull request.
- The iOS repo is scanned for
.stringsfiles underBase.lprojoren.lprojand their target-language counterparts. - It compares keys and identifies what’s missing.
- A new or existing Google Sheet tab (e.g.,
fr) is updated with missing entries. - If enabled, it creates a GitHub PR with placeholder keys (e.g.,
"__TODO_TRANSLATE__").
How to set up
- Import the Workflow JSON into your n8n instance.
- Set Config Node values like:
{
"GITHUB_OWNER": "your-github-user-name",
"GITHUB_REPO": "your-iOS-repo-name",
"BASE_BRANCH": "develop",
"SHEET_ID": "<YOUR_GOOGLE_SHEET_ID>",
"ENABLE_PR": "true",
"IOS_SOURCE_GLOB": "**/Base.lproj/*.strings,**/en.lproj/*.strings",
"IOS_TARGET_GLOB": "**/*.lproj/*.strings",
"PLACEHOLDER_VALUE": "__TODO_TRANSLATE__",
"BRANCH_TEMPLATE": "chore/l10n-gap-{{YYYYMMDD}}",
}
Create GitHub Webhook
- URL:
https://your-n8n-instance/webhook/l10n-gap-ios - Content-Type:
application/json - Trigger on:
Push,Pull Request
- URL:
Connect credentials
- GitHub token with repo scope
- Google Sheets API
- (Optional) Slack OAuth + SMTP
Requirements
| Tool | Needed For | Notes |
|---|---|---|
| GitHub Repo | Webhook, API for PRs | repo token or App |
| Google Sheets | Sheet output | Needs valid SHEET_ID or create-per-run |
| Slack (optional) | Notifications | chat:write scope |
| SMTP (optional) | Email fallback | Standard SMTP creds |
How to customize
- Multiple Locales: Add comma-separated values to
TARGET_LANGS_CSV(e.g.,fr,de,es). - Globs: Adjust
IOS_SOURCE_GLOBandIOS_TARGET_GLOBto scan only certain modules or file patterns. - Ignore Rules: Add
IGNORE_KEY_PREFIXES_CSVto skip certain internal/debug strings. - Placeholder Value: Change
PLACEHOLDER_VALUEto something meaningful like"@@@". - Slack/Email: Set
SLACK_CHANNELandEMAIL_FALLBACK_TO_CSVappropriately. - DRY_RUN: Set to true to skip GitHub PR creation but still update the sheet.
Add‑ons
- Android support: Add a second path for
strings.xml(values→values-<lang>), same diff → Sheets → placeholder PR. - Multiple languages at once: Expand
TARGET_LANGS_CSVand loop tabs + placeholder commits per locale. .stringsdicthandling: Validate plural/format entries and open a precise PR.- Translator DMs: Provide a
LANG → Slack handle/emailmap to DM translators with their specific file/key counts. - GitLab/Bitbucket variants: Replace GitHub API calls with GitLab/Bitbucket equivalents to open Merge Requests.
Use Case Examples
- Before a test build, ensure
frhas all keys present—placeholders keep the app compiling. - Weekly run creates a single sheet for translators and a PR with placeholders, avoiding last‑minute breakages.
- A new screen adds 12 strings; the bot flags and pre‑fills them across locales.
Common troubleshooting
| Issue | Possible Cause | Solution |
|---|---|---|
| No source files found | Glob doesn't match Base.lproj or en.lproj |
Adjust IOS_SOURCE_GLOB |
| Target file missing | fr.lproj doesn’t exist yet |
Will be created in placeholder PR |
| Parsing skips entries | Non-standard string format in file | Ensure proper .strings format "key" = "value"; |
| Sheet not updating | SHEET_ID missing or insufficient permission |
Add valid ID or allow write access |
| PR not created | ENABLE_PR=false or no missing keys |
Enable PR and ensure at least one key is missing |
| Slack/Email not received | Missing credentials or config | Configure Slack/SMTP properly and set recipient fields |
Need Help?
Want to expand this for Android? Loop through 5+ locales at once? Or replace GitHub with GitLab? Contact our n8n Team at WeblineIndia with your repo & locale setup and we’ll help tailor it to your translation workflow!