То что вы ищете, называется i18n (принятое сокращение от internationalization). Есть множество способов реализации. Если используете фреймворк, то там этот механизм скорее всего уже есть (гуглите по *названиефреймворка* i18n). Если самопис, то вот простой пример.
Весь статичный текст из кода можно вынести в отдельный файл json (или просто php файл который возвращает массив, и инклудить его).
В файле должен быть многомерный массив вида
return [
'ru' => [
'text1' => 'текст 1',
'text2' => 'текст 2'
],
'en' => [
'text1' => 'text 1',
'text2' => 'text 2'
],
'es' => [
'text1' => 'texto 1',
'text2' => 'texto 2'
]
];
Если различные языки будут еще и в БД, то нужно либо дублировать таблицы, либо заводить доп поля с префиксами языков. Это уже зависит от структуры БД