Есть несколько стандартов для локализации (i10n) и интернационализации (i18n).
Довольно неплохой разбор разных правил сделан здесь
guides.rubyonrails.org/i18n.html
https://www.npmjs.com/package/i18n
https://docs.angularjs.org/guide/i18n
php.net/intl
Везде несколько разный подход, но в целом все сводится к созданию карты и условностей.
Лично я бы хранил данные для перевода в 2х местах.
Первое место - самый быстрый способ хранения для вашего ЯП/фреймворка. Этот вариант для продакшена и нагрузки.
Второе место - база, для редактирования. После редактирования автоматическая генерация файлов для первого варианта.
Механизм перевода должен быть реализован так, что если в режиме разработки/тестирования встречается незнакомый перевод, он сохраняется в базу. В дальнейшем это приводится в нормальный вид профессиональным переводчиком, для которого должен быть создан соответствующий интерфейс.