fix: trocar es-PY por es

This commit is contained in:
Ricardo Carneiro 2026-03-09 11:45:55 -03:00
parent 6301e33686
commit 9c393f01e5
23 changed files with 2774 additions and 280 deletions

View File

@ -0,0 +1,129 @@
---
title: "PNG, WebP o SVG: Eligiendo el Formato Correcto para tu Código QR"
description: "Comparativa técnica entre PNG, WebP y SVG para códigos QR vía API. Conoce cuál formato usar según tu caso de uso: e-mail, impresión, web o apps."
keywords: "qr code png, qr code webp, qr code svg, formato imagen qr code, api qr code formato"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# PNG, WebP o SVG: Eligiendo el Formato Correcto para tu Código QR
La API QRRapido soporta tres formatos de salida: `png`, `webp` y `svg`. Cada uno tiene características distintas que impactan el tamaño del archivo, la calidad y la compatibilidad. Usa el parámetro `outputFormat` en la solicitud para elegir.
```json
{
"content": "https://tuempresa.com",
"type": "url",
"outputFormat": "webp"
}
```
---
## Resumen Rápido
| Formato | Tamaño | Escala sin pérdida | Compatibilidad | Ideal para |
|---|---|---|---|---|
| **PNG** | Medio | No (raster) | Universal | Impresión, e-mail, sistemas legados |
| **WebP** | Pequeño (~30% menor) | No (raster) | Browsers modernos | Web, apps, APIs |
| **SVG** | Variable (generalmente menor) | **Sí** | Browsers, Adobe, Figma | Logos, banners, impresión vectorial |
---
## PNG — El Estándar Universal
PNG es un formato raster sin pérdida, ideal para códigos QR porque preserva 100% de los píxeles blancos y negros sin introducir artefactos.
**Cuándo usarlo:**
- Envío por e-mail (clientes de correo antiguos no soportan WebP)
- Integración con sistemas legados
- Cuando la compatibilidad máxima es prioridad
**¿Por qué no JPEG?**
> JPEG usa compresión con pérdida que introduce artefactos de borrosidad en los bordes de los módulos del código QR. Eso puede volverlo ilegible, especialmente en tamaños pequeños. **Nunca uses JPEG para códigos QR.**
```json
{ "outputFormat": "png" }
```
---
## WebP — Recomendado para Web y Apps
WebP es el formato ideal para la mayoría de las integraciones modernas. La calidad visual es indistinguible del PNG para códigos QR, con **2535% menos tamaño de archivo**.
**Ventajas:**
- Carga más rápida en páginas web
- Menor uso de ancho de banda en APIs con alto volumen
- Soporte nativo en todos los browsers modernos (Chrome, Safari 14+, Firefox, Edge)
- Menor consumo de almacenamiento en la nube (S3, GCS, etc.)
**Cuándo usarlo:**
- Visualización en `<img>` en sitios y aplicaciones web
- Apps iOS/Android (ambos soportan WebP)
- Cuando guardas los QR generados
```json
{ "outputFormat": "webp" }
```
Para mostrar en HTML:
```html
<picture>
<source srcset="data:image/webp;base64,{{ qrCodeBase64 }}" type="image/webp">
<img src="data:image/png;base64,{{ fallbackBase64 }}" alt="Código QR">
</picture>
```
---
## SVG — Para Escalar sin Pérdida
SVG es un formato vectorial: el código QR se describe matemáticamente, no como píxeles. Eso significa que se puede redimensionar a cualquier tamaño — desde un ícono de 16px hasta un banner de 3 metros — sin perder calidad.
**Cuándo usarlo:**
- Material gráfico (banners, carteles, packaging, camisetas)
- Integración con herramientas de diseño (Figma, Illustrator, Canva)
- Impresión de alta calidad sin depender de la resolución
**Atención:**
- No uses SVG para envío por e-mail (la mayoría de los clientes bloquea SVG por seguridad)
- Algunos lectores de QR antiguos pueden tener dificultad con SVG renderizado directamente vía `<img>`
```json
{ "outputFormat": "svg" }
```
Para mostrar SVG inline, el `qrCodeBase64` debe decodificarse primero:
```js
const svgString = atob(qrCodeBase64);
document.getElementById('qr').innerHTML = svgString;
```
---
## Comparativa de Tamaño (ejemplo real — 400px, URL simple)
| Formato | Tamaño típico |
|---|---|
| PNG | ~812 KB |
| WebP | ~58 KB |
| SVG | ~36 KB |
> Los tamaños varían según la complejidad del contenido (los QR con más datos tienen más módulos).
---
## Recomendación por Caso de Uso
| Escenario | Formato recomendado |
|---|---|
| Mostrar en sitio/app | **WebP** |
| Enviar por e-mail | **PNG** |
| Impresión gráfica / diseño | **SVG** |
| Guardar en la nube | **WebP** |
| Máxima compatibilidad | **PNG** |
| Sin preocupación por tamaño | **PNG** |

View File

@ -0,0 +1,186 @@
---
title: "Cómo Generar Códigos QR por la API: Todos los Tipos"
description: "Guía completa para generar códigos QR vía API REST usando cada tipo disponible: URL, Pix, Wi-Fi, vCard, WhatsApp, SMS, e-mail y texto libre."
keywords: "api qr code, generar qr code api, qr code rest api, qrrapido api, tipos qr code"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# Cómo Generar Códigos QR por la API: Todos los Tipos
La API QRRapido soporta 8 tipos de código QR. Todos usan el mismo endpoint — lo que cambia es el campo `type` y los campos específicos que forman el `content`.
## Endpoint
```
POST /api/v1/QRManager/generate
X-API-Key: tu_clave_aqui
Content-Type: application/json
```
## Estructura Base de la Solicitud
```json
{
"content": "...",
"type": "url",
"size": 400,
"primaryColor": "#000000",
"backgroundColor": "#FFFFFF",
"outputFormat": "png"
}
```
| Campo | Tipo | Por defecto | Descripción |
|---|---|---|---|
| `content` | string | obligatorio | Contenido del QR |
| `type` | string | `"url"` | Tipo de QR (ver abajo) |
| `size` | int | `300` | Tamaño en píxeles (1002000) |
| `primaryColor` | string | `"#000000"` | Color de los módulos (hex) |
| `backgroundColor` | string | `"#FFFFFF"` | Color de fondo (hex) |
| `outputFormat` | string | `"png"` | Formato: `png`, `webp`, `svg` |
---
## Tipo `url` — Link / URL
El más simple: cualquier URL válida.
```json
{
"type": "url",
"content": "https://tuempresa.com/producto/123"
}
```
> Usa `https://` siempre que sea posible. Los QR con HTTP pueden ser bloqueados por algunos lectores modernos.
---
## Tipo `pix` — Pago Pix
El `content` debe ser la **clave Pix** del receptor. La generación produce un QR de Pix estático (sin conexión con el Banco Central — consulta el tutorial dedicado sobre Pix).
```json
{
"type": "pix",
"content": "contacto@tuempresa.com.br"
}
```
Claves aceptadas: CPF/CNPJ (solo dígitos), e-mail, teléfono en formato `+5511999999999`, o clave aleatoria (UUID).
---
## Tipo `wifi` — Red Wi-Fi
El `content` usa el formato estándar `WIFI:`:
```json
{
"type": "wifi",
"content": "WIFI:S:NombreDeRed;T:WPA;P:ContraseñaDeRed;;"
}
```
| Parámetro | Significado | Valores |
|---|---|---|
| `S:` | SSID (nombre de la red) | texto |
| `T:` | Tipo de seguridad | `WPA`, `WEP`, `nopass` |
| `P:` | Contraseña | texto |
| `H:` | Red oculta (opcional) | `true` / `false` |
---
## Tipo `vcard` — Tarjeta de Visita
El `content` debe ser un vCard v3 completo:
```json
{
"type": "vcard",
"content": "BEGIN:VCARD\nVERSION:3.0\nFN:Juan Pérez\nORG:Empresa SRL\nTEL:+5491199999999\nEMAIL:juan@empresa.com\nURL:https://empresa.com\nEND:VCARD"
}
```
---
## Tipo `whatsapp` — Link para WhatsApp
```json
{
"type": "whatsapp",
"content": "https://wa.me/5491199999999?text=¡Hola!%20Quisiera%20más%20información"
}
```
El número debe incluir código de país y área, sin espacios ni símbolos. El parámetro `text` es opcional.
---
## Tipo `email` — E-mail con asunto y cuerpo
```json
{
"type": "email",
"content": "mailto:contacto@empresa.com?subject=Consulta&body=¡Hola!%20Quisiera%20saber%20más"
}
```
---
## Tipo `sms` — SMS pre-cargado
```json
{
"type": "sms",
"content": "sms:+5491199999999?body=¡Hola!%20Quiero%20más%20información"
}
```
---
## Tipo `texto` — Texto Libre
Cualquier string de hasta 2048 caracteres:
```json
{
"type": "texto",
"content": "Mesa 5 — Atención preferencial disponible en el mostrador central."
}
```
---
## Respuesta Exitosa
```json
{
"success": true,
"qrCodeBase64": "iVBORw0KGgo...",
"qrId": "abc123",
"generationTimeMs": 180,
"remainingCredits": 42,
"fromCache": false,
"format": "png",
"mimeType": "image/png"
}
```
Para mostrar la imagen directamente en HTML:
```html
<img src="data:image/png;base64,{{ qrCodeBase64 }}" alt="Código QR" />
```
---
## Consejos Generales
- **Colores**: mantén alto contraste entre `primaryColor` y `backgroundColor`. Evita amarillo sobre blanco o gris claro sobre blanco.
- **Tamaño mínimo impreso**: usa `size` ≥ 400 para impresiones. Para uso digital, 300 es suficiente.
- **Caché**: solicitudes idénticas devuelven `fromCache: true` sin consumir crédito adicional.
- **Rate limit**: los headers `X-RateLimit-Remaining` y `X-Quota-Remaining` en la respuesta indican tu saldo actual.

