Универсальный способ для всех языков и фреймворков:
https://ru.wikipedia.org/wiki/GettextКратко: для каждого языка создается текстовый файл с расширением .po , можно руками можно автоматически (крайне рекомендуется) его создавать.
Все тексты для перевода выделяются с помощью специализированных функций используемого вами фреймворка, но общепринятой практикой является приводить функции перевода к знаку подчеркивания, т.е _(“Hello”) .
Текстовый .po файл заполняется строчками, с переводами по типу:
#: myfile.py
msgid “Hello”
msgstr “Привет”
…
Для редактирования такого файла подойдет любой текстовый редактор, но есть и специализированные программы, например poedit.
Далее po-файл компилируется, для этого есть команда msgfmt (из пакета gettext), для Django удобнее это делать через интерфейс к django-admin:
django-admin.py compilemessages
Собственно вот и всё.
Полная документация интернационализации в Django
http://djbook.ru/ch18.htmlnokados
Как в больших проектах с множеством модулей организовать текст, чтобы можно было сделать поддержку нескольких языков, удобно в одном месте менять текст(а не лазать по каждому файлу и менять в коде), и чтобы было оптимально по времени/памяти?
Тут еще нужно уточнить на чём проект. Помимо gettext есть другие решения, например у Qt, хотя никто не мешает пользовать в том же Qt — gettext.