Make URL like /fr/something display same as /something

Milo’s advice set Mansur Khan in the right direction:

In your rewrite_rules_array filter you can look at $rules and see
everything you’d need to duplicate. There are a lot of them- single
posts, author archives, date archives, taxonomy archives, post
formats, attachments, plus pagination and feeds for all of them.

The updated, working code:

add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'init', 'my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules() {
    $rules = get_option( 'rewrite_rules' );        
    if ( ! isset( $rules['fr(\/(.*))?$'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}   

// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
  $newrules = array();
  foreach( $rules as $k => $r ) {
      $newrules['fr/'.$k] = $r;
  }

  $newrules['fr/?'] = '/index.php';

  return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
    array_push( $vars, 'id' );
    return $vars;
}