Deluan Quintão c583ff57a3
test: add translation validation system with CI integration (#4306)
* feat: add translation validation script and update JSON files

Introduced a new script `validate-translations.sh` to validate the structure
of JSON translation files against an English reference. This script checks
for missing and extra translation keys, ensuring consistency across language
files. Additionally, several JSON files were updated to include new keys
and improve existing translations, enhancing the overall localization
efforts for the application.

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: enhance translation validation script

Updated the translation validation script to improve its functionality and usability. The script now validates JSON translation files against a reference English file, checking for JSON syntax, structural integrity, and reporting missing or extra keys. It also integrates with GitHub Actions for CI/CD, providing annotations for errors and warnings. Additionally, the usage instructions have been clarified, and verbose output options have been added for better debugging.

Signed-off-by: Deluan <deluan@navidrome.org>

* revert translations

Signed-off-by: Deluan <deluan@navidrome.org>

* fix: Hungarian translation JSON structure

Signed-off-by: Deluan <deluan@navidrome.org>

* chore: update testall target in Makefile

Modified the 'testall' target in the Makefile to include 'test-i18n' in the test sequence. This change ensures that internationalization tests are run alongside other tests, improving the overall testing process and ensuring that translation-related issues are caught early in the development cycle.

Signed-off-by: Deluan <deluan@navidrome.org>

* run validation with verbose output

Signed-off-by: Deluan <deluan@navidrome.org>

---------

Signed-off-by: Deluan <deluan@navidrome.org>
2025-07-03 09:59:39 -04:00

561 lines
22 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"languageName": "Magyar",
"resources": {
"song": {
"name": "Szám |||| Számok",
"fields": {
"albumArtist": "Album előadó",
"duration": "Hossz",
"trackNumber": "#",
"playCount": "Lejátszások",
"title": "Cím",
"artist": "Előadó",
"album": "Album",
"path": "Elérési út",
"genre": "Műfaj",
"compilation": "Válogatásalbum",
"year": "Év",
"size": "Fájlméret",
"updatedAt": "Legutóbb frissítve",
"bitRate": "Bitráta",
"bitDepth": "Bitmélység",
"sampleRate": "Mintavételezési frekvencia",
"discSubtitle": "Lemezfelirat",
"starred": "Kedvenc",
"comment": "Megjegyzés",
"rating": "Értékelés",
"quality": "Minőség",
"bpm": "BPM",
"playDate": "Utoljára lejátszva",
"channels": "Csatornák",
"createdAt": "Hozzáadva",
"grouping": "Csoportosítás",
"mood": "Hangulat",
"participants": "További résztvevők",
"tags": "További címkék",
"mappedTags": "Feldolgozott címkék",
"rawTags": "Nyers címkék",
"missing": "Hiányzó"
},
"actions": {
"addToQueue": "Lejátszás útolsóként",
"playNow": "Lejátszás",
"addToPlaylist": "Lejátszási listához adás",
"showInPlaylist": "Megjelenítés a lejátszási listában",
"shuffleAll": "Keverés",
"download": "Letöltés",
"playNext": "Lejátszás következőként",
"info": "Részletek"
}
},
"album": {
"name": "Album |||| Albumok",
"fields": {
"albumArtist": "Album előadó",
"artist": "Előadó",
"duration": "Hossz",
"songCount": "Számok",
"playCount": "Lejátszások",
"name": "Név",
"genre": "Stílus",
"compilation": "Válogatásalbum",
"year": "Év",
"date": "Felvétel dátuma",
"updatedAt": "Legutóbb frissítve",
"comment": "Megjegyzés",
"rating": "Értékelés",
"createdAt": "Létrehozva",
"size": "Méret",
"originalDate": "Eredeti",
"releaseDate": "Kiadva",
"releases": "Kiadó |||| Kiadók",
"released": "Kiadta",
"recordLabel": "Lemezkiadó",
"catalogNum": "Katalógusszám",
"releaseType": "Típus",
"grouping": "Csoportosítás",
"media": "Média",
"mood": "Hangulat",
"missing": "Hiányzó"
},
"actions": {
"playAll": "Lejátszás",
"playNext": "Lejátszás következőként",
"addToQueue": "Lejátszás útolsóként",
"shuffle": "Keverés",
"addToPlaylist": "Lejátszási listához adás",
"download": "Letöltés",
"info": "Részletek",
"share": "Megosztás"
},
"lists": {
"all": "Mind",
"random": "Véletlenszerű",
"recentlyAdded": "Nemrég hozzáadott",
"recentlyPlayed": "Nemrég lejátszott",
"mostPlayed": "Legtöbbször lejátszott",
"starred": "Kedvencek",
"topRated": "Legjobbra értékelt"
}
},
"artist": {
"name": "Előadó |||| Előadók",
"fields": {
"name": "Név",
"albumCount": "Albumok száma",
"songCount": "Számok száma",
"playCount": "Lejátszások",
"rating": "Értékelés",
"genre": "Stílus",
"size": "Méret",
"role": "Szerep",
"missing": "Hiányzó"
},
"roles": {
"albumartist": "Album előadó |||| Album előadók",
"artist": "Előadó |||| Előadók",
"composer": "Zeneszerző |||| Zeneszerzők",
"conductor": "Karmester |||| Karmesterek",
"lyricist": "Szövegíró |||| Szövegírók",
"arranger": "Hangszerelő |||| Hangszerelők",
"producer": "Producer |||| Producerek",
"director": "Rendező |||| Rendezők",
"engineer": "Mérnök |||| Mérnökök",
"mixer": "Keverő |||| Keverők",
"remixer": "Átdolgozó |||| Átdolgozók",
"djmixer": "DJ keverő |||| DJ keverők",
"performer": "Előadóművész |||| Előadóművészek",
"maincredit": "Album előadó vagy előadó |||| Album előadók vagy előadók"
},
"actions": {
"topSongs": "Top számok",
"shuffle": "Keverés",
"radio": "Rádió"
}
},
"user": {
"name": "Felhasználó |||| Felhasználók",
"fields": {
"userName": "Felhasználónév",
"isAdmin": "Admin",
"lastLoginAt": "Utolsó belépés",
"updatedAt": "Legutóbb frissítve",
"name": "Név",
"password": "Jelszó",
"createdAt": "Létrehozva",
"changePassword": "Jelszó módosítása?",
"currentPassword": "Jelenlegi jelszó",
"newPassword": "Új jelszó",
"token": "Token",
"lastAccessAt": "Utolsó elérés"
},
"helperTexts": {
"name": "A névváltoztatások csak a következő bejelentkezéskor jelennek meg"
},
"notifications": {
"created": "Felhasználó létrehozva",
"updated": "Felhasználó frissítve",
"deleted": "Felhasználó törölve"
},
"message": {
"listenBrainzToken": "Add meg a ListenBrainz felhasználó tokened.",
"clickHereForToken": "Kattints ide, hogy megszerezd a tokened"
}
},
"player": {
"name": "Lejátszó |||| Lejátszók",
"fields": {
"name": "Név",
"transcodingId": "Átkódolás",
"maxBitRate": "Max. bitráta",
"client": "Kliens",
"userName": "Felhasználó név",
"lastSeen": "Utoljára bejelentkezett",
"reportRealPath": "Valódi fájlútvonal küldése",
"scrobbleEnabled": "Statisztika küldése külső szolgáltatásoknak"
}
},
"transcoding": {
"name": "Átkódolás |||| Átkódolások",
"fields": {
"name": "Név",
"targetFormat": "Cél formátum",
"defaultBitRate": "Alapértelmezett bitráta",
"command": "Parancs"
}
},
"playlist": {
"name": "Lejátszási lista |||| Lejátszási listák",
"fields": {
"name": "Név",
"duration": "Hossz",
"ownerName": "Tulajdonos",
"public": "Publikus",
"updatedAt": "Frissítve",
"createdAt": "Létrehozva",
"songCount": "Számok",
"comment": "Megjegyzés",
"sync": "Auto-importálás",
"path": "Importálás"
},
"actions": {
"selectPlaylist": "Válassz egy lejátszási listát:",
"addNewPlaylist": "\"%{name}\" létrehozása",
"export": "Exportálás",
"saveQueue": "Műsorlista elmentése lejátszási listaként",
"makePublic": "Publikussá tétel",
"makePrivate": "Priváttá tétel",
"searchOrCreate": "Keress lejátszási listák között vagy hozz létre egyet...",
"pressEnterToCreate": "Nyomj Entert, hogy létrehozz egy lejátszási listát",
"removeFromSelection": "Eltávolítás a kiválasztásból",
"removeSymbol": "×"
},
"message": {
"duplicate_song": "Duplikált számok hozzáadása",
"song_exist": "Egyes számok már hozzá vannak adva a listához. Még egyszer hozzá akarod adni?",
"noPlaylistsFound": "Nem található lejátszási lista",
"noPlaylists": "Nincsenek lejátszási listák"
}
},
"radio": {
"name": "Radió |||| Radiók",
"fields": {
"name": "Név",
"streamUrl": "Stream URL",
"homePageUrl": "Honlap URL",
"updatedAt": "Frissítve",
"createdAt": "Létrehozva"
},
"actions": {
"playNow": "Lejátszás"
}
},
"share": {
"name": "Megosztás |||| Megosztások",
"fields": {
"username": "Megosztotta",
"url": "URL",
"description": "Leírás",
"contents": "Tartalom",
"expiresAt": "Lejárat",
"lastVisitedAt": "Utoljára látogatva",
"visitCount": "Látogatók",
"format": "Formátum",
"maxBitRate": "Max. bitráta",
"updatedAt": "Frissítve",
"createdAt": "Létrehozva",
"downloadable": "Engedélyezed a letöltéseket?"
}
},
"missing": {
"name": "Hiányzó fájl|||| Hiányzó fájlok",
"empty": "Nincsenek hiányzó fájlok",
"fields": {
"path": "Útvonal",
"size": "Méret",
"updatedAt": "Eltűnt ekkor:"
},
"actions": {
"remove": "Eltávolítás",
"remove_all": "Összes eltávolítása"
},
"notifications": {
"removed": "Hiányzó fájl(ok) eltávolítva"
}
}
},
"ra": {
"auth": {
"welcome1": "Köszönjük, hogy a Navidrome-ot telepítetted!",
"welcome2": "A kezdéshez hozz létre egy admin felhasználót!",
"confirmPassword": "Jelszó megerősítése",
"buttonCreateAdmin": "Admin hozzáadása",
"auth_check_error": "Jelentkezz be a folytatáshoz!",
"user_menu": "Profil",
"username": "Felhasználó név",
"password": "Jelszó",
"sign_in": "Bejelentkezés",
"sign_in_error": "A hitelesítés sikertelen. Kérjük, próbáld újra!",
"logout": "Kijelentkezés",
"insightsCollectionNote": "A Navidrome anonim metrikákat gyűjt \na projekt fejlesztéséhez. Kattints [ide],\n információkért és az adatgyűjtésből kilépésért."
},
"validation": {
"invalidChars": "Kérlek, csak betűket és számokat használj!",
"passwordDoesNotMatch": "A jelszó nem egyezik.",
"required": "Szükséges",
"minLength": "Legalább %{min} karakternek kell lennie",
"maxLength": "Legfeljebb %{max} karakternek kell lennie",
"minValue": "Legalább %{min}",
"maxValue": "Legfeljebb %{max} vagy kevesebb",
"number": "Számnak kell lennie",
"email": "Érvényes email címnek kell lennie",
"oneOf": "Az egyiknek kell lennie: %{options}",
"regex": "Meg kell felelnie egy adott formátumnak (regexp): %{pattern}",
"unique": "Egyedinek kell lennie",
"url": "Érvényes URL-nek kell lennie"
},
"action": {
"add_filter": "Szűrő hozzáadása",
"add": "Hozzáadás",
"back": "Vissza",
"bulk_actions": "1 kiválasztott elem |||| %{smart_count} kiválasztott elem",
"cancel": "Mégse",
"clear_input_value": "Üres érték",
"clone": "Klónozás",
"confirm": "Megerősítés",
"create": "Létrehozás",
"delete": "Törlés",
"edit": "Szerkesztés",
"export": "Exportálás",
"list": "Lista",
"refresh": "Frissítés",
"remove_filter": "Szűrő eltávolítása",
"remove": "Eltávolítás",
"save": "Mentés",
"search": "Keresés",
"show": "Megjelenítés",
"sort": "Rendezés",
"undo": "Vísszavonás",
"expand": "Kiterjesztés",
"close": "Bezárás",
"open_menu": "Menü megnyitása",
"close_menu": "Menü bezárása",
"unselect": "Kijelölés megszüntetése",
"skip": "Átugrás",
"bulk_actions_mobile": "1 |||| %{smart_count}",
"share": "Megosztás",
"download": "Letöltés"
},
"boolean": {
"true": "Igen",
"false": "Nem"
},
"page": {
"create": "%{name} létrehozása",
"dashboard": "Műszerfal",
"edit": "%{name} #%{id}",
"error": "Valami probléma történt",
"list": "%{name}",
"loading": "Betöltés",
"not_found": "Nem található",
"show": "%{name} #%{id}",
"empty": "Nincs %{name} még.",
"invite": "Szeretnél egyet hozzáadni?"
},
"input": {
"file": {
"upload_several": "Húzz ide néhány feltöltendő fájlt vagy válassz egyet.",
"upload_single": "Húzz ide egy feltöltendő fájlt vagy válassz egyet."
},
"image": {
"upload_several": "Húzz ide néhány feltöltendő képet vagy válassz egyet.",
"upload_single": "Húzz ide egy feltöltendő képet vagy válassz egyet."
},
"references": {
"all_missing": "Hivatkozási adatok nem találhatóak.",
"many_missing": "Legalább az egyik kapcsolódó hivatkozás már nem elérhető.",
"single_missing": "A kapcsolódó hivatkozás már nem elérhető."
},
"password": {
"toggle_visible": "Jelszó elrejtése",
"toggle_hidden": "Jelszó megjelenítése"
}
},
"message": {
"about": "Rólunk",
"are_you_sure": "Biztos vagy benne?",
"bulk_delete_content": "Biztos, hogy törölni akarod %{name}? |||| Biztos, hogy törölni akarod ezeket az %{smart_count} elemeket?",
"bulk_delete_title": "%{name} törlése |||| %{smart_count} %{name} elem törlése",
"delete_content": "Biztos, hogy törlöd ezt az elemet?",
"delete_title": "%{name} #%{id} törlése",
"details": "Részletek",
"error": "Kliens hiba lépett fel, és a kérést nem lehetett teljesíteni.",
"invalid_form": "Az űrlap érvénytelen. Kérlek, ellenőrizzd a hibákat.",
"loading": "Az oldal betöltődik. Egy pillanat.",
"no": "Nem",
"not_found": "Rossz hivatkozást írtál be, vagy egy rossz linket adtál meg.",
"yes": "Igen",
"unsaved_changes": "Néhány módosítás nem lett elmentve. Biztos, hogy figyelmen kívül akarod hagyni?"
},
"navigation": {
"no_results": "Nincs találat.",
"no_more_results": "Az oldalszám %{page} kívül esik a határokon. Próbáld meg az előző oldalt.",
"page_out_of_boundaries": "Az oldalszám %{page} kívül esik a határokon.",
"page_out_from_end": "Nem lehet az utolsó oldal után menni",
"page_out_from_begin": "Nem lehet az első oldal elé menni",
"page_range_info": "%{offsetBegin}-%{offsetEnd} of %{total}",
"page_rows_per_page": "Elemek oldalanként:",
"next": "Következő",
"prev": "Előző",
"skip_nav": "Ugrás a tartalomra"
},
"notification": {
"updated": "Elem frissítve |||| %{smart_count} elemek frissíteve",
"created": "Elem létrehozva",
"deleted": "Elem törölve |||| %{smart_count} elemek frissítve",
"bad_item": "Hibás elem",
"item_doesnt_exist": "Elem nem létezik",
"http_error": "Szerver kommunikációs hiba",
"data_provider_error": "Adatszolgáltatói hiba. Ellenőrizzd a konzolt a részletekért.",
"i18n_error": "Nem lehet betölteni a fordítást a kért nyelven",
"canceled": "A művelet visszavonva",
"logged_out": "A munkamenet lejárt. Kérlek, csatlakozz újra.",
"new_version": "Új verzió elérhető! Kérlek, frissítsd ezt az ablakot!"
},
"toggleFieldsMenu": {
"columnsToDisplay": "Megjelenítendő oszlopok",
"layout": "Elrendezés",
"grid": "Rács",
"table": "Tábla"
}
},
"message": {
"note": "MEGJEGYZÉS",
"transcodingDisabled": "Az átkódolási konfiguráció módosítása a webes felületen keresztül biztonsági okokból nem lehetséges. Ha módosítani szeretnéd az átkódolási beállításokat, indítsd újra a kiszolgálót a %{config} konfigurációs opcióval.",
"transcodingEnabled": "A Navidrome jelenleg a következőkkel fut %{config}, ez lehetővé teszi a rendszerparancsok futtatását az átkódolási beállításokból a webes felület segítségével. Javasoljuk, hogy biztonsági okokból tiltsd ezt le, és csak az átkódolási beállítások konfigurálásának idejére kapcsold be.",
"songsAddedToPlaylist": "1 szám hozzáadva a lejátszási listához |||| %{smart_count} szám hozzáadva a lejátszási listához",
"noSimilarSongsFound": "Nem találhatóak hasonló számok",
"noTopSongsFound": "Nincsenek top számok",
"noPlaylistsAvailable": "Nem áll rendelkezésre",
"delete_user_title": "Felhasználó törlése '%{name}'",
"delete_user_content": "Biztos, hogy törölni akarod ezt a felhasználót az adataival (beállítások és lejátszási listák) együtt?",
"remove_all_missing_title": "Összes hiányzó fájl eltávolítása",
"remove_all_missing_content": "Biztos, hogy minden hiányzó fájlt törölni akarsz az adatbázisból? Ez minden hozzájuk fűződő referenciát törölni fog, beleértve a lejátszásaikat és értékeléseiket.",
"notifications_blocked": "A böngésződ beállításaiban letiltottad az értesítéseket erre az oldalra.",
"notifications_not_available": "Ez a böngésző nem támogatja az asztali értesítéseket, vagy a Navidrome-ot nem https-en keresztül használod.",
"lastfmLinkSuccess": "Sikeresen összekapcsolva Last.fm-el és halgatott számok küldése engedélyezve.",
"lastfmLinkFailure": "Nem lehet kapcsolódni a Last.fm-hez.",
"lastfmUnlinkSuccess": "Last.fm leválasztva és a halgatott számok küldése kikapcsolva.",
"lastfmUnlinkFailure": "Nem sikerült leválasztani a Last.fm-et.",
"openIn": {
"lastfm": "Megnyitás Last.fm-ben",
"musicbrainz": "Megnyitás MusicBrainz-ben"
},
"lastfmLink": "Bővebben...",
"listenBrainzLinkSuccess": "Sikeresen összekapcsolva ListenBrainz-el. Halgatott számok küldése %{user} felhasználónak engedélyezve.",
"listenBrainzLinkFailure": "Nem lehet kapcsolódni a Listenbrainz-hez: %{error}",
"listenBrainzUnlinkSuccess": "ListenBrainz Last.fm leválasztva és a halgatott számok küldése kikapcsolva.",
"listenBrainzUnlinkFailure": "Nem sikerült leválasztani a ListenBrainz-et.",
"downloadOriginalFormat": "Letöltés eredeti formátumban",
"shareOriginalFormat": "Megosztás eredeti formátumban",
"shareDialogTitle": "Megosztás %{resource} '%{name}'",
"shareBatchDialogTitle": "1 %{resource} megosztása |||| %{smart_count} %{resource} megosztása",
"shareSuccess": "Hivatkozás másolva a vágólapra: %{url}",
"shareFailure": "Hiba történt a hivatkozás %{url} vágólapra másolása közben.",
"downloadDialogTitle": "Letöltés %{resource} '%{name}' (%{size})",
"shareCopyToClipboard": "Másolás vágólapra: Ctrl+C, Enter",
"remove_missing_title": "Hiányzó fájlok eltávolítása",
"remove_missing_content": "Biztos, hogy el akarod távolítani a kiválasztott, hiányó fájlokat az adatbázisból? Ez a művelet véglegesen törölni fog minden hozzájuk kapcsolódó referenciát, beleértve a lejátszások számát és értékeléseket."
},
"menu": {
"library": "Könyvtár",
"settings": "Beállítások",
"version": "Verzió",
"theme": "Téma",
"personal": {
"name": "Személyes",
"options": {
"theme": "Téma",
"language": "Nyelv",
"defaultView": "Alapértelmezett nézet",
"desktop_notifications": "Asztali értesítések",
"lastfmScrobbling": "Halgatott számok küldése a Last.fm-nek",
"listenBrainzScrobbling": "Halgatott számok küldése a ListenBrainz-nek",
"replaygain": "ReplayGain mód",
"preAmp": "ReplayGain előerősítő (dB)",
"gain": {
"none": "Kikapcsolva",
"album": "Album",
"track": "Sáv"
},
"lastfmNotConfigured": "Last.fm API kulcs nincs beállítva"
}
},
"albumList": "Albumok",
"about": "Rólunk",
"playlists": "Lejátszási listák",
"sharedPlaylists": "Megosztott lej. listák"
},
"player": {
"playListsText": "Műsorlista",
"openText": "Megnyitás",
"closeText": "Bezárás",
"notContentText": "Nincs zene",
"clickToPlayText": "Lejátszás",
"clickToPauseText": "Szünet",
"nextTrackText": "Következő szám",
"previousTrackText": "Előző szám",
"reloadText": "Újratöltés",
"volumeText": "Hangerő",
"toggleLyricText": "Zeneszöveg",
"toggleMiniModeText": "Minimalizálás",
"destroyText": "Bezárás",
"downloadText": "Letöltés",
"removeAudioListsText": "Audio listák törlése",
"clickToDeleteText": "Kattints a törléshez %{name}",
"emptyLyricText": "Nincs szöveg",
"playModeText": {
"order": "Sorrendben",
"orderLoop": "Ismétlés",
"singleLoop": "Egy szám ismétlése",
"shufflePlay": "Véletlenszerű"
}
},
"about": {
"links": {
"homepage": "Honlap",
"source": "Forráskód",
"featureRequests": "Funkciókérések",
"lastInsightsCollection": "Legutóbb gyűjtött metrikák",
"insights": {
"disabled": "Kikapcsolva",
"waiting": "Várakozás"
}
},
"tabs": {
"about": "Rólunk",
"config": "Konfiguráció"
},
"config": {
"configName": "Beállítás neve",
"environmentVariable": "Környezeti változó",
"currentValue": "Jelenlegi érték",
"configurationFile": "Konfigurációs fájl",
"exportToml": "Konfiguráció exportálása (TOML)",
"exportSuccess": "Konfiguráció kiexportálva a vágólapra, TOML formában",
"exportFailed": "Nem sikerült kimásolni a konfigurációt",
"devFlagsHeader": "Fejlesztői beállítások (változások/eltávolítás jogát fenntartjuk)",
"devFlagsComment": "Ezek kísérleti beállítások, és a jövőbeli verziókban eltávolíthatók"
}
},
"activity": {
"title": "Aktivitás",
"totalScanned": "Összes beolvasott mappa:",
"quickScan": "Gyors beolvasás",
"fullScan": "Teljes beolvasás",
"serverUptime": "Szerver üzemidő",
"serverDown": "OFFLINE",
"scanType": "Típus",
"status": "Szkennelési hiba",
"elapsedTime": "Eltelt idő"
},
"nowPlaying": {
"title": "Most megy",
"empty": "Nem hallgatsz semmit",
"minutesAgo": "%{smart_count} perce |||| %{smart_count} perce"
},
"help": {
"title": "Navidrome Gyorsbillentyűk",
"hotkeys": {
"show_help": "Mutasd ezt a súgót",
"toggle_menu": "Menu oldalsáv be",
"toggle_play": "Lejátszás / Szünet",
"prev_song": "Előző Szám",
"next_song": "Következő Szám",
"vol_up": "Hangerő fel",
"vol_down": "Hangerő le",
"toggle_love": "Ad hozzá ezt a számot a kedvencekhez",
"current_song": "Aktuális számhoz ugrás"
}
}
}