.ini are great for small, sorry, fat-free, websites
with fat websites, .po gettext let you load only the strings used on a given page, and, most importantly, rebuild the dictionary just by scanning the sources code/template pages. You get a list of never-used i18n strings and, cool, the list of the ones yet to translate.
with .ini, when you add new text, you must hit all your .ini files.
and you don't see when a string is missing (at least not before you get an error), meaning we either need to mock all i18n pages or, quicker, load both original .ini and the translated one, and ask array_diff what it got
But the main concern with F3 .ini is it's not useable as it:
With F3, the i18n strings are stored into the hive, all, and at every request, right? (not only the ones relevant to the current route)
Not a big deal, even for fat-free web-sites (? why a page should load all the texts of the website? for the sake of simplicity ok),
but the usability point is that, for our convenience, we must use i18n strings in templates like every another hive variable, e.g.
@i18n_about_menu,
@i18n_about_menu_title,
@i18n_about_menu_title_tooltip,
@i18n_about_menu_h1_title,
@i18n_about_menu_text_p1,
@i18n_about_menu_text_p2,
@i18n_about_menu_text_p3,
@i18n_about_menu_text_PS
by my side, it's not a fat-free solution.
Would having them in a array improve the usability? quite a bit sure
Another lighter solution than both .po GetText & .ini is to use the much welcomed
Template->extend('<i18n>','Localization::i18nTag');
combined, for those lengthy 'static' pages such as Terms, Blabla & co, with a
<include href="{{@lang}}/static/about.html" />
Everything's possible with such a versatile framework, very appreciable! 2e6 10x!!!