Skip to content

Commit 5ce2072

Browse files
i18n: expand Swift map sync, tidy tools, and update docs
Sync Messages_* from expanded java_swift_i18n_map; add analyze_i18n_gaps.py; move pre-Swift generators to tools/legacy; gitignore local Python i18n deps; clarify Contributing and v1.2.1 simulation settings path. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent ae35a74 commit 5ce2072

29 files changed

Lines changed: 567 additions & 438 deletions

‎.gitignore‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,9 @@ dist/
2929
com/
3030

3131
# Lokaler Klon des SwiftUI-Repos (nicht ins Java-Projekt einchecken)
32-
VisuStruct-swift/
32+
VisuStruct-swift/
33+
34+
# Lokale Python-Umgebung / Pakete für i18n-Skripte (tools/*.py)
35+
.venv-i18n/
36+
.pydeps/
37+
tools/.nl_pl_tr_ru_translations.json

‎README.md‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Full notes: [`release-notes/v1.2.2.md`](release-notes/v1.2.2.md).
3131

3232
## Changes in 1.2.1 (summary)
3333

34-
- **Simulation:** **true/false** branch selection by case name; **reset (Stop)** for new input on rerun; highlight mode and play speed in Settings; sidebar layout (input always visible, current block shows instruction text).
34+
- **Simulation:** **true/false** branch selection by case name; **reset (Stop)** for new input on rerun; highlight mode and play speed under **Settings → Simulation…**; sidebar layout (input always visible, current block shows instruction text).
3535
- **Save:** pending **element-editor** text applied before save; more reliable save dialog on **macOS**.
3636
- **Code generator:** structure chart text as comments **off** by default.
3737

@@ -240,8 +240,22 @@ Double-click may work if `.jar` is associated with Java.
240240

