From 9fc65180930445d66a46b6518ea6466ed65a2b80 Mon Sep 17 00:00:00 2001 From: Cody Bromley Date: Tue, 28 Oct 2025 00:23:37 -0500 Subject: [PATCH] feat: add Hungarian (Magyar) translation support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add complete Hungarian localization with 91 translations contributed by Balázs. This release also includes improvements to the translation import tooling to better support international contributors. Changes: - Add Hungarian (hu) language with full translation coverage - Add Balázs to translator credits - Improve blanki18n.swift CSV parser: - Support semicolon-separated CSVs (common in European locales) - Add multi-encoding support (UTF-8, Mac Central European, MacRoman, Windows-1252, ISO Latin-2) - Intelligently detect delimiter and encoding - Fix encoding detection to properly handle Hungarian characters (ő, ű, á, etc.) - Register Hungarian locale in Xcode project (knownRegions) - Update documentation to reflect 11 supported languages - Fix CodeQL workflow scheme name - Bump version to 1.0.13 Thanks to Balázs for the excellent translation work! --- .github/workflows/codeql.yml | 2 +- Blankie.xcodeproj/project.pbxproj | 5 +- Blankie/Localizable.xcstrings | 546 ++++++++++++++++++++++++++++++ Blankie/credits.json | 3 + CHANGELOG.md | 6 + FAQ.md | 1 + README.md | 2 +- blanki18n.swift | 34 +- docs/src/pages/index.astro | 8 +- 9 files changed, 593 insertions(+), 14 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 94b369a..b386656 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -38,7 +38,7 @@ jobs: fi xcodebuild clean build \ -project Blankie.xcodeproj \ - -scheme "Blankie (Universal)" \ + -scheme "Blankie" \ -destination "platform=macOS,arch=x86_64" \ -configuration Debug \ -quiet \ diff --git a/Blankie.xcodeproj/project.pbxproj b/Blankie.xcodeproj/project.pbxproj index 742d3e7..131e9e1 100644 --- a/Blankie.xcodeproj/project.pbxproj +++ b/Blankie.xcodeproj/project.pbxproj @@ -235,6 +235,7 @@ "en-GB", es, fr, + hu, it, ja, ko, @@ -509,7 +510,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.6; - MARKETING_VERSION = 1.0.12; + MARKETING_VERSION = 1.0.13; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; "PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*]" = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -553,7 +554,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.6; - MARKETING_VERSION = 1.0.12; + MARKETING_VERSION = 1.0.13; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; "PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*]" = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Blankie/Localizable.xcstrings b/Blankie/Localizable.xcstrings index ac5b2c4..1a5902c 100644 --- a/Blankie/Localizable.xcstrings +++ b/Blankie/Localizable.xcstrings @@ -207,6 +207,12 @@ "value" : "À propos de Blankie" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A Blankie-ről" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -279,6 +285,12 @@ "value" : "Couleur d’accentuation" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kiemelő szín" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -351,6 +363,12 @@ "value" : "Ajouter un son (bientôt disponible !)" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egyéni hang hozzáadása (hamarosan)" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -423,6 +441,12 @@ "value" : "Tous les sons" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Minden hang" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -495,6 +519,12 @@ "value" : "Toujours démarrer en pause" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mindig csendesen induljon" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -567,6 +597,12 @@ "value" : "Apparence" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kinézet" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -639,6 +675,12 @@ "value" : "Êtes-vous sûr de vouloir supprimer '%@' ? Cette action est irréversible." } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Biztosan törölni szeretnéd a(z) '%@' sablont? Ez a művelet nem vonható vissza" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -711,6 +753,12 @@ "value" : "Comportement" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Behavior" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -783,6 +831,12 @@ "value" : "Oiseaux" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Madárcsicsergés" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -898,6 +952,12 @@ "value" : "Aide de Blankie" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blankie Súgó" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -970,6 +1030,12 @@ "value" : "Paramètres de Blankie" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blankie beállítások" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1085,6 +1151,12 @@ "value" : "Bleu" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kék" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1157,6 +1229,12 @@ "value" : "Bateau" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hajó" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1229,6 +1307,12 @@ "value" : "Marron" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Barna" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1301,6 +1385,12 @@ "value" : "Par" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "által" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1373,6 +1463,12 @@ "value" : "Annuler" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mégsem" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1445,6 +1541,12 @@ "value" : "Ville" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nagyvárosi zaj" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1517,6 +1619,12 @@ "value" : "Fermer" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bezárás" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1589,6 +1697,12 @@ "value" : "Fermer la fenêtre" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ablak bezárása" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1704,6 +1818,12 @@ "value" : "Cody Bromley et les contributeurs. Tous droits réservés." } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cody Bromley és közreműködői. Minden jog fenntartva." + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1776,6 +1896,12 @@ "value" : "Café" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kávézó" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1848,6 +1974,12 @@ "value" : "Contributeurs" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Közreműködők" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1920,6 +2052,12 @@ "value" : "Cyan" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cián" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -1992,6 +2130,12 @@ "value" : "Sombre" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sötét" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2064,6 +2208,12 @@ "value" : "Par défaut" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alapértelmezett" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2136,6 +2286,12 @@ "value" : "Supprimer" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Törlés" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2208,6 +2364,12 @@ "value" : "Supprimer le préréglage" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sablon törlése" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2280,6 +2442,12 @@ "value" : "Développé par" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fejlesztette" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2352,6 +2520,12 @@ "value" : "Modifier le préréglage" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sablon módosítása" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2424,6 +2598,12 @@ "value" : "Édité par" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Módosította" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2496,6 +2676,12 @@ "value" : "Erreur" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiba" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2568,6 +2754,12 @@ "value" : "Feu de Cheminée" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kandalló" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2683,6 +2875,12 @@ "value" : "Vert" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zöld" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2755,6 +2953,12 @@ "value" : "Masquer les sons inactifs" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inaktív hangok elrejtése" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2827,6 +3031,12 @@ "value" : "Si désactivé, Blankie jouera immédiatement votre préréglage le plus récent au lancement" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ha ki van kapcsolva, az alkalmazás futtatásakor a Blankie automatikusan elindul a legutóbbi beállításokkal" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2899,6 +3109,12 @@ "value" : "Indigo" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indigó" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -2970,6 +3186,12 @@ "value" : "Inspiré par Blanket par Rafael Mardojai CM" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rafael Mardojai CM Blanket munkája által inspirálva" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3042,6 +3264,12 @@ "value" : "Raccourcis clavier" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Billentyűparancsok" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3113,6 +3341,12 @@ "value" : "Langue" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nyelv" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3172,6 +3406,12 @@ "value" : "Langue modifiée" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Az alkalmazás nyelve megváltozott" + } + }, "ja" : { "stringUnit" : { "state" : "translated", @@ -3219,6 +3459,12 @@ "value" : "Plus tard" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Később" + } + }, "ja" : { "stringUnit" : { "state" : "translated", @@ -3279,6 +3525,12 @@ "value" : "En savoir plus sur la Licence MIT" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tudj meg többet az MIT Licenszről" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3351,6 +3603,12 @@ "value" : "Clair" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Világos" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3423,6 +3681,12 @@ "value" : "Chargement des préréglages..." } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sablonok betöltése" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3495,6 +3759,12 @@ "value" : "Menthe" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mentazöld" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3567,6 +3837,12 @@ "value" : "Nouveau préréglage" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Új sablon" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3639,6 +3915,12 @@ "value" : "Nouvelle fenêtre" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Új ablak" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3711,6 +3993,12 @@ "value" : "Aucun préréglage personnalisé" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincsenek saját sablonok" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3826,6 +4114,12 @@ "value" : "Ok" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -3898,6 +4192,12 @@ "value" : "Orange" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Narancssárga" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4013,6 +4313,12 @@ "value" : "Rose" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rózsaszín" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4085,6 +4391,12 @@ "value" : "Bruit rose" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pink zaj" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4157,6 +4469,12 @@ "value" : "Lire/Mettre en pause les sons" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hangok lejátszása/szüneteltetése" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4229,6 +4547,12 @@ "value" : "Lecture en pause" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A hanglejátszás szünetel" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4301,6 +4625,12 @@ "value" : "Préférences" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tulajdonságok" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4373,6 +4703,12 @@ "value" : "Préférences..." } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tulajdonságok" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4444,6 +4780,12 @@ "value" : "Préréglage %d" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d sablon" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4516,6 +4858,12 @@ "value" : "Nom du préréglage" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sablon neve" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4588,6 +4936,12 @@ "value" : "Le nom du préréglage ne peut pas être vide" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A sablon neve nem lehet üres" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4660,6 +5014,12 @@ "value" : "Préréglages" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sablonok" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4732,6 +5092,12 @@ "value" : "Domaine public" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Közkincs" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4804,6 +5170,12 @@ "value" : "Violet" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lila" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4876,6 +5248,12 @@ "value" : "Quitter" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kilépés" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -4948,6 +5326,12 @@ "value" : "Quitter Blankie" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kilépés a Blankie-ből" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5020,6 +5404,12 @@ "value" : "Pluie" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eső" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5092,6 +5482,12 @@ "value" : "Rouge" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Piros" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5164,6 +5560,12 @@ "value" : "Renommer le préréglage" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sablon átnevezése" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5236,6 +5638,12 @@ "value" : "Signaler un problème" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiba bejelentése" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5308,6 +5716,12 @@ "value" : "Réinitialiser les sons" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A hangok visszaállítása" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5367,6 +5781,12 @@ "value" : "Redémarrer maintenant" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Újraindítás most" + } + }, "ja" : { "stringUnit" : { "state" : "translated", @@ -5427,6 +5847,12 @@ "value" : "Enregistrer" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mentés" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5499,6 +5925,12 @@ "value" : "Enregistrez votre configuration sonore actuelle comme préréglage pour y accéder rapidement plus tard." } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mentsd el a jelenlegi hangösszeállításodat sablonként, hogy legközelebb gyorsabban elérd azt." + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5571,6 +6003,12 @@ "value" : "Afficher tous les sons" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Az összes hang megjelenítése" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5643,6 +6081,12 @@ "value" : "Licence logicielle" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Szoftver licensz" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5715,6 +6159,12 @@ "value" : "Crédits des sons" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A hanganyagok forrása" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5787,6 +6237,12 @@ "value" : "Mettre une étoile sur GitHub" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Értékeld csillaggal a GitHub-on" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5859,6 +6315,12 @@ "value" : "Orage" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zivatar" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -5931,6 +6393,12 @@ "value" : "Ruisseau" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folyó" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6003,6 +6471,12 @@ "value" : "Nuit d'été" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nyári este" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6075,6 +6549,12 @@ "value" : "Système" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendszer" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6147,6 +6627,12 @@ "value" : "Sarcelle" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Récezöld" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6262,6 +6748,12 @@ "value" : "Le préréglage par défaut ne peut pas être renommé" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Az alapértelmezett sablont nem lehet átnevezni" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6420,6 +6912,12 @@ "value" : "Train" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vasút" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6492,6 +6990,12 @@ "value" : "Traductions" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fordítások" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6564,6 +7068,12 @@ "value" : "Version %@ (%@)" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verziószám: %@ (%@)" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6636,6 +7146,12 @@ "value" : "Vagues" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hullámok" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6708,6 +7224,12 @@ "value" : "Site web" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weboldal" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6780,6 +7302,12 @@ "value" : "Bruit blanc" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehér zaj" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6852,6 +7380,12 @@ "value" : "Vent" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Szél" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6924,6 +7458,12 @@ "value" : "Jaune" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sárga" + } + }, "it" : { "stringUnit" : { "state" : "translated", @@ -6983,6 +7523,12 @@ "value" : "Vous devez redémarrer Blankie pour que le changement de langue prenne effet" } }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Újra kell indítanod a Blankie-t, hogy a nyelvi beállítások alkalmazásra kerüljenek" + } + }, "ja" : { "stringUnit" : { "state" : "translated", diff --git a/Blankie/credits.json b/Blankie/credits.json index 24d0a27..4d96906 100644 --- a/Blankie/credits.json +++ b/Blankie/credits.json @@ -11,6 +11,9 @@ "Italiano": [ "davnr" ], + "Magyar": [ + "Balázs" + ], "Português": [ "Júlio Coelho" ], diff --git a/CHANGELOG.md b/CHANGELOG.md index 66fbdbe..9e3b3a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.0.13] - 2025-10-27 + +### Added + +- Hungarian (Magyar) translation support - thanks to **Balázs** + ## [1.0.12] - 2025-06-01 ### Added diff --git a/FAQ.md b/FAQ.md index 698d9a1..efb7bce 100644 --- a/FAQ.md +++ b/FAQ.md @@ -66,6 +66,7 @@ Blankie is currently available in the following languages: - Español (es) - Français (fr) - Italiano (it) +- Magyar (hu) - 日本語 (ja) - 한국어 (ko) - Português (pt-PT) diff --git a/README.md b/README.md index 3fb7ab1..2440e11 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Blankie helps you focus, relax, and sleep better by creating perfect ambient sou - **Save custom presets** for quick access to your favorite combinations - **Native macOS app** with automatic light/dark mode support - **System integration** with media keys and Control Center -- **7+ languages supported** with more coming soon +- **11 languages supported** with more coming soon ## Installation diff --git a/blanki18n.swift b/blanki18n.swift index 44e4a4d..3846a8a 100755 --- a/blanki18n.swift +++ b/blanki18n.swift @@ -25,16 +25,30 @@ func parseCSV(data: String) -> [CSVRow] { var rows: [CSVRow] = [] let lines = data.components(separatedBy: .newlines) + guard !lines.isEmpty else { return rows } + + // Detect delimiter by counting occurrences in the header line + let header = lines[0] + let semicolonCount = header.components(separatedBy: ";").count - 1 + let commaCount = header.components(separatedBy: ",").count - 1 + let delimiter = semicolonCount > commaCount ? ";" : "," + // Skip header for line in lines.dropFirst() where !line.isEmpty { - let columns = line.components(separatedBy: ",") + let columns = line.components(separatedBy: delimiter) .map { $0.trimmingCharacters(in: .init(charactersIn: "\"")) } if columns.count >= 4 { + // For semicolon CSVs, check both source (index 1) and target (index 2) columns + // Use whichever is non-empty, preferring target if both exist + let sourceValue = columns[1].trimmingCharacters(in: .whitespacesAndNewlines) + let targetValue = columns[2].trimmingCharacters(in: .whitespacesAndNewlines) + let translation = !targetValue.isEmpty ? targetValue : sourceValue + rows.append( CSVRow( key: columns[0], - target: columns[2], + target: translation, state: columns[3] )) } @@ -100,11 +114,19 @@ func readTranslationFile(at path: String) -> [CSVRow] { } return parseJSON(data: fileData) } else if path.hasSuffix(".csv") { - guard let fileData = try? String(contentsOfFile: path, encoding: .utf8) else { - print("Error: Could not read file at \(path)") - exit(1) + // Try multiple encodings (UTF-8, Mac Central European Roman, MacRoman, Windows-1252, ISO Latin-2) + // Mac Central European Roman is for Central/Eastern European languages like Hungarian + let encodings: [String.Encoding] = [.utf8, String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.macCentralEurRoman.rawValue))), .macOSRoman, .windowsCP1252, .isoLatin2] + + for encoding in encodings { + if let fileData = try? String(contentsOfFile: path, encoding: encoding) { + print("Successfully read file using encoding: \(encoding)") + return parseCSV(data: fileData) + } } - return parseCSV(data: fileData) + + print("Error: Could not read file at \(path) with any supported encoding") + exit(1) } else { print("Error: Only CSV and JSON files are supported") exit(1) diff --git a/docs/src/pages/index.astro b/docs/src/pages/index.astro index ec4fa3f..853aa01 100644 --- a/docs/src/pages/index.astro +++ b/docs/src/pages/index.astro @@ -23,11 +23,11 @@ const title = "Ambient sound mixer for macOS";

- 🌍 Now available in Deutsch, Español, Français, Italiano, 日本語, - 한국어, Português, Türkçe and 简体中文! + 🌍 Now available in Deutsch, Español, Français, Italiano, Magyar, 日本語, + 한국어, Português, Türkçe and 简体中文!

- Available in 7 languages, with ongoing community contributions. + Available in 11 languages, with ongoing community contributions.