es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Angular 12: SSR no obtiene las rutas de los archivos de traducción.

Tengo un proyecto de Angular en el cual tengo un archivo (src->app->lang-translate->lang-translate.module.ts) que accede a archivos de otras ubicaciones como se muestra a continuación.

{prefix: "../../assets/translate/Pages/header/", suffix: ".json"},
{prefix: "../../assets/translate/Pages/footer/", suffix: ".json"},

Estoy obteniendo el siguiente error cuando uso SSR en este proyecto de Angular:

No se pudo encontrar el archivo de traducción: ../../assets/translate/Pages/header/en.json

No se pudo encontrar el archivo de traducción: ../../assets/translate/Pages/footer/en.json

Entonces necesito intentar con una ruta absoluta para los archivos, pero no sé cómo.
He intentado esto link, pero sigo obteniendo el mismo error.

¿Cómo puedo obtener la ruta absoluta de esos archivos, la cual será común tanto en local como en producción en Angular?
¿Hay alguna forma de obtener la ruta absoluta de un archivo en Angular?

O

¿Cómo puedo informar a SSR las rutas de los archivos de traducción?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puedes utilizar la función resolve proporcionada por Node.js para obtener la ruta absoluta de un archivo en tu proyecto de Angular. Agrega el siguiente código a tu archivo lang-translate.module.ts:

    import { resolve } from 'path';
    
    const assetsDir = resolve(__dirname, '../../assets');
    
    const translations = [
      { prefix: `${assetsDir}/translate/Pages/header/`, suffix: '.json' },
      { prefix: `${assetsDir}/translate/Pages/footer/`, suffix: '.json' },
    ];
    
    // Utiliza el arreglo de traducciones...
    

    Este código define una variable assetsDir que contiene la ruta absoluta al directorio assets en tu proyecto. Luego, puedes utilizar esta variable para construir las rutas a tus archivos de traducción.

    Ten en cuenta que al utilizar renderizado del lado del servidor con Angular Universal, necesitas proporcionar explícitamente las traducciones al contexto de renderizado del lado del servidor. Puedes hacer esto configurando un token TRANSLATIONS_PROVIDED con tu arreglo de traducciones en tu archivo server.ts. Aquí tienes un ejemplo:

    import { ngExpressEngine } from '@nguniversal/express-engine';
    import { enableProdMode } from '@angular/core';
    import { provide } from '@angular/core';
    import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens';
    import { createServerRenderer } from 'aspnet-prerendering';
    import { AppServerModule } from './src/main.server';
    import { TRANSLATIONS_PROVIDED } from '@angular/core/i18n/tokens';
    import translations from './src/assets/i18n/en.json';
    
    enableProdMode();
    
    export default createServerRenderer(params => {
      const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist-server/main');
      const { provideModuleMap } = require('@nguniversal/module-map-ngfactory-loader');
    
      const translationsProvider = provide(
        TRANSLATIONS_PROVIDED,
        { useValue: translations }
      );
    
      const options = {
        bootstrap: AppServerModuleNgFactory,
        providers: [
          provideModuleMap(LAZY_MODULE_MAP),
          { provide: REQUEST, useValue: params },
          { provide: RESPONSE, useValue: params.res },
          translationsProvider,
        ],
      };
    
      return ngExpressEngine(options).then(html => ({ html }));
    });
    

    Observa la variable translationsProvider que configura el token TRANSLATIONS_PROVIDED con tu arreglo de traducciones. Luego, esta variable se agrega al arreglo providers que se pasa a la función ngExpressEngine.

    Con estos cambios, tu proyecto de Angular debería poder acceder a los archivos de traducción utilizando rutas absolutas tanto en el navegador como en el servidor.

Comments are closed.