Closed fabianbarreto02 closed 8 months ago
Este tutorial esta mas enfocado en como se comparte información entre micro clientes a través de las cookies, en este caso para cambiar el idioma en los microclientes, es bueno recalcar, que esta no es una buena practica, solo sea hace cuando sea muy necesario.
A continuación se explica como implementar la traducción en micro clientes.
Para esta explicación se trabajara con angular y además, se parte de que ya se sabe trabajar con microservicios, ósea ya tenemos varios clientes encapsulados en una herramienta (single-spa) y que se sabe hacer una traducción en un cliente normal.
<script type="systemjs-importmap">
{
"imports": {
"@prueba/root-config": "//localhost:9000/prueba-root-config.js",
"@prueba/mf-header": "//localhost:4200/main.js",
"@prueba/mf-main": "//localhost:4201/main.js",
}
}
</script>
<% } %>
@prueba/root-config: Contiene los micro clientes (Encapsulador) @prueba/mf-header: El header de la aplicación (Cliente) @prueba/mf-main: El contenido principal (Cliente)
npm install @ngx-translate/core --save
npm install @ngx-translate/http-loader --save
En cada uno de ellos ponemos las traducciones, por ejemplo, text-docs-1 debe estar igual en los idiomas, así será identificado por el traductor:
en.js:
{
"text-docs-1": "Microfrontends are a software development architecture that focuses on breaking down a monolithic frontend application into smaller, independent, and easily deployable parts.",
"text-docs-2": "Each part, or microfrontend, is a self-contained frontend module that can be developed, deployed, and scaled independently. This provides advantages in terms of development, maintenance and scalability.",
"text-docs-3": "Microfrontends enable development teams to work more independently and efficiently. Each team can take responsibility for a specific microfrontend, facilitating collaboration and improving development speed.",
"text-docs-4": "Furthermore, microfrontends allow independent updating and deployment of each part of the application, making continuous integration and continuous delivery easier.",
"title-docs-1": "Microfrontends: An Introduction",
"title-docs-2": "What Are Microfrontends Used For?"
}
es.json
{
"text-docs-1": "Los microfrontends son una arquitectura de desarrollo de software que se centra en dividir una aplicación frontend monolítica en partes más pequeñas, independientes y fácilmente desplegables.",
"text-docs-2": "Cada parte, o microfrontend, es un módulo frontend autónomo que se puede desarrollar, desplegar y escalar de forma independiente. Esto proporciona ventajas en términos de desarrollo, mantenimiento y escalabilidad.",
"text-docs-3": "Los microfrontends permiten a los equipos de desarrollo trabajar de manera más independiente y eficiente. Cada equipo puede asumir la responsabilidad de un microfrontend específico, lo que facilita la colaboración y mejora la velocidad de desarrollo.",
"text-docs-4": "Además, los microfrontends permiten la actualización y despliegue independiente de cada parte de la aplicación, lo que facilita la implementación continua y la entrega continua.",
"title-docs-1":"Microfrontends: Una introducción",
"title-docs-2":"¿Para qué sirven los microfrontends?"
}
export function createTranslateLoader(http: HttpClient) {
return new TranslateHttpLoader(http, environment.apiUrl+'assets/i18n/', '.json');
}
El cual environment.apiUrl es una variable de entorno, que hace refencia al mismo cliente, ósea que si se esta trabajando con el cliente header que esta en local y que esta en el puerto 4200, en las variables de entorno quedaria:
export const environment = {
production: false,
apiUrl: 'http://localhost:4200/',
};
Tambien en app.module.ts de cada cliente ponemos en lo imports
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
}
}),
Debería estar quedando así, en cada uno de los clientes:
Ahora vamos a trabajar con el mf-header, el cual tendrá el select para escoger el idioma:
<select #langSelect (change)="cambiarIdioma(langSelect.value)">
<option *ngFor="let lang of langs" [value]="lang">
{{ lang }}
</option>
</select>
en el app.component.ts ponemos lo siguiente
langs: string[] = ['es', 'en']; // idiomas que va a soportar nuestra aplicacion
langCookie: string = 'es';
constructor(
private translate: TranslateService
) {
this.validateLang()
}
//este metodo esta escuchando el envento del select, y el string que obtiene lo setea en una cookie cambiarIdioma(lang: string) { this.langCookie = lang setCookie('lang', this.langCookie); let event = new CustomEvent('lang',{ detail:{ answer: lang } }) window.dispatchEvent(event) }
//esto va fuera del componente o en otro archivo de utils, es para el manejo de cookies export function setCookie(name: string, val: string) { const date = new Date(); const value = val; // Set it expire in 7 days date.setTime(date.getTime() + 7 24 60 60 1000); // Set it document.cookie = name + '=' + value + '; expires=' + date.toUTCString() + '; path=/'; }
export function getCookie(name: string): string | undefined { const value = '; ' + document.cookie; const parts = value.split('; ' + name + '=');
if (parts.length == 2) {
return parts.pop()?.split(';').shift();
}
return undefined
}
5. Ahora en los clientes que van a escuchar la cookie (que estará seteada ya por el header y cada vez que se cambie el idioma)
en este caso el cliente de mf-main:
```js
//observable que estara pendiente del cambio del idioma
whatLang$ = fromEvent(window, 'lang');
ngOnInit(): void {
this.validateLang();
}
constructor(
private translate: TranslateService
) {}
// este metodo valida el idioma que se seteo en la cookie
validateLang() {
let lang = getCookie('lang') || 'en';
this.whatLang$.subscribe((x:any) => {
lang = x['detail']['answer'];
this.translate.setDefaultLang(lang)
});
this.translate.setDefaultLang(getCookie('lang') || 'en');
}
<p>
{{'text-docs-1' | translate}}
</p>
:partying_face:Eso seria todo:partying_face: Al cambiar el valor del select que esta en el mf-header, se cambiara el idioma en los clientes que tengan el obsevable que esta pendiente del cambio del valor en la cookie
Micro-Frontends
Single-spa es un framework para construir aplicaciones web que adopta la arquitectura de microfrontends. En lugar de construir una aplicación monolítica, donde todo el código del frontend está contenido en un único código base, Single-spa permite crear aplicaciones divididas modulando y haciendo independientes los llamados "microfrontends". Cada microfrontend es una aplicación frontend autocontenida, con su propio conjunto de tecnologías y bibliotecas.
Single-spa Se estuvo analizando y haciendo practica sobre la freamwork single-spa con documentación, realizando análisis de la estructura y implementación de este mismo.
Dependencias
Se hace investigación de como poder trabajar las rutas y como poder traer dependencias desde mf (micro-front), especificamente con Angular Material
Se descarga el proyecto sga-cliente y se logra arrancar en el local
Se participa en la capacitación brindada por @JuanCamiloMartinezLopez
Fix Animaciones en sga-cliente
Para esta actividad se tuvo que adaptar la función ya que la manera en la que se hace con Angular 17 es distinta ya que no contiene con el modulo app.module para realizar la importación de la librería y a hora se hace por medio del app.config
Evidencia en código:
Se subio al repositorio mf-cliente el fix para poder hacer PullRequest
Implementación de idiomas en Angular 17
Como comentaba en el punto anterior en esta nueva versión de angular ya no contamos con el modulo app.module por lo que las importaciones de las librerías cambian, se esta trabajando para adaptarla en esta nueva versión
Actualmente no se ha terminado esta parte
Gracias. Quedo atento a cualquier observación
En esta versión ya no existe el app.module, entonces el cambio que hacemos es en el app.config, hacemos los mismos pasos, pero a la hora de importar lo ponemos en el app.config de la siguiente manera:
importProvidersFrom([
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
}
}),
]),
Se vería así:
Issue terminada
Se da por finalizada la issue
Se requiere realizar la Apropiación y documentación de tecnología de micro clientes para la migración del cliente actual a la nueva tecnología
Sub Tareas
Criterios de aceptación
Requerimientos
No aplica
Definition of Ready - DoR
Definition of Done - DoD - Desarrollo