Skip to content

Commit

Permalink
all translation keys (#336)
Browse files Browse the repository at this point in the history
* all translation keys

* wrong word

* changed some translation labels
added some translations

* updated pyinstaller instructions

* included species labels and radio button labels

* added machine translated german

* added missing localizations and fixed a key

* updated gradio width in browser

* updated some translations

* added settings to gui

* ensure gui-settings.json exists, added to git-ignore

* updated some german translations. removed the restart button label from translations file as it is not used anymore

---------

Co-authored-by: Josef Haupt <[email protected]>
Co-authored-by: Max Mauermann <[email protected]>
  • Loading branch information
3 people authored Jun 4, 2024
1 parent 27e3675 commit f25312f
Show file tree
Hide file tree
Showing 8 changed files with 754 additions and 172 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,6 @@ dmypy.json

train_data/
train_cache.npz
autotune/
autotune/

gui-settings.json
2 changes: 2 additions & 0 deletions BirdNET-Analyzer-full.spec
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ gui = Analysis(
("example/species_list.txt", "example"),
("labels", "labels"),
("gui", "gui"),
("gui-settings.json", "."),
("lang", "lang")
],
hiddenimports=[],
hookspath=["extra-hooks"],
Expand Down
438 changes: 303 additions & 135 deletions gui.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion gui/gui.css
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ footer {
border-radius: 50%;
width: 1rem;
height: 1rem;
}
}
84 changes: 49 additions & 35 deletions gui/gui.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,54 @@
function checkForNewerVersion() {
function sendGetRequest(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => {
if (xhr.status === 200) {
resolve(xhr.responseText);
} else {
reject(new Error(`Request failed with status ${xhr.status}`));
}
};
xhr.onerror = () => {
reject(new Error("Request failed"));
};
xhr.send();
});
}
function init() {
function checkForNewerVersion() {
console.log("Checking for newer version...");

function sendGetRequest(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => {
if (xhr.status === 200) {
resolve(xhr.responseText);
} else {
reject(new Error(`Request failed with status ${xhr.status}`));
}
};
xhr.onerror = () => {
reject(new Error("Request failed"));
};
xhr.send();
});
}

const apiUrl = "https://api.github.com/repos/kahst/BirdNET-Analyzer/releases/latest";

