From 84b058904f911b1d1f643356b334f4a92f0cad6b Mon Sep 17 00:00:00 2001 From: Ricardo Carneiro Date: Sun, 14 Sep 2025 21:26:16 -0300 Subject: [PATCH] fix: adiversos ajustes e mais 1 conversor --- .claude/settings.local.json | 8 +- .gitea/workflows/deploy.yml | 2 + .../Controllers/HeicToJpgController.cs | 273 +++++++++++ .../Controllers/JpgToWebpController.cs | 219 ++++++++- .../Views/HeicToJpg/Index.cshtml | 451 +++++++++++++++++ .../Views/HeicToJpg/Index.es-CL.resx | 146 ++++++ .../Views/HeicToJpg/Index.es-MX.resx | 146 ++++++ .../Views/HeicToJpg/Index.es-PY.resx | 146 ++++++ .../Views/HeicToJpg/Index.pt-BR.resx | 146 ++++++ .../Views/JpgToWebp/Index.cshtml | 457 +++++++++++++++++- .../Views/JpgToWebp/Index.es-CL.resx | 57 ++- .../Views/JpgToWebp/Index.es-MX.resx | 57 ++- .../Views/JpgToWebp/Index.es-PY.resx | 57 ++- .../Views/JpgToWebp/Index.pt-BR.resx | 57 ++- .../Controllers/CaseConverterController.cs | 14 +- .../Views/CaseConverter/Index.cshtml | 75 +++ Controllers/HealthController.cs | 100 ++++ Controllers/HomeController.cs | 35 +- Convert-It.csproj | 13 + Program.cs | 180 ++++++- Properties/launchSettings.json | 3 +- Services/UrlTranslationService.cs | 12 +- SharedResource.es-CL.resx | 191 +++++++- SharedResource.es-MX.resx | 151 ++++++ SharedResource.es-PY.resx | 175 ++++++- SharedResource.pt-BR.resx | 156 ++++++ Views/Home/Index.cshtml | 48 +- Views/Shared/_Layout.cshtml | 11 +- appsettings.json | 13 + 29 files changed, 3262 insertions(+), 137 deletions(-) create mode 100644 Areas/ImageConverters/Controllers/HeicToJpgController.cs create mode 100644 Areas/ImageConverters/Views/HeicToJpg/Index.cshtml create mode 100644 Areas/ImageConverters/Views/HeicToJpg/Index.es-CL.resx create mode 100644 Areas/ImageConverters/Views/HeicToJpg/Index.es-MX.resx create mode 100644 Areas/ImageConverters/Views/HeicToJpg/Index.es-PY.resx create mode 100644 Areas/ImageConverters/Views/HeicToJpg/Index.pt-BR.resx create mode 100644 Controllers/HealthController.cs create mode 100644 appsettings.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 14f8069..9ac035b 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -11,7 +11,13 @@ "Bash(dotnet run:*)", "Bash(find:*)", "Bash(pkill:*)", - "WebFetch(domain:localhost)" + "WebFetch(domain:localhost)", + "WebSearch", + "WebFetch(domain:products.openize.com)", + "WebFetch(domain:github.com)", + "WebFetch(domain:gist.github.com)", + "Bash(dotnet list:*)", + "Bash(dotnet build:*)" ], "deny": [], "ask": [] diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 1fe495a..f76a591 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -109,6 +109,7 @@ jobs: -e DOTNET_USE_POLLING_FILE_WATCHER=true \ -e DOTNET_EnableDiagnostics=0 \ -e DOTNET_RUNNING_IN_CONTAINER=true \ + -e Serilog__OpenSearchUrl="http://localhost:9202" \ registry.redecarneir.us/convertit:latest # Limpa imagens não utilizadas @@ -159,6 +160,7 @@ jobs: -e DOTNET_USE_POLLING_FILE_WATCHER=true \ -e DOTNET_EnableDiagnostics=0 \ -e DOTNET_RUNNING_IN_CONTAINER=true \ + -e Serilog__OpenSearchUrl="http://localhost:9200" \ registry.redecarneir.us/convertit:latest-staging # Limpa imagens não utilizadas diff --git a/Areas/ImageConverters/Controllers/HeicToJpgController.cs b/Areas/ImageConverters/Controllers/HeicToJpgController.cs new file mode 100644 index 0000000..ae243df --- /dev/null +++ b/Areas/ImageConverters/Controllers/HeicToJpgController.cs @@ -0,0 +1,273 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Localization; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats.Jpeg; +using System.IO; +using HeyRed.ImageSharp.Heif; + +namespace Convert_It_Online.Areas.ImageConverters.Controllers +{ + [Area("ImageConverters")] + public class HeicToJpgController : Controller + { + private readonly IStringLocalizer _localizer; + private readonly ILogger _logger; + + public HeicToJpgController(IStringLocalizer localizer, ILogger logger) + { + _localizer = localizer; + _logger = logger; + } + + private void SetCommonViewBagProperties() + { + ViewBag.HomeLink = _localizer["HomeLink"]; + ViewBag.TextMenuTitle = _localizer["TextMenuTitle"]; + ViewBag.ImageMenuTitle = _localizer["ImageMenuTitle"]; + ViewBag.CaseConverterTitle = _localizer["CaseConverterTitle"]; + ViewBag.JpgToWebpTitle = _localizer["JpgToWebpTitle"]; + ViewBag.HeicToJpgTitle = _localizer["HeicToJpgTitle"]; + ViewBag.FooterText = _localizer["FooterText"]; + ViewBag.About = _localizer["About"]; + ViewBag.Contact = _localizer["Contact"]; + ViewBag.Terms = _localizer["Terms"]; + } + + private void PrepareIndexView() + { + SetCommonViewBagProperties(); + ViewBag.PageTitle = _localizer["HeicConverterPageTitle"]; + ViewBag.PageDescription = _localizer["HeicConverterPageDescription"]; + ViewBag.HeicToJpgTabTitle = _localizer["HeicToJpgTabTitle"]; + ViewBag.JpgToHeicTabTitle = _localizer["JpgToHeicTabTitle"]; + ViewBag.HeicFileInputLabel = _localizer["HeicFileInputLabel"]; + ViewBag.JpgFileInputLabel = _localizer["JpgFileInputLabel"]; + ViewBag.ConvertToJpgButton = _localizer["ConvertToJpgButton"]; + ViewBag.ConvertToHeicButton = _localizer["ConvertToHeicButton"]; + + // FAQ properties + ViewBag.FaqWhatTitle = _localizer["HeicFaqWhatTitle"]; + ViewBag.FaqWhatContent = _localizer["HeicFaqWhatContent"]; + ViewBag.FaqHowTitle = _localizer["HeicFaqHowTitle"]; + ViewBag.FaqHowContent = _localizer["HeicFaqHowContent"]; + ViewBag.FaqWhyTitle = _localizer["HeicFaqWhyTitle"]; + ViewBag.FaqWhyContent = _localizer["HeicFaqWhyContent"]; + ViewBag.FaqSecurityTitle = _localizer["HeicFaqSecurityTitle"]; + ViewBag.FaqSecurityContent = _localizer["HeicFaqSecurityContent"]; + ViewBag.FaqLimitsTitle = _localizer["HeicFaqLimitsTitle"]; + ViewBag.FaqLimitsContent = _localizer["HeicFaqLimitsContent"]; + } + + public IActionResult Index() + { + PrepareIndexView(); + return View(); + } + + [HttpPost] + public async Task ConvertHeicToJpg(IFormFile heicFile, bool preview = false) + { + if (heicFile == null || heicFile.Length == 0) + { + _logger.LogWarning("[HEIC-CONVERTER] Tentativa de conversão sem arquivo"); + if (preview) + { + return Json(new { success = false, message = _localizer["SelectFileError"].Value }); + } + ModelState.AddModelError("heicFile", _localizer["SelectFileError"]); + PrepareIndexView(); + return View("Index"); + } + + var allowedTypes = new[] { "image/heic", "image/heif", "application/octet-stream" }; + if (!allowedTypes.Contains(heicFile.ContentType) && !heicFile.FileName.ToLower().EndsWith(".heic") && !heicFile.FileName.ToLower().EndsWith(".heif")) + { + _logger.LogWarning("[HEIC-CONVERTER] Arquivo inválido: {ContentType}", heicFile.ContentType); + if (preview) + { + return Json(new { success = false, message = _localizer["InvalidHeicFileError"].Value }); + } + ModelState.AddModelError("heicFile", _localizer["InvalidHeicFileError"]); + PrepareIndexView(); + return View("Index"); + } + + try + { + _logger.LogInformation("[HEIC-CONVERTER] Iniciando conversão HEIC→JPG: {FileName} ({Size} bytes)", + heicFile.FileName, heicFile.Length); + + var originalSize = heicFile.Length; + + // Limite para preview: 10MB + const long maxPreviewSize = 10 * 1024 * 1024; + + using var heicStream = heicFile.OpenReadStream(); + using var image = await Image.LoadAsync(heicStream); + + using var memoryStream = new MemoryStream(); + await image.SaveAsJpegAsync(memoryStream); + var jpegData = memoryStream.ToArray(); + var convertedSize = jpegData.Length; + + var fileName = Path.GetFileNameWithoutExtension(heicFile.FileName) + ".jpg"; + + _logger.LogInformation("[HEIC-CONVERTER] Conversão HEIC→JPG concluída: {OutputFileName} (Original: {OriginalSize}bytes → Convertido: {ConvertedSize}bytes)", + fileName, originalSize, convertedSize); + + // Se é request de preview e o arquivo não é muito grande + if (preview && originalSize <= maxPreviewSize && convertedSize <= maxPreviewSize) + { + var base64 = Convert.ToBase64String(jpegData); + var base64DataUrl = $"data:image/jpeg;base64,{base64}"; + + return Json(new + { + success = true, + base64 = base64DataUrl, + filename = fileName, + originalSize = originalSize, + convertedSize = convertedSize + }); + } + + // Download normal (lógica original) + return File(jpegData, "image/jpeg", fileName); + } + catch (UnknownImageFormatException) + { + _logger.LogWarning("[HEIC-CONVERTER] O arquivo HEIC parece ser inválido ou o formato não é suportado. Verifique se a biblioteca 'libheif' está instalada no sistema."); + if (preview) + { + return Json(new { success = false, message = _localizer["InvalidHeicFileError"].Value }); + } + ModelState.AddModelError("heicFile", _localizer["InvalidHeicFileError"]); + ViewBag.ConversionError = _localizer["InvalidHeicFileError"]; + PrepareIndexView(); + return View("Index"); + } + catch (Exception ex) + { + _logger.LogError(ex, "[HEIC-CONVERTER] Erro ao converter HEIC para JPG: {FileName}", heicFile.FileName); + if (preview) + { + return Json(new { success = false, message = _localizer["ProcessingError"].Value }); + } + ModelState.AddModelError("heicFile", _localizer["ProcessingError"]); + ViewBag.ConversionError = _localizer["ProcessingError"]; + PrepareIndexView(); + return View("Index"); + } + } + + [HttpPost] + public async Task ConvertJpgToHeic(IFormFile jpgFile, bool preview = false) + { + if (jpgFile == null || jpgFile.Length == 0) + { + _logger.LogWarning("[HEIC-CONVERTER] Tentativa de conversão JPG→HEIC sem arquivo"); + if (preview) + { + return Json(new { success = false, message = _localizer["SelectFileError"].Value }); + } + ModelState.AddModelError("jpgFile", _localizer["SelectFileError"]); + PrepareIndexView(); + return View("Index"); + } + + if (jpgFile.ContentType != "image/jpeg" && !jpgFile.FileName.ToLower().EndsWith(".jpg") && !jpgFile.FileName.ToLower().EndsWith(".jpeg")) + { + _logger.LogWarning("[HEIC-CONVERTER] Arquivo JPG inválido: {ContentType}", jpgFile.ContentType); + if (preview) + { + return Json(new { success = false, message = _localizer["InvalidJpgFileError"].Value }); + } + ModelState.AddModelError("jpgFile", _localizer["InvalidJpgFileError"]); + PrepareIndexView(); + return View("Index"); + } + + try + { + _logger.LogInformation("[HEIC-CONVERTER] Iniciando conversão JPG→HEIC: {FileName} ({Size} bytes)", + jpgFile.FileName, jpgFile.Length); + + var originalSize = jpgFile.Length; + + // Limite para preview: 10MB + const long maxPreviewSize = 10 * 1024 * 1024; + + using var jpgStream = jpgFile.OpenReadStream(); + using var image = await Image.LoadAsync(jpgStream); + + using var memoryStream = new MemoryStream(); + + // Salvar como HEIC usando o encoder disponível + await image.SaveAsync(memoryStream, new HeyRed.ImageSharp.Heif.Formats.Heif.HeifEncoder()); + var heicData = memoryStream.ToArray(); + var convertedSize = heicData.Length; + + var fileName = Path.GetFileNameWithoutExtension(jpgFile.FileName) + ".heic"; + + _logger.LogInformation("[HEIC-CONVERTER] Conversão JPG→HEIC concluída: {OutputFileName} (Original: {OriginalSize}bytes → Convertido: {ConvertedSize}bytes)", + fileName, originalSize, convertedSize); + + // Se é request de preview e o arquivo não é muito grande + if (preview && originalSize <= maxPreviewSize && convertedSize <= maxPreviewSize) + { + var base64 = Convert.ToBase64String(heicData); + var base64DataUrl = $"data:image/heic;base64,{base64}"; + + return Json(new + { + success = true, + base64 = base64DataUrl, + filename = fileName, + originalSize = originalSize, + convertedSize = convertedSize + }); + } + + // Download normal + return File(heicData, "image/heic", fileName); + } + catch (UnknownImageFormatException) + { + _logger.LogWarning("[HEIC-CONVERTER] O arquivo JPG parece ser inválido ou o formato não é suportado."); + if (preview) + { + return Json(new { success = false, message = _localizer["InvalidJpgFileError"].Value }); + } + ModelState.AddModelError("jpgFile", _localizer["InvalidJpgFileError"]); + ViewBag.ConversionError = _localizer["InvalidJpgFileError"]; + PrepareIndexView(); + return View("Index"); + } + catch (NotSupportedException) + { + _logger.LogWarning("[HEIC-CONVERTER] Conversão JPG→HEIC não é suportada pela biblioteca atual."); + var errorMsg = "Conversão JPG→HEIC ainda não está disponível. A biblioteca não suporta encoding HEIC."; + if (preview) + { + return Json(new { success = false, message = errorMsg }); + } + ModelState.AddModelError("jpgFile", errorMsg); + ViewBag.ConversionError = errorMsg; + PrepareIndexView(); + return View("Index"); + } + catch (Exception ex) + { + _logger.LogError(ex, "[HEIC-CONVERTER] Erro ao converter JPG para HEIC: {FileName}", jpgFile.FileName); + if (preview) + { + return Json(new { success = false, message = _localizer["ProcessingError"].Value }); + } + ModelState.AddModelError("jpgFile", _localizer["ProcessingError"]); + ViewBag.ConversionError = _localizer["ProcessingError"]; + PrepareIndexView(); + return View("Index"); + } + } + } +} \ No newline at end of file diff --git a/Areas/ImageConverters/Controllers/JpgToWebpController.cs b/Areas/ImageConverters/Controllers/JpgToWebpController.cs index 3d1e6ce..b316bed 100644 --- a/Areas/ImageConverters/Controllers/JpgToWebpController.cs +++ b/Areas/ImageConverters/Controllers/JpgToWebpController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Localization; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Webp; +using SixLabors.ImageSharp.Formats.Jpeg; namespace Convert_It_Online.Areas.ImageConverters.Controllers { @@ -9,10 +10,12 @@ namespace Convert_It_Online.Areas.ImageConverters.Controllers public class JpgToWebpController : Controller { private readonly IStringLocalizer _localizer; + private readonly ILogger _logger; - public JpgToWebpController(IStringLocalizer localizer) + public JpgToWebpController(IStringLocalizer localizer, ILogger logger) { _localizer = localizer; + _logger = logger; } private void SetCommonViewBagProperties() @@ -28,49 +31,223 @@ namespace Convert_It_Online.Areas.ImageConverters.Controllers ViewBag.Terms = _localizer["Terms"]; } - public IActionResult Index() + private void PrepareIndexView() { SetCommonViewBagProperties(); - ViewBag.PageTitle = _localizer["ImageConverterPageTitle"]; - ViewBag.PageDescription = _localizer["ImageConverterPageDescription"]; - ViewBag.FileInputLabel = _localizer["FileInputLabel"]; - ViewBag.ConvertButton = _localizer["ConvertButton"]; - + ViewBag.PageTitle = _localizer["JpgWebpConverterPageTitle"]; + ViewBag.PageDescription = _localizer["JpgWebpConverterPageDescription"]; + ViewBag.JpgToWebpTabTitle = _localizer["JpgToWebpTabTitle"]; + ViewBag.WebpToJpgTabTitle = _localizer["WebpToJpgTabTitle"]; + ViewBag.JpgFileInputLabel = _localizer["JpgFileInputLabel"]; + ViewBag.WebpFileInputLabel = _localizer["WebpFileInputLabel"]; + ViewBag.ConvertToWebpButton = _localizer["ConvertToWebpButton"]; + ViewBag.ConvertToJpgButton = _localizer["ConvertToJpgButton"]; + + // FAQ properties + ViewBag.FaqWhatTitle = _localizer["JpgWebpFaqWhatTitle"]; + ViewBag.FaqWhatContent = _localizer["JpgWebpFaqWhatContent"]; + ViewBag.FaqHowTitle = _localizer["JpgWebpFaqHowTitle"]; + ViewBag.FaqHowContent = _localizer["JpgWebpFaqHowContent"]; + ViewBag.FaqWhyTitle = _localizer["JpgWebpFaqWhyTitle"]; + ViewBag.FaqWhyContent = _localizer["JpgWebpFaqWhyContent"]; + ViewBag.FaqSecurityTitle = _localizer["JpgWebpFaqSecurityTitle"]; + ViewBag.FaqSecurityContent = _localizer["JpgWebpFaqSecurityContent"]; + ViewBag.FaqLimitsTitle = _localizer["JpgWebpFaqLimitsTitle"]; + ViewBag.FaqLimitsContent = _localizer["JpgWebpFaqLimitsContent"]; + } + + public IActionResult Index() + { + PrepareIndexView(); return View(); } [HttpPost] - public async Task Convert(IFormFile jpgFile) + public async Task ConvertJpgToWebp(IFormFile jpgFile, bool preview = false) { if (jpgFile == null || jpgFile.Length == 0) { - ModelState.AddModelError("jpgFile", "Por favor, selecione um arquivo."); + _logger.LogWarning("[JPG-WEBP-CONVERTER] Tentativa de conversão sem arquivo"); + if (preview) + { + return Json(new { success = false, message = _localizer["SelectFileError"].Value }); + } + ModelState.AddModelError("jpgFile", _localizer["SelectFileError"]); + PrepareIndexView(); return View("Index"); } - // Validação simples do tipo de arquivo - if (jpgFile.ContentType != "image/jpeg") + if (jpgFile.ContentType != "image/jpeg" && !jpgFile.FileName.ToLower().EndsWith(".jpg") && !jpgFile.FileName.ToLower().EndsWith(".jpeg")) { - ModelState.AddModelError("jpgFile", "Arquivo inválido. Por favor, envie um arquivo JPG."); + _logger.LogWarning("[JPG-WEBP-CONVERTER] Arquivo JPG inválido: {ContentType}", jpgFile.ContentType); + if (preview) + { + return Json(new { success = false, message = _localizer["InvalidJpgFileError"].Value }); + } + ModelState.AddModelError("jpgFile", _localizer["InvalidJpgFileError"]); + PrepareIndexView(); return View("Index"); } try { - using var imageStream = jpgFile.OpenReadStream(); - using var image = await Image.LoadAsync(imageStream); - + _logger.LogInformation("[JPG-WEBP-CONVERTER] Iniciando conversão JPG→WebP: {FileName} ({Size} bytes)", + jpgFile.FileName, jpgFile.Length); + + var originalSize = jpgFile.Length; + + // Limite para preview: 10MB + const long maxPreviewSize = 10 * 1024 * 1024; + + using var jpgStream = jpgFile.OpenReadStream(); + using var image = await Image.LoadAsync(jpgStream); + using var memoryStream = new MemoryStream(); - await image.SaveAsync(memoryStream, new WebpEncoder()); - memoryStream.Position = 0; + await image.SaveAsWebpAsync(memoryStream); + var webpData = memoryStream.ToArray(); + var convertedSize = webpData.Length; var fileName = Path.GetFileNameWithoutExtension(jpgFile.FileName) + ".webp"; - return File(memoryStream.ToArray(), "image/webp", fileName); + + _logger.LogInformation("[JPG-WEBP-CONVERTER] Conversão JPG→WebP concluída: {OutputFileName} (Original: {OriginalSize}bytes → Convertido: {ConvertedSize}bytes)", + fileName, originalSize, convertedSize); + + // Se é request de preview e o arquivo não é muito grande + if (preview && originalSize <= maxPreviewSize && convertedSize <= maxPreviewSize) + { + var base64 = Convert.ToBase64String(webpData); + var base64DataUrl = $"data:image/webp;base64,{base64}"; + + return Json(new + { + success = true, + base64 = base64DataUrl, + filename = fileName, + originalSize = originalSize, + convertedSize = convertedSize + }); + } + + // Download normal + return File(webpData, "image/webp", fileName); } - catch (Exception) + catch (UnknownImageFormatException) { - // Log do erro (não implementado aqui) - ModelState.AddModelError("jpgFile", "Ocorreu um erro ao processar a imagem."); + _logger.LogWarning("[JPG-WEBP-CONVERTER] O arquivo JPG parece ser inválido ou o formato não é suportado."); + if (preview) + { + return Json(new { success = false, message = _localizer["InvalidJpgFileError"].Value }); + } + ModelState.AddModelError("jpgFile", _localizer["InvalidJpgFileError"]); + ViewBag.ConversionError = _localizer["InvalidJpgFileError"]; + PrepareIndexView(); + return View("Index"); + } + catch (Exception ex) + { + _logger.LogError(ex, "[JPG-WEBP-CONVERTER] Erro ao converter JPG para WebP: {FileName}", jpgFile.FileName); + if (preview) + { + return Json(new { success = false, message = _localizer["ProcessingError"].Value }); + } + ModelState.AddModelError("jpgFile", _localizer["ProcessingError"]); + ViewBag.ConversionError = _localizer["ProcessingError"]; + PrepareIndexView(); + return View("Index"); + } + } + + [HttpPost] + public async Task ConvertWebpToJpg(IFormFile webpFile, bool preview = false) + { + if (webpFile == null || webpFile.Length == 0) + { + _logger.LogWarning("[JPG-WEBP-CONVERTER] Tentativa de conversão WebP→JPG sem arquivo"); + if (preview) + { + return Json(new { success = false, message = _localizer["SelectFileError"].Value }); + } + ModelState.AddModelError("webpFile", _localizer["SelectFileError"]); + PrepareIndexView(); + return View("Index"); + } + + if (webpFile.ContentType != "image/webp" && !webpFile.FileName.ToLower().EndsWith(".webp")) + { + _logger.LogWarning("[JPG-WEBP-CONVERTER] Arquivo WebP inválido: {ContentType}", webpFile.ContentType); + if (preview) + { + return Json(new { success = false, message = "Arquivo WebP inválido ou formato não suportado." }); + } + ModelState.AddModelError("webpFile", "Arquivo WebP inválido ou formato não suportado."); + PrepareIndexView(); + return View("Index"); + } + + try + { + _logger.LogInformation("[JPG-WEBP-CONVERTER] Iniciando conversão WebP→JPG: {FileName} ({Size} bytes)", + webpFile.FileName, webpFile.Length); + + var originalSize = webpFile.Length; + + // Limite para preview: 10MB + const long maxPreviewSize = 10 * 1024 * 1024; + + using var webpStream = webpFile.OpenReadStream(); + using var image = await Image.LoadAsync(webpStream); + + using var memoryStream = new MemoryStream(); + await image.SaveAsJpegAsync(memoryStream); + var jpgData = memoryStream.ToArray(); + var convertedSize = jpgData.Length; + + var fileName = Path.GetFileNameWithoutExtension(webpFile.FileName) + ".jpg"; + + _logger.LogInformation("[JPG-WEBP-CONVERTER] Conversão WebP→JPG concluída: {OutputFileName} (Original: {OriginalSize}bytes → Convertido: {ConvertedSize}bytes)", + fileName, originalSize, convertedSize); + + // Se é request de preview e o arquivo não é muito grande + if (preview && originalSize <= maxPreviewSize && convertedSize <= maxPreviewSize) + { + var base64 = Convert.ToBase64String(jpgData); + var base64DataUrl = $"data:image/jpeg;base64,{base64}"; + + return Json(new + { + success = true, + base64 = base64DataUrl, + filename = fileName, + originalSize = originalSize, + convertedSize = convertedSize + }); + } + + // Download normal + return File(jpgData, "image/jpeg", fileName); + } + catch (UnknownImageFormatException) + { + _logger.LogWarning("[JPG-WEBP-CONVERTER] O arquivo WebP parece ser inválido ou o formato não é suportado."); + if (preview) + { + return Json(new { success = false, message = "Arquivo WebP inválido ou formato não suportado." }); + } + ModelState.AddModelError("webpFile", "Arquivo WebP inválido ou formato não suportado."); + ViewBag.ConversionError = "Arquivo WebP inválido ou formato não suportado."; + PrepareIndexView(); + return View("Index"); + } + catch (Exception ex) + { + _logger.LogError(ex, "[JPG-WEBP-CONVERTER] Erro ao converter WebP para JPG: {FileName}", webpFile.FileName); + if (preview) + { + return Json(new { success = false, message = _localizer["ProcessingError"].Value }); + } + ModelState.AddModelError("webpFile", _localizer["ProcessingError"]); + ViewBag.ConversionError = _localizer["ProcessingError"]; + PrepareIndexView(); return View("Index"); } } diff --git a/Areas/ImageConverters/Views/HeicToJpg/Index.cshtml b/Areas/ImageConverters/Views/HeicToJpg/Index.cshtml new file mode 100644 index 0000000..dbb455b --- /dev/null +++ b/Areas/ImageConverters/Views/HeicToJpg/Index.cshtml @@ -0,0 +1,451 @@ +@{ + ViewData["Title"] = ViewBag.PageTitle; +} + +
+
+
+
+

