Ranran has a good point about words that are the same in English but have multiple meanings and different translation. Left and Right are very good examples. Not only Japanese. Czech has the same distinction between "left side" and "x km left" or "right side" and "public right of way".
Documentation for gettext about how to prepare strings within the program: gnu.org/software/gettext/manual/html_node/Preparing-Strings.html#Preparing-Strings
They use the example "no match" and ask how the translator would know the program isn't trying to set something on fire, but can't since it lacks the tool. And there is no solution for that in code, they pretty much tell the programmer to use more meaningful strings such that the translator can grasp the meaning while translating. For the most part, the programmer does not need to speak other languages, they only need to know that the word they use has several meanings in English, and it shouldn't hurt to make that perfectly clear.
Though in Simutrans, an additional problem is that the programmer should use strings that look good in the game on their own, since any untranslated strings appear "raw". So that's another fallback we'd need - whenever there is no translation in the chosen language, use English translation. Which shouldn't even be hard to implement, just repeat if nothing was found?
Actually, I think my third suggestion from before (using tabs to make strings more and more special) could be used to solve the plural issue, kinda, by adding "\tone", "\tzero", "\two", "\few" or "\many".
Instead of calling translator::translate(string), call translator::translate(string, int). The translator would append the according suffix if the integer is in zero, one, two, few or many, where each of these five is a set, which depends on the current language (eg. in french, 0 would be in the one-set). Hence, you'd translate
"You own %d vehicle(s)" as
"You own %d vehicles" AND
"You own %d vehicle(s)\tone" as
"You own %d vehicle", but if
"You own %d vehicle(s)\tone" has no translation, it falls back to
"You own %d vehicles".
Since any strings with a tab are technically optional, the SimuTranslator shouldn't count them towards total translation and would have to treat them kind of seperate.
Anyway - what I intended with this discussion is basically to introduce guidelines like the ones gettext has for preparing strings. I think this needs to be the first step, since changing to gettext - if someone actually wants that - wouldn't get harder if our strings were already in the right format. Adding new translator features to account for plurals or gender wouldn't get harder if our strings were already in a better format. Only thing I think we really need is english as a fallback language for everyone, rather than raw text (which would be good anyway, to remove the old German strings from players sight entirely), and we need to be in agreement that we want to try and have meaningful strings that are easy to translate while treating the issue of too little translation activity as a separate one.