Localización en Wisej.NET
Una aplicación escrita para una sola oficina se reconoce enseguida: cada encabezado y cada botón son cadenas en inglés escritas directamente en el código, y los importes y las fechas aparecen tal y como los formatea el servidor. Este curso para principiantes te enseña a sacar ese texto del código y a mostrar cada valor con la forma que espera la cultura del usuario, todo construido alrededor de GlobalDesk, un pequeño service desk multilingüe con un dashboard localizado, un editor de clientes, una cuadrícula de contactos y un selector de idioma. Siete módulos parten de los fundamentos (nombres de cultura, archivos .resx, ResourceManager, el repliegue hacia el recurso neutro y claves semánticas estables) y siguen con la localización en el diseñador de Visual Studio mediante la propiedad Localizable y el selector Language, los recursos compartidos de la aplicación, los marcadores de posición formateados con la cultura activa y las etiquetas de sistema de Wisej.NET. A partir de ahí establecerás la cultura de sesión desde el idioma del navegador, gestionarás Application.CultureChanged para repintar lo que el cambio dejó atrás, harás que los diseños sobrevivan a un idioma que se escribe de derecha a izquierda y a traducciones mucho más largas, organizarás las traducciones como trabajo de equipo con ResX Resource Manager y terminarás con un LocalizationService, la seudolocalización y una matriz de pruebas de localización en el proyecto final. Está pensado para desarrolladores que conocen los fundamentos de C# y los controles de Wisej.NET y ahora tienen que publicar la aplicación en más de un idioma.
Crea aplicaciones multilingües con recursos .resx, formato según la cultura, cambio de idioma en tiempo de ejecución y diseños de derecha a izquierda.
- Nivel: Beginner
- Duración: 8 h
- Módulos: 7
Temario
Módulo 1: Fundamentos de localización: cultura, idioma y recursos
Módulo 1 de Localización en Wisej.NET — crea aplicaciones multilingües con recursos .resx, formato según la cultura, cambio de idioma en tiempo de ejecución y diseños de derecha a izquierda. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre los fundamentos de localización, supera la evaluación de conocimientos y después completa el laboratorio práctico en GlobalDesk.
- LecturaGuía de la lección · 14 min
Qué abarca realmente la localización más allá de la traducción: nombres de cultura como en, de-DE y fr-CA, archivos de recursos .resx leídos a través de ResourceManager, el repliegue de cultura de .NET hacia el recurso neutro, claves semánticas estables en lugar de frases en inglés dentro del código, y el formato sensible a la cultura de fechas, números y moneda. Qué significa esto para un desarrollador que conoce los fundamentos de C# y los controles de Wisej.NET y ahora tiene que publicar la aplicación en más de un idioma, y cómo leer este módulo.
- LecturaGuía del laboratorio / examen · 10 min
Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.
- Lección en vídeoCultura, recursos y el texto que nunca debes escribir en el código · 14 min
Cultura, recursos y el texto que nunca debes escribir en el código: un recorrido guiado del Módulo 1, construido paso a paso en GlobalDesk. Se ejecuta aquí mismo, en el reproductor.
Transcripción de la narración
Localización en Wisej.NET, módulo uno. GlobalDesk es un servicio de soporte escrito para una única oficina, y convertirlo en una aplicación que puedan usar varias oficinas empieza por dos trabajos separados.
El inglés fijado en el código es solo la mitad del problema. Construir un importe poniendo un símbolo de dólar delante de un número deja grabada en el código la convención de un solo país, y ningún archivo de traducción deshará eso jamás. Wisej.NET usa aquí el modelo estándar de .NET: archivos de recursos, CultureInfo y ResourceManager.
El nombre de una cultura une un idioma con una región. El inglés por sí solo es únicamente idioma, mientras que inglés de Estados Unidos, alemán de Alemania y francés de Canadá añaden convenciones regionales. El idioma decide las palabras que muestras; la cultura decide cómo se escriben las fechas, los números y los importes.
Los archivos de recursos se apilan. Una búsqueda prueba primero el archivo más específico, después el de solo idioma y por último el neutro. Como el archivo neutro es la última parada, tiene que estar completo: lo que falte ahí ya no tiene nada a lo que recurrir.
En el código, eso significa doce claves semánticas en el archivo de recursos neutro y un ResourceManager construido a partir del nombre base y el ensamblado. Un ayudante devuelve la clave entre corchetes cuando no encuentra nada, así que un hueco aparece como algo que puedes leer en pantalla y no como una etiqueta vacía que nadie nota.
Ahora, la reescritura. Un método pone las palabras en pantalla buscando cada rótulo por su clave. Un segundo formatea una fecha, un número y un importe usando la cultura actual en el momento de mostrarlos, lo que mantiene los valores almacenados intactos y neutros.
Al ejecutarlo, todos los rótulos se resuelven menos uno, y ese se dibuja como su clave entre corchetes. El hueco se ve, en lugar de quedar en silencio. Añade la clave que falta y los tres valores de vista previa se formatean según la cultura bajo la que se ejecuta esta sesión.
Dos navegadores contra un mismo proceso de servidor, uno en inglés y otro en alemán, muestran el mismo código, las mismas claves y el mismo decimal almacenado dibujados de dos maneras. Eso funciona porque la cultura pertenece a la sesión y nunca a un campo estático compartido por todos.
Laboratorio uno: construye el panel de GlobalDesk sobre un archivo de recursos neutro, añade el ayudante de texto que marca las claves que faltan, añade el panel de vista previa de cultura y escribe la nota que separa los datos de la presentación.
- LecturaEjercicio de programación con IA · 20 min
Construye el ejemplo GlobalDesk de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.
- CuestionarioEvaluación de conocimientos — Módulo 1 · 10 min · Nota mínima 80%
- Laboratorio prácticoLaboratorio — Claves de recursos y formato según la cultura · 45 min
Objetivo: Crea la página del dashboard de GlobalDesk con un encabezado de bienvenida, un botón de navegación Customers y un pequeño panel de vista previa de la cultura. Añade Resources/Strings.resx como recurso neutro con al menos doce claves semánticas estables como Navigation.Customers y CustomerEditor.Save, escribe un helper estático Texts sobre Wisej.Resources.ResourceManager que devuelva un marcador de clave entre corchetes cuando falte una clave, y sustituye por una llamada a Texts.Get cada etiqueta escrita directamente en la página. Después rellena el panel de vista previa con valores reales: da formato a la fecha de hoy, a una cantidad y a un importe monetario con Application.CurrentCulture en lugar de componer las cadenas a mano, y termina con una nota breve de laboratorio que separe el valor almacenado de su presentación sensible a la cultura. Entregables: Página del dashboard de GlobalDesk cuyas etiquetas proceden todas de claves de recursos, sin texto visible para el usuario escrito en el código; Archivo neutro Resources/Strings.resx con al menos doce claves semánticas estables; Helper Texts sobre Wisej.Resources.ResourceManager que marca una clave ausente en lugar de devolver una cadena vacía; Panel de vista previa de la cultura que da formato a una fecha, un número y una moneda con Application.CurrentCulture; Nota de laboratorio que explica qué valores son datos y cuáles son presentación sensible a la cultura.
Módulo 2: Localizar la interfaz de Wisej.NET en el diseñador de Visual Studio
Módulo 2 de Localización en Wisej.NET — crea aplicaciones multilingües con recursos .resx, formato según la cultura, cambio de idioma en tiempo de ejecución y diseños de derecha a izquierda. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre la localización en el diseñador, supera la evaluación de conocimientos y después completa el laboratorio práctico en GlobalDesk.
- LecturaGuía de la lección · 14 min
La localización en el diseñador sobre un contenedor de nivel superior de Wisej.NET: la propiedad Localizable, el selector Language del diseñador, las propiedades que legítimamente difieren según el idioma como Text, Size, Location, colores e imágenes, los archivos de recursos que genera el diseñador y la regla de que los recursos del diseñador se aplican al crearse los controles. Qué significa esto para un desarrollador que conoce los fundamentos de C# y los controles de Wisej.NET y ahora tiene que publicar la aplicación en más de un idioma, y cómo leer este módulo.
- LecturaGuía del laboratorio / examen · 10 min
Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.
- Lección en vídeoLocalizable, el selector Language y lo que escribe el diseñador · 14 min
Localizable, el selector Language y lo que escribe el diseñador: un recorrido guiado del Módulo 2, construido paso a paso en GlobalDesk. Se ejecuta aquí mismo, en el reproductor.
Transcripción de la narración
Módulo dos: localizar una pantalla que se dibujó en lugar de escribirse. El editor de clientes de GlobalDesk se compuso en el diseñador de Visual Studio, y el alemán necesita palabras distintas y, resulta, también una geometría distinta.
Los rótulos que viven solo en el diseñador son inalcanzables para un traductor. Un rótulo alemán no cabrá en un botón dimensionado para el inglés. Y ensanchar todos los botones para el idioma más largo que puedas llegar a publicar arruina el diseño para el idioma que de verdad lee la mayoría de tus usuarios.
Seis pasos. Termina primero el diseño neutro. Marca el formulario como localizable. Elige el idioma. Cambia solo lo que difiere. Ejecuta la aplicación bajo esa cultura. Y devuelve después el diseñador a neutro antes de hacer cualquier cambio estructural, porque las ediciones estructurales pertenecen solo al diseño neutro.
El código generado del diseñador conserva únicamente los valores neutros, y el autoajuste, el anclaje y el acoplamiento hacen el trabajo de diseño. El texto, el tamaño y la posición alemanes se escriben en cambio en archivos de recursos generados, y por eso a un traductor se le pueden entregar archivos en lugar de un entorno de desarrollo.
La cultura actual pertenece a la sesión, nunca a un campo estático. Y como los recursos del diseñador se leen al crear un control, cambiar la cultura no repinta una pantalla que ya existe. Hay que quitar el editor, descartarlo y construirlo de nuevo antes de que vuelva a leer sus recursos.
Decide la capa antes de añadir la cadena. El texto, el tamaño, la posición, los colores y las imágenes que pertenecen a una pantalla diseñada van en los recursos del diseñador de esa pantalla. Todo lo que genere el código, y todo lo que compartan varias pantallas, va en cambio en el archivo de recursos compartido.
Ejecutando en alemán, los rótulos se recortan dentro de un ancho de botón que se midió contra el inglés, hasta que el tamaño se anula solo para el alemán. Quien lo demuestra es el navegador, no la superficie de diseño, porque la superficie de diseño te está mostrando el diseño neutro.
Cambiar la cultura de la sesión mientras la aplicación se ejecuta deja el editor abierto en inglés. Se queda así hasta que la acción de recrear lo descarta y construye uno nuevo, que entonces lee sus recursos bajo la nueva cultura. Esa es la regla del momento de creación, vista en directo.
Laboratorio dos: haz localizable el editor de clientes, añade una variante alemana con una anulación de tamaño y otra de posición, evita que los rótulos se recorten y demuestra la regla del momento de creación.
- LecturaEjercicio de programación con IA · 20 min
Construye el ejemplo GlobalDesk de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.
- CuestionarioEvaluación de conocimientos — Módulo 2 · 10 min · Nota mínima 80%
- Laboratorio prácticoLaboratorio — Localizable, el selector Language y un editor reconstruido · 45 min
Objetivo: Localiza el editor de clientes de GlobalDesk desde el diseñador de Visual Studio. Termina primero el diseño neutro en inglés del control de usuario CustomerEditor, después pon Localizable en true y usa el selector Language del diseñador para añadir una variante en alemán, cambiando solo lo que debe diferir: las etiquetas, el ancho de los dos botones más largos y la Location de una etiqueta. Ejecuta la aplicación con de-DE y compara la salida real del navegador con la vista del diseñador; después añade un botón Recreate editor que haga Dispose del control y lo reconstruya, para que compruebes por ti mismo por qué los recursos del diseñador no siguen un cambio de cultura en tiempo de ejecución. Termina con una nota de laboratorio que enumere las propiedades que has sobrescrito y las que has dejado deliberadamente al diseño neutro. Entregables: Control de usuario CustomerEditor con Localizable en true sobre un diseño neutro en inglés completo; Variante de idioma alemán en el diseñador que sobrescribe las etiquetas y al menos un Size y una Location; Anchoring, docking o AutoSize aplicados para que las etiquetas en alemán no puedan recortarse; Botón Recreate editor que hace Dispose del contenedor y lo reconstruye tras un cambio de cultura; Nota de laboratorio con las propiedades sobrescritas y las que se han dejado al diseño neutro.
Módulo 3: Recursos de la aplicación, ResourceManager y el texto de sistema de Wisej
Módulo 3 de Localización en Wisej.NET — crea aplicaciones multilingües con recursos .resx, formato según la cultura, cambio de idioma en tiempo de ejecución y diseños de derecha a izquierda. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre los recursos compartidos, supera la evaluación de conocimientos y después completa el laboratorio práctico en GlobalDesk.
- LecturaGuía de la lección · 14 min
La capa de recursos compartidos: archivos .resx neutros y específicos de cultura que llevan claves idénticas, la búsqueda de Wisej.Resources.ResourceManager por nombre base y ensamblado, marcadores de posición formateados con string.Format y la cultura activa, servicios que devuelven claves en lugar de frases en inglés, y Resources-[LANG].resx para las etiquetas de sistema de Wisej. Qué significa esto para un desarrollador que conoce los fundamentos de C# y los controles de Wisej.NET y ahora tiene que publicar la aplicación en más de un idioma, y cómo leer este módulo.
- LecturaGuía del laboratorio / examen · 10 min
Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.
- Lección en vídeoUna clave, dos archivos de recursos y las etiquetas propias de Wisej · 14 min
Una clave, dos archivos de recursos y las etiquetas propias de Wisej: un recorrido guiado del Módulo 3, construido paso a paso en GlobalDesk. Se ejecuta aquí mismo, en el reproductor.
Transcripción de la narración
Localización en Wisej.NET, módulo tres: la capa de recursos compartida. Este es el texto que no pertenece a ningún control diseñado, junto con las etiquetas que Wisej.NET dibuja para sí mismo, dentro de GlobalDesk.
El módulo dos tradujo los rótulos de la pantalla. La confirmación de guardado, los mensajes de validación, la línea de estado y el resultado que devuelve un servicio siguen siendo literales en inglés metidos en el código, y la localización del diseñador no llega a ninguno de ellos, porque no hay ningún control que los posea.
El archivo de recursos neutro contiene todas las claves. El archivo alemán vive a su lado con exactamente las mismas claves y solo los valores traducidos. Una búsqueda recorre desde la cultura más específica hasta el archivo de solo idioma y luego el neutro, y toma la primera coincidencia que encuentra, que es lo que hace segura una traducción parcial.
Un único ResourceManager, construido a partir del nombre base y el ensamblado, está detrás de un pequeño ayudante que devuelve la clave entre corchetes en lugar de una cadena vacía cuando falta un valor.
Mantén cada frase entera. Guarda la frase completa con un marcador de posición y después formatéala para la cultura actual, en vez de concatenar fragmentos traducidos en el código.
Tres capas, tres dueños. Los recursos del diseñador llevan el texto propio de una pantalla. El archivo de cadenas compartido lleva el texto de producto que se usa en cualquier sitio. Y un archivo de recursos aparte anula las etiquetas que suministra el propio Wisej.NET, como los botones de un diálogo estándar.
El servicio de guardado devuelve una clave en lugar de una frase en inglés, y el editor es el único sitio que convierte un resultado en palabras. La línea de log se queda en un solo idioma a propósito, porque a un desarrollador que lee un log a las tres de la madrugada no le ayuda un mensaje traducido.
Ejecútalo en inglés, después en alemán, y abre luego un cuadro de mensaje cuyo botón de confirmación viene de tu anulación de etiqueta de sistema y no del valor por omisión del framework. Borra una clave del archivo alemán y la búsqueda recurre al valor neutro en lugar de mostrar un hueco en blanco.
Lo que entregas es el archivo alemán con claves idénticas, una frase formateada a partir de un marcador de posición, un servicio que devuelve una clave en lugar de prosa, una etiqueta de sistema de Wisej anulada y la nota que explica los tres tipos de texto.
Laboratorio tres: añade el archivo de cadenas en alemán, formatea la frase con marcador de posición para la cultura activa, devuelve una clave de resultado desde el servicio de guardado y anula una etiqueta de sistema.
- LecturaEjercicio de programación con IA · 20 min
Construye el ejemplo GlobalDesk de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.
- CuestionarioEvaluación de conocimientos — Módulo 3 · 10 min · Nota mínima 80%
- Laboratorio prácticoLaboratorio — Strings.de.resx, marcadores de posición y una etiqueta de sistema · 45 min
Objetivo: Amplía los recursos compartidos de GlobalDesk. Añade Strings.de.resx junto a Resources/Strings.resx con exactamente las mismas claves y los valores traducidos, añade una entrada Customer.LastOrder que contenga dos marcadores de posición, y compón la frase con string.Format y Application.CurrentCulture en lugar de concatenar fragmentos. Haz pasar por el helper Texts todos los mensajes que muestra el editor de clientes, incluidas la confirmación de guardado y los dos mensajes de validación, y haz que el servicio de guardado devuelva una clave de resultado estable como CustomerEditor.Saved en lugar de una frase en inglés que la interfaz imprime directamente. Después añade un archivo Resources-de.resx que sobrescriba una etiqueta de sistema de Wisej, demuéstralo en un MessageBox y escribe una nota breve sobre la diferencia entre el texto de tu producto y el texto de sistema de Wisej. Entregables: Strings.de.resx con las mismas claves que el archivo neutro y solo los valores traducidos; Recurso Customer.LastOrder compuesto con string.Format y la cultura activa, nunca concatenado; Servicio de guardado que devuelve una clave de recurso o un código de resultado en lugar de una frase en inglés; Resources-de.resx que sobrescribe al menos una etiqueta de sistema de Wisej, mostrada en un MessageBox; Nota de laboratorio que separa el texto del producto, el texto de sistema de Wisej y el texto de diagnóstico.
Módulo 4: Cultura del navegador, cultura de sesión y cambio de idioma en tiempo de ejecución
Módulo 4 de Localización en Wisej.NET — crea aplicaciones multilingües con recursos .resx, formato según la cultura, cambio de idioma en tiempo de ejecución y diseños de derecha a izquierda. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre la cultura en tiempo de ejecución, supera la evaluación de conocimientos y después completa el laboratorio práctico en GlobalDesk.
- LecturaGuía de la lección · 14 min
De dónde procede la cultura de una sesión y qué tiene que ocurrir cuando cambia: el ajuste culture de Default.json, la detección automática del navegador, el parámetro de URL lang, Application.CurrentCulture como estado por sesión, el evento Application.CultureChanged y la reaplicación del texto respaldado por recursos para que ninguna pantalla a medio traducir sobreviva al cambio. Qué significa esto para un desarrollador que conoce los fundamentos de C# y los controles de Wisej.NET y ahora tiene que publicar la aplicación en más de un idioma, y cómo leer este módulo.
- LecturaGuía del laboratorio / examen · 10 min
Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.
- Lección en vídeoDetéctala, cámbiala y después repinta lo que el cambio dejó atrás · 14 min
Detéctala, cámbiala y después repinta lo que el cambio dejó atrás: un recorrido guiado del Módulo 4, construido paso a paso en GlobalDesk. Se ejecuta aquí mismo, en el reproductor.
Transcripción de la narración
Módulo cuatro. GlobalDesk ya tiene recursos en alemán, una variante de diseñador en alemán y una etiqueta de sistema en alemán. Para lo que todavía no tiene respuesta es para en qué idioma debe ejecutarse esta sesión concreta.
La cultura de una sesión puede venir de la preferencia del propio navegador, de un valor fijo en la configuración de la aplicación, de un parámetro en la dirección o de un selector que maneja el usuario. Gane el que gane, decídelo una sola vez al empezar la sesión, en lugar de volver a deducirlo en cada pantalla.
La propiedad de cultura actual es la cultura de la sesión actual. Un campo estático que guardara una cultura sería en cambio la cultura de todo el proceso del servidor, y por tanto la de cualquier otro usuario conectado a él, que es el error más caro de todo este tema.
Poner la cultura en automático hace que cada sesión arranque desde la preferencia del navegador. Poner un nombre fijo la ancla a una sola configuración regional, que es lo correcto para una prueba o para un producto que se vende en un único mercado. El selector asigna una cultura obtenida por su nombre.
Suscríbete una sola vez al evento de cambio de cultura y deja que un único manejador haga todo el trabajo de reparación. Vuelve a aplicar los rótulos que salen de los recursos, reformatea la fecha, el número y el importe, y reconstruye el editor localizado en el diseñador, de modo que todos los tipos de texto acaben siendo coherentes.
Cuatro tipos de texto, cuatro destinos distintos. Los controles creados después del cambio lo siguen por su cuenta. Los rótulos que ya están en pantalla hay que volver a aplicarlos. Los valores formateados hay que recalcularlos. Y las pantallas localizadas en el diseñador hay que recrearlas, porque sus recursos se leyeron cuando se construyeron.
Se elige el alemán, y el título, la navegación y las tres vistas previas formateadas cambian. El editor se queda en inglés hasta que se ejecuta la llamada de recreación. Ese hueco, entre las partes que siguen el cambio de inmediato y las que no, es el defecto que este módulo existe para evitar.
Un parámetro de idioma en la dirección abre una sesión en alemán mientras el siguiente navegador se queda en inglés. Dos culturas vivas en un mismo proceso al mismo tiempo es exactamente el comportamiento que un campo de cultura estático destruiría para las dos.
Laboratorio cuatro: pon la cultura en automático, añade el selector de idioma, escribe el manejador de cambio de cultura que vuelve a aplicar los rótulos y reformatea los valores, y recrea el editor.
- LecturaEjercicio de programación con IA · 20 min
Construye el ejemplo GlobalDesk de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.
- CuestionarioEvaluación de conocimientos — Módulo 4 · 10 min · Nota mínima 80%
- Laboratorio prácticoLaboratorio — Detección automática, un selector de idioma y CultureChanged · 45 min
Objetivo: Dale a GlobalDesk un cambio de idioma que termine el trabajo. Pon culture en auto en Default.json para que la sesión arranque con el idioma del navegador, añade un ComboBox de idioma que ofrezca inglés, alemán y una cultura de idioma y región, y establece Application.CurrentCulture con CultureInfo.GetCultureInfo en su manejador SelectedIndexChanged sin guardar nunca la elección en un campo estático. Gestiona Application.CultureChanged para llamar a un método ApplyTextResources que actualice todas las etiquetas respaldadas por recursos y a un método UpdateCulturePreview que vuelva a formatear los ejemplos de fecha, número y moneda, y recrea en ese mismo manejador el editor de clientes localizado en el diseñador. Verifica la misma página con el parámetro de URL lang y después escribe una nota de laboratorio que describa qué le haría un campo de cultura estático a un segundo usuario conectado al mismo tiempo. Entregables: Default.json con culture en auto, más una nota sobre cuándo una cultura fija es la opción correcta; Manejador del ComboBox de idioma que establece Application.CurrentCulture con CultureInfo.GetCultureInfo; Manejador de Application.CultureChanged que llama a ApplyTextResources y UpdateCulturePreview; Editor localizado en el diseñador recreado tras el cambio para que ninguna etiqueta se quede en el idioma anterior; Verificación con el parámetro de URL lang y una nota sobre por qué la cultura no debe vivir en un campo estático.
Módulo 5: Idiomas de derecha a izquierda y diseños a prueba de localización
Módulo 5 de Localización en Wisej.NET — crea aplicaciones multilingües con recursos .resx, formato según la cultura, cambio de idioma en tiempo de ejecución y diseños de derecha a izquierda. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre los idiomas de derecha a izquierda, supera la evaluación de conocimientos y después completa el laboratorio práctico en GlobalDesk.
- LecturaGuía de la lección · 14 min
El soporte de derecha a izquierda en Wisej.NET: RightToLeft con Inherit, No y Yes, RightToLeftLayout reflejando los hijos de un contenedor, el ajuste de aplicación rightToLeft, diseños que sobreviven a la expansión del texto, el estado rightToLeft del tema y los límites documentados en DataGridView, ListView y PropertyGrid. Qué significa esto para un desarrollador que conoce los fundamentos de C# y los controles de Wisej.NET y ahora tiene que publicar la aplicación en más de un idioma, y cómo leer este módulo.
- LecturaGuía del laboratorio / examen · 10 min
Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.
- Lección en vídeoRefleja el diseño, no solo el texto · 14 min
Refleja el diseño, no solo el texto: un recorrido guiado del Módulo 5, construido paso a paso en GlobalDesk. Se ejecuta aquí mismo, en el reproductor.
Transcripción de la narración
Localización en Wisej.NET, módulo cinco. GlobalDesk ya habla árabe. Este módulo trata de conseguir que además se lea como el árabe, que es un problema de diseño y no de traducción.
El módulo cuatro terminó con las palabras. Una sesión en árabe todavía empieza por el borde equivocado de la pantalla, así que la mirada aterriza en lo último en vez de en lo primero. Y los rótulos alemanes ya se recortan dentro de un panel que se midió contra el inglés.
Dos propiedades con dos trabajos distintos. La propiedad RightToLeft cambia la dirección dentro de un control, y así es como se voltean el texto y su alineación. La propiedad RightToLeftLayout refleja los hijos directos de un contenedor, y así es como se voltea la disposición en sí.
Un único ajuste decide por toda la aplicación. Configurar la dirección como automática la deriva de la cultura de la sesión, así que ninguna pantalla necesita comprobar por su cuenta un nombre de cultura. Una comprobación así en una pantalla es una comprobación que alguien se olvidará de añadir en la siguiente.
El reflejo solo se ve bien si el diseño puede moverse. El acoplamiento, el anclaje, el autoajuste, un diseño de contenedor y unos tamaños mínimos sensatos sustituyen a las posiciones fijas en píxeles. Y una excepción deliberada de izquierda a derecha mantiene legible algo como un código de cliente, porque un identificador no es prosa.
Después, pruébalo en serio: un texto corto, una traducción bastante más larga, una ventana estrecha, una cultura de derecha a izquierda y contenido mixto, como una etiqueta en árabe junto a un código de producto en alfabeto latino. Cada uno de esos casos rompe una suposición distinta.
En el navegador, el selector elige el árabe, la dirección de la aplicación sigue a la cultura de la sesión y una única propiedad de contenedor refleja el panel. Aquí no hay estado global: la dirección, igual que la cultura, pertenece solo a esta sesión.
La pasada pseudolocalizada deja al descubierto lo que el inglés escondía, y el diseño reconstruido deja de recortar. La cuadrícula de contactos se comprueba y su comportamiento se documenta en lugar de darse por hecho, porque una cuadrícula tiene sus propias reglas de columnas y de alineación que verificar.
Laboratorio cinco: añade el árabe con dirección automática, refleja las dos pantallas con sus hijos heredando, añade una excepción comentada de izquierda a derecha, haz el diseño a prueba de recortes y escribe la lista de cinco casos de prueba.
- LecturaEjercicio de programación con IA · 20 min
Construye el ejemplo GlobalDesk de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.
- CuestionarioEvaluación de conocimientos — Módulo 5 · 10 min · Nota mínima 80%
- Laboratorio prácticoLaboratorio — RightToLeftLayout, reflejo y un diseño a prueba de recortes · 45 min
Objetivo: Haz que GlobalDesk sobreviva a una cultura de derecha a izquierda. Añade el árabe al selector de idioma y pon rightToLeft en auto en Default.json, deja los controles hijos en RightToLeft.Inherit y activa RightToLeftLayout en el dashboard y en el editor de clientes para que sus hijos se reflejen. Mantén exactamente un control de izquierda a derecha, el campo del código de cliente, y explica en un comentario por qué ese identificador no debe invertirse. Reconstruye con docking, anchoring y un contenedor de diseño la parte del diseño con posiciones fijas para que una traducción larga no pueda recortarse, añade un archivo de recursos seudolocalizado cuyos valores estén alargados y entre corchetes, y anota lo que hace realmente la cuadrícula DataGridView de contactos bajo RTL en lugar de dar por supuesto que se refleja. Termina con una lista de cinco casos de prueba de diseño que puedas repetir en cualquier pantalla. Entregables: Entrada de árabe en el selector de idioma con rightToLeft en auto en Default.json; Dashboard y editor de clientes usando RightToLeftLayout con sus hijos en Inherit; Un control deliberadamente de izquierda a derecha con un comentario que explique la excepción; Diseño reconstruido con docking, anchoring y un contenedor de diseño para que las traducciones largas no puedan recortarse; Lista de pruebas RTL que cubra texto corto, texto largo, una ventana estrecha, una cultura RTL y la limitación del DataGridView.
Módulo 6: Flujo de trabajo de traducción: ResX Resource Manager y otras herramientas
Módulo 6 de Localización en Wisej.NET — crea aplicaciones multilingües con recursos .resx, formato según la cultura, cambio de idioma en tiempo de ejecución y diseños de derecha a izquierda. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre el flujo de trabajo de traducción, supera la evaluación de conocimientos y después completa el laboratorio práctico en GlobalDesk.
- LecturaGuía de la lección · 14 min
Tratar las traducciones como trabajo de equipo: la matriz de ResX Resource Manager sobre todos los .resx de la solución, añadir una columna de idioma y filtrar las entradas sin traducir, comentarios de recurso que dan contexto a los traductores, cadenas invariantes, la traducción automática solo como borrador, la exportación e importación con una plataforma compatible con RESX, y revisar los diffs de recursos como si fueran código. Qué significa esto para un desarrollador que conoce los fundamentos de C# y los controles de Wisej.NET y ahora tiene que publicar la aplicación en más de un idioma, y cómo leer este módulo.
- LecturaGuía del laboratorio / examen · 10 min
Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.
- Lección en vídeoUna cuadrícula con cada clave, cada idioma y cada hueco · 14 min
Una cuadrícula con cada clave, cada idioma y cada hueco: un recorrido guiado del Módulo 6, construido paso a paso en GlobalDesk. Se ejecuta aquí mismo, en el reproductor.
Transcripción de la narración
Módulo seis. GlobalDesk ya tiene cuatro archivos de recursos. Añadir el italiano con dos pestañas del editor significa comparar listas de claves a ojo, y la persona que habla italiano no puede abrir la solución.
Tres cosas se rompen en este punto: comparar archivos a ojo, responder cuánta traducción queda, y entregarle las cadenas a alguien que nunca ha abierto un archivo de recursos y que no debería tener que hacerlo.
Una herramienta de gestión de recursos pone las claves en las filas y cada idioma en las columnas, así que un hueco es una celda en blanco y no algo de lo que tengas que darte cuenta. Wisej.NET guarda su texto en archivos de recursos estándar de .NET, así que no hace falta ningún soporte especial.
Lo que la herramienta escribe es un archivo de recursos italiano corriente: exactamente las claves del archivo neutro, los valores traducidos, un comentario en las que resultaron ambiguas y una entrada dejada vacía a propósito para poder demostrar el respaldo.
La ronda en sí tiene una forma. Añade el idioma, filtra para ver solo las entradas sin traducir, redacta los valores, marca el nombre de producto como invariante para que nadie lo traduzca, y después revisa. En esta ronda la revisión se gana su sitio: el borrador había intercambiado dos marcadores de posición.
La traducción automática produce un borrador, no un resultado. Revisa la terminología, los marcadores de posición, la puntuación, los aceleradores de teclado y los nombres de producto, y lee la diferencia en el control de versiones antes de confirmar la ronda, igual que con cualquier otro cambio en la aplicación.
Fíate del filtro, pero después demuéstralo de forma independiente. Sáltate las claves invariantes, compara cada búsqueda italiana con el valor neutro y lista todas las claves que siguen recurriendo al inglés, en lugar de dar por hecho que la columna está completa.
Ejecutando en italiano, los rótulos vienen del archivo de recursos traducido, mientras que la fecha, la cantidad y el importe se formatean para la cultura activa en el momento en que se muestran. Son dos mecanismos separados haciendo dos trabajos separados.
Un desarrollador y dos idiomas pueden vivir dentro del editor. Un equipo con varios idiomas quiere la herramienta de gestión de recursos. Y los traductores que no son desarrolladores necesitan una ronda de exportación e importación, o un servicio de gestión de traducciones.
Laboratorio seis: completa una columna italiana sin ninguna clave sin traducir, comenta tres claves ambiguas, marca las invariantes, revisa la diferencia del archivo de recursos y escribe la nota del flujo de trabajo.
- LecturaEjercicio de programación con IA · 20 min
Construye el ejemplo GlobalDesk de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.
- CuestionarioEvaluación de conocimientos — Módulo 6 · 10 min · Nota mínima 80%
- Laboratorio prácticoLaboratorio — Una columna de idioma, comentarios y un diff revisado · 45 min
Objetivo: Ejecuta una ronda de traducción honesta sobre GlobalDesk. Abre la solución en ResX Resource Manager, añade el italiano como nueva columna de idioma y usa el filtro de entradas sin traducir para listar todas las claves que aún no tienen valor. Añade comentarios a las tres claves cuyo significado es ambiguo fuera de contexto, empezando por la etiqueta de una sola palabra Open; después traduce o genera un borrador automático de los valores en italiano y marca como invariantes el nombre del producto y los dos identificadores técnicos para que nadie los traduzca. Exporta las columnas neutra e italiana, vuelve a importarlas y revisa el diff resultante del .resx antes de confirmarlo como un único cambio revisable. Termina con una nota de una página sobre el flujo de trabajo que compare el editor de Visual Studio, ResX Resource Manager y una plataforma en la nube para un equipo cuyos traductores no son desarrolladores. Entregables: Strings.it.resx producido con ResX Resource Manager sin ninguna clave sin traducir; Comentarios de recurso en al menos tres claves ambiguas para que el traductor tenga el contexto; Marcas de invariante en el nombre del producto y en los identificadores que no deben traducirse; Exportación, reimportación y un diff del .resx revisado y confirmado como un único cambio; Nota de flujo de trabajo que compara el editor de Visual Studio, ResX Resource Manager y un TMS en la nube.
Módulo 7: Arquitectura de localización en producción, pruebas y proyecto final
Módulo 7 de Localización en Wisej.NET — crea aplicaciones multilingües con recursos .resx, formato según la cultura, cambio de idioma en tiempo de ejecución y diseños de derecha a izquierda. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre el LocalizationService del proyecto final, supera la evaluación de conocimientos y después completa el laboratorio práctico en GlobalDesk.
- LecturaGuía de la lección · 14 min
Localización que sobrevive a producción: un LocalizationService ligero sobre ResourceManager, código de dominio que devuelve valores en lugar de frases, una política observable para las claves ausentes, una matriz de pruebas de localización, la seudolocalización que saca a la luz las cadenas escritas en el código, el despliegue de ensamblados satélite y el proyecto final de GlobalDesk. Qué significa esto para un desarrollador que conoce los fundamentos de C# y los controles de Wisej.NET y ahora tiene que publicar la aplicación en más de un idioma, y cómo leer este módulo.
- LecturaGuía del laboratorio / examen · 10 min
Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.
- Lección en vídeoUn servicio, una matriz de pruebas y un proyecto final terminado · 14 min
Un servicio, una matriz de pruebas y un proyecto final terminado: un recorrido guiado del Módulo 7, construido paso a paso en GlobalDesk. Se ejecuta aquí mismo, en el reproductor.
Transcripción de la narración
Localización en Wisej.NET, módulo siete: el proyecto final. GlobalDesk ya habla dos idiomas. Lo que pregunta producción es algo distinto: si además se comporta de forma predecible mientras lo hace.
Cuatro preguntas que la aplicación tiene que responder igual siempre. De dónde viene una cadena determinada. Qué cultura está activa ahora mismo. Qué pasa cuando falta una clave. Y qué le hace un cambio de idioma a las pantallas que ya están abiertas.
Separa primero el texto por dueño. Tus propias cadenas de producto. Las etiquetas de sistema que suministra Wisej.NET, anuladas en su propio archivo de recursos. Y el texto de diagnóstico, que se queda en un solo idioma para los desarrolladores, porque un log lo lee el equipo y no el cliente.
Un servicio de localización centraliza esas decisiones sin reemplazar nada de lo que .NET ya hace. Un único ResourceManager. Una búsqueda que devuelve la clave entre corchetes en lugar de nada. Y un formateo que lee la cultura actual en cada llamada, en vez de capturarla una vez y quedársela.
Después, saca el idioma de la pantalla y del modelo. Mantén la fecha como fecha y el importe como decimal, devuelve un estado como valor de enumeración y no como palabra traducida, y deja que el servicio convierta todo eso en el rótulo que el usuario acaba leyendo.
Probar aquí es una matriz escrita, no un vistazo a una pantalla. Neutra, traducida, una región que recurre a su idioma, una clave que falta, valores formateados, un cambio en tiempo de ejecución, cadenas deliberadamente largas, derecha a izquierda, y las propias etiquetas de sistema del framework.
La pasada pseudolocalizada alarga cada valor y lo envuelve entre corchetes. Todo lo que siga apareciendo en inglés normal nunca llegó a un archivo de recursos, y todo lo que se recorte bajo el texto más largo se recortará también en alemán. Los dos hallazgos salen gratis de la misma ejecución.
La demostración son cuatro pruebas: rótulos en alemán junto a valores formateados por la cultura, un diálogo de sistema de Wisej en el mismo idioma, una clave que falta que recurre visiblemente a mostrarse como su propia clave, y por último el diseño reflejado de derecha a izquierda.
Laboratorio siete: construye el servicio de localización, devuelve valores en vez de palabras desde el dominio, produce el conjunto pseudolocalizado, completa la matriz de pruebas y publica conservando las carpetas de cultura.
- LecturaEjercicio de programación con IA · 20 min
Construye el ejemplo GlobalDesk de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.
- CuestionarioEvaluación de conocimientos — Módulo 7 · 10 min · Nota mínima 80%
- Laboratorio prácticoLaboratorio — Proyecto final: LocalizationService y la matriz de QA · 45 min
Objetivo: Termina el proyecto final de GlobalDesk. Envuelve toda búsqueda de recursos en un LocalizationService con métodos Text, Date, Number y Currency, dale una política de claves ausentes que muestre la clave entre corchetes en desarrollo y la registre en producción, y haz que ese servicio sea el único sitio donde la interfaz toca ResourceManager. Mantén el dominio al margen: el modelo del ticket expone un valor TicketStatus y la interfaz lo asigna a una etiqueta localizada. Después ejecuta la matriz de pruebas de localización sobre la aplicación terminada, cubriendo la cultura neutra, el alemán, una cultura de idioma y región que se repliega, una clave ausente a propósito, fechas e importes formateados, un cambio en tiempo de ejecución, una pasada con cadenas largas y la cultura RTL, usando un conjunto de recursos seudolocalizado para sacar a la luz todo lo que siga escrito en el código. Confirma que las carpetas de cultura sobreviven a una publicación y entrega la lista de comprobación de QA como entregable del proyecto final. Entregables: LocalizationService con métodos Text, Date, Number y Currency y una política documentada para las claves ausentes; Código de dominio que devuelve un valor TicketStatus que la interfaz asigna a una etiqueta localizada; Conjunto de recursos seudolocalizado usado para encontrar todas las cadenas que sigan escritas en el código; Matriz de pruebas de localización completada, que cubre el repliegue, el formato, el cambio en tiempo de ejecución y RTL; Salida publicada comprobada en busca de sus carpetas de cultura, más la lista de comprobación de QA de localización de GlobalDesk.