Поскольку система маршрутов работает сверху вниз, если у вас есть несколько правил, которые могут соответствовать URL, она выбирает первое.Таким образом, вы могли бы сделать:
$route['(es|fr|en)'] = 'language/$1';
$route['(:any)'] = 'profile/user/$1';
Если первое правило соответствует, оно запускается, в противном случае оно проверяет правило профиля.
Вы обязательно продолжите сталкиваться с проблемами, хотя с этим правилом профиля, и это будетпроще, если вы сделали что-то вроде:
$route['users/(:any)'] = 'profile/user/$1';
Таким образом, было бы более понятно, что делает URL, и это поможет вам, когда вы будете писать правила в будущем.