diff --git a/locales/de.json b/locales/de.json index fbba4850..b6691d46 100644 --- a/locales/de.json +++ b/locales/de.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "Weiter zur nächsten Verwendung", "command.go_to_prev_usage": "Zur vorherigen Verwendung gehen", "command.go_to_range": "Springe zum Bereich", + "command.i18n-ally.deeply-list-glossaries": "Verfügbare Glossare auflisten", + "command.i18n-ally.deeply-update-glossaries": "DeepL-Glossare aktialisieren", + "command.i18n-ally.deeply-update-glossary": "DeepL-Glossar aktualisieren", "command.insert_key": "Schlüssel einfügen", "command.locale_visibility_hide": "Lokalisierung verbergen", "command.locale_visibility_show": "Lokalisierung anzeigen", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "API key für die DeepL translate engine", + "config.deepl_glossary_dir": "Relativer Pfad zum Ordner der die Glossar-CSV-Dateien enthält", "config.deepl_log": "DeepL debug logs anzeigen", "config.deepl_use_free_api_entry": "Kostenlose DeepL Version benutzen", "config.default_namespace": "Globaler Namespace", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "Kommentar löschen, anstatt ihn als behoben zu markieren. ", "config.review_username": "Nutzername zum Überprüfen", "config.show_flags": "Flaggen zusammen mit Lokalisierungscodes anzeigen", + "config.sort_compare": "", "config.sort_keys": "Schlüssel beim speichern von JSON/YAML sortierne", + "config.sort_locale": "", "config.source_language": "Quellsprache für machinelle Übersetzung", "config.tab_style": "Tabulatorstil", "config.target_picking_strategy": "Es wurde eine Strategie gefunden, die mit mehr als einer Lokalisierungsdatei arbeitet.", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} Schlüssel sind in Verwendung", "view.usage_keys_missing": "{0} Schlüssel fehlen", "view.usage_keys_not_in_use": "{0} Schlüssel nicht in Verwendung", - "view.usage_report_none": "Neulanden um Schlüssel Benutzng zu analysieren" + "view.usage_report_none": "Neulanden um Schlüssel Benutzng zu analysieren", + "นามสกุล": "" } diff --git a/locales/en.json b/locales/en.json index 6f9c8b38..e2f67580 100644 --- a/locales/en.json +++ b/locales/en.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "Go to next usage", "command.go_to_prev_usage": "Go to previous usage", "command.go_to_range": "Go to range", + "command.i18n-ally.deeply-list-glossaries": "List available glossaries", + "command.i18n-ally.deeply-update-glossaries": "Update DeepL Glossaries", + "command.i18n-ally.deeply-update-glossary": "Update DeepL Glossary", "command.insert_key": "Insert key", "command.locale_visibility_hide": "Hide locale", "command.locale_visibility_show": "Show locale", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "APP Secret to use Baidu translate engine", "config.baidu_appid": "APP ID to use Baidu translate engine", "config.deepl_api_key": "API key to use DeepL translate engine", + "config.deepl_glossary_dir": "Relative path to the directory that keeps deepl-glossary sources", "config.deepl_log": "Show DeepL engine debug logs", "config.deepl_use_free_api_entry": "Use DeepL Free API entry point", "config.default_namespace": "Global default namespace", @@ -88,8 +92,8 @@ "config.review_remove_on_resolved": "Remove the comment instead of marking it as resolved.", "config.review_username": "Username for reviewing", "config.show_flags": "Show flags along with locale codes", - "config.sort_keys": "Sort keys when saving to JSON/YAML", "config.sort_compare": "Strategy for sorting keys.", + "config.sort_keys": "Sort keys when saving to JSON/YAML", "config.sort_locale": "Locale to with if locale sort is used (will use the file's own locale if not specified)", "config.source_language": "Source language for machine translation", "config.tab_style": "Tab style for locale files", @@ -236,5 +240,6 @@ "view.usage_keys_in_use": "{0} keys are in use", "view.usage_keys_missing": "{0} keys are missing", "view.usage_keys_not_in_use": "{0} keys are NOT in use", - "view.usage_report_none": "Press refresh to start analysing key usage" + "view.usage_report_none": "Press refresh to start analysing key usage", + "นามสกุล": "" } diff --git a/locales/es.json b/locales/es.json index fa1d5e48..2c254c2a 100644 --- a/locales/es.json +++ b/locales/es.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "", "command.go_to_prev_usage": "", "command.go_to_range": "", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "Insertar clave", "command.locale_visibility_hide": "Ocultar configuración regional", "command.locale_visibility_show": "Mostrar configuración regional", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "API key para el traductor DeepL", + "config.deepl_glossary_dir": "", "config.deepl_log": "Mostrar mensajes de depuración del motor DeepL", "config.deepl_use_free_api_entry": "", "config.default_namespace": "", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "Elimina el comentario en lugar de marcarlo como resuelto.", "config.review_username": "Nombre de usuario para la revisión", "config.show_flags": "Mostrar banderas junto a códigos regionales", + "config.sort_compare": "", "config.sort_keys": "Guardar con json/yaml ordenado", + "config.sort_locale": "", "config.source_language": "Código fuente para la traducción automática", "config.tab_style": "Estilo de pestañas para los archivos de localización", "config.target_picking_strategy": "Estrategias que tratan con más de un archivo de localización.", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} claves en uso", "view.usage_keys_missing": "Faltan las claves {0}", "view.usage_keys_not_in_use": "Las claves {0} NO están en uso", - "view.usage_report_none": "Presione actualizar para comenzar a analizar el uso de las teclas" + "view.usage_report_none": "Presione actualizar para comenzar a analizar el uso de las teclas", + "นามสกุล": "" } diff --git a/locales/fr.json b/locales/fr.json index b7ec6728..776cf7e7 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -14,10 +14,13 @@ "command.go_to_next_usage": "Passer à l'utilisation suivante", "command.go_to_prev_usage": "Passer à l'utilisation précédente", "command.go_to_range": "Aller à la plage", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "Insérer une clé", "command.locale_visibility_hide": "Cacher le dossier de la locale", - "command.mark_key_as_in_use": "Marquer cette clé comme « en utilisation »", "command.locale_visibility_show": "Afficher le dossier de la locale", + "command.mark_key_as_in_use": "Marquer cette clé comme « en utilisation »", "command.new_key": "Créer une clé", "command.open_editor": "Ouvrir l'éditeur", "command.open_in_editor": "Ouvrir dans l'éditeur", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "Clé API pour utiliser le moteur de traduction DeepL", + "config.deepl_glossary_dir": "", "config.deepl_log": "Montrer le journal de debug du moteur DeepL", "config.deepl_use_free_api_entry": "Utiliser le point d'entrée gratuite de DeepL", "config.default_namespace": "Espace de nom global par défaut", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "Supprimez le commentaire au lieu de le marquer comme résolu.", "config.review_username": "Nom d'utilisateur pour la revue", "config.show_flags": "Montrer les drapeaux avec les codes des locales", + "config.sort_compare": "", "config.sort_keys": "Sauvegarder et trier JSON/yaml", + "config.sort_locale": "", "config.source_language": "Langage source pour la traduction par machine", "config.tab_style": "Style de tabulation pour les fichiers de la locale", "config.target_picking_strategy": "Stratégie de gestion avec plusieurs fichiers de locale ont été trouvés.", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} clé(s) en utilisation.", "view.usage_keys_missing": "{0} clé(s) manquante(s)", "view.usage_keys_not_in_use": "{0} clé(s) non-utilisée(s).", - "view.usage_report_none": "Appuyez sur rafraîchir pour commencer l'analyse de l'utilisation des clés." + "view.usage_report_none": "Appuyez sur rafraîchir pour commencer l'analyse de l'utilisation des clés.", + "นามสกุล": "" } diff --git a/locales/hu.json b/locales/hu.json index 677bd2b5..f795d26e 100644 --- a/locales/hu.json +++ b/locales/hu.json @@ -1,235 +1,245 @@ { -"command.config_display_language": "Megjelenítési nyelv megváltoztatása", -"command.config_locales": "Locale elérési útvonal manuális konfigurálása", -"command.config_locales_auto": "Locale elérési útvonal automatikus érzékelése", -"command.config_source_language": "Forrásnyelv megváltoztatása", -"command.copy_key": "I18n kulcs másolása", -"command.deepl_usage": "DeepL API használata", -"command.delete_key": "Kulcs törlése", -"command.duplicate_key": "Kulcs kettőzése", -"command.edit_key": "Fordítás szerkesztése", -"command.extract.disable-auto-detect": "Auto-detektálás kikapcsolása", -"command.extract.enable-auto-detect": "Auto-detektálás bekapcsolása", -"command.fulfill_keys": "Kulcsok kitöltése üres karakterekkel", -"command.go_to_next_usage": "További használatokhoz ugrás", -"command.go_to_prev_usage": "Előző használatokhoz ugrás", -"command.go_to_range": "Ugrás tartományhoz", -"command.insert_key": "Kulcs beszúrása", -"command.locale_visibility_hide": "Locale elrejtése", -"command.locale_visibility_show": "Locale megjelenítése", -"command.mark_key_as_in_use": "Kulcs jelölése, hogy a 'használatban' van", -"command.new_key": "Új kulcs létrehozása", -"command.open_editor": "Szerkesztő megnyitása", -"command.open_in_editor": "Megnyitás szerkesztőben", -"command.open_key": "Ugrás definícióra", -"command.open_review": "Review megnyitása", -"command.open_url": "URL megnyitása", -"command.possible_hard_string": "Lehetséges kemény karakterlánc", -"command.refresh_usage": "Használat jelentés frissítése", -"command.rename_key": "Kulcs átnevezése", -"command.set_display_language": "Beállítás megjelenítési nyelvként", -"command.set_source_language": "Forrás nyelv beállítása", -"command.show_docs": "Dokumentáció megjelenítése", -"command.translate_key": "Fordítás", -"command.translate_key_from": "Fordítás a következő nyelvről: {0}", -"config.annotation_delimiter": "Az annotáció határolója", -"config.annotation_in_place": "Az annotáció helyben történik, nem a végére kerül.", -"config.annotation_max_length": "A maximális karakterhossz, amely megjelenik az inline annotációban. A felesleges karakterek pontokkal (...)-al jelennek meg.", -"config.annotations": "Inline annotációk engedélyezése.", -"config.auto_detection": "Engedélyezze a lokális automatikus érzékelést a projektekhez", -"config.deepl_api_key": "Az API-kulcs a DeepL fordítómotor használatához", -"config.deepl_log": "A DeepL engine DEBUG naplózásának megjelenítése", -"config.deepl_use_free_api_entry": "Használja a DeepL Free API bejáratot", -"config.default_namespace": "Globális alapértelmezett névtér", -"config.deprecated": "Elavult. Az i18n-ally. prefixet kell helyette használni.", -"config.derived_keys": "Szabályok a származtatott kulcsok jelöléséhez a használati jelentésben.", -"config.dir_structure": "A locale fájlok rendezésére használt preferált könyvtárstruktúra", -"config.disable_path_parsing": "Az útvonal feloldása letiltva", -"config.disabled": "Az i18n Ally letiltása a projektben", -"config.display_language": "Megjelenítendő nyelv", -"config.editor_prefer_editor": "Az előnyösebb szerkesztő használata lokálisan való szerkesztésre.", -"config.enabled_frameworks": "A támogatott keretrendszerek megadása. Ha nincs érték beállítva, az kiterjesztés automatikusan felismeri a keretrendszereket.", -"config.enabled_parsers": "Locale fájlformátum elemzők. Alapértelmezetten az aktivál megfelelő keretrendszerek fogják kezelni.", -"config.encoding": "Fájlkódolás locale fájlok olvasásához és írásához", -"config.full_reload_on_changed": "Teljes frissítést hajt végre a lokális fájl változtatásokon. (a .js/.ts dinamikus importálásra vonatkozik)", -"config.google_api_key": "API-kulcs a Google Fordítóhoz (opcionális)", -"config.ignore_files": "Locale fájlok figyelmen kívül hagyása betöltéskor. Egy globális tömböt fogad.", -"config.ignored_locales": "Hogy mely nyelveket kell figyelmen kívül hagyni", -"config.include_subfolders": "A könyvtárak alatt rekurzívan keresés", -"config.indent": "Az indentálás mérete a locale fájlokban.", -"config.keep_fulfill": "Mindig tartsa a kulcsokat kitöltve üres karakterekkel", -"config.key_max_length": "Ha megadott, a kinyert kulcs ezen a karakterhosszon lesz vágva (a keyPrefix kivételével). Alapértelmezett az elsődleges.", -"config.key_prefix": "Egy string a kinyerendő kulcshoz. használhatja a {fileName} -t a fájlnévért és a {fileNameWithoutExt} -t a fájlnév legelső pontja előtti részéért.", -"config.keygen_strategy": "A kulcs generálási stratégiája", -"config.keygen_style": "Az esetstílus a kulcs generálásához.", -"config.keys_in_use": "A kulcsok jelölése használatban, még akkor is, ha nem jelennek meg a kódban.", -"config.keystyle": "A kulcs stílusa", -"config.language_tag_system": "A nyelvi címke rendszerének használata.", -"config.libretranslate_api_root": "LibreTranslate API root URL-je", -"config.locale_country_map": "Egy objektum a két karakteres locale-kódokat országkódra képző szolgáltatáshoz.", -"config.locales_paths": "Az elérési utak a locale fájlokhoz (a projekt gyökere relativ elérési útvonala). Globális mintát is elfogad.", -"config.namespace": "Névterek engedélyezése. További információért lásd a dokumentációt.", -"config.openai_api_key": "", -"config.openai_api_model": "", -"config.openai_api_root": "", -"config.path_matcher": "A locale / névterekhez tartozó egyezési út. További információért lásd a dokumentációt.", -"config.preferred_delimiter": "Az összetett kulcsú útvonalak preferált határolója, alapértelmezetten az - (kötőjel)", -"config.prompt_translating_source": "Mindig kérdezze meg forrás nyelvre fordításkor. Ha hamisra van állítva, a konfigurációban megadott forrásnyelv lesz használva.", -"config.readonly": "Csak olvasás módban", -"config.refactor_templates": "Az sablonok tömbje. A {key} helyettesítő kulcsokat használja ezekben.", -"config.regex_key": "RegEx string a kulcshoz", -"config.regex_usage_match": "RegEx-szal egyező kulcsfelhasználások tömbje a kódban. Felül fogja írni a keretrendszerek által biztosított Regexet.", -"config.regex_usage_match_append": "RegEx-szal egyező kulcsfelhasználások tömbje a kódban. A \"regex.usageMatch\"-tól eltérően hozzáadja a Regex listához, ahelyett, hogy kicserélné azt.", -"config.review_email": "Az értékeléshez használt e-mail cím, ami a Gravatar-kép profilképként is szolgál.", -"config.review_enabled": "Az értékelési rendszer engedélyezése", -"config.review_gutters": "Az értékelési panel megjelenítése az oldalsávban", -"config.review_remove_on_resolved": "A megjegyzést eltávolítja, és nem jelöli meg az áthidalás után.", -"config.review_username": "Felhasználónév az értékeléshez", -"config.show_flags": "Zászlók megjelenítése a nyelvi kódok mellett", -"config.sort_keys": "Kulcsok rendezése a JSON/YAML mentésekor", -"config.source_language": "A forrásnyelv a gépi fordításhoz", -"config.tab_style": "Fülstílus a nyelvi fájlokhoz", -"config.target_picking_strategy": "Azonosító, ami meghatározza, hogy mit kell tenni, ha több mint egy nyelvi fájl található.", -"config.target_picking_strategy.file-previous": "A szöveg kinyerése az aktuális fájl előzőleg kiválasztott nyelvi fájljából", -"config.target_picking_strategy.global-previous": "A szöveg kinyerése az (aktuális vagy más) fájl előzőleg kiválasztott nyelvi fájljából", -"config.target_picking_strategy.most-similar": "Automatikusan kinyeri a szöveget a fájlból, amelyiknek az elérési útja leginkább hasonlít az aktuális fájl elérési útjához", -"config.target_picking_strategy.none": "A felhasználó manuálisan választja ki, hogy melyik fájlba kell kinyerni a szöveget", -"config.translate.engines": "Fordítási szolgáltatások.", -"config.translate.fallbackToKey": "Használja magát a kulcsot fordításhoz, ha nincs forrásszöveg a kulcshoz.", -"config.translate.parallels": "A fordítási munkások maximális száma egyszerre.", -"config.translate_override_existing": "Meglévő üzenetek felülírása fordításkor", -"config.translate_save_as_candidates": "A fordítási eredményeket \"Fordítási javaslatok\"-ba mentse el, helyettük ne írja a helyi fájlokba.", -"config.usage.scanning_ignore": "A kulcsok használatának bejárására figyelmen kívül hagyott globális minták", -"editor.add_description": "Leírás hozzáadása...", -"editor.empty": "(üres)", -"editor.title": "i18n Ally szerkesztő", -"editor.translate": "Fordítás", -"editor.translate_all_missing": "Az összes hiányzó fordítás lefordítása", -"errors.keystyle_not_set": "A kulcsstílus nincs megadva, a művelet megszakítva.", -"errors.translating_empty_source_value": "\"{0}\" forrásfordítása nem található. A fordítás megszakítva.", -"errors.translating_same_locale": "Nem lehet ugyanabba a nyelvi környezetbe fordítani.", -"errors.translating_unknown_error": "Ismeretlen hiba történt a fordítás során.", -"errors.unsupported_file_type": "Nem támogatott fájltípus: \"{0}\"", -"errors.write_in_readonly_mode": "Írás a csak olvasható módban történő mentés letiltva.", -"extname": "i18n Ally", -"feedback.document": "Dokumentáció olvasása", -"feedback.github": "Csillagozás a GitHub-on", -"feedback.report_issues": "Problémák jelentése", -"feedback.support": "Támogatásunkat nyújtsa", -"feedback.twitter_feedback": "Visszajelzés küldése", -"misc.missing_key": "{0}: Az i18n kulcs \"{1}\" nem létezik", -"misc.missing_translation": "{0}: Hiányzik a fordítás a következőhöz: \"{1}\"", -"notification.migrate": "Migrálás", -"notification.v2-update": "Az i18n Ally frissítve lett a 2.0-ra!\nKérjük, nézze meg a migrációs útmutatót.", -"prompt.applying_suggestion": "Az alábbi javaslatot alkalmazza a(z) \"{0}\" kulcsra?\n\n{1}", -"prompt.applying_translation_candidate": "Az alábbi fordítást alkalmazza a(z) \"{0}\" kulcsra?\n\n{1}", -"prompt.applying_translation_candidate_multiple": "Biztosan alkalmazza az összes {0} fordítást?", -"prompt.button_apply": "Alkalmaz", -"prompt.button_cancel": "Mégse", -"prompt.button_discard": "Elvetés", -"prompt.button_edit_end_apply": "Szerkesztés", -"prompt.button_override": "Felülírás", -"prompt.button_reenter": "Újra megadás", -"prompt.button_skip": "Folytatás felülírás nélkül", -"prompt.button_yes": "Igen", -"prompt.choice_key_to_insert": "Válasszon egy kulcsot a beszúráshoz", -"prompt.choice_key_to_open": "Válasszon egy kulcsot az editor megnyitásához...", -"prompt.choice_locale": "Válasszon nyelvi területet", -"prompt.config_locales_auto_success": "A nyelvi területek elérési útja automatikusan beállítva erre: \"{0}\".", -"prompt.config_locales_button": "Beállítás most", -"prompt.config_locales_info": "Állítsa be a nyelvi területek könyvtárát a projektjéhez", -"prompt.config_locales_success": "Nyelvi területek sikeresen beállítva.", -"prompt.create_new_path": "Új útvonal létrehozása", -"prompt.deepl_api_key_required": "DeepL API kulcs szükséges", -"prompt.deepl_error_get_usage": "Hiba történt a használati adatok lekérdezésekor", -"prompt.deepl_usage": "DeepL API használat {0} karakter fordításból {1}-ből", -"prompt.delete_key": "Biztosan eltávolítja a(z) \"{0}\" kulcsot az összes nyelvi területről?\n\nEz a művelet nem vonható vissza.", -"prompt.delete_keys_not_in_use": "Biztosan eltávolítja azokat a kulcsokat ({0 darabot), amelyeket nem használnak?\n\nEz a művelet nem vonható vissza.", -"prompt.donate": "Adományozás", -"prompt.edit_key_in_locale": "{1} | A(z) \"{0}\" kulcs szerkesztése", -"prompt.enter_file_path_to_store_key": "Írja be a fájl elérési útvonalát a(z) \"{0}\" kulcs tárolásához", -"prompt.enter_key_path": "Adja meg a(z) \"{0}\" kulcs elérési útvonalát", -"prompt.enter_new_keypath": "Adja meg az új kulcs elérési útvonalát", -"prompt.error_on_parse_custom_regex": "Nem sikerült értelmezni a(z) {0} RegEx karakterláncot. Ellenőrizze a konfigurációját.", -"prompt.existing_translation": "Meglévő fordítás", -"prompt.extraction_canceled": "Kinyerés megszakítva", -"prompt.failed_to_locate_key": "Nem sikerült megtalálni a(z) \"{0}\" kulcsot.", -"prompt.frameworks_not_found": "Az alábbi keretrendszer(ek) nem található(k). Ellenőrizze a beállításait.\n{0}", -"prompt.fullfill_missing_all_confirm": "Biztosan kívánja az összes hiányzó kulcsot üres karakterláncokkal kiegészíteni az összes nyelvi lokalizációban?\n\nEz a művelet nem visszavonható!", -"prompt.fullfill_missing_confirm": "Biztosan kívánja a(z) {0} hiányzó kulcsot üres karakterláncokkal kiegészíteni a(z) {1} lokalizációban?\n\nEz a művelet nem visszavonható!", -"prompt.invalid_keypath": "Érvénytelen kulcs elérési út!", -"prompt.key_already_exists": "A kulcs már létezik. Szeretné felülírni az meglévő értéket vagy újra megadni az elérési utat?", -"prompt.key_copied": "A kulcs másolva lett.", -"prompt.keys_removed": "{0} kulcs eltávolítva", -"prompt.keystyle_flat": "Sík stílus", -"prompt.keystyle_flat_example": "például: { \"a.b.c\": \"...\" }", -"prompt.keystyle_nested": "Beágyazott stílus", -"prompt.keystyle_nested_example": "például: { \"a\": { \"b\": { \"c\": \"...\" } } }", -"prompt.keystyle_select": "Milyen kulcsstílust használ a lokalizációk szervezéséhez?", -"prompt.locales_dir_not_found": "A lokalizációs könyvtár nem található. Az i18n Ally ki van kapcsolva.", -"prompt.new_key_path": "Adja meg az új kulcs elérési útját", -"prompt.no_locale_loaded": "Nincsenek betöltött lokalizációs fájlok. Valószínűleg hiba van a projekt konfigurációjában.", -"prompt.replace_text_as": "Szöveg helyettesítése:", -"prompt.select_display_locale": "Válassza ki a megjelenítendő nyelvet ({0})", -"prompt.select_file_to_open": "Válassza ki a megnyitandó fájlt", -"prompt.select_file_to_store_key": "Válassza ki a fájlt, amelyben tárolni kívánja a(z) \"{0}\" kulcsot", -"prompt.select_source_language_for_translating": "Válassza ki a forrásnyelvet a fordításhoz ({0})", -"prompt.select_source_locale": "Válassza ki a forrás lokalizációt ({0})", -"prompt.show_error_log": "Naplózás megjelenítése", -"prompt.star_on_github": "Csillagozza az i18n Ally-t a GitHub-on", -"prompt.support": "Az i18n Ally mindenki számára ingyenesen elérhető. Ha hasznosnak találja, kérjük, fontolja meg a támogatását. Köszönjük! ❤", -"prompt.translate_cancelled_multiple": "\"{0}\" kulcs fordítása megszakítva.", -"prompt.translate_done_multiple": "\"{0}\" kulcs lefordítva.", -"prompt.translate_done_single": "\"{0}\" fordítása kész.", -"prompt.translate_edit_translated": "Eredmény szerkesztése", -"prompt.translate_failed_multiple": "\"{0}\" kulcs fordítása sikertelen.", -"prompt.translate_failed_single": "\"{0}\" fordítása \"{1}\" nyelvre sikertelen.", -"prompt.translate_in_progress": "Fordítás folyamatban", -"prompt.translate_multiple_confirm": "Biztos, hogy le szeretné fordítani a(z) {0} kulcsot?", -"prompt.translate_no_jobs": "Nincs szükség fordításra.", -"prompt.writing_js": "A js/ts fájlok írása nem támogatott.", -"refactor.extract_ignore": "\"{0}\" detektálásának figyelmen kívül hagyása globálisan", -"refactor.extract_ignore_by_file": "\"{0}\" detektálásának figyelmen kívül hagyása az aktuális fájlban", -"refactor.extract_text": "🌍 Szöveg kivonása i18n üzenetekbe", -"refactor.extracting_not_support_for_lang": "A(z) \"{0}\" nyelvre való kivonás még nem támogatott", -"refactor.replace_with": "Szöveg cseréje a meglévő fordítással: \"{0}\"", -"review.accept_suggestion": "Javaslat elfogadása", -"review.apply_suggestion": "Javaslat alkalmazása", -"review.apply_translation_candidate": "Fordítási jelölt alkalmazása", -"review.approve": "Jóváhagyás", -"review.comment": "Megjegyzés", -"review.edit": "Szerkesztés", -"review.leave_comment": "Megjegyzés hozzáadása", -"review.optional": "(Opcionális)", -"review.placeholder.approve": "Jóváhagyva", -"review.placeholder.comment": "Nem mondott semmit", -"review.placeholder.request_change": "Változtatás kérés", -"review.request_change": "Változtatás kérése", -"review.request_change_messages": "Változtatás kérése", -"review.resolve": "Megoldás", -"review.resolve_all": "Összes megoldása", -"review.review": "Felülvizsgálat", -"review.suggestion": "Javaslat", -"review.suggestions": "Javaslatok", -"review.title": "i18n Ally Felülvizsgálata", -"review.translation_candidates": "Fordítási Jelöltek", -"review.unknown_user": "Ismeretlen", -"view.current_file": "Aktuális fájl", -"view.current_file_hard_strings": "Keménykódolt szövegek [béta]", -"view.current_file_hard_strings_expand_to_detect": "(Kiterjesztés az érzékeléshez)", -"view.current_file_hard_strings_not_supported": "A(z) \"{0}\" még nem támogatott", -"view.current_file_keys_in_use": "Használatban lévő kulcsok", -"view.current_file_keys_not_found": "Kulcsok nem találhatók", -"view.help_feedback": "Súgó és Visszajelzés", -"view.i18n_keys": "i18n Ally", -"view.progress": "Folyamat", -"view.progress_submenu.empty_keys": "Üres", -"view.progress_submenu.missing_keys": "Nincs fordítás", -"view.progress_submenu.translated_keys": "Lefordítva", -"view.tree": "Könyvtárszerkezet", -"view.usage": "Használati jelentés", -"view.usage_keys_in_use": "{0} kulcs használatban van", -"view.usage_keys_missing": "{0} kulcs hiányzik", -"view.usage_keys_not_in_use": "{0} kulcs NEM használatban van", -"view.usage_report_none": "Az elemzés megkezdéséhez nyomja meg a frissítés gombot" + "command.config_display_language": "Megjelenítési nyelv megváltoztatása", + "command.config_locales": "Locale elérési útvonal manuális konfigurálása", + "command.config_locales_auto": "Locale elérési útvonal automatikus érzékelése", + "command.config_source_language": "Forrásnyelv megváltoztatása", + "command.copy_key": "I18n kulcs másolása", + "command.deepl_usage": "DeepL API használata", + "command.delete_key": "Kulcs törlése", + "command.duplicate_key": "Kulcs kettőzése", + "command.edit_key": "Fordítás szerkesztése", + "command.extract.disable-auto-detect": "Auto-detektálás kikapcsolása", + "command.extract.enable-auto-detect": "Auto-detektálás bekapcsolása", + "command.fulfill_keys": "Kulcsok kitöltése üres karakterekkel", + "command.go_to_next_usage": "További használatokhoz ugrás", + "command.go_to_prev_usage": "Előző használatokhoz ugrás", + "command.go_to_range": "Ugrás tartományhoz", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", + "command.insert_key": "Kulcs beszúrása", + "command.locale_visibility_hide": "Locale elrejtése", + "command.locale_visibility_show": "Locale megjelenítése", + "command.mark_key_as_in_use": "Kulcs jelölése, hogy a 'használatban' van", + "command.new_key": "Új kulcs létrehozása", + "command.open_editor": "Szerkesztő megnyitása", + "command.open_in_editor": "Megnyitás szerkesztőben", + "command.open_key": "Ugrás definícióra", + "command.open_review": "Review megnyitása", + "command.open_url": "URL megnyitása", + "command.possible_hard_string": "Lehetséges kemény karakterlánc", + "command.refresh_usage": "Használat jelentés frissítése", + "command.rename_key": "Kulcs átnevezése", + "command.set_display_language": "Beállítás megjelenítési nyelvként", + "command.set_source_language": "Forrás nyelv beállítása", + "command.show_docs": "Dokumentáció megjelenítése", + "command.translate_key": "Fordítás", + "command.translate_key_from": "Fordítás a következő nyelvről: {0}", + "config.annotation_delimiter": "Az annotáció határolója", + "config.annotation_in_place": "Az annotáció helyben történik, nem a végére kerül.", + "config.annotation_max_length": "A maximális karakterhossz, amely megjelenik az inline annotációban. A felesleges karakterek pontokkal (...)-al jelennek meg.", + "config.annotations": "Inline annotációk engedélyezése.", + "config.auto_detection": "Engedélyezze a lokális automatikus érzékelést a projektekhez", + "config.baidu_app_secret": "", + "config.baidu_appid": "", + "config.deepl_api_key": "Az API-kulcs a DeepL fordítómotor használatához", + "config.deepl_glossary_dir": "", + "config.deepl_log": "A DeepL engine DEBUG naplózásának megjelenítése", + "config.deepl_use_free_api_entry": "Használja a DeepL Free API bejáratot", + "config.default_namespace": "Globális alapértelmezett névtér", + "config.deprecated": "Elavult. Az i18n-ally. prefixet kell helyette használni.", + "config.derived_keys": "Szabályok a származtatott kulcsok jelöléséhez a használati jelentésben.", + "config.dir_structure": "A locale fájlok rendezésére használt preferált könyvtárstruktúra", + "config.disable_path_parsing": "Az útvonal feloldása letiltva", + "config.disabled": "Az i18n Ally letiltása a projektben", + "config.display_language": "Megjelenítendő nyelv", + "config.editor_prefer_editor": "Az előnyösebb szerkesztő használata lokálisan való szerkesztésre.", + "config.enabled_frameworks": "A támogatott keretrendszerek megadása. Ha nincs érték beállítva, az kiterjesztés automatikusan felismeri a keretrendszereket.", + "config.enabled_parsers": "Locale fájlformátum elemzők. Alapértelmezetten az aktivál megfelelő keretrendszerek fogják kezelni.", + "config.encoding": "Fájlkódolás locale fájlok olvasásához és írásához", + "config.full_reload_on_changed": "Teljes frissítést hajt végre a lokális fájl változtatásokon. (a .js/.ts dinamikus importálásra vonatkozik)", + "config.google_api_key": "API-kulcs a Google Fordítóhoz (opcionális)", + "config.ignore_files": "Locale fájlok figyelmen kívül hagyása betöltéskor. Egy globális tömböt fogad.", + "config.ignored_locales": "Hogy mely nyelveket kell figyelmen kívül hagyni", + "config.include_subfolders": "A könyvtárak alatt rekurzívan keresés", + "config.indent": "Az indentálás mérete a locale fájlokban.", + "config.keep_fulfill": "Mindig tartsa a kulcsokat kitöltve üres karakterekkel", + "config.key_max_length": "Ha megadott, a kinyert kulcs ezen a karakterhosszon lesz vágva (a keyPrefix kivételével). Alapértelmezett az elsődleges.", + "config.key_prefix": "Egy string a kinyerendő kulcshoz. használhatja a {fileName} -t a fájlnévért és a {fileNameWithoutExt} -t a fájlnév legelső pontja előtti részéért.", + "config.keygen_strategy": "A kulcs generálási stratégiája", + "config.keygen_style": "Az esetstílus a kulcs generálásához.", + "config.keys_in_use": "A kulcsok jelölése használatban, még akkor is, ha nem jelennek meg a kódban.", + "config.keystyle": "A kulcs stílusa", + "config.language_tag_system": "A nyelvi címke rendszerének használata.", + "config.libretranslate_api_root": "LibreTranslate API root URL-je", + "config.locale_country_map": "Egy objektum a két karakteres locale-kódokat országkódra képző szolgáltatáshoz.", + "config.locales_paths": "Az elérési utak a locale fájlokhoz (a projekt gyökere relativ elérési útvonala). Globális mintát is elfogad.", + "config.namespace": "Névterek engedélyezése. További információért lásd a dokumentációt.", + "config.openai_api_key": "", + "config.openai_api_model": "", + "config.openai_api_root": "", + "config.path_matcher": "A locale / névterekhez tartozó egyezési út. További információért lásd a dokumentációt.", + "config.preferred_delimiter": "Az összetett kulcsú útvonalak preferált határolója, alapértelmezetten az - (kötőjel)", + "config.prompt_translating_source": "Mindig kérdezze meg forrás nyelvre fordításkor. Ha hamisra van állítva, a konfigurációban megadott forrásnyelv lesz használva.", + "config.readonly": "Csak olvasás módban", + "config.refactor_templates": "Az sablonok tömbje. A {key} helyettesítő kulcsokat használja ezekben.", + "config.regex_key": "RegEx string a kulcshoz", + "config.regex_usage_match": "RegEx-szal egyező kulcsfelhasználások tömbje a kódban. Felül fogja írni a keretrendszerek által biztosított Regexet.", + "config.regex_usage_match_append": "RegEx-szal egyező kulcsfelhasználások tömbje a kódban. A \"regex.usageMatch\"-tól eltérően hozzáadja a Regex listához, ahelyett, hogy kicserélné azt.", + "config.review_email": "Az értékeléshez használt e-mail cím, ami a Gravatar-kép profilképként is szolgál.", + "config.review_enabled": "Az értékelési rendszer engedélyezése", + "config.review_gutters": "Az értékelési panel megjelenítése az oldalsávban", + "config.review_remove_on_resolved": "A megjegyzést eltávolítja, és nem jelöli meg az áthidalás után.", + "config.review_username": "Felhasználónév az értékeléshez", + "config.show_flags": "Zászlók megjelenítése a nyelvi kódok mellett", + "config.sort_compare": "", + "config.sort_keys": "Kulcsok rendezése a JSON/YAML mentésekor", + "config.sort_locale": "", + "config.source_language": "A forrásnyelv a gépi fordításhoz", + "config.tab_style": "Fülstílus a nyelvi fájlokhoz", + "config.target_picking_strategy": "Azonosító, ami meghatározza, hogy mit kell tenni, ha több mint egy nyelvi fájl található.", + "config.target_picking_strategy.file-previous": "A szöveg kinyerése az aktuális fájl előzőleg kiválasztott nyelvi fájljából", + "config.target_picking_strategy.global-previous": "A szöveg kinyerése az (aktuális vagy más) fájl előzőleg kiválasztott nyelvi fájljából", + "config.target_picking_strategy.most-similar": "Automatikusan kinyeri a szöveget a fájlból, amelyiknek az elérési útja leginkább hasonlít az aktuális fájl elérési útjához", + "config.target_picking_strategy.most-similar-by-key": "", + "config.target_picking_strategy.none": "A felhasználó manuálisan választja ki, hogy melyik fájlba kell kinyerni a szöveget", + "config.translate.engines": "Fordítási szolgáltatások.", + "config.translate.fallbackToKey": "Használja magát a kulcsot fordításhoz, ha nincs forrásszöveg a kulcshoz.", + "config.translate.parallels": "A fordítási munkások maximális száma egyszerre.", + "config.translate_override_existing": "Meglévő üzenetek felülírása fordításkor", + "config.translate_save_as_candidates": "A fordítási eredményeket \"Fordítási javaslatok\"-ba mentse el, helyettük ne írja a helyi fájlokba.", + "config.usage.scanning_ignore": "A kulcsok használatának bejárására figyelmen kívül hagyott globális minták", + "editor.add_description": "Leírás hozzáadása...", + "editor.empty": "(üres)", + "editor.title": "i18n Ally szerkesztő", + "editor.translate": "Fordítás", + "editor.translate_all_missing": "Az összes hiányzó fordítás lefordítása", + "errors.keystyle_not_set": "A kulcsstílus nincs megadva, a művelet megszakítva.", + "errors.translating_empty_source_value": "\"{0}\" forrásfordítása nem található. A fordítás megszakítva.", + "errors.translating_same_locale": "Nem lehet ugyanabba a nyelvi környezetbe fordítani.", + "errors.translating_unknown_error": "Ismeretlen hiba történt a fordítás során.", + "errors.unsupported_file_type": "Nem támogatott fájltípus: \"{0}\"", + "errors.write_in_readonly_mode": "Írás a csak olvasható módban történő mentés letiltva.", + "extname": "i18n Ally", + "feedback.document": "Dokumentáció olvasása", + "feedback.github": "Csillagozás a GitHub-on", + "feedback.report_issues": "Problémák jelentése", + "feedback.support": "Támogatásunkat nyújtsa", + "feedback.twitter_feedback": "Visszajelzés küldése", + "misc.missing_key": "{0}: Az i18n kulcs \"{1}\" nem létezik", + "misc.missing_translation": "{0}: Hiányzik a fordítás a következőhöz: \"{1}\"", + "notification.migrate": "Migrálás", + "notification.v2-update": "Az i18n Ally frissítve lett a 2.0-ra!\nKérjük, nézze meg a migrációs útmutatót.", + "prompt.applying_suggestion": "Az alábbi javaslatot alkalmazza a(z) \"{0}\" kulcsra?\n\n{1}", + "prompt.applying_translation_candidate": "Az alábbi fordítást alkalmazza a(z) \"{0}\" kulcsra?\n\n{1}", + "prompt.applying_translation_candidate_multiple": "Biztosan alkalmazza az összes {0} fordítást?", + "prompt.button_apply": "Alkalmaz", + "prompt.button_cancel": "Mégse", + "prompt.button_discard": "Elvetés", + "prompt.button_edit_end_apply": "Szerkesztés", + "prompt.button_override": "Felülírás", + "prompt.button_reenter": "Újra megadás", + "prompt.button_skip": "Folytatás felülírás nélkül", + "prompt.button_yes": "Igen", + "prompt.choice_key_to_insert": "Válasszon egy kulcsot a beszúráshoz", + "prompt.choice_key_to_open": "Válasszon egy kulcsot az editor megnyitásához...", + "prompt.choice_locale": "Válasszon nyelvi területet", + "prompt.config_locales_auto_success": "A nyelvi területek elérési útja automatikusan beállítva erre: \"{0}\".", + "prompt.config_locales_button": "Beállítás most", + "prompt.config_locales_info": "Állítsa be a nyelvi területek könyvtárát a projektjéhez", + "prompt.config_locales_success": "Nyelvi területek sikeresen beállítva.", + "prompt.create_new_path": "Új útvonal létrehozása", + "prompt.deepl_api_key_required": "DeepL API kulcs szükséges", + "prompt.deepl_error_get_usage": "Hiba történt a használati adatok lekérdezésekor", + "prompt.deepl_usage": "DeepL API használat {0} karakter fordításból {1}-ből", + "prompt.delete_key": "Biztosan eltávolítja a(z) \"{0}\" kulcsot az összes nyelvi területről?\n\nEz a művelet nem vonható vissza.", + "prompt.delete_keys_not_in_use": "Biztosan eltávolítja azokat a kulcsokat ({0 darabot), amelyeket nem használnak?\n\nEz a művelet nem vonható vissza.", + "prompt.donate": "Adományozás", + "prompt.edit_key_in_locale": "{1} | A(z) \"{0}\" kulcs szerkesztése", + "prompt.enter_file_path_to_store_key": "Írja be a fájl elérési útvonalát a(z) \"{0}\" kulcs tárolásához", + "prompt.enter_key_path": "Adja meg a(z) \"{0}\" kulcs elérési útvonalát", + "prompt.enter_new_keypath": "Adja meg az új kulcs elérési útvonalát", + "prompt.error_on_parse_custom_regex": "Nem sikerült értelmezni a(z) {0} RegEx karakterláncot. Ellenőrizze a konfigurációját.", + "prompt.existing_translation": "Meglévő fordítás", + "prompt.extraction_canceled": "Kinyerés megszakítva", + "prompt.failed_to_locate_key": "Nem sikerült megtalálni a(z) \"{0}\" kulcsot.", + "prompt.frameworks_not_found": "Az alábbi keretrendszer(ek) nem található(k). Ellenőrizze a beállításait.\n{0}", + "prompt.fullfill_missing_all_confirm": "Biztosan kívánja az összes hiányzó kulcsot üres karakterláncokkal kiegészíteni az összes nyelvi lokalizációban?\n\nEz a művelet nem visszavonható!", + "prompt.fullfill_missing_confirm": "Biztosan kívánja a(z) {0} hiányzó kulcsot üres karakterláncokkal kiegészíteni a(z) {1} lokalizációban?\n\nEz a művelet nem visszavonható!", + "prompt.invalid_keypath": "Érvénytelen kulcs elérési út!", + "prompt.key_already_exists": "A kulcs már létezik. Szeretné felülírni az meglévő értéket vagy újra megadni az elérési utat?", + "prompt.key_copied": "A kulcs másolva lett.", + "prompt.keys_removed": "{0} kulcs eltávolítva", + "prompt.keystyle_flat": "Sík stílus", + "prompt.keystyle_flat_example": "például: { \"a.b.c\": \"...\" }", + "prompt.keystyle_nested": "Beágyazott stílus", + "prompt.keystyle_nested_example": "például: { \"a\": { \"b\": { \"c\": \"...\" } } }", + "prompt.keystyle_select": "Milyen kulcsstílust használ a lokalizációk szervezéséhez?", + "prompt.locales_dir_not_found": "A lokalizációs könyvtár nem található. Az i18n Ally ki van kapcsolva.", + "prompt.new_key_path": "Adja meg az új kulcs elérési útját", + "prompt.no_locale_loaded": "Nincsenek betöltött lokalizációs fájlok. Valószínűleg hiba van a projekt konfigurációjában.", + "prompt.replace_text_as": "Szöveg helyettesítése:", + "prompt.select_display_locale": "Válassza ki a megjelenítendő nyelvet ({0})", + "prompt.select_file_to_open": "Válassza ki a megnyitandó fájlt", + "prompt.select_file_to_store_key": "Válassza ki a fájlt, amelyben tárolni kívánja a(z) \"{0}\" kulcsot", + "prompt.select_source_language_for_translating": "Válassza ki a forrásnyelvet a fordításhoz ({0})", + "prompt.select_source_locale": "Válassza ki a forrás lokalizációt ({0})", + "prompt.show_error_log": "Naplózás megjelenítése", + "prompt.star_on_github": "Csillagozza az i18n Ally-t a GitHub-on", + "prompt.support": "Az i18n Ally mindenki számára ingyenesen elérhető. Ha hasznosnak találja, kérjük, fontolja meg a támogatását. Köszönjük! ❤", + "prompt.translate_cancelled_multiple": "\"{0}\" kulcs fordítása megszakítva.", + "prompt.translate_done_multiple": "\"{0}\" kulcs lefordítva.", + "prompt.translate_done_single": "\"{0}\" fordítása kész.", + "prompt.translate_edit_translated": "Eredmény szerkesztése", + "prompt.translate_failed_multiple": "\"{0}\" kulcs fordítása sikertelen.", + "prompt.translate_failed_single": "\"{0}\" fordítása \"{1}\" nyelvre sikertelen.", + "prompt.translate_in_progress": "Fordítás folyamatban", + "prompt.translate_multiple_confirm": "Biztos, hogy le szeretné fordítani a(z) {0} kulcsot?", + "prompt.translate_no_jobs": "Nincs szükség fordításra.", + "prompt.writing_js": "A js/ts fájlok írása nem támogatott.", + "refactor.extract_ignore": "\"{0}\" detektálásának figyelmen kívül hagyása globálisan", + "refactor.extract_ignore_by_file": "\"{0}\" detektálásának figyelmen kívül hagyása az aktuális fájlban", + "refactor.extract_text": "🌍 Szöveg kivonása i18n üzenetekbe", + "refactor.extracting_not_support_for_lang": "A(z) \"{0}\" nyelvre való kivonás még nem támogatott", + "refactor.replace_with": "Szöveg cseréje a meglévő fordítással: \"{0}\"", + "review.accept_suggestion": "Javaslat elfogadása", + "review.apply_suggestion": "Javaslat alkalmazása", + "review.apply_translation_candidate": "Fordítási jelölt alkalmazása", + "review.approve": "Jóváhagyás", + "review.comment": "Megjegyzés", + "review.edit": "Szerkesztés", + "review.leave_comment": "Megjegyzés hozzáadása", + "review.optional": "(Opcionális)", + "review.placeholder.approve": "Jóváhagyva", + "review.placeholder.comment": "Nem mondott semmit", + "review.placeholder.request_change": "Változtatás kérés", + "review.request_change": "Változtatás kérése", + "review.request_change_messages": "Változtatás kérése", + "review.resolve": "Megoldás", + "review.resolve_all": "Összes megoldása", + "review.review": "Felülvizsgálat", + "review.suggestion": "Javaslat", + "review.suggestions": "Javaslatok", + "review.title": "i18n Ally Felülvizsgálata", + "review.translation_candidates": "Fordítási Jelöltek", + "review.unknown_user": "Ismeretlen", + "view.current_file": "Aktuális fájl", + "view.current_file_hard_strings": "Keménykódolt szövegek [béta]", + "view.current_file_hard_strings_expand_to_detect": "(Kiterjesztés az érzékeléshez)", + "view.current_file_hard_strings_not_supported": "A(z) \"{0}\" még nem támogatott", + "view.current_file_keys_in_use": "Használatban lévő kulcsok", + "view.current_file_keys_not_found": "Kulcsok nem találhatók", + "view.help_feedback": "Súgó és Visszajelzés", + "view.i18n_keys": "i18n Ally", + "view.progress": "Folyamat", + "view.progress_submenu.empty_keys": "Üres", + "view.progress_submenu.missing_keys": "Nincs fordítás", + "view.progress_submenu.translated_keys": "Lefordítva", + "view.tree": "Könyvtárszerkezet", + "view.usage": "Használati jelentés", + "view.usage_keys_in_use": "{0} kulcs használatban van", + "view.usage_keys_missing": "{0} kulcs hiányzik", + "view.usage_keys_not_in_use": "{0} kulcs NEM használatban van", + "view.usage_report_none": "Az elemzés megkezdéséhez nyomja meg a frissítés gombot", + "นามสกุล": "" } diff --git a/locales/ja.json b/locales/ja.json index 66486405..a579d0d0 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "", "command.go_to_prev_usage": "", "command.go_to_range": "", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "", "command.locale_visibility_hide": "ロケールを隠す", "command.locale_visibility_show": "ロケールを表示する", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "", + "config.deepl_glossary_dir": "", "config.deepl_log": "", "config.deepl_use_free_api_entry": "", "config.default_namespace": "", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "", "config.review_username": "", "config.show_flags": "", + "config.sort_compare": "", "config.sort_keys": "ソート済みjson/yamlで保存する", + "config.sort_locale": "", "config.source_language": "機械翻訳のための元言語", "config.tab_style": "", "config.target_picking_strategy": "", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} キーを使用中", "view.usage_keys_missing": "", "view.usage_keys_not_in_use": "{0} キーは使用していません", - "view.usage_report_none": "" + "view.usage_report_none": "", + "นามสกุล": "" } diff --git a/locales/ko.json b/locales/ko.json index 4c75feb4..8d852f19 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "다음 사용량으로 이동", "command.go_to_prev_usage": "이전 사용량으로 이동", "command.go_to_range": "범위 이동", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "키 삽입", "command.locale_visibility_hide": "로케일 숨기기", "command.locale_visibility_show": "로케일 표시", @@ -37,7 +40,10 @@ "config.annotation_max_length": "인라인 주석에 표시되는 최대 문자 수. \n초과 문자는 줄임표(...)로 표시됩니다.", "config.annotations": "인라인 주석을 활성화", "config.auto_detection": "프로젝트에 대한 로케일 자동 감지 사용", + "config.baidu_app_secret": "", + "config.baidu_appid": "", "config.deepl_api_key": "DeepL 번역 엔진을 사용하기 위한 API 키", + "config.deepl_glossary_dir": "", "config.deepl_log": "DeepL 엔진 디버그 로그 표시", "config.deepl_use_free_api_entry": "DeepL Free API 엔트리 포인트 사용", "config.default_namespace": "전역 기본 네임스페이스", @@ -86,13 +92,16 @@ "config.review_remove_on_resolved": "해결된 것으로 표시하는 대신 댓글 제거.", "config.review_username": "검토용 사용자 이름", "config.show_flags": "로케일 코드와 함께 플래그 표시", + "config.sort_compare": "", "config.sort_keys": "JSON/YAML에 저장할 때 키 정렬", + "config.sort_locale": "", "config.source_language": "기계 번역을 위한 소스 언어", "config.tab_style": "로케일 파일의 탭 스타일", "config.target_picking_strategy": "둘 이상의 로케일 파일을 처리하는 전략이 발견되었습니다.", "config.target_picking_strategy.file-previous": "현재 파일의 이전에 선택된 로케일 파일로 텍스트 추출", "config.target_picking_strategy.global-previous": "이전에 선택된 로케일 파일(현재 또는 기타)로 텍스트 추출", "config.target_picking_strategy.most-similar": "현재 파일의 경로와 가장 일치하는 경로의 파일의 텍스트를 자동으로 추출", + "config.target_picking_strategy.most-similar-by-key": "", "config.target_picking_strategy.none": "사용자가 텍스트를 추출할 파일을 수동으로 선택", "config.translate.engines": "번역 서비스.", "config.translate.fallbackToKey": "해당 키에 대한 소스 번역이 없는 경우 키 자체를 사용하여 번역합니다.", @@ -231,5 +240,6 @@ "view.usage_keys_in_use": "{0} 키가 사용 중", "view.usage_keys_missing": "{0} 키가 누락되었습니다.", "view.usage_keys_not_in_use": "{0} 키가 사용되지 않습니다.", - "view.usage_report_none": "키 사용량 분석을 시작하려면 새로고침을 누르세요." + "view.usage_report_none": "키 사용량 분석을 시작하려면 새로고침을 누르세요.", + "นามสกุล": "" } diff --git a/locales/nb-NO.json b/locales/nb-NO.json index 658020bb..9156c7fd 100644 --- a/locales/nb-NO.json +++ b/locales/nb-NO.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "", "command.go_to_prev_usage": "", "command.go_to_range": "", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "", "command.locale_visibility_hide": "Skjul oversettelse", "command.locale_visibility_show": "Vis oversettelse", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "", + "config.deepl_glossary_dir": "", "config.deepl_log": "", "config.deepl_use_free_api_entry": "", "config.default_namespace": "", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "", "config.review_username": "", "config.show_flags": "", + "config.sort_compare": "", "config.sort_keys": "Lagre med sortert json/yaml", + "config.sort_locale": "", "config.source_language": "Kildespråk for maskinoversettelse", "config.tab_style": "", "config.target_picking_strategy": "", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "", "view.usage_keys_missing": "", "view.usage_keys_not_in_use": "", - "view.usage_report_none": "" + "view.usage_report_none": "", + "นามสกุล": "" } diff --git a/locales/nl-NL.json b/locales/nl-NL.json index eec160e7..849899dc 100644 --- a/locales/nl-NL.json +++ b/locales/nl-NL.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "", "command.go_to_prev_usage": "", "command.go_to_range": "", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "", "command.locale_visibility_hide": "Verberg locale", "command.locale_visibility_show": "Toon locale", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "", + "config.deepl_glossary_dir": "", "config.deepl_log": "", "config.deepl_use_free_api_entry": "", "config.default_namespace": "", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "", "config.review_username": "", "config.show_flags": "", + "config.sort_compare": "", "config.sort_keys": "Sleutels sorteren bij opslaan van JSON/YAML bestanden", + "config.sort_locale": "", "config.source_language": "Brontaal voor automatisch vertalen", "config.tab_style": "Tab stijl voor locale bestanden", "config.target_picking_strategy": "", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} sleutels zijn in gebruik", "view.usage_keys_missing": "{0} ontbrekende sleutels", "view.usage_keys_not_in_use": "{0} sleutels zijn NIET in gebruik", - "view.usage_report_none": "Klik op verversen om sleutelgebruik te analyseren" + "view.usage_report_none": "Klik op verversen om sleutelgebruik te analyseren", + "นามสกุล": "" } diff --git a/locales/pt-BR.json b/locales/pt-BR.json index 207fa8f1..7272d71e 100644 --- a/locales/pt-BR.json +++ b/locales/pt-BR.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "Ir para o próximo uso", "command.go_to_prev_usage": "Ir para o uso anterior", "command.go_to_range": "Ir para o intervalo", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "Inserir chave", "command.locale_visibility_hide": "Esconder locale", "command.locale_visibility_show": "Exibir locale", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "", + "config.deepl_glossary_dir": "", "config.deepl_log": "", "config.deepl_use_free_api_entry": "", "config.default_namespace": "", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "", "config.review_username": "", "config.show_flags": "", + "config.sort_compare": "", "config.sort_keys": "Salvar com json/yaml seperados", + "config.sort_locale": "", "config.source_language": "Idioma de origem para tradução de máquina", "config.tab_style": "Estilo da aba para arquivos de lozalização (locales)", "config.target_picking_strategy": "", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} chaves em uso", "view.usage_keys_missing": "{0} chaves faltantes", "view.usage_keys_not_in_use": "{0} chaves não estão em uso", - "view.usage_report_none": "" + "view.usage_report_none": "", + "นามสกุล": "" } diff --git a/locales/ru.json b/locales/ru.json index fb3f39b5..50f36cf4 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "Перейти к следующему использованию", "command.go_to_prev_usage": "", "command.go_to_range": "Перейти к диапазону", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "Вставить ключ", "command.locale_visibility_hide": "Скрыть перевод", "command.locale_visibility_show": "Показать перевод", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "API ключ для использования DeepL", + "config.deepl_glossary_dir": "", "config.deepl_log": "Отображать отладочные журналы DeepL", "config.deepl_use_free_api_entry": "Использовать бесплатную версию DeepL API", "config.default_namespace": "Глобальное пространство имен по умолчанию", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "Удалять обработанные комментарии, а не помечать их как обработанные.", "config.review_username": "Имя пользователя для рецензирования", "config.show_flags": "Показывать флаги вместе с кодами переводов", + "config.sort_compare": "", "config.sort_keys": "Сортировка ключей при сохранении в JSON/YAML", + "config.sort_locale": "", "config.source_language": "Исходный язык для машинного перевода", "config.tab_style": "Стиль вкладки для файлов переводов", "config.target_picking_strategy": "Стратегия выбора файла перевода при обнаружении нескольких файлов перевода", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} ключей используется", "view.usage_keys_missing": "{0} ключей отсутствует", "view.usage_keys_not_in_use": "{0} ключей НЕ используется", - "view.usage_report_none": "Обновите, чтобы начать анализ использования ключа" + "view.usage_report_none": "Обновите, чтобы начать анализ использования ключа", + "นามสกุล": "" } diff --git a/locales/sv-SE.json b/locales/sv-SE.json index da7c84e9..45157fc5 100644 --- a/locales/sv-SE.json +++ b/locales/sv-SE.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "", "command.go_to_prev_usage": "", "command.go_to_range": "", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "Lägg till nyckel", "command.locale_visibility_hide": "Göm locale", "command.locale_visibility_show": "Visa locale", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "", + "config.deepl_glossary_dir": "", "config.deepl_log": "", "config.deepl_use_free_api_entry": "", "config.default_namespace": "", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "Ta bort kommentaren istället för att markera den som löst.", "config.review_username": "Användarnamn för granskning", "config.show_flags": "Visa flaggor med locale-koder", + "config.sort_compare": "", "config.sort_keys": "Sortera nycklar vid sparning till JSON/YAML", + "config.sort_locale": "", "config.source_language": "Källspråk för maskinöversättning", "config.tab_style": "Tab-stil för locale-filer", "config.target_picking_strategy": "Strategi att använda när flera locale-filer hittats.", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} nycklar används", "view.usage_keys_missing": "{0} nycklar saknas", "view.usage_keys_not_in_use": "{0} nycklar används INTE", - "view.usage_report_none": "Tryck på uppdatera för att starta analysering av nyckelanvändning" + "view.usage_report_none": "Tryck på uppdatera för att starta analysering av nyckelanvändning", + "นามสกุล": "" } diff --git a/locales/th.json b/locales/th.json index e970fefe..79ee25f6 100644 --- a/locales/th.json +++ b/locales/th.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "ไปยังการใช้งานถัดไป", "command.go_to_prev_usage": "ไปยังการใช้งานก่อนหน้านี้", "command.go_to_range": "ไปยังช่วง", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "แทรกคีย์", "command.locale_visibility_hide": "ซ่อนภาษา", "command.locale_visibility_show": "แสดงภาษา", @@ -37,7 +40,10 @@ "config.annotation_max_length": "จำนวนอักขระสูงสุดที่แสดงในคำอธิบายประกอบแบบในบรรทัด อักขระที่เกินจะแสดงเป็นจุดไข่ปลา (...)", "config.annotations": "เปิดใช้งานคำอธิบายประกอบแบบในบรรทัด", "config.auto_detection": "เปิดใช้งานการตรวจหาตำแหน่งภาษาอัตโนมัติสำหรับโครงการ", + "config.baidu_app_secret": "", + "config.baidu_appid": "", "config.deepl_api_key": "คีย์ API เพื่อใช้เครื่องมือแปล DeepL", + "config.deepl_glossary_dir": "", "config.deepl_log": "แสดงบันทึกการดีบักโปรแกรม DeepL", "config.deepl_use_free_api_entry": "ใช้ DeepL Free API เป็นจุดเริ่มต้น ", "config.default_namespace": "namespace Global เริ่มต้น", @@ -86,13 +92,16 @@ "config.review_remove_on_resolved": "ลบความคิดเห็นแทนที่ด้วยการทำเครื่องหมายว่าแก้ไขแล้ว", "config.review_username": "ชื่อผู้ใช้สำหรับตรวจสอบ", "config.show_flags": "แสดงแฟล็กพร้อมกับรหัสภาษา", + "config.sort_compare": "", "config.sort_keys": "จัดเรียงคีย์เมื่อบันทึกเป็น JSON/YAML", + "config.sort_locale": "", "config.source_language": "ภาษาต้นทางสำหรับการแปลด้วยคอมพิวเตอร์", "config.tab_style": "รูปแบบแท็บสำหรับไฟล์ภาษา", "config.target_picking_strategy": "พบกลยุทธ์ที่เกี่ยวข้องกับไฟล์ภาษามากกว่าหนึ่งไฟล์", "config.target_picking_strategy.file-previous": "แยกข้อความไปยังไฟล์ตำแหน่งภาษาที่เลือกก่อนหน้าของไฟล์ปัจจุบัน", "config.target_picking_strategy.global-previous": "แยกข้อความไปยังไฟล์ (ปัจจุบันหรือไฟล์อื่น) ของไฟล์ภาษาที่เลือกก่อนหน้า", "config.target_picking_strategy.most-similar": "แยกข้อความไปยังไฟล์โดยอัตโนมัติ ซึ่งเส้นทางที่ตรงกับเส้นทางของไฟล์ปัจจุบันมากที่สุด", + "config.target_picking_strategy.most-similar-by-key": "", "config.target_picking_strategy.none": "ผู้ใช้เลือกไฟล์ที่ต้องการแยกข้อความด้วยตนเอง", "config.translate.engines": "บริการแปลภาษา", "config.translate.fallbackToKey": "ใช้คีย์เองเพื่อแปลเมื่อไม่มีการแปลต้นฉบับสำหรับคีย์นั้น", @@ -111,7 +120,7 @@ "errors.translating_unknown_error": "ข้อผิดพลาดที่ไม่รู้จักเกิดขึ้นในการแปล", "errors.unsupported_file_type": "ประเภทไฟล์ที่ไม่รองรับ: \"{0}\"", "errors.write_in_readonly_mode": "การเขียนในโหมดอ่านอย่างเดียวถูกปิดใช้งาน", - "นามสกุล": "i18n Ally", + "extname": "", "feedback.document": "อ่านเอกสาร", "feedback.github": "ติดดาวบน GitHub", "feedback.report_issues": "รายงานปัญหา", @@ -231,5 +240,6 @@ "view.usage_keys_in_use": "กำลังใช้ {0} คีย์", "view.usage_keys_missing": "{0} คีย์หายไป", "view.usage_keys_not_in_use": "{0} คีย์ไม่ได้ถูกใช้งาน", - "view.usage_report_none": "กดรีเฟรชเพื่อเริ่มวิเคราะห์การใช้คีย์" + "view.usage_report_none": "กดรีเฟรชเพื่อเริ่มวิเคราะห์การใช้คีย์", + "นามสกุล": "i18n Ally" } diff --git a/locales/tr.json b/locales/tr.json index f6d53d7a..b2169658 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "Bir sonraki kullanıma git", "command.go_to_prev_usage": "Bir önceki kullanıma dön", "command.go_to_range": "Aralığa git", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "Çeviri ekle", "command.locale_visibility_hide": "Dili gizle", "command.locale_visibility_show": "Dili göster", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "DeepL çeviri sistemini kullanmak için API anahtarı", + "config.deepl_glossary_dir": "", "config.deepl_log": "DeepL sisteminin hata ayıklama kayıtlarını göster", "config.deepl_use_free_api_entry": "DeepL'in Bedava API giriş noktasını kullanın", "config.default_namespace": "Global varsayılan namespace", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "İncelendi olarak işaretlemek yerine yorumu sil.", "config.review_username": "İncelemeler için kullanıcı adınız", "config.show_flags": "Çeviri kodlarıyla beraber eşleşen bayrağı göster", + "config.sort_compare": "", "config.sort_keys": "JSON/YAML dosyasına kaydederken çeviri anahtarlarını diz", + "config.sort_locale": "", "config.source_language": "Makine çevirisi için kaynak dil", "config.tab_style": "Dil dosyaları için Tab stili", "config.target_picking_strategy": "Birden fazla dil dosyası bulunduğunda uygulanacak strateji", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} çeviri kullanımda", "view.usage_keys_missing": "{0} çeviri eksik", "view.usage_keys_not_in_use": "{0} çeviri kullanımda DEĞİL", - "view.usage_report_none": "Çeviri kullanımını incelemek için yenileye basın" + "view.usage_report_none": "Çeviri kullanımını incelemek için yenileye basın", + "นามสกุล": "" } diff --git a/locales/uk-UA.json b/locales/uk-UA.json index 038f709f..4f29514b 100644 --- a/locales/uk-UA.json +++ b/locales/uk-UA.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "", "command.go_to_prev_usage": "", "command.go_to_range": "", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "Вставити ключ", "command.locale_visibility_hide": "Приховати мову", "command.locale_visibility_show": "Показати мову", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "Ключ для використання API DeepL", + "config.deepl_glossary_dir": "", "config.deepl_log": "Відображати налагоджувальні журнали DeepL", "config.deepl_use_free_api_entry": "", "config.default_namespace": "Глобальні простори імен за замовчуванням", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "Видаляти оброблені коментарі, а не позначати їх як оброблені", "config.review_username": "Ім'я користувача для аудиту", "config.show_flags": "Показувати прапори разом з кодами мов", + "config.sort_compare": "", "config.sort_keys": "Сортування ключів при збереженні в JSON/YAML", + "config.sort_locale": "", "config.source_language": "Мова оригіналу для машинного перекладу", "config.tab_style": "Стиль вкладки для файлів перекладів", "config.target_picking_strategy": "Стратегія вибору файлу перекладу при виявленні декількох файлів", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} ключі використовуються", "view.usage_keys_missing": "{0} ключі відсутні", "view.usage_keys_not_in_use": "{0} ключі НЕ використовуються", - "view.usage_report_none": "Оновіть, щоб почати аналіз використання ключа" + "view.usage_report_none": "Оновіть, щоб почати аналіз використання ключа", + "นามสกุล": "" } diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 8097d376..00197e43 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "", "command.go_to_prev_usage": "", "command.go_to_range": "", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "插入i18n文案", "command.locale_visibility_hide": "隐藏此语言", "command.locale_visibility_show": "显示此语言", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "百度平台分配的密钥", "config.baidu_appid": "百度平台APPID", "config.deepl_api_key": "", + "config.deepl_glossary_dir": "", "config.deepl_log": "", "config.deepl_use_free_api_entry": "", "config.default_namespace": "", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "删除已处理的审批留言,而不是只将其标记为已处理。", "config.review_username": "使用者名称", "config.show_flags": "显示国旗图标", + "config.sort_compare": "", "config.sort_keys": "保存排序后的JSON/YAML", + "config.sort_locale": "", "config.source_language": "翻译源语言", "config.tab_style": "文案文件的缩进样式", "config.target_picking_strategy": "如果找到多个语言文件时的语言文件选择策略", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0} 条文案使用中", "view.usage_keys_missing": "{0} 条文案缺失", "view.usage_keys_not_in_use": "{0} 条文案未被使用", - "view.usage_report_none": "点击刷新开始使用分析" + "view.usage_report_none": "点击刷新开始使用分析", + "นามสกุล": "" } diff --git a/locales/zh-TW.json b/locales/zh-TW.json index a1dd5621..cebf4405 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -14,6 +14,9 @@ "command.go_to_next_usage": "", "command.go_to_prev_usage": "", "command.go_to_range": "", + "command.i18n-ally.deeply-list-glossaries": "", + "command.i18n-ally.deeply-update-glossaries": "", + "command.i18n-ally.deeply-update-glossary": "", "command.insert_key": "插入i18n文案", "command.locale_visibility_hide": "隱藏此語言", "command.locale_visibility_show": "顯示此語言", @@ -40,6 +43,7 @@ "config.baidu_app_secret": "", "config.baidu_appid": "", "config.deepl_api_key": "", + "config.deepl_glossary_dir": "", "config.deepl_log": "", "config.deepl_use_free_api_entry": "", "config.default_namespace": "", @@ -88,7 +92,9 @@ "config.review_remove_on_resolved": "刪除已處理的審核留言,而不是只將其標記為已處理。", "config.review_username": "使用者名稱", "config.show_flags": "顯示國旗圖示", + "config.sort_compare": "", "config.sort_keys": "儲存已排序的JSON/YAML", + "config.sort_locale": "", "config.source_language": "翻譯源語言", "config.tab_style": "文案檔案的縮排樣式", "config.target_picking_strategy": "如果找到多個語言文件時的語言文件選擇策略", @@ -234,5 +240,6 @@ "view.usage_keys_in_use": "{0}個文案使用中", "view.usage_keys_missing": "{0}個文案缺失", "view.usage_keys_not_in_use": "{0}個文案未被使用", - "view.usage_report_none": "點擊更新開始使用分析" + "view.usage_report_none": "點擊更新開始使用分析", + "นามสกุล": "" } diff --git a/package.json b/package.json index 154b2439..0d072069 100644 --- a/package.json +++ b/package.json @@ -367,6 +367,21 @@ "category": "%extname%", "title": "%command.deepl_usage%" }, + { + "command": "i18n-ally.deepl-update-glossaries", + "category": "%extname%", + "title": "%command.i18n-ally.deeply-update-glossaries%" + }, + { + "command": "i18n-ally.deepl-update-glossary", + "category": "%extname%", + "title": "%command.i18n-ally.deeply-update-glossary%" + }, + { + "command": "i18n-ally.deepl-list-glossaries", + "category": "%extname%", + "title": "%command.i18n-ally.deeply-list-glossaries%" + }, { "command": "i18n-ally.go-to-range", "category": "%extname%", @@ -1095,6 +1110,11 @@ "default": false, "description": "%config.deepl_use_free_api_entry%" }, + "i18n-ally.translate.deepl.glossariesDir": { + "type": "string", + "default": null, + "description": "%config.deepl_glossary_dir%" + }, "i18n-ally.translate.libre.apiRoot": { "type": "string", "default": "http://localhost:5000", diff --git a/src/commands/commands.ts b/src/commands/commands.ts index 8504902f..204fb385 100644 --- a/src/commands/commands.ts +++ b/src/commands/commands.ts @@ -46,4 +46,7 @@ export const enum Commands { review_apply_translation = 'i18n-ally.review.apply-translation', review_apply_suggestion = 'i18n-ally.review.apply-suggestion', deepl_usage = 'i18n-ally.deepl-usage', + deepl_update_glossaries = 'i18n-ally.deepl-update-glossaries', + deepl_update_glossary = 'i18n-ally.deepl-update-glossary', + deepl_list_glossaries = 'i18n-ally.deepl-list-glossaries', } diff --git a/src/commands/deepl.ts b/src/commands/deepl.ts index 5bbc3847..f1301a5d 100644 --- a/src/commands/deepl.ts +++ b/src/commands/deepl.ts @@ -1,7 +1,9 @@ -import { commands, window } from 'vscode' +import { commands, window, workspace } from 'vscode' +import { readdirSync, readFileSync } from 'fs' +import { join } from 'path' import { Commands } from './commands' import { ExtensionModule } from '~/modules' -import { usage } from '~/translators/engines/deepl' +import { usage, DeeplGlossaries } from '~/translators/engines/deepl' import i18n from '~/i18n' import { Config } from '~/core' import { abbreviateNumber } from '~/utils' @@ -32,8 +34,136 @@ async function deepAuth() { } } + +type GlossaryFile = { + path: string, + sourceLanguage: string, + targetLanguage: string, + name: string, +} + +const GLOSSARY_FILE_REGEX = /(\w{2,3})-(\w{2,3}).csv/ + +class DeeplGlossaryCommands { + + private static glossaries = new DeeplGlossaries() + + public static async updateGlossary() { + try { + this.checkEnabled() + + const availableGlossaryFiles = this.getAvailableGlossaryFiles(), + fileNames = availableGlossaryFiles.map(({ name }) => name), + chosenFileName = await window.showQuickPick(fileNames, { canPickMany: false }) + + if (! chosenFileName) { + return + } + + const chosenFile = availableGlossaryFiles.find(({ name }) => name === chosenFileName) + + if (chosenFile) { + await this.updateGlossaryFromFile(chosenFile) + } + } catch (error) { + if (error instanceof Error) { + window.showErrorMessage(error.message) + } else { + window.showErrorMessage(`Unkown error: "${error}"`) + } + } + } + + public static async updateGlossaries() { + try { + this.checkEnabled() + + const availableGlossaryFiles = this.getAvailableGlossaryFiles() + + for (const glossaryFile of availableGlossaryFiles) { + await this.updateGlossaryFromFile(glossaryFile) + } + } catch (error) { + if (error instanceof Error) { + window.showErrorMessage(error.message) + } else { + window.showErrorMessage(`Unkown error: "${error}"`) + } + } + } + + public static async listGlossaries() { + try { + this.checkEnabled(); + + const outputChannel = window.createOutputChannel('glossaries'); + + outputChannel.show(); + outputChannel.appendLine('Reading glossary list...'); + + const glossaries = await this.glossaries.readGlossaryList(true); + + outputChannel.appendLine(JSON.stringify(glossaries, null, '\t')); + } catch (error) { + if (error instanceof Error) { + window.showErrorMessage(error.message) + } else { + window.showErrorMessage(`Unkown error: "${error}"`) + } + } + + } + + private static async updateGlossaryFromFile(file: GlossaryFile) { + const glossaryContent = readFileSync(file.path, 'utf-8') + + await this.glossaries.updateGlossary(file.targetLanguage, file.sourceLanguage, glossaryContent) + + window.showInformationMessage(`Glossary "${file.name}" updated successfully.`) + } + + private static getAvailableGlossaryFiles(): Array { + const glossaryPath = join(this.getWorkspacePath(), Config.deeplGlossariesDir!) + + return readdirSync(glossaryPath) + .map(fileName => { + const match = GLOSSARY_FILE_REGEX.exec(fileName) + + if (match) { + return { + path: join(glossaryPath, fileName), + sourceLanguage : match[1], + targetLanguage : match[2], + name : fileName + } + } + }) + .filter(glossary => !! glossary) as Array + } + + private static getWorkspacePath(): string { + try { + return workspace.workspaceFolders![0].uri.path + } catch (error) { + throw new Error('No workspace available') + } + } + + private static checkEnabled() { + const isEnabled = this.glossaries.isEnabled() + + if (! isEnabled) { + throw new Error('Glossaries are not configured') + } + } +} + + export default function() { return [ commands.registerCommand(Commands.deepl_usage, deepAuth), + commands.registerCommand(Commands.deepl_update_glossaries, DeeplGlossaryCommands.updateGlossaries.bind(DeeplGlossaryCommands)), + commands.registerCommand(Commands.deepl_update_glossary, DeeplGlossaryCommands.updateGlossary.bind(DeeplGlossaryCommands)), + commands.registerCommand(Commands.deepl_list_glossaries, DeeplGlossaryCommands.listGlossaries.bind(DeeplGlossaryCommands)), ] } diff --git a/src/core/Config.ts b/src/core/Config.ts index 3eedd1c5..532e77fd 100644 --- a/src/core/Config.ts +++ b/src/core/Config.ts @@ -568,6 +568,10 @@ export class Config { return !!this.getConfig('translate.deepl.enableLog') } + static get deeplGlossariesDir() { + return this.getConfig('translate.deepl.glossariesDir'); + } + static get libreTranslateApiRoot() { return this.getConfig('translate.libre.apiRoot') } diff --git a/src/translators/engines/deepl.ts b/src/translators/engines/deepl.ts index 82e754e6..c65ee8c5 100644 --- a/src/translators/engines/deepl.ts +++ b/src/translators/engines/deepl.ts @@ -1,6 +1,5 @@ import axios from 'axios' import qs from 'qs' - import TranslateEngine, { TranslateOptions, TranslateResult } from './base' import { Log } from '~/utils' import { Config } from '~/core' @@ -19,6 +18,25 @@ interface DeepLTranslateRes { translations: DeepLTranslate[] } +type GlossaryIdentifyingPartial = { + glossary_id: string +} + +type DeeplGlossaryInfo = { + glossary_id: string, + name: string + ready: boolean, + source_lang: string, + target_lang: string, + creation_time: string, // iso string + entry_count: number +} + +type GlossaryInfoCache = { + lastUpdate?: number, + glossaries?: Array +} + const deepl = axios.create({}) deepl.interceptors.request.use((req) => { @@ -26,11 +44,9 @@ deepl.interceptors.request.use((req) => { ? 'https://api-free.deepl.com/v2' : 'https://api.deepl.com/v2' - req.params = { - auth_key: Config.deeplApiKey, - } + req.headers['Authorization'] = `DeepL-Auth-Key ${Config.deeplApiKey}` - if (req.method === 'POST' || req.method === 'post') { + if (!req.headers['Content-Type'] && (req.method === 'POST' || req.method === 'post')) { req.headers['Content-Type'] = 'application/x-www-form-urlencoded' req.data = qs.stringify(req.data) } @@ -76,6 +92,7 @@ function stripeLocaleCode(locale?: string): string | undefined { class DeepL extends TranslateEngine { async translate(options: TranslateOptions) { + try { const res: DeepLTranslateRes = await deepl({ method: 'POST', @@ -84,6 +101,7 @@ class DeepL extends TranslateEngine { text: options.text, source_lang: stripeLocaleCode(options.from || undefined), target_lang: stripeLocaleCode(options.to), + ...await DeeplGlossaries.getTranslationRequestGlossaryIdentifier(options) }, }).then(({ data }) => data) @@ -122,8 +140,233 @@ class DeepL extends TranslateEngine { } } +const GLOSSARY_CACHE_TTL = 60 * 1000 // 1 minute + +/** + * Encapsulate glossary handling. + * + * Glossaries are enabled when the `Config.deeplGlossariesDir` setting is set. + * Files in that directory (only direct children) that follow the naming scheme "{sourceLanguage}-{targetLanguage}.csv" + * are considered sources for the glossaries that are kept on the DeepL-servers. + * + * To transmit (create/update is the same here) these files, the user must execute one of + * - `Commands.deepl_update_glossaries` + * - `Commands.deepl_update_glossary`. + * + * After the glossaries have been created, they are automatically applied when translating a matching language-pair with deepl. + */ +class DeeplGlossaries { + + /** + * Keeps available glossaries as a list of source-/target language pairs. + * Saves on a lot of requests, especially when performing bulk translation. + */ + static readonly cache: GlossaryInfoCache = {} + + public isEnabled(): boolean { + const dir = Config.deeplGlossariesDir + + return !! dir + } + + /** + * Update a single glossary. + * + * 1. Deletes all existing glossaries for the given source-/target language pair + * 2. Creates a new glossary + * + * @param targetLanguage + * @param sourceLanguage + * @param content CSV-formatted glossary + */ + public async updateGlossary(targetLanguage: string, sourceLanguage: string, content: string) { + try { + const glossaries = await this.getGlossaryIds(targetLanguage, sourceLanguage) + + glossaries.forEach(async id => { + await this.deleteGlossary(id) + }) + + await this.createGlossary(targetLanguage, sourceLanguage, content) + } finally { + this.invalidateCache() + } + } + + /** + * Retrieves an id of one glossary on DeepL-servers for the source-/target language pair. + * If there are muliple glossaries, any is picked. + * + * @param targetLanguage + * @param sourceLanguage + * @returns + */ + public async getGlossaryId(targetLanguage: string, sourceLanguage: string): Promise { + const glossaries = await this.getGlossaryIds(targetLanguage, sourceLanguage) + + if (glossaries.length >= 1) { + return glossaries[0] + } + } + + /** + * Retrieves meta-information about all glossaries on DeepL-servers. + * This is the point that implements the caching of glossary information. + * + * @returns + */ + public async readGlossaryList(forceUpdate: boolean = false): Promise> { + if (this.isCached() && ! forceUpdate) { + return DeeplGlossaries.cache.glossaries! + } + + try { + const { glossaries } = await deepl({ + url: '/glossaries', + }).then(({ data }) => data) + + if (glossaries) { + DeeplGlossaries.cache.lastUpdate = Date.now() + DeeplGlossaries.cache.glossaries = glossaries as Array + + return glossaries + } else { + throw new Error('Can not read glossaries') + } + } catch (err) { + log(false, err) + + throw err + } + } + + /** + * Retrieves a list of ids of all glossaries on DeepL-servers for the source-/target language pair. + * + * @param targetLanguage + * @param sourceLanguage + * @returns + */ + private async getGlossaryIds(targetLanguage: string, sourceLanguage: string): Promise> { + const glossaries = await this.readGlossaryList() + + return glossaries.filter(({ source_lang, target_lang }) => { + return source_lang === sourceLanguage && target_lang === targetLanguage + }) + .map(glossary => glossary.glossary_id) + } + + /** + * Deletes a glossary. + * @param id + */ + private async deleteGlossary(id: string) { + try { + const { status, data } = await deepl({ + url: `/glossaries/${id}`, + method: 'DELETE' + }) + + if (status === 204) { + log(false, `Successfully deleted glossary ${id}`) + } else { + const { message, detail } = await data + + throw new Error(`Couldn't delete glossary ${id}: ${status}\n${message}\n${detail}`) + } + } catch (e) { + log(false, `Couldn't delete glossary ${id}`, e) + throw e + } + } + + /** + * Creates a glossary on DeepL-servers. + * + * @param targetLanguage + * @param sourceLanguage + * @param content csv-formatted glossary + */ + private async createGlossary(targetLanguage: string, sourceLanguage: string, content: string) { + if (! content || content.length === 0) { + throw new Error(`Didn't create glossary ${sourceLanguage} => ${targetLanguage}: with empty content.`) + } + + try { + const { status, data } = await deepl({ + url: `/glossaries`, + method : 'POST', + headers : { + 'Content-Type' : 'application/json' + }, + data : JSON.stringify({ + name : `${sourceLanguage}-${targetLanguage}`, + source_lang : sourceLanguage, + target_lang : targetLanguage, + entries_format : 'csv', + entries : content + }) + }) + + if (status !== 201) { + // we have some kind of error + const { message, detail } = data + + throw new Error(`Couldn't create glossary ${sourceLanguage} => ${targetLanguage}: ${status}\n${message}\n${detail}`) + } + } catch (e) { + log(false, `Couldn't create glossary ${sourceLanguage} => ${targetLanguage}`, e) + throw e + } + } + + private isCached(): boolean { + return !! (DeeplGlossaries.cache.lastUpdate && Date.now() - DeeplGlossaries.cache.lastUpdate < GLOSSARY_CACHE_TTL) + } + + private invalidateCache() { + DeeplGlossaries.cache.lastUpdate = 0 + DeeplGlossaries.cache.glossaries = [] + } + + // + // static + // + + /** + * Creates an object that - when spread into the translation request parameters - identifies a glossary. + * + * This can always safely be spreaded into the request params. An empty object is returned when + * - glossaries are disabled + * - no glossary is available for the language pair from the request + * + * @param options defines source-/target language pair + * @returns glossary identification parameters + */ + public static async getTranslationRequestGlossaryIdentifier(options: TranslateOptions): Promise { + try { + const glossaries = new DeeplGlossaries() + + if (glossaries.isEnabled() && options.from && options.to) { + const glossaryId = await glossaries.getGlossaryId(options.to, options.from) + + if (glossaryId) { + return { + glossary_id: glossaryId + }; + } + } + } catch (error) { + log(false, `Error reading glossary id for translation from ${options.from} => ${options.to}`, error) + } + + return {}; + } +} + export default DeepL export { usage, + DeeplGlossaries }