Я приверженец строковых констант, т.е. конструкций вида i18n::get('Hello %s!',$username), либо сокращенно l('Hello %s',$username). Но я использую неймспейсы для строк, а не глобальное хранилище. Реализуется очень просто (открыли, прочитали, добавили, сохранили), и удобно что новая строка автоматически добавляется в неймспейс и сохраняется.
Лично для себя, в любом i18n считаю важным возможность экспорта и импорта локализаций (раньше использовал CSV, но из-за проблем с UTF перехожу на PO), поддержка словообразования для различных языков (1 яблоко, 2 яблока, 6 яблок), кеширование и ускоренную (через мета конструкцию) локализацию view файлов.
К сожалению, все это часть фреймворка, но по запросу могу выслать файлы с пояснениями.