Здесь дан ответ, почему именно gettext.
Вкратце процесс локализации выглядит так:
- в исходном коде подготовить и отметить строки, подлежащие переводу;
- извлечь строки с помощью xgettext, в результате получится шаблон (POT-файл);
- на основе шаблона с помощью msginit создать PO-файлы для требуемых языков;
- перевести строки в PO-файлах;
- создать MO-файлы с помощью msgfmt.
Подробнее в
документации.
Пример для shell.
Тут есть наглядная картинка и др.