Syncing iOS Localization Gaps with Google Sheets and GitHub PR Placeholders

Go to Workflow
0 views
Built by WeblineIndia WeblineIndia
Created on August 19, 2025

Description

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 .strings files under Base.lproj or en.lproj and 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

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_GLOB and IOS_TARGET_GLOB to scan only certain modules or file patterns.
Ignore Rules**: Add IGNORE_KEY_PREFIXES_CSV to skip certain internal/debug strings.
Placeholder Value**: Change PLACEHOLDER_VALUE to something meaningful like "@@@".
Slack/Email**: Set SLACK_CHANNEL and EMAIL_FALLBACK_TO_CSV appropriately.
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_CSV and loop tabs + placeholder commits per locale.
.stringsdict handling:** Validate plural/format entries and open a precise PR.
Translator DMs:** Provide a LANG → Slack handle/email map 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 fr has 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!

This workflow was created by WeblineIndia and shared publicly on the n8n community template library. n8nFind indexes it for discovery — the workflow remains the property of its original creator.

Nodes Used (3)

Code
n8n-nodes-base.code
Google Sheets
n8n-nodes-base.googleSheets
HTTP Request
n8n-nodes-base.httpRequest