Thank you for your efforts esmi. I finally solved the issue by narrowing down my possible error sources and it turned out to be the .po file not being generated accurately for wordpress. As I only translated a few phrases for testing purposes it happened that all those had comments like in
'name' => _x('Events', 'post type general name', 'mytextdomain')
where “post type general name” is a comment for the translators.
Here comes the problem: This comment – if applied – seems to be essential for identifying the phrase when wordpress tries to match it with a translation. This means that the comment has to be in the .po file as msgctxt “post type general name” together with the msgid “Events”. If not, wordpress will not match the “Events” in the source file with the “Events” in the .po file and therefore not translate the phrase. Actually that wouldn’t be a problem if poedit which is recommended a lot for doing translations with .po/.mo files would care about that. But in fact it doesn’t. There is already a four year old ticket concerning that issue. To avoid this happening one could avoid putting comments in the source files but that would of course cause trouble for the translators as there would be no hints for disambiguation anymore. Or one could use another program than poedit for creating the .po files. The CodeStyling Localization plugin does a good job there. When you don’t need it anymore you can delete it and your translations will stay. But I hope that somebody will solve this issue with poedit soon as it caused me a lot of trouble and probably will do the same for a lot of other people coming across that problem.
Concerning the load_theme_textdomain function it was fully sufficient for my purposes to load the .mo file with that following one line in my functions.php:
load_theme_textdomain('mytextdomain', get_template_directory() . '/languages');
No need for a locale.php in the theme directory.
Now my custom post types are finally being translated :).