Issue #2674💬 RespondidoAbierto el 20 de marzo de 2020por teawithfruitReacciones 1

Integración de contenido i18n

Respuesta rápidapor artf1

@teawithfruit si esperas algo en tu página HTML guardada (fuera del editor GrapesJS), lo único que veo que puede hacer es: '''js script: function() { console.log('¡guion hecho!') } ``` Así que no sirve de nada, probablemente eres otra víctima de pensar que los scripts dentro del editor GrapesJS funcionarán en el códig...

Lee la respuesta completa abajo ↓

Pregunta

Hola,

Estoy trabajando en la integración de mi sistema de localización (i18n) con grapes.js. La idea es tener un campo de datos, que contenga la cadena i18n. '''html

<div class="content" data-i18n="common:localize.string"></div> ``` Si el atributo de datos está activado, grapes.js tomará la cadena y la hará visible en un campo de configuración. Si se modifica el campo de configuración, también se modifica el atributo de datos y también el contenido dentro del lienzo. Si se borra el campo de configuración, el atributo de datos se eliminará.

Si el archivo se guarda, los atributos se incluirán. Al usar el archivo en producción, un pequeño script busca el atributo data-i18n para colocar el texto dentro del elemento en el idioma correcto.

Ahora tengo algunos problemas con la implementación.

  1. Si edito el campo de ajustes, el contenido del lienzo está bien configurado pero en "Ver código" y el archivo guardado no. Parece que el texto se añade y no se reemplaza. ¿Es ''' component.components('Insertar texto aquí...')' la forma correcta de reemplazar contenido dentro de un componente? (jsfiddle línea 29) Puedes emular una cadena i18n válida usando '''i18nString''' en el campo de configuración.
  2. Me gustaría integrar el script en el componente. Ahora tengo un problema usando funciones asincrónicas. ¿Es posible usar funciones asincrónicas dentro de un script de componentes? (jsfiddle línea 57)
  3. ¿Cuál es la mejor manera de actualizar el contenido del lienzo? Estoy pendiente entre la línea 27 y la línea 61. Ambos en el jsfiddle.
  4. Si altero el campo de ajustes, se reinician los ajustes tipográficos. ¿Es posible evitar eso?
  5. He leído la documentación y la documentación de la API. Pero no estoy seguro de si la forma en que creé el componente es la mejor. ¿Puedes darme un comentario sobre eso?

Puedes comprobar mis puntos añadiendo el bloque "Content" al lienzo y modificando el campo i18n en los ajustes. Aquí está el enlace de jsfiddle. https://jsfiddle.net/bool/gfbdyLup/6/

¡Gracias por esta estupenda biblioteca y por tu ayuda!

Respuestas (3)

artf1 de abril de 2020

@teawithfruit si esperas algo en tu página HTML guardada (fuera del editor GrapesJS), lo único que veo que puede hacer es: '''js script: function() { console.log('¡guion hecho!') }

Así que no sirve de nada, probablemente eres otra víctima de pensar que los scripts dentro del editor GrapesJS funcionarán en el código exportado (pero el HTML final no tiene nada que ver con el editor). Una explicación un poco más detallada [aquí](https://github.com/artf/grapesjs/issues/2181#issuecomment-520470116)
pouyamiralayi21 de marzo de 2020

Hola @teawithfruit hay un par de problemas con tu código:

  1. no tienes acceso a ''this'' como modelo dentro del componente ''script'': Component & Js docs
  2. si tu caso de uso es controlar un atributo, no tienes que proporcionar un rasgo personalizado para ello; Simplemente define un rasgo normal y añade oyentes para los cambios sobre ese atributo:
modelo: {
            init() {
                this.on('change:attributes:data-i18n', this.handleTypeChange);
            },

handleTypeChange() {
                console.log('Entrada cambiada a: ', this.getAttributes()['data-i18n']);
            },
            Predeterminados: {
                atributos:{
                  'data-i18n':''
                },
                Rasgos: [
                    {
                        Nombre: 'data-i18n',
                        etiqueta: 'i18n!'
                    }
                ],
            //....

¡Salud!

teawithfruit23 de marzo de 2020

¡Gracias por la respuesta tan útil! Este es mi bloque/componente actualizado. Ahora mismo solo tengo un problema más.

La función de script que he añadido al componente no se llama en la página html guardada. Si añado el bloque al lienzo en el editor, se llama a la función, pero no si guardo la página y la abro fuera de grapes.js. Si miro en el inspector de elementos, la etiqueta de script es visible pero no se llama.

¿Estoy haciendo algo mal?

'''js editor. DomComponents.addType('content', { isComponent: el => el.classList && el.classList.contains('content'), extiende: 'texto', modelo: { async init() { clave const = this.getAttributes()['data-i18n']

if(key && await Localize.exists(key) == true) { this.set('content', await Localize.get(key)) }

this.on('change:attributes:data-i18n', this.handleTypeChange) }, async handleTypeChange() { clave const = this.getAttributes()['data-i18n']

if(key && await Localize.exists(key) == true) { this.set('content', await Localize.get(key)) } else { Let Attributes = this.getAttributes()

if(attributes['data-i18n'] != indefinido) { eliminar atributos['data-i18n'] this.setAttributes(attributes) } } }, Predeterminados: { Rasgos: [ { Nombre: 'data-i18n', Etiqueta: 'i18N' } ], script: function() { console.log('¡guion hecho!') } } } })

editor. BlockManager.add('add-content', { etiqueta: 'Contenido', categoría: 'Elementos', Tipo: 'Contenido', content: '<div class="content">Insertar texto aquí...</div>` })


¡Gracias de nuevo por vuestra ayuda!

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.

Explora plugins gratuitos →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.