Creación de una base de datos de traducción de cadenas para proyectos múltiples (internos)

9

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.

Mvision
fuente
Ty para la normalización. votó q y a. Creo que un java github de primavera ayudaría.
tgkprog

Respuestas:

5

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.

  1. Vuelva a escribir su llamada de traducción para que lleve una ID de programa al servidor

  2. 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

  3. 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).

Jan Doggen
fuente
1
Actualicé mi pregunta en función de sus ideas
Mvision
5

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:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

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.

Gran maestro B
fuente
La idea de moverla a la clase 'this' me parece buena, creo que voy a mover el nombre del proyecto al archivo web / app.config y leerlo desde allí. ¿Crees que la idea de comodines / nombres de proyectos es escalable a algo así como 4000 traducciones?
Mvision
3
Como una mejora, se podría agregar un disparador a la base de datos o al DBAL que actualiza la columna "programas suscritos" cada vez que se lee una palabra traducida.
¿Cómo podría la base de datos desencadenar el nombre del proyecto? (Estamos utilizando el marco de entidad 4)
Mvision
@Mvision No veo por qué no: el volumen no debería ser un gran problema. Si muchas de las traducciones específicas de la aplicación simplemente están insertando el nombre de la aplicación, también puede usar constantes para reducir duplicaciones.
GrandmasterB
nvm no entendí bien. sí, un disparador podría hacer, y aceleraría las cosas en comparación con verificar y actualizar esas cosas a través de EF en lectura ... buena llamada
Mvision
1

Si todos sus proyectos están escritos en C # y todas las llamadas de traductor se ven así

this.Translate("hello-world")

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.

Doc Brown
fuente
Me gustaba este tipo de solución. Pero requeriría que los 60 proyectos (algunos ni siquiera los míos) se probaran completamente antes de comenzar la producción con este nuevo sistema. La solución sugerida para mover el nombre del proyecto al código de llamada funciona bien y causará muchos menos problemas, ¡gracias de todos modos!
Mvision
1
@Mvision: Creo que lo contrario es cierto. Si determina el nombre del proyecto para las traducciones en tiempo de ejecución, debe asegurarse de que cada página web con cada traducción de sus 60 proyectos tenga que ser llamada una vez para asegurarse de haberlos registrado todos. Sin embargo, el escaneo estático de la fuente o los ensamblajes le brinda una lista completa sin la necesidad de realizar pruebas ni ejecutar todo el sistema.
Doc Brown