fix: ajustes pt-BR e es-PY

This commit is contained in:
Ricardo Carneiro 2025-08-10 14:45:53 -03:00
parent 988a0115f3
commit e172969996
15 changed files with 1978 additions and 136 deletions

View File

@ -23,7 +23,8 @@
"Bash(dotnet remove package:*)", "Bash(dotnet remove package:*)",
"Bash(dotnet restore:*)", "Bash(dotnet restore:*)",
"Bash(rg:*)", "Bash(rg:*)",
"Bash(dotnet test:*)" "Bash(dotnet test:*)",
"Bash(cp:*)"
], ],
"deny": [] "deny": []
} }

View File

@ -50,11 +50,31 @@ namespace QRRapidoApp.Controllers
public IActionResult Privacy() public IActionResult Privacy()
{ {
var userId = User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
ViewBag.ShowAds = _adDisplayService.ShouldShowAds(userId).Result;
ViewBag.IsPremium = _adDisplayService.HasValidPremiumSubscription(userId ?? "").Result;
ViewBag.IsAuthenticated = User.Identity?.IsAuthenticated ?? false;
ViewBag.UserName = User.Identity?.Name ?? "";
ViewBag.Title = _localizer["PrivacyPolicyTitle"];
ViewBag.Description = _localizer["PrivacyPolicyDescription"];
return View(); return View();
} }
public IActionResult Terms() public IActionResult Terms()
{ {
var userId = User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
ViewBag.ShowAds = _adDisplayService.ShouldShowAds(userId).Result;
ViewBag.IsPremium = _adDisplayService.HasValidPremiumSubscription(userId ?? "").Result;
ViewBag.IsAuthenticated = User.Identity?.IsAuthenticated ?? false;
ViewBag.UserName = User.Identity?.Name ?? "";
ViewBag.Title = _localizer["TermsOfUseTitle"];
ViewBag.Description = _localizer["TermsOfUseDescription"];
return View(); return View();
} }
@ -117,6 +137,18 @@ namespace QRRapidoApp.Controllers
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<url>
<loc>https://qrrapido.site/privacy</loc>
<lastmod>{DateTime.UtcNow:yyyy-MM-dd}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://qrrapido.site/terms</loc>
<lastmod>{DateTime.UtcNow:yyyy-MM-dd}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
</urlset>"; </urlset>";
return Content(sitemap, "application/xml"); return Content(sitemap, "application/xml");

View File

@ -6,7 +6,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", "en" }; private readonly string[] _supportedCultures = { "pt-BR", "es-PY", "es" };
private const string DefaultCulture = "pt-BR"; private const string DefaultCulture = "pt-BR";
public LanguageRedirectionMiddleware(RequestDelegate next, ILogger<LanguageRedirectionMiddleware> logger) public LanguageRedirectionMiddleware(RequestDelegate next, ILogger<LanguageRedirectionMiddleware> logger)
@ -99,6 +99,13 @@ namespace QRRapidoApp.Middleware
// Check language part only (e.g., 'es' from 'es-AR') // Check language part only (e.g., 'es' from 'es-AR')
var languagePart = langCode.Split('-')[0]; var languagePart = langCode.Split('-')[0];
// Map 'es' to 'es-PY' specifically
if (string.Equals(languagePart, "es", StringComparison.OrdinalIgnoreCase))
{
return "es-PY";
}
var matchingCulture = _supportedCultures.FirstOrDefault(c => c.StartsWith(languagePart + "-") || c == languagePart); var matchingCulture = _supportedCultures.FirstOrDefault(c => c.StartsWith(languagePart + "-") || c == languagePart);
if (matchingCulture != null) if (matchingCulture != null)
{ {

View File

@ -8,6 +8,7 @@ using Microsoft.Extensions.Localization;
using MongoDB.Driver; using MongoDB.Driver;
using QRRapidoApp.Data; using QRRapidoApp.Data;
using QRRapidoApp.Middleware; using QRRapidoApp.Middleware;
using QRRapidoApp.Providers;
using QRRapidoApp.Services; using QRRapidoApp.Services;
using QRRapidoApp.Services.Monitoring; using QRRapidoApp.Services.Monitoring;
using QRRapidoApp.Services.HealthChecks; using QRRapidoApp.Services.HealthChecks;
@ -157,19 +158,20 @@ 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-PY"),
new CultureInfo("es")
}; };
options.DefaultRequestCulture = new RequestCulture("pt-BR", "pt-BR"); options.DefaultRequestCulture = new RequestCulture("pt-BR", "pt-BR");
options.SupportedCultures = supportedCultures; options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures; options.SupportedUICultures = supportedCultures;
options.FallBackToParentCultures = true; options.FallBackToParentCultures = false;
options.FallBackToParentUICultures = true; options.FallBackToParentUICultures = false;
// Clear default providers and add custom ones in priority order // Clear default providers and add custom ones in priority order
options.RequestCultureProviders.Clear(); options.RequestCultureProviders.Clear();
options.RequestCultureProviders.Add(new RouteDataRequestCultureProvider()); options.RequestCultureProviders.Add(new CustomRouteDataRequestCultureProvider());
options.RequestCultureProviders.Add(new QueryStringRequestCultureProvider()); options.RequestCultureProviders.Add(new QueryStringRequestCultureProvider());
options.RequestCultureProviders.Add(new CookieRequestCultureProvider()); options.RequestCultureProviders.Add(new CookieRequestCultureProvider());
}); });
@ -237,11 +239,11 @@ app.UseMiddleware<LanguageRedirectionMiddleware>();
app.UseRouting(); app.UseRouting();
app.UseCors("AllowSpecificOrigins"); // Localization middleware (after routing so route data is available)
// Localization middleware
app.UseRequestLocalization(); app.UseRequestLocalization();
app.UseCors("AllowSpecificOrigins");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
@ -266,7 +268,7 @@ app.MapHealthChecks("/health");
// Language routes (must be first) // Language routes (must be first)
app.MapControllerRoute( app.MapControllerRoute(
name: "localized", name: "localized",
pattern: "{culture:regex(^(pt-BR|es-PY)$)}/{controller=Home}/{action=Index}/{id?}"); pattern: "{culture:regex(^(pt-BR|es-PY|es)$)}/{controller=Home}/{action=Index}/{id?}");
// API routes // API routes
app.MapControllerRoute( app.MapControllerRoute(

View File

@ -0,0 +1,27 @@
using Microsoft.AspNetCore.Localization;
namespace QRRapidoApp.Providers
{
public class CustomRouteDataRequestCultureProvider : IRequestCultureProvider
{
public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext)
{
var routeValues = httpContext.GetRouteData()?.Values;
if (routeValues != null && routeValues.TryGetValue("culture", out var cultureValue))
{
var culture = cultureValue?.ToString();
if (!string.IsNullOrEmpty(culture))
{
// Map the supported cultures
var supportedCultures = new[] { "pt-BR", "es-PY" };
if (supportedCultures.Contains(culture))
{
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(culture, culture));
}
}
}
return Task.FromResult<ProviderCultureResult?>(null);
}
}
}

View File