const apiUrl = "https://api.github.com/repos/kahst/BirdNET-Analyzer/releases/latest";
sendGetRequest(apiUrl)
.then(response => {
const current_version = "v" + document.getElementById("current-version").textContent;
const response_object = JSON.parse(response);
const latest_version = response_object.tag_name;

sendGetRequest(apiUrl)
.then(response => {
const current_version = "v" + document.getElementById("current-version").textContent;
const response_object = JSON.parse(response);
const latest_version = response_object.tag_name;
if (current_version !== latest_version) {
const updateNotification = document.getElementById("update-available");

if (current_version !== latest_version) {
const updateNotification = document.getElementById("update-available");
updateNotification.style.display = "block";
const linkElement = updateNotification.getElementsByTagName("a")[0]
linkElement.href = response_object.html_url;
linkElement.target = "_blank";
}
})
.catch(error => {
console.error(error);
});
}

function overwriteStyles() {
console.log("Overwriting styles...");
const styles = document.createElement("style");
styles.innerHTML = "@media (width <= 1024px) { .app {max-width: initial !important;}}";
document.head.appendChild(styles);
}

updateNotification.style.display = "block";
const linkElement = updateNotification.getElementsByTagName("a")[0]
linkElement.href = response_object.html_url;
linkElement.target = "_blank";
}
})
.catch(error => {
console.error(error);
});
checkForNewerVersion();
overwriteStyles();
}
166 changes: 166 additions & 0 deletions lang/de.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
{
"single-tab-title": "Einzelanalyse",
"single-audio-label": "Datei",
"single-tab-output-header-start": "Start (s)",
"single-tab-output-header-end": "Ende (s)",
"single-tab-output-header-sci-name": "Wissenschaftlicher Name",
"single-tab-output-header-common-name": "Trivialname",
"single-tab-output-header-confidence": "Konfidenz",
"inference-settings-accordion-label": "Inferenzeinstellungen",
"inference-settings-confidence-slider-label": "Konfidenz-Schwellenwert",
"inference-settings-confidence-slider-info": "Passen Sie den Schwellenwert an, um Ergebnisse mit einem Wert unter diesem Niveau zu ignorieren.",
"inference-settings-sensitivity-slider-label": "Sensitivität",
"inference-settings-sensitivity-slider-info": "Passen Sie die Verteilung der Vorhersagewerte an. Höhere Werte führen zu höheren Scores.",
"inference-settings-overlap-slider-label": "Überlappung (s)",
"inference-settings-overlap-slider-info": "BirdNET verwendet 3s-Segmente. Bestimmt die Überlappung mit dem vorherigen Segment.",
"inference-settings-fmin-number-label": "Minimale Frequenz des Bandpassfilters (Hz)",
"inference-settings-fmin-number-info": "Beachten Sie, dass Frequenzgrenzen auch während des Trainings verwendet werden sollten, um hier wirksam zu sein.",
"inference-settings-fmax-number-label": "Maximale Frequenz des Bandpassfilters (Hz)",
"inference-settings-fmax-number-info": "Beachten Sie, dass Frequenzgrenzen auch während des Trainings verwendet werden sollten, um hier wirksam zu sein.",
"species-list-accordion-label": "Artenauswahl",
"species-list-radio-label": "Artenliste",
"species-list-radio-info": "Filtern Sie Arten, die in der Ausgabe enthalten sind.",
"species-list-radio-option-custom-list": "Benutzerdefinierte Artenliste",
"species-list-radio-option-predict-list": "Arten nach Standort",
"species-list-radio-option-custom-classifier": "Benutzerdefinierter Klassifikator",
"species-list-radio-option-all": "Alle Arten",
"species-list-custom-list-file-label": "Datei",
"species-list-coordinates-lat-number-label": "Breitengrad",
"species-list-coordinates-lat-number-info": "Breitengrad des Aufnahmestandorts.",
"species-list-coordinates-lon-number-label": "Längengrad",
"species-list-coordinates-lon-number-info": "Längengrad des Aufnahmestandorts.",
"species-list-coordinates-yearlong-checkbox-label": "Ganzjährig",
"species-list-coordinates-week-slider-label": "Woche",
"species-list-coordinates-week-slider-info": "Geben Sie die Woche des Jahres an, in der die Aufnahme gemacht wurde. Jeder Monat ist dabei in vier Wochen unterteilt wird. Wählen Sie einen Wert von 1 bis 48.",
"species-list-coordinates-threshold-slider-label": "Schwellenwert für Standortfilter",
"species-list-coordinates-threshold-slider-info": "Mindestwahrscheinlichkeit für das Auftreten einer Art, um eingeschlossen zu werden.",
"species-list-custom-classifier-selection-button-label": "Klassifikator auswählen",
"analyze-locale-dropdown-label": "Lokalisierung",
"analyze-locale-dropdown-info": "Lokalisierung für die übersetzten Trivialnamen der Arten in der Ausgabe",
"analyze-start-button-label": "Analysieren",
"multi-tab-title": "Batch-Analyse",
"multi-tab-input-selection-button-label": "Eingabeverzeichnis auswählen (rekursiv)",
"multi-tab-samples-dataframe-column-subpath-header": "Unterpfad",
"multi-tab-samples-dataframe-column-duration-header": "Länge",
"multi-tab-samples-dataframe-no-files-found": "Keine Dateien gefunden",
"multi-tab-output-selection-button-label": "Ausgabeverzeichnis auswählen",
"multi-tab-output-textbox-label": "Ausgabeverzeichnis",
"multi-tab-output-textbox-placeholder": "Wenn nicht ausgewählt, wird das Eingabeverzeichnis verwendet.",
"multi-tab-output-accordion-label": "Ausgabeeinstellungen",
"multi-tab-output-radio-label": "Ergebnistyp",
"multi-tab-output-radio-info": "Geben Sie das Ausgabeformat der Klassifikationen an.",
"multi-tab-output-combine-tables-checkbox-label": "Auswahltabellen kombinieren",
"multi-tab-output-combine-tables-checkbox-info": "Aktivieren Sie diese Option, um alle Auswahltabellen in eine einzige Tabelle zusammenzuführen.",
"multi-tab-output-combined-table-name-textbox-label": "Dateiname der kombinierten Tabelle",
"multi-tab-output-combined-table-name-textbox-info": "Name der kombinierten Auswahltabelle.",
"multi-tab-skip-existing-checkbox-label": "Existierende Ergebnisse überspringen",
"multi-tab-skip-existing-checkbox-info": "Dateien überspringen, die bereits ein Ergebnis haben.",
"multi-tab-batchsize-number-label": "Batch-Größe",
"multi-tab-batchsize-number-info": "Anzahl der gleichzeitig zu verarbeitenden Proben.",
"multi-tab-threads-number-label": "Threads",
"multi-tab-threads-number-info": "Anzahl der CPU-Threads.",
"multi-tab-result-dataframe-column-file-header": "Datei",
"multi-tab-result-dataframe-column-execution-header": "Ausführung",
"training-tab-title": "Trainieren",
"training-tab-input-selection-button-label": "Trainingsdaten auswählen",
"training-tab-classes-dataframe-column-classes-header": "Klassen",
"training-tab-select-output-button-label": "Ausgabeverzeichnis für Klassifikator auswählen",
"training-tab-classifier-textbox-info": "Der Name des neuen Klassifikators.",
"training-tab-output-format-radio-label": "Modellausgabeformat",
"training-tab-output-format-radio-info": "Format des trainierten Klassifikators.",
"training-tab-output-format-both": "beide",
"training-tab-autotune-checkbox-label": "Autotune verwenden",
"training-tab-autotune-checkbox-info": "Sucht nach den besten Hyperparametern, benötigt jedoch mehr Zeit.",
"training-tab-autotune-trials-number-label": "Versuche",
"training-tab-autotune-trials-number-info": "Anzahl der Trainingsläufe für die Hyperparametersuche.",
"training-tab-autotune-executions-number-label": "Ausführungen pro Versuch",
"training-tab-autotune-executions-number-info": "Die Anzahl der Wiederholungen für den Trainingslauf mit einem Satz von Hyperparametern (dies reduziert die Varianz).",
"training-tab-epochs-number-label": "Epochen",
"training-tab-epochs-number-info": "Anzahl der Trainingsepochen.",
"training-tab-batchsize-number-label": "Batch-Größe",
"training-tab-batchsize-number-info": "Anzahl der Samples, die in einem Batch verarbeitet werden.",
"training-tab-learningrate-number-label": "Lernrate",
"training-tab-learningrate-number-info": "Lernrate für den Optimizer.",
"training-tab-upsampling-radio-label": "Upsampling-Modus",
"training-tab-upsampling-radio-info": "Balancieren Sie die Trainingsdaten durch Upsampling von Minderheitenklassen aus.",
"training-tab-upsampling-radio-option-repeat": "wiederholen",
"training-tab-upsampling-radio-option-mean": "Durchschnitt",
"training-tab-upsampling-ratio-slider-label": "Upsampling-Verhältnis",
"training-tab-upsampling-ratio-slider-info": "Das Mindestverhältnis für eine Minderheitenklasse im Vergleich zur Mehrheitsklasse nach dem Upsampling.",
"training-tab-hiddenunits-number-label": "Versteckte Einheiten",
"training-tab-hiddenunits-number-info": "Anzahl der versteckten Einheiten. Wenn auf >0 gesetzt, wird ein Klassifikator mit zwei Schichten verwendet.",
"training-tab-use-mixup-checkbox-label": "Mixup verwenden",
"training-tab-use-mixup-checkbox-info": "Mixup ist eine Technik zur Datenvermehrung, die neue Daten durch Mischen zweier Beispiele und ihrer Label erzeugt.",
"training-tab-crop-mode-radio-label": "Zuschneidemodus",
"training-tab-crop-mode-radio-info": "Anpassen, wie Audiodaten zugeschnitten werden, die länger als der Modellinput sind.",
"training-tab-crop-mode-radio-option-center": "Mitte",
"training-tab-crop-mode-radio-option-first": "Erster",
"training-tab-crop-mode-radio-option-segments": "Segmente",
"training-tab-crop-overlap-number-label": "Überlappung des Zuschnittsegments (s)",
"training-tab-crop-overlap-number-info": "Stellen Sie die Überlappung der Trainingssamples ein.",
"training-tab-model-save-mode-radio-label": "Modellspeichermodus",
"training-tab-model-save-mode-radio-info": "'Ersetzen' wird die ursprüngliche Klassifikationsschicht überschreiben, so dass nur die trainierten Klassen bleiben, 'Anhängen' wird die ursprüngliche Klassifikationsschicht mit der neuen kombinieren.",
"training-tab-model-save-mode-radio-option-replace": "ersetzen",
"training-tab-model-save-mode-radio-option-append": "anhängen",
"training-tab-cache-mode-radio-label": "Cache-Modus für Trainingsdaten",
"training-tab-cache-mode-radio-info": "Passen Sie an, wie Trainingsdaten zwischengespeichert werden. Wählen Sie 'keine' für kein Caching, 'laden' zum Laden aus einer Datei und 'speichern' zum Speichern der komprimierten Trainingsdaten.",
"training-tab-cache-mode-radio-option-none": "keine",
"training-tab-cache-mode-radio-option-load": "laden",
"training-tab-cache-mode-radio-option-save": "speichern",
"training-tab-cache-select-directory-button-label": "Wählen Sie das Verzeichnis der Cache-Datei",
"training-tab-cache-file-name-textbox-info": "Der Name der Cache-Datei.",
"training-tab-cache-select-file-button-label": "Wählen Sie den Speicherort der Cache-Datei",
"training-tab-start-training-button-label": "Training starten",
"training-tab-early-stoppage-msg": "Frühzeitig gestoppt - Validierungsmetrik verbessert sich nicht.",
"segments-tab-title": "Segmente",
"segments-tab-select-audio-input-directory-button-label": "Wählen Sie das Audioverzeichnis (rekursiv)",
"segments-tab-select-results-input-directory-button-label": "Wählen Sie das Ergebnisverzeichnis",
"segments-tab-results-input-textbox-placeholder": "Gleich wie das Audioverzeichnis, wenn nicht ausgewählt",
"segments-tab-output-selection-button-label": "Wählen Sie das Ausgabeverzeichnis",
"segments-tab-output-selection-textbox-placeholder": "Gleich wie das Audioverzeichnis, wenn nicht ausgewählt",
"segments-tab-min-confidence-slider-label": "Konfidenz-Schwellenwert",
"segments-tab-min-confidence-slider-info": "Wählt nur Segmente mit einem Wert über diesem Schwellenwert aus.",
"segments-tab-max-seq-number-label": "Maximale Anzahl von Segmenten",
"segments-tab-max-seq-number-info": "Maximale Anzahl von zufällig extrahierten Segmenten pro Art.",
"segments-tab-seq-length-number-label": "Sequenzlänge (s)",
"segments-tab-seq-length-number-info": "Länge der extrahierten Segmente in Sekunden.",
"segments-tab-threads-number-label": "Threads",
"segments-tab-threads-number-info": "Anzahl der CPU-Threads.",
"segments-tab-extract-button-label": "Segmente extrahieren",
"segments-tab-result-dataframe-column-file-header": "Datei",
"segments-tab-result-dataframe-column-execution-header": "Ausführung",
"species-tab-title": "Arten",
"species-tab-select-output-directory-button-label": "Wählen Sie das Ausgabeverzeichnis",
"species-tab-filename-textbox-label": "Name der Datei, wenn nicht angegeben, wird 'species_list.txt' verwendet.",
"species-tab-sort-radio-label": "Sortieren nach",
"species-tab-sort-radio-info": "Sortiert die Arten nach Häufigkeit des Vorkommens oder alphabetisch.",
"species-tab-sort-radio-option-frequency": "Häufigkeit",
"species-tab-sort-radio-option-alphabetically": "alphabetisch",
"species-tab-finish-info": "Artenliste gespeichert unter",
"species-tab-start-button-label": "Artenliste erstellen",
"settings-tab-title": "Einstellungen",
"settings-tab-language-dropdown-label": "GUI Sprache",
"settings-tab-language-dropdown-info": "Wird erst nach Neustart der Anwendung aktiv.",
"validation-no-file-selected": "Bitte wählen Sie eine Datei aus.",
"validation-no-directory-selected": "Bitte wählen Sie ein Verzeichnis.",
"validation-no-species-list-selected": "Bitte wählen Sie eine Artenliste.",
"validation-no-custom-classifier-selected": "Kein benutzerdefinierter Klassifikator ausgewählt.",
"validation-no-audio-files-found": "Keine Audiodateien gefunden.",
"validation-no-training-data-selected": "Bitte wählen Sie Ihre Trainingsdaten.",
"validation-no-directory-for-classifier-selected": "Bitte wählen Sie ein Verzeichnis für den Klassifikator.",
"validation-no-valid-classifier-name": "Bitte geben Sie einen gültigen Namen für den Klassifikator an.",
"validation-no-valid-epoch-number": "Bitte geben Sie eine gültige Anzahl von Epochen an.",
"validation-no-valid-batch-size": "Bitte geben Sie eine gültige Batch-Größe an.",
"validation-no-valid-learning-rate": "Bitte geben Sie eine gültige Lernrate an.",
"validation-no-valid-frequency": "Bitte geben Sie eine gültige Frequenz an",
"validation-no-audio-directory-selected": "Kein Audioverzeichnis ausgewählt",
"progress-preparing": "Vorbereiten",
"progress-starting": "Starten",
"progress-build-classifier": "Daten laden & Klassifikator erstellen",
"progress-loading-data": "Daten für",
"progress-saving": "Gespeichert unter",
"progress-training": "Modell trainieren",
"progress-autotune": "Autotune läuft",
"progress-search": "Dateien suchen",
"footer-help": "Dokumentation und Support finden Sie unter"
}
Loading

0 comments on commit f25312f

Please sign in to comment.