Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
c094876
Refactor sorting logic in sort_en_xml.py to filter and sort <string> …
MightyMCoder Jun 24, 2025
0e1778e
Refactor XML sorting logic to preserve comments and improve buffer ha…
MightyMCoder Jun 24, 2025
b27a5fd
Refactor commit logic in sort-en-xml.yml to streamline file handling …
MightyMCoder Jun 24, 2025
2665c7b
Refactor workflow steps in sort-en-xml.yml to clarify script executio…
MightyMCoder Jun 24, 2025
99ac8c7
chore: sort en.xml alphabetically
Jun 24, 2025
39fd638
Refactor sorting logic in sort_en_xml.py to simplify buffer handling …
MightyMCoder Jun 24, 2025
d7c742c
chore: sort en.xml alphabetically
Jun 24, 2025
d036934
fix language file sorting workflow
MightyMCoder Jun 24, 2025
ad1fbc3
feat: add workflow and script to check for unused translation keys
MightyMCoder Jun 24, 2025
b404f01
fix: correct script path in unused string checker workflow
MightyMCoder Jun 24, 2025
6851f4d
fix: update unused string checker workflow to handle errors correctly
MightyMCoder Jun 24, 2025
ed972bf
fix: update workflows to ensure proper handling of unused strings and…
MightyMCoder Jun 24, 2025
9350965
fix: remove error message from unused string checker command
MightyMCoder Jun 24, 2025
7fddc85
fix: add debug output for event name and check outcome in unused stri…
MightyMCoder Jun 24, 2025
f92f52f
fix: update unused string checker workflow to annotate warnings for u…
MightyMCoder Jun 24, 2025
abca4a2
fix: update conditions for jq installation and PR review in unused st…
MightyMCoder Jun 24, 2025
ed54d69
fix: remove jq installation step from unused string checker workflow
MightyMCoder Jun 24, 2025
247c5f6
fix: remove unused strings from language files
MightyMCoder Jun 24, 2025
08ab037
fix: add approval step for PRs with no unused translation keys
MightyMCoder Jun 24, 2025
1e067b4
Revert "fix: add approval step for PRs with no unused translation keys"
MightyMCoder Jun 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/scripts/check_unused_strings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import os, re, xml.etree.ElementTree as ET
import argparse

p = argparse.ArgumentParser()
p.add_argument('--exclude', default='', help='Comma‑separated dirs to skip')
args = p.parse_args()
excl = {d.strip() for d in args.exclude.split(',') if d.strip()}

root = ET.parse('languages/en.xml').getroot()
keys = [e.attrib['name'] for e in root.findall('.//string')
if re.fullmatch(r'[A-Z0-9_]+', e.attrib['name'])]

unused = []
for k in keys:
used = False
for dp, _, fs in os.walk('.'):
if any(part in excl for part in dp.split(os.sep)):
continue
for f in fs:
if f.endswith(('.php','.js','.html','.tpl')):
if k in open(os.path.join(dp, f), 'r', errors='ignore').read():
used = True; break
if used: break
if not used:
unused.append(k)

if unused:
for k in unused:
print(f"UNUSED: {k}")
exit(1) # triggers warning via continue-on-error
39 changes: 34 additions & 5 deletions .github/scripts/sort_en_xml.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,38 @@
import xml.etree.ElementTree as ET
from lxml import etree

file = 'languages/en.xml'
tree = ET.parse(file)

# Load XML with comments preserved
parser = etree.XMLParser(remove_blank_text=False)
tree = etree.parse(file, parser)
root = tree.getroot()
root[:] = sorted(root, key=lambda e: e.attrib.get('name',''))
ET.indent(tree, space=" ")
tree.write(file, encoding='utf-8', xml_declaration=True)

new_children = []
buffer = []

def flush_buffer():
"""Sort and add all <string> elements in the buffer."""
if buffer:
sorted_strings = sorted(buffer, key=lambda e: e.attrib.get('name', ''))
new_children.extend(sorted_strings)
buffer.clear()

for elem in root.iterchildren():
if isinstance(elem, etree._Comment):
flush_buffer()
new_children.append(elem)
elif elem.tag == 'string':
buffer.append(elem)
else:
flush_buffer()
new_children.append(elem)

# Flush anything left at the end
flush_buffer()

# Replace root content
root[:] = new_children

# Save result
tree.write(file, encoding='utf-8', xml_declaration=True, pretty_print=True)
print("en.xml successfully sorted.")
56 changes: 56 additions & 0 deletions .github/workflows/check-unused-strings.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Check Unused Strings

on:
push:
branches:
- master
paths:
- languages/en.xml
pull_request:
branches:
- master
paths:
- languages/en.xml
workflow_dispatch:

