Merge remote-tracking branch 'origin/10.0' into 11.0

Conflicts:
	src/plugins/qtsupport/exampleslistmodel.cpp

Change-Id: Idbe0117ce810b4ab180a7c4f9b7b35c9c4b988e5
This commit is contained in:
Eike Ziller
2023-05-25 15:49:57 +02:00
6 changed files with 245 additions and 187 deletions

View File

@@ -11934,7 +11934,7 @@ Lokale Commits werden nicht zum Master-Branch gepusht, bis ein normaler Commit e
</message> </message>
<message> <message>
<source>Local filesystem:</source> <source>Local filesystem:</source>
<translation>Dateisystem:</translation> <translation>Lokales Dateisystem:</translation>
</message> </message>
<message> <message>
<source>Options</source> <source>Options</source>
@@ -11942,7 +11942,7 @@ Lokale Commits werden nicht zum Master-Branch gepusht, bis ein normaler Commit e
</message> </message>
<message> <message>
<source>Remember specified location as default</source> <source>Remember specified location as default</source>
<translation>Obige Einstellung als Vorgabe übernehmen</translation> <translation>Angegebenen Ort als Vorgabe übernehmen</translation>
</message> </message>
<message> <message>
<source>Overwrite</source> <source>Overwrite</source>
@@ -12124,7 +12124,7 @@ Lokale Pull-Operationen werden nicht auf den Master-Branch angewandt.</translati
</message> </message>
<message> <message>
<source>Update...</source> <source>Update...</source>
<translation>Auf aktuellen Stand bringen...</translation> <translation>Aktualisieren...</translation>
</message> </message>
<message> <message>
<source>Commit...</source> <source>Commit...</source>
@@ -12160,7 +12160,7 @@ Lokale Pull-Operationen werden nicht auf den Master-Branch angewandt.</translati
</message> </message>
<message> <message>
<source>Unable to create a commit editor.</source> <source>Unable to create a commit editor.</source>
<translation>Es konnte kein Editor für den Commit angelegt werden.</translation> <translation>Es konnte kein Commit-Editor angelegt werden.</translation>
</message> </message>
<message> <message>
<source>Commit changes for &quot;%1&quot;.</source> <source>Commit changes for &quot;%1&quot;.</source>
@@ -27079,497 +27079,499 @@ zu deaktivieren, deaktiviert auch die folgenden Plugins:
<name>QtC::Fossil</name> <name>QtC::Fossil</name>
<message> <message>
<source>Commit Editor</source> <source>Commit Editor</source>
<translation type="unfinished">Commit-Editor</translation> <translation>Commit-Editor</translation>
</message> </message>
<message> <message>
<source>Configure Repository</source> <source>Configure Repository</source>
<translation type="unfinished"></translation> <translation>Repository konfigurieren</translation>
</message> </message>
<message> <message>
<source>Existing user to become an author of changes made to the repository.</source> <source>Existing user to become an author of changes made to the repository.</source>
<translation type="unfinished"></translation> <translation>Vorhandener Benutzer, der Autor der Änderungen im Repository werden soll.</translation>
</message> </message>
<message> <message>
<source>SSL/TLS Identity Key</source> <source>SSL/TLS Identity Key</source>
<translation type="unfinished"></translation> <translation>SSL/TLS Identity Key</translation>
</message> </message>
<message> <message>
<source>SSL/TLS client identity key to use if requested by the server.</source> <source>SSL/TLS client identity key to use if requested by the server.</source>
<translation type="unfinished"></translation> <translation>SSL/TLS Client Identity Key, der benutzt werden soll, wenn der Server diesen anfordert.</translation>
</message> </message>
<message> <message>
<source>Disable auto-sync</source> <source>Disable auto-sync</source>
<translation type="unfinished"></translation> <translation>Automatisches Synchronisieren (autosync) deaktivieren</translation>
</message> </message>
<message> <message>
<source>Disable automatic pull prior to commit or update and automatic push after commit or tag or branch creation.</source> <source>Disable automatic pull prior to commit or update and automatic push after commit or tag or branch creation.</source>
<translation type="unfinished"></translation> <translation>Deaktiviert die automatische Pull-Operation vor Commits oder Aktualisierungen und die automatische Push-Operation nach Commits oder dem Erstellen von Tags oder Branches.</translation>
</message> </message>
<message> <message>
<source>Repository User</source> <source>Repository User</source>
<translation type="unfinished"></translation> <translation>Benutzer des Repositorys</translation>
</message> </message>
<message> <message>
<source>User:</source> <source>User:</source>
<translation type="unfinished">Nutzer:</translation> <translation>Nutzer:</translation>
</message> </message>
<message> <message>
<source>Repository Settings</source> <source>Repository Settings</source>
<translation type="unfinished"></translation> <translation>Repository-Einstellungen</translation>
</message> </message>
<message> <message>
<source>SSL/TLS identity:</source> <source>SSL/TLS identity:</source>
<translation type="unfinished"></translation> <translation>SSL/TLS Identity:</translation>
</message> </message>
<message> <message>
<source>Ignore All Whitespace</source> <source>Ignore All Whitespace</source>
<translation type="unfinished"></translation> <translation>Alle Leerzeichen ignorieren</translation>
</message> </message>
<message> <message>
<source>Strip Trailing CR</source> <source>Strip Trailing CR</source>
<translation type="unfinished"></translation> <translation>CR-Zeichen am Zeilenende entfernen</translation>
</message> </message>
<message> <message>
<source>Show Committers</source> <source>Show Committers</source>
<translation type="unfinished"></translation> <translation>Committer anzeigen</translation>
</message> </message>
<message> <message>
<source>List Versions</source> <source>List Versions</source>
<translation type="unfinished"></translation> <translation>Versionen anzeigen</translation>
</message> </message>
<message> <message>
<source>Ancestors</source> <source>Ancestors</source>
<translation type="unfinished"></translation> <translation>Vorfahren</translation>
</message> </message>
<message> <message>
<source>Descendants</source> <source>Descendants</source>
<translation type="unfinished"></translation> <translation>Nachfahren</translation>
</message> </message>
<message> <message>
<source>Unfiltered</source> <source>Unfiltered</source>
<translation type="unfinished">Ungefiltert</translation> <translation>Ungefiltert</translation>
</message> </message>
<message> <message>
<source>Lineage</source> <source>Lineage</source>
<translation type="unfinished"></translation> <translation>Abstammung</translation>
</message> </message>
<message> <message>
<source>Verbose</source> <source>Verbose</source>
<translation type="unfinished">Ausführlich</translation> <translation>Ausführlich</translation>
</message> </message>
<message> <message>
<source>Show files changed in each revision</source> <source>Show files changed in each revision</source>
<translation type="unfinished">Geänderte Dateien jeder Revision anzeigen</translation> <translation>Geänderte Dateien jeder Revision anzeigen</translation>
</message> </message>
<message> <message>
<source>All Items</source> <source>All Items</source>
<translation type="unfinished"></translation> <translation>Alle Elemente</translation>
</message> </message>
<message> <message>
<source>File Commits</source> <source>File Commits</source>
<translation type="unfinished"></translation> <translation>Datei-Commits</translation>
</message> </message>
<message> <message>
<source>Technical Notes</source> <source>Technical Notes</source>
<translation type="unfinished"></translation> <translation>Technische Anmerkungen (technotes)</translation>
</message> </message>
<message> <message>
<source>Tags</source> <source>Tags</source>
<translation type="unfinished">Tags</translation> <translation>Tags</translation>
</message> </message>
<message> <message>
<source>Tickets</source> <source>Tickets</source>
<translation type="unfinished"></translation> <translation>Tickets</translation>
</message> </message>
<message> <message>
<source>Wiki Commits</source> <source>Wiki Commits</source>
<translation type="unfinished"></translation> <translation>Wiki-Commits</translation>
</message> </message>
<message> <message>
<source>Item Types</source> <source>Item Types</source>
<translation type="unfinished"></translation> <translation>Element-Typen</translation>
</message> </message>
<message> <message>
<source>Private</source> <source>Private</source>
<translation type="unfinished"></translation> <translation>Privat</translation>
</message> </message>
<message> <message>
<source>Create a private check-in that is never synced. <source>Create a private check-in that is never synced.
Children of private check-ins are automatically private. Children of private check-ins are automatically private.
Private check-ins are not pushed to the remote repository by default.</source> Private check-ins are not pushed to the remote repository by default.</source>
<translation type="unfinished"></translation> <translation>Erstelle einen privaten Check-In, der niemals synchronisiert wird.
Kinder von privaten Check-Ins sind automatisch privat.
Private Check-Ins werden standardmäßig nicht zum entfernten Repository gepusht.</translation>
</message> </message>
<message> <message>
<source>Tag names to apply; comma-separated.</source> <source>Tag names to apply; comma-separated.</source>
<translation type="unfinished"></translation> <translation>Kommaseparierte Liste von Tag-Namen, die angewendet werden sollen.</translation>
</message> </message>
<message> <message>
<source>Current Information</source> <source>Current Information</source>
<translation type="unfinished"></translation> <translation>Aktuelle Informationen</translation>
</message> </message>
<message> <message>
<source>Local root:</source> <source>Local root:</source>
<translation type="unfinished"></translation> <translation>Lokale Root:</translation>
</message> </message>
<message> <message>
<source>Branch:</source> <source>Branch:</source>
<translation type="unfinished">Branch:</translation> <translation>Branch:</translation>
</message> </message>
<message> <message>
<source>Tags:</source> <source>Tags:</source>
<translation type="unfinished">Schlüsselworte:</translation> <translation>Tags:</translation>
</message> </message>
<message> <message>
<source>Commit Information</source> <source>Commit Information</source>
<translation type="unfinished">Informationen zu Commit</translation> <translation>Informationen zum Commit</translation>
</message> </message>
<message> <message>
<source>New branch:</source> <source>New branch:</source>
<translation type="unfinished"></translation> <translation>Neuer Branch:</translation>
</message> </message>
<message> <message>
<source>Author:</source> <source>Author:</source>
<translation type="unfinished">Autor:</translation> <translation>Autor:</translation>
</message> </message>
<message> <message>
<source>Message check failed.</source> <source>Message check failed.</source>
<translation type="unfinished"></translation> <translation>Die Überprüfung der Beschreibung schlug fehl.</translation>
</message> </message>
<message> <message>
<source>&amp;Annotate %1</source> <source>&amp;Annotate %1</source>
<translation type="unfinished"></translation> <translation>&amp;Annotation für %1</translation>
</message> </message>
<message> <message>
<source>Annotate &amp;Parent Revision %1</source> <source>Annotate &amp;Parent Revision %1</source>
<translation type="unfinished"></translation> <translation>Annotation der über&amp;geordneten Revision %1</translation>
</message> </message>
<message> <message>
<source>&amp;Fossil</source> <source>&amp;Fossil</source>
<translation type="unfinished"></translation> <translation>&amp;Fossil</translation>
</message> </message>
<message> <message>
<source>Annotate Current File</source> <source>Annotate Current File</source>
<translation type="unfinished">Annotation für Datei</translation> <translation>Annotation für Datei</translation>
</message> </message>
<message> <message>
<source>Annotate &quot;%1&quot;</source> <source>Annotate &quot;%1&quot;</source>
<translation type="unfinished">Annotation für &quot;%1&quot;</translation> <translation>Annotation für &quot;%1&quot;</translation>
</message> </message>
<message> <message>
<source>Diff Current File</source> <source>Diff Current File</source>
<translation type="unfinished"></translation> <translation>Diff für aktuelle Datei</translation>
</message> </message>
<message> <message>
<source>Diff &quot;%1&quot;</source> <source>Diff &quot;%1&quot;</source>
<translation type="unfinished">Diff für &quot;%1&quot;</translation> <translation>Diff für &quot;%1&quot;</translation>
</message> </message>
<message> <message>
<source>Meta+I,Meta+D</source> <source>Meta+I,Meta+D</source>
<translation type="unfinished"></translation> <translation>Meta+I,Meta+D</translation>
</message> </message>
<message> <message>
<source>ALT+I,Alt+D</source> <source>ALT+I,Alt+D</source>
<translation type="unfinished"></translation> <translation>ALT+I,Alt+D</translation>
</message> </message>
<message> <message>
<source>Timeline Current File</source> <source>Timeline Current File</source>
<translation type="unfinished"></translation> <translation>Zeitleiste für aktuelle Datei</translation>
</message> </message>
<message> <message>
<source>Timeline &quot;%1&quot;</source> <source>Timeline &quot;%1&quot;</source>
<translation type="unfinished"></translation> <translation>Zeitleiste für &quot;%1&quot;</translation>
</message> </message>
<message> <message>
<source>Meta+I,Meta+L</source> <source>Meta+I,Meta+L</source>
<translation type="unfinished"></translation> <translation>Meta+I,Meta+L</translation>
</message> </message>
<message> <message>
<source>ALT+I,Alt+L</source> <source>ALT+I,Alt+L</source>
<translation type="unfinished"></translation> <translation>ALT+I,Alt+L</translation>
</message> </message>
<message> <message>
<source>Status Current File</source> <source>Status Current File</source>
<translation type="unfinished">Status der Datei</translation> <translation>Status der aktuellen Datei</translation>
</message> </message>
<message> <message>
<source>Status &quot;%1&quot;</source> <source>Status &quot;%1&quot;</source>
<translation type="unfinished">Status von &quot;%1&quot;</translation> <translation>Status von &quot;%1&quot;</translation>
</message> </message>
<message> <message>
<source>Meta+I,Meta+S</source> <source>Meta+I,Meta+S</source>
<translation type="unfinished"></translation> <translation>Meta+I,Meta+S</translation>
</message> </message>
<message> <message>
<source>ALT+I,Alt+S</source> <source>ALT+I,Alt+S</source>
<translation type="unfinished"></translation> <translation>ALT+I,Alt+S</translation>
</message> </message>
<message> <message>
<source>Add Current File</source> <source>Add Current File</source>
<translation type="unfinished"></translation> <translation>Aktuelle Datei hinzufügen</translation>
</message> </message>
<message> <message>
<source>Add &quot;%1&quot;</source> <source>Add &quot;%1&quot;</source>
<translation type="unfinished">&quot;%1&quot; hinzufügen</translation> <translation>&quot;%1&quot; hinzufügen</translation>
</message> </message>
<message> <message>
<source>Delete Current File...</source> <source>Delete Current File...</source>
<translation type="unfinished"></translation> <translation>Aktuelle Datei löschen...</translation>
</message> </message>
<message> <message>
<source>Delete &quot;%1&quot;...</source> <source>Delete &quot;%1&quot;...</source>
<translation type="unfinished">Lösche &quot;%1&quot;...</translation> <translation>Lösche &quot;%1&quot;...</translation>
</message> </message>
<message> <message>
<source>Revert Current File...</source> <source>Revert Current File...</source>
<translation type="unfinished">Änderungen der Datei rückgängig machen...</translation> <translation>Änderungen der aktuellen Datei rückgängig machen...</translation>
</message> </message>
<message> <message>
<source>Revert &quot;%1&quot;...</source> <source>Revert &quot;%1&quot;...</source>
<translation type="unfinished">Änderungen in &quot;%1&quot; rückgängig machen...</translation> <translation>Änderungen in &quot;%1&quot; rückgängig machen...</translation>
</message> </message>
<message> <message>
<source>Diff</source> <source>Diff</source>
<translation type="unfinished">Diff</translation> <translation>Diff</translation>
</message> </message>
<message> <message>
<source>Timeline</source> <source>Timeline</source>
<translation type="unfinished"></translation> <translation>Zeitleiste</translation>
</message> </message>
<message> <message>
<source>Meta+I,Meta+T</source> <source>Meta+I,Meta+T</source>
<translation type="unfinished"></translation> <translation>Meta+I,Meta+T</translation>
</message> </message>
<message> <message>
<source>ALT+I,Alt+T</source> <source>ALT+I,Alt+T</source>
<translation type="unfinished"></translation> <translation>ALT+I,Alt+T</translation>
</message> </message>
<message> <message>
<source>Revert...</source> <source>Revert...</source>
<translation type="unfinished">Rückgängig machen...</translation> <translation>Rückgängig machen...</translation>
</message> </message>
<message> <message>
<source>Status</source> <source>Status</source>
<translation type="unfinished">Status</translation> <translation>Status</translation>
</message> </message>
<message> <message>
<source>Revert</source> <source>Revert</source>
<translation type="unfinished">Rückgängig machen</translation> <translation>Rückgängig machen</translation>
</message> </message>
<message> <message>
<source>Pull...</source> <source>Pull...</source>
<translation type="unfinished">Pull...</translation> <translation>Pull...</translation>
</message> </message>
<message> <message>
<source>Push...</source> <source>Push...</source>
<translation type="unfinished">Push...</translation> <translation>Push...</translation>
</message> </message>
<message> <message>
<source>Update...</source> <source>Update...</source>
<translation type="unfinished">Auf aktuellen Stand bringen...</translation> <translation>Aktualisieren...</translation>
</message> </message>
<message> <message>
<source>Meta+I,Meta+U</source> <source>Meta+I,Meta+U</source>
<translation type="unfinished"></translation> <translation>Meta+I,Meta+U</translation>
</message> </message>
<message> <message>
<source>ALT+I,Alt+U</source> <source>ALT+I,Alt+U</source>
<translation type="unfinished"></translation> <translation>ALT+I,Alt+U</translation>
</message> </message>
<message> <message>
<source>Commit...</source> <source>Commit...</source>
<translation type="unfinished">Commit...</translation> <translation>Commit...</translation>
</message> </message>
<message> <message>
<source>Meta+I,Meta+C</source> <source>Meta+I,Meta+C</source>
<translation type="unfinished"></translation> <translation>Meta+I,Meta+C</translation>
</message> </message>
<message> <message>
<source>ALT+I,Alt+C</source> <source>ALT+I,Alt+C</source>
<translation type="unfinished"></translation> <translation>ALT+I,Alt+C</translation>
</message> </message>
<message> <message>
<source>Settings ...</source> <source>Settings ...</source>
<translation type="unfinished"></translation> <translation>Einstellungen...</translation>
</message> </message>
<message> <message>
<source>Create Repository...</source> <source>Create Repository...</source>
<translation type="unfinished">Repository erzeugen...</translation> <translation>Repository erzeugen...</translation>
</message> </message>
<message> <message>
<source>Remote repository is not defined.</source> <source>Remote repository is not defined.</source>
<translation type="unfinished"></translation> <translation>Es ist kein entferntes Repository definiert.</translation>
</message> </message>
<message> <message>
<source>Update</source> <source>Update</source>
<translation type="unfinished">Aktualisieren</translation> <translation>Aktualisieren</translation>
</message> </message>
<message> <message>
<source>There are no changes to commit.</source> <source>There are no changes to commit.</source>
<translation type="unfinished">Es sind keine ausstehenden Änderungen vorhanden.</translation> <translation>Es sind keine ausstehenden Änderungen vorhanden.</translation>
</message> </message>
<message> <message>
<source>Unable to create an editor for the commit.</source> <source>Unable to create an editor for the commit.</source>
<translation type="unfinished">Es konnte kein Editor für den Commit angelegt werden.</translation> <translation>Es konnte kein Editor für den Commit angelegt werden.</translation>
</message> </message>
<message> <message>
<source>Unable to create a commit editor.</source> <source>Unable to create a commit editor.</source>
<translation type="unfinished">Es konnte kein Editor für den Commit angelegt werden.</translation> <translation>Es konnte kein Commit-Editor angelegt werden.</translation>
</message> </message>
<message> <message>
<source>Commit changes for &quot;%1&quot;.</source> <source>Commit changes for &quot;%1&quot;.</source>
<translation type="unfinished">Commit der Änderungen in &quot;%1&quot;.</translation> <translation>Commit der Änderungen in &quot;%1&quot;.</translation>
</message> </message>
<message> <message>
<source>Choose Checkout Directory</source> <source>Choose Checkout Directory</source>
<translation type="unfinished"></translation> <translation>Verzeichnis für Checkout wählen</translation>
</message> </message>
<message> <message>
<source>The directory &quot;%1&quot; is already managed by a version control system (%2). Would you like to specify another directory?</source> <source>The directory &quot;%1&quot; is already managed by a version control system (%2). Would you like to specify another directory?</source>
<translation type="unfinished">Das Verzeichnis &quot;%1&quot; steht bereits unter Verwaltung eines Versionskontrollsystems (%2). Möchten Sie einen anderes Verzeichnis angeben?</translation> <translation>Das Verzeichnis &quot;%1&quot; steht bereits unter Verwaltung eines Versionskontrollsystems (%2). Möchten Sie ein anderes Verzeichnis angeben?</translation>
</message> </message>
<message> <message>
<source>Repository already under version control</source> <source>Repository already under version control</source>
<translation type="unfinished">Repository bereits unter Versionskontrolle</translation> <translation>Repository bereits unter Versionskontrolle</translation>
</message> </message>
<message> <message>
<source>Repository Created</source> <source>Repository Created</source>
<translation type="unfinished">Repository erstellt</translation> <translation>Repository erstellt</translation>
</message> </message>
<message> <message>
<source>A version control repository has been created in %1.</source> <source>A version control repository has been created in %1.</source>
<translation type="unfinished">Ein Repository für Versionskontrolle wurde im Verzeichnis %1 erstellt.</translation> <translation>Ein Repository für Versionskontrolle wurde im Verzeichnis %1 erstellt.</translation>
</message> </message>
<message> <message>
<source>Repository Creation Failed</source> <source>Repository Creation Failed</source>
<translation type="unfinished">Fehlschlag bei Erstellung des Repositorys</translation> <translation>Fehlschlag bei Erstellung des Repositorys</translation>
</message> </message>
<message> <message>
<source>A version control repository could not be created in %1.</source> <source>A version control repository could not be created in %1.</source>
<translation type="unfinished">Im Verzeichnis %1 konnte kein Repository für die Versionskontrolle erstellt werden.</translation> <translation>Im Verzeichnis %1 konnte kein Repository für die Versionskontrolle erstellt werden.</translation>
</message> </message>
<message> <message>
<source>Fossil</source> <source>Fossil</source>
<translation type="unfinished"></translation> <translation>Fossil</translation>
</message> </message>
<message> <message>
<source>Specify a revision other than the default?</source> <source>Specify a revision other than the default?</source>
<translation type="unfinished">Möchten Sie eine Revision angeben?</translation> <translation>Möchten Sie eine Revision angeben?</translation>
</message> </message>
<message> <message>
<source>Checkout revision, can also be a branch or a tag name.</source> <source>Checkout revision, can also be a branch or a tag name.</source>
<translation type="unfinished"></translation> <translation>Checkout der Revision erstellen, kann auch der Name eines Branches oder Tags sein.</translation>
</message> </message>
<message> <message>
<source>Revision</source> <source>Revision</source>
<translation type="unfinished">Revision</translation> <translation>Revision</translation>
</message> </message>
<message> <message>
<source>Fossil Command</source> <source>Fossil Command</source>
<translation type="unfinished"></translation> <translation>Fossil-Kommando</translation>
</message> </message>
<message> <message>
<source>Command:</source> <source>Command:</source>
<translation type="unfinished"></translation> <translation>Kommando:</translation>
</message> </message>
<message> <message>
<source>Fossil Repositories</source> <source>Fossil Repositories</source>
<translation type="unfinished"></translation> <translation>Fossil-Repositorys</translation>
</message> </message>
<message> <message>
<source>Default path:</source> <source>Default path:</source>
<translation type="unfinished"></translation> <translation>Vorgabeverzeichnis:</translation>
</message> </message>
<message> <message>
<source>Directory to store local repositories by default.</source> <source>Directory to store local repositories by default.</source>
<translation type="unfinished"></translation> <translation>Vorgabeverzeichnis für lokale Repositorys.</translation>
</message> </message>
<message> <message>
<source>Default user:</source> <source>Default user:</source>
<translation type="unfinished"></translation> <translation>Vorgabe-Benutzer:</translation>
</message> </message>
<message> <message>
<source>Log width:</source> <source>Log width:</source>
<translation type="unfinished"></translation> <translation>Breite des Logs:</translation>
</message> </message>
<message> <message>
<source>The width of log entry line (&gt;20). Choose 0 to see a single line per entry.</source> <source>The width of log entry line (&gt;20). Choose 0 to see a single line per entry.</source>
<translation type="unfinished"></translation> <translation>Die Breite der Zeilen in Logs (&gt;20). Wählen Sie 0, um eine einzelne Zeile pro Eintrag anzuzeigen.</translation>
</message> </message>
<message> <message>
<source>Timeout:</source> <source>Timeout:</source>
<translation type="unfinished">Zeitlimit:</translation> <translation>Zeitlimit:</translation>
</message> </message>
<message> <message>
<source>s</source> <source>s</source>
<translation type="unfinished">s</translation> <translation>s</translation>
</message> </message>
<message> <message>
<source>Log count:</source> <source>Log count:</source>
<translation type="unfinished">Log-Anzeige beschränken auf:</translation> <translation>Log-Anzeige beschränken auf:</translation>
</message> </message>
<message> <message>
<source>The number of recent commit log entries to show. Choose 0 to see all entries.</source> <source>The number of recent commit log entries to show. Choose 0 to see all entries.</source>
<translation type="unfinished"></translation> <translation>Zahl der anzuzeigenden Logeinträge, 0 für unbegrenzt.</translation>
</message> </message>
<message> <message>
<source>Configuration</source> <source>Configuration</source>
<translation type="unfinished">Konfiguration</translation> <translation>Konfiguration</translation>
</message> </message>
<message> <message>
<source>Local Repositories</source> <source>Local Repositories</source>
<translation type="unfinished"></translation> <translation>Lokale Repositorys</translation>
</message> </message>
<message> <message>
<source>User</source> <source>User</source>
<translation type="unfinished">Nutzer</translation> <translation>Nutzer</translation>
</message> </message>
<message> <message>
<source>Miscellaneous</source> <source>Miscellaneous</source>
<translation type="unfinished">Sonstige Einstellungen</translation> <translation>Sonstige Einstellungen</translation>
</message> </message>
<message> <message>
<source>Pull Source</source> <source>Pull Source</source>
<translation type="unfinished"></translation> <translation>Quelle für Pull-Operation</translation>
</message> </message>
<message> <message>
<source>Push Destination</source> <source>Push Destination</source>
<translation type="unfinished"></translation> <translation>Ziel für Push-Operation</translation>
</message> </message>
<message> <message>
<source>Default location</source> <source>Default location</source>
<translation type="unfinished">Vorgabe</translation> <translation>Vorgabe</translation>
</message> </message>
<message> <message>
<source>Local filesystem:</source> <source>Local filesystem:</source>
<translation type="unfinished">Dateisystem:</translation> <translation>Lokales Dateisystem:</translation>
</message> </message>
<message> <message>
<source>Specify URL:</source> <source>Specify URL:</source>
<translation type="unfinished">URL:</translation> <translation>URL:</translation>
</message> </message>
<message> <message>
<source>For example: https://[user[:pass]@]host[:port]/[path]</source> <source>For example: https://[user[:pass]@]host[:port]/[path]</source>
<translation type="unfinished"></translation> <translation>Zum Beispiel: https://[user[:pass]@]host[:port]/[path]</translation>
</message> </message>
<message> <message>
<source>Remember specified location as default</source> <source>Remember specified location as default</source>
<translation type="unfinished">Obige Einstellung als Vorgabe übernehmen</translation> <translation>Angegebenen Ort als Vorgabe übernehmen</translation>
</message> </message>
<message> <message>
<source>Include private branches</source> <source>Include private branches</source>
<translation type="unfinished"></translation> <translation>Private Branches einbeziehen</translation>
</message> </message>
<message> <message>
<source>Allow transfer of private branches.</source> <source>Allow transfer of private branches.</source>
<translation type="unfinished"></translation> <translation>Übertragen von privaten Branches erlauben.</translation>
</message> </message>
<message> <message>
<source>Remote Location</source> <source>Remote Location</source>
<translation type="unfinished"></translation> <translation>Entfernter Ort</translation>
</message> </message>
<message> <message>
<source>Options</source> <source>Options</source>
<translation type="unfinished">Einstellungen</translation> <translation>Einstellungen</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -32653,7 +32655,7 @@ Beispiel: *.cpp%1*.h</translation>
</message> </message>
<message> <message>
<source>Local filesystem:</source> <source>Local filesystem:</source>
<translation>Dateisystem:</translation> <translation>Lokales Dateisystem:</translation>
</message> </message>
<message> <message>
<source>Default Location</source> <source>Default Location</source>
@@ -32813,7 +32815,7 @@ Beispiel: *.cpp%1*.h</translation>
</message> </message>
<message> <message>
<source>Update...</source> <source>Update...</source>
<translation>Auf aktuellen Stand bringen...</translation> <translation>Aktualisieren...</translation>
</message> </message>
<message> <message>
<source>Import...</source> <source>Import...</source>

