You can add context this way, but programmers often forget, translators don't look for context, and seemingly no one reviews the final product in other languages.
That's exactly my point: using gettext and hoping to hard-code one language (typically english) as the "key" language and then sending it to translators who will try to map context-less strings to a different language is just not a good way of localizing software. I think the key design flaw is that it's the best solution to an unviable problem: the idea of adding i18n to software as a simple transform from one language to another (i.e. an afterthought).
The proper solution again, is using keys that provide the context. A special syntax for these neutral strings (e.g. prefix, uppercase, whatever) will quickly show where a translation is missing. Translating is then a mapping from keys to english, or keys to french and so on and never english -> french, even with gettext. Instead of "Zip file" you'd have to hard code ":filetype_zip".
You can add context this way, but programmers often forget, translators don't look for context, and seemingly no one reviews the final product in other languages.