mirror of
https://github.com/CNCKitchen/stlTexturizer.git
synced 2026-04-07 22:11:32 +00:00
ce5b040972
- Split monolithic i18n.js into per-language files under js/i18n/ - Lazy-load translations via dynamic import() with caching - Add French (fr) language support - Add error handling in _loadLang with English fallback - Remove duplicated lang.name from per-language files (registry is single source of truth) - Add dev-time key validation (warns on localhost when keys are missing vs en.js) - Add missing alerts.fileTooLarge key from main to all language files - Await async initLang() in main.js (supported by type=module)
144 lines
12 KiB
JavaScript
144 lines
12 KiB
JavaScript
export default {
|
||
"theme.dark": "Tema Oscuro",
|
||
"theme.light": "Tema Claro",
|
||
"theme.toggleTitle": "Alternar modo claro / oscuro",
|
||
"theme.toggleAriaLabel": "Alternar modo claro/oscuro",
|
||
"dropHint.text": "Arrastra aquí un archivo <strong>.stl</strong>, <strong>.obj</strong> o <strong>.3mf</strong><br/>o <label for=\"stl-file-input\" class=\"link-label\">haz clic para explorar</label>",
|
||
"ui.wireframe": "Malla de alambre",
|
||
"ui.controlsHint": "Arrastrar izq.: orbitar · Arrastrar der.: desplazar · Rueda: zoom",
|
||
"ui.meshInfo": "{n} triángulos · {mb} MB · {sx} × {sy} × {sz} mm",
|
||
"ui.loadStl": "Cargar modelo…",
|
||
"sections.displacementMap": "Mapa de desplazamiento",
|
||
"ui.uploadCustomMap": "Subir mapa personalizado",
|
||
"ui.noMapSelected": "Ningún mapa seleccionado",
|
||
"sections.projection": "Proyección",
|
||
"labels.mode": "Modo",
|
||
"projection.triplanar": "Triplanar",
|
||
"projection.cubic": "Cúbica (Caja)",
|
||
"projection.cylindrical": "Cilíndrica",
|
||
"projection.spherical": "Esférica",
|
||
"projection.planarXY": "Planar XY",
|
||
"projection.planarXZ": "Planar XZ",
|
||
"projection.planarYZ": "Planar YZ",
|
||
"sections.transform": "Transformación",
|
||
"labels.scaleU": "Escala U",
|
||
"labels.scaleV": "Escala V",
|
||
"labels.offsetU": "Desplazamiento U",
|
||
"labels.offsetV": "Desplazamiento V",
|
||
"labels.rotation": "Rotación",
|
||
"tooltips.proportionalScaling": "Escalado proporcional (U = V)",
|
||
"tooltips.proportionalScalingAria": "Escalado proporcional (U = V)",
|
||
"sections.displacement": "Profundidad de textura",
|
||
"labels.amplitude": "Amplitud",
|
||
"labels.seamBlend": "Fusión de costuras ⓘ",
|
||
"tooltips.seamBlend": "Suaviza la costura donde se unen las caras de proyección. Efectivo para los modos Cúbico y Cilíndrico.",
|
||
"labels.transitionSmoothing": "Suavizado de transición ⓘ",
|
||
"tooltips.transitionSmoothing": "Ancho de la zona de fusión cerca de los bordes de la costura. Valores bajos mantienen las transiciones pegadas a la costura; valores altos difuminan una banda más amplia.",
|
||
"labels.textureSmoothing": "Suavizado de textura ⓘ",
|
||
"tooltips.textureSmoothing": "Aplica un desenfoque gaussiano al mapa de desplazamiento. Valores más altos producen detalles de superficie más suaves y graduales. 0 = desactivado.",
|
||
"labels.capAngle": "Ángulo de tapa ⓘ",
|
||
"tooltips.capAngle": "Ángulo (en grados) desde la vertical en el que se activa la proyección de tapa superior/inferior. Valores más pequeños limitan la proyección a caras casi planas.",
|
||
"sections.masking": "Enmascaramiento",
|
||
"sections.maskAngles": "Por ángulo ⓘ",
|
||
"tooltips.maskAngles": "0° = sin enmascaramiento. Las superficies dentro de este ángulo respecto a la horizontal no serán texturizadas.",
|
||
"labels.bottomFaces": "Caras inferiores",
|
||
"tooltips.bottomFaces": "Eliminar textura en superficies orientadas hacia abajo dentro de este ángulo respecto a la horizontal",
|
||
"labels.topFaces": "Caras superiores",
|
||
"tooltips.topFaces": "Eliminar textura en superficies orientadas hacia arriba dentro de este ángulo respecto a la horizontal",
|
||
"sections.surfaceMasking": "Por superficie ⓘ",
|
||
"sections.surfaceSelection": "Selección de superficies",
|
||
"tooltips.surfaceMasking": "Enmascarar superficies para controlar qué áreas reciben desplazamiento.",
|
||
"tooltips.surfaceSelection": "Las superficies seleccionadas aparecen en verde y serán las únicas en recibir desplazamiento durante la exportación.",
|
||
"excl.modeExclude": "Excluir",
|
||
"excl.modeExcludeTitle": "Modo Excluir: las superficies pintadas no recibirán desplazamiento de textura",
|
||
"excl.modeIncludeOnly": "Solo incluir",
|
||
"excl.modeIncludeOnlyTitle": "Modo Solo incluir: solo las superficies pintadas recibirán desplazamiento de textura",
|
||
"excl.toolBrush": "Pincel",
|
||
"excl.toolBrushTitle": "Pincel: pintar triángulos para excluir",
|
||
"excl.toolFill": "Relleno",
|
||
"excl.toolFillTitle": "Relleno: rellenar superficie hasta un ángulo umbral",
|
||
"excl.shiftHint": "Mantén Shift para borrar",
|
||
"labels.type": "Tipo",
|
||
"brushType.single": "Individual",
|
||
"brushType.circle": "Círculo",
|
||
"labels.size": "Tamaño",
|
||
"labels.maxAngle": "Ángulo máx.",
|
||
"tooltips.maxAngle": "Ángulo diedro máximo entre triángulos adyacentes que el relleno puede cruzar",
|
||
"ui.clearAll": "Borrar todo",
|
||
"excl.initExcluded": "0 caras enmascaradas",
|
||
"excl.faceExcluded": "{n} cara enmascarada",
|
||
"excl.facesExcluded": "{n} caras enmascaradas",
|
||
"excl.faceSelected": "{n} cara seleccionada",
|
||
"excl.facesSelected": "{n} caras seleccionadas",
|
||
"excl.hintExclude": "Las superficies enmascaradas aparecen en naranja y no recibirán desplazamiento durante la exportación.",
|
||
"excl.hintInclude": "Las superficies seleccionadas aparecen en verde y serán las únicas en recibir desplazamiento durante la exportación.",
|
||
"precision.label": "Precisión (Beta) ⓘ",
|
||
"precision.labelTitle": "Subdivide la malla en segundo plano para que el pincel seleccione con mayor granularidad",
|
||
"precision.outdated": "⚠ Desactualizado",
|
||
"precision.refreshTitle": "Resubdividir la malla para ajustarla al tamaño actual del pincel",
|
||
"precision.triCount": "{n} △",
|
||
"precision.refining": "Refinando…",
|
||
"precision.warningBody": "Estimados ~{n} triángulos. Esto puede ralentizar el navegador. ¿Continuar?",
|
||
"labels.boundaryFalloff": "Suavizar máscara ⓘ",
|
||
"tooltips.boundaryFalloff": "Reduce gradualmente el desplazamiento a cero cerca de los bordes enmascarados, evitando superposiciones de triángulos entre zonas texturizadas y no texturizadas.",
|
||
"labels.symmetricDisplacement": "Desplazamiento simétrico ⓘ",
|
||
"tooltips.symmetricDisplacement": "Cuando está activado, el gris al 50% = sin desplazamiento; el blanco empuja hacia fuera, el negro empuja hacia dentro. Mantiene el volumen de la pieza aproximadamente constante.",
|
||
"labels.displacementPreview": "Vista previa 3D ⓘ",
|
||
"tooltips.displacementPreview": "Subdivide la malla y desplaza los vértices en tiempo real para evaluar la profundidad real. Uso intensivo de GPU en modelos complejos.",
|
||
"ui.placeOnFace": "Colocar en cara",
|
||
"ui.placeOnFaceTitle": "Haz clic en una cara para orientarla hacia abajo sobre la cama de impresión",
|
||
"progress.subdividingPreview": "Preparando vista previa…",
|
||
"warnings.amplitudeOverlap": "⚠ La amplitud supera el 10% de la dimensión más pequeña del modelo — pueden ocurrir superposiciones de geometría en el STL exportado.",
|
||
"sections.export": "Exportar ⓘ",
|
||
"tooltips.export": "Menor longitud de arista = mayor detalle de desplazamiento. La salida se reduce al límite de triángulos.",
|
||
"labels.resolution": "Resolución",
|
||
"tooltips.resolution": "Las aristas más largas que este valor se subdividirán durante la exportación",
|
||
"labels.outputTriangles": "Triángulos de salida",
|
||
"tooltips.outputTriangles": "La malla se subdivide completamente primero y luego se reduce a esta cantidad",
|
||
"warnings.safetyCapHit": "⚠ Se alcanzó el límite de seguridad de 20M de triángulos durante la subdivisión — el resultado puede ser más grueso que la longitud de arista solicitada.",
|
||
"ui.exportStl": "Exportar STL",
|
||
"progress.subdividing": "Subdividiendo malla…",
|
||
"progress.refining": "Refinando: {cur} triángulos, arista más larga {edge}",
|
||
"progress.applyingDisplacement": "Aplicando desplazamiento a {n} triángulos…",
|
||
"progress.displacingVertices": "Desplazando vértices…",
|
||
"progress.decimatingTo": "Simplificando {from} → {to} triángulos…",
|
||
"progress.decimating": "Simplificando: {cur} → {to} triángulos",
|
||
"progress.writingStl": "Escribiendo STL…",
|
||
"progress.done": "¡Listo!",
|
||
"progress.processing": "Procesando…",
|
||
"license.btn": "Licencia y condiciones",
|
||
"license.title": "Licencia y condiciones",
|
||
"license.item1": "Uso gratuito para cualquier propósito, incluyendo <strong>trabajo comercial</strong> (p. ej., texturizado de STLs para clientes o productos).",
|
||
"license.item2": "La atribución es <strong>apreciada</strong> pero <strong>no obligatoria</strong> al usar esta herramienta tal cual.",
|
||
"license.item3": "¿Quieres apoyar esta herramienta? Compra en <a href=\"https://geni.us/CNCStoreTexture\" target=\"_blank\" rel=\"noopener\">CNCKitchen.STORE</a> o dona en <a href=\"https://www.paypal.me/CNCKitchen\" target=\"_blank\" rel=\"noopener\">PayPal</a>.",
|
||
"license.item4": "Esta herramienta se proporciona <strong>tal cual</strong> sin <strong>ninguna garantía</strong> de ningún tipo. Úsala bajo tu propio riesgo.",
|
||
"license.item5": "<strong>No se proporciona soporte</strong>. El autor no tiene obligación de corregir errores, responder preguntas ni actualizar esta herramienta. Dicho esto, los informes de errores y solicitudes de funciones son siempre bienvenidos en <a href=\"mailto:texturizer@cnckitchen.com\">texturizer@cnckitchen.com</a>.",
|
||
"license.item6": "El autor no será responsable de <strong>daños</strong>, pérdida de datos o problemas derivados del uso de esta herramienta.",
|
||
"license.item7": "¿Quieres licenciar o integrar esta herramienta para tu negocio o sitio web? Contáctanos en <a href=\"mailto:contact@cnckitchen.com\">contact@cnckitchen.com</a>.",
|
||
"license.item8": "Código fuente disponible en <a href=\"https://github.com/CNCKitchen/stlTexturizer\" target=\"_blank\" rel=\"noopener\">GitHub</a>.",
|
||
"imprint.btn": "Aviso legal y privacidad",
|
||
"imprint.title": "Aviso legal y política de privacidad",
|
||
"imprint.sectionImprint": "Aviso legal (Impressum)",
|
||
"imprint.info": "CNC Kitchen<br>Stefan Hermann<br>Bahnhofstr. 2<br>88145 Hergatz<br>Alemania",
|
||
"imprint.contact": "Correo: <a href=\"mailto:contact@cnckitchen.com\">contact@cnckitchen.com</a><br>Teléfono: +49 175 2011824<br><em>El número de teléfono es exclusivamente para consultas legales/comerciales — no para soporte.</em>",
|
||
"imprint.odr": "Plataforma de resolución de litigios en línea de la UE: <a href=\"https://ec.europa.eu/consumers/odr\" target=\"_blank\" rel=\"noopener\">https://ec.europa.eu/consumers/odr</a>",
|
||
"imprint.sectionPrivacy": "Política de privacidad (Datenschutzerklärung)",
|
||
"imprint.privacyIntro": "<strong>Responsable</strong> (Verantwortlicher gem. Art. 4 Abs. 7 DSGVO): Stefan Hermann, Bahnhofstr. 2, 88145 Hergatz, Alemania.",
|
||
"imprint.privacyHosting": "Este sitio web está alojado en <strong>GitHub Pages</strong> (GitHub Inc. / Microsoft Corp., 88 Colin P Kelly Jr St, San Francisco, CA 94107, EE.UU.). Al visitar este sitio, GitHub puede procesar tu dirección IP en los registros del servidor. Base legal: Art. 6(1)(f) RGPD (interés legítimo en proporcionar el sitio web). Ver <a href=\"https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement\" target=\"_blank\" rel=\"noopener\">Declaración de privacidad de GitHub</a>.",
|
||
"imprint.privacyLocal": "Esta herramienta almacena las preferencias del usuario (idioma, tema) en el <strong>localStorage</strong> de tu navegador. Estos datos nunca salen de tu dispositivo ni se transmiten a ningún servidor.",
|
||
"imprint.privacyNoCookies": "Este sitio web <strong>no</strong> utiliza cookies, herramientas de análisis ni tecnologías de rastreo.",
|
||
"imprint.privacyExternal": "Este sitio contiene enlaces a sitios web externos (p. ej., CNCKitchen.STORE, PayPal). Estos sitios tienen sus propias políticas de privacidad, sobre las cuales no tenemos control.",
|
||
"imprint.privacyRights": "Según el RGPD, tienes derecho a <strong>acceso, rectificación, supresión, limitación del tratamiento, portabilidad de datos</strong> y derecho a <strong>presentar una reclamación</strong> ante una autoridad de control.",
|
||
"sponsor.title": "¡Gracias por usar BumpMesh de CNC Kitchen!",
|
||
"sponsor.body": "Esta herramienta es proporcionada <strong>completamente gratis</strong> por CNC Kitchen.<br>Mientras se procesa tu STL, ¿por qué no echas un vistazo a la tienda que nos ayuda a seguir creando cosas geniales para ti?",
|
||
"sponsor.visitStore": "🛒 Visitar CNCKitchen.STORE",
|
||
"sponsor.donate": "💙 Donar en PayPal",
|
||
"sponsor.dontShow": "No mostrar de nuevo",
|
||
"sponsor.closeAndContinue": "Cerrar y continuar",
|
||
"cta.store": "¿Quieres apoyar esta herramienta? Compra en <a href=\"https://geni.us/CNCStoreTexture\" target=\"_blank\" rel=\"noopener noreferrer\">CNCKitchen.STORE</a> o dona en <a href=\"https://www.paypal.me/CNCKitchen\" target=\"_blank\" rel=\"noopener noreferrer\">PayPal</a>",
|
||
"cta.storeDismiss": "Cerrar",
|
||
"alerts.loadFailed": "No se pudo cargar el modelo: {msg}",
|
||
"alerts.exportFailed": "Error en la exportación: {msg}",
|
||
"alerts.fileTooLarge": "Archivo demasiado grande ({size} MB). Máximo: {max} MB."
|
||
};
|