Some notes for you to hopefully help you understand how these are processed while we try to find a preventive way to solve this for all languages.
Each “achievement” you register are posts in a post type that the plugin registers itself. When it comes time, we loop through all of the achievement types made, and create post types for those. Post type used to create post types.
It’ll grab the post title for the achievement, and set some hidden meta fields name _badgeos_singular_name and _badgeos_plural_name. If the singular name saved already doesn’t match the post title, it’ll update that to match. If there isn’t a plural form saved already, it’ll save the same value, otherwise not touch the plural.
After that, it’ll pull the values saved in those two meta fields, and continue on to registering the post types. It’s at that point that the singular value is run through the following:
sanitize_title( substr( strtolower( $achievement_name_singular ), 0, 20 ) )
Working from inside out: strtolower will make all of the characters lowercase, substr will trim the value to 20 characters, as that’s the max allowed for post type slugs, and then it runs the value through sanitize_title(). That will make the text “WordPress slug ready” aka clean up parts of it, replace spaces with -‘s or _’s and so on.
I have to wonder if there’s something going on within that, specifically the sanitize_title() part and perhaps some character encoding. However, we’ll be trying to find the permanent solution over here, with the information you provided above.