Extract i18n initialization into ui_i18n.c

This allows be more explicit about language fallback
route, and change it per-language.

Localized strings are now accessed via a function call,
instead of exposing a big string array.

This allows additional bounds check with a visible canary
value, and further abstracts i18n implementation.