View File

@@ -4,7 +4,6 @@
#include "exampleslistmodel.h" #include "exampleslistmodel.h"
#include "examplesparser.h" #include "examplesparser.h"
#include "qtsupporttr.h"
#include <QBuffer> #include <QBuffer>
#include <QApplication> #include <QApplication>
@@ -326,61 +325,6 @@ static bool isValidExampleOrDemo(ExampleItem *item)
return ok || debugExamples(); return ok || debugExamples();
} }
static bool sortByHighlightedAndName(ExampleItem *first, ExampleItem *second)
{
if (first->isHighlighted && !second->isHighlighted)
return true;
if (!first->isHighlighted && second->isHighlighted)
return false;
return first->name.compare(second->name, Qt::CaseInsensitive) < 0;
}
static QList<std::pair<Section, QList<ExampleItem *>>> getCategories(
const QList<ExampleItem *> &items, bool sortIntoCategories)
{
static const QString otherDisplayName = Tr::tr("Other", "Category for all other examples");
const bool useCategories = sortIntoCategories
|| qtcEnvironmentVariableIsSet("QTC_USE_EXAMPLE_CATEGORIES");
QList<ExampleItem *> other;
QMap<QString, QList<ExampleItem *>> categoryMap;
if (useCategories) {
for (ExampleItem *item : items) {
const QStringList itemCategories = item->metaData.value("category");
for (const QString &category : itemCategories)
categoryMap[category].append(item);
if (itemCategories.isEmpty())
other.append(item);
}
}
QList<std::pair<Section, QList<ExampleItem *>>> categories;
if (categoryMap.isEmpty()) {
// The example set doesn't define categories. Consider the "highlighted" ones as "featured"
QList<ExampleItem *> featured;
QList<ExampleItem *> allOther;
std::tie(featured, allOther) = Utils::partition(items, [](ExampleItem *i) {
return i->isHighlighted;
});
if (!featured.isEmpty())
categories.append(
{{Tr::tr("Featured", "Category for highlighted examples"), 0}, featured});
if (!allOther.isEmpty())
categories.append({{otherDisplayName, 1}, allOther});
} else {
int index = 0;
const auto end = categoryMap.constKeyValueEnd();
for (auto it = categoryMap.constKeyValueBegin(); it != end; ++it) {
categories.append({{it->first, index, /*maxRows=*/index == 0 ? 2 : 1}, it->second});
++index;
}
if (!other.isEmpty())
categories.append({{otherDisplayName, index, /*maxRows=*/1}, other});
}
const auto end = categories.end();
for (auto it = categories.begin(); it != end; ++it)
sort(it->second, sortByHighlightedAndName);
return categories;
}
void ExamplesViewController::updateExamples() void ExamplesViewController::updateExamples()
{ {
QString examplesInstallPath; QString examplesInstallPath;

View File

@@ -3,7 +3,10 @@
#include "examplesparser.h" #include "examplesparser.h"
#include "qtsupporttr.h"
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/environment.h>
#include <utils/filepath.h> #include <utils/filepath.h>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
@@ -298,4 +301,68 @@ expected_str<QList<ExampleItem *>> parseExamples(const QByteArray &manifestData,
return items; return items;
} }
static bool sortByHighlightedAndName(ExampleItem *first, ExampleItem *second)
{
if (first->isHighlighted && !second->isHighlighted)
return true;
if (!first->isHighlighted && second->isHighlighted)
return false;
return first->name.compare(second->name, Qt::CaseInsensitive) < 0;
}
QList<std::pair<Core::Section, QList<ExampleItem *>>> getCategories(const QList<ExampleItem *> &items,
bool sortIntoCategories)
{
static const QString otherDisplayName = Tr::tr("Other", "Category for all other examples");
const bool useCategories = sortIntoCategories
|| qtcEnvironmentVariableIsSet("QTC_USE_EXAMPLE_CATEGORIES");
QList<ExampleItem *> other;
QMap<QString, QList<ExampleItem *>> categoryMap;
if (useCategories) {
// Append copies of the items and delete the original ones,
// because items might be added to multiple categories and that needs individual items
for (ExampleItem *item : items) {
const QStringList itemCategories = Utils::filteredUnique(
item->metaData.value("category"));
for (const QString &category : itemCategories)
categoryMap[category].append(new ExampleItem(*item));
if (itemCategories.isEmpty())
other.append(new ExampleItem(*item));
}
}
QList<std::pair<Core::Section, QList<ExampleItem *>>> categories;
if (categoryMap.isEmpty()) {
// If we tried sorting into categories, but none were defined, we copied the items
// into "other", which we don't use here. Get rid of them again.
qDeleteAll(other);
// The example set doesn't define categories. Consider the "highlighted" ones as "featured"
QList<ExampleItem *> featured;
QList<ExampleItem *> allOther;
std::tie(featured, allOther) = Utils::partition(items, [](ExampleItem *i) {
return i->isHighlighted;
});
if (!featured.isEmpty()) {
categories.append(
{{Tr::tr("Featured", "Category for highlighted examples"), 0}, featured});
}
if (!allOther.isEmpty())
categories.append({{otherDisplayName, 1}, allOther});
} else {
// All original items have been copied into a category or other, delete.
qDeleteAll(items);
int index = 0;
const auto end = categoryMap.constKeyValueEnd();
for (auto it = categoryMap.constKeyValueBegin(); it != end; ++it) {
categories.append({{it->first, index, /*maxRows=*/index == 0 ? 2 : 1}, it->second});
++index;
}
if (!other.isEmpty())
categories.append({{otherDisplayName, index, /*maxRows=*/1}, other});
}
const auto end = categories.end();
for (auto it = categories.begin(); it != end; ++it)
sort(it->second, sortByHighlightedAndName);
return categories;
}
} // namespace QtSupport::Internal } // namespace QtSupport::Internal

