The code you give here is what my module bases on to write the keys.
I can see two things that bring the confusion there:
First you need to write the first key in the system locale reference file. This is what the module does with the first command and that you can't do online.
Then you can indeed add the missing keys in the other locales files, but this is by copying the nodes from the reference file to the localized one. I haven't seen any function in dnn that helps actually building the reference file, except for the logs. That's the primary purpose of my module. The english text it adds is inferred from the control name by playing with a regex, since most module makers use the same syntax: prefix for the control type (pl, txt, chk...) + camel case for the control name.
So when it analyses the log, the module will create the key (and the file if it does not exist) and the related text.
Of course one may whish to modify the initial texts, that can be done online with your editor, so I think it's still easier than building the xml from scratch.
Same for the translation: the call to the webservice does a bit what your "add missing key" does except that it it performs an automatic translation with the web service on the fly and it does it for the whole install or a single module. Correcting the biased translation is again easier than starting from scratch with the english version.
I'd say that with a regular module, the first option gets the correct english name for more than 50% of the resource keys ("plMyControl" usually gets an english "My Control" reference text).
That of course encourages to use processable control IDs such admin controls ones, which I think is also a good thing, since it normalizes the naming conventions. But even if you have other kind of Ids, and don't rely on the regex trick, it's still much easier to correct the keys than to write the XML from scratch.
Then again the automatized translation results correct for about 50% of the keys -> this is very true for small texts where word by word translation is OK, and this is usually more than half of what you need to translate.
So you can except that half the whole localization job is all done automatically + the fact that the rest is just about correcting the translation instead of building them from scratch. I really think there is some gain of productivity there, thus my proposal to check if something can be added to the core.
Since most members were private in your classes I add to copy loads of your code back in the module. That's because I'm really basing on your code in the first place and only extending it, and that's what made me think you may want to have a look at the module.