When a Translation Is Missing, Say Why
A parent opens a message in Spanish and sees English. Is it still loading, already in their language, or never coming? Rostered decides that on the server and tells the app, so a family is never offered a button that cannot work.
A parent who reads Spanish opens a message from the club and sees English.
There are several reasons that could be happening and they are not remotely the same. The translation might still be running. The message might already be in Spanish and the app is showing them exactly what they asked for. The provider might have returned nothing. Or the message might be one that cannot be translated at all, in which case waiting is pointless.
A spinner cannot tell those apart. Neither can a parent. And the honest failure mode is not confusion, it is a family quietly deciding the club’s app does not work properly for them and going back to asking another parent.
This covers club messaging in Spanish, which is available where a club turns on more than one language. English and Spanish (United States) are the supported pair. More on how the Spanish side works.
The button that cannot work
Start with the worst version of this, because it is the one most products ship.
A message has no translation. The app shows a Translate button, because a button is friendlier than nothing. The parent taps it. Nothing happens, or the same English comes back. They tap it again.
That button was never going to work. The message was already in Spanish, or there was nothing in it to translate, or the last attempt came back in the wrong language and will do so again. The app did not know any of that, so it offered the action anyway and let the parent find out by failing.
Settled, or worth another go
Rostered records what happened the last time it tried to put a given message into a given language. One record per message per language, overwritten each time, because the only thing anyone needs is the current answer.
Those outcomes split into two groups, and the split is the whole feature.
Four are settled. The message is already in that language. There is nothing in it to translate. The two languages are the same. Or the result came back in a language nobody asked for. Trying again is deterministic: the same inputs produce the same answer, so a retry is an invitation to tap something that cannot succeed.
Everything else is worth another go. A provider that hiccupped, a request that errored. Those are conditions of the moment rather than facts about the message, and a second attempt genuinely might work.
The server decides which of the two it is and tells the app. The app does not infer it from how long it has been waiting, which is how two different clients end up telling two parents two different stories about the same message.
The list lives in one place
There is a detail here that is worth more than it looks.
The set of settled reasons is defined once, in the translation engine, and everything else reads it from there rather than keeping its own copy.
That sounds like housekeeping. It is actually the guarantee. Two hand-maintained copies of the same four reasons drift the moment somebody adds a fifth in one place and forgets the other, and the symptom of that drift lands on a parent: a Translate button, on a message where it can never work, tapped twice before they give up.
Defining it once means the promise holds itself up. Nobody has to remember.
Emails follow the language too, where we know it
The same principle runs through the system emails. Invitations, billing notices and limit warnings go out in the recipient’s language when Rostered knows what that is.
The guardrail is the interesting half. When we do not know someone’s language yet, we do not guess. The message goes in the language we have, and the question of what they read stays open rather than getting silently answered on their behalf by a hostname or a timezone.
That is the same instinct as the retry button. A system that guesses confidently is worse than one that says what it knows, because the parent cannot see which of those they are dealing with.
Two limits worth stating
This is communications, not the interface. The app itself is in English. What changes language is what the club sends and what arrives in a family’s inbox.
It is off until a club turns it on. A club that never touches the setting sees no change anywhere.
Why a state beats a spinner
None of this makes a translation arrive faster. It is not that kind of improvement.
What it does is stop the product asking a parent to do detective work on its behalf. The club’s app should be the thing that removes questions from a family’s evening, not a thing that adds a small one every time a message arrives in the wrong language and refuses to say why.
Rostered is free for every parent and athlete, and clubs start at $9 a month. See what’s free, look at the packages, or start your club.