241241
Suggestions and **bug reports** are welcome via [**Issues** and **Pull requests**](https://github.com/code4teaching/VisuStruct).
242242

243-
**Commits** and **code comments** may use **English**.
244-
New **visible UI strings** belong in **`Messages*.properties`** (and **`structure.*`** where applicable) for **en**, **de**, and **pt_PT**; open an issue first if keys or wording are unclear.
243+
**Commits** and **code comments** may use **English**.
244+
245+
### UI strings (21 languages)
246+
247+
- Bundles: `src/main/resources/de/visustruct/i18n/Messages_*.properties` (plus **`structure.*`** keys where applicable).
248+
- **Source of truth for new keys:** add the English string to **`Messages_en.properties`**, then extend the Swift↔Java map in the sibling repo **`VisuStruct-swift/tools/java_swift_i18n_map.json`** (clone next to this project; see `.gitignore`).
249+
- **Regenerate** all locale files from Swift where mapped (`tools/README.md`):
250+
251+
```bash
252+
python3 tools/sync_java_messages_from_swift.py
253+
python3 tools/analyze_i18n_gaps.py # optional: unmapped keys
254+
```
255+
256+
Unmapped keys keep the existing bundle text or fall back to English. Desktop-only dialogs may stay English until mapped.
257+
- **Menu language** is **Settings → Languages** only (`uilanguage` in `visustruct.properties`); do not duplicate a language list in other settings dialogs.
258+
- Open an issue first if keys, didactic wording, or Swift parity are unclear.
245259

246260
---
247261

‎release-notes/v1.2.1.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Patch release **after** **1.2.0**.
77
- **Branches:** `true` / `false` cases are selected **by name**, not only by XML order (e.g. after swapping branches and saving).
88
- **Reset (Stop):** the step list is rebuilt from the diagram; **new input** on rerun (no longer stuck on the first value).
99
- **Modulo / comparisons:** numeric `String` values in expressions are handled more robustly.
10-
- **Diagram highlight** (“Last executed” / “Next up”) and **play speed** under **Settings → Default block texts**, section **Simulation** (`simulationhighlight`, `simulationplaydelay`).
10+
- **Diagram highlight** (“Last executed” / “Next up”) and **play speed** in the default block-text settings dialog, **Simulation** section (`simulationhighlight`, `simulationplaydelay`). *(Since 1.2.2: **Settings → Simulation…**, separate from **Labels (structure chart)**.)*
1111
- **Simulation panel:** order is Controls → Input (always visible) → Variables → Current block (instruction text) → Output; back arrow removed (return via menu/palette).
1212

1313
## Code generator

‎src/main/resources/de/visustruct/i18n/Messages_ar.properties‎

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ menu.file.about=حول VisuStruct
1717
menu.file.exit=Exit
1818
menu.edit.undo=تراجع
1919
menu.edit.redo=إعادة
20-
menu.edit.caption=Set Diagram Caption...
20+
menu.edit.caption=العنوان
2121
menu.edit.copyDiagram=Copy Entire Diagram
2222
menu.edit.simulation=Simulation…
2323
menu.edit.diagramMode=Edit diagram…
@@ -29,7 +29,7 @@ simulation.stop=Stop
2929
simulation.play.tooltip=Run steps automatically (speed and highlight in Settings; pauses when input is needed)
3030
simulation.pause.tooltip=Pause automatic stepping
3131
simulation.stop.tooltip=Restart simulation from the beginning
32-
simulation.highlight=Highlight
32+
simulation.highlight=تمييز المخطط
3333
simulation.highlight.lastStep=آخر تنفيذ
3434
simulation.highlight.nextStep=الخطوة التالية
3535
simulation.back=Back to diagram
@@ -72,7 +72,7 @@ menu.settings.language.da=الدنماركية
7272
menu.settings.language.nb=النرويجية (بوكمول)
7373
menu.settings.language.zh_Hans=الصينية (مبسطة)
7474
menu.settings.language.zh_Hant=الصينية (تقليدية)
75-
menu.settings.labelsStruktogramm=Labels (structure chart)
75+
menu.settings.labelsStruktogramm=نص العنصر
7676
menu.settings.simulation=Simulation…
7777
menu.settings.changeFont=Change Font...
7878
menu.settings.mouseWheel=Resize blocks with mouse wheel
@@ -85,10 +85,10 @@ dialog.exitUnsaved.title=تغييرات غير محفوظة
8585
dialog.exitUnsaved.message=يحتوي هذا المخطط على تغييرات غير محفوظة. هل تريد حفظها قبل الإغلاق؟
8686
dialog.exitUnsaved.quit=تجاهل
8787
dialog.exitUnsaved.stay=إلغاء
88-
dialog.saveBeforeClose.title=Close diagram
89-
dialog.saveBeforeClose.message=Save the current diagram before closing?
90-
dialog.saveBeforeClose.save=Save
91-
dialog.saveBeforeClose.dontSave=Close without saving
88+
dialog.saveBeforeClose.title=تغييرات غير محفوظة
89+
dialog.saveBeforeClose.message=يحتوي هذا المخطط على تغييرات غير محفوظة. هل تريد حفظها قبل الإغلاق؟
90+
dialog.saveBeforeClose.save=حفظ
91+
dialog.saveBeforeClose.dontSave=تجاهل
9292
dialog.saveBeforeClose.cancel=إلغاء
9393

9494
dialog.common.yes=Yes
@@ -100,8 +100,8 @@ dialog.pasteNeedPosition.title=Paste
100100
dialog.deleteBlock.title=Delete block
101101
dialog.deleteBlock.message=Remove this block?
102102
dialog.deleteBlock.messageNested=Remove this block and all nested blocks?
103-
dialog.deleteBlock.remove=Delete
104-
dialog.deleteBlock.cancel=Cancel
103+
dialog.deleteBlock.remove=حذف التحديد
104+
dialog.deleteBlock.cancel=إلغاء
105105
dialog.overwriteFile.title=File exists
106106
dialog.overwriteFile.message=The file {0} already exists.\nOverwrite?
107107
dialog.overwriteFile.overwrite=Overwrite
@@ -111,7 +111,7 @@ dialog.saveNoPath.message=There is no file path to save to. Use “Save As…”
111111
dialog.saveError.title=Save
112112
dialog.saveError.message=The file could not be saved:\n{0}
113113
dialog.recentMissing.title=Recent file
114-
dialog.recentMissing.message=This file is no longer available:\n{0}\nIt has been removed from the recent list.
114+
dialog.recentMissing.message=لم يعد الملف متاحًا.
115115
dialog.exportImage.title=Export image
116116
dialog.exportImage.formatFailed=The image could not be written (format: {0}).
117117
dialog.exportImage.error=An error occurred while saving:\n{0}
@@ -121,15 +121,15 @@ dialog.caseLabel.renameButton=Rename selected case
121121
dialog.caseSelectFirst.title=Selection required
122122
dialog.caseSelectFirst.message=Please select a case in the list first.
123123
dialog.codeInvalidInput.title=Invalid input
124-
dialog.codeInvalidInput.message=Please enter whole numbers in the fields.
124+
dialog.codeInvalidInput.message=يرجى إدخال عدد صحيح.
125125

126126
dialog.codeGen.targetJava=Java
127127
dialog.codeGen.targetPython=Python
128128
dialog.codeGen.targetJavaScript=JavaScript
129-
dialog.codeGen.emitComments=Emit structure chart text as comments
129+
dialog.codeGen.emitComments=نص المخطط كتعليقات
130130
dialog.codeGen.indentFirstLine=Indentation of the first line (spaces):
131131
dialog.codeGen.spacesPerLevel=Spaces per indentation level:
132-
dialog.codeGen.generate=Generate
132+
dialog.codeGen.generate=إنشاء الشفرة
133133
dialog.codeGen.close=Close
134134
dialog.codeGen.openInBrowser=اختبار في المتصفح
135135
dialog.codeGen.openInBrowser.tooltip=Opens the generated JavaScript in a temporary HTML file in your default browser.
@@ -150,8 +150,8 @@ dialog.codeGen.jsBrowserConsoleHint=Output from console.log appears in the devel
150150

151151
tab.untitled=Untitled
152152
tab.close.tooltip=Close this tab
153-
tab.close.a11y=Close diagram tab
154-
tab.unsaved.a11y=Unsaved changes
153+
tab.close.a11y=إغلاق علامة التبويب
154+
tab.unsaved.a11y=تغييرات غير محفوظة
155155
fileChooser.openTitle=Open
156156
fileChooser.saveTitle=Save
157157
fileChooser.lookIn=Look in:
@@ -198,18 +198,18 @@ structure.palette.call=Call
198198
structure.palette.empty=Empty block
199199
structure.multiway.defaultCaseLabel=default
200200

201-
elementPreset.englishJava=Java-like
201+
elementPreset.englishJava=Java (كلمات مفتاحية)
202202
elementPreset.didacticUiLanguage=Interface language
203203

204-
dialog.elementText.title=Settings — default block texts
204+
dialog.elementText.title=الإعدادات
205205
dialog.elementText.intro=Default text for <b>newly inserted</b> structure-chart blocks.
206-
dialog.elementText.presetSection=Text preset
207-
dialog.elementText.previewTitle=Preview of default texts
208-
dialog.elementText.cancel=Cancel
209-
dialog.elementText.ok=OK
206+
dialog.elementText.presetSection=نص العنصر
207+
dialog.elementText.previewTitle=مولّد الشفرة
208+
dialog.elementText.cancel=إلغاء
209+
dialog.elementText.ok=حسنًا
210210
dialog.elementText.uiLanguageSection=User interface language
211211
dialog.elementText.simulationSection=محاكاة
212-
dialog.elementText.simulationSpeedLabel=Pause between steps:
212+
dialog.elementText.simulationSpeedLabel=توقف بين الخطوات
213213
dialog.elementText.simulationSpeedUnit=s
214214
dialog.elementText.simulationHighlightLabel=تمييز المخطط
215215
dialog.elementText.simulationHighlightLast=آخر تنفيذ
@@ -222,20 +222,20 @@ popup.zoom.wider=Wider
222222
popup.zoom.narrower=Narrower
223223
popup.zoom.taller=Taller
224224
popup.zoom.shorter=Shorter
225-
popup.editText=Edit text
225+
popup.editText=تحرير النص
226226
popup.copy=نسخ
227227
popup.paste=لصق
228228
popup.delete=حذف التحديد
229229
popup.swapBranches=Swap true and false branches
230-
popup.insertNewCase=Insert new case
230+
popup.insertNewCase=إضافة حالة
231231
popup.caseSubmenu=Case: {0}
232232
popup.moveCaseLeft=Move case {0} left
233233
popup.moveCaseRight=Move case {0} right
234234
popup.removeCase=Remove case {0}
235235
popup.removeCaseConfirm=Delete case {0} and all nested blocks?
236-
popup.removeCaseTitle=Remove case
236+
popup.removeCaseTitle=إزالة الحالة
237237
popup.pasteEmpty=Nothing copied yet. Use Copy first.
238-
popup.pasteTitle=Paste
238+
popup.pasteTitle=لصق
239239

240240
palette.aboutVisuStruct=حول VisuStruct
241241
palette.aboutTooltip=حول VisuStruct

‎src/main/resources/de/visustruct/i18n/Messages_da.properties‎

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ menu.file.about=Om VisuStruct
1717
menu.file.exit=Exit
1818
menu.edit.undo=Fortryd
1919
menu.edit.redo=Annuller fortryd
20-
menu.edit.caption=Set Diagram Caption...
20+
menu.edit.caption=Titel
2121
menu.edit.copyDiagram=Copy Entire Diagram
2222
menu.edit.simulation=Simulation…
2323
menu.edit.diagramMode=Edit diagram…
@@ -29,7 +29,7 @@ simulation.stop=Stop
2929
simulation.play.tooltip=Run steps automatically (speed and highlight in Settings; pauses when input is needed)
3030
simulation.pause.tooltip=Pause automatic stepping
3131
simulation.stop.tooltip=Restart simulation from the beginning
32-
simulation.highlight=Highlight
32+
simulation.highlight=Diagramfremhævning
3333
simulation.highlight.lastStep=Sidst udført
3434
simulation.highlight.nextStep=Næste trin
3535
simulation.back=Back to diagram
@@ -72,7 +72,7 @@ menu.settings.language.da=Dansk
7272
menu.settings.language.nb=Norsk (bokmål)
7373
menu.settings.language.zh_Hans=Kinesisk (forenklet)
7474
menu.settings.language.zh_Hant=Kinesisk (traditionel)
75-
menu.settings.labelsStruktogramm=Labels (structure chart)
75+
menu.settings.labelsStruktogramm=Elementtekst
7676
menu.settings.simulation=Simulation…
7777
menu.settings.changeFont=Change Font...
7878
menu.settings.mouseWheel=Resize blocks with mouse wheel
@@ -85,10 +85,10 @@ dialog.exitUnsaved.title=Ikke-gemte ændringer
8585
dialog.exitUnsaved.message=Dette diagram indeholder ikke-gemte ændringer. Vil du gemme dem før lukning?
8686
dialog.exitUnsaved.quit=Kassér
8787
dialog.exitUnsaved.stay=Annuller
88-
dialog.saveBeforeClose.title=Close diagram
89-
dialog.saveBeforeClose.message=Save the current diagram before closing?
90-
dialog.saveBeforeClose.save=Save
91-
dialog.saveBeforeClose.dontSave=Close without saving
88+
dialog.saveBeforeClose.title=Ikke-gemte ændringer
89+
dialog.saveBeforeClose.message=Dette diagram indeholder ikke-gemte ændringer. Vil du gemme dem før lukning?
90+
dialog.saveBeforeClose.save=Gem
91+
dialog.saveBeforeClose.dontSave=Kassér
9292
dialog.saveBeforeClose.cancel=Annuller
9393

9494
dialog.common.yes=Yes
@@ -100,8 +100,8 @@ dialog.pasteNeedPosition.title=Paste
100100
dialog.deleteBlock.title=Delete block
101101
dialog.deleteBlock.message=Remove this block?
102102
dialog.deleteBlock.messageNested=Remove this block and all nested blocks?
103-
dialog.deleteBlock.remove=Delete
104-
dialog.deleteBlock.cancel=Cancel
103+
dialog.deleteBlock.remove=Slet markering
104+
dialog.deleteBlock.cancel=Annuller
105105
dialog.overwriteFile.title=File exists
106106
dialog.overwriteFile.message=The file {0} already exists.\nOverwrite?
107107
dialog.overwriteFile.overwrite=Overwrite
@@ -111,7 +111,7 @@ dialog.saveNoPath.message=There is no file path to save to. Use “Save As…”
111111
dialog.saveError.title=Save
112112
dialog.saveError.message=The file could not be saved:\n{0}
113113
dialog.recentMissing.title=Recent file
114-
dialog.recentMissing.message=This file is no longer available:\n{0}\nIt has been removed from the recent list.
114+
dialog.recentMissing.message=Filen er ikke længere tilgængelig.
115115
dialog.exportImage.title=Export image
116116
dialog.exportImage.formatFailed=The image could not be written (format: {0}).
117117
dialog.exportImage.error=An error occurred while saving:\n{0}
@@ -121,12 +121,12 @@ dialog.caseLabel.renameButton=Rename selected case
121121
dialog.caseSelectFirst.title=Selection required
122122
dialog.caseSelectFirst.message=Please select a case in the list first.
123123
dialog.codeInvalidInput.title=Invalid input
124-
dialog.codeInvalidInput.message=Please enter whole numbers in the fields.
124+
dialog.codeInvalidInput.message=Indtast et heltal.
125125

126126
dialog.codeGen.targetJava=Java
127127
dialog.codeGen.targetPython=Python
128128
dialog.codeGen.targetJavaScript=JavaScript
129-
dialog.codeGen.emitComments=Emit structure chart text as comments
129+
dialog.codeGen.emitComments=Diagramtekst som kommentarer
130130
dialog.codeGen.indentFirstLine=Indentation of the first line (spaces):
131131
dialog.codeGen.spacesPerLevel=Spaces per indentation level:
132132
dialog.codeGen.generate=Generate
@@ -201,15 +201,15 @@ structure.multiway.defaultCaseLabel=default
201201
elementPreset.englishJava=Java-like
202202
elementPreset.didacticUiLanguage=Interface language
203203

204-
dialog.elementText.title=Settings — default block texts
204+
dialog.elementText.title=Indstillinger
205205
dialog.elementText.intro=Default text for <b>newly inserted</b> structure-chart blocks.
206-
dialog.elementText.presetSection=Text preset
206+
dialog.elementText.presetSection=Elementtekst
207207
dialog.elementText.previewTitle=Preview of default texts
208-
dialog.elementText.cancel=Cancel
208+
dialog.elementText.cancel=Annuller
209209
dialog.elementText.ok=OK
210210
dialog.elementText.uiLanguageSection=User interface language
211211
dialog.elementText.simulationSection=Simulering
212-
dialog.elementText.simulationSpeedLabel=Pause between steps:
212+
dialog.elementText.simulationSpeedLabel=Pause mellem trin
213213
dialog.elementText.simulationSpeedUnit=s
214214
dialog.elementText.simulationHighlightLabel=Diagramfremhævning
215215
dialog.elementText.simulationHighlightLast=Sidst udført
@@ -227,15 +227,15 @@ popup.copy=Kopiér
227227
popup.paste=Indsæt
228228
popup.delete=Slet markering
229229
popup.swapBranches=Swap true and false branches
230-
popup.insertNewCase=Insert new case
230+
popup.insertNewCase=Tilføj case
231231
popup.caseSubmenu=Case: {0}
232232
popup.moveCaseLeft=Move case {0} left
233233
popup.moveCaseRight=Move case {0} right
234234
popup.removeCase=Remove case {0}
235235
popup.removeCaseConfirm=Delete case {0} and all nested blocks?
236-
popup.removeCaseTitle=Remove case
236+
popup.removeCaseTitle=Fjern case
237237
popup.pasteEmpty=Nothing copied yet. Use Copy first.
238-
popup.pasteTitle=Paste
238+
popup.pasteTitle=Indsæt
239239

240240
palette.aboutVisuStruct=Om VisuStruct
241241
palette.aboutTooltip=Om VisuStruct

0 commit comments

Comments
 (0)