En los últimos años, Angular ha introducido una serie de mejoras en la forma en que los desarrolladores construyen y gestionan aplicaciones web, especialmente con la incorporación de Ivy. Estas mejoras, combinadas con nuevas características en la compilación y el uso de herramientas, permiten optimizar el rendimiento y aumentar la productividad del desarrollador. En este capítulo se explorarán algunas de estas innovaciones, tales como la vinculación de estilos predecible, la herencia de metadatos entre componentes y directivas, y la configuración avanzada de la compilación.
Una de las actualizaciones más significativas introducidas por Angular Ivy es la capacidad de predecir cómo se aplican las vinculaciones de estilos en una aplicación. Angular permite a los desarrolladores vincular estilos y clases a los elementos del DOM de diversas maneras, pero con Ivy, se establece un conjunto de reglas de precedencia que asegura que los estilos se apliquen de manera consistente, independientemente del orden en que se declaren en el código. Esta nueva capacidad hace que la gestión de estilos en componentes y directivas sea mucho más predecible y fácil de manejar.
Por ejemplo, en un componente con múltiples fuentes de estilos, como en el caso de la vinculación de propiedades de estilo, los valores con mayor prioridad se aplicarán primero. Esto permite que los desarrolladores creen interfaces de usuario (UI) más complejas sin tener que preocuparse por las inconsistencias en el orden de aplicación de los estilos. Sin embargo, la directiva NgClass y NgStyle tienen una prioridad aún mayor, y sus valores anularán cualquier otra vinculación de estilo. Así, los desarrolladores pueden trabajar con confianza, sabiendo que las reglas de precedencia siempre se aplicarán de la misma manera.
Otro aspecto clave que mejora la productividad es la posibilidad de compartir metadatos entre directivas y componentes a través de la herencia. Esta funcionalidad permite reducir el tamaño de los paquetes y mejorar la velocidad de compilación, lo que resulta en aplicaciones más rápidas y eficientes. En versiones anteriores de Angular, los desarrolladores debían duplicar metadatos como entradas (@Input), salidas (@Output), y otros atributos en cada componente o directiva que quisiera compartir comportamiento. Con la herencia de metadatos en Ivy, un componente o directiva puede heredar estos atributos de un componente base, lo que evita la duplicación de código y facilita la gestión de la lógica común.
Por ejemplo, un componente base podría manejar la lógica de búsqueda y permitir que otros componentes la hereden. Si se crea un componente de búsqueda con una lógica específica, este puede heredar las propiedades de entrada y salida del componente base sin necesidad de duplicar el código. Además, las propiedades de metadatos como @Input y @Output pueden fusionarse si se declaran tanto en la clase base como en la clase hija, lo que agrega flexibilidad y simplicidad al proceso de desarrollo.
Aunque la herencia de metadatos permite compartir la lógica, los estilos y las plantillas no se heredan directamente. Esto se debe a que Angular considera que la herencia de plantillas y estilos en los componentes podría causar conflictos en el diseño y la estructura de la interfaz de usuario. Sin embargo, los desarrolladores aún pueden hacer referencia a styleUrls y templateUrl en los componentes hijos, permitiendo así reutilizar estilos y plantillas base sin perder la flexibilidad de personalizar cada componente.
Además de estos avances, el uso de compilación AOT (Ahead-of-Time) y el modo estricto también contribuyen significativamente a la mejora del rendimiento. La compilación AOT genera paquetes más pequeños y rápidos al compilar la aplicación antes de la ejecución, lo que se traduce en tiempos de carga más rápidos y una mejor experiencia para el usuario final. El modo estricto de TypeScript también ayuda a detectar errores durante el desarrollo, reduciendo así los problemas en tiempo de ejecución.
Para implementar estas mejoras y aprovechar al máximo las nuevas características de Angular, es necesario contar con las versiones adecuadas de Angular e incluso TypeScript. La versión 12 de Angular Ivy y TypeScript 4.2 son requisitos mínimos para utilizar las funcionalidades descritas en este capítulo. Además, es fundamental contar con una correcta configuración y comprensión de las herramientas de desarrollo para optimizar el flujo de trabajo.
La adopción de estas técnicas y herramientas no solo mejora la eficiencia de la aplicación, sino también la experiencia del desarrollador. Angular ha mejorado significativamente su ecosistema de pruebas, lo que permite realizar pruebas más efectivas y confiables. La integración de nuevas configuraciones y herramientas facilita un desarrollo más ágil y menos propenso a errores, lo que permite a los desarrolladores centrarse en la lógica de negocio y la experiencia del usuario en lugar de preocuparse por problemas de rendimiento o errores complicados.
La herencia de metadatos y las vinculaciones de estilo predecibles, junto con la optimización de la compilación y la mejora en las herramientas de desarrollo, forman un conjunto poderoso de características que ayudan a los desarrolladores a aumentar su productividad. Al adoptar estas mejoras, los equipos de desarrollo pueden centrarse en lo que realmente importa: construir aplicaciones robustas y de alto rendimiento, sin comprometer la calidad del código ni la experiencia del usuario.
¿Cómo la compilación AOT y la herencia de componentes mejoran el rendimiento en Angular?
El componente de búsqueda base en Angular proporciona una estructura flexible para desarrollar aplicaciones dinámicas. Este componente actúa como un contenedor de propiedades y métodos esenciales, y puede ser extendido a través de la herencia por otros componentes que necesiten una funcionalidad similar, como en el caso del componente de búsqueda sugerida. Al utilizar este enfoque, los desarrolladores pueden reutilizar código y modificar solo lo necesario, sin tener que reescribir funcionalidades ya implementadas.
Por ejemplo, en el caso del componente SuggestedSearchComponent, este hereda las propiedades y métodos del componente base BaseSearchComponent. En su implementación, además de la propiedad placeholder heredada, se agrega una nueva propiedad llamada suggestions, que contiene una lista de sugerencias para la búsqueda. En el HTML, el componente recorre esta lista de sugerencias y las muestra dentro de un contenedor HTML, lo que mejora la experiencia del usuario al ofrecerle opciones de búsqueda de forma dinámica y rápida.
Uno de los puntos clave de esta estructura es la forma en que se manejan los eventos y las propiedades. El componente de búsqueda sugerida no solo hereda el evento onSearch de su componente base, sino que también lo reutiliza dentro de su propio contexto. Este tipo de reutilización de código es posible gracias a la herencia de clases en la programación orientada a objetos (OOP), un concepto fundamental en el desarrollo de software moderno. Angular, a través de su sistema de metadatos, facilita la implementación de esta herencia, permitiendo que los componentes y directivas se vinculen a la interfaz de usuario y a los eventos del DOM sin necesidad de duplicar lógica.
Además, la introducción de Ivy y la compilación AOT (Ahead-of-Time) en Angular ha transformado significativamente el proceso de construcción de aplicaciones. Ivy no solo mejora el rendimiento de las aplicaciones al optimizar el tamaño de los paquetes generados, sino que también mejora la eficiencia al hacer que solo se incluyan las partes del marco de Angular que realmente se utilizan en la aplicación. Esto es especialmente importante en aplicaciones pequeñas o en escenarios como microfrontends o componentes web, donde se debe minimizar el sobrecosto del marco Angular.
El proceso de compilación AOT en Angular permite generar aplicaciones más rápidas y ligeras. A diferencia de la compilación JIT (Just-in-Time), que compila el código en tiempo de ejecución, AOT compila el código antes de la ejecución, lo que resulta en un rendimiento más rápido y una reducción del tamaño del paquete. A medida que se desarrollan aplicaciones más complejas, la necesidad de optimizar tanto el tamaño del paquete como los tiempos de compilación se vuelve más crítica. Ivy resuelve este desafío haciendo que las partes del marco Angular que no se usan sean eliminadas automáticamente, lo que se conoce como "tree shaking". Esto es esencial para aplicaciones grandes que necesitan una carga eficiente y un rendimiento óptimo.
Aunque la compilación AOT ha simplificado la generación de aplicaciones eficientes, también ha introducido ciertos retos, especialmente en lo que respecta a la compatibilidad con bibliotecas antiguas. Las versiones anteriores de Angular, como la versión 11, aún utilizaban el motor de vista (View Engine), que es más pesado y menos optimizado que el nuevo sistema Ivy. En estas versiones, las aplicaciones grandes podían generar paquetes más pequeños con JIT que con AOT. Sin embargo, con la adopción de Ivy a partir de la versión 12, se logra una mejora significativa en el tiempo de compilación y en el tamaño de los paquetes, al aplicar una estrategia de "localidad" en el código generado. Esta estrategia permite que el compilador solo se enfoque en la API pública de los componentes, sin tener que preocuparse por sus dependencias internas.
La transición de JIT a AOT también afecta el tiempo de construcción de la aplicación, especialmente cuando se trabaja con bibliotecas de terceros que no están completamente compiladas con Ivy. En estos casos, se utiliza el Angular Compatibility Compiler para traducir las bibliotecas a un formato compatible con Ivy, lo que puede aumentar el tiempo de compilación. Sin embargo, a largo plazo, el uso de Ivy y la compilación AOT ofrecen importantes beneficios en términos de velocidad de ejecución y eficiencia en la gestión del código.
Además de los cambios en la compilación, Angular también ha mejorado las herramientas de desarrollo a través de la introducción de configuraciones más estrictas. Desde la versión 12, el uso de la opción --strict al crear un nuevo proyecto Angular activa varias configuraciones de TypeScript que ayudan a detectar errores en tiempo de compilación. Estas opciones permiten una mayor consistencia en el código y reducen la posibilidad de errores en producción. Al habilitar opciones como noImplicitAny, strictNullChecks y strictPropertyInitialization, Angular asegura que el código sea más robusto y confiable, evitando posibles errores comunes que pueden ser difíciles de detectar.
El modo estricto en TypeScript también habilita una mayor seguridad en el manejo de tipos, lo que a su vez mejora la estabilidad y el rendimiento de la aplicación. Es importante tener en cuenta que, aunque habilitar el modo estricto aumenta la calidad del código, también puede generar una curva de aprendizaje más pronunciada, ya que obliga a los desarrolladores a ser más precisos con los tipos y las inicializaciones. Sin embargo, el esfuerzo adicional suele verse recompensado con aplicaciones más estables y menos propensas a fallos.
Para aprovechar al máximo Angular en su última versión, es recomendable familiarizarse con estas nuevas configuraciones y técnicas. Aunque la complejidad del framework ha aumentado, las mejoras en rendimiento, eficiencia y calidad de código son notables y beneficiosas para el desarrollo a largo plazo. A medida que Angular sigue evolucionando, estas herramientas seguirán desempeñando un papel crucial en la creación de aplicaciones modernas, eficientes y fáciles de mantener.
¿Cómo Angular Ivy mejora la productividad del desarrollador a través de herramientas y configuraciones?
Angular Ivy ha transformado la forma en que los desarrolladores interactúan con la plataforma Angular, ofreciendo mejoras significativas en productividad, gestión de errores y herramientas de desarrollo. A través de nuevas características y optimizaciones, Ivy permite un entorno más eficiente y predecible, lo cual se refleja en la calidad del código y en la experiencia general del desarrollo.
Uno de los avances más notables es el refuerzo en la verificación de tipos dentro de las plantillas de los componentes. Al combinar el chequeo estricto de tipos con las herramientas de Angular, Ivy ayuda a detectar errores en las etapas más tempranas del ciclo de desarrollo, lo que reduce considerablemente los problemas en producción. Esta característica es particularmente valiosa cuando se trabaja con componentes complejos, donde los errores pueden ser difíciles de rastrear y corregir. Con Ivy, la consistencia en la aplicación de las reglas de enlace de estilos es un ejemplo de cómo el orden de los enlaces de estilo deja de ser relevante, pero el tipo de enlace sí lo es, ya que sigue una jerarquía de prioridad definida. Esta mejora facilita la resolución predecible de los estilos múltiples, crucial para casos de uso más complejos.
Además, Ivy introduce mejoras en la experiencia de prueba. Las optimizaciones en el compilador AOT (Ahead of Time) permiten reducir la brecha entre el entorno de pruebas y el de producción, lo cual mejora la retroalimentación del desarrollador durante la implementación de pruebas. El manejo de errores también se ve mejorado, ya que los mensajes de error ahora incluyen más contexto, lo que facilita la comprensión de lo que salió mal y cómo corregirlo. Con las nuevas características de Angular, como los errores en URLs de plantillas y estilos, el resaltado de sintaxis y las sugerencias interactivas, los desarrolladores se sienten más respaldados en su trabajo, lo que aumenta la productividad general.
La gestión de dependencias también se ve potenciada con Ivy. El uso de decoradores para las clases base garantiza que los metadatos sean fácilmente compartibles a través de la herencia de una manera predecible. Esta mejora no solo facilita el mantenimiento del código, sino que también reduce el riesgo de errores relacionados con la configuración y el uso incorrecto de los componentes o directivas. La implementación de nuevas formas de configuración, como el inlineStyleLanguage, que permite la inclusión de preprocesadores de estilo como Sass, hace que el trabajo con estilos en Angular sea más flexible y adaptado a las necesidades modernas de desarrollo web.
El modo estricto de Angular y las nuevas configuraciones ofrecen un control aún mayor sobre el código y permiten detectar errores de forma temprana. Esta capacidad no solo mejora la estabilidad del código en producción, sino que también brinda a los desarrolladores una experiencia de desarrollo más fluida y confiable. Las herramientas de integración con IDE, como los errores de URL incorrectos para plantillas y estilos, son un ejemplo de cómo Ivy permite que el trabajo en un proyecto Angular sea más intuitivo y menos propenso a errores humanos. La integración mejorada con los entornos de desarrollo también proporciona un soporte más robusto para tareas como las migraciones automatizadas, lo que permite a los desarrolladores realizar cambios en el código sin perder control sobre el historial de versiones.
Además de la mejora en la verificación de tipos y el manejo de errores, Ivy también trae consigo una serie de características útiles para la personalización y adaptación del desarrollo. La introducción de las propiedades personalizadas de CSS (CSS Custom Properties), que son variables de CSS nativas que se pueden modificar en tiempo de ejecución, es otro ejemplo de cómo Ivy facilita la integración de características modernas en las aplicaciones Angular. A través de su interacción con el DOM (Modelo de Objetos del Documento), estas propiedades se pueden aplicar de forma dinámica y con un alcance limitado, lo que permite una personalización más precisa y controlada de los elementos de la interfaz de usuario.
Con estas optimizaciones, el proceso de desarrollo de Angular se vuelve más intuitivo, eficiente y alineado con las mejores prácticas actuales. La capacidad de cambiar dinámicamente las propiedades de estilo a través de estas variables, combinada con la estructura de inyección de dependencias de Angular, permite que los desarrolladores creen aplicaciones más modulares y personalizables. De igual manera, la introducción de nuevos ámbitos de proveedor, como los proveedores any y platform, permite gestionar la inyección de dependencias de manera aún más flexible, algo crucial para aplicaciones que requieren un comportamiento específico, como los microfrontends o los componentes web impulsados por Angular.
Además de estas mejoras, es importante considerar que Ivy también facilita la creación de aplicaciones más optimizadas al generar paquetes más pequeños durante la compilación. Gracias a la reescritura de varios componentes internos, Ivy puede realizar un "tree shaking" más eficiente, eliminando partes del marco que no se utilizan en la aplicación. Esta característica no solo mejora el rendimiento, sino que también reduce el tiempo de carga de las aplicaciones, lo que es esencial en un entorno donde la velocidad y la eficiencia son clave.
Por último, una de las ventajas más significativas que los desarrolladores pueden aprovechar con Angular Ivy es la mejora en la experiencia general de desarrollo. A través de una mayor predictibilidad en el comportamiento de los componentes, un mejor soporte en los entornos de prueba y un mayor control sobre los estilos y las dependencias, Ivy se posiciona como una herramienta fundamental para el desarrollo de aplicaciones modernas y escalables en Angular.
¿Cómo funcionan los scopes de proveedores en Angular y su impacto en la arquitectura de la aplicación?
En Angular, la gestión de dependencias es una de las características más poderosas del framework. Los proveedores permiten inyectar servicios dentro de los componentes, lo que facilita el manejo y la reutilización de lógica. Sin embargo, la complejidad puede aumentar cuando se emplean diferentes tipos de "scopes" para los proveedores, lo que determina el alcance o la vida útil de las instancias de los servicios. En este contexto, se presentan dos scopes importantes: el any provider scope y el platform provider scope.
El any provider scope es el primer tipo de alcance que vamos a explorar. Este scope define un límite alrededor de cada inyector de módulo, lo que significa que las instancias de las dependencias son creadas por cada módulo de aplicación y compartidas dentro de dicho módulo. El uso de este scope permite que diferentes partes de la aplicación gestionen su propio estado, configuraciones y dependencias sin interferir con el resto de la aplicación. A menudo se utiliza para gestionar dependencias como configuraciones, métricas, o servicios que dependen del estado de un módulo en particular. Un ejemplo claro es cuando tenemos dos módulos en Angular, como SharesModule y BankAccountsModule, que utilizan un servicio común, BackendService. Sin embargo, cada uno de estos módulos tiene su propia instancia del servicio, y la configuración del backend que se usa varía dependiendo del módulo que lo provea. De esta manera, el servicio no depende del contexto global de la aplicación, sino del módulo específico que lo inyecta, lo que garantiza la flexibilidad en el manejo de los datos.
Por otro lado, el platform provider scope es más sencillo conceptualmente, pero tiene un impacto significativo cuando se trata de compartir dependencias entre múltiples aplicaciones Angular que se encuentran en la misma página. Este scope permite crear un singleton que es compartido entre aplicaciones o componentes Angular diferentes que están siendo "bootstrapados" en el mismo contexto. Este patrón es muy útil en casos como los microfrontends o cuando se usan Angular Elements. Los microfrontends consisten en aplicaciones Angular independientes que funcionan en paralelo dentro de una página, mientras que Angular Elements permite convertir componentes Angular en elementos personalizados web. Ambos escenarios requieren compartir dependencias entre aplicaciones sin que cada una tenga que gestionar su propia instancia.
Cuando se utiliza el platform provider scope, por ejemplo, podemos compartir una API nativa, como la API de almacenamiento (localStorage), entre dos aplicaciones Angular diferentes en la misma página. Esto se logra mediante un token de inyección compartido, como se ilustra en el siguiente ejemplo:
Aquí, el storageToken representa la API de almacenamiento web, y se proporciona utilizando el platform provider scope. Esto significa que tanto las aplicaciones de documentos como las de música que están en la misma página compartirán la misma instancia de localStorage, evitando la duplicación de recursos y garantizando la coherencia entre ellas. En el código de servicio, se inyecta esta dependencia como cualquier otra, sin necesidad de configuraciones adicionales.
Lo importante al trabajar con estos scopes es comprender cómo se gestionan las instancias y cómo el alcance de un servicio puede afectar tanto al rendimiento como a la arquitectura general de la aplicación. Mientras que el any provider scope es útil para gestionar dependencias dentro de un módulo o una característica específica, el platform provider scope es indispensable cuando se desea compartir servicios entre varias aplicaciones o componentes que están funcionando de manera independiente pero en un mismo contexto.
En resumen, la elección entre el any provider scope y el platform provider scope depende del tipo de aplicación que estemos desarrollando y de cómo se desea gestionar el estado y las dependencias. Si estamos trabajando con una sola aplicación modular, el any provider scope es ideal. Si estamos desarrollando una arquitectura de microfrontends o trabajando con Angular Elements, el platform provider scope es la mejor opción.
Es fundamental que el desarrollador entienda no solo cómo inyectar servicios, sino también cómo se comportan esos servicios en relación con los scopes que se utilicen. La correcta aplicación de estos scopes puede evitar problemas de duplicación de instancias, optimizar el rendimiento y facilitar la reutilización de código. Además, el conocimiento de estos patrones es clave para desarrollar aplicaciones escalables y bien estructuradas, especialmente en contextos donde se manejan múltiples módulos o aplicaciones independientes.
¿Cómo las características modernas de TypeScript pueden transformar tu desarrollo en Angular?
Las versiones recientes de TypeScript y Angular han introducido varias características poderosas que mejoran tanto la legibilidad como la funcionalidad del código. Entre ellas se encuentran el operador de encadenamiento opcional (?.), el operador de fusión nula (??) y los miembros privados nativos de clase (#). Estos elementos no solo simplifican la escritura del código, sino que también lo hacen más robusto al reducir las probabilidades de errores comunes.
El operador de encadenamiento opcional, introducido en TypeScript 3.7, es una de las adiciones más significativas. Permite realizar accesos a propiedades y métodos de objetos que pueden no estar definidos, sin tener que recurrir a verificaciones condicionales repetitivas. Esto es especialmente útil en aplicaciones que manejan grandes estructuras de datos, como los documentos empresariales o la configuración dinámica de un sistema. Supongamos que estamos procesando una factura en formato JSON y necesitamos acceder a una propiedad de un objeto que puede o no estar presente, como el UBLVersionID de un documento. Sin el encadenamiento opcional, tendríamos que escribir una serie de comprobaciones para cada nivel de la estructura de datos. Con el operador ?., la misma lógica se reduce a una única expresión concisa, lo que hace que el código sea más fácil de mantener y menos propenso a errores.
Este operador no solo es útil para acceder a propiedades dentro de objetos complejos, sino también para acceder a elementos de arrays y para llamar a funciones de forma condicional. De esta manera, si una propiedad o función no existe, el valor devuelto será undefined en lugar de generar un error en tiempo de ejecución. Esto se logra con una sintaxis elegante y directa que mejora la comprensión y calidad del código.
Además del encadenamiento opcional, el operador de fusión nula (??) juega un papel crucial en situaciones donde necesitamos manejar valores nulos o indefinidos. Este operador permite proporcionar un valor predeterminado en caso de que una variable sea nula o indefinida, lo que mejora el manejo de errores y asegura que el código se ejecute de manera más predecible. Por ejemplo, si estamos trabajando con un valor que podría ser nulo o indefinido, en lugar de usar una compleja serie de operadores || para verificar múltiples condiciones, podemos utilizar ?? para simplificar la lógica y hacerla más clara.
Por otro lado, los miembros privados nativos de clase (#) añaden una capa de seguridad en el desarrollo de clases. Aunque las versiones anteriores de JavaScript permitían simular propiedades privadas mediante convenciones de nomenclatura, el uso del símbolo # permite definir verdaderas propiedades privadas dentro de las clases, lo que refuerza la encapsulación y la protección de datos sensibles en el código. Esta característica se integra perfectamente con la orientación a objetos, permitiendo un mayor control sobre la visibilidad de las propiedades y métodos.
Estos tres avances en el lenguaje, el encadenamiento opcional, la fusión nula y los miembros privados, representan solo algunas de las formas en que las versiones más recientes de TypeScript y Angular están modernizando el desarrollo de aplicaciones. Al integrar estas características, los desarrolladores pueden crear aplicaciones más seguras, eficientes y fáciles de mantener, lo que no solo mejora la calidad del software, sino también la experiencia del desarrollador al escribir el código.
Además de familiarizarse con estos operadores, es crucial que los desarrolladores comprendan cómo interactúan entre sí en escenarios comunes. Por ejemplo, el encadenamiento opcional y la fusión nula pueden trabajar juntos para ofrecer soluciones más elegantes y seguras. Un ejemplo sería el acceso a propiedades de un objeto que podría no estar definido en ciertas circunstancias, y proporcionar un valor predeterminado utilizando el operador de fusión nula en caso de que dicha propiedad sea null o undefined. Esta combinación de sintaxis puede simplificar notablemente el código sin sacrificar su seguridad o legibilidad.
Es importante también señalar que, aunque el encadenamiento opcional es una herramienta poderosa, su uso inapropiado puede generar resultados inesperados. Como con cualquier característica nueva, es vital evaluar cuidadosamente su aplicabilidad dentro de los diferentes contextos del código para evitar malentendidos o resultados erróneos en el procesamiento de datos. En particular, el uso de operadores como ?. puede llevar a que ciertas expresiones devuelvan undefined si no se manejan correctamente los valores null o undefined, lo que podría resultar en comportamientos inesperados si no se combinan correctamente con otros operadores.
Por último, al adoptar estas nuevas características del lenguaje, los desarrolladores deben tener en cuenta las versiones mínimas requeridas para Angular y TypeScript, como Angular Ivy versión 9.1 y TypeScript versión 3.8. Mantenerse al día con las últimas versiones de estas tecnologías es crucial para aprovechar al máximo las características avanzadas y evitar incompatibilidades.
¿Cómo mejorar la aplicación de habilidades y conocimientos en contextos diversos?
¿Cómo influyó el clima mediático en la crisis política de los Estados Unidos durante el mandato de Trump?
¿Cómo utilizar eficazmente las herramientas Clone Stamp, Ellipse y Elliptical Marquee en Photoshop?
¿Cómo puede influir el vocabulario técnico en la comprensión de términos específicos en diferentes contextos?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский