I needed four words. "Missed call", "Phone", "now", and the word for "Incoming call". In 13 languages.

I'm building a small web tool that draws fake iPhone call screens, the kind of screenshot you send a friend as a joke. A fake screenshot only works if every word on it is exactly what an iPhone says. So I asked an AI to translate them, and it came back sounding very sure of itself.

It was wrong in six of the thirteen languages.

Italian got "ora" for "now". An Italian iPhone says "adesso". Portuguese got "Ligação perdida", the iPhone says "Chamada perdida". Hebrew, Czech, German, all slightly off. Even the English was wrong: "Missed Call" with a capital C. iOS writes "Missed call".

Nobody would notice in a settings menu. On a lock screen, anyone who owns an iPhone notices in half a second.

The strings are already on your Mac

macOS keeps its interface text in files ending in .loctable. Each one is a binary plist, and each one holds every language at once: {"fr": {...}, "de": {...}, "ja": {...}}.

There are 6,270 of them under /System/Library on my machine. 244 MB, about 250,000 English strings, up to 41 languages each. The phone ones sit in TelephonyUtilities.framework, which is also the name of the framework on iOS.

Python can read binary plists without installing anything, so searching all of it is a few lines:

#!/usr/bin/env python3 # usage: python3 applestrings.py "Missed call" fr de ja ar import plistlib, subprocess, sys query = sys.argv[1].lower() langs = sys.argv[2:] or ["en", "fr", "de", "es", "ja", "ar"] files = subprocess.run( ["find", "/System/Library", "-name", "*.loctable"], capture_output=True, text=True, ).stdout.split() for path in files: try: with open(path, "rb") as f: table = plistlib.load(f) except Exception: continue for key, value in table.get("en", {}).items(): if isinstance(value, str) and value.lower() == query: print(f"\n{path.split('/')[-1]} {key}") for lang in langs: print(f" {lang:6} {table.get(lang, {}).get(key, '-')}") 
$ python3 applestrings.py "missed call" fr de ja ar ... TelephonyUtilities.loctable MISSED_CALL fr Appel manqué de Verpasster Anruf ja 不在着信 ar مكالمة فائتة 

20 seconds to scan everything. My six bad strings were fixed ten minutes later.

I should have closed the terminal there.

Spam: Prison

Instead I scrolled through the rest of the phone file, and found a block of keys starting with MAYBE_. They look like the labels iOS puts under a call it thinks is spam:

Spam: Political. Spam: Survey. Spam: Healthcare. Spam: Nonprofit. Spam: Government. Spam: Prison.

Someone at Apple wrote "Spam: Prison", and then forty translators dutifully localized it. "Spam: Gefängnis". "Indésirable : centre pénitentiaire". They all got that one right.

Then there's "Spam: Collections".

In American English that means a debt collector is calling. It's also a terrible word to hand a translator without context, because it can mean a stamp collection, a fashion collection, or the plate at church. Most languages got it right: German says "Inkassobüro", French "agence de recouvrement", Japanese "取立".

These ones didn't:

Language On the iPhone Which means
Norwegian Uønsket: samlinger collections, like stamps
Portuguese (Portugal) Spam: coleções collections, like stamps
Croatian Neželjeno: Kolekcije collections, like stamps
Indonesian Spam: Koleksi collections, like stamps
Hindi स्पैम : संग्रह a collection, a compilation
Arabic مزعجة: مجموعات groups
Czech Spam: organizace sbírky a charity fundraiser
Slovak Spam: organizovanie zbierky organizing a fundraiser
Thai สแปม: การเรี่ยไรเงิน asking for donations

So a Norwegian iPhone that spots a debt collector warns you about collectors. Just not that kind.

My favorite detail: Brazilian Portuguese, in the same file, gets it right ("Cobrança"). Portugal didn't. And Czech and Slovak both decided it was a charity drive, which says more about the English word than about the people translating it.

I'm going to remember that for my own strings. "Collections" is a coin flip. "Collections (a debt collection agency is calling)" isn't.

Two smaller things I can't unsee now

Apple uses the Oxford comma, but only for Americans. The string that lists people on a group call is "Anna, Ben, & Chloe" in US English, and "Anna, Ben & Chloe" in British and Australian English.

And internally, Wi-Fi Calling is called Thumper. Every Wi-Fi Calling string has a key like THUMPER_SERVICE_NAME_WIFI, plus a _WLAN twin for phones that say WLAN instead of Wi-Fi. I have no idea why Thumper. If you do, please tell me.

Before you use this

These are private frameworks, so keys move around between macOS versions. Everything above comes from macOS 27.0.1. If Apple fixes the Norwegian before you read this, good for Norway.

And use it to match Apple's wording in your own UI, not to copy whole tables into your app.

The tool that started this is a fake iPhone call screenshot generator. Free, runs in your browser, and it now says "adesso".

If you speak one of the nine languages in that table and I've got the meaning wrong, I'd love to hear it in the comments.