View File

@ -0,0 +1,142 @@
---
title: "Código QR Pix Estático: Cómo Funciona y Responsabilidades del Desarrollador"
description: "Entiende qué es el QR Pix estático, cómo lo genera la API, sus limitaciones y por qué la verificación del pago es responsabilidad de tu aplicación — no de QRRapido."
keywords: "qr code pix, pix estatico, qr code pix api, integración pix qr code, pix sin bacen"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# Código QR Pix Estático: Cómo Funciona y Responsabilidades del Desarrollador
## ¿Qué es un Código QR Pix Estático?
El Pix tiene dos tipos de QR: **estático** y **dinámico**.
| | Pix Estático | Pix Dinámico |
|---|---|---|
| Valor | Variable (lo decide el pagador) | Fijo (definido por el receptor) |
| Generación | Cualquier sistema | Intermediario PSP/BACEN |
| Registro en BACEN | **No** | Sí |
| Notificación de pago | **No** | Sí (webhook) |
| Uso típico | Donaciones, cobros simples | E-commerce, cobro con control |
La API QRRapido genera **exclusivamente QR Pix estático**. Eso es intencional y suficiente para la mayoría de los casos de uso.
---
## Cómo la API Genera el QR Pix
Al enviar una solicitud con `type: "pix"`, la API arma un string en el estándar **EMV® QR Code** (estándar internacional adoptado por el Banco Central de Brasil) y genera la imagen:
```json
{
"type": "pix",
"content": "contacto@tuempresa.com.br"
}
```
El campo `content` debe contener **solo la clave Pix** del receptor. La API se encarga de armar el payload EMV correctamente.
**Claves aceptadas:**
- E-mail: `contacto@empresa.com.br`
- CPF/CNPJ: solo dígitos — `12345678901` o `12345678000195`
- Teléfono: `+5511999999999`
- Clave aleatoria (EVP): `123e4567-e89b-12d3-a456-426614174000`
---
## Lo que la API NO hace (y por qué eso importa)
> **QRRapido no tiene integración con el Banco Central, con ningún banco ni PSP (Proveedor de Servicio de Pago).**
Eso significa:
1. **La API no sabe si el pago fue realizado.** Solo genera la imagen del QR. Lo que pasa después — si el cliente escaneó, si el Pix fue enviado, si llegó a la cuenta correcta — está fuera del alcance de la API.
2. **No hay webhook de confirmación de pago.** La API no envía notificaciones cuando se recibe un Pix.
3. **El QR no expira automáticamente.** Un QR Pix estático es válido indefinidamente (o hasta que la clave Pix sea eliminada por el receptor en su banco).
4. **No hay rastreabilidad de transacción.** Dos solicitudes con la misma clave generan el mismo QR (con caché). No es posible asociar un escaneo a una transacción específica vía API.
---
## Responsabilidad de Tu Aplicación
Si usas la API para generar QR Pix en un flujo de pago, **es responsabilidad de tu aplicación verificar el cobro**. Las formas correctas de hacerlo son:
### Opción 1 — API Pix del Banco del Receptor
Conéctate directamente a la API Pix del banco donde está registrada la clave. La mayoría de los bancos ofrece:
- Consulta de cobros recibidos
- Webhook de notificación en tiempo real (cuando el banco lo soporta)
### Opción 2 — PSP / Gateway de Pago
Usa un intermediario como Mercado Pago, PagSeguro, Efí Bank, Asaas, etc. Ofrecen Pix dinámico con control completo: valor fijo, expiración, webhooks e identificación única por cobro.
### Opción 3 — Verificación Manual
Para volúmenes bajos o contextos informales (donaciones, ventas presenciales), el responsable del cobro verifica el extracto bancario manualmente.
---
## Flujo Recomendado (con confirmación)
```
Tu App API QRRapido Banco del Receptor
| | |
|-- POST /generate (pix) -->| |
|<-- qrCodeBase64 ----------| |
| | |
|-- Muestra QR al cliente | |
| | |
|-- Consulta pago ---------------------------------->|
|<-- Estado recibido o no ----------------------------|
| | |
|-- Libera producto/servicio| |
```
---
## Ejemplo de Solicitud Completa
```bash
curl -X POST https://qrrapido.site/api/v1/QRManager/generate \
-H "X-API-Key: tu_clave_aqui" \
-H "Content-Type: application/json" \
-d '{
"content": "contacto@tuempresa.com.br",
"type": "pix",
"size": 400,
"outputFormat": "webp"
}'
```
---
## Casos de Uso Adecuados para Pix Estático vía API
- QR de donación en sitio institucional
- Menú digital con clave para pago presencial
- Generación de QR en lote para materiales impresos (flyers, tarjetas)
- Aplicaciones donde el vendedor y comprador interactúan presencialmente y el vendedor confirma el cobro en la app del banco
## Casos de Uso que Requieren Pix Dinámico (no cubiertos por esta API)
- E-commerce con confirmación automática del pedido
- Cobro con valor fijo y expiración
- Emisión de factura vinculada al pago
- Conciliación financiera automatizada
---
## Resumen
| Lo que la API hace | Lo que la API NO hace |
|---|---|
| Genera la imagen del QR Pix | Verifica si el pago fue hecho |
| Formatea el payload EMV correctamente | Envía webhook de confirmación |
| Entrega PNG, WebP o SVG | Se comunica con el BACEN o bancos |
| Funciona con cualquier clave Pix válida | Garantiza que la clave pertenece a quien dice |
La generación correcta del QR es responsabilidad de la API. La **confirmación del pago es responsabilidad de tu aplicación** — y eso queda claro desde el principio.

View File