@ViewBag.PageTitle

+

@ViewBag.PageDescription

+
+
+
+ +
+
+
+
+
+ Conversor de Imagens +
+
+
+ @if (ViewBag.ConversionError != null) + { + + } + + + + + +
+ +
+
+ + +
+ + +
+ Formatos aceitos: .heic, .HEIC, .heif, .HEIF (máx. 10MB para preview) +
+
+ Por favor, selecione um arquivo HEIC válido. +
+
+ +
+ + +
+
+
+ + +
+
+ + +
+ + +
+ Formatos aceitos: .jpg, .jpeg (máx. 10MB para preview) +
+
+ Por favor, selecione um arquivo JPG válido. +
+
+ +
+ + +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+

Perguntas Frequentes

+
+
+

+ +

+
+
+ @ViewBag.FaqWhatContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqHowContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqWhyContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqSecurityContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqLimitsContent +
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/Areas/ImageConverters/Views/HeicToJpg/Index.es-CL.resx b/Areas/ImageConverters/Views/HeicToJpg/Index.es-CL.resx new file mode 100644 index 0000000..e0e25c5 --- /dev/null +++ b/Areas/ImageConverters/Views/HeicToJpg/Index.es-CL.resx @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Conversor HEIC a JPG Online Gratis + + + Convierte archivos HEIC a JPG de forma rápida y segura. Herramienta gratuita, sin registro, procesamiento local. + + + + + HEIC → JPG + + + JPG → HEIC + + + + + Selecciona el archivo HEIC + + + Selecciona el archivo JPG + + + Convertir a JPG + + + Convertir a HEIC + + + + + Por favor, selecciona un archivo. + + + Archivo inválido. Por favor, sube un archivo HEIC válido. + + + Archivo inválido. Por favor, sube un archivo JPG válido. + + + Ocurrió un error al procesar la imagen. Inténtalo de nuevo. + + + Vista previa + + + + + ¿Qué es este conversor HEIC? + + + Este es un conversor online gratuito que transforma archivos HEIC (High Efficiency Image Container) al formato JPG. HEIC es el formato estándar usado por iPhones e iPads desde iOS 11, ofreciendo mejor compresión que JPG manteniendo calidad similar. + + + + ¿Cómo funciona la conversión? + + + 1. Selecciona el archivo HEIC de tu dispositivo
2. Haz clic en "Convertir a JPG"
3. El archivo será procesado localmente en el servidor
4. Descarga automática del archivo JPG convertido
5. El archivo original se elimina automáticamente después de la conversión
+
+ + + ¿Por qué convertir HEIC a JPG? + + + Compatibilidad universal: JPG es soportado por todos los dispositivos y aplicaciones
Fácil compartir: Envía fotos sin problemas de compatibilidad
Trabajo profesional: Muchos softwares aún no soportan HEIC
Web e impresión: JPG es el estándar para sitios web y gráficas
+
+ + + ¿Es seguro usar este conversor? + + + 100% Seguro: Procesamiento local en el servidor, sin envío a terceros
Privacidad garantizada: Los archivos se eliminan automáticamente después de la conversión
Sin almacenamiento: No mantenemos copias de tus archivos
Sin registro: Úsalo sin crear cuenta o proporcionar datos personales
HTTPS: Conexión cifrada para subida/descarga
+
+ + + ¿Hay limitaciones en el conversor? + + + Tamaño máximo: 50MB por archivo
Formatos aceptados: .heic, .HEIC, .JPG, .JPEG
Salida: JPG y HEIC de alta calidad
Vista previa: Límite de 10MB para visualización
Conversión bidireccional: HEIC↔JPG totalmente funcional
+
+ +
\ No newline at end of file diff --git a/Areas/ImageConverters/Views/HeicToJpg/Index.es-MX.resx b/Areas/ImageConverters/Views/HeicToJpg/Index.es-MX.resx new file mode 100644 index 0000000..e0e25c5 --- /dev/null +++ b/Areas/ImageConverters/Views/HeicToJpg/Index.es-MX.resx @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Conversor HEIC a JPG Online Gratis + + + Convierte archivos HEIC a JPG de forma rápida y segura. Herramienta gratuita, sin registro, procesamiento local. + + + + + HEIC → JPG + + + JPG → HEIC + + + + + Selecciona el archivo HEIC + + + Selecciona el archivo JPG + + + Convertir a JPG + + + Convertir a HEIC + + + + + Por favor, selecciona un archivo. + + + Archivo inválido. Por favor, sube un archivo HEIC válido. + + + Archivo inválido. Por favor, sube un archivo JPG válido. + + + Ocurrió un error al procesar la imagen. Inténtalo de nuevo. + + + Vista previa + + + + + ¿Qué es este conversor HEIC? + + + Este es un conversor online gratuito que transforma archivos HEIC (High Efficiency Image Container) al formato JPG. HEIC es el formato estándar usado por iPhones e iPads desde iOS 11, ofreciendo mejor compresión que JPG manteniendo calidad similar. + + + + ¿Cómo funciona la conversión? + + + 1. Selecciona el archivo HEIC de tu dispositivo
2. Haz clic en "Convertir a JPG"
3. El archivo será procesado localmente en el servidor
4. Descarga automática del archivo JPG convertido
5. El archivo original se elimina automáticamente después de la conversión
+
+ + + ¿Por qué convertir HEIC a JPG? + + + Compatibilidad universal: JPG es soportado por todos los dispositivos y aplicaciones
Fácil compartir: Envía fotos sin problemas de compatibilidad
Trabajo profesional: Muchos softwares aún no soportan HEIC
Web e impresión: JPG es el estándar para sitios web y gráficas
+
+ + + ¿Es seguro usar este conversor? + + + 100% Seguro: Procesamiento local en el servidor, sin envío a terceros
Privacidad garantizada: Los archivos se eliminan automáticamente después de la conversión
Sin almacenamiento: No mantenemos copias de tus archivos
Sin registro: Úsalo sin crear cuenta o proporcionar datos personales
HTTPS: Conexión cifrada para subida/descarga
+
+ + + ¿Hay limitaciones en el conversor? + + + Tamaño máximo: 50MB por archivo
Formatos aceptados: .heic, .HEIC, .JPG, .JPEG
Salida: JPG y HEIC de alta calidad
Vista previa: Límite de 10MB para visualización
Conversión bidireccional: HEIC↔JPG totalmente funcional
+
+ +
\ No newline at end of file diff --git a/Areas/ImageConverters/Views/HeicToJpg/Index.es-PY.resx b/Areas/ImageConverters/Views/HeicToJpg/Index.es-PY.resx new file mode 100644 index 0000000..e0e25c5 --- /dev/null +++ b/Areas/ImageConverters/Views/HeicToJpg/Index.es-PY.resx @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Conversor HEIC a JPG Online Gratis + + + Convierte archivos HEIC a JPG de forma rápida y segura. Herramienta gratuita, sin registro, procesamiento local. + + + + + HEIC → JPG + + + JPG → HEIC + + + + + Selecciona el archivo HEIC + + + Selecciona el archivo JPG + + + Convertir a JPG + + + Convertir a HEIC + + + + + Por favor, selecciona un archivo. + + + Archivo inválido. Por favor, sube un archivo HEIC válido. + + + Archivo inválido. Por favor, sube un archivo JPG válido. + + + Ocurrió un error al procesar la imagen. Inténtalo de nuevo. + + + Vista previa + + + + + ¿Qué es este conversor HEIC? + + + Este es un conversor online gratuito que transforma archivos HEIC (High Efficiency Image Container) al formato JPG. HEIC es el formato estándar usado por iPhones e iPads desde iOS 11, ofreciendo mejor compresión que JPG manteniendo calidad similar. + + + + ¿Cómo funciona la conversión? + + + 1. Selecciona el archivo HEIC de tu dispositivo
2. Haz clic en "Convertir a JPG"
3. El archivo será procesado localmente en el servidor
4. Descarga automática del archivo JPG convertido
5. El archivo original se elimina automáticamente después de la conversión
+
+ + + ¿Por qué convertir HEIC a JPG? + + + Compatibilidad universal: JPG es soportado por todos los dispositivos y aplicaciones
Fácil compartir: Envía fotos sin problemas de compatibilidad
Trabajo profesional: Muchos softwares aún no soportan HEIC
Web e impresión: JPG es el estándar para sitios web y gráficas
+
+ + + ¿Es seguro usar este conversor? + + + 100% Seguro: Procesamiento local en el servidor, sin envío a terceros
Privacidad garantizada: Los archivos se eliminan automáticamente después de la conversión
Sin almacenamiento: No mantenemos copias de tus archivos
Sin registro: Úsalo sin crear cuenta o proporcionar datos personales
HTTPS: Conexión cifrada para subida/descarga
+
+ + + ¿Hay limitaciones en el conversor? + + + Tamaño máximo: 50MB por archivo
Formatos aceptados: .heic, .HEIC, .JPG, .JPEG
Salida: JPG y HEIC de alta calidad
Vista previa: Límite de 10MB para visualización
Conversión bidireccional: HEIC↔JPG totalmente funcional
+
+ +
\ No newline at end of file diff --git a/Areas/ImageConverters/Views/HeicToJpg/Index.pt-BR.resx b/Areas/ImageConverters/Views/HeicToJpg/Index.pt-BR.resx new file mode 100644 index 0000000..0e9765c --- /dev/null +++ b/Areas/ImageConverters/Views/HeicToJpg/Index.pt-BR.resx @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Conversor HEIC para JPG Online Grátis + + + Converta arquivos HEIC para JPG de forma rápida e segura. Ferramenta gratuita, sem cadastro, processamento local. + + + + + HEIC → JPG + + + JPG → HEIC + + + + + Selecione o arquivo HEIC + + + Selecione o arquivo JPG + + + Converter para JPG + + + Converter para HEIC + + + + + Por favor, selecione um arquivo. + + + Arquivo inválido. Por favor, envie um arquivo HEIC válido. + + + Arquivo inválido. Por favor, envie um arquivo JPG válido. + + + Ocorreu um erro ao processar a imagem. Tente novamente. + + + Visualizar + + + + + O que é este conversor HEIC? + + + Este é um conversor online gratuito que transforma arquivos HEIC (High Efficiency Image Container) em formato JPG. HEIC é o formato padrão usado por iPhones e iPads desde iOS 11, oferecendo melhor compressão que JPG mantendo qualidade similar. + + + + Como funciona a conversão? + + + 1. Selecione o arquivo HEIC do seu dispositivo
2. Clique em "Converter para JPG"
3. O arquivo será processado localmente no servidor
4. Download automático do arquivo JPG convertido
5. O arquivo original é removido automaticamente após a conversão
+
+ + + Por que converter HEIC para JPG? + + + Compatibilidade universal: JPG é suportado por todos os dispositivos e aplicações
Compartilhamento fácil: Envie fotos sem problemas de compatibilidade
Trabalho profissional: Muitos softwares ainda não suportam HEIC
Web e impressão: JPG é o padrão para websites e gráficas
+
+ + + É seguro usar este conversor? + + + 100% Seguro: Processamento local no servidor, sem envio para terceiros
Privacidade garantida: Arquivos são removidos automaticamente após conversão
Sem armazenamento: Não mantemos cópias dos seus arquivos
Sem cadastro: Use sem criar conta ou fornecer dados pessoais
HTTPS: Conexão criptografada para upload/download
+
+ + + Há limitações no conversor? + + + Tamanho máximo: 50MB por arquivo
Formatos aceitos: .heic, .HEIC, .JPG, .JPEG
Saída: JPG e HEIC de alta qualidade
Preview: Limite de 10MB para visualização
Conversão bidirecional: HEIC↔JPG totalmente funcional
+
+ +
\ No newline at end of file diff --git a/Areas/ImageConverters/Views/JpgToWebp/Index.cshtml b/Areas/ImageConverters/Views/JpgToWebp/Index.cshtml index af2311c..f04b301 100644 --- a/Areas/ImageConverters/Views/JpgToWebp/Index.cshtml +++ b/Areas/ImageConverters/Views/JpgToWebp/Index.cshtml @@ -2,18 +2,449 @@ ViewData["Title"] = ViewBag.PageTitle; } -

