refactor(i18n): lazy-load per-language files on demand

This commit is contained in:
SirMcPotato
2026-04-07 02:43:37 +02:00
parent 6f63a10609
commit 35d02e74f6
9 changed files with 1067 additions and 1380 deletions
+143
View File
@@ -0,0 +1,143 @@
export default {
"lang.name": "English",
"theme.dark": "Dark Theme",
"theme.light": "Light Theme",
"theme.toggleTitle": "Toggle light / dark mode",
"theme.toggleAriaLabel": "Toggle light/dark mode",
"dropHint.text": "Drop an <strong>.stl</strong>, <strong>.obj</strong> or <strong>.3mf</strong> file here<br/>or <label for=\"stl-file-input\" class=\"link-label\">click to browse</label>",
"ui.wireframe": "Wireframe",
"ui.controlsHint": "Left drag: orbit  ·  Right drag: pan  ·  Scroll: zoom",
"ui.meshInfo": "{n} triangles · {mb} MB · {sx} × {sy} × {sz} mm",
"ui.loadStl": "Load Model…",
"sections.displacementMap": "Displacement Map",
"ui.uploadCustomMap": "Upload custom map",
"ui.noMapSelected": "No map selected",
"sections.projection": "Projection",
"labels.mode": "Mode",
"projection.triplanar": "Triplanar",
"projection.cubic": "Cubic (Box)",
"projection.cylindrical": "Cylindrical",
"projection.spherical": "Spherical",
"projection.planarXY": "Planar XY",
"projection.planarXZ": "Planar XZ",
"projection.planarYZ": "Planar YZ",
"sections.transform": "Transform",
"labels.scaleU": "Scale U",
"labels.scaleV": "Scale V",
"labels.offsetU": "Offset U",
"labels.offsetV": "Offset V",
"labels.rotation": "Rotation",
"tooltips.proportionalScaling": "Proportional scaling (U = V)",
"tooltips.proportionalScalingAria": "Proportional scaling (U = V)",
"sections.displacement": "Texture Depth",
"labels.amplitude": "Amplitude",
"labels.seamBlend": "Seam Blend ⓘ",
"tooltips.seamBlend": "Softens the hard seam where projection faces meet. Effective for Cubic and Cylindrical modes.",
"labels.transitionSmoothing": "Transition Smoothing ⓘ",
"tooltips.transitionSmoothing": "Width of the blending zone near seam edges. Lower values keep transitions tight to the seam; higher values blend a wider band.",
"labels.textureSmoothing": "Texture Smoothing ⓘ",
"tooltips.textureSmoothing": "Applies a Gaussian blur to the displacement map. Higher values produce softer, more gradual surface detail. 0 = off.",
"labels.capAngle": "Cap Angle ⓘ",
"tooltips.capAngle": "Angle (in degrees) from vertical at which the top/bottom cap projection kicks in. Smaller values limit cap projection to nearly flat faces.",
"sections.masking": "Masking",
"sections.maskAngles": "By Angle ⓘ",
"tooltips.maskAngles": "0° = no masking. Surfaces within this angle of horizontal will not be textured.",
"labels.bottomFaces": "Bottom faces",
"tooltips.bottomFaces": "Suppress texture on downward-facing surfaces within this angle of horizontal",
"labels.topFaces": "Top faces",
"tooltips.topFaces": "Suppress texture on upward-facing surfaces within this angle of horizontal",
"sections.surfaceMasking": "By Surface ⓘ",
"sections.surfaceSelection": "Surface Selection",
"tooltips.surfaceMasking": "Mask surfaces to control which areas receive displacement.",
"tooltips.surfaceSelection": "Selected surfaces appear green and will be the only ones to receive displacement during export.",
"excl.modeExclude": "Exclude",
"excl.modeExcludeTitle": "Exclude mode: painted surfaces will not receive texture displacement",
"excl.modeIncludeOnly": "Include Only",
"excl.modeIncludeOnlyTitle": "Include Only mode: only painted surfaces will receive texture displacement",
"excl.toolBrush": "Brush",
"excl.toolBrushTitle": "Brush: paint triangles to exclude",
"excl.toolFill": "Fill",
"excl.toolFillTitle": "Bucket fill: flood-fill surface up to a threshold angle",
"excl.shiftHint": "Hold Shift to erase",
"labels.type": "Type",
"brushType.single": "Single",
"brushType.circle": "Circle",
"labels.size": "Size",
"labels.maxAngle": "Max angle",
"tooltips.maxAngle": "Maximum dihedral angle between adjacent triangles for the fill to cross",
"ui.clearAll": "Clear All",
"excl.initExcluded": "0 faces masked",
"excl.faceExcluded": "{n} face masked",
"excl.facesExcluded": "{n} faces masked",
"excl.faceSelected": "{n} face selected",
"excl.facesSelected": "{n} faces selected",
"excl.hintExclude": "Masked surfaces appear orange and will not receive displacement during export.",
"excl.hintInclude": "Selected surfaces appear green and will be the only ones to receive displacement during export.",
"precision.label": "Precision (Beta) ⓘ",
"precision.labelTitle": "Subdivide mesh in the background so the brush selects at finer granularity",
"precision.outdated": "⚠ Outdated",
"precision.refreshTitle": "Re-subdivide mesh to match current brush size",
"precision.triCount": "{n} △",
"precision.refining": "Refining…",
"precision.warningBody": "Estimated ~{n} triangles. This may slow down your browser. Continue?",
"labels.boundaryFalloff": "Smooth Mask ⓘ",
"tooltips.boundaryFalloff": "Gradually reduces displacement to zero near masked boundaries, preventing triangle overlap where textured and non-textured regions meet.",
"labels.symmetricDisplacement": "Symmetric displacement ⓘ",
"tooltips.symmetricDisplacement": "When on, 50% grey = no displacement; white pushes out, black pushes in. Keeps part volume roughly constant.",
"labels.displacementPreview": "3D Preview ⓘ",
"tooltips.displacementPreview": "Subdivides the mesh and displaces vertices in real-time so you can judge the actual depth. GPU-intensive on complex models.",
"ui.placeOnFace": "Place on Face",
"ui.placeOnFaceTitle": "Click a face to orient it downward onto the print bed",
"progress.subdividingPreview": "Preparing preview…",
"warnings.amplitudeOverlap": "⚠ Amplitude exceeds 10% of the smallest model dimension — geometry overlaps may occur in the exported STL.",
"sections.export": "Export ⓘ",
"tooltips.export": "Smaller edge length = finer displacement detail. Output is then decimated to the triangle limit.",
"labels.resolution": "Resolution",
"tooltips.resolution": "Edges longer than this value will be split during export",
"labels.outputTriangles": "Output Triangles",
"tooltips.outputTriangles": "Mesh is fully subdivided first, then decimated down to this count",
"warnings.safetyCapHit": "⚠ 20M-triangle safety cap hit during subdivision — result may still be coarser than requested edge length.",
"ui.exportStl": "Export STL",
"progress.subdividing": "Subdividing mesh…",
"progress.refining": "Refining: {cur} triangles, longest edge {edge}",
"progress.applyingDisplacement": "Applying displacement to {n} triangles…",
"progress.displacingVertices": "Displacing vertices…",
"progress.decimatingTo": "Simplifying {from} → {to} triangles…",
"progress.decimating": "Simplifying: {cur} → {to} triangles",
"progress.writingStl": "Writing STL…",
"progress.done": "Done!",
"progress.processing": "Processing…",
"license.btn": "License & Terms",
"license.title": "License & Terms",
"license.item1": "Free to use for any purpose, including <strong>commercial work</strong> (e.g., texturing STLs for clients or products).",
"license.item2": "Attribution is <strong>appreciated</strong> but <strong>not required</strong> when using this tool as-is.",
"license.item3": "Support this tool? Shop at <a href=\"https://geni.us/CNCStoreTexture\" target=\"_blank\" rel=\"noopener\">CNCKitchen.STORE</a> or donate on <a href=\"https://www.paypal.me/CNCKitchen\" target=\"_blank\" rel=\"noopener\">PayPal</a>.",
"license.item4": "This tool is provided <strong>as-is</strong> with <strong>no warranty</strong> of any kind. Use at your own risk.",
"license.item5": "<strong>No support</strong> is provided. The author is under no obligation to fix bugs, answer questions, or update this tool. That said, bug reports and feature requests are always welcome at <a href=\"mailto:texturizer@cnckitchen.com\">texturizer@cnckitchen.com</a>.",
"license.item6": "The author shall not be held <strong>liable</strong> for any damages, data loss, or issues arising from the use of this tool.",
"license.item7": "Want to license or embed this tool for your own business or website? Contact us at <a href=\"mailto:contact@cnckitchen.com\">contact@cnckitchen.com</a>.",
"license.item8": "Source code available on <a href=\"https://github.com/CNCKitchen/stlTexturizer\" target=\"_blank\" rel=\"noopener\">GitHub</a>.",
"imprint.btn": "Imprint & Privacy",
"imprint.title": "Imprint & Privacy Policy",
"imprint.sectionImprint": "Imprint (Impressum)",
"imprint.info": "CNC Kitchen<br>Stefan Hermann<br>Bahnhofstr. 2<br>88145 Hergatz<br>Germany",
"imprint.contact": "Email: <a href=\"mailto:contact@cnckitchen.com\">contact@cnckitchen.com</a><br>Phone: +49 175 2011824<br><em>The phone number is for legal/business inquiries only — not for support.</em>",
"imprint.odr": "EU Online Dispute Resolution platform: <a href=\"https://ec.europa.eu/consumers/odr\" target=\"_blank\" rel=\"noopener\">https://ec.europa.eu/consumers/odr</a>",
"imprint.sectionPrivacy": "Privacy Policy (Datenschutzerklärung)",
"imprint.privacyIntro": "<strong>Responsible party</strong> (Verantwortlicher gem. Art. 4 Abs. 7 DSGVO): Stefan Hermann, Bahnhofstr. 2, 88145 Hergatz, Germany.",
"imprint.privacyHosting": "This website is hosted on <strong>GitHub Pages</strong> (GitHub Inc. / Microsoft Corp., 88 Colin P Kelly Jr St, San Francisco, CA 94107, USA). When you visit this site, GitHub may process your IP address in server logs. Legal basis: Art. 6(1)(f) DSGVO (legitimate interest in providing the website). See <a href=\"https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement\" target=\"_blank\" rel=\"noopener\">GitHubs Privacy Statement</a>.",
"imprint.privacyLocal": "This tool stores user preferences (language, theme) in your browsers <strong>localStorage</strong>. This data never leaves your device and is not transmitted to any server.",
"imprint.privacyNoCookies": "This website does <strong>not</strong> use cookies, analytics, or any tracking technologies.",
"imprint.privacyExternal": "This site contains links to external websites (e.g., CNCKitchen.STORE, PayPal). These sites have their own privacy policies, over which we have no control.",
"imprint.privacyRights": "Under the GDPR you have the right to <strong>access, rectification, erasure, restriction of processing, data portability</strong>, and the right to <strong>lodge a complaint</strong> with a supervisory authority.",
"sponsor.title": "Thanks for using BumpMesh by CNC Kitchen!",
"sponsor.body": "This tool is provided <strong>completely free</strong> by CNC Kitchen.<br>While your STL is being processed, why not check out the store that helps us keep making cool stuff for you?",
"sponsor.visitStore": "🛒 Visit CNCKitchen.STORE",
"sponsor.donate": "💙 Donate on PayPal",
"sponsor.dontShow": "Dont show this again",
"sponsor.closeAndContinue": "Close &amp; Continue",
"cta.store": "Support this tool? Shop at <a href=\"https://geni.us/CNCStoreTexture\" target=\"_blank\" rel=\"noopener noreferrer\">CNCKitchen.STORE</a> or donate on <a href=\"https://www.paypal.me/CNCKitchen\" target=\"_blank\" rel=\"noopener noreferrer\">PayPal</a>",
"cta.storeDismiss": "Dismiss",
"alerts.loadFailed": "Could not load model: {msg}",
"alerts.exportFailed": "Export failed: {msg}"
};