@ -0,0 +1,108 @@
---
title: "Cómo Crear Código QR para WhatsApp"
description: "Aprende a crear un código QR para WhatsApp que permite a los usuarios iniciar una conversación contigo instantáneamente"
keywords: "codigo qr whatsapp, whatsapp codigo qr, qr para whatsapp, crear qr whatsapp"
author: "QR Rapido"
date: 2025-10-08
lastmod: 2025-10-08
image: "/images/tutoriais/whatsapp-qr-hero.jpg"
---
# Cómo Crear Código QR para WhatsApp
Crear un **código QR para WhatsApp** es una de las formas más eficientes de facilitar el contacto directo con tus clientes, amigos o seguidores. Con un simple escaneo, cualquier persona puede iniciar una conversación contigo instantáneamente, sin necesidad de guardar tu número.
## 📱 ¿Por qué usar código QR para WhatsApp?
Los códigos QR para WhatsApp son extremadamente útiles para:
- **Empresas**: Facilitar la atención al cliente
- **Freelancers**: Agilizar el contacto con potenciales clientes
- **Eventos**: Permitir networking rápido
- **Marketing**: Aumentar la conversión en campañas
## 🎯 Paso a Paso
### 1. Prepara tu número
Primero, necesitas tener tu número en formato internacional:
```
+1 555 123-4567
```
Elimina todos los espacios y guiones, quedando:
```
15551234567
```
### 2. Crea la URL de WhatsApp
La URL de WhatsApp sigue este patrón:
```
https://wa.me/15551234567
```
Puedes agregar un mensaje predefinido:
```
https://wa.me/15551234567?text=¡Hola!%20Quisiera%20más%20información
```
### 3. Genera el código QR
Accede a [QR Rapido](https://qrrapido.site) y:
1. Selecciona el tipo **URL**
2. Pega la URL de WhatsApp
3. Personaliza los colores (opcional)
4. Haz clic en **Generar Código QR**
5. Descarga en alta calidad
## 💡 Consejos Profesionales
### Personaliza el Mensaje Inicial
Configura un mensaje de bienvenida automático para mejorar la experiencia:
```
https://wa.me/15551234567?text=¡Hola!%20Vine%20a%20través%20de%20tu%20código%20QR
```
### Úsalo en Materiales Impresos
- **Tarjetas de visita**: Facilita el contacto instantáneo
- **Folletos**: Aumenta el engagement
- **Embalajes**: Ofrece soporte directo al cliente
- **Banners**: En eventos y ferias
### Monitorea los Resultados
Para rastrear cuántas personas escanearon tu código QR, considera usar un acortador de URL con analytics antes de generar el QR.
## ⚠️ Cuidados Importantes
1. **Prueba antes de imprimir**: Siempre escanea para verificar que funciona
2. **Tamaño mínimo**: Mantén al menos 3x3 cm para fácil lectura
3. **Contraste adecuado**: Usa colores que contrasten bien (negro sobre blanco es ideal)
4. **Mensaje claro**: Indica para qué sirve el código QR
## 🚀 Ventajas de usar QR Rapido
- ⚡ **Ultra rápido**: Genera en menos de 1 segundo
- 🎨 **Personalizable**: Elige colores y estilos
- 📥 **Alta calidad**: Descarga en PNG, SVG y PDF
- 🔒 **Seguro**: Tus datos no son almacenados
- 💯 **Gratis**: 10 códigos QR por día
## Conclusión
Crear un código QR para WhatsApp es simple y puede revolucionar la forma en que te comunicas con tu público. Con QR Rapido, tienes todo lo que necesitas para crear códigos QR profesionales en segundos.
**¿Listo para empezar?** [Crea tu código QR ahora →](https://qrrapido.site/es)
---
*¿Tienes dudas? [Contáctanos](https://qrrapido.site/es/Contact)!*

View File

@ -0,0 +1,271 @@
---
title: "Cómo Crear Código QR WiFi Gratis: Comparte tu Red en Segundos"
description: "Aprende a crear código QR WiFi gratuito en pocos clics. Comparte la contraseña de tu red sin escribir con nuestro generador rápido y seguro."
keywords: "codigo qr wifi, crear codigo qr wifi, generador qr wifi gratis, qr wifi, compartir contraseña wifi, codigo qr red wifi, como hacer qr wifi"
author: "QR Rapido"
date: 2025-10-10
lastmod: 2025-10-10
image: "/images/tutoriais/qr-code-wifi-hero.jpg"
---
# Cómo Crear Código QR WiFi Gratis: Comparte tu Red en Segundos
¿Cansado de escribir contraseñas largas y complicadas cada vez que un visitante pide el WiFi? Con un **Código QR WiFi**, puedes compartir tu red instantáneamente. En este tutorial completo, aprenderás a crear un código QR para WiFi gratuitamente en menos de 2 minutos.
## ¿Por Qué Usar Código QR para WiFi?
Compartir tu red WiFi mediante código QR ofrece varias ventajas:
- **Practicidad**: Los visitantes se conectan instantáneamente sin escribir contraseñas
- **Seguridad**: No necesitas decir la contraseña en voz alta o anotarla
- **Profesionalismo**: Ideal para empresas, cafeterías, restaurantes y consultorios
- **Ahorro de tiempo**: Elimina errores de escritura y pedidos repetidos
- **Compatibilidad**: Funciona en prácticamente todos los smartphones modernos
## Paso a Paso: Cómo Crear tu Código QR WiFi
### Paso 1: Selecciona el Tipo de Código QR
Accede al generador y elige la opción **WiFi** en la lista de tipos de códigos QR disponibles.
**[INSERTAR IMAGEN 1 AQUÍ: Pantalla de selección de tipo de código QR con WiFi destacado]**
En el menú desplegable encontrarás varias opciones como URL/Link, Texto Simple, Tarjeta de Visita, SMS y Email. Para este tutorial, selecciona **WiFi**.
### Paso 2: Completa los Datos de tu Red WiFi
Ahora necesitas informar los datos de tu red. Ve los campos obligatorios:
**[INSERTAR IMAGEN 3 AQUÍ: Formulario de creación de código QR WiFi con campos completados]**
#### NetworkName (Nombre de la Red) *
Escribe exactamente el nombre de tu red WiFi (SSID). Por ejemplo: "NombreDeTuRed"
**Consejo importante**: El nombre debe ser idéntico al que aparece cuando buscas redes WiFi en el celular. ¡Respeta mayúsculas y minúsculas!
#### SecurityType (Tipo de Seguridad)
Selecciona el tipo de encriptación de tu red:
- **Red WPA (la más común)**: WPA/WPA2/WPA3 - recomendado y más seguro
- **WEP (muy antiguo)**: No recomendado por ser inseguro
- **Sin contraseña**: Para redes públicas sin protección
**[INSERTAR IMAGEN 4 AQUÍ: Ejemplo de formulario WiFi completado con "Rede-do-meu-comercio"]**
#### NetworkPassword (Contraseña de la Red) *
Introduce la contraseña de tu red WiFi. Usa el ícono de ojo para visualizar y verificar que escribiste correctamente.
**Importante**: La contraseña también distingue mayúsculas de minúsculas. ¡Verifica con atención!
#### HiddenNetwork (Red Oculta)
Marca esta opción solo si tu red está configurada como oculta (no aparece en la lista de redes disponibles).
### Paso 3: Personaliza tu Código QR (Opcional)
¡Dale a tu código QR la identidad de tu negocio!
**[INSERTAR IMAGEN 2 AQUÍ: Panel de personalización avanzada]**
#### Opciones de Personalización:
**Color Principal**: Elige el color de los cuadrados del código QR (predeterminado: azul)
**Color de Fondo**: Define el color de fondo (predeterminado: blanco)
**Tamaño**: Selecciona entre:
- Pequeño (200px) - Para uso digital
- Mediano (300px) - Recomendado para impresión
- Grande (500px) - Para banners y pósters
**Margen**:
- Compacto - Ocupa menos espacio
- Normal - Recomendado (mejor lectura)
- Amplio - Para impresiones grandes
**Consejo de diseño**: Mantén buen contraste entre el color principal y el fondo para garantizar que todos los celulares puedan leer el código.
### Paso 4: Generar y Descargar
Haz clic en el botón azul **"⚡ Generar Código QR Rápidamente"** y ¡listo! Tu código QR WiFi será generado instantáneamente.
Puedes:
- Descargar la imagen en alta calidad
- Imprimir y colocar en lugares visibles
- Compartir digitalmente
- Guardar para usar después
## Cómo tus Visitantes Usarán el Código QR WiFi
¡Es muy simple! Tus visitantes solo necesitan:
1. Abrir la cámara del celular (iOS o Android)
2. Apuntar al código QR
3. Tocar la notificación que aparece
4. Conectarse automáticamente al WiFi
**¡No necesitas descargar aplicaciones!** La mayoría de los smartphones desde 2018 ya tienen lectores de códigos QR integrados en la cámara.
## Dónde Usar tu Código QR WiFi
### Para Empresas
- Recepción de oficinas
- Salas de reuniones
- Áreas de espera
- Espacios de coworking
### Para Comercios
- Mesas de restaurantes
- Mostradores de cafeterías
- Tiendas y boutiques
- Salones de belleza
### Para Residencias
- Cuadro de entrada
- Área de parrilla
- Heladera (para fiestas)
- Home office
### Para Eventos
- Credenciales de eventos
- Stands de ferias
- Conferencias
- Bodas y fiestas
## Consejos de Seguridad
⚠️ **Importante**: Considera crear una red WiFi separada para visitantes (red guest) si deseas:
- Proteger tus dispositivos personales
- Limitar velocidad para invitados
- Tener control sobre quién accede
- Mantener tu red principal privada
Muchos routers modernos permiten crear redes guest fácilmente en las configuraciones.
## Preguntas Frecuentes (FAQ)
### ¿El Código QR WiFi expira?
¡No! El código QR funciona indefinidamente mientras los datos de la red (nombre y contraseña) permanezcan iguales.
### ¿Funciona en iPhone y Android?
¡Sí! Funciona en prácticamente todos los smartphones fabricados después de 2018 que tienen cámara.
### ¿Puedo crear para red 5GHz?
¡Sí! El proceso es exactamente el mismo. Solo usa el nombre correcto de la red 5GHz.
### ¿Es seguro?
¡Sí! El código QR solo facilita la escritura de los datos. Es tan seguro como informar la contraseña verbalmente o por escrito.
### ¿Puedo editar después de creado?
No es posible editar el código QR después de generado. Si cambias la contraseña del WiFi, necesitarás generar un nuevo código QR.
### ¿Cuántas personas pueden usar el mismo código QR?
¡Ilimitadas! No hay límite de usos para el código QR.
## Casos de Uso Reales
### Restaurantes y Cafeterías
Muchos negocios gastronómicos están adoptando códigos QR WiFi. Los clientes aprecian poder conectarse sin interrumpir al personal. Coloca el código QR en:
- Carteles en las mesas
- Menús impresos
- Pared cerca de la caja
### Consultorios Médicos
Los pacientes en la sala de espera pueden conectarse fácilmente mientras aguardan. Esto mejora la experiencia y reduce el estrés de la espera.
### Oficinas y Coworking
Facilita el acceso de clientes, proveedores y visitantes sin comprometer la seguridad de tu red principal. Ideal para espacios colaborativos.
### Hoteles y Hospedajes
Proporciona códigos QR en las habitaciones para que los huéspedes se conecten inmediatamente al llegar.
## Errores Comunes a Evitar
### ❌ Error 1: Nombre de Red Incorrecto
Verifica que escribiste exactamente el SSID de tu red. Un error común es confundir la red 2.4GHz con la 5GHz.
### ❌ Error 2: Contraseña con Espacios
Si tu contraseña tiene espacios, inclúyelos exactamente como están configurados en el router.
### ❌ Error 3: Tipo de Seguridad Incorrecto
Asegúrate de seleccionar el tipo correcto (WPA, WEP o sin contraseña). Si no estás seguro, verifica en la configuración de tu router.
### ❌ Error 4: QR Code Muy Pequeño
Para impresión, usa tamaño mediano (300px) o grande (500px). Los códigos pequeños pueden ser difíciles de escanear.
### ❌ Error 5: Bajo Contraste
Evita combinaciones de colores como amarillo sobre blanco o gris claro sobre gris. El contraste es esencial para la lectura correcta.
## Mejores Prácticas para Imprimir
Si vas a imprimir tu código QR WiFi, sigue estas recomendaciones:
### Material Recomendado
- **Papel fotográfico**: Para mejor calidad y durabilidad
- **Laminado**: Protege contra humedad y suciedad
- **Acrílico**: Solución premium para negocios
- **Vinilo adhesivo**: Fácil de colocar en paredes y superficies
### Tamaño de Impresión
- **Mínimo**: 5x5 cm para lectura cercana
- **Recomendado**: 10x10 cm para lectura a 30-50 cm de distancia
- **Grande**: 15x15 cm o más para lectura a mayor distancia
### Ubicación Estratégica
- A la altura de los ojos (1.40m - 1.60m)
- Bien iluminado
- Sin reflejos o brillos
- Fácilmente visible desde donde la gente se sienta o espera
## Tips para Negocios
### Agrega un Texto Atractivo
No solo coloques el código QR. Agrega texto como:
- "WiFi Gratis - Escanea y Conecta"
- "Internet Rápido - Solo Escanea"
- "Conéctate fácil con un clic"
### Diseño Personalizado
Usa los colores de tu marca en el código QR para mantener la coherencia visual con tu negocio.
### Múltiples Ubicaciones
En locales grandes, coloca varios códigos QR en diferentes puntos para facilitar el acceso.
### Actualización Periódica
Por seguridad, considera cambiar la contraseña WiFi cada 3-6 meses y generar un nuevo código QR.
## Conclusión
Crear un código QR WiFi es rápido, fácil y completamente gratuito en QR Rapido. En menos de 2 minutos puedes:
✅ Generar tu código QR personalizado
✅ Compartir tu red sin esfuerzo
✅ Proporcionar mejor experiencia a los visitantes
✅ Demostrar profesionalismo
**Prueba ahora mismo**: [Crear mi Código QR WiFi Gratis](/)
---
**¿Te gustó este tutorial?** ¡Comparte con amigos que también quieren facilitar el acceso a la red WiFi! Explora también nuestros otros tipos de códigos QR para diferentes necesidades.
## Otros Tutoriales Útiles
- Cómo crear código QR para WhatsApp
- Código QR para Tarjeta de Visita Digital
- Cómo crear código QR para URLs y Links
- Personalización avanzada de códigos QR
**¡Crea ahora tu código QR WiFi gratuito y transforma la experiencia de tus visitantes!** 🚀📱
---
## Soporte Técnico
¿Tienes problemas para crear tu código QR WiFi? Contáctanos:
- **Email**: soporte@qrrapido.site
- **WhatsApp**: [Agregar número]
- **Horario**: Lunes a Viernes, 8:00 - 18:00
¡Estamos aquí para ayudarte a crear el código QR perfecto para tu negocio o hogar!

View File

@ -0,0 +1,598 @@
---
title: "Código QR para Corredores de Inmuebles: Guía Completa para Etiquetas y Volantes"
description: "Descubre cómo usar código QR en etiquetas adhesivas, carteles y volantes inmobiliarios. Aumenta tus ventas con tecnología gratuita y profesional."
keywords: "codigo qr corredor inmuebles, etiqueta corredor inmobiliaria, qr inmobiliaria, etiquetas adhesivas corredores, divulgar corredor propiedades, qr cartel se vende"
author: "QR Rapido"
date: 2025-10-10
lastmod: 2025-10-10
image: "/images/tutoriais/qr-code-corretor-imoveis-hero.jpg"
---
# Código QR para Corredores de Inmuebles: Guía Completa para Etiquetas y Volantes
Si eres corredor de inmuebles, sabes que **captar leads calificados** es esencial para cerrar negocios. Imagina transformar tus carteles de "Se Vende", volantes y etiquetas adhesivas en herramientas interactivas que conectan clientes directamente a tu WhatsApp, ficha del inmueble o tarjeta de visita digital - todo esto **gratuitamente** con códigos QR.
En esta guía completa, aprenderás a crear y aplicar códigos QR profesionales en materiales inmobiliarios, aumentando tus conversiones y destacándote de la competencia.
## ¿Por Qué los Corredores de Inmuebles Deben Usar Códigos QR?
### **Ventajas Comprobadas**
- ✅ **Captación 24/7**: Tu cartel trabaja para ti incluso cuando estás durmiendo
- ✅ **Contacto Instantáneo**: Cliente escanea y ya está en tu WhatsApp
- ✅ **Cero Escritura**: Elimina errores al anotar números
- ✅ **Rastreo**: Sabe cuántas personas se interesaron
- ✅ **Profesionalismo**: Demuestra modernidad e innovación
- ✅ **Costo Cero**: Genera códigos QR ilimitados gratuitamente
- ✅ **Tour Virtual**: Lleva al cliente dentro del inmueble virtualmente
### **Estadísticas del Mercado**
Según estudios del sector inmobiliario:
- **78%** de los compradores investigan propiedades por celular
- **65%** prefieren contacto vía WhatsApp en lugar de llamada
- **43%** escanean códigos QR en carteles de inmuebles cuando los ven
- Corredores que usan código QR tienen **35% más leads** mensuales
---
## Dónde Aplicar Códigos QR en Marketing Inmobiliario
### **1. Carteles de "Se Vende" y "Se Alquila"**
**¡El uso más poderoso!** El cartel al frente del inmueble es visto por cientos de personas diariamente.
**Qué colocar en el código QR:**
- Link directo a tu WhatsApp
- vCard con tus contactos completos
- Tour virtual 360° del inmueble
- Ficha técnica detallada (PDF)
- Video del inmueble en YouTube
**Consejo profesional**: Coloca texto llamativo como:
- "Escanea y agenda tu visita AHORA"
- "Tour Virtual - Apunta tu cámara aquí"
- "WhatsApp Directo del Corredor"
### **2. Etiquetas Adhesivas y Tags**
Etiquetas pequeñas (5x5cm hasta 10x10cm) son perfectas para:
**Aplicaciones:**
- Pegar en autos de la inmobiliaria
- Fijar en portones de inmuebles
- Aplicar en vitrinas de locales
- Distribuir en establecimientos asociados
- Colocar en ascensores de edificios
**Ventajas:**
- Bajo costo de impresión
- Fácil distribución masiva
- Pueden ser cambiadas rápidamente
- Óptimas para acciones promocionales
### **3. Volantes y Flyers**
¡Transforma volantes de papel en herramientas digitales!
**Dónde aplicar:**
- Esquina superior derecha (lugar de mayor atención)
- Centro, si es el foco principal
- Reverso, con llamada destacada
**Contenido recomendado:**
- Portafolio digital de inmuebles
- Formulario de registro
- Calculadora de financiamiento
- Lista completa de propiedades disponibles
### **4. Folders y Revistas Inmobiliarias**
Materiales impresos premium merecen códigos QR estratégicos.
**Uso ideal:**
- 1 QR por inmueble destacado
- QR en la portada para portafolio completo
- QR en la contraportada con tus contactos
- QR en cada página con más información
### **5. Tarjetas de Visita**
¡El clásico nunca pasa de moda, pero puede ser mejorado!
**Código QR en la tarjeta permite:**
- Guardar contacto automáticamente (vCard)
- Ver portafolio online
- Agendar reunión directo en la agenda
- Enviar mensaje vía WhatsApp
### **6. Firma de Email**
¡Cada email que envías es una oportunidad!
**Incluye código QR para:**
- Tu vCard completo
- Último lanzamiento inmobiliario
- Evaluación gratuita de inmueble
- Agendamiento de visitas
---
## Paso a Paso: Cómo Crear Código QR para Corredores
Voy a mostrar cómo crear **3 tipos de códigos QR** esenciales para corredores:
### **Tipo 1: Código QR de vCard (Tarjeta de Visita Digital)**
Perfecto para: Tarjetas de visita, firma de email, credenciales
**[INSERTAR IMAGEN 1 AQUÍ: Selección del tipo de código QR - vCard destacado]**
#### Paso 1: Selecciona "Tarjeta de Visita"
Accede al generador y elige la opción **Tarjeta de Visita** en el menú de tipos.
#### Paso 2: Completa tus Datos Profesionales
**Información obligatoria:**
- **Nombre completo**: Juan Silva
- **Cargo**: Corredor de Inmuebles - Matrícula 12345
- **Empresa**: Inmobiliaria Success
- **Teléfono**: +1 555 123-4567
- **Email**: juan.silva@inmuebles.com
- **Website**: www.juansilva.inmuebles.com
**Campos opcionales estratégicos:**
- WhatsApp Business
- Instagram profesional
- LinkedIn
- Canal de YouTube con tours virtuales
#### Paso 3: Genera y Descarga
Haz clic en **"Generar Código QR"** y descarga en alta resolución.
**Dónde usar este QR:**
- Etiquetas adhesivas en el auto
- Tarjetas de visita
- Firma de email
- Credencial profesional
---
### **Tipo 2: Código QR para WhatsApp Directo**
Perfecto para: Carteles de inmuebles, volantes, anuncios
**[INSERTAR IMAGEN 3 AQUÍ: Formulario de WhatsApp con código QR completado]**
#### Paso 1: Selecciona "WhatsApp"
En el generador, elige la opción **WhatsApp** (o SMS si prefieres).
#### Paso 2: Configura el Mensaje Pre-llenado
**Ejemplo de mensaje eficaz:**
```
¡Hola! Vi el cartel del inmueble en [CALLE/BARRIO] y me gustaría agendar una visita. ¿Puede pasarme más información?
```
**Por qué el mensaje pre-llenado funciona:**
- Cliente no necesita pensar qué escribir
- Ya sabes de qué inmueble está hablando
- Aumenta en 80% la tasa de conversión
#### Paso 3: Personaliza para Cada Inmueble
**Consejo importante**: ¡Crea códigos QR diferentes para cada inmueble!
Ejemplo para apartamento en Recoleta:
```
¡Hola! Vi el cartel del Departamento 3 dormitorios en Recoleta (Ref: DEPT-001). Me gustaría saber más detalles y agendar visita.
```
**Ventaja**: ¡Ya sabes exactamente qué inmueble quiere ver el cliente!
---
### **Tipo 3: Código QR para URL (Tour Virtual / Ficha Técnica)**
Perfecto para: Inmuebles de alto estándar, lanzamientos, propiedades rurales
**[INSERTAR IMAGEN 4 AQUÍ: Ejemplo de formulario URL completado]**
#### Paso 1: Prepara el Contenido Digital
Antes de crear el QR, necesitas tener:
**Opción A - Tour Virtual:**
- Video en YouTube del inmueble
- Tour 360° (Google Street View, Matterport)
- Galería de fotos en Instagram/Facebook
**Opción B - Landing Page:**
- Ficha técnica completa del inmueble
- Fotos en alta resolución
- Mapa de ubicación
- Calculadora de financiamiento
- Formulario de interés
#### Paso 2: Acorta la URL (¡Importante!)
Usa acortadores como:
- bit.ly
- tinyurl.com
- QR Rapido (si tiene función de acortamiento)
**Ejemplo:**
- ❌ URL larga: `https://www.miinmobiliaria.com/inmuebles/departamento-3-dormitorios-recoleta-ref-dept001?utm_source=cartel`
- ✅ URL corta: `bit.ly/dept-recoleta-001`
**Ventaja de URL corta**: Genera código QR más simple y fácil de escanear
#### Paso 3: Crea el Código QR
Pega la URL corta en el campo **URL/Link** y genera el código.
---
## Cómo Personalizar tu Código QR Profesionalmente
**[INSERTAR IMAGEN 2 AQUÍ: Panel de personalización con colores personalizados]**
### **Elección de Colores Estratégicos**
**Para Inmobiliarias Tradicionales:**
- Azul marino + Blanco (confianza, seriedad)
- Negro + Dorado (lujo, exclusividad)
- Verde oscuro + Blanco (crecimiento, estabilidad)
**Para Inmobiliarias Modernas:**
- Naranja + Blanco (energía, innovación)
- Púrpura + Blanco (creatividad, diferenciación)
- Rojo + Blanco (urgencia, acción)
**Regla de oro**: ¡Siempre mantén alto contraste entre color principal y fondo!
### **Tamaños Recomendados por Aplicación**
**Carteles de calle (distancia 2-5 metros):**
- Código QR: 15x15cm o mayor
- Resolución: 500px mínimo
**Volantes A5/A4:**
- Código QR: 4x4cm a 6x6cm
- Resolución: 300px
**Etiquetas adhesivas:**
- Código QR: 5x5cm (tamaño del adhesivo)
- Resolución: 300px
**Tarjetas de visita:**
- Código QR: 2,5x2,5cm
- Resolución: 200px
### **Agrega Llamadas a la Acción (CTA)**
¡Nunca coloques solo el código QR! Agrega texto atractivo:
**Ejemplos eficaces:**
- 📱 "Apunta la cámara y habla conmigo en WhatsApp"
- 🏠 "Tour Virtual 360° - Escanea Aquí"
- 💬 "Agenda tu Visita Ahora"
- 📋 "Ve Fotos y Detalles Completos"
- 🎯 "Guarda Mi Contacto Automáticamente"
---
## Estrategias Avanzadas para Corredores
### **1. Códigos QR Rastreables (Dinámicos)**
Usa servicios de código QR dinámico para:
- Saber cuántas personas escanearon
- Ver horario de los escaneos
- Identificar ubicación aproximada
- Cambiar el destino sin reimprimir
**Cuándo usar:**
- Campañas con muchos materiales impresos
- Pruebas A/B de diferentes enfoques
- Carteles permanentes en inmuebles
### **2. Múltiples Códigos QR en el Mismo Cartel**
¿Cartel grande? ¡Usa 2-3 códigos QR diferentes!
**Ejemplo de cartel completo:**
- **QR 1** (arriba): "Habla en WhatsApp"
- **QR 2** (centro): "Tour Virtual 360°"
- **QR 3** (abajo): "Guarda Mi Contacto"
**Ventaja**: Cliente elige la acción que prefiere hacer
### **3. Código QR + Realidad Aumentada**
Para lanzamientos y emprendimientos:
- Código QR lleva a app de RA
- Cliente apunta celular y ve el edificio terminado
- Visualiza departamento decorado
- ¡Extremadamente impactante!
### **4. Campañas de Temporada**
Crea códigos QR específicos para:
- **Enero**: "Planifica este año - Compra tu inmueble"
- **Junio**: "Vacaciones en tu Nuevo Hogar"
- **Noviembre**: "Black Friday Inmobiliaria"
- **Diciembre**: "Empieza el Año en Casa Propia"
### **5. Alianzas Estratégicas**
Distribuye etiquetas con código QR en:
- Tiendas de materiales de construcción
- Oficinas de arquitectura
- Gestorías y escribanías
- Gimnasios y restaurantes del barrio
- Edificios comerciales (tablero de avisos)
---
## Modelos de Etiquetas Adhesivas Profesionales
### **Modelo 1: Etiqueta Minimalista (5x5cm)**
```
┌─────────────────┐
│ [CÓDIGO QR] │
│ │
│ Juan Silva │
│ Matrícula 12345 │
│ (555) 123-4567 │
└─────────────────┘
```
### **Modelo 2: Etiqueta con Destaque (7x7cm)**
```
┌─────────────────────┐
│ VENDE TU INMUEBLE │
│ SIN BUROCRACIA │
│ │
│ [CÓDIGO QR] │
│ │
│ "Escanea y habla │
│ directo conmigo" │
│ │
│ Juan Silva │
│ Corredor Mat. XXXX │
└─────────────────────┘
```
### **Modelo 3: Etiqueta Tour Virtual (10x10cm)**
```
┌───────────────────────────┐
│ TOUR VIRTUAL 360° │
│ Visita este inmueble │
│ ¡sin salir del sofá! │
│ │
│ [CÓDIGO QR GRANDE] │
│ │
│ 📱 Apunta tu cámara │
│ │
│ Inmobiliaria Success │
│ (555) 123-4567 │
└───────────────────────────┘
```
---
## Mejores Prácticas de Impresión
### **Materiales Recomendados**
**Para carteles externos:**
- **Vinilo adhesivo resistente a UV**
- **Lona con impresión UV**
- **ACM (Aluminio Compuesto)**
Duración: 2-3 años expuestos al sol
**Para etiquetas adhesivas:**
- **Papel BOPP (Polipropileno)**
- **Vinilo blanco brillante**
- **Papel couché con laminación**
Duración: 6-12 meses
**Para volantes:**
- **Couché 115g o 150g**
- **Barniz localizado en el código QR** (destaque)
### **Pruebas Antes de Imprimir en Masa**
⚠️ **SIEMPRE haz esto:**
1. Imprime 1 muestra en tamaño real
2. Prueba con 5 celulares diferentes
3. Prueba a diferentes distancias
4. Prueba con poca luz
5. Solo entonces imprime grandes cantidades
**Celulares para probar:**
- iPhone (iOS actualizado)
- Samsung (Android)
- Xiaomi o Motorola (Android popular)
### **Dónde Imprimir**
**Imprentas rápidas locales:**
- Etiquetas adhesivas: consulta precios en tu zona
- Volantes A5: consulta precios en tu zona
**Online (más económico):**
- Marketplaces locales
- Imprentas con pedido online
**Consejo**: ¡Pide presupuesto en 3 lugares diferentes!
---
## Errores Comunes que Corredores Deben Evitar
### ❌ **Error 1: Código QR Muy Pequeño**
**Problema**: En carteles de calle vistos de lejos, QR pequeño no funciona
**Solución**: Mínimo 15x15cm para carteles externos
### ❌ **Error 2: Colores con Bajo Contraste**
**Problema**: QR amarillo en fondo blanco no escanea
**Solución**: Usa siempre colores oscuros en fondo claro (o viceversa)
### ❌ **Error 3: No Probar Antes de Imprimir**
**Problema**: Imprime 1000 volantes y descubre que QR no funciona
**Solución**: Siempre prueba impresión piloto
### ❌ **Error 4: URL Rota o Temporal**
**Problema**: Link del inmueble expira, QR queda inútil
**Solución**: Usa URLs permanentes o QR dinámico editable
### ❌ **Error 5: Sin Instrucción de Uso**
**Problema**: Persona mayor no sabe qué hacer con el QR
**Solución**: Agrega "Apunta la cámara del celular aquí"
### ❌ **Error 6: Código QR Único para Todos los Inmuebles**
**Problema**: No sabes qué inmueble generó el lead
**Solución**: Crea QR específico para cada propiedad
### ❌ **Error 7: Material de Baja Calidad**
**Problema**: Etiqueta se desvanece en 1 mes al sol
**Solución**: Invierte en material UV resistente
---
## Casos de Éxito
### **Caso 1: Corredor en zona urbana**
**Estrategia**: Colocó código QR en todos los 12 carteles de inmuebles
**Resultado:**
- 98 escaneos en el primer mes
- 28 conversaciones en WhatsApp
- 7 visitas agendadas
- 2 ventas cerradas
**ROI**: Invirtió en etiquetas, facturó comisiones significativas
### **Caso 2: Inmobiliaria en ciudad grande**
**Estrategia**: Volantes con QR para tour virtual de lanzamiento
**Resultado:**
- 3.000 volantes distribuidos
- 645 accesos al tour virtual
- 112 registros de interesados
- 18 departamentos vendidos en preventa
### **Caso 3: Corredor Autónomo**
**Estrategia**: Etiquetas adhesivas en establecimientos asociados
**Resultado:**
- 150 etiquetas distribuidas en 30 locales
- 52 nuevos contactos en 3 meses
- 9 evaluaciones de inmuebles agendadas
- 2 captaciones exclusivas
---
## Preguntas Frecuentes
### **¿Necesito pagar para crear código QR?**
¡No! En QR Rapido creas códigos QR ilimitados gratuitamente. Solo pagas si quieres recursos premium como rastreo avanzado.
### **¿El código QR funciona para siempre?**
Códigos QR estáticos (gratuitos) funcionan para siempre, pero no pueden ser editados. Códigos QR dinámicos (pagos) pueden ser editados incluso después de impresos.
### **¿Qué tipo de QR usar en carteles de inmuebles?**
Recomiendo **WhatsApp** con mensaje pre-llenado. Así el cliente ya inicia la conversación sabiendo de qué inmueble se trata.
### **¿Puedo colocar logo de la inmobiliaria en el QR?**
Sí, ¡pero con cuidado! Logos muy grandes pueden dificultar la lectura. Mantén el logo pequeño (máximo 20% del QR).
### **¿Cuántas personas escanean QR en carteles?**
Según investigaciones, entre 5-15% de las personas que ven el cartel escanean el QR. En áreas movimentadas, esto puede generar decenas de leads por mes.
### **¿El código QR funciona de noche?**
Sí, siempre que haya alguna iluminación (poste de calle, luz de la pantalla del celular ya ayuda). Para mejor resultado, ilumina el cartel.
### **¿Puedo usar el mismo QR en varios materiales?**
Puedes, pero no es recomendado. Crea códigos QR diferentes para saber de dónde viene cada lead (cartel, volante, etiqueta, etc).
---
## Checklist del Corredor Profesional
Antes de imprimir, verifica:
- [ ] Código QR probado en al menos 3 celulares diferentes
- [ ] Tamaño adecuado para la distancia de escaneo
- [ ] Alto contraste entre QR y fondo
- [ ] Llamada a la acción clara ("Escanea aquí")
- [ ] Información de contacto visible (nombre, matrícula, teléfono)
- [ ] URL corta si es link (más fácil de escanear)
- [ ] Material de impresión resistente (especialmente externo)
- [ ] Margen de seguridad alrededor del QR (mínimo 1cm)
---
## Conclusión
Los códigos QR son la **herramienta más económica y eficaz** para corredores modernos captar leads calificados. Con una pequeña inversión en etiquetas y volantes, puedes:
✅ Captar leads 24 horas al día
✅ Facilitar el contacto instantáneo vía WhatsApp
✅ Mostrar tours virtuales impresionantes
✅ Rastrear qué materiales generan más resultado
✅ Destacarte de la competencia conservadora
**El mercado inmobiliario está cada vez más digital. Quien no se adapta, queda atrás.**
---
## ¡Empieza Ahora!
**Crea tu primer código QR para corredor gratuitamente:**
1. [Generar Código QR de WhatsApp](/) - Para carteles de inmuebles
2. [Generar Código QR vCard](/) - Para tarjetas de visita
3. [Generar Código QR de URL](/) - Para tour virtual
**¡Transforma tus carteles y volantes en máquinas de captar leads!** 🏠📱🚀

View File

@ -16,7 +16,6 @@ namespace QRRapidoApp.Controllers
} }
[Route("Developer/docs")] [Route("Developer/docs")]
[Route("es-PY/Developer/docs")]
[Route("es/Developer/docs")] [Route("es/Developer/docs")]
[Route("en/Developer/docs")] [Route("en/Developer/docs")]
public async Task<IActionResult> Index() public async Task<IActionResult> Index()
@ -28,7 +27,6 @@ namespace QRRapidoApp.Controllers
} }
[Route("Developer/docs/{slug}")] [Route("Developer/docs/{slug}")]
[Route("es-PY/Developer/docs/{slug}")]
[Route("es/Developer/docs/{slug}")] [Route("es/Developer/docs/{slug}")]
[Route("en/Developer/docs/{slug}")] [Route("en/Developer/docs/{slug}")]
public async Task<IActionResult> Article(string slug) public async Task<IActionResult> Article(string slug)
@ -56,7 +54,6 @@ namespace QRRapidoApp.Controllers
private string GetCulture() private string GetCulture()
{ {
var path = Request.Path.Value ?? ""; var path = Request.Path.Value ?? "";
if (path.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) return "es-PY";
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) || if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es"; string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) || if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ||

View File

@ -8,7 +8,6 @@ namespace QRRapidoApp.Controllers
{ {
[Authorize] [Authorize]
[Route("Developer")] [Route("Developer")]
[Route("es-PY/Developer")]
[Route("es/Developer")] [Route("es/Developer")]
[Route("en/Developer")] [Route("en/Developer")]
public class DeveloperController : Controller public class DeveloperController : Controller
@ -143,7 +142,6 @@ namespace QRRapidoApp.Controllers
private string GetCulture() private string GetCulture()
{ {
var path = Request.Path.Value ?? ""; var path = Request.Path.Value ?? "";
if (path.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) return "es-PY";
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) || if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es"; string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) || if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ||
@ -154,7 +152,6 @@ namespace QRRapidoApp.Controllers
private string GetDevUrl(string action = "") private string GetDevUrl(string action = "")
{ {
var base_ = GetCulture() switch { var base_ = GetCulture() switch {
"es-PY" => "/es-PY/Developer",
"es" => "/es/Developer", "es" => "/es/Developer",
"en" => "/en/Developer", "en" => "/en/Developer",
_ => "/Developer" _ => "/Developer"

View File

@ -35,10 +35,10 @@ namespace QRRapidoApp.Controllers
// Home page routes // Home page routes
// "/" → Portuguese (canonical) // "/" → Portuguese (canonical)
// "/es-PY" → Spanish // "/es" → Spanish
[HttpGet] [HttpGet]
[Route("/")] [Route("/")]
[Route("es-PY")] [Route("es")]
[Route("en")] [Route("en")]
public async Task<IActionResult> Index(string? qrType = null) public async Task<IActionResult> Index(string? qrType = null)
{ {
@ -113,47 +113,47 @@ namespace QRRapidoApp.Controllers
// Dedicated SEO Routes - Landing pages for each QR type // Dedicated SEO Routes - Landing pages for each QR type
// Portuguese (default): /pix, /wifi, etc. (no culture prefix) // Portuguese (default): /pix, /wifi, etc. (no culture prefix)
// Spanish: /es-PY/pix, /es-PY/wifi, etc. // Spanish: /es/pix, /es/wifi, etc.
[Route("pix")] [Route("pix")]
[Route("es-PY/pix")] [Route("es/pix")]
[Route("en/pix")] [Route("en/pix")]
public async Task<IActionResult> Pix() => await Index("pix"); public async Task<IActionResult> Pix() => await Index("pix");
[Route("wifi")] [Route("wifi")]
[Route("es-PY/wifi")] [Route("es/wifi")]
[Route("en/wifi")] [Route("en/wifi")]
public async Task<IActionResult> Wifi() => await Index("wifi"); public async Task<IActionResult> Wifi() => await Index("wifi");
[Route("vcard")] [Route("vcard")]
[Route("es-PY/vcard")] [Route("es/vcard")]
[Route("en/vcard")] [Route("en/vcard")]
public async Task<IActionResult> VCard() => await Index("vcard"); public async Task<IActionResult> VCard() => await Index("vcard");
[Route("whatsapp")] [Route("whatsapp")]
[Route("es-PY/whatsapp")] [Route("es/whatsapp")]
[Route("en/whatsapp")] [Route("en/whatsapp")]
public async Task<IActionResult> WhatsApp() => await Index("whatsapp"); public async Task<IActionResult> WhatsApp() => await Index("whatsapp");
[Route("email")] [Route("email")]
[Route("es-PY/email")] [Route("es/email")]
[Route("en/email")] [Route("en/email")]
public async Task<IActionResult> Email() => await Index("email"); public async Task<IActionResult> Email() => await Index("email");
[Route("sms")] [Route("sms")]
[Route("es-PY/sms")] [Route("es/sms")]
[Route("en/sms")] [Route("en/sms")]
public async Task<IActionResult> Sms() => await Index("sms"); public async Task<IActionResult> Sms() => await Index("sms");
[Route("texto")] [Route("texto")]
[Route("text")] [Route("text")]
[Route("es-PY/texto")] [Route("es/texto")]
[Route("es-PY/text")] [Route("es/text")]
[Route("en/text")] [Route("en/text")]
public async Task<IActionResult> Text() => await Index("text"); public async Task<IActionResult> Text() => await Index("text");
[Route("url")] [Route("url")]
[Route("es-PY/url")] [Route("es/url")]
[Route("en/url")] [Route("en/url")]
public async Task<IActionResult> UrlType() => await Index("url"); public async Task<IActionResult> UrlType() => await Index("url");
@ -334,7 +334,7 @@ namespace QRRapidoApp.Controllers
// Core entry points // Core entry points
AppendUrl("/", "daily", "1.0"); AppendUrl("/", "daily", "1.0");
AppendUrl("/es-PY", "daily", "0.9"); AppendUrl("/es", "daily", "0.9");
// Tools (Landing Pages) // Tools (Landing Pages)
var tools = new[] { "pix", "wifi", "vcard", "whatsapp", "email", "sms", "texto", "url" }; var tools = new[] { "pix", "wifi", "vcard", "whatsapp", "email", "sms", "texto", "url" };
@ -342,7 +342,7 @@ namespace QRRapidoApp.Controllers
foreach (var tool in tools) foreach (var tool in tools)
{ {
AppendUrl($"/{tool}", "weekly", "0.9"); AppendUrl($"/{tool}", "weekly", "0.9");
AppendUrl($"/es-PY/{tool}", "weekly", "0.8"); AppendUrl($"/es/{tool}", "weekly", "0.8");
} }
// Informational pages // Informational pages
@ -359,7 +359,7 @@ namespace QRRapidoApp.Controllers
foreach (var page in informationalPages) foreach (var page in informationalPages)
{ {
AppendUrl($"/{page.Path}", page.ChangeFreq, page.Priority); AppendUrl($"/{page.Path}", page.ChangeFreq, page.Priority);
AppendUrl($"/es-PY/{page.Path}", page.ChangeFreq, page.Priority); AppendUrl($"/es/{page.Path}", page.ChangeFreq, page.Priority);
} }
// Dynamic tutorial pages from Markdown // Dynamic tutorial pages from Markdown
@ -379,7 +379,7 @@ namespace QRRapidoApp.Controllers
var tutorialPath = article.Culture == "pt-BR" var tutorialPath = article.Culture == "pt-BR"
? $"/tutoriais/{encodedSlug}" ? $"/tutoriais/{encodedSlug}"
: $"/es-PY/tutoriais/{encodedSlug}"; : $"/es/tutoriais/{encodedSlug}";
var lastMod = article.LastMod.ToString("yyyy-MM-dd"); var lastMod = article.LastMod.ToString("yyyy-MM-dd");
AppendUrl(tutorialPath, "weekly", "0.8", lastMod); AppendUrl(tutorialPath, "weekly", "0.8", lastMod);

View File

@ -28,10 +28,9 @@ namespace QRRapidoApp.Controllers
} }
// Portuguese: /tutoriais/{slug} (canonical, no prefix) // Portuguese: /tutoriais/{slug} (canonical, no prefix)
// Spanish: /es-PY/tutoriais/{slug} // Spanish: /es/tutoriais/{slug}
// English: /en/tutoriais/{slug} // English: /en/tutoriais/{slug}
[Route("tutoriais/{slug}")] [Route("tutoriais/{slug}")]
[Route("es-PY/tutoriais/{slug}")]
[Route("es/tutoriais/{slug}")] [Route("es/tutoriais/{slug}")]
[Route("en/tutoriais/{slug}")] [Route("en/tutoriais/{slug}")]
public async Task<IActionResult> Article(string slug, string? culture = null) public async Task<IActionResult> Article(string slug, string? culture = null)
@ -40,9 +39,8 @@ namespace QRRapidoApp.Controllers
{ {
// Determine culture from URL path if not provided // Determine culture from URL path if not provided
var reqPath = Request.Path.Value ?? ""; var reqPath = Request.Path.Value ?? "";
culture ??= reqPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) ? "es-PY" culture ??= reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
: reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es" : reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
: "pt-BR"; : "pt-BR";
var article = await _markdownService.GetArticleAsync(slug, culture); var article = await _markdownService.GetArticleAsync(slug, culture);
@ -91,10 +89,9 @@ namespace QRRapidoApp.Controllers
} }
// Portuguese: /tutoriais (canonical, no prefix) // Portuguese: /tutoriais (canonical, no prefix)
// Spanish: /es-PY/tutoriais // Spanish: /es/tutoriais
// English: /en/tutoriais // English: /en/tutoriais
[Route("tutoriais")] [Route("tutoriais")]
[Route("es-PY/tutoriais")]
[Route("es/tutoriais")] [Route("es/tutoriais")]
[Route("en/tutoriais")] [Route("en/tutoriais")]
public async Task<IActionResult> Index(string? culture = null) public async Task<IActionResult> Index(string? culture = null)
@ -103,9 +100,8 @@ namespace QRRapidoApp.Controllers
{ {
// Determine culture from URL path if not provided // Determine culture from URL path if not provided
var reqPath = Request.Path.Value ?? ""; var reqPath = Request.Path.Value ?? "";
culture ??= reqPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) ? "es-PY" culture ??= reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
: reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es" : reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
: "pt-BR"; : "pt-BR";
var articles = await _markdownService.GetAllArticlesAsync(culture); var articles = await _markdownService.GetAllArticlesAsync(culture);

View File

@ -9,7 +9,7 @@ namespace QRRapidoApp.Middleware
/// Comportamento: /// Comportamento:
/// - "/" → Retorna 200 OK em Português (canonical) /// - "/" → Retorna 200 OK em Português (canonical)
/// - "/pt-BR" ou "/pt-BR/*" → Redireciona 301 para "/" ou "/*" (sem prefixo) /// - "/pt-BR" ou "/pt-BR/*" → Redireciona 301 para "/" ou "/*" (sem prefixo)
/// - "/es-PY" ou "/es-PY/*" → Retorna 200 OK em Espanhol (mantém URL) /// - "/es" ou "/es/*" → Retorna 200 OK em Espanhol (mantém URL)
/// - "/en" ou "/en/*" → Retorna 200 OK em Inglês (mantém URL) /// - "/en" ou "/en/*" → Retorna 200 OK em Inglês (mantém URL)
/// - "/pix", "/wifi", etc. → Retorna 200 OK em Português (sem redirect) /// - "/pix", "/wifi", etc. → Retorna 200 OK em Português (sem redirect)
/// </summary> /// </summary>
@ -17,7 +17,7 @@ namespace QRRapidoApp.Middleware
{ {
private readonly RequestDelegate _next; private readonly RequestDelegate _next;
private readonly ILogger<LanguageRedirectionMiddleware> _logger; private readonly ILogger<LanguageRedirectionMiddleware> _logger;
private readonly string[] _supportedCultures = { "pt-BR", "es-PY", "es", "en" }; private readonly string[] _supportedCultures = { "pt-BR", "es", "en" };
private const string DefaultCulture = "pt-BR"; private const string DefaultCulture = "pt-BR";
private const string CookieName = ".AspNetCore.Culture"; private const string CookieName = ".AspNetCore.Culture";
@ -69,14 +69,6 @@ namespace QRRapidoApp.Middleware
return; return;
} }
// Supported: es-PY
if (string.Equals(firstSegment, "es-PY", StringComparison.OrdinalIgnoreCase))
{
SetCulture(context, "es-PY");
await _next(context);
return;
}
// Supported: es (Spanish neutral) // Supported: es (Spanish neutral)
if (string.Equals(firstSegment, "es", StringComparison.OrdinalIgnoreCase)) if (string.Equals(firstSegment, "es", StringComparison.OrdinalIgnoreCase))
{ {
@ -117,7 +109,7 @@ namespace QRRapidoApp.Middleware
{ {
// Map known aliases to canonical forms // Map known aliases to canonical forms
if (string.Equals(firstSegment, "es-py", StringComparison.OrdinalIgnoreCase)) if (string.Equals(firstSegment, "es-py", StringComparison.OrdinalIgnoreCase))
return RedirectToLanguage(context, "es-PY", segments); return RedirectToLanguage(context, "es", segments);
if (string.Equals(firstSegment, "en-us", StringComparison.OrdinalIgnoreCase) || if (string.Equals(firstSegment, "en-us", StringComparison.OrdinalIgnoreCase) ||
string.Equals(firstSegment, "en-gb", StringComparison.OrdinalIgnoreCase)) string.Equals(firstSegment, "en-gb", StringComparison.OrdinalIgnoreCase))

View File

@ -224,7 +224,6 @@ builder.Services.Configure<RequestLocalizationOptions>(options =>
var supportedCultures = new[] var supportedCultures = new[]
{ {
new CultureInfo("pt-BR"), new CultureInfo("pt-BR"),
new CultureInfo("es-PY"),
new CultureInfo("es"), new CultureInfo("es"),
new CultureInfo("en"), new CultureInfo("en"),
}; };
@ -464,7 +463,7 @@ app.MapHealthChecks("/healthcheck");
// Language routes (must be first for WEB) // Language routes (must be first for WEB)
app.MapControllerRoute( app.MapControllerRoute(
name: "localized", name: "localized",
pattern: "{culture:regex(^(pt-BR|es-PY|es|en)$)}/{controller=Home}/{action=Index}/{id?}"); pattern: "{culture:regex(^(pt-BR|es|en)$)}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute( app.MapControllerRoute(
name: "api_v1", name: "api_v1",

View File

@ -6,10 +6,10 @@ namespace QRRapidoApp.Providers
{ {
public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext) public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext)
{ {
// First check if the middleware has already determined the culture (e.g. for static routes like /es-PY/pix) // First check if the middleware has already determined the culture (e.g. for static routes like /es/pix)
if (httpContext.Items.TryGetValue("Culture", out var cultureItem) && cultureItem is string cultureFromMiddleware) if (httpContext.Items.TryGetValue("Culture", out var cultureItem) && cultureItem is string cultureFromMiddleware)
{ {
var supportedCultures = new[] { "pt-BR", "es-PY", "en" }; var supportedCultures = new[] { "pt-BR", "es", "en" };
if (supportedCultures.Contains(cultureFromMiddleware)) if (supportedCultures.Contains(cultureFromMiddleware))
{ {
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(cultureFromMiddleware, cultureFromMiddleware)); return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(cultureFromMiddleware, cultureFromMiddleware));
@ -24,7 +24,7 @@ namespace QRRapidoApp.Providers
if (!string.IsNullOrEmpty(culture)) if (!string.IsNullOrEmpty(culture))
{ {
// Map the supported cultures // Map the supported cultures
var supportedCultures = new[] { "pt-BR", "es-PY", "en" }; var supportedCultures = new[] { "pt-BR", "es", "en" };
if (supportedCultures.Contains(culture)) if (supportedCultures.Contains(culture))
{ {
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(culture, culture)); return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(culture, culture));

File diff suppressed because it is too large Load Diff

View File

@ -4,8 +4,8 @@
Layout = "~/Views/Shared/_Layout.cshtml"; Layout = "~/Views/Shared/_Layout.cshtml";
var isEn = (ViewBag.Culture as string) == "en"; var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es"; var isEs = (ViewBag.Culture as string) == "es";
var devBase = isEn ? "/en/Developer" : isEs ? "/es-PY/Developer" : "/Developer"; var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
var slug = ViewBag.Slug as string; var slug = ViewBag.Slug as string;
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt; string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;

View File

@ -4,8 +4,8 @@
Layout = "~/Views/Shared/_Layout.cshtml"; Layout = "~/Views/Shared/_Layout.cshtml";
var isEn = (ViewBag.Culture as string) == "en"; var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es"; var isEs = (ViewBag.Culture as string) == "es";
var devBase = isEn ? "/en/Developer" : isEs ? "/es-PY/Developer" : "/Developer"; var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt; string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
} }

View File

@ -13,8 +13,8 @@
var baseUrl = Context.Request.Scheme + "://" + Context.Request.Host; var baseUrl = Context.Request.Scheme + "://" + Context.Request.Host;
var isEn = (ViewBag.Culture as string) == "en"; var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es"; var isEs = (ViewBag.Culture as string) == "es";
var docsBase = isEn ? "/en/Developer" : isEs ? "/es-PY/Developer" : "/Developer"; var docsBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt; string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
} }

View File

@ -6,8 +6,8 @@
var currentTier = ViewBag.CurrentTier as ApiPlanTier? ?? ApiPlanTier.Free; var currentTier = ViewBag.CurrentTier as ApiPlanTier? ?? ApiPlanTier.Free;
var errorMsg = TempData["Error"] as string; var errorMsg = TempData["Error"] as string;
var isEn = (ViewBag.Culture as string) == "en"; var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es"; var isEs = (ViewBag.Culture as string) == "es";
var devBase = isEn ? "/en/Developer" : isEs ? "/es-PY/Developer" : "/Developer"; var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt; string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
} }

View File

@ -4,6 +4,10 @@
@{ @{
ViewData["Title"] = "Comprar Créditos"; ViewData["Title"] = "Comprar Créditos";
Layout = "~/Views/Shared/_Layout.cshtml"; Layout = "~/Views/Shared/_Layout.cshtml";
var reqPath = Context.Request.Path.Value ?? "";
var isBrazilian = !reqPath.StartsWith("/en", StringComparison.OrdinalIgnoreCase)
&& !reqPath.StartsWith("/es", StringComparison.OrdinalIgnoreCase);
} }
<div class="container py-5"> <div class="container py-5">
@ -34,10 +38,13 @@
<!-- Preços Duplos --> <!-- Preços Duplos -->
<div class="bg-light rounded p-3 mb-4"> <div class="bg-light rounded p-3 mb-4">
<div class="d-flex justify-content-between align-items-center mb-2"> @if (isBrazilian)
<span class="text-muted"><i class="fas fa-bolt text-warning"></i> PIX</span> {
<span class="h4 text-success mb-0 fw-bold">R$ @package.PricePix.ToString("F2")</span> <div class="d-flex justify-content-between align-items-center mb-2">
</div> <span class="text-muted"><i class="fas fa-bolt text-warning"></i> PIX</span>
<span class="h4 text-success mb-0 fw-bold">R$ @package.PricePix.ToString("F2")</span>
</div>
}
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<span class="text-muted"><i class="fas fa-credit-card"></i> Cartão</span> <span class="text-muted"><i class="fas fa-credit-card"></i> Cartão</span>
<span class="h5 text-secondary mb-0">R$ @package.PriceCard.ToString("F2")</span> <span class="h5 text-secondary mb-0">R$ @package.PriceCard.ToString("F2")</span>
@ -53,10 +60,13 @@
@if (User.Identity.IsAuthenticated) @if (User.Identity.IsAuthenticated)
{ {
<div class="d-grid gap-2 mt-auto"> <div class="d-grid gap-2 mt-auto">
<button class="btn btn-outline-success btn-pix-checkout" @if (isBrazilian)
data-package-id="@package.Id"> {
<i class="fas fa-qrcode me-2"></i> Pagar com PIX <button class="btn btn-outline-success btn-pix-checkout"
</button> data-package-id="@package.Id">
<i class="fas fa-qrcode me-2"></i> Pagar com PIX
</button>
}
<button class="btn @(package.IsPopular ? "btn-primary" : "btn-outline-primary") btn-card-checkout" <button class="btn @(package.IsPopular ? "btn-primary" : "btn-outline-primary") btn-card-checkout"
data-package-id="@package.Id"> data-package-id="@package.Id">
<i class="fas fa-credit-card me-2"></i> Pagar com Cartão <i class="fas fa-credit-card me-2"></i> Pagar com Cartão

View File

@ -20,18 +20,17 @@
// SEO: Determine current culture from URL // SEO: Determine current culture from URL
var requestPath = Context.Request.Path.Value ?? "/"; var requestPath = Context.Request.Path.Value ?? "/";
var isSpanish = requestPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) var isSpanish = requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase)
|| requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase)
|| string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase); || string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase);
var isEnglish = requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) var isEnglish = requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase)
|| string.Equals(requestPath, "/en", StringComparison.OrdinalIgnoreCase); || string.Equals(requestPath, "/en", StringComparison.OrdinalIgnoreCase);
// Get path without culture prefix for building alternate URLs // Get path without culture prefix for building alternate URLs
var pathWithoutCulture = requestPath; var pathWithoutCulture = requestPath;
if (requestPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) if (requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase))
pathWithoutCulture = requestPath.Length > 6 ? requestPath.Substring(6) : "/";
else if (requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase))
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/"; pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
else if (string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase))
pathWithoutCulture = "/";
else if (requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase)) else if (requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase))
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/"; pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
if (string.IsNullOrEmpty(pathWithoutCulture)) pathWithoutCulture = "/"; if (string.IsNullOrEmpty(pathWithoutCulture)) pathWithoutCulture = "/";
@ -40,16 +39,16 @@
var canonicalUrl = isEnglish var canonicalUrl = isEnglish
? $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}" ? $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
: isSpanish : isSpanish
? $"https://qrrapido.site/es-PY{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}" ? $"https://qrrapido.site/es{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
: $"https://qrrapido.site{pathWithoutCulture}"; : $"https://qrrapido.site{pathWithoutCulture}";
// Alternate URLs for hreflang // Alternate URLs for hreflang
var ptUrl = $"https://qrrapido.site{pathWithoutCulture}"; var ptUrl = $"https://qrrapido.site{pathWithoutCulture}";
var esUrl = $"https://qrrapido.site/es-PY{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"; var esUrl = $"https://qrrapido.site/es{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
var enUrl = $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"; var enUrl = $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
// Culture prefix for internal links // Culture prefix for internal links
var culturePrefix = isEnglish ? "/en" : isSpanish ? "/es-PY" : ""; var culturePrefix = isEnglish ? "/en" : isSpanish ? "/es" : "";
if (User?.Identity?.IsAuthenticated == true) if (User?.Identity?.IsAuthenticated == true)
{ {
@ -90,7 +89,7 @@
<!-- Hreflang for multilingual SEO --> <!-- Hreflang for multilingual SEO -->
<link rel="alternate" hreflang="pt-BR" href="@ptUrl"> <link rel="alternate" hreflang="pt-BR" href="@ptUrl">
<link rel="alternate" hreflang="es-PY" href="@esUrl"> <link rel="alternate" hreflang="es" href="@esUrl">
<link rel="alternate" hreflang="en" href="@enUrl"> <link rel="alternate" hreflang="en" href="@enUrl">
<link rel="alternate" hreflang="x-default" href="@ptUrl"> <link rel="alternate" hreflang="x-default" href="@ptUrl">
@ -324,7 +323,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" data-lang="pt-BR">🇧🇷 Português (Brasil)</a></li> <li><a class="dropdown-item" href="#" data-lang="pt-BR">🇧🇷 Português (Brasil)</a></li>
<li><a class="dropdown-item" href="#" data-lang="es-PY">🇵🇾 Español (Paraguay)</a></li> <li><a class="dropdown-item" href="#" data-lang="es">🌎 Español</a></li>
<li><a class="dropdown-item" href="#" data-lang="en">🇺🇸 English</a></li> <li><a class="dropdown-item" href="#" data-lang="en">🇺🇸 English</a></li>
</ul> </ul>
</div> </div>

View File

@ -3,7 +3,7 @@
Layout = "~/Views/Shared/_Layout.cshtml"; Layout = "~/Views/Shared/_Layout.cshtml";
ViewData["Title"] = Model.Metadata.Title; ViewData["Title"] = Model.Metadata.Title;
var isEn = (ViewBag.Culture as string) == "en"; var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es"; var isEs = (ViewBag.Culture as string) == "es";
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt; string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
var baseUrl = "https://qrrapido.site"; var baseUrl = "https://qrrapido.site";
var articleUrl = $"{baseUrl}/{ViewBag.Culture}/tutoriais/{ViewBag.Slug}"; var articleUrl = $"{baseUrl}/{ViewBag.Culture}/tutoriais/{ViewBag.Slug}";

View File

@ -1,7 +1,7 @@
@model List<QRRapidoApp.Models.ArticleMetadata> @model List<QRRapidoApp.Models.ArticleMetadata>
@{ @{
var isEn = (ViewBag.Culture as string) == "en"; var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es"; var isEs = (ViewBag.Culture as string) == "es";
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt; string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
ViewData["Title"] = T("Tutoriais QR Code", "Tutoriales Código QR", "QR Code Tutorials"); ViewData["Title"] = T("Tutoriais QR Code", "Tutoriales Código QR", "QR Code Tutorials");

View File

@ -1,22 +1,22 @@
// Language switching functionality for QR Rapido // Language switching functionality for QR Rapido
// SEO Strategy: // SEO Strategy:
// - Portuguese (pt-BR): URLs without prefix (/, /pix, /wifi, etc.) - canonical // - Portuguese (pt-BR): URLs without prefix (/, /pix, /wifi, etc.) - canonical
// - Spanish (es-PY): URLs with /es-PY prefix (/es-PY, /es-PY/pix, etc.) // - Spanish (es): URLs with /es prefix (/es, /es/pix, etc.)
// - English (en): URLs with /en prefix (/en, /en/pix, etc.) // - English (en): URLs with /en prefix (/en, /en/pix, etc.)
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
const languageDropdownItems = document.querySelectorAll('.dropdown-item[data-lang]'); const languageDropdownItems = document.querySelectorAll('.dropdown-item[data-lang]');
const currentLangSpan = document.getElementById('current-lang'); const currentLangSpan = document.getElementById('current-lang');
// Cultures that use a URL prefix // Cultures that use a URL prefix
const prefixedCultures = ['es-PY', 'en']; const prefixedCultures = ['es', 'en'];
// Get current culture from URL // Get current culture from URL
function getCurrentCulture() { function getCurrentCulture() {
const pathSegments = window.location.pathname.split('/').filter(segment => segment); const pathSegments = window.location.pathname.split('/').filter(segment => segment);
if (pathSegments.length > 0) { if (pathSegments.length > 0) {
const first = pathSegments[0].toLowerCase(); const first = pathSegments[0].toLowerCase();
if (first === 'es-py') return 'es-PY'; if (first === 'es-py' || first === 'es') return 'es';
if (first === 'en') return 'en'; if (first === 'en') return 'en';
} }
return 'pt-BR'; // Default — no prefix return 'pt-BR'; // Default — no prefix
@ -26,7 +26,7 @@ document.addEventListener('DOMContentLoaded', function () {
function updateCurrentLanguageDisplay(culture) { function updateCurrentLanguageDisplay(culture) {
const langMap = { const langMap = {
'pt-BR': 'PT', 'pt-BR': 'PT',
'es-PY': 'ES', 'es': 'ES',
'en': 'EN' 'en': 'EN'
}; };
if (currentLangSpan) { if (currentLangSpan) {
@ -44,7 +44,7 @@ document.addEventListener('DOMContentLoaded', function () {
let pathSegments = currentPath.split('/').filter(segment => segment); let pathSegments = currentPath.split('/').filter(segment => segment);
if (pathSegments.length > 0) { if (pathSegments.length > 0) {
const first = pathSegments[0].toLowerCase(); const first = pathSegments[0].toLowerCase();
if (first === 'es-py' || first === 'pt-br' || first === 'en') { if (first === 'es-py' || first === 'es' || first === 'pt-br' || first === 'en') {
pathSegments.shift(); pathSegments.shift();
} }
} }