@ViewBag.PageTitle

-

@ViewBag.PageDescription

- -
-
-
-
-
- - +
+
+
+
+

@ViewBag.PageTitle

+

@ViewBag.PageDescription

- - +
-
\ No newline at end of file + +
+
+
+
+
+ Conversor de Imagens +
+
+
+ @if (ViewBag.ConversionError != null) + { + + } + + + + + +
+ +
+
+ + +
+ + +
+ Formatos aceitos: .jpg, .jpeg (máx. 10MB para preview) +
+
+ Por favor, selecione um arquivo JPG válido. +
+
+ +
+ + +
+
+
+ + +
+
+ + +
+ + +
+ Formatos aceitos: .webp (máx. 10MB para preview) +
+
+ Por favor, selecione um arquivo WebP válido. +
+
+ +
+ + +
+
+
+
+ + + + + + + + + +
+
+
+
+ + +
+
+
+

Perguntas Frequentes

+
+
+

+ +

+
+
+ @ViewBag.FaqWhatContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqHowContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqWhyContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqSecurityContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqLimitsContent +
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/Areas/ImageConverters/Views/JpgToWebp/Index.es-CL.resx b/Areas/ImageConverters/Views/JpgToWebp/Index.es-CL.resx index fb2fe61..0dedf8f 100644 --- a/Areas/ImageConverters/Views/JpgToWebp/Index.es-CL.resx +++ b/Areas/ImageConverters/Views/JpgToWebp/Index.es-CL.resx @@ -1,15 +1,60 @@ - Convertir JPG a WebP + Convertidor JPG ↔ WebP - Convert-It Online - Sube una imagen JPG para convertirla al formato WebP. + Convierte fácilmente entre los formatos JPG y WebP. Transforma JPG a WebP para mejor compresión o WebP a JPG para mayor compatibilidad. - - Selecciona el archivo: + + JPG → WebP - - Convertir Ahora + + WebP → JPG + + + Seleccionar archivo JPG + + + Seleccionar archivo WebP + + + Convertir a WebP + + + Convertir a JPG + + + Vista previa + + + ¿Qué son JPG y WebP? + + + JPG es un formato clásico de compresión de imagen ampliamente compatible. WebP es un formato moderno desarrollado por Google que ofrece mejor compresión manteniendo la calidad de la imagen. + + + ¿Cómo convertir entre JPG y WebP? + + + Es simple: 1. Elige la pestaña de la conversión deseada (JPG→WebP o WebP→JPG). 2. Haz clic en 'Seleccionar archivo' y elige tu imagen. 3. Haz clic en 'Vista previa' para preview o 'Convertir' para descarga directa. + + + ¿Por qué convertir entre JPG y WebP? + + + JPG→WebP: Reduce significativamente el tamaño del archivo manteniendo la calidad, ideal para web. WebP→JPG: Garantiza compatibilidad universal con cualquier dispositivo o software que no soporte WebP. + + + ¿Es seguro convertir mis archivos aquí? + + + Absolutamente. Todas las conversiones se procesan de forma segura y tus archivos se eliminan automáticamente después del procesamiento. No almacenamos ninguna de tus imágenes. + + + ¿Hay límites de tamaño de archivo? + + + Para la funcionalidad de vista previa, el límite es de 10MB por archivo. Para conversiones directas, aceptamos archivos más grandes dentro de límites razonables para garantizar buen rendimiento. \ No newline at end of file diff --git a/Areas/ImageConverters/Views/JpgToWebp/Index.es-MX.resx b/Areas/ImageConverters/Views/JpgToWebp/Index.es-MX.resx index fed7ba1..0dedf8f 100644 --- a/Areas/ImageConverters/Views/JpgToWebp/Index.es-MX.resx +++ b/Areas/ImageConverters/Views/JpgToWebp/Index.es-MX.resx @@ -1,15 +1,60 @@ - Convertir JPG a WebP + Convertidor JPG ↔ WebP - Convert-It Online - Suba una imagen JPG para convertirla al formato WebP. + Convierte fácilmente entre los formatos JPG y WebP. Transforma JPG a WebP para mejor compresión o WebP a JPG para mayor compatibilidad. - - Seleccione el archivo: + + JPG → WebP - - Convertir Ahora + + WebP → JPG + + + Seleccionar archivo JPG + + + Seleccionar archivo WebP + + + Convertir a WebP + + + Convertir a JPG + + + Vista previa + + + ¿Qué son JPG y WebP? + + + JPG es un formato clásico de compresión de imagen ampliamente compatible. WebP es un formato moderno desarrollado por Google que ofrece mejor compresión manteniendo la calidad de la imagen. + + + ¿Cómo convertir entre JPG y WebP? + + + Es simple: 1. Elige la pestaña de la conversión deseada (JPG→WebP o WebP→JPG). 2. Haz clic en 'Seleccionar archivo' y elige tu imagen. 3. Haz clic en 'Vista previa' para preview o 'Convertir' para descarga directa. + + + ¿Por qué convertir entre JPG y WebP? + + + JPG→WebP: Reduce significativamente el tamaño del archivo manteniendo la calidad, ideal para web. WebP→JPG: Garantiza compatibilidad universal con cualquier dispositivo o software que no soporte WebP. + + + ¿Es seguro convertir mis archivos aquí? + + + Absolutamente. Todas las conversiones se procesan de forma segura y tus archivos se eliminan automáticamente después del procesamiento. No almacenamos ninguna de tus imágenes. + + + ¿Hay límites de tamaño de archivo? + + + Para la funcionalidad de vista previa, el límite es de 10MB por archivo. Para conversiones directas, aceptamos archivos más grandes dentro de límites razonables para garantizar buen rendimiento. \ No newline at end of file diff --git a/Areas/ImageConverters/Views/JpgToWebp/Index.es-PY.resx b/Areas/ImageConverters/Views/JpgToWebp/Index.es-PY.resx index fb2fe61..7d11ea3 100644 --- a/Areas/ImageConverters/Views/JpgToWebp/Index.es-PY.resx +++ b/Areas/ImageConverters/Views/JpgToWebp/Index.es-PY.resx @@ -1,15 +1,60 @@ - Convertir JPG a WebP + Convertidor JPG ↔ WebP - Convert-It Online - Sube una imagen JPG para convertirla al formato WebP. + Convertir fácilmente entre los formatos JPG y WebP. Transformar JPG a WebP para mejor compresión o WebP a JPG para mayor compatibilidad. - - Selecciona el archivo: + + JPG → WebP - - Convertir Ahora + + WebP → JPG + + + Seleccionar archivo JPG + + + Seleccionar archivo WebP + + + Convertir a WebP + + + Convertir a JPG + + + Vista previa + + + ¿Qué son JPG y WebP? + + + JPG es un formato clásico de compresión de imagen ampliamente compatible. WebP es un formato moderno desarrollado por Google que ofrece mejor compresión manteniendo la calidad de la imagen. + + + ¿Cómo convertir entre JPG y WebP? + + + Es simple: 1. Elegir la pestaña de la conversión deseada (JPG→WebP o WebP→JPG). 2. Hacer clic en 'Seleccionar archivo' y elegir tu imagen. 3. Hacer clic en 'Vista previa' para preview o 'Convertir' para descarga directa. + + + ¿Por qué convertir entre JPG y WebP? + + + JPG→WebP: Reduce significativamente el tamaño del archivo manteniendo la calidad, ideal para web. WebP→JPG: Garantiza compatibilidad universal con cualquier dispositivo o software que no soporte WebP. + + + ¿Es seguro convertir mis archivos aquí? + + + Absolutamente. Todas las conversiones se procesan de forma segura y tus archivos se eliminan automáticamente después del procesamiento. No almacenamos ninguna de tus imágenes. + + + ¿Hay límites de tamaño de archivo? + + + Para la funcionalidad de vista previa, el límite es de 10MB por archivo. Para conversiones directas, aceptamos archivos más grandes dentro de límites razonables para garantizar buen rendimiento. \ No newline at end of file diff --git a/Areas/ImageConverters/Views/JpgToWebp/Index.pt-BR.resx b/Areas/ImageConverters/Views/JpgToWebp/Index.pt-BR.resx index 49a9fe4..420f6e7 100644 --- a/Areas/ImageConverters/Views/JpgToWebp/Index.pt-BR.resx +++ b/Areas/ImageConverters/Views/JpgToWebp/Index.pt-BR.resx @@ -1,15 +1,60 @@ - Converter JPG para WebP + Conversor JPG ↔ WebP - Convert-It Online - Faça o upload de uma imagem JPG para convertê-la para o formato WebP. + Converta facilmente entre os formatos JPG e WebP. Transforme JPG em WebP para melhor compressão ou WebP em JPG para maior compatibilidade. - - Selecione o arquivo: + + JPG → WebP - - Converter Agora + + WebP → JPG + + + Selecionar arquivo JPG + + + Selecionar arquivo WebP + + + Converter para WebP + + + Converter para JPG + + + Visualizar + + + O que são JPG e WebP? + + + JPG é um formato clássico de compressão de imagem amplamente compatível. WebP é um formato moderno desenvolvido pelo Google que oferece melhor compressão mantendo a qualidade da imagem. + + + Como converter entre JPG e WebP? + + + É simples: 1. Escolha a aba da conversão desejada (JPG→WebP ou WebP→JPG). 2. Clique em 'Selecionar arquivo' e escolha sua imagem. 3. Clique em 'Visualizar' para preview ou 'Converter' para download direto. + + + Por que converter entre JPG e WebP? + + + JPG→WebP: Reduz significativamente o tamanho do arquivo mantendo a qualidade, ideal para web. WebP→JPG: Garante compatibilidade universal com qualquer dispositivo ou software que não suporte WebP. + + + É seguro converter meus arquivos aqui? + + + Absolutamente. Todas as conversões são processadas de forma segura e seus arquivos são automaticamente excluídos após o processamento. Não armazenamos nenhuma de suas imagens. + + + Há limites de tamanho de arquivo? + + + Para a funcionalidade de preview, o limite é de 10MB por arquivo. Para conversões diretas, aceitamos arquivos maiores dentro de limites razoáveis para garantir boa performance. \ No newline at end of file diff --git a/Areas/TextTools/Controllers/CaseConverterController.cs b/Areas/TextTools/Controllers/CaseConverterController.cs index 8b049a2..3a2c428 100644 --- a/Areas/TextTools/Controllers/CaseConverterController.cs +++ b/Areas/TextTools/Controllers/CaseConverterController.cs @@ -54,7 +54,19 @@ namespace Convert_It_Online.Areas.TextTools.Controllers ViewBag.ToLowerButton = _localizer["ToLowerButton"]; ViewBag.ToSentenceCaseButton = _localizer["ToSentenceCaseButton"]; ViewBag.ResultTitle = _localizer["ResultTitle"]; - + + // FAQ properties + ViewBag.FaqWhatTitle = _localizer["CaseFaqWhatTitle"]; + ViewBag.FaqWhatContent = _localizer["CaseFaqWhatContent"]; + ViewBag.FaqHowTitle = _localizer["CaseFaqHowTitle"]; + ViewBag.FaqHowContent = _localizer["CaseFaqHowContent"]; + ViewBag.FaqWhyTitle = _localizer["CaseFaqWhyTitle"]; + ViewBag.FaqWhyContent = _localizer["CaseFaqWhyContent"]; + ViewBag.FaqSecurityTitle = _localizer["CaseFaqSecurityTitle"]; + ViewBag.FaqSecurityContent = _localizer["CaseFaqSecurityContent"]; + ViewBag.FaqLimitsTitle = _localizer["CaseFaqLimitsTitle"]; + ViewBag.FaqLimitsContent = _localizer["CaseFaqLimitsContent"]; + var model = new CaseConverterViewModel(); return View(model); } diff --git a/Areas/TextTools/Views/CaseConverter/Index.cshtml b/Areas/TextTools/Views/CaseConverter/Index.cshtml index 6140f81..c734759 100644 --- a/Areas/TextTools/Views/CaseConverter/Index.cshtml +++ b/Areas/TextTools/Views/CaseConverter/Index.cshtml @@ -27,3 +27,78 @@