View File

@@ -44,6 +44,9 @@ QTSUPPORT_EXPORT Utils::expected_str<QList<ExampleItem *>> parseExamples(
const Utils::FilePath &demosInstallPath, const Utils::FilePath &demosInstallPath,
bool examples); bool examples);
QTSUPPORT_TEST_EXPORT QList<std::pair<Core::Section, QList<ExampleItem *>>> getCategories(
const QList<ExampleItem *> &items, bool sortIntoCategories);
} // namespace QtSupport::Internal } // namespace QtSupport::Internal
Q_DECLARE_METATYPE(QtSupport::Internal::ExampleItem *) Q_DECLARE_METATYPE(QtSupport::Internal::ExampleItem *)

View File

@@ -12,3 +12,15 @@
#else #else
# define QTSUPPORT_EXPORT Q_DECL_IMPORT # define QTSUPPORT_EXPORT Q_DECL_IMPORT
#endif #endif
#if defined(WITH_TESTS)
# if defined(QTSUPPORT_LIBRARY)
# define QTSUPPORT_TEST_EXPORT Q_DECL_EXPORT
# elif defined(QTSUPPORT_STATIC_LIBRARY)
# define QTSUPPORT_TEST_EXPORT
# else
# define QTSUPPORT_TEST_EXPORT Q_DECL_IMPORT
# endif
#else
# define QTSUPPORT_TEST_EXPORT
#endif

