as specified in that comment, its generally easier to do something like:
sprint(other, sprintf(_("You got %d shells\n"), self.ammo_shells)); or something.
You can then use the xgettext command (this is assuming you have linux or cygwin or something installed somewhere - you'll need to consult the man pages or something to figure out the right arguments to get it to parse your QC, but its similar enough to C that you'll have no issues) to create a .pot file from your source, one that will contain ONLY the strings contained within the _() intrinsic thing. You can then use the other programs provided in the same unix package to merge+manage your translations such that you don't need to restart from scratch all the itme.
Note that using sprintf as above gives your translators the possibility of reordering arguments to match their language (eg if the natural way to write it in some language is like 'shells +5 to you', then sprintf can cope with that where ftos and strcats would not be able to).
sprintf also allows more complete strings, which can help give more reliable translations.
Note that right now there's no way to deal with plurals properly. Eg a french mod might have '1st' and 'nth', but an english translation of that needs '2nd' and '3rd' pluralities too, and things get really messy when you deal with teens and french's utterly bizzare 'quatre vingt dix neuf'. As a result you may find you still need to change the qc code for specific languages.