@ViewBag.ResultTitle

} + + +
+
+
+

Perguntas Frequentes

+
+
+

+ +

+
+
+ @ViewBag.FaqWhatContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqHowContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqWhyContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqSecurityContent +
+
+
+ +
+

+ +

+
+
+ @ViewBag.FaqLimitsContent +
+
+
+
+
+
+
diff --git a/Controllers/HealthController.cs b/Controllers/HealthController.cs new file mode 100644 index 0000000..c760f5d --- /dev/null +++ b/Controllers/HealthController.cs @@ -0,0 +1,100 @@ +using Microsoft.AspNetCore.Mvc; +using System.Diagnostics; + +namespace Convert_It_Online.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class HealthController : ControllerBase + { + private readonly ILogger _logger; + private static readonly DateTime _startTime = DateTime.UtcNow; + + public HealthController(ILogger logger) + { + _logger = logger; + } + + [HttpGet] + [Route("")] + [Route("check")] + public IActionResult HealthCheck() + { + try + { + var uptimeMinutes = (DateTime.UtcNow - _startTime).TotalMinutes; + var memoryBytes = GC.GetTotalMemory(false); + var memoryMB = Math.Round(memoryBytes / 1024.0 / 1024.0, 2); + + _logger.LogInformation("[HEALTH] Memory: {memoryBytes} MemoryMB: {memoryMB} ThreadPool: {threadPool} ProcessId: {processId} ActiveConnections: {activeConnections} UptimeMinutes: {uptimeMinutes}", + memoryBytes, + memoryMB, + ThreadPool.ThreadCount, + Process.GetCurrentProcess().Id, + HttpContext.Connection?.Id ?? "null", + Math.Round(uptimeMinutes, 1)); + + var response = new + { + status = "healthy", + timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss UTC"), + uptime = new + { + minutes = Math.Round(uptimeMinutes, 1), + hours = Math.Round(uptimeMinutes / 60, 1), + days = Math.Round(uptimeMinutes / 60 / 24, 1) + }, + memory = new + { + bytes = memoryBytes, + mb = memoryMB, + kb = Math.Round(memoryBytes / 1024.0, 2) + }, + system = new + { + processId = Process.GetCurrentProcess().Id, + threadPool = ThreadPool.ThreadCount, + environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Unknown", + machineName = Environment.MachineName, + framework = Environment.Version.ToString() + }, + connection = new + { + id = HttpContext.Connection?.Id ?? "null", + remoteIp = HttpContext.Connection?.RemoteIpAddress?.ToString() ?? "unknown", + localIp = HttpContext.Connection?.LocalIpAddress?.ToString() ?? "unknown" + } + }; + + return Ok(response); + } + catch (Exception ex) + { + _logger.LogError(ex, "[HEALTH] Health check failed"); + return StatusCode(500, new { status = "unhealthy", error = ex.Message }); + } + } + + [HttpGet("uptime-kuma")] + public IActionResult UptimeKuma() + { + try + { + var uptimeMinutes = (DateTime.UtcNow - _startTime).TotalMinutes; + + _logger.LogInformation("[HEALTH-KUMA] Uptime check: {uptimeMinutes} minutes", Math.Round(uptimeMinutes, 1)); + + return Ok(new { + status = "ok", + uptime = Math.Round(uptimeMinutes, 1), + timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss UTC") + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "[HEALTH-KUMA] Uptime Kuma check failed"); + return StatusCode(500, new { status = "error", message = ex.Message }); + } + } + } +} \ No newline at end of file diff --git a/Controllers/HomeController.cs b/Controllers/HomeController.cs index ace0dba..15aa143 100644 --- a/Controllers/HomeController.cs +++ b/Controllers/HomeController.cs @@ -7,8 +7,8 @@ namespace Convert_It_Online.Controllers // ViewModel para representar uma ferramenta no menu da Home public class ToolViewModel { - public required string TitleKey { get; set; } - public required string DescriptionKey { get; set; } + public required string Title { get; set; } + public required string Description { get; set; } public required string Area { get; set; } public required string Controller { get; set; } public required string IconClass { get; set; } // Propriedade para o ícone @@ -31,6 +31,7 @@ namespace Convert_It_Online.Controllers ViewBag.ImageMenuTitle = _localizer["ImageMenuTitle"]; ViewBag.CaseConverterTitle = _localizer["CaseConverterTitle"]; ViewBag.JpgToWebpTitle = _localizer["JpgToWebpTitle"]; + ViewBag.HeicToJpgTitle = _localizer["HeicToJpgTitle"]; ViewBag.FooterText = _localizer["FooterText"]; ViewBag.About = _localizer["About"]; ViewBag.Contact = _localizer["Contact"]; @@ -42,38 +43,44 @@ namespace Convert_It_Online.Controllers SetCommonViewBagProperties(); ViewBag.PageTitle = _localizer["PageTitle"]; ViewBag.Subtitle = _localizer["Subtitle"]; - ViewBag.ChooseConverter = _localizer["ChooseConverter"]; ViewBag.AboutSiteTitle = _localizer["AboutSiteTitle"]; ViewBag.AboutSiteContent = _localizer["AboutSiteContent"]; ViewBag.WhyFreeTitle = _localizer["WhyFreeTitle"]; ViewBag.WhyFreeContent = _localizer["WhyFreeContent"]; ViewBag.SecurityTitle = _localizer["SecurityTitle"]; ViewBag.SecurityContent = _localizer["SecurityContent"]; - ViewBag.TextToolsTitle = _localizer["TextToolsTitle"]; - ViewBag.TextToolsDescription = _localizer["TextToolsDescription"]; - ViewBag.ImageToolsTitle = _localizer["ImageToolsTitle"]; - ViewBag.ImageToolsDescription = _localizer["ImageToolsDescription"]; - var availableTools = new List + ViewBag.AllConvertersTitle = _localizer["AllConvertersTitle"]; + ViewBag.UseConverterButton = _localizer["UseConverterButton"]; + + var individualConverters = new List { new ToolViewModel { - TitleKey = "TextToolsTitle", - DescriptionKey = "TextToolsDescription", + Title = _localizer["CaseConverterIndividualTitle"], + Description = _localizer["CaseConverterIndividualDescription"], Area = "TextTools", Controller = "CaseConverter", IconClass = "bi-fonts" }, new ToolViewModel { - TitleKey = "ImageToolsTitle", - DescriptionKey = "ImageToolsDescription", + Title = _localizer["JpgToWebpIndividualTitle"], + Description = _localizer["JpgToWebpIndividualDescription"], Area = "ImageConverters", Controller = "JpgToWebp", - IconClass = "bi-image-alt" + IconClass = "bi-file-earmark-image" + }, + new ToolViewModel + { + Title = _localizer["HeicToJpgIndividualTitle"], + Description = _localizer["HeicToJpgIndividualDescription"], + Area = "ImageConverters", + Controller = "HeicToJpg", + IconClass = "bi-phone" } }; - return View(availableTools); + return View(individualConverters); } public IActionResult About() diff --git a/Convert-It.csproj b/Convert-It.csproj index 38b782a..f13396c 100644 --- a/Convert-It.csproj +++ b/Convert-It.csproj @@ -8,7 +8,20 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Program.cs b/Program.cs index 6ebe620..e37836c 100644 --- a/Program.cs +++ b/Program.cs @@ -4,9 +4,162 @@ using Microsoft.AspNetCore.Localization.Routing; using Microsoft.Extensions.Options; using Convert_It_Online.Services; using Convert_It_Online.Middleware; +using Serilog; +using Serilog.Events; +using Serilog.Sinks.OpenSearch; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; +using HeyRed.ImageSharp.Heif.Formats.Heif; +using HeyRed.ImageSharp.Heif.Formats.Avif; + +// Configurar suporte HEIF/AVIF para SixLabors.ImageSharp +Configuration.Default.Configure(new AvifConfigurationModule()); +Configuration.Default.Configure(new HeifConfigurationModule()); + +var isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development"; +var hostname = Environment.MachineName; + +Serilog.Debugging.SelfLog.Enable(msg => +{ + Console.WriteLine($"[SERILOG SELF] {DateTime.Now:HH:mm:ss} {msg}"); + System.Diagnostics.Debug.WriteLine($"[SERILOG SELF] {msg}"); +}); var builder = WebApplication.CreateBuilder(args); +var loggerConfig = new LoggerConfiguration() + .ReadFrom.Configuration(builder.Configuration) + .Enrich.FromLogContext() + .Enrich.WithEnvironmentName() + .Enrich.WithProcessId() + .Enrich.WithThreadId() + .Enrich.WithProperty("ApplicationName", builder.Configuration["ApplicationName"] ?? "Convert-It") + .Enrich.WithProperty("Environment", builder.Environment.EnvironmentName) + .Enrich.WithProperty("Hostname", hostname); + +if (isDevelopment) +{ + loggerConfig + .MinimumLevel.Debug() + .MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("System", LogEventLevel.Warning) + .WriteTo.Console( + restrictedToMinimumLevel: LogEventLevel.Debug, + outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}") + .WriteTo.File( + "./logs/convert-it-dev-.log", + rollingInterval: RollingInterval.Day, + retainedFileCountLimit: 2, + restrictedToMinimumLevel: LogEventLevel.Debug, + outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}"); + + var openSearchUrl = builder.Configuration["Serilog:OpenSearchUrl"]; + if (!string.IsNullOrEmpty(openSearchUrl)) + { + var indexFormat = "convert-it-dev-{0:yyyy-MM}"; + + try + { + loggerConfig.WriteTo.Async(a => a.OpenSearch(new OpenSearchSinkOptions(new Uri(openSearchUrl)) + { + IndexFormat = indexFormat, + AutoRegisterTemplate = true, + BufferBaseFilename = "./logs/opensearch-buffer", + ModifyConnectionSettings = conn => conn + .RequestTimeout(TimeSpan.FromSeconds(8)) + .PingTimeout(TimeSpan.FromSeconds(4)), + MinimumLogEventLevel = LogEventLevel.Debug, + EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog, + RegisterTemplateFailure = RegisterTemplateRecovery.IndexAnyway, + BatchPostingLimit = 10, + Period = TimeSpan.FromSeconds(2), + BufferRetainedInvalidPayloadsLimitBytes = 100 * 1024 * 1024, + BufferLogShippingInterval = TimeSpan.FromSeconds(1), + TemplateCustomSettings = new Dictionary + { + {"number_of_shards", "1"}, + {"number_of_replicas", "0"} + } + }), + bufferSize: 10000, + blockWhenFull: false); + } + catch (Exception) + { + // Falha silenciosa - logs continuam no console e arquivo + } + } +} +else +{ + loggerConfig + .MinimumLevel.Information() + .MinimumLevel.Override("Microsoft.AspNetCore.Hosting.Diagnostics", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.AspNetCore.Routing.EndpointMiddleware", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.AspNetCore.StaticFiles", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("System", LogEventLevel.Warning) + + .WriteTo.Console( + restrictedToMinimumLevel: LogEventLevel.Information, + outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}") + .WriteTo.File( + "/app/logs/convert-it-.log", + rollingInterval: RollingInterval.Day, + retainedFileCountLimit: 7, + restrictedToMinimumLevel: LogEventLevel.Warning, + outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {Level:u3}] [{Hostname}] {Message:lj} {Properties:j}{NewLine}{Exception}"); + + var openSearchUrl = builder.Configuration["Serilog:OpenSearchUrl"]; + if (!string.IsNullOrEmpty(openSearchUrl)) + { + var environment = builder.Environment.EnvironmentName.ToLower(); + var envMapping = environment switch + { + "production" => "prod", + "staging" => "release", + "development" => "dev", + _ => environment + }; + + var indexFormat = $"convert-it-{envMapping}-{{0:yyyy-MM}}"; + + try + { + loggerConfig.WriteTo.Async(a => a.OpenSearch(new OpenSearchSinkOptions(new Uri(openSearchUrl)) + { + IndexFormat = indexFormat, + AutoRegisterTemplate = false, + BufferBaseFilename = "./logs/buffer", + ModifyConnectionSettings = conn => conn + .RequestTimeout(TimeSpan.FromSeconds(30)) + .PingTimeout(TimeSpan.FromSeconds(10)), + MinimumLogEventLevel = LogEventLevel.Information, + EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog, + RegisterTemplateFailure = RegisterTemplateRecovery.IndexAnyway, + BatchPostingLimit = 50, + Period = TimeSpan.FromSeconds(5), + }), bufferSize: 10000, blockWhenFull: false); + } + catch (Exception) + { + // Falha silenciosa em produção - logs continuam no console/arquivo + } + } +} + +var logger = loggerConfig.CreateLogger(); +Log.Logger = logger; + +Console.WriteLine($"[STARTUP] {DateTime.Now:HH:mm:ss} - Logger configurado"); +Log.Information("=== APLICAÇÃO INICIANDO ==="); +Log.Information("Convert-It iniciando em {Environment} no host {Hostname}", + builder.Environment.EnvironmentName, hostname); + +builder.Host.UseSerilog(); + builder.Services.AddLocalization(); builder.Services.AddSingleton(); @@ -48,6 +201,17 @@ app.UseRouting(); app.UseRequestLocalization(localizationOptions); app.UseAuthorization(); +// Health endpoint mapping +app.MapControllerRoute( + name: "health", + pattern: "health", + defaults: new { controller = "Health", action = "HealthCheck" }); + +app.MapControllerRoute( + name: "uptimeKuma", + pattern: "uptime-kuma", + defaults: new { controller = "Health", action = "UptimeKuma" }); + app.MapControllerRoute( name: "areaRoute", pattern: "{culture:length(2,5)}/{area:exists}/{controller=Home}/{action=Index}/{id?}"); @@ -61,4 +225,18 @@ app.MapControllerRoute( pattern: "{controller=Home}/{action=Index}/{id?}", defaults: new { culture = "pt-BR" }); -app.Run(); +Log.Information("=== APLICAÇÃO CONFIGURADA - INICIANDO SERVER ==="); + +try +{ + app.Run(); +} +catch (Exception ex) +{ + Log.Fatal(ex, "Aplicação falhou ao iniciar"); + throw; +} +finally +{ + Log.CloseAndFlush(); +} \ No newline at end of file diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json index de67cf6..3c3e6db 100644 --- a/Properties/launchSettings.json +++ b/Properties/launchSettings.json @@ -6,7 +6,8 @@ "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, - "applicationUrl": "https://localhost:59345;http://localhost:59346" + //"applicationUrl": "http://localhost:59346;https://localhost:59345", + "applicationUrl": "http://localhost:59346" } } } \ No newline at end of file diff --git a/Services/UrlTranslationService.cs b/Services/UrlTranslationService.cs index 6d6522c..f7f30e9 100644 --- a/Services/UrlTranslationService.cs +++ b/Services/UrlTranslationService.cs @@ -40,22 +40,26 @@ namespace Convert_It_Online.Services ["pt-BR"] = new Dictionary { ["CaseConverter"] = "conversor-de-maiusculas-minusculas", - ["JpgToWebp"] = "jpg-para-webp" + ["JpgToWebp"] = "jpg-para-webp", + ["HeicToJpg"] = "heic-para-jpg" }, ["es-MX"] = new Dictionary { ["CaseConverter"] = "conversor-de-mayusculas-minusculas", - ["JpgToWebp"] = "jpg-a-webp" + ["JpgToWebp"] = "jpg-a-webp", + ["HeicToJpg"] = "heic-a-jpg" }, ["es-CL"] = new Dictionary { ["CaseConverter"] = "conversor-de-mayusculas-minusculas", - ["JpgToWebp"] = "jpg-a-webp" + ["JpgToWebp"] = "jpg-a-webp", + ["HeicToJpg"] = "heic-a-jpg" }, ["es-PY"] = new Dictionary { ["CaseConverter"] = "conversor-de-mayusculas-minusculas", - ["JpgToWebp"] = "jpg-a-webp" + ["JpgToWebp"] = "jpg-a-webp", + ["HeicToJpg"] = "heic-a-jpg" } }; diff --git a/SharedResource.es-CL.resx b/SharedResource.es-CL.resx index 410765c..7ae7b2d 100644 --- a/SharedResource.es-CL.resx +++ b/SharedResource.es-CL.resx @@ -1,47 +1,47 @@ - + - Convertidores Gratuitos Online + Convertidores Gratuitos en Línea - Convierte textos, imágenes y documentos gratis. Herramientas online bacanes y seguras, sin necesidad de instalar nada. + Convierte textos, imágenes y documentos gratis. Herramientas en línea rápidas y seguras, sin necesidad de instalar nada. - Elige tu Conversor + Elige tu Convertidor Herramientas de Texto - Convierte, formatea y manipula textos súper fácil. + Convierte, formatea y manipula textos fácilmente. - Conversores de Imagen + Convertidores de Imagen - Optimiza y convierte imágenes a cualquier formato al tiro. + Optimiza y convierte imágenes a cualquier formato. - Sobre Convert-It Online + Acerca de Convert-It Online - Convert-It Online es una plataforma gratuita que ofrece varias herramientas de conversión para que puedas hacer tu pega más fácil. Todas las conversiones son súper seguras, no guardamos tus archivos en nuestros servidores. + Convert-It Online es una plataforma gratuita que ofrece diversas herramientas de conversión para facilitar tu trabajo diario. Todas las conversiones se realizan de forma segura, sin almacenar tus archivos en nuestros servidores. ¿Por qué es gratis? - Creemos que las herramientas útiles deberían estar al alcance de todos. Nuestro sitio se mantiene con publicidad no molesta, así puedes usar todos los conversores sin pagar ni una luca. + Creemos que las herramientas útiles deben ser accesibles para todos. Nuestro sitio se mantiene a través de anuncios no intrusivos, permitiendo que uses todos los convertidores sin costo alguno. Seguridad y privacidad - Tus archivos se procesan en tu navegador cuando se puede. Para conversiones que necesitan procesamiento en el servidor, los archivos se borran automáticamente después de la conversión. + Tus archivos se procesan localmente en tu navegador siempre que sea posible. Para conversiones que requieren procesamiento en el servidor, los archivos se eliminan automáticamente después de la conversión. - + Inicio @@ -52,7 +52,7 @@ Imagen - Conversor de Mayúsculas/Minúsculas + Convertidor de Mayúsculas/Minúsculas JPG a WebP @@ -60,10 +60,10 @@ - © 2025 Convert-It Online. Herramientas gratis de conversión. + © 2025 Convert-It Online. Herramientas gratuitas de conversión. - Sobre nosotros + Acerca de Contacto @@ -72,12 +72,12 @@ Términos - + - Conversor de Texto + Convertidor de Texto - Pega tu texto acá + Escribe tu texto aquí MAYÚSCULAS @@ -94,10 +94,10 @@ - Conversor JPG a WebP + Convertidor JPG a WebP - Convierte tus imágenes JPG al formato WebP al tiro y eficiente. WebP te da mejor compresión manteniendo la calidad de la imagen. + Convierte tus imágenes JPG al formato WebP de forma rápida y eficiente. WebP ofrece mejor compresión manteniendo la calidad de la imagen. Selecciona un archivo JPG @@ -119,4 +119,155 @@ jpg-a-webp + + + + Todos los Convertidores + + + Convertidor de Mayúsculas y Minúsculas + + + Convierte tu texto a mayúsculas, minúsculas o primera letra mayúscula. + + + Convertidor JPG a WebP + + + Convierte imágenes JPG al formato WebP moderno y eficiente. + + + Convertidor HEIC a JPG + + + Convierte fotos HEIC del iPhone al formato JPG universalmente compatible. + + + + + HEIC a JPG + + + + + Convertidor de HEIC a JPG + + + Convierte fácilmente tus imágenes HEIC (formato de alta eficiencia de Apple) al formato JPG, compatible con cualquier dispositivo. + + + HEIC a JPG + + + JPG a HEIC (Próximamente) + + + Selecciona un archivo HEIC + + + Selecciona un archivo JPG + + + Convertir a JPG + + + Convertir a HEIC + + + ¿Qué es un archivo HEIC? + + + HEIC (High Efficiency Image Container) es un formato de imagen moderno que ofrece alta calidad con un tamaño de archivo menor en comparación con JPG. Es el formato predeterminado para fotos en iPhones y iPads. + + + ¿Cómo convertir HEIC a JPG? + + + Es simple: 1. Haz clic en el botón 'Seleccionar archivo HEIC' y elige la imagen de tu dispositivo. 2. Haz clic en 'Convertir a JPG'. 3. La imagen convertida se descargará automáticamente. + + + ¿Por qué convertir de HEIC a JPG? + + + Aunque HEIC es eficiente, no es universalmente compatible. JPG es el formato de imagen más aceptado en la web, en software de edición y en diferentes sistemas operativos, garantizando que tu imagen pueda ser vista en cualquier lugar. + + + ¿Es segura la conversión? + + + Sí. Tu privacidad es nuestra prioridad. La conversión de HEIC a JPG se realiza directamente en tu navegador. Ningún archivo se envía a nuestros servidores, garantizando total seguridad y privacidad. + + + ¿Existen límites? + + + No hay límites en la cantidad de conversiones. Para garantizar un buen rendimiento, recomendamos archivos de hasta 10MB. El procesamiento es más rápido en computadoras modernas. + + + + + Por favor, selecciona un archivo para convertir. + + + Archivo HEIC inválido o formato no compatible. Revisa el archivo o intenta con otro. La biblioteca nativa 'libheif' podría faltar en el sistema. + + + Archivo JPG inválido o formato no compatible. Verifica que el archivo sea una imagen JPG válida. + + + + Convertidor JPG ↔ WebP Online Gratis + + + Convierte fácilmente entre los formatos JPG y WebP. Transforma JPG a WebP para mejor compresión o WebP a JPG para mayor compatibilidad. + + + JPG → WebP + + + WebP → JPG + + + Selecciona un archivo WebP + + + Convertir a WebP + + + ¿Qué son JPG y WebP? + + + JPG es un formato clásico de compresión de imagen ampliamente compatible. WebP es un formato moderno desarrollado por Google que ofrece mejor compresión manteniendo la calidad de la imagen. + + + ¿Cómo convertir entre JPG y WebP? + + + Es simple: 1. Elige la pestaña de la conversión deseada (JPG→WebP o WebP→JPG). 2. Haz clic en 'Seleccionar archivo' y elige tu imagen. 3. Haz clic en 'Vista previa' para preview o 'Convertir' para descarga directa. + + + ¿Por qué convertir entre JPG y WebP? + + + JPG→WebP: Reduce significativamente el tamaño del archivo manteniendo la calidad, ideal para web. WebP→JPG: Garantiza compatibilidad universal con cualquier dispositivo o software que no soporte WebP. + + + ¿Es seguro convertir mis archivos aquí? + + + Absolutamente. Todas las conversiones se procesan de forma segura y tus archivos se eliminan automáticamente después del procesamiento. No almacenamos ninguna de tus imágenes. + + + ¿Hay límites de tamaño de archivo? + + + Para la funcionalidad de vista previa, el límite es de 10MB por archivo. Para conversiones directas, aceptamos archivos más grandes dentro de límites razonables para garantizar buen rendimiento. + + + + Acceder al Convertidor + + + Ocurrió un error al procesar tu solicitud. Inténtalo de nuevo más tarde. + \ No newline at end of file diff --git a/SharedResource.es-MX.resx b/SharedResource.es-MX.resx index 3900f11..7ae7b2d 100644 --- a/SharedResource.es-MX.resx +++ b/SharedResource.es-MX.resx @@ -119,4 +119,155 @@ jpg-a-webp + + + + Todos los Convertidores + + + Convertidor de Mayúsculas y Minúsculas + + + Convierte tu texto a mayúsculas, minúsculas o primera letra mayúscula. + + + Convertidor JPG a WebP + + + Convierte imágenes JPG al formato WebP moderno y eficiente. + + + Convertidor HEIC a JPG + + + Convierte fotos HEIC del iPhone al formato JPG universalmente compatible. + + + + + HEIC a JPG + + + + + Convertidor de HEIC a JPG + + + Convierte fácilmente tus imágenes HEIC (formato de alta eficiencia de Apple) al formato JPG, compatible con cualquier dispositivo. + + + HEIC a JPG + + + JPG a HEIC (Próximamente) + + + Selecciona un archivo HEIC + + + Selecciona un archivo JPG + + + Convertir a JPG + + + Convertir a HEIC + + + ¿Qué es un archivo HEIC? + + + HEIC (High Efficiency Image Container) es un formato de imagen moderno que ofrece alta calidad con un tamaño de archivo menor en comparación con JPG. Es el formato predeterminado para fotos en iPhones y iPads. + + + ¿Cómo convertir HEIC a JPG? + + + Es simple: 1. Haz clic en el botón 'Seleccionar archivo HEIC' y elige la imagen de tu dispositivo. 2. Haz clic en 'Convertir a JPG'. 3. La imagen convertida se descargará automáticamente. + + + ¿Por qué convertir de HEIC a JPG? + + + Aunque HEIC es eficiente, no es universalmente compatible. JPG es el formato de imagen más aceptado en la web, en software de edición y en diferentes sistemas operativos, garantizando que tu imagen pueda ser vista en cualquier lugar. + + + ¿Es segura la conversión? + + + Sí. Tu privacidad es nuestra prioridad. La conversión de HEIC a JPG se realiza directamente en tu navegador. Ningún archivo se envía a nuestros servidores, garantizando total seguridad y privacidad. + + + ¿Existen límites? + + + No hay límites en la cantidad de conversiones. Para garantizar un buen rendimiento, recomendamos archivos de hasta 10MB. El procesamiento es más rápido en computadoras modernas. + + + + + Por favor, selecciona un archivo para convertir. + + + Archivo HEIC inválido o formato no compatible. Revisa el archivo o intenta con otro. La biblioteca nativa 'libheif' podría faltar en el sistema. + + + Archivo JPG inválido o formato no compatible. Verifica que el archivo sea una imagen JPG válida. + + + + Convertidor JPG ↔ WebP Online Gratis + + + Convierte fácilmente entre los formatos JPG y WebP. Transforma JPG a WebP para mejor compresión o WebP a JPG para mayor compatibilidad. + + + JPG → WebP + + + WebP → JPG + + + Selecciona un archivo WebP + + + Convertir a WebP + + + ¿Qué son JPG y WebP? + + + JPG es un formato clásico de compresión de imagen ampliamente compatible. WebP es un formato moderno desarrollado por Google que ofrece mejor compresión manteniendo la calidad de la imagen. + + + ¿Cómo convertir entre JPG y WebP? + + + Es simple: 1. Elige la pestaña de la conversión deseada (JPG→WebP o WebP→JPG). 2. Haz clic en 'Seleccionar archivo' y elige tu imagen. 3. Haz clic en 'Vista previa' para preview o 'Convertir' para descarga directa. + + + ¿Por qué convertir entre JPG y WebP? + + + JPG→WebP: Reduce significativamente el tamaño del archivo manteniendo la calidad, ideal para web. WebP→JPG: Garantiza compatibilidad universal con cualquier dispositivo o software que no soporte WebP. + + + ¿Es seguro convertir mis archivos aquí? + + + Absolutamente. Todas las conversiones se procesan de forma segura y tus archivos se eliminan automáticamente después del procesamiento. No almacenamos ninguna de tus imágenes. + + + ¿Hay límites de tamaño de archivo? + + + Para la funcionalidad de vista previa, el límite es de 10MB por archivo. Para conversiones directas, aceptamos archivos más grandes dentro de límites razonables para garantizar buen rendimiento. + + + + Acceder al Convertidor + + + Ocurrió un error al procesar tu solicitud. Inténtalo de nuevo más tarde. + \ No newline at end of file diff --git a/SharedResource.es-PY.resx b/SharedResource.es-PY.resx index 307356e..7ae7b2d 100644 --- a/SharedResource.es-PY.resx +++ b/SharedResource.es-PY.resx @@ -1,11 +1,11 @@ - + Convertidores Gratuitos en Línea - Convierte textos, imágenes y documentos gratis. Herramientas en línea rápidas y seguras, sin necesidad de instalar nada che. + Convierte textos, imágenes y documentos gratis. Herramientas en línea rápidas y seguras, sin necesidad de instalar nada. Elige tu Convertidor @@ -14,34 +14,34 @@ Herramientas de Texto - Convierte, formatea y manipula textos facilito. + Convierte, formatea y manipula textos fácilmente. Convertidores de Imagen - Optimiza y convierte imágenes a cualquier formato al toque. + Optimiza y convierte imágenes a cualquier formato. Acerca de Convert-It Online - Convert-It Online es una plataforma gratuita que ofrece diversas herramientas de conversión para facilitar tu trabajo diario che. Todas las conversiones se realizan de forma segura, sin guardar tus archivos en nuestros servidores. + Convert-It Online es una plataforma gratuita que ofrece diversas herramientas de conversión para facilitar tu trabajo diario. Todas las conversiones se realizan de forma segura, sin almacenar tus archivos en nuestros servidores. ¿Por qué es gratis? - Creemos que las herramientas útiles deben estar al alcance de todos. Nuestro sitio se mantiene a través de publicidad no molesta, así podés usar todos los convertidores sin pagar nada che. + Creemos que las herramientas útiles deben ser accesibles para todos. Nuestro sitio se mantiene a través de anuncios no intrusivos, permitiendo que uses todos los convertidores sin costo alguno. Seguridad y privacidad - Tus archivos se procesan localmente en tu navegador cuando es posible. Para conversiones que necesitan procesamiento en el servidor, los archivos se borran automáticamente después de la conversión. + Tus archivos se procesan localmente en tu navegador siempre que sea posible. Para conversiones que requieren procesamiento en el servidor, los archivos se eliminan automáticamente después de la conversión. - + Inicio @@ -72,12 +72,12 @@ Términos - + Convertidor de Texto - Escribí tu texto acá + Escribe tu texto aquí MAYÚSCULAS @@ -97,10 +97,10 @@ Convertidor JPG a WebP - Convertí tus imágenes JPG al formato WebP de forma rápida y eficiente che. WebP ofrece mejor compresión manteniendo la calidad de la imagen. + Convierte tus imágenes JPG al formato WebP de forma rápida y eficiente. WebP ofrece mejor compresión manteniendo la calidad de la imagen. - Seleccioná un archivo JPG + Selecciona un archivo JPG Convertir a WebP @@ -119,4 +119,155 @@ jpg-a-webp + + + + Todos los Convertidores + + + Convertidor de Mayúsculas y Minúsculas + + + Convierte tu texto a mayúsculas, minúsculas o primera letra mayúscula. + + + Convertidor JPG a WebP + + + Convierte imágenes JPG al formato WebP moderno y eficiente. + + + Convertidor HEIC a JPG + + + Convierte fotos HEIC del iPhone al formato JPG universalmente compatible. + + + + + HEIC a JPG + + + + + Convertidor de HEIC a JPG + + + Convierte fácilmente tus imágenes HEIC (formato de alta eficiencia de Apple) al formato JPG, compatible con cualquier dispositivo. + + + HEIC a JPG + + + JPG a HEIC (Próximamente) + + + Selecciona un archivo HEIC + + + Selecciona un archivo JPG + + + Convertir a JPG + + + Convertir a HEIC + + + ¿Qué es un archivo HEIC? + + + HEIC (High Efficiency Image Container) es un formato de imagen moderno que ofrece alta calidad con un tamaño de archivo menor en comparación con JPG. Es el formato predeterminado para fotos en iPhones y iPads. + + + ¿Cómo convertir HEIC a JPG? + + + Es simple: 1. Haz clic en el botón 'Seleccionar archivo HEIC' y elige la imagen de tu dispositivo. 2. Haz clic en 'Convertir a JPG'. 3. La imagen convertida se descargará automáticamente. + + + ¿Por qué convertir de HEIC a JPG? + + + Aunque HEIC es eficiente, no es universalmente compatible. JPG es el formato de imagen más aceptado en la web, en software de edición y en diferentes sistemas operativos, garantizando que tu imagen pueda ser vista en cualquier lugar. + + + ¿Es segura la conversión? + + + Sí. Tu privacidad es nuestra prioridad. La conversión de HEIC a JPG se realiza directamente en tu navegador. Ningún archivo se envía a nuestros servidores, garantizando total seguridad y privacidad. + + + ¿Existen límites? + + + No hay límites en la cantidad de conversiones. Para garantizar un buen rendimiento, recomendamos archivos de hasta 10MB. El procesamiento es más rápido en computadoras modernas. + + + + + Por favor, selecciona un archivo para convertir. + + + Archivo HEIC inválido o formato no compatible. Revisa el archivo o intenta con otro. La biblioteca nativa 'libheif' podría faltar en el sistema. + + + Archivo JPG inválido o formato no compatible. Verifica que el archivo sea una imagen JPG válida. + + + + Convertidor JPG ↔ WebP Online Gratis + + + Convierte fácilmente entre los formatos JPG y WebP. Transforma JPG a WebP para mejor compresión o WebP a JPG para mayor compatibilidad. + + + JPG → WebP + + + WebP → JPG + + + Selecciona un archivo WebP + + + Convertir a WebP + + + ¿Qué son JPG y WebP? + + + JPG es un formato clásico de compresión de imagen ampliamente compatible. WebP es un formato moderno desarrollado por Google que ofrece mejor compresión manteniendo la calidad de la imagen. + + + ¿Cómo convertir entre JPG y WebP? + + + Es simple: 1. Elige la pestaña de la conversión deseada (JPG→WebP o WebP→JPG). 2. Haz clic en 'Seleccionar archivo' y elige tu imagen. 3. Haz clic en 'Vista previa' para preview o 'Convertir' para descarga directa. + + + ¿Por qué convertir entre JPG y WebP? + + + JPG→WebP: Reduce significativamente el tamaño del archivo manteniendo la calidad, ideal para web. WebP→JPG: Garantiza compatibilidad universal con cualquier dispositivo o software que no soporte WebP. + + + ¿Es seguro convertir mis archivos aquí? + + + Absolutamente. Todas las conversiones se procesan de forma segura y tus archivos se eliminan automáticamente después del procesamiento. No almacenamos ninguna de tus imágenes. + + + ¿Hay límites de tamaño de archivo? + + + Para la funcionalidad de vista previa, el límite es de 10MB por archivo. Para conversiones directas, aceptamos archivos más grandes dentro de límites razonables para garantizar buen rendimiento. + + + + Acceder al Convertidor + + + Ocurrió un error al procesar tu solicitud. Inténtalo de nuevo más tarde. + \ No newline at end of file diff --git a/SharedResource.pt-BR.resx b/SharedResource.pt-BR.resx index bf03b4b..eac0b33 100644 --- a/SharedResource.pt-BR.resx +++ b/SharedResource.pt-BR.resx @@ -231,4 +231,160 @@ Para garantir a melhor experiência, recomendamos arquivos de até 10MB. Arquivos maiores podem ser processados, mas o tempo de conversão pode ser maior. + + + + Todos os Conversores + + + Conversor de Maiúsculas e Minúsculas + + + Converta seu texto para maiúsculas, minúsculas ou primeira letra maiúscula. + + + Conversor JPG para WebP + + + Converta imagens JPG para o formato WebP moderno e eficiente. + + + Conversor HEIC para JPG + + + Converta fotos HEIC do iPhone para o formato JPG universalmente compatível. + + + + + HEIC para JPG + + + + + Conversor de HEIC para JPG + + + Converta facilmente suas imagens HEIC (formato de alta eficiência da Apple) para o formato JPG, compatível com qualquer dispositivo. + + + HEIC para JPG + + + JPG para HEIC + + + Selecione um arquivo HEIC + + + Selecione um arquivo JPG + + + Converter para JPG + + + Converter para HEIC + + + O que é um arquivo HEIC? + + + HEIC (High Efficiency Image Container) é um formato de imagem moderno que oferece alta qualidade com um tamanho de arquivo menor em comparação com o JPG. É o formato padrão para fotos em iPhones e iPads. + + + Como converter HEIC para JPG? + + + É simples: 1. Clique no botão 'Selecionar arquivo HEIC' e escolha a imagem do seu dispositivo. 2. Clique em 'Converter para JPG'. 3. A imagem convertida será baixada automaticamente. + + + Por que converter de HEIC para JPG? + + + Embora o HEIC seja eficiente, ele não é universalmente compatível. O JPG é o formato de imagem mais aceito na web, em softwares de edição e em diferentes sistemas operacionais, garantindo que sua imagem possa ser visualizada em qualquer lugar. + + + A conversão é segura? + + + Sim. Sua privacidade é nossa prioridade. A conversão de HEIC para JPG é feita diretamente no seu navegador. Nenhum arquivo é enviado para nossos servidores, garantindo total segurança e privacidade. + + + Existem limites? + + + Não há limites para a quantidade de conversões. Para garantir um bom desempenho, recomendamos arquivos de até 10MB. O processamento é mais rápido em computadores modernos. + + + + + Conversor JPG ↔ WebP Online Grátis + + + Converta facilmente entre os formatos JPG e WebP. Transforme JPG em WebP para melhor compressão ou WebP em JPG para maior compatibilidade. + + + JPG → WebP + + + WebP → JPG + + + Selecione um arquivo WebP + + + Converter para WebP + + + O que são JPG e WebP? + + + JPG é um formato clássico de compressão de imagem amplamente compatível. WebP é um formato moderno desenvolvido pelo Google que oferece melhor compressão mantendo a qualidade da imagem. + + + Como converter entre JPG e WebP? + + + É simples: 1. Escolha a aba da conversão desejada (JPG→WebP ou WebP→JPG). 2. Clique em 'Selecionar arquivo' e escolha sua imagem. 3. Clique em 'Visualizar' para preview ou 'Converter' para download direto. + + + Por que converter entre JPG e WebP? + + + JPG→WebP: Reduz significativamente o tamanho do arquivo mantendo a qualidade, ideal para web. WebP→JPG: Garante compatibilidade universal com qualquer dispositivo ou software que não suporte WebP. + + + É seguro converter meus arquivos aqui? + + + Absolutamente. Todas as conversões são processadas de forma segura e seus arquivos são automaticamente excluídos após o processamento. Não armazenamos nenhuma de suas imagens. + + + Há limites de tamanho de arquivo? + + + Para a funcionalidade de preview, o limite é de 10MB por arquivo. Para conversões diretas, aceitamos arquivos maiores dentro de limites razoáveis para garantir boa performance. + + + + + Acessar Conversor + + + + + Por favor, selecione um arquivo para converter. + + + Arquivo HEIC inválido ou formato não suportado. Verifique o arquivo ou tente outro. A biblioteca nativa 'libheif' pode estar faltando no sistema. + + + Arquivo JPG inválido ou formato não suportado. Verifique se o arquivo é uma imagem JPG válida. + + + A conversão de JPG para HEIC ainda não está disponível. Esta funcionalidade será implementada em breve. + + + Ocorreu um erro ao processar sua solicitação. Tente novamente mais tarde. + \ No newline at end of file diff --git a/Views/Home/Index.cshtml b/Views/Home/Index.cshtml index 160d02a..57a48b5 100644 --- a/Views/Home/Index.cshtml +++ b/Views/Home/Index.cshtml @@ -10,33 +10,39 @@

@ViewBag.Subtitle

-
+ +
-

@ViewBag.ChooseConverter

-
-
- @foreach (var tool in Model) - { - -
- +

@ViewBag.AllConvertersTitle

+
+ @foreach (var converter in Model) + { +
+
+ -
-

@(tool.TitleKey == "TextToolsTitle" ? ViewBag.TextToolsTitle : ViewBag.ImageToolsTitle)

-

@(tool.DescriptionKey == "TextToolsDescription" ? ViewBag.TextToolsDescription : ViewBag.ImageToolsDescription)

-
-
- -
- - } -
+
+
+ }
-
+
diff --git a/Views/Shared/_Layout.cshtml b/Views/Shared/_Layout.cshtml index a24987e..e0dc4bf 100644 --- a/Views/Shared/_Layout.cshtml +++ b/Views/Shared/_Layout.cshtml @@ -29,10 +29,10 @@