Syncing iOS Localization Gaps with Google Sheets and GitHub PR Placeholders

Last edited 58 days ago

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

  1. A GitHub Webhook triggers on push or pull request.
  2. The iOS repo is scanned for .strings files under Base.lproj or en.lproj and their target-language counterparts.
  3. It compares keys and identifies what’s missing.
  4. A new or existing Google Sheet tab (e.g., fr) is updated with missing entries.
  5. If enabled, it creates a GitHub PR with placeholder keys (e.g., "__TODO_TRANSLATE__").

How to set up

  1. Import the Workflow JSON into your n8n instance.
  2. 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}}",
}
  1. Create GitHub Webhook

    • URL: https://your-n8n-instance/webhook/l10n-gap-ios
    • Content-Type: application/json
    • Trigger on: Push, Pull Request
  2. 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 (valuesvalues-<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!

New to n8n?

Need help building new n8n workflows? Process automation for you or your company will save you time and money, and it's completely free!