Вырасти из фреймворков это на самом деле странно слышать, но дело ваше. Странно тогда почему вы задаете такие вопросы.
donem.com/en/new?id1
это ваш маршрут "en" идентификатор языка. Определите хранилище для переводов. Это может быть база, это могут быть файлы. У WP как ни странно отличная реализация на данный счет, они хранят переводы в .po файлах, которые даже такие моменты как 1 слон (elephant), 2 слона (elephants), 5 слонов (elephants) учитывают. Напишите один класс, который на основе идентификатора языка и оригинального слова будет выводить перевод. У вашей CMS же есть жизненный цикл, шаблоны? Вот вызывайте этот класс переводов в момент компиляции шаблона. А выглядеть это будет как то так - t("elephant"), а там внутри уже найдется соответствие исходной строки и перевода.
Если вам не только интерфейс, но и содержимое (например статьи) переводить хочется, то определите структуру в базе (вы же в базе материалы храните?) которая бы позволяла одни те же данные хранить на разных языках и пусть ваш класс переводов отдает шаблонам данные на нужном языке на основе идентификатора языка.