View File

@@ -6,6 +6,7 @@
#include <QtTest> #include <QtTest>
using namespace Core;
using namespace Utils; using namespace Utils;
using namespace QtSupport::Internal; using namespace QtSupport::Internal;
@@ -88,6 +89,7 @@ void tst_Examples::parsing_data()
QTest::addColumn<QString>("videoLength"); QTest::addColumn<QString>("videoLength");
QTest::addColumn<QStringList>("platforms"); QTest::addColumn<QStringList>("platforms");
QTest::addColumn<MetaData>("metaData"); QTest::addColumn<MetaData>("metaData");
QTest::addColumn<QStringList>("categories");
QTest::addRow("example") QTest::addRow("example")
<< QByteArray(R"raw( << QByteArray(R"raw(
@@ -102,6 +104,8 @@ void tst_Examples::parsing_data()
<fileToOpen mainFile="true">widgets/widgets/analogclock/analogclock.cpp</fileToOpen> <fileToOpen mainFile="true">widgets/widgets/analogclock/analogclock.cpp</fileToOpen>
<meta> <meta>
<entry name="category">Graphics</entry> <entry name="category">Graphics</entry>
<entry name="category">Graphics</entry>
<entry name="category">Foobar</entry>
<entry name="tags">widgets</entry> <entry name="tags">widgets</entry>
</meta> </meta>
</example> </example>
@@ -120,13 +124,29 @@ void tst_Examples::parsing_data()
"examples/widgets/widgets/analogclock/analogclock.cpp")} "examples/widgets/widgets/analogclock/analogclock.cpp")}
<< FilePath::fromUserInput("examples/widgets/widgets/analogclock/analogclock.cpp") << FilePath::fromUserInput("examples/widgets/widgets/analogclock/analogclock.cpp")
<< FilePaths() << Example << true << false << false << "" << FilePaths() << Example << true << false << false << ""
<< "" << QStringList() << MetaData({{"category", {"Graphics"}}, {"tags", {"widgets"}}}); << "" << QStringList()
<< MetaData({{"category", {"Graphics", "Graphics", "Foobar"}}, {"tags", {"widgets"}}})
<< QStringList{"Foobar", "Graphics"};
QTest::addRow("no category, highlighted")
<< QByteArray(R"raw(
<examples>
<example name="No Category, highlighted"
isHighlighted="true">
</example>
</examples>
)raw") << /*isExamples=*/true
<< "No Category, highlighted" << QString() << QString() << QStringList()
<< FilePath("examples") << QString() << FilePaths() << FilePath() << FilePaths() << Example
<< /*hasSourceCode=*/false << false << /*isHighlighted=*/true << ""
<< "" << QStringList() << MetaData() << QStringList{"Featured"};
} }
void tst_Examples::parsing() void tst_Examples::parsing()
{ {
QFETCH(QByteArray, data); QFETCH(QByteArray, data);
QFETCH(bool, isExamples); QFETCH(bool, isExamples);
QFETCH(QStringList, categories);
const ExampleItem expected = fetchItem(); const ExampleItem expected = fetchItem();
const expected_str<QList<ExampleItem *>> result const expected_str<QList<ExampleItem *>> result
= parseExamples(data, = parseExamples(data,
@@ -154,7 +174,17 @@ void tst_Examples::parsing()
QCOMPARE(item.videoLength, expected.videoLength); QCOMPARE(item.videoLength, expected.videoLength);
QCOMPARE(item.platforms, expected.platforms); QCOMPARE(item.platforms, expected.platforms);
QCOMPARE(item.metaData, expected.metaData); QCOMPARE(item.metaData, expected.metaData);
qDeleteAll(*result);
const QList<std::pair<Section, QList<ExampleItem *>>> resultCategories = getCategories(*result,
true);
QCOMPARE(resultCategories.size(), categories.size());
for (int i = 0; i < resultCategories.size(); ++i) {
QCOMPARE(resultCategories.at(i).first.name, categories.at(i));
QCOMPARE(resultCategories.at(i).second.size(), 1);
}
for (const auto &category : resultCategories)
qDeleteAll(category.second);
} }
QTEST_APPLESS_MAIN(tst_Examples) QTEST_APPLESS_MAIN(tst_Examples)