Can’t manage to make translate_user_role() work

I think your function nesting is slightly muddled; call ucfirst after translating, like so:

esc_html( ucfirst( translate_user_role( $user->roles[0] ) ) );

My bad, completely skipped a beat there. You should instead be using:

translate_user_role( $GLOBALS['wp_roles']->role_names[ $user->roles[0] ] );

It’s unreliable to assume that all role display names are simply ucfirst( $role key ). If that still does not work, are you sure the language files you’re using have fully translated WordPress?