@ -117,101 +117,872 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<!-- Content required keys from existing es.resx but adapted for Paraguay Spanish -->
<data name="Tagline" xml:space="preserve"> <data name="Tagline" xml:space="preserve">
<value>¡Genera códigos QR en segundos!</value> <value>¡Japo código QR pya'épe! (Genera códigos QR en segundos)</value>
</data> </data>
<data name="RequiredContent" xml:space="preserve"> <data name="GenerateQR" xml:space="preserve">
<value>Contenido es obligatorio</value> <value>Japo Código QR (Generar)</value>
</data> </data>
<data name="ContentTooLong" xml:space="preserve"> <data name="QRType" xml:space="preserve">
<value>Contenido muy largo. Máximo 4000 caracteres.</value> <value>Mba'éichapa código QR (Tipo)</value>
</data> </data>
<data name="PremiumCornerStyleRequired" xml:space="preserve"> <data name="Content" xml:space="preserve">
<value>Estilos de borde personalizados son exclusivos del plan Premium. Actualiza para usar esta funcionalidad.</value> <value>Mba'e oĩva (Contenido)</value>
</data> </data>
<data name="RateLimitReached" xml:space="preserve"> <data name="URLType" xml:space="preserve">
<value>Límite de códigos QR alcanzado</value> <value>URL/Enlace</value>
</data> </data>
<data name="PremiumLogoRequired" xml:space="preserve"> <data name="TextType" xml:space="preserve">
<value>Logo personalizado es exclusivo del plan Premium. Actualiza para usar esta funcionalidad.</value> <value>Texto Simple</value>
</data> </data>
<data name="LogoTooLarge" xml:space="preserve"> <data name="WiFiType" xml:space="preserve">
<value>Logo muy grande. Máximo 2MB.</value> <value>WiFi ñanduti</value>
</data> </data>
<data name="InvalidLogoFormat" xml:space="preserve"> <data name="VCardType" xml:space="preserve">
<value>Formato inválido. Usa PNG o JPG.</value> <value>Tarjeta mba'eichaguáva (de Visita)</value>
</data> </data>
<data name="UserProfileTitle" xml:space="preserve"> <data name="SMSType" xml:space="preserve">
<value>Perfil del Usuario</value> <value>SMS</value>
</data> </data>
<data name="HistoryTitle" xml:space="preserve"> <data name="EmailType" xml:space="preserve">
<value>Historial de Códigos QR</value> <value>Email</value>
</data> </data>
<data name="ErrorSavingHistory" xml:space="preserve"> <data name="DynamicType" xml:space="preserve">
<value>Error al guardar en el historial.</value> <value>QR Dinamico (Premium)</value>
</data> </data>
<data name="FeatureNotAvailable" xml:space="preserve"> <data name="QuickStyle" xml:space="preserve">
<value>Función no disponible</value> <value>Estilo pya'e (Rápido)</value>
</data> </data>
<data name="QRCodeSavedHistory" xml:space="preserve"> <data name="ClassicStyle" xml:space="preserve">
<value>¡Código QR guardado en el historial!</value> <value>Ymave (Clásico)</value>
</data> </data>
<data name="ShareError" xml:space="preserve"> <data name="ModernStyle" xml:space="preserve">
<value>Error al compartir. Intenta otro método.</value> <value>Ko'ãgagua (Moderno)</value>
</data> </data>
<data name="LinkCopied" xml:space="preserve"> <data name="ColorfulStyle" xml:space="preserve">
<value>¡Enlace copiado al portapapeles!</value> <value>Sa'ygua (Colorido)</value>
</data> </data>
<data name="EnterQRContent" xml:space="preserve"> <data name="ContentPlaceholder" xml:space="preserve">
<value>Ingresa el contenido del código QR</value> <value>Emoĩ ne código QR mba'e ko'ápe... (Ingrese el contenido aquí)</value>
</data> </data>
<data name="ValidationContentMinLength" xml:space="preserve"> <data name="AdvancedCustomization" xml:space="preserve">
<value>Contenido debe tener al menos 3 caracteres</value> <value>Ñemohenda porãve (Personalización Avanzada)</value>
</data> </data>
<data name="VCardValidationError" xml:space="preserve"> <data name="PrimaryColor" xml:space="preserve">
<value>Error en la validación del VCard: </value> <value>Sa'y tuichavéva (Color Principal)</value>
</data> </data>
<data name="FastestGeneratorBrazil" xml:space="preserve"> <data name="BackgroundColor" xml:space="preserve">
<value>Código QR generado con QR Rapido - ¡el generador más rápido de Paraguay!</value> <value>Sa'y hugua (Color de Fondo)</value>
</data> </data>
<data name="QRGenerateDescription" xml:space="preserve"> <data name="Size" xml:space="preserve">
<value>QR Rapido: ¡Genera códigos QR en segundos! Generador ultra-rápido en español y portugués. Gratis, sin registro obligatorio. 30 días sin anuncios después del login.</value> <value>Tuicha (Tamaño)</value>
</data> </data>
<data name="LogoNotProvided" xml:space="preserve"> <data name="Margin" xml:space="preserve">
<value>Logo no proporcionado</value> <value>Opa'ĩ (Margen)</value>
</data> </data>
<data name="LogoTooSmall" xml:space="preserve"> <data name="Logo" xml:space="preserve">
<value>Logo muy pequeño. Mínimo 32x32 píxeles.</value> <value>Ta'anga/Ícono</value>
</data> </data>
<data name="InvalidImageFormat" xml:space="preserve"> <data name="CornerStyle" xml:space="preserve">
<value>Formato de imagen inválido</value> <value>Estilo de Esquinas</value>
</data> </data>
<data name="ErrorProcessingLogo" xml:space="preserve"> <data name="GenerateRapidly" xml:space="preserve">
<value>Error al procesar logo.</value> <value>Japo Código QR pya'épe (Generar Rápidamente)</value>
</data> </data>
<data name="DeleteQRCode" xml:space="preserve"> <data name="Preview" xml:space="preserve">
<value>Eliminar Código QR</value> <value>Hecha tenondegua (Vista Previa)</value>
</data> </data>
<data name="ConfirmDeleteTitle" xml:space="preserve"> <data name="PreviewPlaceholder" xml:space="preserve">
<value>Confirmar Eliminación</value> <value>Ne código QR ojekuaa ko'ápe segundos pype (aparecerá aquí en segundos)</value>
</data> </data>
<data name="ConfirmDeleteMessage" xml:space="preserve"> <data name="UltraFastGeneration" xml:space="preserve">
<value>¿Estás seguro de que quieres eliminar este código QR de tu historial?</value> <value>Generacion ultra-rapida garantizada</value>
</data> </data>
<data name="Yes" xml:space="preserve"> <data name="DownloadPNG" xml:space="preserve">
<value></value> <value>Descargar PNG</value>
</data> </data>
<data name="No" xml:space="preserve"> <data name="DownloadSVG" xml:space="preserve">
<value>No</value> <value>Descargar SVG (Vectorial)</value>
</data> </data>
<data name="QRCodeDeleted" xml:space="preserve"> <data name="DownloadPDF" xml:space="preserve">
<value>¡Código QR eliminado exitosamente!</value> <value>Descargar PDF</value>
</data> </data>
<data name="ErrorDeletingQR" xml:space="preserve"> <data name="SaveToHistory" xml:space="preserve">
<value>Error al eliminar código QR. Inténtalo de nuevo.</value> <value>Guardar en Historial</value>
</data> </data>
<data name="Deleting" xml:space="preserve"> <data name="LoginToSave" xml:space="preserve">
<value>Eliminando</value> <value>Inicie sesion para guardar en el historial</value>
</data>
<data name="PremiumTitle" xml:space="preserve">
<value>QR Rápido Premium (Porã)</value>
</data>
<data name="SpeedTipsTitle" xml:space="preserve">
<value>Ñe'ẽ pya'épe (Consejos para QR Más Rápidos)</value>
</data>
<data name="SpeedTip1" xml:space="preserve">
<value>URLs cortas se generan mas rapido</value>
</data>
<data name="SpeedTip2" xml:space="preserve">
<value>Menos texto = mayor velocidad</value>
</data>
<data name="SpeedTip3" xml:space="preserve">
<value>Colores solidos optimizan el proceso</value>
</data>
<data name="SpeedTip4" xml:space="preserve">
<value>Tamanos menores aceleran la descarga</value>
</data>
<data name="Login" xml:space="preserve">
<value>Iniciar Sesion</value>
</data>
<data name="LoginWith" xml:space="preserve">
<value>Iniciar con</value>
</data>
<data name="Google" xml:space="preserve">
<value>Google</value>
</data>
<data name="Microsoft" xml:space="preserve">
<value>Microsoft</value>
</data>
<data name="AdFreeOffer" xml:space="preserve">
<value>Desbloquea todas las funciones premium!</value>
</data>
<data name="SpecialOffer" xml:space="preserve">
<value>Jeporu porã! (Oferta Premium!)</value>
</data>
<data name="LoginBenefits" xml:space="preserve">
<value>Elimina anuncios, accede a analisis detallados y mucho mas por solo $12.90/mes o $129.00/ano. Inicia sesion y suscribete ahora!</value>
</data>
<data name="Privacy" xml:space="preserve">
<value>Politica de Privacidad</value>
</data>
<data name="BackToGenerator" xml:space="preserve">
<value>Volver al generador</value>
</data>
<data name="GeneratedIn" xml:space="preserve">
<value>Generado en</value>
</data>
<data name="Seconds" xml:space="preserve">
<value>s</value>
</data>
<data name="UltraFast" xml:space="preserve">
<value>Generacion ultra rapida!</value>
</data>
<data name="Fast" xml:space="preserve">
<value>Generacion rapida!</value>
</data>
<data name="Normal" xml:space="preserve">
<value>Generacion normal</value>
</data>
<data name="Error" xml:space="preserve">
<value>Osẽ vai - Ha'e jéy (Error - Inténtalo de nuevo)</value>
</data>
<data name="Success" xml:space="preserve">
<value>Ñongatu porã! Código QR guardado en el historial!</value>
</data>
<data name="CreateQRCodeQuickly" xml:space="preserve">
<value>Crear Codigo QR Rapidamente</value>
</data>
<data name="PremiumUserActive" xml:space="preserve">
<value>Usuario Premium Activo</value>
</data>
<data name="NoAdsHistoryUnlimitedQR" xml:space="preserve">
<value>Sin Anuncios • Historial • QR Ilimitado</value>
</data>
<data name="UnlimitedToday" xml:space="preserve">
<value>Ilimitado hoy</value>
</data>
<data name="QRCodesRemaining" xml:space="preserve">
<value>Codigos QR restantes</value>
</data>
<data name="QRCodeType" xml:space="preserve">
<value>Tipo de Codigo QR</value>
</data>
<data name="SelectType" xml:space="preserve">
<value>Seleccionar tipo</value>
</data>
<data name="URLLink" xml:space="preserve">
<value>URL/Enlace</value>
</data>
<data name="SimpleText" xml:space="preserve">
<value>Texto Simple</value>
</data>
<data name="VCard" xml:space="preserve">
<value>Tarjeta de Visita</value>
</data>
<data name="DynamicQRPremium" xml:space="preserve">
<value>QR Dinamico (Premium)</value>
</data>
<data name="EnterQRCodeContent" xml:space="preserve">
<value>Ingrese el contenido de su codigo QR aqui...</value>
</data>
<data name="ContentHints" xml:space="preserve">
<value>Sugerencias de contenido</value>
</data>
<data name="Classic" xml:space="preserve">
<value>Clasico</value>
</data>
<data name="Modern" xml:space="preserve">
<value>Moderno</value>
</data>
<data name="Colorful" xml:space="preserve">
<value>Colorido</value>
</data>
<data name="WPARecommended" xml:space="preserve">
<value>Rede WPA (a mais comum)</value>
</data>
<data name="WEPLegacy" xml:space="preserve">
<value>WEP (muito antigo)</value>
</data>
<data name="OpenNetwork" xml:space="preserve">
<value>Sin contrasenha </value>
</data>
<data name="PremiumAccelerateProductivity" xml:space="preserve">
<value>Acelera tu productividad con el generador de QR más rápido del mundo</value>
</data>
<data name="ThreeTimesFaster" xml:space="preserve">
<value>3x más rápido que la competencia</value>
</data>
<data name="CurrentStatus" xml:space="preserve">
<value>Estado Actual</value>
</data>
<data name="YouHave" xml:space="preserve">
<value>Tienes</value>
</data>
<data name="DaysRemainingNoAds" xml:space="preserve">
<value>días restantes sin anuncios.</value>
</data>
<data name="UpgradeNowForever" xml:space="preserve">
<value>¡Actualiza ahora y ten acceso premium para siempre!</value>
</data>
<data name="DaysRemaining" xml:space="preserve">
<value>días restantes</value>
</data>
<data name="MostPopularPlan" xml:space="preserve">
<value>El plan más popular</value>
</data>
<data name="PerMonth" xml:space="preserve">
<value>por mes</value>
</data>
<data name="UnlimitedQRCodes" xml:space="preserve">
<value>Códigos QR ilimitados</value>
</data>
<data name="UltraFastGeneration04s" xml:space="preserve">
<value>Generación ultra-rápida (0.4s)</value>
</data>
<data name="NoAdsForever" xml:space="preserve">
<value>Sin anuncios para siempre</value>
</data>
<data name="DynamicQRCodes" xml:space="preserve">
<value>Códigos QR dinámicos</value>
</data>
<data name="RealTimeAnalytics" xml:space="preserve">
<value>Analítica en tiempo real</value>
</data>
<data name="PrioritySupport" xml:space="preserve">
<value>Soporte prioritario</value>
</data>
<data name="DeveloperAPI" xml:space="preserve">
<value>API para desarrolladores</value>
</data>
<data name="UpgradeNowButton" xml:space="preserve">
<value>Actualizar Ahora</value>
</data>
<data name="SecurePaymentStripe" xml:space="preserve">
<value>Pago seguro via Stripe</value>
</data>
<data name="CancelAnytime" xml:space="preserve">
<value>Cancela cuando quieras</value>
</data>
<data name="PlanComparison" xml:space="preserve">
<value>Comparación de Planes</value>
</data>
<data name="Feature" xml:space="preserve">
<value>Función</value>
</data>
<data name="QRCodesPerDay" xml:space="preserve">
<value>Códigos QR por día</value>
</data>
<data name="Unlimited" xml:space="preserve">
<value>Ilimitado</value>
</data>
<data name="GenerationSpeed" xml:space="preserve">
<value>Velocidad de generación</value>
</data>
<data name="Ads" xml:space="preserve">
<value>Anuncios</value>
</data>
<data name="NoAds" xml:space="preserve">
<value>Sin anuncios</value>
</data>
<data name="DetailedAnalytics" xml:space="preserve">
<value>Analítica detallada</value>
</data>
<data name="SpeedDemonstration" xml:space="preserve">
<value>Demostración de Velocidad</value>
</data>
<data name="Competitors" xml:space="preserve">
<value>Competidores</value>
</data>
<data name="AverageTime" xml:space="preserve">
<value>Tiempo promedio</value>
</data>
<data name="ElevenTimesFaster" xml:space="preserve">
<value>¡11x más rápido!</value>
</data>
<data name="FAQ" xml:space="preserve">
<value>Preguntas Frecuentes</value>
</data>
<data name="CanCancelAnytime" xml:space="preserve">
<value>¿Puedo cancelar en cualquier momento?</value>
</data>
<data name="CancelAnytimeAnswer" xml:space="preserve">
<value>¡Sí! Puedes cancelar tu suscripción en cualquier momento. No hay tarifas de cancelación y mantendrás el acceso premium hasta el final del período ya pagado.</value>
</data>
<data name="WhatAreDynamicQR" xml:space="preserve">
<value>¿Qué son los códigos QR dinámicos?</value>
</data>
<data name="DynamicQRAnswer" xml:space="preserve">
<value>Los códigos QR dinámicos te permiten cambiar el contenido del QR después de que haya sido creado, sin necesidad de generar un nuevo código. Perfecto para campañas de marketing y uso empresarial.</value>
</data>
<data name="HowPrioritySupport" xml:space="preserve">
<value>¿Cómo funciona el soporte prioritario?</value>
</data>
<data name="PrioritySupportAnswer" xml:space="preserve">
<value>Los usuarios premium reciben respuesta en hasta 2 horas hábiles por email, acceso al chat directo y soporte técnico especializado.</value>
</data>
<data name="PaymentProcessingError" xml:space="preserve">
<value>Error al procesar el pago: </value>
</data>
<data name="PaymentErrorTryAgain" xml:space="preserve">
<value>Error al procesar el pago. Inténtalo de nuevo.</value>
</data>
<data name="Advertisement" xml:space="preserve">
<value>Publicidad</value>
</data>
<data name="PremiumUserNoAds" xml:space="preserve">
<value>✨ Usuario Premium - ¡Sin anuncios!</value>
</data>
<data name="UpgradePremiumRemoveAds" xml:space="preserve">
<value>¡Actualiza a Premium y elimina los anuncios!</value>
</data>
<data name="PremiumBenefitsShort" xml:space="preserve">
<value>Premium: Sin anuncios + Historial + QR ilimitados</value>
</data>
<data name="LoginAndGet" xml:space="preserve">
<value>Inicia sesión con tu cuenta y obtén:</value>
</data>
<data name="ThirtyDaysNoAds" xml:space="preserve">
<value>30 días sin anuncios</value>
</data>
<data name="FiftyQRCodesPerDay" xml:space="preserve">
<value>50 códigos QR/día</value>
</data>
<data name="QRCodeHistory" xml:space="preserve">
<value>Historial de códigos QR</value>
</data>
<data name="LoginWithGoogle" xml:space="preserve">
<value>Iniciar con Google</value>
</data>
<data name="LoginWithMicrosoft" xml:space="preserve">
<value>Iniciar con Microsoft</value>
</data>
<data name="SpecialOfferLogin" xml:space="preserve">
<value>¡Oferta Especial!</value>
</data>
<data name="LoginAutomaticallyGain" xml:space="preserve">
<value>Al iniciar sesión, obtienes automáticamente</value>
</data>
<data name="AndCanGenerate" xml:space="preserve">
<value>y puedes generar hasta</value>
</data>
<data name="ForFree" xml:space="preserve">
<value>gratuitamente.</value>
</data>
<data name="NoRegisterWithoutPermission" xml:space="preserve">
<value>No te registramos sin tu permiso.</value>
</data>
<data name="PrivacyPolicy" xml:space="preserve">
<value>Política de Privacidad</value>
</data>
<data name="PaymentSuccessful" xml:space="preserve">
<value>¡Jehepy porã! (Pago exitoso!)</value>
</data>
<data name="BackToHome" xml:space="preserve">
<value>Volver al Inicio</value>
</data>
<data name="PaymentCanceled" xml:space="preserve">
<value>Pago cancelado.</value>
</data>
<data name="ViewPlans" xml:space="preserve">
<value>Ver Planes</value>
</data>
<data name="UnlockFullPowerQRRapido" xml:space="preserve">
<value>Desbloquea el Poder Total de QRRápido</value>
</data>
<data name="UnlimitedAccessNoAdsExclusive" xml:space="preserve">
<value>Acceso sin límites, sin anuncios y con recursos exclusivos para máxima productividad.</value>
</data>
<data name="MonthlyPlan" xml:space="preserve">
<value>Plan Mensual</value>
</data>
<data name="IdealToStartExploring" xml:space="preserve">
<value>Ideal para comenzar a explorar las funciones premium.</value>
</data>
<data name="SubscribeNow" xml:space="preserve">
<value>Suscribirse Ahora</value>
</data>
<data name="AnnualPlan" xml:space="preserve">
<value>Plan Anual</value>
</data>
<data name="Recommended" xml:space="preserve">
<value>Recomendado</value>
</data>
<data name="PerYear" xml:space="preserve">
<value>/año</value>
</data>
<data name="SaveMoney" xml:space="preserve">
<value>Ahorra $</value>
</data>
<data name="BestValueFrequentUsers" xml:space="preserve">
<value>La mejor relación calidad-precio para usuarios frecuentes.</value>
</data>
<data name="SubscribeAnnualPlan" xml:space="preserve">
<value>Suscribirse al Plan Anual</value>
</data>
<data name="AllPlansInclude" xml:space="preserve">
<value>Todos los planes incluyen:</value>
</data>
<data name="Redirecting" xml:space="preserve">
<value>Redirigiendo...</value>
</data>
<data name="PaymentInitializationError" xml:space="preserve">
<value>Ocurrió un error al iniciar el pago. Inténtalo de nuevo.</value>
</data>
<data name="QRCodesSavedHere" xml:space="preserve">
<value>Tus códigos QR generados se guardan aquí para descarga futura</value>
</data>
<data name="GenerateNewQRCode" xml:space="preserve">
<value>Generar Nuevo Código QR</value>
</data>
<data name="Type" xml:space="preserve">
<value>Tipo:</value>
</data>
<data name="CreatedOn" xml:space="preserve">
<value>Creado el:</value>
</data>
<data name="ShowingRecent50QRCodes" xml:space="preserve">
<value>Mostrando los 50 códigos QR más recientes. Los más antiguos se eliminan automáticamente.</value>
</data>
<data name="NoQRCodeFound" xml:space="preserve">
<value>Ningún Código QR encontrado</value>
</data>
<data name="QRCodesWillAppearHere" xml:space="preserve">
<value>Cuando generes códigos QR estando conectado, aparecerán aquí para descarga futura.</value>
</data>
<data name="GenerateFirstQRCode" xml:space="preserve">
<value>Generar Primer Código QR</value>
</data>
<data name="ErrorRegeneratingQR" xml:space="preserve">
<value>Error al regenerar el Código QR. Inténtalo de nuevo.</value>
</data>
<data name="SmallSize200px" xml:space="preserve">
<value>Pequeño (200px)</value>
</data>
<data name="MediumSize300px" xml:space="preserve">
<value>Mediano (300px)</value>
</data>
<data name="LargeSize500px" xml:space="preserve">
<value>Grande (500px)</value>
</data>
<data name="XLSize800px" xml:space="preserve">
<value>XL (800px)</value>
</data>
<data name="Minimal" xml:space="preserve">
<value>Mínimo</value>
</data>
<data name="Large" xml:space="preserve">
<value>Grande</value>
</data>
<data name="LogoIcon" xml:space="preserve">
<value>Logo/Icono</value>
</data>
<data name="PNGJPGUp2MB" xml:space="preserve">
<value>PNG, JPG hasta 2MB</value>
</data>
<data name="BorderStyle" xml:space="preserve">
<value>Estilo de Bordes</value>
</data>
<data name="Square" xml:space="preserve">
<value>Cuadrado</value>
</data>
<data name="Rounded" xml:space="preserve">
<value>Redondeado</value>
</data>
<data name="Circular" xml:space="preserve">
<value>Circular</value>
</data>
<data name="Leaf" xml:space="preserve">
<value>Hoja</value>
</data>
<data name="GenerateQRCodeQuickly" xml:space="preserve">
<value>Japo Código QR pya'épe (Generar Rápidamente)</value>
</data>
<data name="Generating" xml:space="preserve">
<value>Generando...</value>
</data>
<data name="Availability" xml:space="preserve">
<value>Disponibilidad</value>
</data>
<data name="QRsGeneratedToday" xml:space="preserve">
<value>QRs generados hoy</value>
</data>
<data name="YourQRCodeWillAppear" xml:space="preserve">
<value>Tu código QR aparecerá aquí en segundos</value>
</data>
<data name="UltraFastGenerationGuaranteed" xml:space="preserve">
<value>Generación ultra-rápida garantizada</value>
</data>
<data name="DownloadSVGVector" xml:space="preserve">
<value>Descargar SVG (Vectorial)</value>
</data>
<data name="ShareQRCode" xml:space="preserve">
<value>Compartir Código QR</value>
</data>
<data name="ShareSystem" xml:space="preserve">
<value>Compartir (Sistema)</value>
</data>
<data name="ToSaveToHistory" xml:space="preserve">
<value>para guardar en el historial</value>
</data>
<data name="PriorityGeneration" xml:space="preserve">
<value>Generación prioritaria (0.4s)</value>
</data>
<data name="AcceleratePrice" xml:space="preserve">
<value>Acelerar por $19.90/mes</value>
</data>
<data name="ChooseTypeFirst" xml:space="preserve">
<value>Primero, elige el tipo de código QR</value>
</data>
<data name="TypeGuideURL" xml:space="preserve">
<value>🌐 Para generar QR de URL, ingresa la dirección completa (ej: https://google.com)</value>
</data>
<data name="TypeGuideVCard" xml:space="preserve">
<value>👤 Para tarjeta de visita, completa nombre, teléfono y email en los campos</value>
</data>
<data name="TypeGuideWiFi" xml:space="preserve">
<value>📶 Para WiFi, ingresa nombre de red, contraseña y tipo de seguridad</value>
</data>
<data name="TypeGuideSMS" xml:space="preserve">
<value>💬 Para SMS, ingresa el número del destinatario y el mensaje</value>
</data>
<data name="TypeGuideEmail" xml:space="preserve">
<value>📧 Para email, completa destinatario, asunto y mensaje (opcional)</value>
</data>
<data name="TypeGuideText" xml:space="preserve">
<value>📝 Para texto libre, ingresa cualquier contenido que desees</value>
</data>
<data name="TipsFasterQR" xml:space="preserve">
<value>Ñe'ẽ pya'épe ha porãve (Consejos para QR Más Rápidos)</value>
</data>
<data name="ShortURLsFaster" xml:space="preserve">
<value>URL mbykymi ojejapo pya'eve (URLs cortas se generan más rápido)</value>
</data>
<data name="LessTextMoreSpeed" xml:space="preserve">
<value>Michĩve jehai = pya'eve (Menos texto = mayor velocidad)</value>
</data>
<data name="SolidColorsOptimize" xml:space="preserve">
<value>Sa'y hũ omoporãve tembiapo (Colores sólidos optimizan el proceso)</value>
</data>
<data name="SmallerSizesAccelerate" xml:space="preserve">
<value>Michĩve tuicha omboguata descarga (Tamaños menores aceleran la descarga)</value>
</data>
<data name="WhyQRRapidoFaster" xml:space="preserve">
<value>Mba'ére QR Rápido pya'eve? (¿Por qué es más rápido?)</value>
</data>
<data name="ComparisonOtherGenerators" xml:space="preserve">
<value>Comparación con otros generadores populares</value>
</data>
<data name="OptimizedForSpeed" xml:space="preserve">
<value>Optimizado para velocidad</value>
</data>
<data name="CompetitorA" xml:space="preserve">
<value>Competidor A</value>
</data>
<data name="TraditionalGenerator" xml:space="preserve">
<value>Generador tradicional</value>
</data>
<data name="CompetitorB" xml:space="preserve">
<value>Competidor B</value>
</data>
<data name="HeavyInterface" xml:space="preserve">
<value>Interfaz pesada</value>
</data>
<data name="CompetitorC" xml:space="preserve">
<value>Competidor C</value>
</data>
<data name="ManyAds" xml:space="preserve">
<value>Muchos anuncios</value>
</data>
<data name="Average" xml:space="preserve">
<value>promedio</value>
</data>
<data name="GenerateQRCode" xml:space="preserve">
<value>Generar Código QR</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Perfil</value>
</data>
<data name="History" xml:space="preserve">
<value>Historial</value>
</data>
<data name="PremiumActive" xml:space="preserve">
<value>Premium hendyva (Activo)</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Salir</value>
</data>
<data name="LoginThirtyDaysNoAds" xml:space="preserve">
<value>¡Iniciar sesión = 30 días sin anuncios!</value>
</data>
<data name="FastestQRGeneratorWeb" xml:space="preserve">
<value>El generador de QR más rápido de la web</value>
</data>
<data name="AverageTimePrefix" xml:space="preserve">
<value>Promedio de</value>
</data>
<data name="AverageTimeValue" xml:space="preserve">
<value>1.2 segundos</value>
</data>
<data name="AverageTimeSuffix" xml:space="preserve">
<value>por código QR • Rei rehe (Gratis) • Sin registro obligatorio</value>
</data>
<data name="FastestQRGeneratorDescription" xml:space="preserve">
<value>El generador de códigos QR pya'eve (ás rápido) de la web. Rei rehe (Gratis), seguro y confiable.</value>
</data>
<data name="UsefulLinks" xml:space="preserve">
<value>Enlaces Útiles</value>
</data>
<data name="TermsOfUse" xml:space="preserve">
<value>Términos de Uso</value>
</data>
<data name="Support" xml:space="preserve">
<value>Soporte</value>
</data>
<data name="Help" xml:space="preserve">
<value>Ayuda</value>
</data>
<data name="AllRightsReserved" xml:space="preserve">
<value>Todos los derechos reservados.</value>
</data>
<data name="QRCodesRemainingToday" xml:space="preserve">
<value>Códigos QR restantes hoy</value>
</data>
<data name="RateLimitExceeded" xml:space="preserve">
<value>¡Límite diario alcanzado! Inicia sesión para acceso ilimitado.</value>
</data>
<data name="AnonymousUserLimit" xml:space="preserve">
<value>Usuarios anónimos: 3 códigos QR por día</value>
</data>
<data name="PrivacyPolicyTitle" xml:space="preserve">
<value>Política de Privacidad - QR Rapido</value>
</data>
<data name="PrivacyPolicyDescription" xml:space="preserve">
<value>Conocé nuestra política de privacidad y cómo protegemos tus datos personales en QR Rapido.</value>
</data>
<data name="PrivacyPolicyLastUpdated" xml:space="preserve">
<value>Última actualización</value>
</data>
<data name="PrivacyPolicyIntroduction" xml:space="preserve">
<value>Esta Política de Privacidad describe cómo QR Rapido ("nosotros", "nuestro" o "nuestra") recolecta, usa y protege la información que proporcionás cuando usás nuestro servicio de generación de códigos QR.</value>
</data>
<data name="PrivacyDataCollection" xml:space="preserve">
<value>1. Recolección de Datos</value>
</data>
<data name="PrivacyDataCollectionContent" xml:space="preserve">
<value>Recolectamos la siguiente información:
• Datos de autenticación vía Google/Microsoft (nombre, email, foto de perfil)
• Contenido de los códigos QR generados (solo para usuarios registrados que eligen guardar en el historial)
• Datos de uso y estadísticas anónimas para mejorar nuestro servicio
• Información de pago procesada vía Stripe (no almacenamos datos de tarjeta)</value>
</data>
<data name="PrivacyDataUsage" xml:space="preserve">
<value>2. Uso de los Datos</value>
</data>
<data name="PrivacyDataUsageContent" xml:space="preserve">
<value>Utilizamos tus datos para:
• Proporcionar y mejorar nuestro servicio de generación de códigos QR
• Mantener tu historial de códigos QR (solo si elegís guardarlos)
• Procesar pagos de suscripciones premium
• Enviar comunicaciones relacionadas al servicio
• Cumplir obligaciones legales conforme a las leyes de protección de datos</value>
</data>
<data name="PrivacyDataProtection" xml:space="preserve">
<value>3. Protección de los Datos</value>
</data>
<data name="PrivacyDataProtectionContent" xml:space="preserve">
<value>Implementamos medidas de seguridad técnicas y organizacionales adecuadas para proteger tus datos personales contra acceso no autorizado, alteración, divulgación o destrucción, incluyendo:
• Cifrado SSL/TLS en todas las comunicaciones
• Almacenamiento seguro en servidores protegidos
• Control de acceso restringido a los datos
• Monitoreo continuo de seguridad</value>
</data>
<data name="PrivacyDataSharing" xml:space="preserve">
<value>4. Compartir Datos</value>
</data>
<data name="PrivacyDataSharingContent" xml:space="preserve">
<value>No vendemos, alquilamos ni compartimos tus datos personales con terceros, excepto:
• Con proveedores de servicios esenciales (Google, Microsoft, Stripe) para autenticación y pagos
• Cuando sea requerido por ley u orden judicial
• Para proteger nuestros derechos legales y la seguridad de los usuarios</value>
</data>
<data name="PrivacyUserRights" xml:space="preserve">
<value>5. Tus Derechos</value>
</data>
<data name="PrivacyUserRightsContent" xml:space="preserve">
<value>De acuerdo con las leyes de protección de datos, tenés derecho a:
• Acceder a tus datos personales
• Corregir datos incompletos o incorrectos
• Solicitar la eliminación de datos innecesarios
• Revocar consentimiento para tratamiento de datos
• Portabilidad de tus datos</value>
</data>
<data name="PrivacyCookies" xml:space="preserve">
<value>6. Cookies y Tecnologías Similares</value>
</data>
<data name="PrivacyCookiesContent" xml:space="preserve">
<value>Utilizamos cookies esenciales para el funcionamiento del sitio y análisis de tráfico vía Google Analytics. Podés gestionar tus preferencias de cookies en la configuración de tu navegador.</value>
</data>
<data name="PrivacyContact" xml:space="preserve">
<value>7. Contacto</value>
</data>
<data name="PrivacyContactContent" xml:space="preserve">
<value>Para consultas sobre esta Política de Privacidad o ejercer tus derechos, contactanos a través del email: contato@qrrapido.site</value>
</data>
<data name="TermsOfUseTitle" xml:space="preserve">
<value>Términos de Uso - QR Rapido</value>
</data>
<data name="TermsOfUseDescription" xml:space="preserve">
<value>Leé los términos y condiciones de uso de QR Rapido, el generador de códigos QR más rápido de América Latina.</value>
</data>
<data name="TermsLastUpdated" xml:space="preserve">
<value>Última actualización</value>
</data>
<data name="TermsIntroduction" xml:space="preserve">
<value>Estos Términos de Uso ("Términos") rigen el uso del servicio QR Rapido ("Servicio") proporcionado por nuestra empresa ("nosotros", "nuestro" o "nuestra"). Al usar nuestro Servicio, aceptás estos Términos.</value>
</data>
<data name="TermsAcceptance" xml:space="preserve">
<value>1. Aceptación de los Términos</value>
</data>
<data name="TermsAcceptanceContent" xml:space="preserve">
<value>Al acceder y usar QR Rapido, declarás tener al menos 18 años de edad o poseer autorización de padres/responsables, y aceptás cumplir estos Términos y todas las leyes aplicables.</value>
</data>
<data name="TermsServiceDescription" xml:space="preserve">
<value>2. Descripción del Servicio</value>
</data>
<data name="TermsServiceDescriptionContent" xml:space="preserve">
<value>QR Rapido es un servicio online gratuito de generación de códigos QR que ofrece:
• Generación rápida de códigos QR para diversos tipos de contenido
• Versión gratuita con limitaciones diarias
• Plan Premium con recursos avanzados e ilimitados
• Historial de códigos para usuarios registrados</value>
</data>
<data name="TermsUserResponsibilities" xml:space="preserve">
<value>3. Responsabilidades del Usuario</value>
</data>
<data name="TermsUserResponsibilitiesContent" xml:space="preserve">
<value>Te comprometés a:
• Usar el servicio únicamente para fines legales y éticos
• No generar códigos QR con contenido ofensivo, ilegal o que infrinja derechos de terceros
• No intentar comprometer la seguridad o disponibilidad del servicio
• Mantener la confidencialidad de tus credenciales de acceso</value>
</data>
<data name="TermsProhibitedUses" xml:space="preserve">
<value>4. Usos Prohibidos</value>
</data>
<data name="TermsProhibitedUsesContent" xml:space="preserve">
<value>Está prohibido usar el servicio para:
• Diseminar malware, phishing o enlaces maliciosos
• Violación de derechos de autor o propiedad intelectual
• Spam, acoso o actividades fraudulentas
• Actividades que violen leyes nacionales o internacionales</value>
</data>
<data name="TermsIntellectualProperty" xml:space="preserve">
<value>5. Propiedad Intelectual</value>
</data>
<data name="TermsIntellectualPropertyContent" xml:space="preserve">
<value>Todos los derechos sobre el software, diseño, marca y contenido de QR Rapido pertenecen a nuestra empresa. Los códigos QR generados son de tu propiedad, pero nos concedés licencia para almacenarlos según sea necesario para proporcionar el servicio.</value>
</data>
<data name="TermsLimitations" xml:space="preserve">
<value>6. Limitaciones del Servicio</value>
</data>
<data name="TermsLimitationsContent" xml:space="preserve">
<value>• Usuarios gratuitos tienen límite diario de códigos QR
• Nos reservamos el derecho de modificar o interrumpir el servicio temporalmente
• No garantizamos disponibilidad 100% del tiempo
• Podemos implementar medidas técnicas para prevenir abuso</value>
</data>
<data name="TermsPayments" xml:space="preserve">
<value>7. Pagos y Suscripciones</value>
</data>
<data name="TermsPaymentsContent" xml:space="preserve">
<value>• Suscripciones Premium son procesadas vía Stripe
• Pagos son recurrentes hasta cancelación
• Reembolsos siguen nuestra política de 7 días
• Precios pueden ser alterados mediante aviso previo de 30 días</value>
</data>
<data name="TermsLiability" xml:space="preserve">
<value>8. Limitación de Responsabilidad</value>
</data>
<data name="TermsLiabilityContent" xml:space="preserve">
<value>El servicio se proporciona "como está". No nos responsabilizamos por:
• Daños directos o indirectos derivados del uso del servicio
• Pérdida de datos o interrupción de negocios
• Uso inadecuado de los códigos QR generados por terceros
• Contenido accedido a través de los códigos QR</value>
</data>
<data name="TermsModifications" xml:space="preserve">
<value>9. Modificaciones de los Términos</value>
</data>
<data name="TermsModificationsContent" xml:space="preserve">
<value>Podemos actualizar estos Términos periódicamente. Cambios significativos serán comunicados por email o aviso en el sitio. El uso continuado después de los cambios constituye aceptación de los nuevos Términos.</value>
</data>
<data name="TermsApplicableLaw" xml:space="preserve">
<value>10. Ley Aplicable</value>
</data>
<data name="TermsApplicableLawContent" xml:space="preserve">
<value>Estos Términos se rigen por las leyes aplicables en cada jurisdicción. Las disputas serán resueltas en los tribunales competentes de cada país, sin perjuicio a tu derecho de acceso a los órganos de defensa del consumidor.</value>
</data>
<data name="TermsContact" xml:space="preserve">
<value>11. Contacto</value>
</data>
<data name="TermsContactContent" xml:space="preserve">
<value>Para dudas sobre estos Términos de Uso, contactanos: contato@qrrapido.site</value>
</data>
<data name="BackToHome" xml:space="preserve">
<value>Volver al Inicio</value>
</data>
<data name="CookieConsentTitle" xml:space="preserve">
<value>Jeporu Cookies</value>
</data>
<data name="CookieConsentMessage" xml:space="preserve">
<value>Jaiporu cookies romohenda hag̃ua ne rembiapo ha rohechauka hag̃ua mba'eichapa ojeporú ñanduti renda. Ku jepo rehe, remoneĩ cookies rembiporu.</value>
</data>
<data name="CookieAcceptAll" xml:space="preserve">
<value>Amoneĩ Opavave (Aceptar Todos)</value>
</data>
<data name="CookieAcceptEssential" xml:space="preserve">
<value>Tekotevẽva añónte (Solo Esenciales)</value>
</data>
<data name="CookieLearnMore" xml:space="preserve">
<value>Aikuaave (Saber Más)</value>
</data> </data>
</root> </root>

View File

@ -118,16 +118,16 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Tagline" xml:space="preserve"> <data name="Tagline" xml:space="preserve">
<value>Genera codigos QR en segundos!</value> <value>¡Japo código QR pya'épe! (Genera códigos QR en segundos)</value>
</data> </data>
<data name="GenerateQR" xml:space="preserve"> <data name="GenerateQR" xml:space="preserve">
<value>Generar Codigo QR</value> <value>Japo Código QR (Generar)</value>
</data> </data>
<data name="QRType" xml:space="preserve"> <data name="QRType" xml:space="preserve">
<value>Tipo de Codigo QR</value> <value>Mba'éichapa código QR (Tipo)</value>
</data> </data>
<data name="Content" xml:space="preserve"> <data name="Content" xml:space="preserve">
<value>Contenido</value> <value>Mba'e oĩva (Contenido)</value>
</data> </data>
<data name="URLType" xml:space="preserve"> <data name="URLType" xml:space="preserve">
<value>URL/Enlace</value> <value>URL/Enlace</value>
@ -136,10 +136,10 @@
<value>Texto Simple</value> <value>Texto Simple</value>
</data> </data>
<data name="WiFiType" xml:space="preserve"> <data name="WiFiType" xml:space="preserve">
<value>WiFi</value> <value>WiFi ñanduti</value>
</data> </data>
<data name="VCardType" xml:space="preserve"> <data name="VCardType" xml:space="preserve">
<value>Tarjeta de Visita</value> <value>Tarjeta mba'eichaguáva (de Visita)</value>
</data> </data>
<data name="SMSType" xml:space="preserve"> <data name="SMSType" xml:space="preserve">
<value>SMS</value> <value>SMS</value>
@ -151,49 +151,49 @@
<value>QR Dinamico (Premium)</value> <value>QR Dinamico (Premium)</value>
</data> </data>
<data name="QuickStyle" xml:space="preserve"> <data name="QuickStyle" xml:space="preserve">
<value>Estilo Rapido</value> <value>Estilo pya'e (Rápido)</value>
</data> </data>
<data name="ClassicStyle" xml:space="preserve"> <data name="ClassicStyle" xml:space="preserve">
<value>Clasico</value> <value>Ymave (Clásico)</value>
</data> </data>
<data name="ModernStyle" xml:space="preserve"> <data name="ModernStyle" xml:space="preserve">
<value>Moderno</value> <value>Ko'ãgagua (Moderno)</value>
</data> </data>
<data name="ColorfulStyle" xml:space="preserve"> <data name="ColorfulStyle" xml:space="preserve">
<value>Colorido</value> <value>Sa'ygua (Colorido)</value>
</data> </data>
<data name="ContentPlaceholder" xml:space="preserve"> <data name="ContentPlaceholder" xml:space="preserve">
<value>Ingrese el contenido de su codigo QR aqui...</value> <value>Emoĩ ne código QR mba'e ko'ápe... (Ingrese el contenido aquí)</value>
</data> </data>
<data name="AdvancedCustomization" xml:space="preserve"> <data name="AdvancedCustomization" xml:space="preserve">
<value>Personalizacion Avanzada</value> <value>Ñemohenda porãve (Personalización Avanzada)</value>
</data> </data>
<data name="PrimaryColor" xml:space="preserve"> <data name="PrimaryColor" xml:space="preserve">
<value>Color Principal</value> <value>Sa'y tuichavéva (Color Principal)</value>
</data> </data>
<data name="BackgroundColor" xml:space="preserve"> <data name="BackgroundColor" xml:space="preserve">
<value>Color de Fondo</value> <value>Sa'y hugua (Color de Fondo)</value>
</data> </data>
<data name="Size" xml:space="preserve"> <data name="Size" xml:space="preserve">
<value>Tamano</value> <value>Tuicha (Tamaño)</value>
</data> </data>
<data name="Margin" xml:space="preserve"> <data name="Margin" xml:space="preserve">
<value>Margen</value> <value>Opa'ĩ (Margen)</value>
</data> </data>
<data name="Logo" xml:space="preserve"> <data name="Logo" xml:space="preserve">
<value>Logo/Icono</value> <value>Ta'anga/Ícono</value>
</data> </data>
<data name="CornerStyle" xml:space="preserve"> <data name="CornerStyle" xml:space="preserve">
<value>Estilo de Esquinas</value> <value>Estilo de Esquinas</value>
</data> </data>
<data name="GenerateRapidly" xml:space="preserve"> <data name="GenerateRapidly" xml:space="preserve">
<value>Generar Codigo QR Rapidamente</value> <value>Japo Código QR pya'épe (Generar Rápidamente)</value>
</data> </data>
<data name="Preview" xml:space="preserve"> <data name="Preview" xml:space="preserve">
<value>Vista Previa</value> <value>Hecha tenondegua (Vista Previa)</value>
</data> </data>
<data name="PreviewPlaceholder" xml:space="preserve"> <data name="PreviewPlaceholder" xml:space="preserve">
<value>Su codigo QR aparecera aqui en segundos</value> <value>Ne código QR ojekuaa ko'ápe segundos pype (aparecerá aquí en segundos)</value>
</data> </data>
<data name="UltraFastGeneration" xml:space="preserve"> <data name="UltraFastGeneration" xml:space="preserve">
<value>Generacion ultra-rapida garantizada</value> <value>Generacion ultra-rapida garantizada</value>
@ -214,10 +214,10 @@
<value>Inicie sesion para guardar en el historial</value> <value>Inicie sesion para guardar en el historial</value>
</data> </data>
<data name="PremiumTitle" xml:space="preserve"> <data name="PremiumTitle" xml:space="preserve">
<value>QR Rapido Premium</value> <value>QR Rápido Premium (Porã)</value>
</data> </data>
<data name="SpeedTipsTitle" xml:space="preserve"> <data name="SpeedTipsTitle" xml:space="preserve">
<value>Consejos para QR Mas Rapidos</value> <value>Ñe'ẽ pya'épe (Consejos para QR Más Rápidos)</value>
</data> </data>
<data name="SpeedTip1" xml:space="preserve"> <data name="SpeedTip1" xml:space="preserve">
<value>URLs cortas se generan mas rapido</value> <value>URLs cortas se generan mas rapido</value>
@ -247,7 +247,7 @@
<value>Desbloquea todas las funciones premium!</value> <value>Desbloquea todas las funciones premium!</value>
</data> </data>
<data name="SpecialOffer" xml:space="preserve"> <data name="SpecialOffer" xml:space="preserve">
<value>Oferta Premium!</value> <value>Jeporu porã! (Oferta Premium!)</value>
</data> </data>
<data name="LoginBenefits" xml:space="preserve"> <data name="LoginBenefits" xml:space="preserve">
<value>Elimina anuncios, accede a analisis detallados y mucho mas por solo $12.90/mes o $129.00/ano. Inicia sesion y suscribete ahora!</value> <value>Elimina anuncios, accede a analisis detallados y mucho mas por solo $12.90/mes o $129.00/ano. Inicia sesion y suscribete ahora!</value>
@ -274,10 +274,10 @@
<value>Generacion normal</value> <value>Generacion normal</value>
</data> </data>
<data name="Error" xml:space="preserve"> <data name="Error" xml:space="preserve">
<value>Error en la generacion. Intentelo de nuevo.</value> <value>Osẽ vai - Ha'e jéy (Error - Inténtalo de nuevo)</value>
</data> </data>
<data name="Success" xml:space="preserve"> <data name="Success" xml:space="preserve">
<value>Codigo QR guardado en el historial!</value> <value>Ñongatu porã! Código QR guardado en el historial!</value>
</data> </data>
<data name="CreateQRCodeQuickly" xml:space="preserve"> <data name="CreateQRCodeQuickly" xml:space="preserve">
<value>Crear Codigo QR Rapidamente</value> <value>Crear Codigo QR Rapidamente</value>
@ -505,7 +505,7 @@
<value>Política de Privacidad</value> <value>Política de Privacidad</value>
</data> </data>
<data name="PaymentSuccessful" xml:space="preserve"> <data name="PaymentSuccessful" xml:space="preserve">
<value>¡Pago exitoso!</value> <value>¡Jehepy porã! (Pago exitoso!)</value>
</data> </data>
<data name="BackToHome" xml:space="preserve"> <data name="BackToHome" xml:space="preserve">
<value>Volver al Inicio</value> <value>Volver al Inicio</value>
@ -697,7 +697,7 @@
<value>Tamaños menores aceleran la descarga</value> <value>Tamaños menores aceleran la descarga</value>
</data> </data>
<data name="WhyQRRapidoFaster" xml:space="preserve"> <data name="WhyQRRapidoFaster" xml:space="preserve">
<value>¿Por qué QR Rapido es más rápido?</value> <value>Mba'ére QR Rápido pya'eve? (¿Por qué es más rápido?)</value>
</data> </data>
<data name="ComparisonOtherGenerators" xml:space="preserve"> <data name="ComparisonOtherGenerators" xml:space="preserve">
<value>Comparación con otros generadores populares</value> <value>Comparación con otros generadores populares</value>
@ -736,7 +736,7 @@
<value>Historial</value> <value>Historial</value>
</data> </data>
<data name="PremiumActive" xml:space="preserve"> <data name="PremiumActive" xml:space="preserve">
<value>Premium Activo</value> <value>Premium hendyva (Activo)</value>
</data> </data>
<data name="Logout" xml:space="preserve"> <data name="Logout" xml:space="preserve">
<value>Salir</value> <value>Salir</value>
@ -754,10 +754,10 @@
<value>1.2 segundos</value> <value>1.2 segundos</value>
</data> </data>
<data name="AverageTimeSuffix" xml:space="preserve"> <data name="AverageTimeSuffix" xml:space="preserve">
<value>por código QR • Gratis • Sin registro obligatorio</value> <value>por código QR • Rei rehe (Gratis) • Sin registro obligatorio</value>
</data> </data>
<data name="FastestQRGeneratorDescription" xml:space="preserve"> <data name="FastestQRGeneratorDescription" xml:space="preserve">
<value>El generador de códigos QR más rápido de la web. Gratis, seguro y confiable.</value> <value>El generador de códigos QR pya'eve (ás rápido) de la web. Rei rehe (Gratis), seguro y confiable.</value>
</data> </data>
<data name="UsefulLinks" xml:space="preserve"> <data name="UsefulLinks" xml:space="preserve">
<value>Enlaces Útiles</value> <value>Enlaces Útiles</value>
@ -783,4 +783,191 @@
<data name="AnonymousUserLimit" xml:space="preserve"> <data name="AnonymousUserLimit" xml:space="preserve">
<value>Usuarios anónimos: 3 códigos QR por día</value> <value>Usuarios anónimos: 3 códigos QR por día</value>
</data> </data>
<data name="PrivacyPolicyTitle" xml:space="preserve">
<value>Política de Privacidad - QR Rapido</value>
</data>
<data name="PrivacyPolicyDescription" xml:space="preserve">
<value>Conocé nuestra política de privacidad y cómo protegemos tus datos personales en QR Rapido.</value>
</data>
<data name="PrivacyPolicyLastUpdated" xml:space="preserve">
<value>Última actualización</value>
</data>
<data name="PrivacyPolicyIntroduction" xml:space="preserve">
<value>Esta Política de Privacidad describe cómo QR Rapido ("nosotros", "nuestro" o "nuestra") recolecta, usa y protege la información que proporcionás cuando usás nuestro servicio de generación de códigos QR.</value>
</data>
<data name="PrivacyDataCollection" xml:space="preserve">
<value>1. Recolección de Datos</value>
</data>
<data name="PrivacyDataCollectionContent" xml:space="preserve">
<value>Recolectamos la siguiente información:
• Datos de autenticación vía Google/Microsoft (nombre, email, foto de perfil)
• Contenido de los códigos QR generados (solo para usuarios registrados que eligen guardar en el historial)
• Datos de uso y estadísticas anónimas para mejorar nuestro servicio
• Información de pago procesada vía Stripe (no almacenamos datos de tarjeta)</value>
</data>
<data name="PrivacyDataUsage" xml:space="preserve">
<value>2. Uso de los Datos</value>
</data>
<data name="PrivacyDataUsageContent" xml:space="preserve">
<value>Utilizamos tus datos para:
• Proporcionar y mejorar nuestro servicio de generación de códigos QR
• Mantener tu historial de códigos QR (solo si elegís guardarlos)
• Procesar pagos de suscripciones premium
• Enviar comunicaciones relacionadas al servicio
• Cumplir obligaciones legales conforme a las leyes de protección de datos</value>
</data>
<data name="PrivacyDataProtection" xml:space="preserve">
<value>3. Protección de los Datos</value>
</data>
<data name="PrivacyDataProtectionContent" xml:space="preserve">
<value>Implementamos medidas de seguridad técnicas y organizacionales adecuadas para proteger tus datos personales contra acceso no autorizado, alteración, divulgación o destrucción, incluyendo:
• Cifrado SSL/TLS en todas las comunicaciones
• Almacenamiento seguro en servidores protegidos
• Control de acceso restringido a los datos
• Monitoreo continuo de seguridad</value>
</data>
<data name="PrivacyDataSharing" xml:space="preserve">
<value>4. Compartir Datos</value>
</data>
<data name="PrivacyDataSharingContent" xml:space="preserve">
<value>No vendemos, alquilamos ni compartimos tus datos personales con terceros, excepto:
• Con proveedores de servicios esenciales (Google, Microsoft, Stripe) para autenticación y pagos
• Cuando sea requerido por ley u orden judicial
• Para proteger nuestros derechos legales y la seguridad de los usuarios</value>
</data>
<data name="PrivacyUserRights" xml:space="preserve">
<value>5. Tus Derechos</value>
</data>
<data name="PrivacyUserRightsContent" xml:space="preserve">
<value>De acuerdo con las leyes de protección de datos, tenés derecho a:
• Acceder a tus datos personales
• Corregir datos incompletos o incorrectos
• Solicitar la eliminación de datos innecesarios
• Revocar consentimiento para tratamiento de datos
• Portabilidad de tus datos</value>
</data>
<data name="PrivacyCookies" xml:space="preserve">
<value>6. Cookies y Tecnologías Similares</value>
</data>
<data name="PrivacyCookiesContent" xml:space="preserve">
<value>Utilizamos cookies esenciales para el funcionamiento del sitio y análisis de tráfico vía Google Analytics. Podés gestionar tus preferencias de cookies en la configuración de tu navegador.</value>
</data>
<data name="PrivacyContact" xml:space="preserve">
<value>7. Contacto</value>
</data>
<data name="PrivacyContactContent" xml:space="preserve">
<value>Para consultas sobre esta Política de Privacidad o ejercer tus derechos, contactanos a través del email: contato@qrrapido.site</value>
</data>
<data name="TermsOfUseTitle" xml:space="preserve">
<value>Términos de Uso - QR Rapido</value>
</data>
<data name="TermsOfUseDescription" xml:space="preserve">
<value>Leé los términos y condiciones de uso de QR Rapido, el generador de códigos QR más rápido de América Latina.</value>
</data>
<data name="TermsLastUpdated" xml:space="preserve">
<value>Última actualización</value>
</data>
<data name="TermsIntroduction" xml:space="preserve">
<value>Estos Términos de Uso ("Términos") rigen el uso del servicio QR Rapido ("Servicio") proporcionado por nuestra empresa ("nosotros", "nuestro" o "nuestra"). Al usar nuestro Servicio, aceptás estos Términos.</value>
</data>
<data name="TermsAcceptance" xml:space="preserve">
<value>1. Aceptación de los Términos</value>
</data>
<data name="TermsAcceptanceContent" xml:space="preserve">
<value>Al acceder y usar QR Rapido, declarás tener al menos 18 años de edad o poseer autorización de padres/responsables, y aceptás cumplir estos Términos y todas las leyes aplicables.</value>
</data>
<data name="TermsServiceDescription" xml:space="preserve">
<value>2. Descripción del Servicio</value>
</data>
<data name="TermsServiceDescriptionContent" xml:space="preserve">
<value>QR Rapido es un servicio online gratuito de generación de códigos QR que ofrece:
• Generación rápida de códigos QR para diversos tipos de contenido
• Versión gratuita con limitaciones diarias
• Plan Premium con recursos avanzados e ilimitados
• Historial de códigos para usuarios registrados</value>
</data>
<data name="TermsUserResponsibilities" xml:space="preserve">
<value>3. Responsabilidades del Usuario</value>
</data>
<data name="TermsUserResponsibilitiesContent" xml:space="preserve">
<value>Te comprometés a:
• Usar el servicio únicamente para fines legales y éticos
• No generar códigos QR con contenido ofensivo, ilegal o que infrinja derechos de terceros
• No intentar comprometer la seguridad o disponibilidad del servicio
• Mantener la confidencialidad de tus credenciales de acceso</value>
</data>
<data name="TermsProhibitedUses" xml:space="preserve">
<value>4. Usos Prohibidos</value>
</data>
<data name="TermsProhibitedUsesContent" xml:space="preserve">
<value>Está prohibido usar el servicio para:
• Diseminar malware, phishing o enlaces maliciosos
• Violación de derechos de autor o propiedad intelectual
• Spam, acoso o actividades fraudulentas
• Actividades que violen leyes nacionales o internacionales</value>
</data>
<data name="TermsIntellectualProperty" xml:space="preserve">
<value>5. Propiedad Intelectual</value>
</data>
<data name="TermsIntellectualPropertyContent" xml:space="preserve">
<value>Todos los derechos sobre el software, diseño, marca y contenido de QR Rapido pertenecen a nuestra empresa. Los códigos QR generados son de tu propiedad, pero nos concedés licencia para almacenarlos según sea necesario para proporcionar el servicio.</value>
</data>
<data name="TermsLimitations" xml:space="preserve">
<value>6. Limitaciones del Servicio</value>
</data>
<data name="TermsLimitationsContent" xml:space="preserve">
<value>• Usuarios gratuitos tienen límite diario de códigos QR
• Nos reservamos el derecho de modificar o interrumpir el servicio temporalmente
• No garantizamos disponibilidad 100% del tiempo
• Podemos implementar medidas técnicas para prevenir abuso</value>
</data>
<data name="TermsPayments" xml:space="preserve">
<value>7. Pagos y Suscripciones</value>
</data>
<data name="TermsPaymentsContent" xml:space="preserve">
<value>• Suscripciones Premium son procesadas vía Stripe
• Pagos son recurrentes hasta cancelación
• Reembolsos siguen nuestra política de 7 días
• Precios pueden ser alterados mediante aviso previo de 30 días</value>
</data>
<data name="TermsLiability" xml:space="preserve">
<value>8. Limitación de Responsabilidad</value>
</data>
<data name="TermsLiabilityContent" xml:space="preserve">
<value>El servicio se proporciona "como está". No nos responsabilizamos por:
• Daños directos o indirectos derivados del uso del servicio
• Pérdida de datos o interrupción de negocios
• Uso inadecuado de los códigos QR generados por terceros
• Contenido accedido a través de los códigos QR</value>
</data>
<data name="TermsModifications" xml:space="preserve">
<value>9. Modificaciones de los Términos</value>
</data>
<data name="TermsModificationsContent" xml:space="preserve">
<value>Podemos actualizar estos Términos periódicamente. Cambios significativos serán comunicados por email o aviso en el sitio. El uso continuado después de los cambios constituye aceptación de los nuevos Términos.</value>
</data>
<data name="TermsApplicableLaw" xml:space="preserve">
<value>10. Ley Aplicable</value>
</data>
<data name="TermsApplicableLawContent" xml:space="preserve">
<value>Estos Términos se rigen por las leyes aplicables en cada jurisdicción. Las disputas serán resueltas en los tribunales competentes de cada país, sin perjuicio a tu derecho de acceso a los órganos de defensa del consumidor.</value>
</data>
<data name="TermsContact" xml:space="preserve">
<value>11. Contacto</value>
</data>
<data name="TermsContactContent" xml:space="preserve">
<value>Para dudas sobre estos Términos de Uso, contactanos: contato@qrrapido.site</value>
</data>
<data name="BackToHome" xml:space="preserve">
<value>Volver al Inicio</value>
</data>
</root> </root>

View File

@ -873,4 +873,206 @@
<data name="Deleting" xml:space="preserve"> <data name="Deleting" xml:space="preserve">
<value>Excluindo</value> <value>Excluindo</value>
</data> </data>
<data name="PrivacyPolicyTitle" xml:space="preserve">
<value>Política de Privacidade - QR Rapido</value>
</data>
<data name="PrivacyPolicyDescription" xml:space="preserve">
<value>Conheça nossa política de privacidade e como protegemos seus dados pessoais no QR Rapido.</value>
</data>
<data name="PrivacyPolicyLastUpdated" xml:space="preserve">
<value>Última atualização</value>
</data>
<data name="PrivacyPolicyIntroduction" xml:space="preserve">
<value>Esta Política de Privacidade descreve como o QR Rapido ("nós", "nosso" ou "nossa") coleta, usa e protege as informações que você fornece quando usa nosso serviço de geração de códigos QR.</value>
</data>
<data name="PrivacyDataCollection" xml:space="preserve">
<value>1. Coleta de Dados</value>
</data>
<data name="PrivacyDataCollectionContent" xml:space="preserve">
<value>Coletamos as seguintes informações:
• Dados de autenticação via Google/Microsoft (nome, email, foto de perfil)
• Conteúdo dos QR codes gerados (apenas para usuários logados que optam por salvar no histórico)
• Dados de uso e estatísticas anônimas para melhorar nosso serviço
• Informações de pagamento processadas via Stripe (não armazenamos dados do cartão)</value>
</data>
<data name="PrivacyDataUsage" xml:space="preserve">
<value>2. Uso dos Dados</value>
</data>
<data name="PrivacyDataUsageContent" xml:space="preserve">
<value>Utilizamos seus dados para:
• Fornecer e melhorar nosso serviço de geração de QR codes
• Manter seu histórico de QR codes (apenas se você optar por salvar)
• Processar pagamentos de assinaturas premium
• Enviar comunicações relacionadas ao serviço
• Cumprir obrigações legais conforme a Lei Geral de Proteção de Dados (LGPD)</value>
</data>
<data name="PrivacyDataProtection" xml:space="preserve">
<value>3. Proteção dos Dados</value>
</data>
<data name="PrivacyDataProtectionContent" xml:space="preserve">
<value>Implementamos medidas de segurança técnicas e organizacionais adequadas para proteger seus dados pessoais contra acesso não autorizado, alteração, divulgação ou destruição, incluindo:
• Criptografia SSL/TLS em todas as comunicações
• Armazenamento seguro em servidores protegidos
• Controle de acesso restrito aos dados
• Monitoramento contínuo de segurança</value>
</data>
<data name="PrivacyDataSharing" xml:space="preserve">
<value>4. Compartilhamento de Dados</value>
</data>
<data name="PrivacyDataSharingContent" xml:space="preserve">
<value>Não vendemos, alugamos ou compartilhamos seus dados pessoais com terceiros, exceto:
• Com provedores de serviços essenciais (Google, Microsoft, Stripe) para autenticação e pagamentos
• Quando exigido por lei ou ordem judicial
• Para proteger nossos direitos legais e a segurança dos usuários</value>
</data>
<data name="PrivacyUserRights" xml:space="preserve">
<value>5. Seus Direitos</value>
</data>
<data name="PrivacyUserRightsContent" xml:space="preserve">
<value>De acordo com a LGPD, você tem direito a:
• Acessar seus dados pessoais
• Corrigir dados incompletos ou incorretos
• Solicitar a exclusão de dados desnecessários
• Revogar consentimento para tratamento de dados
• Portabilidade dos seus dados</value>
</data>
<data name="PrivacyCookies" xml:space="preserve">
<value>6. Cookies e Tecnologias Similares</value>
</data>
<data name="PrivacyCookiesContent" xml:space="preserve">
<value>Utilizamos cookies essenciais para o funcionamento do site e análise de tráfego via Google Analytics. Você pode gerenciar suas preferências de cookies nas configurações do seu navegador.</value>
</data>
<data name="PrivacyContact" xml:space="preserve">
<value>7. Contato</value>
</data>
<data name="PrivacyContactContent" xml:space="preserve">
<value>Para questões sobre esta Política de Privacidade ou exercer seus direitos, entre em contato conosco através do email: contato@qrrapido.site</value>
</data>
<data name="TermsOfUseTitle" xml:space="preserve">
<value>Termos de Uso - QR Rapido</value>
</data>
<data name="TermsOfUseDescription" xml:space="preserve">
<value>Leia os termos e condições de uso do QR Rapido, o gerador de códigos QR mais rápido do Brasil.</value>
</data>
<data name="TermsLastUpdated" xml:space="preserve">
<value>Última atualização</value>
</data>
<data name="TermsIntroduction" xml:space="preserve">
<value>Estes Termos de Uso ("Termos") regem o uso do serviço QR Rapido ("Serviço") fornecido por nossa empresa ("nós", "nosso" ou "nossa"). Ao usar nosso Serviço, você concorda com estes Termos.</value>
</data>
<data name="TermsAcceptance" xml:space="preserve">
<value>1. Aceitação dos Termos</value>
</data>
<data name="TermsAcceptanceContent" xml:space="preserve">
<value>Ao acessar e usar o QR Rapido, você declara ter pelo menos 18 anos de idade ou possuir autorização dos pais/responsáveis, e aceita cumprir estes Termos e todas as leis aplicáveis.</value>
</data>
<data name="TermsServiceDescription" xml:space="preserve">
<value>2. Descrição do Serviço</value>
</data>
<data name="TermsServiceDescriptionContent" xml:space="preserve">
<value>O QR Rapido é um serviço online gratuito de geração de códigos QR que oferece:
• Geração rápida de códigos QR para diversos tipos de conteúdo
• Versão gratuita com limitações diárias
• Plano Premium com recursos avançados e ilimitados
• Histórico de códigos para usuários registrados</value>
</data>
<data name="TermsUserResponsibilities" xml:space="preserve">
<value>3. Responsabilidades do Usuário</value>
</data>
<data name="TermsUserResponsibilitiesContent" xml:space="preserve">
<value>Você se compromete a:
• Usar o serviço apenas para fins legais e éticos
• Não gerar códigos QR com conteúdo ofensivo, ilegal ou que infrinja direitos de terceiros
• Não tentar comprometer a segurança ou disponibilidade do serviço
• Manter a confidencialidade de suas credenciais de acesso</value>
</data>
<data name="TermsProhibitedUses" xml:space="preserve">
<value>4. Usos Proibidos</value>
</data>
<data name="TermsProhibitedUsesContent" xml:space="preserve">
<value>É proibido usar o serviço para:
• Disseminar malware, phishing ou links maliciosos
• Violação de direitos autorais ou propriedade intelectual
• Spam, assédio ou atividades fraudulentas
• Atividades que violem leis brasileiras ou internacionais</value>
</data>
<data name="TermsIntellectualProperty" xml:space="preserve">
<value>5. Propriedade Intelectual</value>
</data>
<data name="TermsIntellectualPropertyContent" xml:space="preserve">
<value>Todos os direitos sobre o software, design, marca e conteúdo do QR Rapido pertencem à nossa empresa. Os códigos QR gerados são de sua propriedade, mas você nos concede licença para armazená-los conforme necessário para fornecer o serviço.</value>
</data>
<data name="TermsLimitations" xml:space="preserve">
<value>6. Limitações do Serviço</value>
</data>
<data name="TermsLimitationsContent" xml:space="preserve">
<value>• Usuários gratuitos têm limite diário de códigos QR
• Reservamos o direito de modificar ou interromper o serviço temporariamente
• Não garantimos disponibilidade 100% do tempo
• Podemos implementar medidas técnicas para prevenir abuso</value>
</data>
<data name="TermsPayments" xml:space="preserve">
<value>7. Pagamentos e Assinaturas</value>
</data>
<data name="TermsPaymentsContent" xml:space="preserve">
<value>• Assinaturas Premium são processadas via Stripe
• Pagamentos são recorrentes até cancelamento
• Reembolsos seguem nossa política de 7 dias
• Preços podem ser alterados mediante aviso prévio de 30 dias</value>
</data>
<data name="TermsLiability" xml:space="preserve">
<value>8. Limitação de Responsabilidade</value>
</data>
<data name="TermsLiabilityContent" xml:space="preserve">
<value>O serviço é fornecido "como está". Não nos responsabilizamos por:
• Danos diretos ou indiretos decorrentes do uso do serviço
• Perda de dados ou interrupção de negócios
• Uso inadequado dos códigos QR gerados por terceiros
• Conteúdo acessado através dos códigos QR</value>
</data>
<data name="TermsModifications" xml:space="preserve">
<value>9. Modificações dos Termos</value>
</data>
<data name="TermsModificationsContent" xml:space="preserve">
<value>Podemos atualizar estes Termos periodicamente. Alterações significativas serão comunicadas por email ou aviso no site. O uso continuado após as alterações constitui aceitação dos novos Termos.</value>
</data>
<data name="TermsApplicableLaw" xml:space="preserve">
<value>10. Lei Aplicável</value>
</data>
<data name="TermsApplicableLawContent" xml:space="preserve">
<value>Estes Termos são regidos pelas leis do Brasil. Disputas serão resolvidas nos tribunais competentes do Brasil, sem prejuízo ao seu direito de acesso aos órgãos de defesa do consumidor.</value>
</data>
<data name="TermsContact" xml:space="preserve">
<value>11. Contato</value>
</data>
<data name="TermsContactContent" xml:space="preserve">
<value>Para dúvidas sobre estes Termos de Uso, entre em contato: contato@qrrapido.site</value>
</data>
<data name="BackToHome" xml:space="preserve">
<value>Voltar ao Início</value>
</data>
<data name="CookieConsentTitle" xml:space="preserve">
<value>Uso de Cookies</value>
</data>
<data name="CookieConsentMessage" xml:space="preserve">
<value>Usamos cookies para melhorar sua experiência e analisar o tráfego do site. Ao continuar navegando, você concorda com o uso de cookies.</value>
</data>
<data name="CookieAcceptAll" xml:space="preserve">
<value>Aceitar Todos</value>
</data>
<data name="CookieAcceptEssential" xml:space="preserve">
<value>Apenas Essenciais</value>
</data>
<data name="CookieLearnMore" xml:space="preserve">
<value>Saiba Mais</value>
</data>
</root> </root>

View File

@ -62,7 +62,7 @@
<div class="text-center mt-3"> <div class="text-center mt-3">
<small class="text-muted"> <small class="text-muted">
@Localizer["NoRegisterWithoutPermission"] <br> @Localizer["NoRegisterWithoutPermission"] <br>
<a href="/Home/Privacy" class="text-primary">@Localizer["PrivacyPolicy"]</a> <a href="@Url.Action("Privacy", "Home")" class="text-primary">@Localizer["PrivacyPolicy"]</a>
</small> </small>
</div> </div>
</div> </div>

133
Views/Home/Privacy.cshtml Normal file
View File

@ -0,0 +1,133 @@
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<QRRapidoApp.Resources.SharedResource> Localizer
@{
ViewData["Title"] = Localizer["PrivacyPolicyTitle"];
ViewData["Description"] = Localizer["PrivacyPolicyDescription"];
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card shadow">
<div class="card-body">
<h1 class="h2 mb-4 text-primary">
<i class="fas fa-shield-alt me-2"></i>
@Localizer["PrivacyPolicyTitle"]
</h1>
<div class="alert alert-info">
<i class="fas fa-info-circle me-2"></i>
<strong>@Localizer["PrivacyPolicyLastUpdated"]:</strong> @DateTime.Now.ToString("dd/MM/yyyy")
</div>
<div class="privacy-content">
<p class="lead">@Localizer["PrivacyPolicyIntroduction"]</p>
<hr class="my-4">
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["PrivacyDataCollection"]</h3>
<div class="privacy-section">
@Html.Raw(Localizer["PrivacyDataCollectionContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["PrivacyDataUsage"]</h3>
<div class="privacy-section">
@Html.Raw(Localizer["PrivacyDataUsageContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["PrivacyDataProtection"]</h3>
<div class="privacy-section">
@Html.Raw(Localizer["PrivacyDataProtectionContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["PrivacyDataSharing"]</h3>
<div class="privacy-section">
@Html.Raw(Localizer["PrivacyDataSharingContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["PrivacyUserRights"]</h3>
<div class="privacy-section">
@Html.Raw(Localizer["PrivacyUserRightsContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["PrivacyCookies"]</h3>
<div class="privacy-section">
@Html.Raw(Localizer["PrivacyCookiesContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["PrivacyContact"]</h3>
<div class="privacy-section">
@Html.Raw(Localizer["PrivacyContactContent"].Value.Replace("\n", "<br>"))
</div>
</div>
<hr class="my-4">
<div class="text-center">
<a href="@Url.Action("Index", "Home")" class="btn btn-primary btn-lg">
<i class="fas fa-arrow-left me-2"></i>
@Localizer["BackToHome"]
</a>
</div>
</div>
</div>
</div>
</div>
</div>
@if (ViewBag.ShowAds == true)
{
<div class="container mt-4">
<div class="row justify-content-center">
<div class="col-12 col-md-8">
<div class="alert alert-warning text-center">
<h5><i class="fas fa-star me-2"></i>@Localizer["SpecialOffer"]</h5>
<p class="mb-2">@Localizer["UpgradePremiumRemoveAds"]</p>
<a href="@Url.Action("Upgrade", "Premium")" class="btn btn-success">
@Localizer["UpgradeNowButton"]
</a>
</div>
</div>
</div>
</div>
}
<style>
.privacy-content {
line-height: 1.6;
}
.privacy-section {
margin-bottom: 1.5rem;
padding: 1rem;
background-color: #f8f9fa;
border-radius: 0.375rem;
border-left: 4px solid var(--bs-primary);
}
.privacy-section ul {
margin-bottom: 0;
padding-left: 1.5rem;
}
.card {
border: none;
border-radius: 1rem;
}
.card-body {
padding: 2rem;
}
@@media (max-width: 768px) {
.card-body {
padding: 1rem;
}
.privacy-section {
padding: 0.75rem;
}
}
</style>

153
Views/Home/Terms.cshtml Normal file
View File

@ -0,0 +1,153 @@
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<QRRapidoApp.Resources.SharedResource> Localizer
@{
ViewData["Title"] = Localizer["TermsOfUseTitle"];
ViewData["Description"] = Localizer["TermsOfUseDescription"];
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card shadow">
<div class="card-body">
<h1 class="h2 mb-4 text-primary">
<i class="fas fa-file-contract me-2"></i>
@Localizer["TermsOfUseTitle"]
</h1>
<div class="alert alert-info">
<i class="fas fa-info-circle me-2"></i>
<strong>@Localizer["TermsLastUpdated"]:</strong> @DateTime.Now.ToString("dd/MM/yyyy")
</div>
<div class="terms-content">
<p class="lead">@Localizer["TermsIntroduction"]</p>
<hr class="my-4">
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsAcceptance"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsAcceptanceContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsServiceDescription"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsServiceDescriptionContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsUserResponsibilities"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsUserResponsibilitiesContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsProhibitedUses"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsProhibitedUsesContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsIntellectualProperty"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsIntellectualPropertyContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsLimitations"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsLimitationsContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsPayments"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsPaymentsContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsLiability"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsLiabilityContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsModifications"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsModificationsContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsApplicableLaw"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsApplicableLawContent"].Value.Replace("\n", "<br>"))
</div>
<h3 class="h4 text-primary mt-4 mb-3">@Localizer["TermsContact"]</h3>
<div class="terms-section">
@Html.Raw(Localizer["TermsContactContent"].Value.Replace("\n", "<br>"))
</div>
</div>
<hr class="my-4">
<div class="text-center">
<a href="@Url.Action("Index", "Home")" class="btn btn-primary btn-lg">
<i class="fas fa-arrow-left me-2"></i>
@Localizer["BackToHome"]
</a>
</div>
</div>
</div>
</div>
</div>
</div>
@if (ViewBag.ShowAds == true)
{
<div class="container mt-4">
<div class="row justify-content-center">
<div class="col-12 col-md-8">
<div class="alert alert-warning text-center">
<h5><i class="fas fa-star me-2"></i>@Localizer["SpecialOffer"]</h5>
<p class="mb-2">@Localizer["UpgradePremiumRemoveAds"]</p>
<a href="@Url.Action("Upgrade", "Premium")" class="btn btn-success">
@Localizer["UpgradeNowButton"]
</a>
</div>
</div>
</div>
</div>
}
<style>
.terms-content {
line-height: 1.6;
}
.terms-section {
margin-bottom: 1.5rem;
padding: 1rem;
background-color: #f8f9fa;
border-radius: 0.375rem;
border-left: 4px solid var(--bs-primary);
}
.terms-section ul {
margin-bottom: 0;
padding-left: 1.5rem;
}
.card {
border: none;
border-radius: 1rem;
}
.card-body {
padding: 2rem;
}
@@media (max-width: 768px) {
.card-body {
padding: 1rem;
}
.terms-section {
padding: 0.75rem;
}
}
</style>

View File

@ -0,0 +1,152 @@
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<QRRapidoApp.Resources.SharedResource> Localizer
<div id="cookie-consent-banner" class="cookie-consent-banner">
<div class="cookie-consent-content">
<div class="cookie-consent-text">
<h6 class="cookie-title">
<i class="fas fa-cookie-bite me-2"></i>
@Localizer["CookieConsentTitle"]
</h6>
<p class="cookie-message mb-3">
@Localizer["CookieConsentMessage"]
<a href="@Url.Action("Privacy", "Home")" class="text-primary text-decoration-none">
@Localizer["CookieLearnMore"]
</a>
</p>
</div>
<div class="cookie-consent-actions">
<button id="cookie-accept-essential" class="btn btn-outline-secondary btn-sm me-2">
@Localizer["CookieAcceptEssential"]
</button>
<button id="cookie-accept-all" class="btn btn-primary btn-sm">
@Localizer["CookieAcceptAll"]
</button>
</div>
</div>
</div>
<style>
.cookie-consent-banner {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: rgba(33, 37, 41, 0.95);
backdrop-filter: blur(10px);
color: white;
z-index: 9999;
border-top: 3px solid var(--bs-primary);
box-shadow: 0 -4px 15px rgba(0,0,0,0.3);
display: none;
animation: slideInUp 0.3s ease-out;
}
@@keyframes slideInUp {
from {
transform: translateY(100%);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.cookie-consent-content {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
display: flex;
align-items: center;
gap: 20px;
}
.cookie-consent-text {
flex: 1;
}
.cookie-title {
color: var(--bs-primary);
margin-bottom: 8px;
font-size: 1.1rem;
font-weight: 600;
}
.cookie-message {
font-size: 0.95rem;
line-height: 1.4;
color: #e9ecef;
}
.cookie-consent-actions {
display: flex;
gap: 10px;
flex-shrink: 0;
}
.cookie-consent-actions .btn {
border-radius: 25px;
padding: 8px 20px;
font-weight: 500;
transition: all 0.2s ease;
}
.cookie-consent-actions .btn:hover {
transform: translateY(-1px);
}
/* Responsive */
@@media (max-width: 768px) {
.cookie-consent-content {
flex-direction: column;
text-align: center;
padding: 15px;
}
.cookie-consent-actions {
flex-direction: column;
width: 100%;
gap: 8px;
}
.cookie-consent-actions .btn {
width: 100%;
}
.cookie-message {
font-size: 0.9rem;
}
}
@@media (max-width: 480px) {
.cookie-consent-content {
padding: 12px;
}
.cookie-title {
font-size: 1rem;
}
.cookie-message {
font-size: 0.85rem;
}
}
/* Animação de saída */
.cookie-consent-banner.hidden {
animation: slideOutDown 0.3s ease-in;
animation-fill-mode: forwards;
}
@@keyframes slideOutDown {
from {
transform: translateY(0);
opacity: 1;
}
to {
transform: translateY(100%);
opacity: 0;
}
}
</style>

View File

@ -80,8 +80,14 @@
<script> <script>
window.dataLayer = window.dataLayer || []; window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);} function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'GA_MEASUREMENT_ID', { // Initialize with denied consent for GDPR compliance
gtag('consent', 'default', {
'analytics_storage': 'denied'
});
gtag('js', new Date());
gtag('config', 'GA_MEASUREMENT_ID', {
send_page_view: false send_page_view: false
}); });
@ -184,9 +190,9 @@
<i class="fas fa-globe"></i> <span id="current-lang">PT</span> <i class="fas fa-globe"></i> <span id="current-lang">PT</span>
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" data-lang="pt-BR">🇧🇷 Português</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">🇪🇸 Español</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="en">🇺🇸 English</a></li> @* <li><a class="dropdown-item" href="#" data-lang="en">🇺🇸 English</a></li> *@
</ul> </ul>
</div> </div>
@ -294,8 +300,8 @@
<div class="col-md-3"> <div class="col-md-3">
<h6>@Localizer["UsefulLinks"]</h6> <h6>@Localizer["UsefulLinks"]</h6>
<ul class="list-unstyled"> <ul class="list-unstyled">
<li><a href="/Home/Privacy" class="text-light">@Localizer["Privacy"]</a></li> <li><a href="@Url.Action("Privacy", "Home")" class="text-light">@Localizer["Privacy"]</a></li>
<li><a href="/Home/Terms" class="text-light">@Localizer["TermsOfUse"]</a></li> <li><a href="@Url.Action("Terms", "Home")" class="text-light">@Localizer["TermsOfUse"]</a></li>
<li><a href="/Premium/Upgrade" class="text-warning">Premium</a></li> <li><a href="/Premium/Upgrade" class="text-warning">Premium</a></li>
</ul> </ul>
</div> </div>
@ -314,6 +320,9 @@
</div> </div>
</footer> </footer>
<!-- Cookie Consent Banner -->
@await Html.PartialAsync("_CookieConsent")
<!-- Bootstrap 5 JS --> <!-- Bootstrap 5 JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
@ -322,6 +331,7 @@
<script src="~/js/qr-speed-generator.js" asp-append-version="true"></script> <script src="~/js/qr-speed-generator.js" asp-append-version="true"></script>
<script src="~/js/language-switcher.js" asp-append-version="true"></script> <script src="~/js/language-switcher.js" asp-append-version="true"></script>
<script src="~/js/theme-toggle.js" asp-append-version="true"></script> <script src="~/js/theme-toggle.js" asp-append-version="true"></script>
<script src="~/js/cookie-consent.js" asp-append-version="true"></script>
<!-- Fallback inline script for debug --> <!-- Fallback inline script for debug -->
<script> <script>

View File

@ -0,0 +1,182 @@
// Cookie Consent Manager for QR Rapido
class CookieConsentManager {
constructor() {
this.CONSENT_COOKIE = 'qrrapido_cookie_consent';
this.CONSENT_EXPIRY_DAYS = 365;
this.banner = null;
this.init();
}
init() {
// Wait for DOM to be ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => this.setup());
} else {
this.setup();
}
}
setup() {
this.banner = document.getElementById('cookie-consent-banner');
if (!this.banner) {
console.warn('Cookie consent banner not found');
return;
}
// Check if user has already given consent
if (!this.hasConsent()) {
this.showBanner();
}
// Setup event listeners
this.setupEventListeners();
}
setupEventListeners() {
const acceptAllBtn = document.getElementById('cookie-accept-all');
const acceptEssentialBtn = document.getElementById('cookie-accept-essential');
if (acceptAllBtn) {
acceptAllBtn.addEventListener('click', () => this.acceptAll());
}
if (acceptEssentialBtn) {
acceptEssentialBtn.addEventListener('click', () => this.acceptEssential());
}
}
hasConsent() {
const consent = this.getCookie(this.CONSENT_COOKIE);
return consent === 'all' || consent === 'essential';
}
acceptAll() {
this.setConsent('all');
this.enableAnalytics();
this.hideBanner();
console.log('✅ User accepted all cookies - Analytics enabled');
}
acceptEssential() {
this.setConsent('essential');
this.disableAnalytics();
this.hideBanner();
console.log('⚡ User accepted essential cookies only - Analytics disabled');
}
setConsent(type) {
const expiryDate = new Date();
expiryDate.setTime(expiryDate.getTime() + (this.CONSENT_EXPIRY_DAYS * 24 * 60 * 60 * 1000));
document.cookie = `${this.CONSENT_COOKIE}=${type}; expires=${expiryDate.toUTCString()}; path=/; SameSite=Lax`;
}
enableAnalytics() {
// Enable Google Analytics if gtag is available
if (typeof gtag !== 'undefined') {
gtag('consent', 'update', {
'analytics_storage': 'granted'
});
}
// Enable other tracking if needed
this.enableGoogleAnalytics();
}
disableAnalytics() {
// Disable Google Analytics
if (typeof gtag !== 'undefined') {
gtag('consent', 'update', {
'analytics_storage': 'denied'
});
}
// Clear existing analytics cookies
this.clearAnalyticsCookies();
}
enableGoogleAnalytics() {
// Google Analytics is already loaded in _Layout.cshtml
// This just ensures consent is properly granted
if (typeof gtag !== 'undefined') {
// Send a page view event to confirm analytics is working
gtag('event', 'cookie_consent_granted', {
'event_category': 'Cookie Consent',
'event_label': 'Analytics Enabled'
});
}
}
clearAnalyticsCookies() {
// Clear Google Analytics cookies
const gaCookies = ['_ga', '_gid', '_gat', '_gtag_GA_MEASUREMENT_ID'];
gaCookies.forEach(cookieName => {
// Clear for current domain
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;`;
// Clear for parent domain
const domain = window.location.hostname.replace(/^www\./, '.');
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain};`;
});
console.log('🧹 Analytics cookies cleared');
}
showBanner() {
if (this.banner) {
this.banner.style.display = 'block';
// Add body padding to prevent content overlap
document.body.style.paddingBottom = this.banner.offsetHeight + 'px';
}
}
hideBanner() {
if (this.banner) {
this.banner.classList.add('hidden');
// Remove body padding
document.body.style.paddingBottom = '0';
setTimeout(() => {
this.banner.style.display = 'none';
this.banner.classList.remove('hidden');
}, 300);
}
}
getCookie(name) {
const nameEQ = name + '=';
const ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
// Public method to check consent status
getConsentStatus() {
return this.getCookie(this.CONSENT_COOKIE);
}
// Public method to revoke consent (for privacy settings)
revokeConsent() {
document.cookie = `${this.CONSENT_COOKIE}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;`;
this.clearAnalyticsCookies();
this.showBanner();
}
}
// Initialize cookie consent manager
const cookieConsent = new CookieConsentManager();
// Make it globally available for debugging/manual control
window.cookieConsent = cookieConsent;

View File

@ -13,7 +13,7 @@ document.addEventListener('DOMContentLoaded', function () {
// Get current culture from URL or default to pt-BR // Get current culture from URL or default to pt-BR
function getCurrentCulture() { function getCurrentCulture() {
const pathSegments = window.location.pathname.split('/').filter(segment => segment); const pathSegments = window.location.pathname.split('/').filter(segment => segment);
const supportedCultures = ['pt-BR', 'es', 'en']; const supportedCultures = ['pt-BR', 'es-PY', 'es'];
if (pathSegments.length > 0 && supportedCultures.includes(pathSegments[0])) { if (pathSegments.length > 0 && supportedCultures.includes(pathSegments[0])) {
return pathSegments[0]; return pathSegments[0];
@ -26,8 +26,8 @@ document.addEventListener('DOMContentLoaded', function () {
function updateCurrentLanguageDisplay(culture) { function updateCurrentLanguageDisplay(culture) {
const langMap = { const langMap = {
'pt-BR': 'PT', 'pt-BR': 'PT',
'es': 'ES', 'es-PY': 'ES',
'en': 'EN' 'es': 'ES'
}; };
if (currentLangSpan) { if (currentLangSpan) {
@ -43,7 +43,7 @@ document.addEventListener('DOMContentLoaded', function () {
// Remove existing culture from path if present // Remove existing culture from path if present
const pathSegments = currentPath.split('/').filter(segment => segment); const pathSegments = currentPath.split('/').filter(segment => segment);
const supportedCultures = ['pt-BR', 'es', 'en']; const supportedCultures = ['pt-BR', 'es-PY', 'es'];
// Remove current culture if it's the first segment // Remove current culture if it's the first segment
if (pathSegments.length > 0 && supportedCultures.includes(pathSegments[0])) { if (pathSegments.length > 0 && supportedCultures.includes(pathSegments[0])) {
@ -76,25 +76,9 @@ document.addEventListener('DOMContentLoaded', function () {
// Set culture cookie for server-side processing // Set culture cookie for server-side processing
document.cookie = `culture=${selectedLang}; path=/; max-age=31536000; SameSite=Lax`; document.cookie = `culture=${selectedLang}; path=/; max-age=31536000; SameSite=Lax`;
// Clear any cache and force full reload // Navigate to new URL with selected language
if ('caches' in window) {
caches.keys().then(names => {
names.forEach(name => caches.delete(name));
});
}
// Force complete page reload with cache busting
const newUrl = buildLocalizedUrl(selectedLang); const newUrl = buildLocalizedUrl(selectedLang);
// Na função de troca de idioma, substitua:
window.location.href = newUrl; window.location.href = newUrl;
// Por:
window.location.replace(newUrl);
// OU
window.location.href = newUrl + (newUrl.includes('?') ? '&' : '?') + '_t=' + Date.now();
//window.location.replace(newUrl + '?_refresh=' + Date.now());
}); });
}); });
@ -123,9 +107,8 @@ function getUserPreferredLanguage() {
const langMap = { const langMap = {
'pt': 'pt-BR', 'pt': 'pt-BR',
'pt-BR': 'pt-BR', 'pt-BR': 'pt-BR',
'es': 'es', 'es': 'es-PY',
'es-PY': 'pt-BR', // Special case: Paraguay Spanish -> Portuguese 'es-PY': 'es-PY'
'en': 'en'
}; };
// Check exact match first // Check exact match first