My company has done a few multi-language sites before. We just did a 3 language (EN, ES, and PT) site and Farcry worked great for the content side of things. We set up multiple fields for each content-type and created our own "i18n" file of sorts for non-CMS elements.
In FarCry, we added in duplicates for any field that required it. So for say a news object, we had 3 title fields, Title, TitleES, and TitlePT. Then Body, BodyES, BodyPT etc...
We made sure to name them this way so we could leverage the "Eval" function to output based on the language code if it was not English.
Evaluate("stobj.title#langvar#") rendered as Title, TitleES, and TitlePT based on language.
This allowed us to write a single line instead of a switch or if statement.
Then for any items that were not managed in the CMS, like button text etc. We set up an include that housed all our needed language translations in a switch function.
<cfargument name="message" required="yes" type="string">
<cfargument name="lang" required="yes" type="string">
<cfif lang EQ 'EN'><cfset message="Next"></cfif>
<cfif lang EQ 'ES'><cfset message="Siguiente"></cfif>
<cfif lang EQ 'PT'><cfset message="Seguinte"></cfif>
For URLs, you will need to write your own function to save when something is published, and then render out the proper URL language string for links. This is really the only tricky part.