Osobiście robię to tak, że mam pliki. Każdy plik to osobny język, a jaki to będzie plik, xml, json, php, yaml to już twoja sprawa. Osobiście preferuje yamla. Do tego mam klasę do obsługi takiego języka i całość pięknie lata. Dodałem jeszcze taki jeden ficzer, nie wiem czy dobrze w sumie. Otóż, jest jeden podstawowy język, który można ustawić w konfiguracji. I załóżmy że ten język ma kompletne tłumaczenie. W przypadku innych języków to tłumaczenie może nie być kompletnie. Dlatego też rekursywnie łącze tablice i w przypadku kiedy w innym niż domyślny język nie będzie jakiegoś przetłumaczonego tekstu, zostanie to zastąpione tekstem z domyślnego języka. W ten sposób nie będę miał pustych miejsc, a dodatkowo zrobiłem sobie bardzo fajny moduł do tłumaczenia bezpośrednio z panelu administracyjnego