diff --git a/.github/workflows/core-tests.yml b/.github/workflows/core-tests.yml index b9263bb7..01bc2764 100644 --- a/.github/workflows/core-tests.yml +++ b/.github/workflows/core-tests.yml @@ -1,4 +1,4 @@ -name: VisuStructCore tests +name: CI on: push: @@ -17,3 +17,17 @@ jobs: run: swift --version - name: Build and test run: swift test + + app-build: + runs-on: macos-15 + steps: + - uses: actions/checkout@v4 + - name: Xcode version + run: xcodebuild -version + - name: Build app for iOS Simulator + run: | + xcodebuild build \ + -project VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct.xcodeproj \ + -scheme VisuStruct \ + -destination 'generic/platform=iOS Simulator' \ + CODE_SIGNING_ALLOWED=NO diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ContentView.swift b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ContentView.swift index 09309a11..3e3f32b7 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ContentView.swift +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ContentView.swift @@ -771,7 +771,10 @@ struct ContentView: View { @ViewBuilder private var simulationDetailView: some View { GeometryReader { geo in - let useColumns = geo.size.width >= 760 + // Seitenspalte nur im Querformat; hochkant wäre sie gequetscht und unter dem Diagramm bliebe Platz frei. + let useColumns = geo.size.width >= 760 && geo.size.width > geo.size.height + // iPad hochkant: Diagramm oben, Steuerfeld darunter über die volle Breite. + let useWideStack = !useColumns && geo.size.width >= 600 && geo.size.height >= 700 let panelWidth = min(max(geo.size.width * 0.32, 280), 360) if useColumns { @@ -792,6 +795,24 @@ struct ContentView: View { .frame(width: panelWidth) .frame(maxHeight: .infinity, alignment: .top) } + } else if useWideStack { + VStack(alignment: .leading, spacing: 16) { + simulationCanvasBlock + .frame(height: geo.size.height * 0.5) + SimulationStatePanel( + engine: simulationEngine, + isPlaying: isSimulationPlaying, + inputText: $simulationInputText, + highlightModeRaw: $simulationHighlightModeRaw, + onPlay: playSimulation, + onPause: pauseSimulation, + onStep: stepSimulation, + onSubmitInput: submitSimulationInput, + onStop: resetSimulation, + usesWideLayout: true + ) + .frame(maxHeight: .infinity) + } } else { ScrollView { VStack(alignment: .leading, spacing: 16) { diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/Simulation/SimulationPanels.swift b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/Simulation/SimulationPanels.swift index af85e388..096fab36 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/Simulation/SimulationPanels.swift +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/Simulation/SimulationPanels.swift @@ -15,6 +15,8 @@ struct SimulationStatePanel: View { let onStep: () -> Void let onSubmitInput: () -> Void let onStop: () -> Void + /// Hochkant auf dem iPad: Steuerung links, Schritt/Variablen/Ausgabe rechts statt alles untereinander. + var usesWideLayout: Bool = false private var sortedVariables: [(String, VisuStructSimulationValue)] { engine.state.variables @@ -26,7 +28,9 @@ struct SimulationStatePanel: View { var body: some View { Group { - if isWaitingForInput { + if usesWideLayout { + wideStack + } else if isWaitingForInput { ScrollView { panelStack(flexibleCardsFillHeight: false) } @@ -50,125 +54,169 @@ struct SimulationStatePanel: View { @ViewBuilder private func panelStack(flexibleCardsFillHeight: Bool) -> some View { VStack(alignment: .leading, spacing: 16) { - VStack(alignment: .leading, spacing: 10) { - Label(lang.tr("simulation_controls"), systemImage: "slider.horizontal.3") - .font(.headline) + controlsSection + inputCard + traceCard(flexibleCardsFillHeight: flexibleCardsFillHeight) + variablesCard(flexibleCardsFillHeight: flexibleCardsFillHeight) + outputCard(flexibleCardsFillHeight: flexibleCardsFillHeight) + .layoutPriority(flexibleCardsFillHeight ? 1 : 0) + noticeText + } + } - LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 10) { - SimulationControlButton(title: lang.tr("simulation_play"), systemImage: "play.fill", isDisabled: isPlaying || !engine.canStep, action: onPlay) - SimulationControlButton(title: lang.tr("simulation_pause"), systemImage: "pause.fill", isDisabled: !isPlaying, action: onPause) - SimulationControlButton(title: lang.tr("simulation_step"), systemImage: "arrow.right.circle", isDisabled: isPlaying || !engine.canStep, action: onStep) - SimulationControlButton(title: lang.tr("simulation_stop"), systemImage: "stop.fill", isDisabled: false, action: onStop) + private var wideStack: some View { + HStack(alignment: .top, spacing: 16) { + ScrollView { + VStack(alignment: .leading, spacing: 16) { + controlsSection + inputCard + noticeText } + } + .scrollBounceBehavior(.basedOnSize) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) - VStack(alignment: .leading, spacing: 6) { - Text(lang.tr("simulation_highlight_label")) - .font(.caption) - .foregroundStyle(.secondary) - Picker(lang.tr("simulation_highlight_label"), selection: $highlightModeRaw) { - Text(lang.tr("simulation_highlight_last")).tag(SimulationHighlightMode.lastExecuted.rawValue) - Text(lang.tr("simulation_highlight_next")).tag(SimulationHighlightMode.nextToExecute.rawValue) - } - .pickerStyle(.segmented) + VStack(alignment: .leading, spacing: 16) { + traceCard(flexibleCardsFillHeight: false) + HStack(alignment: .top, spacing: 16) { + variablesCard(flexibleCardsFillHeight: true) + outputCard(flexibleCardsFillHeight: true) } + .frame(maxHeight: .infinity) } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + } + } - SimulationInputCard( - prompt: engine.state.inputRequest?.prompt, - variableName: engine.state.inputRequest?.variableName, - valueType: engine.state.inputRequest?.valueType, - inputError: engine.state.inputErrorNotice?.localized(in: lang), - inputText: $inputText, - onSubmit: onSubmitInput - ) + private var controlsSection: some View { + VStack(alignment: .leading, spacing: 10) { + Label(lang.tr("simulation_controls"), systemImage: "slider.horizontal.3") + .font(.headline) - SimulationPlaceholderCard( - title: lang.tr("simulation_trace"), - systemImage: "arrow.left.arrow.right", - minHeight: flexibleCardsFillHeight ? 130 : 88 - ) { - if let trace = engine.state.lastTrace { - Text(trace) - .font(.body.monospaced()) - .frame(maxWidth: .infinity, alignment: .leading) - .fixedSize(horizontal: false, vertical: true) - } else { - Text(lang.tr("simulation_trace_placeholder")) - .font(.body) - .foregroundStyle(.secondary) - .fixedSize(horizontal: false, vertical: true) - } + LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 10) { + SimulationControlButton(title: lang.tr("simulation_play"), systemImage: "play.fill", isDisabled: isPlaying || !engine.canStep, action: onPlay) + SimulationControlButton(title: lang.tr("simulation_pause"), systemImage: "pause.fill", isDisabled: !isPlaying, action: onPause) + SimulationControlButton(title: lang.tr("simulation_step"), systemImage: "arrow.right.circle", isDisabled: isPlaying || !engine.canStep, action: onStep) + SimulationControlButton(title: lang.tr("simulation_stop"), systemImage: "stop.fill", isDisabled: false, action: onStop) } - SimulationPlaceholderCard( - title: lang.tr("simulation_variables"), - systemImage: "curlybraces", - minHeight: flexibleCardsFillHeight ? 190 : 96, - contentFillsHeight: flexibleCardsFillHeight - ) { - if sortedVariables.isEmpty { - Text(lang.tr("simulation_variables_placeholder")) - .font(.body) - .foregroundStyle(.secondary) - .fixedSize(horizontal: false, vertical: true) - } else { - ScrollView { - VStack(alignment: .leading, spacing: 8) { - ForEach(sortedVariables, id: \.0) { name, value in - HStack(alignment: .firstTextBaseline) { - Text(name) - .font(.body.monospaced().weight(.semibold)) - Spacer(minLength: 12) - Text(value.description) - .font(.body.monospaced()) - .foregroundStyle(.secondary) - } - } - } - .padding(.trailing, 14) - .frame(maxWidth: .infinity, alignment: .leading) - } - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + VStack(alignment: .leading, spacing: 6) { + Text(lang.tr("simulation_highlight_label")) + .font(.caption) + .foregroundStyle(.secondary) + Picker(lang.tr("simulation_highlight_label"), selection: $highlightModeRaw) { + Text(lang.tr("simulation_highlight_last")).tag(SimulationHighlightMode.lastExecuted.rawValue) + Text(lang.tr("simulation_highlight_next")).tag(SimulationHighlightMode.nextToExecute.rawValue) } + .pickerStyle(.segmented) } + } + } - SimulationPlaceholderCard( - title: lang.tr("simulation_output"), - systemImage: "terminal", - minHeight: flexibleCardsFillHeight ? 170 : 96, - contentFillsHeight: flexibleCardsFillHeight - ) { - if engine.state.outputLines.isEmpty { - Text(lang.tr("simulation_output_placeholder")) - .font(.body) - .foregroundStyle(.secondary) - .fixedSize(horizontal: false, vertical: true) - } else { - ScrollView { - VStack(alignment: .leading, spacing: 6) { - ForEach(Array(engine.state.outputLines.enumerated()), id: \.offset) { _, line in - Text(line) + private var inputCard: some View { + SimulationInputCard( + prompt: engine.state.inputRequest?.prompt, + variableName: engine.state.inputRequest?.variableName, + valueType: engine.state.inputRequest?.valueType, + inputError: engine.state.inputErrorNotice?.localized(in: lang), + inputText: $inputText, + onSubmit: onSubmitInput + ) + } + + private func traceCard(flexibleCardsFillHeight: Bool) -> some View { + SimulationPlaceholderCard( + title: lang.tr("simulation_trace"), + systemImage: "arrow.left.arrow.right", + minHeight: flexibleCardsFillHeight ? 130 : 88 + ) { + if let trace = engine.state.lastTrace { + Text(trace) + .font(.body.monospaced()) + .frame(maxWidth: .infinity, alignment: .leading) + .fixedSize(horizontal: false, vertical: true) + } else { + Text(lang.tr("simulation_trace_placeholder")) + .font(.body) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } + } + } + + private func variablesCard(flexibleCardsFillHeight: Bool) -> some View { + SimulationPlaceholderCard( + title: lang.tr("simulation_variables"), + systemImage: "curlybraces", + minHeight: flexibleCardsFillHeight ? 190 : 96, + contentFillsHeight: flexibleCardsFillHeight + ) { + if sortedVariables.isEmpty { + Text(lang.tr("simulation_variables_placeholder")) + .font(.body) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } else { + ScrollView { + VStack(alignment: .leading, spacing: 8) { + ForEach(sortedVariables, id: \.0) { name, value in + HStack(alignment: .firstTextBaseline) { + Text(name) + .font(.body.monospaced().weight(.semibold)) + Spacer(minLength: 12) + Text(value.description) .font(.body.monospaced()) - .frame(maxWidth: .infinity, alignment: .leading) + .foregroundStyle(.secondary) } } - .padding(.trailing, 4) - .frame(maxWidth: .infinity, alignment: .leading) } - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + .padding(.trailing, 14) + .frame(maxWidth: .infinity, alignment: .leading) } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) } - .layoutPriority(flexibleCardsFillHeight ? 1 : 0) + } + } - if let message = engine.state.notice?.localized(in: lang) { - Text(message) - .font(.caption) + private func outputCard(flexibleCardsFillHeight: Bool) -> some View { + SimulationPlaceholderCard( + title: lang.tr("simulation_output"), + systemImage: "terminal", + minHeight: flexibleCardsFillHeight ? 170 : 96, + contentFillsHeight: flexibleCardsFillHeight + ) { + if engine.state.outputLines.isEmpty { + Text(lang.tr("simulation_output_placeholder")) + .font(.body) .foregroundStyle(.secondary) .fixedSize(horizontal: false, vertical: true) + } else { + ScrollView { + VStack(alignment: .leading, spacing: 6) { + ForEach(Array(engine.state.outputLines.enumerated()), id: \.offset) { _, line in + Text(line) + .font(.body.monospaced()) + .frame(maxWidth: .infinity, alignment: .leading) + } + } + .padding(.trailing, 4) + .frame(maxWidth: .infinity, alignment: .leading) + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) } } } + @ViewBuilder + private var noticeText: some View { + if let message = engine.state.notice?.localized(in: lang) { + Text(message) + .font(.caption) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } + } + } private struct SimulationInputCard: View { diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ar.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ar.lproj/Localizable.strings index 3fd96a74..947183e1 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ar.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ar.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "يرجى إدخال عدد صحيح."; "simulation_trace" = "آخر خطوة"; -"simulation_trace_placeholder" = "سيتم شرح آخر خطوة تم تنفيذها هنا."; +"simulation_trace_placeholder" = "لم يُنفَّذ أي خطوة بعد."; "simulation_variables" = "المتغيرات"; -"simulation_variables_placeholder" = "ستظهر قيم المتغيرات الحالية هنا لاحقًا."; +"simulation_variables_placeholder" = "لا توجد متغيرات بعد."; "simulation_output" = "المخرجات"; -"simulation_output_placeholder" = "ستظهر مخرجات المحاكاة هنا لاحقًا."; +"simulation_output_placeholder" = "لا يوجد إخراج بعد."; "action_delete_selection" = "حذف التحديد"; "ctx_copy" = "نسخ"; "ctx_cut" = "قص"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/da.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/da.lproj/Localizable.strings index 624c3c8c..45ceaa25 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/da.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/da.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Indtast et heltal."; "simulation_trace" = "Sidste trin"; -"simulation_trace_placeholder" = "Det senest udførte trin forklares her."; +"simulation_trace_placeholder" = "Intet trin udført endnu."; "simulation_variables" = "Variabler"; -"simulation_variables_placeholder" = "Aktuelle variabelværdier vises her senere."; +"simulation_variables_placeholder" = "Ingen variabler endnu."; "simulation_output" = "Output"; -"simulation_output_placeholder" = "Simulationens output vises her senere."; +"simulation_output_placeholder" = "Intet output endnu."; "action_delete_selection" = "Slet markering"; "ctx_copy" = "Kopiér"; "ctx_cut" = "Klip"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/de.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/de.lproj/Localizable.strings index ca485498..5aa7d433 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/de.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/de.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Bitte eine ganze Zahl eingeben."; "simulation_trace" = "Letzter Schritt"; -"simulation_trace_placeholder" = "Hier wird später der zuletzt ausgeführte Schritt erklärt."; +"simulation_trace_placeholder" = "Noch kein Schritt ausgeführt."; "simulation_variables" = "Variablen"; -"simulation_variables_placeholder" = "Hier werden später die aktuellen Variablenwerte angezeigt."; +"simulation_variables_placeholder" = "Noch keine Variablen."; "simulation_output" = "Ausgabe"; -"simulation_output_placeholder" = "Hier erscheint später die Ausgabe der Simulation."; +"simulation_output_placeholder" = "Noch keine Ausgabe."; "action_delete_selection" = "Auswahl löschen"; "ctx_copy" = "Kopieren"; "ctx_cut" = "Ausschneiden"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/el.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/el.lproj/Localizable.strings index 9c3d4e7d..a934b1e5 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/el.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/el.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Πληκτρολογήστε έναν ακέραιο αριθμό."; "simulation_trace" = "Τελευταίο βήμα"; -"simulation_trace_placeholder" = "Το τελευταίο εκτελεσμένο βήμα θα εξηγείται εδώ."; +"simulation_trace_placeholder" = "Δεν έχει εκτελεστεί ακόμη κανένα βήμα."; "simulation_variables" = "Μεταβλητές"; -"simulation_variables_placeholder" = "Οι τρέχουσες τιμές των μεταβλητών θα εμφανίζονται εδώ αργότερα."; +"simulation_variables_placeholder" = "Δεν υπάρχουν ακόμη μεταβλητές."; "simulation_output" = "Έξοδος"; -"simulation_output_placeholder" = "Η έξοδος της προσομοίωσης θα εμφανίζεται εδώ αργότερα."; +"simulation_output_placeholder" = "Δεν υπάρχει ακόμη έξοδος."; "action_delete_selection" = "Διαγραφή επιλογής"; "ctx_copy" = "Αντιγραφή"; "ctx_cut" = "Αποκοπή"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/en.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/en.lproj/Localizable.strings index 644397cd..3bfe1d99 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/en.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/en.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Please enter a whole number."; "simulation_trace" = "Last Step"; -"simulation_trace_placeholder" = "The last executed step will be explained here."; +"simulation_trace_placeholder" = "No step executed yet."; "simulation_variables" = "Variables"; -"simulation_variables_placeholder" = "Current variable values will be shown here later."; +"simulation_variables_placeholder" = "No variables yet."; "simulation_output" = "Output"; -"simulation_output_placeholder" = "The simulation output will appear here later."; +"simulation_output_placeholder" = "No output yet."; "action_delete_selection" = "Delete Selection"; "ctx_copy" = "Copy"; "ctx_cut" = "Cut"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/es.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/es.lproj/Localizable.strings index aaf7e993..6a571754 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/es.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/es.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Introduce un número entero."; "simulation_trace" = "Último paso"; -"simulation_trace_placeholder" = "Aquí se explicará el último paso ejecutado."; +"simulation_trace_placeholder" = "Aún no se ha ejecutado ningún paso."; "simulation_variables" = "Variables"; -"simulation_variables_placeholder" = "Aquí se mostrarán más adelante los valores actuales de las variables."; +"simulation_variables_placeholder" = "Aún no hay variables."; "simulation_output" = "Salida"; -"simulation_output_placeholder" = "Aquí aparecerá más adelante la salida de la simulación."; +"simulation_output_placeholder" = "Aún no hay salida."; "action_delete_selection" = "Eliminar selección"; "ctx_copy" = "Copiar"; "ctx_cut" = "Cortar"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/fr.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/fr.lproj/Localizable.strings index 30185789..e75ac72b 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/fr.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/fr.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Veuillez saisir un nombre entier."; "simulation_trace" = "Dernière étape"; -"simulation_trace_placeholder" = "La dernière étape exécutée sera expliquée ici."; +"simulation_trace_placeholder" = "Aucune étape exécutée pour l’instant."; "simulation_variables" = "Variables"; -"simulation_variables_placeholder" = "Les valeurs actuelles des variables seront affichées ici plus tard."; +"simulation_variables_placeholder" = "Aucune variable pour l’instant."; "simulation_output" = "Sortie"; -"simulation_output_placeholder" = "La sortie de la simulation apparaîtra ici plus tard."; +"simulation_output_placeholder" = "Aucune sortie pour l’instant."; "action_delete_selection" = "Supprimer la sélection"; "ctx_copy" = "Copier"; "ctx_cut" = "Couper"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/he.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/he.lproj/Localizable.strings index 3173507c..a572f20d 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/he.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/he.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "הזינו מספר שלם."; "simulation_trace" = "הצעד האחרון"; -"simulation_trace_placeholder" = "הצעד האחרון שבוצע יוסבר כאן."; +"simulation_trace_placeholder" = "עדיין לא בוצע אף צעד."; "simulation_variables" = "משתנים"; -"simulation_variables_placeholder" = "ערכי המשתנים הנוכחיים יוצגו כאן בהמשך."; +"simulation_variables_placeholder" = "עדיין אין משתנים."; "simulation_output" = "פלט"; -"simulation_output_placeholder" = "פלט הסימולציה יופיע כאן בהמשך."; +"simulation_output_placeholder" = "עדיין אין פלט."; "action_delete_selection" = "מחיקת בחירה"; "ctx_copy" = "העתק"; "ctx_cut" = "גזור"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/it.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/it.lproj/Localizable.strings index 4cf33c52..1038f1c0 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/it.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/it.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Inserisci un numero intero."; "simulation_trace" = "Ultimo passo"; -"simulation_trace_placeholder" = "Qui verrà spiegato l’ultimo passo eseguito."; +"simulation_trace_placeholder" = "Nessun passo ancora eseguito."; "simulation_variables" = "Variabili"; -"simulation_variables_placeholder" = "Qui verranno mostrati più avanti i valori attuali delle variabili."; +"simulation_variables_placeholder" = "Nessuna variabile per ora."; "simulation_output" = "Output"; -"simulation_output_placeholder" = "Qui apparirà più avanti l’output della simulazione."; +"simulation_output_placeholder" = "Nessun output per ora."; "action_delete_selection" = "Elimina selezione"; "ctx_copy" = "Copia"; "ctx_cut" = "Taglia"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ja.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ja.lproj/Localizable.strings index 33c070e7..410ae8ad 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ja.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ja.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "整数を入力してください。"; "simulation_trace" = "最後のステップ"; -"simulation_trace_placeholder" = "最後に実行されたステップがここに説明されます。"; +"simulation_trace_placeholder" = "まだステップは実行されていません。"; "simulation_variables" = "変数"; -"simulation_variables_placeholder" = "現在の変数値は後でここに表示されます。"; +"simulation_variables_placeholder" = "まだ変数はありません。"; "simulation_output" = "出力"; -"simulation_output_placeholder" = "シミュレーションの出力は後でここに表示されます。"; +"simulation_output_placeholder" = "まだ出力はありません。"; "action_delete_selection" = "選択を削除"; "ctx_copy" = "コピー"; "ctx_cut" = "切り取り"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ko.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ko.lproj/Localizable.strings index 0f5f89d5..bbb00f9c 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ko.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ko.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "정수를 입력하세요."; "simulation_trace" = "마지막 단계"; -"simulation_trace_placeholder" = "마지막으로 실행된 단계가 여기에 설명됩니다."; +"simulation_trace_placeholder" = "아직 실행된 단계가 없습니다."; "simulation_variables" = "변수"; -"simulation_variables_placeholder" = "현재 변수 값이 나중에 여기에 표시됩니다."; +"simulation_variables_placeholder" = "아직 변수가 없습니다."; "simulation_output" = "출력"; -"simulation_output_placeholder" = "시뮬레이션 출력이 나중에 여기에 표시됩니다."; +"simulation_output_placeholder" = "아직 출력이 없습니다."; "action_delete_selection" = "선택 삭제"; "ctx_copy" = "복사"; "ctx_cut" = "잘라내기"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nb.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nb.lproj/Localizable.strings index b3236574..3d7b785e 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nb.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nb.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Skriv inn et heltall."; "simulation_trace" = "Siste steg"; -"simulation_trace_placeholder" = "Det sist utførte steget forklares her."; +"simulation_trace_placeholder" = "Ingen trinn er utført ennå."; "simulation_variables" = "Variabler"; -"simulation_variables_placeholder" = "Gjeldende variabelverdier vises her senere."; +"simulation_variables_placeholder" = "Ingen variabler ennå."; "simulation_output" = "Utdata"; -"simulation_output_placeholder" = "Simuleringens utdata vises her senere."; +"simulation_output_placeholder" = "Ingen utdata ennå."; "action_delete_selection" = "Slett markering"; "ctx_copy" = "Kopier"; "ctx_cut" = "Klipp ut"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nl.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nl.lproj/Localizable.strings index 327027a3..67a50b87 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nl.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nl.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Voer een geheel getal in."; "simulation_trace" = "Laatste stap"; -"simulation_trace_placeholder" = "De laatst uitgevoerde stap wordt hier uitgelegd."; +"simulation_trace_placeholder" = "Nog geen stap uitgevoerd."; "simulation_variables" = "Variabelen"; -"simulation_variables_placeholder" = "De huidige variabele waarden worden hier later getoond."; +"simulation_variables_placeholder" = "Nog geen variabelen."; "simulation_output" = "Uitvoer"; -"simulation_output_placeholder" = "De uitvoer van de simulatie verschijnt hier later."; +"simulation_output_placeholder" = "Nog geen uitvoer."; "action_delete_selection" = "Selectie verwijderen"; "ctx_copy" = "Kopiëren"; "ctx_cut" = "Knippen"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pl.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pl.lproj/Localizable.strings index 383e3131..51af815d 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pl.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pl.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Wpisz liczbę całkowitą."; "simulation_trace" = "Ostatni krok"; -"simulation_trace_placeholder" = "Tutaj zostanie wyjaśniony ostatnio wykonany krok."; +"simulation_trace_placeholder" = "Nie wykonano jeszcze żadnego kroku."; "simulation_variables" = "Zmienne"; -"simulation_variables_placeholder" = "Później będą tu pokazywane aktualne wartości zmiennych."; +"simulation_variables_placeholder" = "Brak zmiennych."; "simulation_output" = "Wyjście"; -"simulation_output_placeholder" = "Później pojawi się tu wyjście symulacji."; +"simulation_output_placeholder" = "Brak wyjścia."; "action_delete_selection" = "Usuń zaznaczenie"; "ctx_copy" = "Kopiuj"; "ctx_cut" = "Wytnij"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pt-PT.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pt-PT.lproj/Localizable.strings index 670a3410..d53f3d0e 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pt-PT.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pt-PT.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Introduza um número inteiro."; "simulation_trace" = "Último passo"; -"simulation_trace_placeholder" = "O último passo executado será explicado aqui."; +"simulation_trace_placeholder" = "Ainda não foi executado nenhum passo."; "simulation_variables" = "Variáveis"; -"simulation_variables_placeholder" = "Os valores atuais das variáveis serão mostrados aqui mais tarde."; +"simulation_variables_placeholder" = "Ainda não há variáveis."; "simulation_output" = "Saída"; -"simulation_output_placeholder" = "A saída da simulação aparecerá aqui mais tarde."; +"simulation_output_placeholder" = "Ainda não há saída."; "action_delete_selection" = "Eliminar seleção"; "ctx_copy" = "Copiar"; "ctx_cut" = "Cortar"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ru.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ru.lproj/Localizable.strings index 063a0547..77826860 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ru.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ru.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Введите целое число."; "simulation_trace" = "Последний шаг"; -"simulation_trace_placeholder" = "Здесь будет объясняться последний выполненный шаг."; +"simulation_trace_placeholder" = "Ещё не выполнено ни одного шага."; "simulation_variables" = "Переменные"; -"simulation_variables_placeholder" = "Текущие значения переменных будут показаны здесь позже."; +"simulation_variables_placeholder" = "Переменных пока нет."; "simulation_output" = "Вывод"; -"simulation_output_placeholder" = "Вывод симуляции появится здесь позже."; +"simulation_output_placeholder" = "Вывода пока нет."; "action_delete_selection" = "Удалить выделение"; "ctx_copy" = "Копировать"; "ctx_cut" = "Вырезать"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/sv.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/sv.lproj/Localizable.strings index efe91c52..72c36fa9 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/sv.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/sv.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Ange ett heltal."; "simulation_trace" = "Senaste steg"; -"simulation_trace_placeholder" = "Det senast körda steget förklaras här."; +"simulation_trace_placeholder" = "Inget steg har körts ännu."; "simulation_variables" = "Variabler"; -"simulation_variables_placeholder" = "Aktuella variabelvärden visas här senare."; +"simulation_variables_placeholder" = "Inga variabler ännu."; "simulation_output" = "Utdata"; -"simulation_output_placeholder" = "Simuleringens utdata visas här senare."; +"simulation_output_placeholder" = "Ingen utmatning ännu."; "action_delete_selection" = "Radera markering"; "ctx_copy" = "Kopiera"; "ctx_cut" = "Klipp ut"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/tr.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/tr.lproj/Localizable.strings index b91aab60..1cdb3df8 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/tr.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/tr.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Lütfen bir tam sayı girin."; "simulation_trace" = "Son Adım"; -"simulation_trace_placeholder" = "Son çalıştırılan adım burada açıklanacak."; +"simulation_trace_placeholder" = "Henüz adım çalıştırılmadı."; "simulation_variables" = "Değişkenler"; -"simulation_variables_placeholder" = "Geçerli değişken değerleri daha sonra burada gösterilecek."; +"simulation_variables_placeholder" = "Henüz değişken yok."; "simulation_output" = "Çıktı"; -"simulation_output_placeholder" = "Simülasyon çıktısı daha sonra burada görünecek."; +"simulation_output_placeholder" = "Henüz çıktı yok."; "action_delete_selection" = "Seçimi sil"; "ctx_copy" = "Kopyala"; "ctx_cut" = "Kes"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/uk.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/uk.lproj/Localizable.strings index f60988e7..7343726c 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/uk.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/uk.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "Введіть ціле число."; "simulation_trace" = "Останній крок"; -"simulation_trace_placeholder" = "Тут буде пояснено останній виконаний крок."; +"simulation_trace_placeholder" = "Ще не виконано жодного кроку."; "simulation_variables" = "Змінні"; -"simulation_variables_placeholder" = "Поточні значення змінних буде показано тут пізніше."; +"simulation_variables_placeholder" = "Змінних поки немає."; "simulation_output" = "Вивід"; -"simulation_output_placeholder" = "Вивід симуляції з’явиться тут пізніше."; +"simulation_output_placeholder" = "Виведення поки немає."; "action_delete_selection" = "Видалити вибране"; "ctx_copy" = "Копіювати"; "ctx_cut" = "Вирізати"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hans.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hans.lproj/Localizable.strings index 3499e86f..800d1634 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hans.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hans.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "请输入一个整数。"; "simulation_trace" = "上一步"; -"simulation_trace_placeholder" = "这里将说明最后执行的步骤。"; +"simulation_trace_placeholder" = "尚未执行任何步骤。"; "simulation_variables" = "变量"; -"simulation_variables_placeholder" = "当前变量值稍后会显示在这里。"; +"simulation_variables_placeholder" = "暂无变量。"; "simulation_output" = "输出"; -"simulation_output_placeholder" = "模拟输出稍后会显示在这里。"; +"simulation_output_placeholder" = "暂无输出。"; "action_delete_selection" = "删除所选"; "ctx_copy" = "复制"; "ctx_cut" = "剪切"; diff --git a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hant.lproj/Localizable.strings b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hant.lproj/Localizable.strings index d634972b..6a8739e4 100644 --- a/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hant.lproj/Localizable.strings +++ b/VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hant.lproj/Localizable.strings @@ -23,11 +23,11 @@ "simulation_input_submit" = "OK"; "simulation_input_invalid_int" = "請輸入一個整數。"; "simulation_trace" = "上一步"; -"simulation_trace_placeholder" = "這裡會說明最後執行的步驟。"; +"simulation_trace_placeholder" = "尚未執行任何步驟。"; "simulation_variables" = "變數"; -"simulation_variables_placeholder" = "目前的變數值稍後會顯示在這裡。"; +"simulation_variables_placeholder" = "暫無變數。"; "simulation_output" = "輸出"; -"simulation_output_placeholder" = "模擬輸出稍後會顯示在這裡。"; +"simulation_output_placeholder" = "暫無輸出。"; "action_delete_selection" = "刪除選取項目"; "ctx_copy" = "複製"; "ctx_cut" = "剪下";