Laravel en Barcelona
Desarrollo Laravel para empresas de Barcelona
Una agencia de desarrollo Laravel que trabaja con equipos de Barcelona. Empresas de producto con desarrolladores propios, y contenido en tres idiomas que vive en la base de datos.
Quien compra en Barcelona son empresas de producto, no corporaciones - plataformas de viajes y movilidad, marketplaces, productos de suscripción con unos pocos desarrolladores y un backlog más largo que el equipo.
Lo que compran estos equipos es trabajo acotado - un defecto concreto que sus desarrolladores llevan un trimestre mirando, resuelto dentro de su propia política de ramas, con fecha de fin y no con una cuota mensual.
Tres idiomas en Barcelona, y dónde vive el contenido
Esta es la particularidad local, y es una cuestión de esquema antes que de internacionalización.
Las cadenas de interfaz son un problema resuelto y van en ficheros de idioma. El contenido que pertenece a un registro no: el título de un anuncio, la descripción de una ruta, un artículo de ayuda. Eso es dato con ciclo de vida - lo edita alguien que no es desarrollador, se revisa, se publica, a veces se revierte - y meterlo en un fichero de idioma convierte cada cambio en un despliegue.
Lo que significa que no ocurre, lo que significa que los idiomas que no son el principal se quedan atrás en silencio. En un territorio donde uno de esos idiomas no es opcional, eso lo ve todo el mundo.
Así que el contenido traducido vive junto al registro con su propio estado de completitud, y hay dos decisiones que hay que tomar explícitamente en lugar de heredarlas.
La primera es el orden de respaldo. Si un registro existe en español e inglés pero no en catalán, ¿qué ve un visitante en catalán? Recurrir a otro idioma en silencio es útil para quien lee y deshonesto para un rastreador, así que la aplicación tiene que distinguir entre contenido que existe en un idioma y contenido que se está sustituyendo.
La segunda es que la completitud sea un estado consultable. Alguien tiene que poder preguntar qué registros no están traducidos, porque esa es la carga de trabajo editorial, y una aplicación que no sabe responder deja el hueco invisible hasta que lo encuentra un cliente.
Con dos idiomas se puede no decidir ninguna de las dos. Con tres, no.
Qué suele necesitar arreglo en un proyecto Laravel de Barcelona
Más allá del idioma, las aplicaciones de Barcelona llegan con la forma de algo construido rápido y correctamente para una etapa anterior.
La cola, lo más habitual: trabajos que no son seguros de repetir en un sistema que reintenta por diseño, lo que significa que ya hay un duplicado en algún sitio que nadie ha rastreado.
Después, el esquema que describía el negocio de hace dos pivotes: un enum de estado cuyos valores significan cosas distintas según cuándo se creó la fila, y una columna JSON que se convirtió en el sitio al que van los campos nuevos porque una migración parecía pesada. Cada añadido fue razonable; la suma es un modelo sobre el que ya nadie puede razonar.
Una URL de Barcelona tiene que existir en tres idiomas
Si el contenido existe en catalán, castellano e inglés, también existe su dirección, y las direcciones no son traducciones una de otra hechas en el momento de renderizar.
Un slug por idioma, almacenado, es el montaje que funciona. Lo puede editar quien escribe el contenido, es estable, y no cambia porque alguien haya corregido una errata en un título. Derivar la URL del título significa que cada corrección mueve en silencio una página que puede estar enlazada desde fuera, y eso es un problema que aparece como tráfico perdido y no como un error.
Lo que obliga a guardar el historial de slugs. Cuando un slug cambia a propósito, el anterior sigue resolviendo - con una redirección permanente a la nueva dirección - y eso exige que los slugs anteriores sean filas y no recuerdos. Sin ello, la tercera o cuarta revisión del contenido rompe discretamente todos los enlaces externos a la página.
Las versiones por idioma tienen que apuntarse entre sí de forma explícita, porque un rastreador no puede deducir que tres direcciones distintas son el mismo documento en tres idiomas. Cada página declara sus alternativas, en cada idioma en que realmente existe, y no declara nada para los que no. Apuntar a una dirección que devuelve la navegación traducida alrededor de un texto en inglés es peor que no apuntar a nada.
Contenido de Barcelona que existe en dos idiomas y no en el tercero
La traducción nunca está completa, y un sistema que supone que sí lo está produce el peor resultado posible, que es una página que dice estar en catalán y no lo está.
Así que el registro sabe, por idioma, si existe. Un listado de artículos en catalán muestra los que existen en catalán, no todos los artículos con los no traducidos apareciendo en castellano. Un artículo que falta en el idioma pedido o no aparece o aparece claramente etiquetado, y cuál de las dos cosas corresponde depende del contenido y no del comportamiento por omisión del framework.
El respaldo tiene que ser honesto a nivel de página, no de cadena. Respaldar campo por campo produce una página con un título en catalán, un cuerpo en castellano y una llamada a la acción en inglés, que a una persona le parece roto y a un rastreador le parece una traducción pobre. Respaldar la página entera, y decirlo, es la versión con la que un lector puede trabajar.
Y el hueco tiene que ser visible para quien puede cerrarlo. Una lista de lo que falta, por idioma, ordenada por el tráfico que recibe cada página, es un informe corto que convierte un backlog abstracto en tres tardes de trabajo de alguien que escribe en catalán.
Caché de Laravel cuando la página varía por idioma y por usuario
La caché se añade cuando el sitio se vuelve lento, y el error que introduce es casi siempre el mismo - alguien ve una página en el idioma equivocado o, peor, ve la de otra persona.
La causa es una clave de caché que no incluye todo aquello de lo que depende la salida. El idioma es la omisión evidente en un sitio trilingüe. El estado de autenticación es la peligrosa, porque una página cacheada sin sesión y servida a un usuario identificado está simplemente mal, mientras que al contrario es una filtración. Todo aquello según lo cual varía la respuesta - idioma, rol, moneda, el inquilino - pertenece a la clave, y la disciplina es construir la clave a partir de una lista declarada y no de lo que el desarrollador recordó.
Cachear fragmentos evita casi todo esto porque limita la caché a la parte que de verdad es compartida. El cuerpo del artículo en catalán es el mismo para todo el mundo y se puede cachear con decisión; la cabecera con el nombre del usuario no se puede cachear en absoluto. Partir por esa frontera da casi todo el beneficio sin ningún riesgo, y aguanta que más adelante se añada un elemento personalizado.
La invalidación es entonces lo único difícil que queda, y lo que la hace manejable es invalidar por el evento y no por un temporizador. Contenido guardado, caché borrada para ese contenido en ese idioma - no una caducidad de quince minutos que deja a un editor recargando y preguntándose si su cambio ha funcionado.
En lo comercial
La factura la emite Codefacture Yazılım A.Ş., con domicilio en Türkiye, en euros y por transferencia, sin IVA turco por la exención de servicios exportados.
Lo que rige en todo el país se explica en la página de España.
