Ich verwende Flaggen für die Sprache Auswahl in meinem Projekt um die Label ,Button Beschriftung und den Inhalt meines tooltips entsprechend ändern zu können.Ich verstehe die Frage ni
Ich verwende Flaggen für die Sprache Auswahl in meinem Projekt um die Label ,Button Beschriftung und den Inhalt meines tooltips entsprechend ändern zu können.Ich verstehe die Frage ni
npm install -g @vue/cli
vue create my-project
<label for="sku" id="sku-label" data-id="sku-label">SKU:</label>
<label for="description" id="description-label" data-id="description-label">Beschreibung:</label>
<label for="color" id="color-label" data-id="color-label">Farbe:</label>
<label for="size" id="size-label" data-id="size-label">Größe:</label>
<div class="button-grid">
<button type="submit" id="btnSubmit" data-id="btnSubmit">Submit</button>
<button type="reset" id="btnReset" data-id="btnReset">Reset</button>
<button class="print-button" id="btnPrint" data-id="btnPrint" onclick="printPage()">Print</button>
</div>
</form>
<div class="schalter-container">
<div class="schalter-wrapper" data-switch="autoreset" data-label="Auto-Reset"></div>
<div class="schalter-wrapper" data-switch="faultySwitch" data-label="Faulty-Label" data-onchange="toggleFaultLabel()"></div>
<div class="schalter-wrapper" data-switch="autoDisplaySwitch" data-label="Auto-Eingabe" data-onchange="toggleAutoDisplay()"></div>
</div>
// Dynamisches Rendern der Schalter
document.querySelectorAll(".schalter-wrapper").forEach((wrapper) => {
const switchId = wrapper.dataset.switch;
const labelText = wrapper.dataset.label;
const onchangeFunction = wrapper.dataset.onchange || "";
wrapper.innerHTML = `
<label for="${switchId}">${labelText}</label>
<div class="onoffswitch">
<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="${switchId}" ${
onchangeFunction ? `onchange="${onchangeFunction}"` : ""
}>
<label class="onoffswitch-label" for="${switchId}">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
`});
<script setup>
import { ref } from 'vue'
import SchalterWrapper from './SchalterWrapper.vue';
const msg = ref('Hello World!')
const toggleFaultLabel = (value) => {
msg.value = `toggleFaultLabel: ${JSON.stringify(value)}`;
translations.value.label.button2 = `Auto-Reset ${value}`;
}
const toggleAutoDisplay = (value) => {
msg.value = `toggleAutoDisplay: ${value}`;
}
const translations = ref({
label : {
button1: "Auto-Reset",
button2: "Faulty-Label",
button3: "Auto-Eingabe",
}
});
</script>
<template>
<h1>{{ msg }}</h1>
<div class="schalter-container">
<schalter-wrapper switch="autoreset" :label="`${translations.label.button1}`"/>
<schalter-wrapper switch="faultySwitch" :label="`${translations.label.button2}`" @change="toggleFaultLabel"/>
<schalter-wrapper switch="autoDisplaySwitch" :label="`${translations.label.button3}`" @change="toggleAutoDisplay"/>
</div>
</template>
<script setup>
import { ref } from 'vue';
const props = defineProps(['switchId', 'label']);
const emit = defineEmits(['change']);
const inputRef = ref();
</script>
<template>
<div>
<label :for="`${switchId}`">{{label}}</label>
<div class="onoffswitch">
<input
ref="inputRef"
type="checkbox"
name="onoffswitch"
class="onoffswitch-checkbox"
:id="`${switchId}`"
@click="() => emit('change', inputRef.checked)"
/>
<label class="onoffswitch-label" :for="`${switchId}`">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue';
import ButtonsComp from './ButtonsComp.vue'; // Importiere die Buttons-Komponente
// Aktuell ausgewählte Sprache
const selectedLang = ref("DE");
// Übersetzungen für verschiedene Sprachen
const translations = {
DE: {
description: "Beschreibung",
color: "Farbe",
size: "Größe",
submit: "Absenden",
reset: "Zurücksetzen",
print: "Drucken",
faultySwitch: "Faulty Label",
autoDisplay: "Auto Display",
guideTitle: "Benutzeranleitung für das Formular",
guideIntro: "Dieses Formular dient zur Eingabe und Verwaltung von Produktdaten wie SKU, Beschreibung, Farbe und Größe. Folgen Sie den Anweisungen, um Daten korrekt zu erfassen.",
formFieldsTitle: "Formularfelder",
languageSelection: "Sprache: Wählen Sie Deutsch (DE), Englisch (EN) oder Polnisch (PL). Die Sprache beeinflusst alle Beschriftungen.",
fieldSku: "<strong>SKU:</strong> Geben Sie die Produktnummer ein.",
fieldDescription: "<strong>Beschreibung:</strong> Erfassen Sie eine kurze Produktbeschreibung.",
fieldColorSize: "<strong>Farbe & Größe:</strong> Tragen Sie Farbe und Größe des Produkts in die entsprechenden Felder ein.",
buttonsShortcutsTitle: "Schaltflächen und Tastenkombinationen",
shortcutSubmit: "<b>Submit-Button: </b>speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination<em>: <strong>Enter</strong></em><strong>.</strong>",
submitButtonShortcut: "Enter",
shortcutReset: "<strong>Reset-Button:</strong> Löscht alle Eingaben und setzt das Formular zurück. Tastenkombination<i>: <strong>Alt</strong></i><strong>+ R.</strong>",
shortcutPrint: "<strong>Print Button:</strong> Öffnet die Druckvorschau des Formulars. Tastenkombination<i>: <strong>Ctrl</strong></i><strong>+ P.</strong>",
additionalFunctionsTitle: "Zusatzfunktionen",
autoReset: "<strong>Auto-Reset:</strong>",
autoResetOn: "<strong>Ein:</strong> Formular wird nach Absenden automatisch zurückgesetzt.",
autoResetOff: "<strong>Aus:</strong> Eingaben bleiben erhalten.",
autoInput: "<strong>Auto Eingabe:</strong>",
autoInputOn: "<strong>Ein:</strong> Produktdaten werden automatisch befüllt, wenn verfügbar.",
autoInputOff: "<strong>Aus:</strong> Manuelle Eingabe erforderlich.",
faulty: "<strong>Faulty:</strong>",
faultyActivate: "Aktivieren Sie diesen Schalter, um ein Produkt als fehlerhaft zu kennzeichnen.",
keyboardShortcutsTitle: "Tastenkombinationen",
screenModesTitle: "Bildschirmmodi",
portraitMode: "<strong>Hochformat:</strong> Vertikale Anordnung, geeignet für mobile Geräte.",
landscapeMode: "<strong>Querformat:</strong> Breitere Ansicht mit Info-Feld neben den Eingabefeldern.",
layoutNote: "Hinweis: Das Layout passt sich automatisch an die Bildschirmgröße an."
},
EN: {
description: "Description",
color: "Color",
size: "Size",
submit: "Submit",
reset: "Reset",
print: "Print",
faultySwitch: "Faulty Label",
autoDisplay: "Auto Display",
guideTitle: "User Guide for the Form",
guideIntro: "This form is used for entering and managing product data such as SKU, description, color, and size. Follow the instructions to enter data correctly.",
formFieldsTitle: "Form Fields",
languageSelection: "Language: Choose German (DE), English (EN), or Polish (PL). The language affects all labels.",
fieldSku: "<strong>SKU:</strong> Enter the product number.",
fieldDescription: "<strong>Description:</strong> Enter a short product description.",
fieldColorSize: "<strong>Color & Size:</strong> Enter the color and size of the product in the appropriate fields.",
buttonsShortcutsTitle: "Buttons and Keyboard Shortcuts",
shortcutSubmit: "<b>Submit Button:</b> Saves the entered data if all required fields are filled out. Keyboard shortcut<em>: <strong>Enter</strong></em><strong>.</strong>",
submitButtonShortcut: "Enter",
shortcutReset: "<strong>Reset Button:</strong> Clears all entries and resets the form. Keyboard shortcut<i>: <strong>Alt</strong></i><strong>+ R.</strong>",
shortcutPrint: "<strong>Print Button:</strong> Opens the print preview of the form. Keyboard shortcut<i>: <strong>Ctrl</strong></i><strong>+ P.</strong>",
additionalFunctionsTitle: "Additional Functions",
autoReset: "<strong>Auto-Reset:</strong>",
autoResetOn: "<strong>On:</strong> The form is automatically reset after submission.",
autoResetOff: "<strong>Off:</strong> Entries are retained.",
autoInput: "<strong>Auto Input:</strong>",
autoInputOn: "<strong>On:</strong> Product data is automatically filled in if available.",
autoInputOff: "<strong>Off:</strong> Manual entry is required.",
faulty: "<strong>Faulty:</strong>",
faultyActivate: "Activate this switch to mark a product as faulty.",
keyboardShortcutsTitle: "Keyboard Shortcuts",
screenModesTitle: "Screen Modes",
portraitMode: "<strong>Portrait Mode:</strong> Vertical layout, suitable for mobile devices.",
landscapeMode: "<strong>Landscape Mode:</strong> Wider view with the info box next to the input fields.",
layoutNote: "Note: The layout adjusts automatically to the screen size."
},
PL: {
description: "Opis",
color: "Kolor",
size: "Rozmiar",
submit: "Zatwierdź",
reset: "Resetuj",
print: "Drukuj",
faultySwitch: "Wadliwe",
autoDisplay: "Autouzupełnianie",
guideTitle: "Instrukcja obsługi formularza",
guideIntro: "Ten formularz służy do wprowadzania i zarządzania danymi produktów, takimi jak SKU, opis, kolor i rozmiar. Postępuj zgodnie z instrukcjami, aby poprawnie wprowadzić dane.",
formFieldsTitle: "Pola formularza",
languageSelection: "Język: Wybierz niemiecki (DE), angielski (EN) lub polski (PL). Język wpływa na wszystkie etykiety.",
fieldSku: "<strong>SKU:</strong> Wprowadź numer produktu.",
fieldDescription: "<strong>Opis:</strong> Wprowadź krótki opis produktu.",
fieldColorSize: "<strong>Kolor i Rozmiar:</strong> Wprowadź kolor i rozmiar produktu w odpowiednich polach.",
buttonsShortcutsTitle: "Przyciski i skróty klawiszowe",
shortcutSubmit: "<b>Przycisk Zatwierdź:</b> Zapisuje wprowadzone dane, jeśli wszystkie wymagane pola są wypełnione. Skrót klawiszowy<em>: <strong>Enter</strong></em><strong>.</strong>",
submitButtonShortcut: "Enter",
shortcutReset: "<strong>Przycisk Resetuj:</strong> Czyści wszystkie wpisy i resetuje formularz. Skrót klawiszowy<i>: <strong>Alt</strong></i><strong>+ R.</strong>",
shortcutPrint: "<strong>Przycisk Drukuj:</strong> Otwiera podgląd wydruku formularza. Skrót klawiszowy<i>: <strong>Ctrl</strong></i><strong>+ P.</strong>",
additionalFunctionsTitle: "Dodatkowe funkcje",
autoReset: "<strong>Automatyczny reset:</strong>",
autoResetOn: "<strong>Włączony:</strong> Formularz jest automatycznie resetowany po zatwierdzeniu.",
autoResetOff: "<strong>Wyłączony:</strong> Wpisane dane zostają zachowane.",
autoInput: "<strong>Automatyczne wypełnianie:</strong>",
autoInputOn: "<strong>Włączone:</strong> Dane produktu są automatycznie wypełniane, jeśli są dostępne.",
autoInputOff: "<strong>Wyłączone:</strong> Wymagane jest ręczne wprowadzenie danych.",
faulty: "<strong>Uszkodzony:</strong>",
faultyActivate: "Włącz ten przełącznik, aby oznaczyć produkt jako uszkodzony.",
keyboardShortcutsTitle: "Skróty klawiszowe",
screenModesTitle: "Tryby ekranu",
portraitMode: "<strong>Tryb portretowy:</strong> Układ pionowy, odpowiedni dla urządzeń mobilnych.",
landscapeMode: "<strong>Tryb poziomy:</strong> Szerszy widok z polem informacji obok pól wprowadzania.",
layoutNote: "Uwaga: Układ dostosowuje się automatycznie do rozmiaru ekran."
},
};
// Computed-Eigenschaft für die aktuelle Sprache
const lang = computed(() => translations[selectedLang.value]);
</script>
<template>
<div>
<!-- Sprachauswahl mit Flaggen -->
<div class="language-selection">
<button
class="flag-button"
@click="selectedLang = 'DE'"
:class="{ active: selectedLang === 'DE' }"
>
<span class="flag-icon flag-icon-de"></span>
</button>
<button
class="flag-button"
@click="selectedLang = 'EN'"
:class="{ active: selectedLang === 'EN' }"
>
<span class="flag-icon flag-icon-gb"></span>
</button>
<button
class="flag-button"
@click="selectedLang = 'PL'"
:class="{ active: selectedLang === 'PL' }"
>
<span class="flag-icon flag-icon-pl"></span>
</button>
</div>
<h2>{{ lang.guideTitle }}</h2>
<p>{{ lang.guideIntro }}</p>
<h3>{{ lang.formFieldsTitle }}</h3>
<p>{{ lang.languageSelection }}</p>
<ul>
<li v-html="lang.fieldSku"></li>
<li v-html="lang.fieldDescription"></li>
<li v-html="lang.fieldColorSize"></li>
</ul>
<h3>{{ lang.buttonsShortcutsTitle }}</h3>
<ul>
<li v-html="lang.shortcutSubmit"></li>
<li v-html="lang.shortcutReset"></li>
<li v-html="lang.shortcutPrint"></li>
</ul>
<h3>{{ lang.additionalFunctionsTitle }}</h3>
<p>{{ lang.autoReset }}</p>
<ul>
<li v-html="lang.autoResetOn"></li>
<li v-html="lang.autoResetOff"></li>
</ul>
<p v-html="lang.autoInput"></p>
<ul>
<li v-html="lang.autoInputOn"></li>
<li v-html="lang.autoInputOff"></li>
</ul>
<p v-html="lang.faulty"></p>
<ul>
<li v-html="lang.faultyActivate"></li>
</ul>
<h3>{{ lang.screenModesTitle }}</h3>
<ul>
<li v-html="lang.portraitMode"></li>
<li v-html="lang.landscapeMode"></li>
</ul>
<p>{{ lang.layoutNote }}</p>
</div>
</template>
<style scoped>
/* Importiere die Flaggen-Bibliothek */
@import url('https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.5.0/css/flag-icon.min.css');
.language-selection {
display: flex;
gap: 15px;
margin-bottom: 20px;
}
.flag-button {
display: flex;
align-items: center;
gap: 8px;
border: none;
background: none;
cursor: pointer;
font-size: 16px;
}
.flag-button .flag-icon {
font-size: 24px;
}
.flag-button.active {
font-weight: bold;
text-decoration: underline;
}
</style>
<div class="form-container">
<!-- Sprachwahl mit Buttons -->
<div class="language-container">
<button class="language-button" data-lang="DE">
<span class="flag-icon flag-icon-de"></span> <!-- Deutschland -->
</button>
<button class="language-button" data-lang="EN">
<span class="flag-icon flag-icon-gb"></span> <!-- Großbritannien -->
</button>
<button class="language-button" data-lang="PL">
<span class="flag-icon flag-icon-pl"></span> <!-- Polen -->
</button>
</div>
<form id="itemForm" autocomplete="off" onsubmit="submitForm(event)" class="form-grid">
<!-- SKU Eingabefeld -->
<label for="sku" id="sku-label" data-id="sku-label">SKU:</label>
<input type="search" id="sku" name="sku" required>
<!-- Weitere Felder -->
<label for="description" id="description-label" data-id="description-label">Beschreibung:</label>
<input type="search" id="description" name="description" required>
<!-- Farbe und Größe Eingabefelder -->
<div class="color-size-container">
<div>
<label for="color" id="color-label" data-id="color-label">Farbe:</label>
<input type="search" id="color" name="color">
</div>
<div>
<label for="size" id="size-label" data-id="size-label">Größe:</label>
<input type="search" id="size" name="size">
</div>
</div>
<!-- Buttons im Container -->
<div class="button-grid">
<button type="submit" id="btnSubmit" data-id="btnSubmit">Submit</button>
<button type="reset" id="btnReset" data-id="btnReset">Reset</button>
<button class="print-button" id="btnPrint" data-id="btnPrint" onclick="printPage()">Print</button>
</div>
</form>
<div class="schalter-container">
<div class="schalter-wrapper" data-switch="autoreset" data-label="Auto-Reset"></div>
<div class="schalter-wrapper" data-switch="faultySwitch" data-label="Faulty-Label" data-onchange="toggleFaultLabel()"></div>
<div class="schalter-wrapper" data-switch="autoDisplaySwitch" data-label="Auto-Eingabe" data-onchange="toggleAutoDisplay()"></div>
</div>
// Dynamisches Rendern der Schalter
document.querySelectorAll(".schalter-wrapper").forEach((wrapper) => {
const switchId = wrapper.dataset.switch;
const labelText = wrapper.dataset.label;
const onchangeFunction = wrapper.dataset.onchange || "";
wrapper.innerHTML = `
<label for="${switchId}">${labelText}</label>
<div class="onoffswitch">
<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="${switchId}" ${
onchangeFunction ? `onchange="${onchangeFunction}"` : ""
}>
<label class="onoffswitch-label" for="${switchId}">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
`});
<ul>
<li v-html="lang.fieldSku"></li>
<li v-html="lang.fieldDescription"></li>
<li v-html="lang.fieldColorSize"></li>
</ul>
<script setup>
import { ref } from 'vue'
import MyLi from './MyLi.vue';
const translations = ref({
DE: {
fieldSku: { strongLabel: "SKU", label: "Geben Sie die Produktnummer ein."},
}
});
</script>
<template>
<ul>
<my-li :strong-label="translations.DE.fieldSku.strongLabel" :label="translations.DE.fieldSku.label"/>
</ul>
</template>
<script setup>
defineProps(["strongLabel", "label"]);
</script>
<template>
<li>
<strong style="margin-right: 1em;">{{ strongLabel }}:</strong>{{ label }}
</li>
</template>
Danke für den Hinweis. Ich wünsche Ihnen eine besinnliche Weihnachtszeit!Auto Display scheint falsch übersetzt: Das was da auf Polnisch steht, heißt Autovervollständigung. Also entweder das Deutsche ist falsch oder das polnische. Je nachdem was man sagen will.
wen V-HTML so ungünstig ist, wie kann ich das Ganze so ändern, dass meine Schrifteigenschaften erhalten bleiben vom Inhalt meines Tooltips t. Ich konnt zwar das Ganze ändern, aber dabei ging meine Texteigenschaften verloren, wie Fettschrift und kursive SchriftWie ich oben schon mal geschrieben habe: v-html - nicht benutzen! Das kann ganz schnell in einem Sicherheitsproblem enden. Du solltest Hilfsmittel wie eslint benutzen: https://eslint.vuejs.org/. Dann wirst du auf solche Probleme hingewiesen. Es ist hier auch nicht notwendig v-html zu verwenden.
HTML:<ul> <li v-html="lang.fieldSku"></li> <li v-html="lang.fieldDescription"></li> <li v-html="lang.fieldColorSize"></li> </ul>
App.vue
Javascript:<script setup> import { ref } from 'vue' import MyLi from './MyLi.vue'; const translations = ref({ DE: { fieldSku: { strongLabel: "SKU", label: "Geben Sie die Produktnummer ein."}, } }); </script> <template> <ul> <my-li :strong-label="translations.DE.fieldSku.strongLabel" :label="translations.DE.fieldSku.label"/> </ul> </template>
MyLi.vue
Javascript:<script setup> defineProps(["strongLabel", "label"]); </script> <template> <li> <strong style="margin-right: 1em;">{{ strongLabel }}:</strong>{{ label }} </li> </template>
Mit Typescript könnte man das noch besser lösen, da man dort Typen vorgeben kann. Es würde daher auch eine 'prop' mit einem bestimmten Typ ausreichen, dieser Typ hätte dann die beiden Felder: strongLabel u. label
so in etwar?Mit Components, s. #63
Javascript:<script setup> defineProps(["strongLabel", "label"]); </script> <template> <li> <strong style="margin-right: 1em;">{{ strongLabel }}:</strong>{{ label }} </li> </template>
<script setup lang="ts">
import { ref } from 'vue';
import MyLi from './MyLi.vue';
const isVisible = ref(false);
const toggleTooltip = () => {
isVisible.value = !isVisible.value;
};
</script>
<template>
<div class="tooltip-container">
<button
class="tooltip-button"
@click="toggleTooltip"
aria-expanded="isVisible"
>
Anleitung anzeigen
</button>
<div v-if="isVisible" class="tooltip" role="tooltip">
<h2>Benutzeranleitung für das Formular</h2>
<p>Dieses Formular dient zur Eingabe und Verwaltung von Produktdaten wie SKU, Beschreibung, Farbe und Größe.</p>
<h3>Formularfelder</h3>
<ul>
<my-li strong-label="SKU" label="Geben Sie die Produktnummer ein" />
<my-li strong-label="Beschreibung" label="Erfassen Sie eine kurze Produktbeschreibung" />
<my-li strong-label="Farbe & Größe" label="Tragen Sie Farbe und Größe des Produkts ein" />
</ul>
<h3>Tastenkombinationen</h3>
<ul>
<my-li strong-label="Enter" label="Formular absenden" />
<my-li strong-label="Alt + R" label="Formular zurücksetzen" />
<my-li strong-label="Ctrl + P" label="Druckvorschau öffnen" />
</ul>
<h3>Zusatzfunktionen</h3>
<ul>
<my-li strong-label="Auto-Reset" label="Formular nach dem Absenden automatisch zurücksetzen" />
<my-li strong-label="Auto-Eingabe" label="Verfügbare Produktdaten automatisch einfügen" />
<my-li strong-label="Faulty" label="Produkt als fehlerhaft markieren" />
</ul>
</div>
</div>
</template>
<style scoped>
.tooltip-container {
position: relative;
}
.tooltip-button {
padding: 0.5rem 1rem;
border: 1px solid #ddd;
border-radius: 4px;
background: white;
cursor: pointer;
}
.tooltip {
position: absolute;
top: 100%;
left: 0;
width: 100%;
max-width: 500px;
padding: 1rem;
background: white;
border: 1px solid #ddd;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
z-index: 100;
}
h2 {
margin-top: 0;
margin-bottom: 1rem;
}
h3 {
margin-top: 1.5rem;
margin-bottom: 0.5rem;
}
ul {
margin: 0;
padding: 0;
list-style: none;
}
</style>
<script setup lang="ts">
import { ref, computed } from 'vue'
// Types
type Language = 'DE' | 'EN' | 'PL'
interface TranslationContent {
tooltipButton: string
guideTitle: string
guideIntro: string
formFieldsTitle: string
languageSelection: string
labelSku: string
labelDescription: string
labelColor: string
labelSize: string
fieldSku: string
fieldDescription: string
fieldColorSize: string
buttonsShortcutsTitle: string
shortcutSubmit: string
shortcutReset: string
shortcutPrint: string
additionalFunctionsTitle: string
autoResetTitle: string
autoResetOn: string
autoResetOff: string
autoInputTitle: string
autoInputOn: string
autoInputOff: string
faultyTitle: string
faultyDescription: string
screenModesTitle: string
portraitMode: string
landscapeMode: string
layoutNote: string
}
// State
const currentLang = ref<Language>('DE')
const showTooltip = ref(false)
const autoResetEnabled = ref(false)
const faultyEnabled = ref(false)
const autoDisplayEnabled = ref(false)
const sku = ref('')
const description = ref('')
const color = ref('')
const size = ref('')
// Translations
const translations = {
DE: {
tooltipButton: "Anleitung anzeigen",
guideTitle: "Benutzeranleitung für das Formular",
guideIntro: "Dieses Formular dient zur Eingabe und Verwaltung von Produktdaten wie SKU, Beschreibung, Farbe und Größe. Folgen Sie den Anweisungen, um Daten korrekt zu erfassen.",
formFieldsTitle: "Formularfelder",
languageSelection: "Sprache: Wählen Sie Deutsch (DE), Englisch (EN) oder Polnisch (PL). Die Sprache beeinflusst alle Beschriftungen.",
labelSku: "SKU",
labelDescription: "Beschreibung",
labelColor: "Farbe",
labelSize: "Größe",
fieldSku: "SKU: Geben Sie die Produktnummer ein.",
fieldDescription: "Beschreibung: Erfassen Sie eine kurze Produktbeschreibung.",
fieldColorSize: "Farbe & Größe: Tragen Sie Farbe und Größe des Produkts in die entsprechenden Felder ein.",
buttonsShortcutsTitle: "Schaltflächen und Tastenkombinationen",
shortcutSubmit: "Submit-Button: speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination: Enter.",
shortcutReset: "Reset-Button: Löscht alle Eingaben und setzt das Formular zurück. Tastenkombination: Alt + R.",
shortcutPrint: "Print Button: Öffnet die Druckvorschau des Formulars. Tastenkombination: Ctrl + P.",
additionalFunctionsTitle: "Zusatzfunktionen",
autoResetTitle: "Auto-Reset",
autoResetOn: "Ein: Formular wird nach Absenden automatisch zurückgesetzt.",
autoResetOff: "Aus: Eingaben bleiben erhalten.",
autoInputTitle: "Auto Eingabe",
autoInputOn: "Ein: Produktdaten werden automatisch befüllt, wenn verfügbar.",
autoInputOff: "Aus: Manuelle Eingabe erforderlich.",
faultyTitle: "Faulty",
faultyDescription: "Aktivieren Sie diesen Schalter, um ein Produkt als fehlerhaft zu kennzeichnen.",
screenModesTitle: "Bildschirmmodi",
portraitMode: "Hochformat: Vertikale Anordnung, geeignet für mobile Geräte.",
landscapeMode: "Querformat: Breitere Ansicht mit Info-Feld neben den Eingabefeldern.",
layoutNote: "Hinweis: Das Layout passt sich automatisch an die Bildschirmgröße an."
},
EN: {
tooltipButton: "Show Guide",
guideTitle: "User Guide for the Form",
guideIntro: "This form is used for entering and managing product data such as SKU, description, color, and size. Follow the instructions to enter data correctly.",
formFieldsTitle: "Form Fields",
languageSelection: "Language: Choose German (DE), English (EN), or Polish (PL). The language affects all labels.",
labelSku: "SKU",
labelDescription: "Description",
labelColor: "Color",
labelSize: "Size",
fieldSku: "SKU: Enter the product number.",
fieldDescription: "Description: Enter a short product description.",
fieldColorSize: "Color & Size: Enter the color and size of the product in the appropriate fields.",
buttonsShortcutsTitle: "Buttons and Keyboard Shortcuts",
shortcutSubmit: "Submit Button: saves the entered data if all required fields are filled out. Keyboard shortcut: Enter.",
shortcutReset: "Reset Button: Clears all entries and resets the form. Keyboard shortcut: Alt + R.",
shortcutPrint: "Print Button: Opens the print preview of the form. Keyboard shortcut: Ctrl + P.",
additionalFunctionsTitle: "Additional Functions",
autoResetTitle: "Auto-Reset",
autoResetOn: "On: Form is automatically reset after submission.",
autoResetOff: "Off: Entries are retained.",
autoInputTitle: "Auto Input",
autoInputOn: "On: Product data is automatically filled in if available.",
autoInputOff: "Off: Manual entry is required.",
faultyTitle: "Faulty",
faultyDescription: "Activate this switch to mark a product as faulty.",
screenModesTitle: "Screen Modes",
portraitMode: "Portrait Mode: Vertical layout, suitable for mobile devices.",
landscapeMode: "Landscape Mode: Wider view with info box next to input fields.",
layoutNote: "Note: The layout adjusts automatically to the screen size."
},
PL: {
tooltipButton: "Pokaż instrukcję",
guideTitle: "Instrukcja obsługi formularza",
guideIntro: "Ten formularz służy do wprowadzania i zarządzania danymi produktów, takimi jak SKU, opis, kolor i rozmiar. Postępuj zgodnie z instrukcjami, aby poprawnie wprowadzić dane.",
formFieldsTitle: "Pola formularza",
languageSelection: "Język: Wybierz niemiecki (DE), angielski (EN) lub polski (PL). Język wpływa na wszystkie etykiety.",
labelSku: "SKU",
labelDescription: "Opis",
labelColor: "Kolor",
labelSize: "Rozmiar",
fieldSku: "SKU: Wprowadź numer produktu.",
fieldDescription: "Opis: Wprowadź krótki opis produktu.",
fieldColorSize: "Kolor i Rozmiar: Wprowadź kolor i rozmiar produktu w odpowiednich polach.",
buttonsShortcutsTitle: "Przyciski i skróty klawiszowe",
shortcutSubmit: "Przycisk Zatwierdź: zapisuje wprowadzone dane, jeśli wszystkie wymagane pola są wypełnione. Skrót klawiszowy: Enter.",
shortcutReset: "Przycisk Resetuj: Czyści wszystkie wpisy i resetuje formularz. Skrót klawiszowy: Alt + R.",
shortcutPrint: "Przycisk Drukuj: Otwiera podgląd wydruku formularza. Skrót klawiszowy: Ctrl + P.",
additionalFunctionsTitle: "Dodatkowe funkcje",
autoResetTitle: "Autoreset",
autoResetOn: "Włączony: Formularz jest automatycznie resetowany po zatwierdzeniu.",
autoResetOff: "Wyłączony: Wpisane dane zostają zachowane.",
autoInputTitle: "Automatyczne wypełnianie",
autoInputOn: "Włączone: Dane produktu są automatycznie wypełniane, jeśli są dostępne.",
autoInputOff: "Wyłączone: Wymagane jest ręczne wprowadzenie danych.",
faultyTitle: "Wadliwe",
faultyDescription: "Włącz ten przełącznik, aby oznaczyć produkt jako wadliwy.",
screenModesTitle: "Tryby ekranu",
portraitMode: "Tryb portretowy: Układ pionowy, odpowiedni dla urządzeń mobilnych.",
landscapeMode: "Tryb poziomy: Szerszy widok z polem informacji obok pól wprowadzania.",
layoutNote: "Uwaga: Układ dostosowuje się automatycznie do rozmiaru ekranu."
}
} as const
// Functions
const t = computed(() => (key: keyof TranslationContent) => {
return translations[currentLang.value][key]
})
function toggleTooltip() {
showTooltip.value = !showTooltip.value
}
function setLanguage(lang: Language) {
currentLang.value = lang
}
</script>
<template>
<div class="myli-container">
<!-- Language Selection -->
<div class="language-buttons">
<button
v-for="lang in ['DE', 'EN', 'PL']"
:key="lang"
@click="setLanguage(lang as Language)"
:class="{ active: currentLang === lang }"
class="language-button"
>
<span :class="`flag-icon flag-icon-${lang.toLowerCase()}`"></span>
</button>
</div>
<!-- Form Fields -->
<form class="input-form mb-4">
<div class="form-group">
<label for="sku">{{ t('labelSku') }}:</label>
<input
type="text"
id="sku"
v-model="sku"
class="form-input"
required
/>
</div>
<div class="form-group">
<label for="description">{{ t('labelDescription') }}:</label>
<input
type="text"
id="description"
v-model="description"
class="form-input"
required
/>
</div>
<div class="form-row">
<div class="form-group">
<label for="color">{{ t('labelColor') }}:</label>
<input
type="text"
id="color"
v-model="color"
class="form-input"
/>
</div>
<div class="form-group">
<label for="size">{{ t('labelSize') }}:</label>
<input
type="text"
id="size"
v-model="size"
class="form-input"
/>
</div>
</div>
</form>
<!-- Tooltip Container -->
<div data-lang="tooltip-container" class="tooltip-container">
<button
data-lang="tooltipButton"
class="tooltip-button"
@click="toggleTooltip"
aria-describedby="tooltip-content"
>
{{ t('tooltipButton') }}
</button>
<div
v-if="showTooltip"
data-lang="tooltipContent"
class="tooltip"
role="tooltip"
id="tooltip-content"
>
<h2 class="text-xl font-bold mb-4">Benutzeranleitung für das Formular</h2>
<p class="mb-4">
Dieses Formular dient zur Eingabe und Verwaltung von Produktdaten wie SKU, Beschreibung, Farbe und Größe. Folgen Sie den Anweisungen, um Daten korrekt zu erfassen.
</p>
<h3 class="text-lg font-bold mb-2">Formularfelder</h3>
<p class="mb-2">
Sprache: Wählen Sie Deutsch (DE), Englisch (EN) oder Polnisch (PL). Die Sprache beeinflusst alle Beschriftungen.
</p>
<ul class="mb-4 list-disc pl-4">
<li><strong>SKU:</strong> Geben Sie die Produktnummer ein.</li>
<li><strong>Beschreibung:</strong> Erfassen Sie eine kurze Produktbeschreibung.</li>
<li><strong>Farbe & Größe:</strong> Tragen Sie Farbe und Größe des Produkts in die entsprechenden Felder ein.</li>
</ul>
<h3 class="text-lg font-bold mb-2">Schaltflächen und Tastenkombinationen</h3>
<ul class="mb-4 list-disc pl-4">
<li>
<strong>Submit-Button: </strong>speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination<em>: <strong>Enter</strong></em><strong>.</strong>
</li>
<li>
<strong>Reset-Button:</strong> Löscht alle Eingaben und setzt das Formular zurück. Tastenkombination<em>: <strong>Alt</strong></em><strong>+ R.</strong>
</li>
<li>
<strong>Print Button:</strong> Öffnet die Druckvorschau des Formulars. Tastenkombination<em>: <strong>Ctrl</strong></em><strong>+ P.</strong>
</li>
</ul>
<h3 class="text-lg font-bold mb-2">Zusatzfunktionen</h3>
<p class="mb-2"><strong>Auto-Reset:</strong></p>
<ul class="mb-4 list-disc pl-4">
<li><strong>Ein:</strong> Formular wird nach Absenden automatisch zurückgesetzt.</li>
<li><strong>Aus:</strong> Eingaben bleiben erhalten.</li>
</ul>
<p class="mb-2"><strong>Auto Eingabe:</strong></p>
<ul class="mb-4 list-disc pl-4">
<li><strong>Ein:</strong> Produktdaten werden automatisch befüllt, wenn verfügbar.</li>
<li><strong>Aus:</strong> Manuelle Eingabe erforderlich.</li>
</ul>
<p class="mb-2"><strong>Faulty:</strong></p>
<ul class="mb-4 list-disc pl-4">
<li>Aktivieren Sie diesen Schalter, um ein Produkt als fehlerhaft zu kennzeichnen.</li>
</ul>
<h3 class="text-lg font-bold mb-2">Bildschirmmodi</h3>
<ul class="mb-4 list-disc pl-4">
<li><strong>Hochformat:</strong> Vertikale Anordnung, geeignet für mobile Geräte.</li>
<li><strong>Querformat:</strong> Breitere Ansicht mit Info-Feld neben den Eingabefeldern.</li>
</ul>
<p class="mt-2">Hinweis: Das Layout passt sich automatisch an die Bildschirmgröße an.</p>
</div>
</div>
<!-- Buttons -->
<div class="button-group mb-4">
<button type="submit" class="btn">Submit</button>
<button type="reset" class="btn">Reset</button>
<button type="button" class="btn">Print</button>
</div>
<!-- Switches -->
<div class="schalter-container">
<div class="schalter-wrapper">
<label>{{ t('autoResetTitle') }}</label>
<input type="checkbox" v-model="autoResetEnabled" />
</div>
<div class="schalter-wrapper">
<label>{{ t('faultyTitle') }}</label>
<input type="checkbox" v-model="faultyEnabled" />
</div>
<div class="schalter-wrapper">
<label>{{ t('autoInputTitle') }}</label>
<input type="checkbox" v-model="autoDisplayEnabled" />
</div>
</div>
</div>
</template>
<style scoped>
.myli-container {
@apply p-4;
}
.language-buttons {
@apply flex gap-2 mb-4;
}
.language-button {
@apply px-3 py-2 rounded-lg border;
}
.language-button.active {
@apply bg-blue-500 text-white;
}
.input-form {
@apply space-y-4;
}
.form-group {
@apply flex flex-col gap-1;
}
.form-row {
@apply grid grid-cols-2 gap-4;
}
.form-input {
@apply px-3 py-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-blue-500;
}
.tooltip-button {
@apply px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors;
}
.tooltip {
@apply absolute z-50 left-0 top-full mt-2 p-4 bg-white border rounded-lg shadow-lg;
@apply w-96 max-h-[80vh] overflow-y-auto;
}
.button-group {
@apply flex gap-2;
}
.btn {
@apply px-4 py-2 bg-gray-200 rounded hover:bg-gray-300 transition-colors;
}
.schalter-container {
@apply space-y-2;
}
.schalter-wrapper {
@apply flex items-center justify-between p-2 bg-gray-100 rounded;
}
@media (max-width: 640px) {
.tooltip {
@apply w-full left-0 right-0;
}
.form-row {
@apply grid-cols-1;
}
}
</style>
Beurteilen - nach welchen Kriterien? Ich weiß zu wenig über das Gesamtprojekt. Der erste Punkt ist - funktioniert alles wie gewünscht, das ist fast das Wichtigste. Der nächste Punkt wäre: verstehst du alles was da so umgesetzt ist? Das ist wichtig, 1. wenn es ein Lernprojekt ist, 2. wenn du es später erweitern oder verändern willst. Dann wäre da noch - ist das Projekt so wartbar genug um es auch in 6 Monaten oder später noch anzupassen?Wie beurteilen sie die Drei dateien.
Beurteilen - nach welchen Kriterien? Ich weiß zu wenig über das Gesamtprojekt. Der erste Punkt ist - funktioniert alles wie gewünscht, das ist fast das Wichtigste. Der nächste Punkt wäre: verstehst du alles was da so umgesetzt ist? Das ist wichtig, 1. wenn es ein Lernprojekt ist, 2. wenn du es später erweitern oder verändern willst. Dann wäre da noch - ist das Projekt so wartbar genug um es auch in 6 Monaten oder später noch anzupassen?
Natürlich gibt es noch Potential für Verbesserungen. Das wirst du selbst erkennen, wenn du mehr Erfahrung sammelst. Insgesamt denke ich aber, du hast dich da sehr gut in das Thema eingearbeitet, warst auch bereit dazu.
Wenn es ein Projekt ist um Geld zu verdienen, dann solltest du insgesamt so wenig Aufwand wie möglich da rein stecken. Wenn es nicht gerade für den öffentlichen Dienst ist, dann wirst du nicht viel verändern. Wenn der Kunde seine Online-Präsenz umstellt, dann schreibt man idR. sowieso alles neu - in einer moderneren Technologie und wenn möglich mit noch weniger Aufwand.
Wenn es ein Projekt für die Ausbildung ist, dann fehlt noch die gesamte Dokumentation und evtl. Tests.
Wenn es nur ein Projekt für dein Hobby ist, dann würde ich das Versionieren und weiter ausbauen/verbessern oder zu Lernzwecken optimieren.
Falls du erwartest, dass ich die Dateien Zeile für Zeile auseinander nehme und analysiere - dann würdest du mich vermutlich hassen und auf Ignore setzen. Schwere Fehler konnte ich jetzt nicht mehr erkennen - ohne Garantie. Insgesamt bringt so eine Beurteilung aber nichts. Code/Software ist in Ordnung, wenn die Anforderungen erfüllt werden, nicht mehr und nicht weniger. Deine Aufgabe wäre also, deine Anforderungsdokumentation zu nehmen und Punkt für Punkt durchzugehen (und zu ergänzen) - auch wenn du den Code liest und das Projekt testest. Dabei sollte man auch überlegen, was nicht in der Anforderungsdokumentation steht aber trotzdem notwendig ist. Was man nicht benötigt, sollte man auch nicht umsetze
<template>
<div class="form-container">
<!-- Sprachwahl mit Buttons -->
<div class="language-container">
<button class="language-button" @click="changeLanguage('DE')">
<span class="flag-icon flag-icon-de"></span> <!-- Deutschland -->
</button>
<button class="language-button" @click="changeLanguage('EN')">
<span class="flag-icon flag-icon-gb"></span> <!-- Großbritannien -->
</button>
<button class="language-button" @click="changeLanguage('PL')">
<span class="flag-icon flag-icon-pl"></span> <!-- Polen -->
</button>
</div>
<!-- Tooltip für Anleitung -->
<div class="tooltip-container">
<button class="tooltip-button" @click="toggleTooltip" aria-describedby="tooltip-content">
{{ translations.tooltipButton || 'Anleitung anzeigen' }}
</button>
<div class="tooltip-content" v-if="showTooltip" id="tooltip-content" role="tooltip">
<h2>{{ translations.guideTitle }}</h2>
<p>{{ translations.guideIntro }}</p>
<h3>{{ translations.formFieldsTitle }}</h3>
<p>{{ translations.languageSelection }}</p>
<ul>
<li v-html="translations.fieldSku"></li>
<li v-html="translations.fieldDescription"></li>
<li v-html="translations.fieldColorSize"></li>
</ul>
<h3>{{ translations.buttonsShortcutsTitle }}</h3>
<ul>
<li v-html="translations.shortcutSubmit.replace('Enter', '<strong>Enter</strong>')"></li>
<li v-html="translations.shortcutReset.replace('Alt+R', '<strong>Alt+R</strong>')"></li>
<li v-html="translations.shortcutPrint.replace('Ctrl+P', '<strong>Ctrl+P</strong>')"></li>
</ul>
<h3>{{ translations.additionalFunctionsTitle }}</h3>
<ul>
<li v-html="translations.autoReset"></li>
<li v-html="translations.autoResetOn"></li>
<li v-html="translations.autoResetOff"></li>
<li v-html="translations.autoInput"></li>
<li v-html="translations.autoInputOn"></li>
<li v-html="translations.autoInputOff"></li>
<li v-html="translations.faulty"></li>
<li v-html="translations.faultyActivate"></li>
</ul>
<h3>{{ translations.screenModesTitle }}</h3>
<ul>
<li v-html="translations.portraitMode"></li>
<li v-html="translations.landscapeMode"></li>
</ul>
<p v-html="translations.layoutNote"></p>
</div>
</div>
<!-- Info-Box für den Druckbereich -->
<div class="info-box info-box-print" id="infoBox">
<div class="info-content">
<span class="sku" style="display: block; font-size: 1.2em; font-weight: bold;">{{ form.sku }}</span>
<svg class="barcode" ref="barcode"></svg>
<div class="additional-info">
<span class="size-color">{{ form.color }} / {{ form.size }}</span>
<div class="description">{{ form.description }}</div>
</div>
</div>
</div>
<!-- Formular -->
<form @submit.prevent="submitForm" class="form-grid">
<label for="sku">SKU:</label>
<input type="search" v-model="form.sku" required />
<label for="description">Beschreibung:</label>
<input type="search" v-model="form.description" required />
<div class="color-size-container">
<div>
<label for="color">Farbe:</label>
<input type="search" v-model="form.color" />
</div>
<div>
<label for="size">Größe:</label>
<input type="search" v-model="form.size" />
</div>
</div>
<div class="button-grid">
<button type="submit">{{ translations.submit }}</button>
<button type="reset" @click="resetForm">{{ translations.reset }}</button>
<button type="button" @click="printPage">{{ translations.print }}</button>
</div>
</form>
<!-- Schalter -->
<div class="schalter-container">
<div class="schalter-wrapper">
<label>
{{ translations.autoReset }}
<input type="checkbox" v-model="autoReset" />
</label>
</div>
<div class="schalter-wrapper">
<label>
{{ translations.faultySwitch }}
<input type="checkbox" v-model="isFaulty" @change="toggleFaultLabel" />
</label>
</div>
<div class="schalter-wrapper">
<label>
{{ translations.autoDisplay }}
<input type="checkbox" v-model="autoInput" @change="toggleAutoDisplay" />
</label>
</div>
</div>
<!-- Logo -->
<div class="logo-container">
<img class="logo" :src="logoUrl" alt="CEVA Logo" width="200" />
</div>
</div>
</template>
<script>
export default {
data() {
return {
form: {
sku: "",
description: "",
color: "",
size: "",
},
isFaulty: false,
autoReset: false,
autoInput: false,
showTooltip: false,
translations: {},
selectedLanguage: "DE",
translationsData: {
DE: {
description: "Beschreibung",
color: "Farbe",
size: "Größe",
submit: "Absenden",
reset: "Zurücksetzen",
print: "Drucken",
autoReset: "Auto-Reset",
faultySwitch: "Faulty Label",
autoDisplay: "Auto Display",
tooltipButton: "Anleitung anzeigen",
guideTitle: "Benutzeranleitung für das Formular",
guideIntro: "Dieses Formular dient zur Eingabe und Verwaltung von Produktdaten wie SKU, Beschreibung, Farbe und Größe. Folgen Sie den Anweisungen, um Daten korrekt zu erfassen.",
formFieldsTitle: "Formularfelder",
languageSelection: "Sprache: Wählen Sie Deutsch (DE), Englisch (EN) oder Polnisch (PL). Die Sprache beeinflusst alle Beschriftungen.",
fieldSku: "<strong>SKU:</strong> Geben Sie die Produktnummer ein.",
fieldDescription: "<strong>Beschreibung:</strong> Erfassen Sie eine kurze Produktbeschreibung.",
fieldColorSize: "<strong>Farbe & Größe:</strong> Tragen Sie Farbe und Größe des Produkts in die entsprechenden Felder ein.",
buttonsShortcutsTitle: "Schaltflächen und Tastenkombinationen",
shortcutSubmit: "<b>Submit-Button:</b> speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination: <em>Enter</em>",
shortcutReset: "<b>Reset-Button:</b> Löscht alle Eingaben und setzt das Formular zurück. Tastenkombination: <em>Alt+R</em>",
shortcutPrint: "<b>Print-Button:</b> Öffnet die Druckvorschau des Formulars. Tastenkombination: <em>Ctrl+P</em>",
additionalFunctionsTitle: "Zusatzfunktionen",
autoReset: "<b>Auto-Reset:</b>",
autoResetOn: "<b>Ein:</b> Formular wird nach Absenden automatisch zurückgesetzt.",
autoResetOff: "<b>Aus:</b> Eingaben bleiben erhalten.",
autoInput: "<b>Auto Eingabe:</b>",
autoInputOn: "<b>Ein:</b> Produktdaten werden automatisch befüllt, wenn verfügbar.",
autoInputOff: "<b>Aus:</b> Manuelle Eingabe erforderlich.",
faulty: "<b>Faulty:</b>",
faultyActivate: "Aktivieren Sie diesen Schalter, um ein Produkt als fehlerhaft zu kennzeichnen.",
screenModesTitle: "Bildschirmmodi",
portraitMode: "<b>Hochformat:</b> Vertikale Anordnung, geeignet für mobile Geräte.",
landscapeMode: "<b>Querformat:</b> Breitere Ansicht mit Info-Feld neben den Eingabefeldern.",
layoutNote: "Hinweis: Das Layout passt sich automatisch an die Bildschirmgröße an.",
},
EN: {
description: "Description",
color: "Color",
size: "Size",
submit: "Submit",
reset: "Reset",
print: "Print",
autoReset: "Auto-Reset",
faultySwitch: "Faulty Label",
autoDisplay: "Auto Display",
tooltipButton: "Show Instructions",
guideTitle: "User Guide for the Form",
guideIntro: "This form is used to enter and manage product data such as SKU, description, color, and size. Follow the instructions to ensure accurate data entry.",
formFieldsTitle: "Form Fields",
languageSelection: "Language: Choose German (DE), English (EN), or Polish (PL). The language affects all labels.",
fieldSku: "<strong>SKU:</strong> Enter the product number.",
fieldDescription: "<strong>Description:</strong> Provide a short product description.",
fieldColorSize: "<strong>Color & Size:</strong> Enter the product's color and size in the appropriate fields.",
buttonsShortcutsTitle: "Buttons and Keyboard Shortcuts",
shortcutSubmit: "<b>Submit-Button:</b> Saves the entered data when all required fields are filled. Shortcut: <em>Enter</em>",
shortcutReset: "<b>Reset-Button:</b> Clears all inputs and resets the form. Shortcut: <em>Alt+R</em>",
shortcutPrint: "<b>Print-Button:</b> Opens the print preview of the form. Shortcut: <em>Ctrl+P</em>",
additionalFunctionsTitle: "Additional Functions",
autoReset: "<b>Auto-Reset:</b>",
autoResetOn: "<b>On:</b> The form will automatically reset after submission.",
autoResetOff: "<b>Off:</b> Inputs remain saved.",
autoInput: "<b>Auto Input:</b>",
autoInputOn: "<b>On:</b> Product data is automatically filled if available.",
autoInputOff: "<b>Off:</b> Manual input is required.",
faulty: "<b>Faulty:</b>",
faultyActivate: "Activate this switch to mark a product as faulty.",
screenModesTitle: "Screen Modes",
portraitMode: "<b>Portrait Mode:</b> Vertical arrangement, suitable for mobile devices.",
landscapeMode: "<b>Landscape Mode:</b> Wider view with info box next to input fields.",
layoutNote: "Note: The layout automatically adjusts to the screen size.",
},
PL: {
description: "Opis",
color: "Kolor",
size: "Rozmiar",
submit: "Zatwierdź",
reset: "Resetuj",
print: "Drukuj",
autoReset: "Autoreset",
faultySwitch: "Uszkodzony Etykieta",
autoDisplay: "Automatyczne wyświetlanie",
tooltipButton: "Pokaż instrukcje",
guideTitle: "Instrukcja obsługi formularza",
guideIntro: "Ten formularz służy do wprowadzania i zarządzania danymi produktów, takimi jak SKU, opis, kolor i rozmiar. Postępuj zgodnie z instrukcjami, aby poprawnie wprowadzić dane.",
formFieldsTitle: "Pola formularza",
languageSelection: "Język: Wybierz niemiecki (DE), angielski (EN) lub polski (PL). Język wpływa na wszystkie etykiety.",
fieldSku: "<strong>SKU:</strong> Wprowadź numer produktu.",
fieldDescription: "<strong>Opis:</strong> Podaj krótki opis produktu.",
fieldColorSize: "<strong>Kolor i Rozmiar:</strong> Wprowadź kolor i rozmiar produktu w odpowiednich polach.",
buttonsShortcutsTitle: "Przyciski i skróty klawiszowe",
shortcutSubmit: "<b>Zatwierdź:</b> Zapisuje wprowadzone dane, jeśli wszystkie wymagane pola są wypełnione. Skrót: <em>Enter</em>",
shortcutReset: "<b>Resetuj:</b> Czyści wszystkie wpisy i resetuje formularz. Skrót: <em>Alt+R</em>",
shortcutPrint: "<b>Drukuj:</b> Otwiera podgląd wydruku formularza. Skrót: <em>Ctrl+P</em>",
additionalFunctionsTitle: "Dodatkowe funkcje",
autoReset: "<b>Automatyczny reset:</b>",
autoResetOn: "<b>Włączony:</b> Formularz automatycznie resetuje się po przesłaniu.",
autoResetOff: "<b>Wyłączony:</b> Dane zostają zapisane.",
autoInput: "<b>Automatyczne wprowadzanie:</b>",
autoInputOn: "<b>Włączone:</b> Dane produktów są automatycznie uzupełniane, jeśli są dostępne.",
autoInputOff: "<b>Wyłączone:</b> Wymagane jest ręczne wprowadzenie danych.",
faulty: "<b>Uszkodzony:</b>",
faultyActivate: "Aktywuj ten przełącznik, aby oznaczyć produkt jako uszkodzony.",
screenModesTitle: "Tryby ekranu",
portraitMode: "<b>Tryb portretowy:</b> Układ pionowy, odpowiedni dla urządzeń mobilnych.",
landscapeMode: "<b>Tryb poziomy:</b> Szeroki widok z polem informacyjnym obok pól wprowadzania.",
layoutNote: "Uwaga: Układ automatycznie dostosowuje się do rozmiaru ekranu.",
},
},
logoUrl: "https://www.shipwire.com/wp-content/uploads/2022/03/CEVA_Logo_White.png",
};
},
computed: {
sizeColor() {
return `${this.form.color} / ${this.form.size}`;
},
},
methods: {
changeLanguage(lang) {
this.selectedLanguage = lang;
this.translations = this.translationsData[lang];
},
toggleFaultLabel() {
this.isFaulty = !this.isFaulty;
},
toggleAutoDisplay() {
console.log("Auto Display toggled.");
},
toggleTooltip() {
this.showTooltip = !this.showTooltip;
},
submitForm() {
console.log("Formular abgesendet:", this.form);
if (this.autoReset) {
this.resetForm();
}
},
resetForm() {
this.form = {
sku: "",
description: "",
color: "",
size: "",
};
},
printPage() {
window.print();
},
generateBarcode() {
if (this.form.sku) {
JsBarcode(this.$refs.barcode, this.form.sku, {
format: "CODE128",
lineColor: "#000",
width: 2,
height: 50,
displayValue: false,
});
}
},
},
mounted() {
const script = document.createElement("script");
script.src = "https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js";
script.onload = this.generateBarcode;
document.head.appendChild(script);
this.changeLanguage(this.selectedLanguage);
},
updated() {
this.generateBarcode();
},
};
</script>
translationsData: {
DE: {
...
shortcutSubmit: "<b>Submit-Button:</b> speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination: <em>Enter</em>",
...
},
...
}
translationsData: {
DE: {
...
shortcutSubmit: [
"Submit-Button:",
"speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination:",
"Enter"
],
...
},
...
}
translationsData: {
DE: {
...
shortcutSubmit: [
{ label: "Submit-Button:", class: "text-bold" },
{ label: "speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination:" },
{ label: "Enter", class: "text-bold text-strong" },
],
...
},
...
}
Ich weiß nicht, wie ich es erklären soll. Bin nicht gerade ein guter Erklärbär mit V-HTML. Hatte alles funktioniert, mit der Sprachumschaltung, sowohl im Tooltip als auch im Formular so wie der Text layut . Das Problem war immer, dass mein Tooltip den Text, bestimmte Wörter und Bereiche fett geschrieben sind, hervorhebt. Leider, wenn ich andere Formen, ich sage mal Schreibweisen, anwende, dann gehen die Texteigenschaften verloren. Was auch Auswirkungen auf die Übersetzungsfunktion im Tooltip und im Formular hattteDu musst mehr Details nennen. Was genau ist denn das Problem?
statt:
<li v-html="translations.shortcutSubmit.replace('Enter', '<strong>Enter</strong>')"></li>
einfach:
<my-li strong-label="Enter" :label="translations.shortcutSubmit" />
Du kannst das natürlich noch weiter individualisieren:
Javascript:translationsData: { DE: { ... shortcutSubmit: "<b>Submit-Button:</b> speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination: <em>Enter</em>", ... }, ... }
Möglicherweise ist es aber nicht mit dem Array getan, da hier die Eigenschaften am Index hängen. Man könnte jedem Element des Arrays seine eigenen Eigenschaften mitgeben, bspw. eine/mehrere Klasse/n:Javascript:translationsData: { DE: { ... shortcutSubmit: [ "Submit-Button:", "speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination:", "Enter" ], ... }, ... }
Jetzt müsste dann <my-li ... /> so abgeändert werden, dass eine prop mit dem Array umgehen kann. Oder du baust einfach eine neue Component die das kann. Die einfachste Variante wäre evtl. für jedes Element im Array ein <span> anzulegen, den Text aus label da reinzuschreiben und die class zu übergeben, wenn sie vorhanden ist.Javascript:translationsData: { DE: { ... shortcutSubmit: [ { label: "Submit-Button:", class: "text-bold" }, { label: "speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind. Tastenkombination:" }, { label: "Enter", class: "text-bold text-strong" }, ], ... }, ... }
Playground
<!-- Tooltip für Anleitung -->
<div class="tooltip-container">
<button class="tooltip-button" @click="toggleTooltip" aria-describedby="tooltip-content">
{{ translations.tooltipButton || 'Anleitung anzeigen' }}
</button>
<div class="tooltip-content" v-if="showTooltip" id="tooltip-content" role="tooltip">
<h2>{{ translations.guideTitle }}</h2>
<p>{{ translations.guideIntro }}</p>
<h3>{{ translations.formFieldsTitle }}</h3>
<p>{{ translations.languageSelection }}</p>
<ul>
<li><span class="tooltip-bold">SKU:</span> {{ translations.fieldSkuText }}</li>
<li><span class="tooltip-bold">{{ translations.description }}:</span> {{ translations.fieldDescriptionText }}</li>
<li><span class="tooltip-bold">{{ translations.colorSize }}:</span> {{ translations.fieldColorSizeText }}</li>
</ul>
<h3>{{ translations.buttonsShortcutsTitle }}</h3>
<ul>
<li>
<span class="tooltip-bold">Submit-Button:</span>
{{ translations.submitButtonText }}
<span class="keyboard-shortcut">Enter</span>
</li>
<li>
<span class="tooltip-bold">Reset-Button:</span>
{{ translations.resetButtonText }}
<span class="keyboard-shortcut">Alt+R</span>
</li>
<li>
<span class="tooltip-bold">Print-Button:</span>
{{ translations.printButtonText }}
<span class="keyboard-shortcut">Ctrl+P</span>
</li>
</ul>
<h3>{{ translations.additionalFunctionsTitle }}</h3>
<ul>
<li>
<span class="tooltip-bold">{{ translations.autoReset }}</span>
<div class="sub-item">{{ translations.autoResetOnText }}</div>
<div class="sub-item">{{ translations.autoResetOffText }}</div>
</li>
<li>
<span class="tooltip-bold">{{ translations.autoInput }}</span>
<div class="sub-item">{{ translations.autoInputOnText }}</div>
<div class="sub-item">{{ translations.autoInputOffText }}</div>
</li>
<li>
<span class="tooltip-bold">{{ translations.faulty }}</span>
<div>{{ translations.faultyActivateText }}</div>
</li>
</ul>
<h3>{{ translations.screenModesTitle }}</h3>
<ul>
<li>
<span class="tooltip-bold">{{ translations.portraitModeTitle }}</span>
{{ translations.portraitModeText }}
</li>
<li>
<span class="tooltip-bold">{{ translations.landscapeModeTitle }}</span>
{{ translations.landscapeModeText }}
</li>
</ul>
<p>{{ translations.layoutNote }}</p>
</div>
</div>
<!-- Info-Box für den Druckbereich -->
<div class="info-box info-box-print" id="infoBox">
<div class="info-content">
<span class="sku" style="display: block; font-size: 1.2em; font-weight: bold;">{{ form.sku }}</span>
<svg class="barcode" ref="barcode"></svg>
<div class="additional-info">
<span class="size-color">{{ form.color }} / {{ form.size }}</span>
<div class="description">{{ form.description }}</div>
</div>
</div>
</div>
<!-- Formular -->
<form @submit.prevent="submitForm" class="form-grid">
<label for="sku">SKU:</label>
<input type="search" v-model="form.sku" required />
<label for="description">{{ translations.description }}:</label>
<input type="search" v-model="form.description" required />
<div class="color-size-container">
<div>
<label for="color">{{ translations.color }}:</label>
<input type="search" v-model="form.color" />
</div>
<div>
<label for="size">{{ translations.size }}:</label>
<input type="search" v-model="form.size" />
</div>
</div>
<div class="button-grid">
<button type="submit">{{ translations.submit }}</button>
<button type="reset" @click="resetForm">{{ translations.reset }}</button>
<button type="button" @click="printPage">{{ translations.print }}</button>
</div>
</form>
<!-- Schalter -->
<div class="schalter-container">
<div class="schalter-wrapper">
<label>
{{ translations.autoReset }}
<input type="checkbox" v-model="autoReset" />
</label>
</div>
<div class="schalter-wrapper">
<label>
{{ translations.faultySwitch }}
<input type="checkbox" v-model="isFaulty" @change="toggleFaultLabel" />
</label>
</div>
<div class="schalter-wrapper">
<label>
{{ translations.autoDisplay }}
<input type="checkbox" v-model="autoInput" @change="toggleAutoDisplay" />
</label>
</div>
</div>
<!-- Logo -->
<div class="logo-container">
<img class="logo" :src="logoUrl" alt="CEVA Logo" width="200" />
</div>
</div>
</template>
<script>
export default {
data() {
return {
form: {
sku: "",
description: "",
color: "",
size: "",
},
isFaulty: false,
autoReset: false,
autoInput: false,
showTooltip: false,
translations: {},
selectedLanguage: "DE",
translationsData: {
DE: {
description: "Beschreibung",
color: "Farbe",
size: "Größe",
submit: "Absenden",
reset: "Zurücksetzen",
print: "Drucken",
autoReset: "Auto-Reset",
faultySwitch: "Faulty Label",
autoDisplay: "Auto Display",
tooltipButton: "Anleitung anzeigen",
guideTitle: "Benutzeranleitung für das Formular",
guideIntro: "Dieses Formular dient zur Eingabe und Verwaltung von Produktdaten wie SKU, Beschreibung, Farbe und Größe. Folgen Sie den Anweisungen, um Daten korrekt zu erfassen.",
formFieldsTitle: "Formularfelder",
languageSelection: "Sprache: Wählen Sie Deutsch (DE), Englisch (EN) oder Polnisch (PL). Die Sprache beeinflusst alle Beschriftungen.",
fieldSkuText: "Geben Sie die Produktnummer ein.",
fieldDescriptionText: "Erfassen Sie eine kurze Produktbeschreibung.",
fieldColorSizeText: "Tragen Sie Farbe und Größe des Produkts in die entsprechenden Felder ein.",
buttonsShortcutsTitle: "Schaltflächen und Tastenkombinationen",
submitButtonText: "speichert die eingegebenen Daten, wenn alle Pflichtfelder ausgefüllt sind.",
resetButtonText: "Löscht alle Eingaben und setzt das Formular zurück.",
printButtonText: "Öffnet die Druckvorschau des Formulars.",
additionalFunctionsTitle: "Zusatzfunktionen",
autoResetOnText: "Ein: Formular wird nach Absenden automatisch zurückgesetzt.",
autoResetOffText: "Aus: Eingaben bleiben erhalten.",
autoInputOnText: "Ein: Produktdaten werden automatisch befüllt, wenn verfügbar.",
autoInputOffText: "Aus: Manuelle Eingabe erforderlich.",
faultyActivateText: "Aktivieren Sie diesen Schalter, um ein Produkt als fehlerhaft zu kennzeichnen.",
portraitModeTitle: "Hochformat:",
portraitModeText: "Vertikale Anordnung, geeignet für mobile Geräte.",
landscapeModeTitle: "Querformat:",
landscapeModeText: "Breitere Ansicht mit Info-Feld neben den Eingabefeldern.",
layoutNote: "Hinweis: Das Layout passt sich automatisch an die Bildschirmgröße an.",
colorSize: "Farbe & Größe"
},
EN: {
description: "Description",
color: "Color",
size: "Size",
submit: "Submit",
reset: "Reset",
print: "Print",
autoReset: "Auto-Reset",
faultySwitch: "Faulty Label",
autoDisplay: "Auto Display",
tooltipButton: "Show Instructions",
guideTitle: "User Guide for the Form",
guideIntro: "This form is used to enter and manage product data such as SKU, description, color, and size. Follow the instructions to ensure accurate data entry.",
formFieldsTitle: "Form Fields",
languageSelection: "Language: Choose German (DE), English (EN), or Polish (PL). The language affects all labels.",
fieldSkuText: "Enter the product number.",
fieldDescriptionText: "Provide a short product description.",
fieldColorSizeText: "Enter the product's color and size in the appropriate fields.",
buttonsShortcutsTitle: "Buttons and Keyboard Shortcuts",
submitButtonText: "saves the entered data when all required fields are filled.",
resetButtonText: "Clears all inputs and resets the form.",
printButtonText: "Opens the print preview of the form.",
additionalFunctionsTitle: "Additional Functions",
autoResetOnText: "On: The form will automatically reset after submission.",
autoResetOffText: "Off: Inputs remain saved.",
autoInputOnText: "On: Product data is automatically filled if available.",
autoInputOffText: "Off: Manual input is required.",
faultyActivateText: "Activate this switch to mark a product as faulty.",
portraitModeTitle: "Portrait Mode:",
portraitModeText: "Vertical arrangement, suitable for mobile devices.",
landscapeModeTitle: "Landscape Mode:",
landscapeModeText: "Wider view with info box next to input fields.",
layoutNote: "Note: The layout automatically adjusts to the screen size.",
colorSize: "Color & Size"
},
PL: {
description: "Opis",
color: "Kolor",
size: "Rozmiar",
submit: "Zatwierdź",
reset: "Resetuj",
print: "Drukuj",
autoReset: "Autoreset",
faultySwitch: "Uszkodzony Etykieta",
autoDisplay: "Automatyczne wyświetlanie",
tooltipButton: "Pokaż instrukcje",
guideTitle: "Instrukcja obsługi formularza",
guideIntro: "Ten formularz służy do wprowadzania i zarządzania danymi produktów, takimi jak SKU, opis, kolor i rozmiar. Postępuj zgodnie z instrukcjami, aby poprawnie wprowadzić dane.",
formFieldsTitle: "Pola formularza",
languageSelection: "Język: Wybierz niemiecki (DE), angielski (EN) lub polski (PL). Język wpływa na wszystkie etykiety.",
fieldSkuText: "Wprowadź numer produktu.",
fieldDescriptionText: "Podaj krótki opis produktu.",
fieldColorSizeText: "Wprowadź kolor i rozmiar produktu w odpowiednich polach.",
buttonsShortcutsTitle: "Przyciski i skróty klawiszowe",
submitButtonText: "zapisuje wprowadzone dane, gdy wszystkie wymagane pola są wypełnione.",
resetButtonText: "Czyści wszystkie wpisy i resetuje formularz.",
printButtonText: "Otwiera podgląd wydruku formularza.",
additionalFunctionsTitle: "Dodatkowe funkcje",
autoResetOnText: "Włączony: Formularz automatycznie resetuje się po przesłaniu.",
autoResetOffText: "Wyłączony: Dane zostają zapisane.",
autoInputOnText: "Włączone: Dane produktów są automatycznie uzupełniane, jeśli są dostępne.",
autoInputOffText: "Wyłączone: Wymagane jest ręczne wprowadzenie danych.",
faultyActivateText: "Aktywuj ten przełącznik, aby oznaczyć produkt jako uszkodzony.",
portraitModeTitle: "Tryb portretowy:",
portraitModeText: "Układ pionowy, odpowiedni dla urządzeń mobilnych.",
landscapeModeTitle: "Tryb poziomy:",
landscapeModeText: "Szeroki widok z polem informacyjnym obok pól wprowadzania.",
layoutNote: "Uwaga: Układ automatycznie dostosowuje się do rozmiaru ekranu.",
colorSize: "Kolor i Rozmiar"
}
},
logoUrl: "https://www.shipwire.com/wp-content/uploads/2022/03/CEVA_Logo_White.png",
};
},
computed: {
sizeColor() {
return `${this.form.color} / ${this.form.size}`;
},
},
methods: {
changeLanguage(lang) {
this.selectedLanguage = lang;
this.translations = this.translationsData[lang];
},
toggleFaultLabel() {
this.isFaulty = !this.isFaulty;
},
toggleAutoDisplay() {
console.log("Auto Display toggled.");
},
toggleTooltip() {
this.showTooltip = !this.showTooltip;
},
submitForm() {
console.log("Formular abgesendet:", this.form);
if (this.autoReset) {
this.resetForm();
}
},
resetForm() {
this.form = {
sku: "",
description: "",
color: "",
size: "",
};
},
printPage() {
window.print();
},
generateBarcode() {
if (this.form.sku) {
JsBarcode(this.$refs.barcode, this.form.sku, {
format: "CODE128",
lineColor: "#000",
width: 2,
height: 50,
displayValue: false,
});
}
},
},
mounted() {
const script = document.createElement("script");
script.src = "https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js";
script.onload = this.generateBarcode;
document.head.appendChild(script);
this.changeLanguage(this.selectedLanguage);
},
updated() {
this.generateBarcode();
},
};
</script>
<style scoped>
.form-container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.tooltip-container {
position: relative;
margin-bottom: 20px;
}
.tooltip-button {
padding: 8px 16px;
background-color: #4a5568;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.tooltip-content {
position: absolute;
top: 100%;
left: 0;
z-index: 10;
width: 100%;
max-width: 600px;
padding: 20px;
background-color: white;
border: 1px solid #e2e8f0;
border-radius: 8px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
.tooltip-bold {
font-weight: bold;
}
.keyboard-shortcut {
font-weight: bold;
padding: 2px 6px;
background-color: #f1f1f1;
border-radius: 3px;
margin-left: 4px;
}
.sub-item {
margin-left: 20px;
margin-top: 4px;
}
.language-container {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
.language-button {
padding: 5px 10px;
cursor: pointer;
}
.info-box {
border: 1px solid #ddd;
padding: 20px;
margin-bottom: 20px;
text-align: center;
}
.form-grid {
display: grid;
gap: 15px;
}
.color-size-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 15px;
}
.button-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.schalter-container {
margin-top: 20px;
display: grid;
gap: 15px;
}
.onoffswitch {
position: relative;
width: 60px;
user-select: none;
}
</style>
Hast du das gesehen?
<!-- Tooltip für Anleitung -->
<div class="tooltip-container">
...
</div>
<!-- Info-Box für den Druckbereich -->
<div class="info-box info-box-print" id="infoBox">
...
</div>
<!-- Formular -->
<form @submit.prevent="submitForm" class="form-grid">
..
</form>
<!-- Schalter -->
<div class="schalter-container">
...
</div>
<!-- Logo -->
<div class="logo-container">
...
</div>
Die veraltetet Art/Schreibweise der Components ist mir nicht mehr so geläufig, das benutzt man nicht mehr so. Ich verstehe nicht was du da vor hast. Du importierst nur JS-Dateien keine Components. Bitte geh die Doku noch mal durch.so ich war mal fleisig
Vue Playground
Ich hoffe, das ist jetzt richtig so. https://playcode.io/2208495SFC ist ein definierendes Feature von Vue und ist der empfohlene Weg, um Vue-Komponenten zu erstellen ...
npm install
npm run dev
Dann wünsche ich allen eine gute Besserung. Und dass es Ihr Hund heute gut übersteht. Habe nur eine Lehrseite im Browser. Bin vom Umfang dieser Datei erstmal erschlagen und überfordert im ersten MomentDa bei uns alle krank sind und meistens schlafen, und der Hund ängstlich hinter dem Sofa liegt weil es ständig knallt, habe ich mal ein etwas umfangreicheres Beispiel gemacht. Einfach den Anhang (auf Viren scannen, nicht dass du auch eine Grippe bekommst) in einen leeren Ordner entpacken.
Beachte dann die README.md. Die Kurzfassung ist: VSCode/NodeJS wird vorausgesetzt - das ist ein übliches Setup für Webprojekte. Führe zum Start folgendes in dem Ordner aus:
Falls sich der Browser nicht automatisch öffnet, dann findest do die URL in der Konsole.Bash:npm install npm run dev
Danke!Dann wünsche ich allen eine gute Besserung. Und dass es Ihr Hund heute gut übersteht. Habe nur eine Lehrseite im Browser. Bin vom Umfang dieser Datei erstmal erschlagen und überfordert im ersten Moment
Im Menü: Neues TerminalIch kann zwar in Visual Studio Ihre Datei öffnen und sehe die Baumstruktur und den Inhalt, aber Ihre Datei ist so umfangreich, dass ich noch keinen Plan habe. Bin gerade dabei, herauszufinden, wie ich eine Konsolenansicht bekomme. Habe bisher immer nur Onlineplattformen wie https://playcode.io/vue genutzt. Wal ich damit besser klar kamm
so ich mache für heute Feierabend – bin ganz schön knülle heute.https://playcode.io/2208627Im Menü: Neues Terminal
npm Install muss aufgerufen werden, wenn das Terminal auf den Pfad des Projektes steht
sorry, wenn ich eine blöde Frage, aber wie kann ich am besten Java, HTML, CSS aus meinem alten Projeckt überführen? Da hier die wichtigsten Funktionen und das Layout enthalten sind. Mir ist natürlich klar, dass eine Copy-Pace nicht funktioniert oder sinnvoll ist.Schön, dass du das Projekt starten konntest. Die Aufgabe war die Übersetzung, deshalb habe ich das Styling vernachlässigt. Das sollte aber kein großes Problem sein. Alle HTML-Standard-Attribute (auch: class und style) können überall verwendet werden - auch bei eigenen Components. Bei diesen werden die Attribute entsprechend durchgereicht.
Globale CSS-Klassen können in .../src/assets/main.css definiert werden, dabei befindet sich das Farbschema in .../src/assets/base.css. Man kann sich das auch etwas vereinfachen und nur main.css verwenden. Es ist aber empfehlenswert CSS-Variablen beizubehalten, da dadurch Änderungen vereinfacht werden.
Generell ist CSS aber um einiges komplexer als JavaScript oder Vue.