How to alter the languages available in a form
OK: found the answer for anyone else. In D7, the i18n implements a callback that happens AFTER the form is rendered, so you need to add a callback as well. So:

function example_form_node_form_alter(&amp;$form, $form_state) {
   $form['#after_build'][] = '_example_form_node_form_alter';
}

function _example_form_node_form_alter($form, &amp;$form_state) {
  //example_language_list returns an array in the form of ("en"=&gt;"English") etc
  $form['language']['#options'] = example_language_list($form['#node'], TRUE);
  if (!i18n_node_language_options($node, 'required')) {
    $form['language']['#options'] = array(LANGUAGE_NONE =&gt; t('Language neutral')) + $form['language']['#options'];
  }
 return $form;
}