How to disable i18n language dropdown in node form?
So, the i18n dropdown is attached to the node form afterwards. For now I simply unset($form['#after_build'][0]) where _i18n_node_form_node_form_alter is called. Unsetting it hides all other available languages from the dropdown making it impossible to change it. To me that seems fine. If there's a more appropriate way to do this, please let me know.

function MYMODULE_form_alter(&amp;$form, &amp;$form_state, $form_id) {
    global $user;
    $editor = in_array('editor', $user-&gt;roles) ? TRUE : FALSE;
    if (isset($form['#node_edit_form']) &amp;&amp; $form['#node_edit_form'] == TRUE &amp;&amp; $editor) {
        unset($form['#after_build'][0]);
    }
}




Finally I did it like @J.Reynolds suggested with hook_module_implements_alter to ensure that my module runs after Locale module

function MYMODULE_form_alter(&amp;$form, &amp;$form_state, $form_id) {
    global $user;
    $editor = in_array('editor', $user-&gt;roles) ? TRUE : FALSE;
    $node_edit = isset($form['#node_edit_form']) &amp;&amp; $form['#node_edit_form'] ? TRUE : FALSE;

    if ($node_edit &amp;&amp; $editor) {
        $form['language']['#disabled'] = TRUE;
    }
}

function MYMODULE_module_implements_alter(&amp;$implementations, $hook) {
    if ($hook == 'form_alter') {
        $module = 'MYMODULE';
        // store
        $group = array($module =&gt; $implementations[$module]);
        // unset
        unset($implementations[$module]);
        // add to the end
        $implementations = $implementations + $group;
    }
}