With
Lingua the translated material is handled by the Lexicons. Our process is to make the templates without any hard coded languages and then make a master English dictionary spreadsheet. We then hand the spreadsheet to our translator and then generate the additional language lexicon files.
Our lexicon dictionaries have all the general words like "yes, no, continue, submit, cancel, login, etc" and then the resource itself holds the content and page-specific translations.
In your template you use something like:
[[!%food_drink? &language=`[[!linguaCultureKey]]`]]
Then you can use the lingua.selector snippet on the front-end to change the languages; or pass ?lang=en to the URL to change the linguaCultureKey.
Then for the content translations setup some additional TVs so translations can be edited quickly in the Resource. Something like this can be used for WayFinder or getResources too:
[[!linguaCultureKey:is=`en`:then=`[[*pagetitle]]`:else=`[[*pagetitle_chinese]]`]]
We prefer this method of keeping all the internationalisation on the resource/lexicons rather than how Babel handles it with contexts. I don't agree on using contexts for internationalisation since they're useful for managing multiple websites or mini-sites from within one manager login. Seems like using contexts for multi languages goes against what contexts were created for.
The only current downside with Lingua is all the lexicon strings need to be called uncached, and if a page has more than 10 lexicon strings a speed reduction can be noticed. However, we need language caching on another project so I've been planning a version 2.0 of Lingua with GoldSky to improve this.