PO files work well for software but don't really interface with customers and approval processes. Adding localisation into the mix makes it even more demanding - now we have to keep track if the original text changes so the translations get updated.
How do you solve this?
- Use a simple key/value structure (you won't need categories/lazy loading, until your app is REALLY big),e.g. {"placeholder": "translation"} in JS
- Use unified access to this structure (Aspect oriented/Service registry/simple function) with a default language fallback - e.g. a function translate('myTranslation');
- If possible, use a very fast but simple key/value data structure (dictionary, array, object, whatever) to store the default translations (static/compile time!)
- Don't try to find automatic solutions for pluralization (just store another key/value pair for the plural[s])
- If you need to switch translations at runtime or update translations on a regular basis (e.g. after updating translations from a db) use a fast, cacheable proxy in front of your key/value thing
- Create a language "placeholders", to see the placeholders used directly in the app just by switching to it
- Don't use constants (because it might be possible that you need to load two languages at a time)
Just my 2 cents