permissions:
contents: read
pull-requests: write

jobs:
unused-strings:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'

- name: Run unused‑string checker
id: check
run: |
python .github/scripts/check_unused_strings.py --exclude .github > unused_keys.txt

- name: Annotate warning if unused
if: failure()
continue-on-error: true
run: |
echo "::warning file=en.xml::Detected unused translation keys. Please review."

- name: Post PR review with unused keys
if: ${{ github.event_name == 'pull_request' && failure() }}
continue-on-error: true
env:
GITHUB_TOKEN: ${{ github.token }}
run: |
PR_NUMBER=$(jq --raw-output .number "$GITHUB_EVENT_PATH")
BODY=$(echo -e "**WARNING: Unused translation keys detected**\n\n\`\`\`\n$(cat unused_keys.txt)\n\`\`\`\nPlease consider removing or using these keys." | jq -Rs .)

curl -s -X POST -H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Content-Type: application/json" \
https://api.github.com/repos/${{ github.repository }}/pulls/$PR_NUMBER/reviews \
-d "{\"body\": $BODY, \"event\": \"REQUEST_CHANGES\"}"
19 changes: 15 additions & 4 deletions .github/workflows/sort-en-xml.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
name: Sort en.xml

on:
push:
branches:
- master
paths:
- languages/en.xml
workflow_dispatch:

jobs:
Expand All @@ -15,15 +20,21 @@ jobs:
with:
python-version: '3.x'

- name: Sort en.xml
- name: Install lxml
run: pip install lxml

- name: Run sort script
run: python .github/scripts/sort_en_xml.py

- name: Commit sorted file
- name: Commit and push changes
run: |
git config user.name "github-actions"
git config user.email "actions@users.noreply.github.com"
git add languages/en.xml
if ! git diff --quiet; then

if git diff --quiet; then
echo "No changes detected."
else
git add languages/en.xml
git commit -m "chore: sort en.xml alphabetically"
git push
fi
16 changes: 0 additions & 16 deletions languages/de-DE.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
<string name="PLG_INVENTORY_MANAGER_ALLOW_NEGATIVE_NUMBERS_DESC">Soll es möglich sein, negative Zahlen für Felder des Types "Zahl" oder "Dezimalzahl" einzugeben, so ist der Haken zu setzen. </string>
<string name="PLG_INVENTORY_MANAGER_BASED_ON">(basierend auf #VAR1#)</string>
<string name="PLG_INVENTORY_MANAGER_CATEGORY">Kategorie</string>
<string name="PLG_INVENTORY_MANAGER_CONFIGURATION">Konfiguration</string>
<string name="PLG_INVENTORY_MANAGER_CONNECTION_ERROR">Es konnte keine Verbindung zur GitHub-Relaseseite hergestellt werden! Bitte prüfen Sie Ihre Internetverbindung oder versuchen Sie es zu einem späteren Zeitpunkt nocheinmal. Alternativ können Sie auch manuell auf der Webseite von #VAR1# prüfen ob ein Update vorliegt.</string>
<string name="PLG_INVENTORY_MANAGER_COPY_PREFERENCES">Einstellungen für das Kopieren eines Gegenstandes:</string>
<string name="PLG_INVENTORY_MANAGER_CREATED_WITH">erstellt mit dem Plugin InventoryManager der Online-Mitgliederverwaltung Admidio</string>
Expand All @@ -39,7 +38,6 @@
<string name="PLG_INVENTORY_MANAGER_DOCUMENTATION_OPEN_DESC">Hiermit können Sie die Dokumentation zum Plugin öffnen (Eine bestehende Internetverbindung wird vorausgesetzt, da sich die Daten auf GitHub befinden).</string>
<string name="PLG_INVENTORY_MANAGER_DOWNLOAD_PAGE">Gehe zur GitHub-Relaseseite</string>
<string name="PLG_INVENTORY_MANAGER_EXPORT">Export</string>
<string name="PLG_INVENTORY_MANAGER_EXPORT_AND_FILTER">Export und Filter</string>
<string name="PLG_INVENTORY_MANAGER_FIELD">Feld einer lfd. Nr.</string>
<string name="PLG_INVENTORY_MANAGER_FIELD_DESC">Hier können Sie ein Feld mit einer laufenden Nummer auswählen. Bei einer Auswahl wird die aktuelle Nummer ausgelesen und entsprechend der angegebenen Anzahl erhöht.\n\nHINWEIS: InventoryManager kann nur erkennen, ob ein Datenfeld vom Typ "Zahl" ist. Ob in diesem Datenfeld eine laufende Nummer gespeichert ist, kann nicht erkannt werden.</string>
<string name="PLG_INVENTORY_MANAGER_FILE_NAME">Dateiname</string>
Expand All @@ -50,20 +48,16 @@
<string name="PLG_INVENTORY_MANAGER_IMPORT">Import</string>
<string name="PLG_INVENTORY_MANAGER_IMPORT_DESC">Hier können Sie Gegenstände aus einer vorherigen Exportdatei oder einer eigenen Datei importieren.</string>
<string name="PLG_INVENTORY_MANAGER_IMPORT_ASSIGN_FIELDS">In der linken Spalte der nachfolgenden Tabelle werden alle Eigenschaftsfelder angezeigt. In der rechten Spalte werden in einer Auswahlliste die Spalten aus der zu importierenden Datei angezeigt. Alle Spalten aus der Datei, die Sie importieren möchten, sollten Sie nun einem Eigenschaftsfeld zuordnen.</string>
<string name="PLG_INVENTORY_MANAGER_IMPORT_ITEMS">Gegenstände importieren</string>
<string name="PLG_INVENTORY_MANAGER_IMPORT_PROGRESS">Der Gegenstand #VAR1_BOLD# wurde #VAR2_BOLD# importiert.</string>
<string name="PLG_INVENTORY_MANAGER_IMPORT_UNUSED_HEAD">Folgenden Spalten der Importdatei sind keine Felder im InventoryManager zugeordnet:</string>
<string name="PLG_INVENTORY_MANAGER_INVENTORY_MANAGER">Inventarverwaltung</string>
<string name="PLG_INVENTORY_MANAGER_ITEM">Gegenstand</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_COPY">Gegenstand kopieren</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_CREATE">Neuen Gegenstand anlegen</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_CREATE_DESC">Hier können Sie einzelne Gegenstände dem Inventar hinzufügen.\n\nHinweis: In der Ansicht "Gegenstand ändern" ist es über den Menüpunkt "Gegenstand kopieren" möglich, einen vorhandenen Gegenstand einfach oder mehrfach zu kopieren.</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_DELETE">Gegenstand löschen</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_DELETE_DESC">Soll dieser Gegenstand gelöscht werden?</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_DELETED">Gegenstand gelöscht</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_EDIT">Gegenstand ändern</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_MADE_TO_FORMER">Gegenstand ausgesondert</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_PRINT">Gegenstandsdaten drucken</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_UNDO_FORMER">Aussonderung des Gegenstandes rückgängig gemacht</string>
<string name="PLG_INVENTORY_MANAGER_ITEM_UNDO_FORMER_DESC">Sie könnent den Gegenstand wieder in die Inventarverwaltung aufnehmen.\n\nWenn Sie Löschen auswählen, wird der Datensatz unwiderruflich aus der Datenbank entfernt und es ist später nicht mehr möglich Daten dieses Gegenstandes einzusehen.</string>
<string name="PLG_INVENTORY_MANAGER_ITEMFIELD">Eigenschaftsfeld</string>
Expand All @@ -76,13 +70,11 @@
<string name="PLG_INVENTORY_MANAGER_ITEMFIELDSMANAGE">Felder pflegen</string>
<string name="PLG_INVENTORY_MANAGER_ITEMFIELDSMANAGE_DESC">In der Felderpflege können Sie Eigenschaftsfelder für Gegenstände anlegen und bearbeiten.</string>
<string name="PLG_INVENTORY_MANAGER_ITEMLIST">Gegenstandsliste</string>
<string name="PLG_INVENTORY_MANAGER_ITEMNAME">Gegenstandsname</string>
<string name="PLG_INVENTORY_MANAGER_KEEPER">Verwalter</string>
<string name="PLG_INVENTORY_MANAGER_KEEPER_FORMER_DESC">Sie können den Gegenstand als ausgesondert markieren. Dies hat den Vorteil, dass die Daten erhalten bleiben und Sie später immer wieder sehen können, wer diesen Gegenstand ausgeliehen hat.\n\nWenn Sie den Gegenstand löschen möchten, wenden Sie sich an einen Administrator oder den Verwalter der Inventarverwaltung!</string>
<string name="PLG_INVENTORY_MANAGER_KEEPER_ITEM_UNDO_FORMER_DESC">Sie können den Gegenstand wieder in die Inventarverwaltung aufnehmen.\n\nWenn Sie den Gegenstand löschen möchten, wenden Sie sich an einen Administrator oder den Verwalter der Inventarverwaltung!</string>
<string name="PLG_INVENTORY_MANAGER_MENU_URL_ERROR">Die Authorisierungsprüfung des Plugins ist fehlgeschlagen. Es ist mehr als ein Menüpunkt mit derselben URL definiert.\n\n=> #VAR1_BOLD#</string>
<string name="PLG_INVENTORY_MANAGER_NAME_OF_PLUGIN">InventoryManager</string>
<string name="PLG_INVENTORY_MANAGER_NEW">Neu</string>
<string name="PLG_INVENTORY_MANAGER_NO_NEW_IMPORT_DATA">In der Importdatei waren keine neuen Daten vorhanden!</string>
<string name="PLG_INVENTORY_MANAGER_NOTIFICATION_MESSAGE_ITEM_CHANGED">Der Gegenstand #VAR1_BOLD# wurde von #VAR2_BOLD# geändert:</string>
<string name="PLG_INVENTORY_MANAGER_NOTIFICATION_MESSAGE_ITEM_CREATED">Der Gegenstand #VAR1_BOLD# wurde von #VAR2_BOLD# angelegt:</string>
Expand All @@ -96,7 +88,6 @@
<string name="PLG_INVENTORY_MANAGER_NOTIFICATION_SUBJECT_ITEMS_IMPORTED">Im Inventar wurden Gegenstände importiert</string>
<string name="PLG_INVENTORY_MANAGER_NUMBER">Anzahl</string>
<string name="PLG_INVENTORY_MANAGER_NUMBER_DESC">Anzahl der anzufügenden Gegenstände</string>
<string name="PLG_INVENTORY_MANAGER_NUMBER_OF_ITEMS">Anzahl der Gegenstände</string>
<string name="PLG_INVENTORY_MANAGER_ORG_CHOICE">Organisationswahl</string>
<string name="PLG_INVENTORY_MANAGER_PLUGIN_DATE">Stand</string>
<string name="PLG_INVENTORY_MANAGER_PLUGIN_INFORMATION">Plugininformationen</string>
Expand All @@ -107,13 +98,6 @@
<string name="PLG_INVENTORY_MANAGER_PROFILE_ADDIN_DESC2">Damit in der Profilansicht Gegenstände angezeigt werden, müssen Sie folgende Zeile in die profile.php einfügen: "require_once(ADMIDIO_PATH . FOLDER_PLUGINS .'/InventoryManager/inventory_manager_profile_addin.php');".\n\nWeitere Informationen hierzu finden Sie in der #VAR1#.</string>
<string name="PLG_INVENTORY_MANAGER_SHOW_ALL_DESC">Bei gesetzter Einstellung werden neben den aktuellen Gegenständen dieser Organisation auch ausgesonderte Gegenstände angezeigt.</string>
<string name="PLG_INVENTORY_MANAGER_SHOW_ALL_ITEMS">Alle anzeigen</string>
<string name="PLG_INVENTORY_MANAGER_SPECIAL_CASE_CURUSER_OR_ADMIN">Sonderfall: Aktueller Benutzer oder Administrator</string>
<string name="PLG_INVENTORY_MANAGER_SYNCHRONIZE">Benutzer mit Empfänger abgleichen</string>
<string name="PLG_INVENTORY_MANAGER_SYNCHRONIZE_DESC">Hierüber können Sie Benutzer ohne ausgeliehene Gegenstände zu Ehemaligen Mitgliedern machen.\n\n V O R S I C H T\n\n Diese Funktion sollte nur verwendet werden, wenn InventoryManager in einer eigenen Organisation betrieben wird.</string>
<string name="PLG_INVENTORY_MANAGER_SYNCHRONIZE_ERROR">Es ist ein Fehler passiert! Benutzer mit #VAR1# konnten nicht gelöscht werden.</string>
<string name="PLG_INVENTORY_MANAGER_SYNCHRONIZE_NO_ASSIGN">Alle Benutzer sind Empfänger eines Gegenstandes, es kann kein Abgleich durchgeführt werden.</string>
<string name="PLG_INVENTORY_MANAGER_SYNCHRONIZE_PREVIEW">Dies ist nur eine Übersicht des Abgleichs, es wurde noch nichts gespeichert.\n\n Benutzer können nur zu Ehemaligen gemacht werden, wenn die Anzahl der Gegenstände 0 beträgt und sie nicht Administrator oder der aktuelle Benutzer sind.</string>
<string name="PLG_INVENTORY_MANAGER_SYNCHRONIZE_SAVED">Die aufgelisteten Benutzer sind jetzt Ehemalige.</string>
<string name="PLG_INVENTORY_MANAGER_UNDO_FORMER">Aussondern rückgängig machen</string>
<string name="PLG_INVENTORY_MANAGER_USE_CURRENT_USER">aktueller Benutzer als Standardauswahl</string>
<string name="PLG_INVENTORY_MANAGER_USE_CURRENT_USER_DESC">Soll der aktuelle Benutzer beim Hinzufügen neuer Gegenstände standardmäßig als Verwalter voreingestellt werden, so ist der Haken zu setzen.</string>
Expand Down
Loading