Преимущество gettext по сравнению с другими решениями, такими как ваше, строковые таблицы Java или ресурсы Windows, заключается в том, что он делает исходный код более читабельным.
Сравните это:
printf(_("No photo available (error %d)."), err);
с этим:
printf(i18n(NO_PHOTO), err);
// or some variant of the same thing
В первом случае вы можете увидеть сообщение прямо в коде и точно знать, что оно делает. В последнем случае вы видите только символическую константу и вам нужно найти точный текст и спецификаторы формата.