How to send e-mail in users selected languages
Cron runs as the anonymous user, so any emails sent by cron will use the site's default language.

Your code snippet has the following:

 $language = user_preferred_language();


This is wrong.  It will get the preferred language of the anonymous user, not the user you're sending the mail to.

Instead: figure out the recipient's preferred language:

$userobj = user_load($user);
$language = user_preferred_language($userobj);


Now, you can send mail with the correct language:

$result = drupal_mail($module, $key, $to, $language, $params, $from, $send);