Cómo crear un sistema multi-lingual sin complicaciones

Cómo crear un sistema multi-lingual sin complicaciones
Los que han intentado implementar una solución saben que el mayor reto es hacerlo simple.

Muchas aplicaciones empiezan su desarrollo sin pensar en esto. Para cuando consideran agregar idiomas adicionales, la tarea ya implica regresar a páginas y crear frameworks nuevos. Para evitar el retrabajo y los errores, es importante establecer la lógica para hacerlo desde un principio.

Con este ejercicio buscamos resolver lo anterior de la forma más sencilla posible, usando estructuras y servicios que vivan en la aplicación, que se estructuren de forma simple y que no implique gran complejidad implementar. Sobre todo que cuando se revise el código en cada página, se entienda la variable.

Después de muchas pruebas, llegue a la conclusión que el mejor mecanismo es contar cun archivo de idiomas donde se puedan ver las variables disponibles y tenerlas en todos los idiomas necesarios. El idioma es justamente la llave.
lang.json
-----------
{
	"SPA" :
    	{
        	"general_hello" : "Hola!",
        	"general_submit" : "Enviar",
            "general_help" : "Ayuda",
            "general_name" : "Nombre",
            "menu_reports" : "Reportes",
            "menu_tools" : "Herramientas",
            "menu_logout" : "Cerrar"
        },
	"ENG" :
    	{
        	"general_hello" : "Hello!",
        	"general_submit" : "Send",
            "general_help" : "Help",
            "general_name" : "Name",
            "menu_reports" : "Reports",
            "menu_tools" : "Tools",
            "menu_logout" : "Logout"
        }
}    

En lo personal me gusta nombrar mis variables siempre en dos unidades, la primera que me permite agrupar la etiqueta y tener asi variaciones (ej: "general" y "menu") y la segunda la que describe justamente el texto (ej: "help", "name", "tools"), simplemente los separo con un guion bajo.

Me adelanto un poco y les platico como luce esta variable ya implementada en la página. Lo más importante es que no parezca código, sino que se entienda exactamente que se trata de un texto y de cual es ese texto. Un ejemplo se ve así:

<cfoutput>
<ol class="nav>
	<li>#Lang["menu_reports"]#</li>
	<li>#Lang["menu_tools"]#</li>
	<li>#Lang["menu_logout"]#</li>
</ol>
</cfoutput>

Para hacer que esto sea posible, necesitamos definir un par de cosas muy puntuales. Esto sucede a nivel Application.cfc y en un componente donde tengamos funciones administrativas.