En nuestra empresa tenemos una tabla de traducción ms-sql existente que almacena cadenas como esta:
Id | Key | Language | Value
1 | hello-world | nl-BE | Hallo Wereld
2 | hello-world | en-GB | Hello World
Hay 3 idiomas en el sistema y espero que esto crezca a un máximo de aproximadamente 10 en el futuro
Esta tabla es leída por varios proyectos muy diferentes (alrededor de 60 proyectos, en su mayoría sitios web / aplicaciones web y algunos servicios web), cada uno de los cuales abre una conexión de base de datos a la base de datos de traducción, almacena en caché las traducciones
Los comentarios de los desarrolladores front-end son que nuestra interfaz de usuario para ingresar o modificar el mayor inconveniente de las traducciones es que no pueden saber qué proyecto utiliza qué cadenas.
A veces modifican cadenas sin saber que están rompiendo 7 proyectos con él.
Ahora solo tienen que escribir algo así this.Translate("Hello World")
y el sistema se encarga del resto.
Por supuesto, podría obligarlos a algo así, this.Translate("Hello World","AwesomeApplication1")
pero parece que va a requerir una gran refactorización en los muchos proyectos.
¿Cómo harías para proporcionar esta solución? ¿Cómo, como desarrollador, proporcionaría el "nombre del proyecto" a la traducción? ¿Cómo almacenarías esto en la base de datos?
Nota importante: la reutilización de la traducción es el punto central de la base de datos centralizada, por lo que el alcance de las traducciones a un proyecto va
1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2
No es realmente una opción deseada.
Prefiero algo como:
1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2
o una clave externa equivalente a solo poner los nombres en la tabla.
ACTUALIZAR
Basado en el consejo de normalizar la base de datos, se me ocurrió algo como esto hasta ahora:
//this allows me to distinquish if translations where added by developer or by translator
ACTUALIZACIÓN2: se agregó edmx en lugar de texto. Si la gente está interesada, podría escribir el proyecto WCF en el que estoy envolviendo este concepto para que otras personas puedan probarlo y usarlo.
Respuestas:
Nota preliminar # 1: no nos está diciendo cómo se mantienen las traducciones en este momento
Nota preliminar # 2: su base de datos no está normalizada. Cualquiera sea la solución que vaya a tomar, primero normalice su base de datos . Te encuentras con terribles problemas de mantenimiento más tarde si no lo haces ahora
Esto es lo que haría.
Vuelva a escribir su llamada de traducción para que lleve una ID de programa al servidor
El traductor de fondo pondrá la cadena en la tabla de la base de datos si aún no existe, y la etiquetará con la identificación del programa
Si la cadena ya existe, solo se actualizará si la identificación del programa coincide con la identificación del programa original con la que se creó la cadena. Si no, devuelve una notificación de conflicto.
Variaciones:
Puede usar una 'ID de desarrollador / ID de traductor' en lugar de una ID de programa. Lo considero mejor porque hay personas que saben un idioma extranjero y aquellos que piensan que saben. Solo el primer grupo tiene derechos de modificación.
Es posible que desee almacenar los ID de todos los programas que usan la cadena en la base de datos, para que sepa qué programas entran en conflicto.
Podrías extender este pensamiento de 'propiedad' a cada idioma individual: una persona puede hacer inglés y la otra holandesa.
Una vez que su base de datos está normalizada, agrega complejidad de compilación como "El programa A está en los idiomas 1,2,3; B está en 3 y 5"
También le sugiero que escriba un programa separado de 'mantenimiento de la traducción' que le mostrará las traducciones faltantes, etc. Lo hice una vez con autorización de 2 niveles: cada traducción debe ser revisada por una segunda persona (generalmente un hablante nativo).
fuente
Dado que hacen referencia a 'esto' ... puede asignar el nombre del proyecto una vez a 'esto' (a través del constructor, por ejemplo) y la interfaz para las funciones de traducción no cambiaría para los codificadores. Debajo del capó, simplemente agrega el nombre del proyecto a la consulta de la base de datos. Alternativamente, puede proporcionar 'esto' como un medio para conocer el nombre del proyecto por sí solo. Realmente va a depender de cómo tengas estructuradas tus clases.
Para el almacenamiento, puede hacer algo como:
Use un comodín para aplicar una traducción general a todas las aplicaciones, pero el nombre de la aplicación específica cuando desee anular una traducción para una aplicación en particular. Esto mantendrá las duplicaciones al mínimo.
Para ver qué programa está utilizando qué traducciones, ahora lo sabe: si no desea revisar y recopilar manualmente esa información, puede registrar las solicitudes de traducción.
fuente
Si todos sus proyectos están escritos en C # y todas las llamadas de traductor se ven así
donde "hello-world" es la clave en su tabla de traducción, no debería ser demasiado difícil escribir un pequeño escáner de código fuente usando expresiones regulares para encontrar todas las llamadas de traductor y asignar a las palabras clave los nombres de proyecto correspondientes. De esta manera, no tiene que cambiar ninguno de sus códigos existentes o interfaces de traductor.
Dependiendo de la estructura real de su programa, alternativamente puede ser más fácil extraer esa información del código IL de sus ensamblados. Hice algo muy similar hace algún tiempo, también con fines de traducción, usando este código de ejemplo para analizar ensamblajes.
fuente