Hay varias maneras de abordar esto. Ninguno "de la mejor manera" y todos con problemas a corto o largo plazo. Lo primero que hay que decir es que los sitios multilingües no son fáciles, los traductores y las personas son encantadoras, pero es difícil trabajar con ellos y la mayoría de los programadores ven el problema solo como un problema técnico. También hay otra dimensión, fuera del alcance de esta respuesta, en cuanto a si está traduciendo o localizando. Esto implica observar las costumbres culturales del público objetivo y luego adaptar el idioma, el estilo, el diseño, el color, el tipo de letra, etc., a esa cultura. Finalmente, no use MT, traducción automática, para nada serio o si necesita ser preciso y cuando contrate traductores, asegúrese de que estén traduciendo de un idioma extranjero a su idioma nativo, lo que significa que entienden todos los matices del idioma de destino.
Derecha. Soluciones. Si no desea volver a escribir el sitio, simplemente clone el sitio que tiene y traduzca las copias al idioma de destino. Suponiendo que la base del código sea estable, puede usar un VCS para administrar cualquier cambio en el código. Puede modificar partes individuales del sitio para que se ajusten al idioma de destino, por ejemplo, el texto en francés es en promedio un 30% más grande que el texto equivalente en inglés, por lo que usar un sitio para entregar esto significa que puede (tendrá) problemas de formato y necesitará cambiar un diferentes archivos css dentro y fuera dependiendo del idioma. Puede parecer una forma torpe de hacerlo, pero ¿cuánto tiempo van a existir los sitios? La sobrecarga de administración de hacerlo de esta manera puede ser menor que con otras opciones.
Segunda vía sin reconstruir. Reemplace todo el contenido en el sitio actual con etiquetas y luego coloque el idioma diferente en archivos o tablas de base de datos, olfatee el idioma deseado de los usuarios (¿tiene usuarios registrados que puedan hacer una preferencia o desea obtener la etiqueta de idioma del navegador, o es será la URL punto-com punto-fr, punto-de la que haga la elección) y luego reemplace las etiquetas con el idioma de destino. Luego, debe abordar los problemas de tamaño y los problemas de imagen por separado. Esta solución está en vigor cuando frameworks como Symfony y Zend implementan l10n.
Luego, podría reconstruir con un marco o con gettext y posiblemente tener una solución más limpia, pero recuerde que los marcos fueron diseñados para resolver otros problemas, no la traducción, y el componente de traducción ha entrado en el marco como una solución parcial, no completa.
El gran problema con todas las soluciones es el mantenimiento continuo. Porque no solo tiene una base de código sino también varias bases de idiomas para mantener. A menos que la solución "todo en uno" sea realmente inteligente y efectiva, la tarea en curso será difícil.