From 9a26667c5da3ad78de20b8ba760a133c21438e8c Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Fri, 30 Jun 2023 12:58:52 +0600 Subject: [PATCH] chore: generate all missing translations --- bin/untranslated_messages.dart | 43 +++++++ lib/l10n/app_bn.arb | 68 +++++++++- lib/l10n/app_de.arb | 5 +- lib/l10n/app_fr.arb | 68 +++++++++- lib/l10n/app_hi.arb | 68 +++++++++- lib/l10n/app_ja.arb | 7 +- untranslated_messages.json | 221 +-------------------------------- 7 files changed, 254 insertions(+), 226 deletions(-) create mode 100644 bin/untranslated_messages.dart diff --git a/bin/untranslated_messages.dart b/bin/untranslated_messages.dart new file mode 100644 index 00000000..428314aa --- /dev/null +++ b/bin/untranslated_messages.dart @@ -0,0 +1,43 @@ +import 'dart:convert'; +import 'dart:io'; + +/// Generate JSON output for untranslated messages with English values +/// for quick translation in ChatGPT +/// +/// Usage: dart bin/untranslated_messages.dart [locale?] +/// +/// Example: dart bin/untranslated_messages.dart +/// +/// or with specific locale (e.g. bn (Bengali)) +/// +/// Example: dart bin/untranslated_messages.dart bn + +void main(List args) { + final file = jsonDecode( + File('untranslated_messages.json').readAsStringSync(), + ) as Map; + + final englishMessages = + jsonDecode(File('lib/l10n/app_en.arb').readAsStringSync()) + as Map; + + final messagesWithValues = {}; + + for (final MapEntry(key: locale, value: messages) in file.entries) { + messagesWithValues[locale] = Map.fromEntries( + messages + .map( + (message) => + MapEntry(message, englishMessages[message]), + ) + .toList() + .cast>(), + ); + } + + print( + const JsonEncoder.withIndent(' ').convert( + args.isNotEmpty ? messagesWithValues[args.first] : messagesWithValues, + ), + ); +} diff --git a/lib/l10n/app_bn.arb b/lib/l10n/app_bn.arb index 277a7997..b9e276f8 100644 --- a/lib/l10n/app_bn.arb +++ b/lib/l10n/app_bn.arb @@ -183,5 +183,71 @@ "step_4_steps": "কপি করা \"sp_dc\" এবং \"sp_key\" এর মান সংশ্লিষ্ট ফিল্ডে পেস্ট করুন", "something_went_wrong": "কিছু ভুল হয়েছে", "piped_instance": "Piped সার্ভার এড্রেস", - "piped_description": "গান ম্যাচ করার জন্য ব্যবহৃত পাইপড সার্ভার\n এগুলোর মধ্যে কিছু ভাল কাজ নাও করতে পারে৷ তাই নিজ দায়িত্বে ব্যবহার করুন" + "piped_description": "গান ম্যাচ করার জন্য ব্যবহৃত পাইপড সার্ভার\n এগুলোর মধ্যে কিছু ভাল কাজ নাও করতে পারে৷ তাই নিজ দায়িত্বে ব্যবহার করুন", + "generate_playlist": "প্লেলিস্ট তৈরি করুন", + "track_exists": "ট্র্যাক {track} ইতিমধ্যে বিদ্যমান", + "replace_downloaded_tracks": "সমস্ত ডাউনলোড করা ট্র্যাক প্রতিস্থাপন করুন", + "skip_download_tracks": "সমস্ত ডাউনলোড করা ট্র্যাক এ স্কিপ করুন", + "do_you_want_to_replace": "আপনি কি বিদ্যমান ট্র্যাকটি প্রতিস্থাপন করতে চান?", + "replace": "প্রতিস্থাপন করুন", + "skip": "স্কিপ করুন", + "select_up_to_count_type": "{count} {type} পর্যন্ত নির্বাচন করুন", + "select_genres": "গানের ধরণ নির্বাচন করুন", + "add_genres": "গানের ধরণ যুক্ত করুন", + "country": "দেশ", + "number_of_tracks_generate": "উত্পাদিত ট্র্যাকের সংখ্যা", + "acousticness": "অধ্যাত্মিকতা", + "danceability": "নৃত্যমূলকতা", + "energy": "শক্তি", + "instrumentalness": "সাধারণতা", + "liveness": "জীবনমুক্ততা", + "loudness": "স্বরের উচ্চতা", + "speechiness": "বক্তব্যমূলকতা", + "valence": "সন্তোষমূলকতা", + "popularity": "জনপ্রিয়তা", + "key": "কী", + "duration": "সময়কাল (সেকেন্ড)", + "tempo": "গতি (বিপিএম)", + "mode": "মোড", + "time_signature": "সময়ের স্বাক্ষর", + "short": "সংক্ষিপ্ত", + "medium": "মাঝারি", + "long": "দীর্ঘ", + "min": "সর্বনিম্ন", + "max": "সর্বাধিক", + "target": "লক্ষ্য", + "moderate": "মাঝারি", + "deselect_all": "সমস্ত অপচুন করুন", + "select_all": "সমস্ত নির্বাচন করুন", + "are_you_sure": "আপনি কি নিশ্চিত?", + "generating_playlist": "আপনার কাস্টম প্লেলিস্ট তৈরি হচ্ছে...", + "selected_count_tracks": "{count} ট্র্যাক নির্বাচিত", + "download_warning": "যদি আপনি সমস্ত ট্র্যাকগুলি একসঙ্গে ডাউনলোড করেন, তবে আপনি নিশ্চিতভাবে সঙ্গীত চুরি করছেন এবং সৃষ্টিশীল সমাজে ক্ষতি দিচ্ছেন। আমি আশা করি আপনি এটা সম্পর্কে জানেন। সর্বদা, শিল্পীদের কঠিন পরিশ্রমকে সম্মান করতে চেষ্টা করুন এবং সমর্থন করুন", + "download_ip_ban_warning": "তথ্যবিশ্বস্ত করে নেওয়া যায় যে, আপনার IP ঠিকানাটি YouTube দ্বারা স্থানান্তরিত করা হতে পারে যখন সাধারন থেকে বেশি ডাউনলোড অনুরোধ হয়। IP ব্লকের মাধ্যমে আপনি কমপক্ষে ২-৩ মাস ধরে (ঐ IP ডিভাইস থেকে) YouTube ব্যবহার করতে পারবেন না। এবং Spotube কোনও দায়িত্ব সম্পর্কে দায়িত্ব বহন করে না যদি এটি ঘটে।", + "by_clicking_accept_terms": "'গ্রহণ' ক্লিক করে আপনি নিম্নলিখিত শর্তাদি স্বীকার করছেন:", + "download_agreement_1": "আমি জানি আমি সঙ্গীত চুরি করছি। আমি খারাপ", + "download_agreement_2": "আমি কেবলমাত্র তাদের কাজ কেনার জন্য অর্থ নেই কিন্তু যেখানে প্রয়োজন সেখানে আমি শিল্পীদের সমর্থন করব।", + "download_agreement_3": "আমি সম্পূর্ণরূপে জানি যে আমার IP YouTube-তে ব্লক হতে পারে এবং আমি Spotube বা তার মালিকানাধীন কোনও দায়িত্ব পেতে পারিনি আমার বর্তমান ক্রিয়াটি দ্বারা সৃষ্ট দুর্ঘটনা করার জন্য", + "decline": "অগ্রায়ন করুন", + "accept": "গ্রহণ করুন", + "details": "বিস্তারিত", + "youtube": "YouTube", + "channel": "চ্যানেল", + "likes": "লাইক", + "dislikes": "অপছন্দ", + "views": "দর্শনার্থী", + "streamUrl": "স্ট্রিম URL", + "stop": "বন্ধ করুন", + "sort_newest": "নতুনতম অনুসারে সাজান", + "sort_oldest": "পুরানোতম অনুসারে সাজান", + "sleep_timer": "স্লীপ টাইমার", + "mins": "{minutes} মিনিট", + "hours": "{hours} ঘন্টা", + "hour": "{hours} ঘন্টা", + "custom_hours": "কাস্টম ঘন্টা", + "logs": "লগ", + "developers": "ডেভেলপার", + "not_logged_in": "আপনি লগইন করা নেই", + "search_mode": "অনুসন্ধান মোড", + "youtube_api_type": "YouTube API প্রকার" } \ No newline at end of file diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index ec8981f1..1b637526 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -246,5 +246,8 @@ "hour": "{hours} Stunde", "custom_hours": "Benutzerdefinierte Stunden", "logs": "Protokolle", - "developers": "Entwickler" + "developers": "Entwickler", + "not_logged_in": "Sie sind nicht angemeldet", + "search_mode": "Suchmodus", + "youtube_api_type": "YouTube API-Typ" } \ No newline at end of file diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 724822a8..681d7114 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -183,5 +183,71 @@ "step_4_steps": "Collez les valeurs copiées de \"sp_dc\" et \"sp_key\" dans les champs respectifs", "something_went_wrong": "Quelque chose s'est mal passé", "piped_instance": "Instance pipée", - "piped_description": "L'instance de serveur Piped à utiliser pour la correspondance des pistes\nCertaines d'entre elles peuvent ne pas fonctionner correctement. Alors utilisez à vos risques et périls" + "piped_description": "L'instance de serveur Piped à utiliser pour la correspondance des pistes\nCertaines d'entre elles peuvent ne pas fonctionner correctement. Alors utilisez à vos risques et périls", + "generate_playlist": "Générer une playlist", + "track_exists": "La piste {track} existe déjà", + "replace_downloaded_tracks": "Remplacer toutes les pistes téléchargées", + "skip_download_tracks": "Ignorer le téléchargement de toutes les pistes téléchargées", + "do_you_want_to_replace": "Voulez-vous remplacer la piste existante ?", + "replace": "Remplacer", + "skip": "Passer", + "select_up_to_count_type": "Sélectionnez jusqu'à {count} {type}", + "select_genres": "Sélectionner les genres", + "add_genres": "Ajouter des genres", + "country": "Pays", + "number_of_tracks_generate": "Nombre de pistes à générer", + "acousticness": "Acoustique", + "danceability": "Dansabilité", + "energy": "Énergie", + "instrumentalness": "Instrumentalité", + "liveness": "Interprétation en direct", + "loudness": "Sonorité", + "speechiness": "Parlé", + "valence": "Valeur émotionnelle", + "popularity": "Popularité", + "key": "Clé", + "duration": "Durée (s)", + "tempo": "Tempo (BPM)", + "mode": "Mode", + "time_signature": "Signature rythmique", + "short": "Court", + "medium": "Moyen", + "long": "Long", + "min": "Min", + "max": "Max", + "target": "Cible", + "moderate": "Modéré", + "deselect_all": "Tout désélectionner", + "select_all": "Tout sélectionner", + "are_you_sure": "Êtes-vous sûr(e) ?", + "generating_playlist": "Génération de votre playlist personnalisée en cours...", + "selected_count_tracks": "{count} pistes sélectionnées", + "download_warning": "Si vous téléchargez toutes les pistes en vrac, vous violez clairement les droits d'auteur de la musique et vous causez des dommages à la société créative de la musique. J'espère que vous en êtes conscient. Essayez toujours de respecter et de soutenir le travail acharné des artistes.", + "download_ip_ban_warning": "Au fait, votre adresse IP peut être bloquée sur YouTube en raison d'une demande excessive de téléchargements par rapport à la normale. Le blocage de l'IP signifie que vous ne pourrez pas utiliser YouTube (même si vous êtes connecté) pendant au moins 2 à 3 mois à partir de cet appareil IP. Et Spotube ne peut être tenu responsable si cela se produit.", + "by_clicking_accept_terms": "En cliquant sur 'accepter', vous acceptez les conditions suivantes :", + "download_agreement_1": "Je sais que je pirate de la musique. Je suis méchant(e).", + "download_agreement_2": "Je soutiendrai l'artiste autant que possible et je ne fais cela que parce que je n'ai pas d'argent pour acheter leur art.", + "download_agreement_3": "Je suis parfaitement conscient(e) que mon adresse IP peut être bloquée sur YouTube et je ne tiens pas Spotube ni ses propriétaires/contributeurs responsables de tout accident causé par mon action actuelle.", + "decline": "Refuser", + "accept": "Accepter", + "details": "Détails", + "youtube": "YouTube", + "channel": "Chaîne", + "likes": "J'aime", + "dislikes": "Je n'aime pas", + "views": "Vues", + "streamUrl": "URL de diffusion", + "stop": "Arrêter", + "sort_newest": "Trier par les plus récents", + "sort_oldest": "Trier par les plus anciens", + "sleep_timer": "Minuteur de veille", + "mins": "{minutes} minutes", + "hours": "{hours} heures", + "hour": "{hours} heure", + "custom_hours": "Heures personnalisées", + "logs": "Journaux", + "developers": "Développeurs", + "not_logged_in": "Vous n'êtes pas connecté(e)", + "search_mode": "Mode de recherche", + "youtube_api_type": "Type d'API YouTube" } \ No newline at end of file diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index de2ed6e2..f8b52007 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -183,5 +183,71 @@ "step_4_steps": "कॉपी की गई \"sp_dc\" और \"sp_key\" मानों को संबंधित फील्ड में पेस्ट करें", "something_went_wrong": "कुछ गलत हो गया", "piped_instance": "पाइप्ड सर्वर", - "piped_description": "पाइप किए गए सर्वर\n गानों का मिलान करने के लिए उपयोग किए जाते हैं, हो सकता है कि उनमें से कुछ के साथ ठीक से काम न करें इसलिए अपने जोखिम पर उपयोग करें" + "piped_description": "पाइप किए गए सर्वर\n गानों का मिलान करने के लिए उपयोग किए जाते हैं, हो सकता है कि उनमें से कुछ के साथ ठीक से काम न करें इसलिए अपने जोखिम पर उपयोग करें", + "generate_playlist": "प्लेलिस्ट बनाएं", + "track_exists": "ट्रैक {track} पहले से मौजूद है", + "replace_downloaded_tracks": "सभी डाउनलोड किए गए ट्रैक्स को बदलें", + "skip_download_tracks": "सभी डाउनलोड किए गए ट्रैक्स को छोड़ें", + "do_you_want_to_replace": "क्या आप मौजूदा ट्रैक को बदलना चाहते हैं?", + "replace": "बदलें", + "skip": "छोड़ें", + "select_up_to_count_type": "{count} {type} तक चुनें", + "select_genres": "जान्र चुनें", + "add_genres": "जान्र जोड़ें", + "country": "देश", + "number_of_tracks_generate": "उत्पन्न करने के लिए ट्रैक की संख्या", + "acousticness": "ध्वनिकता", + "danceability": "नृत्यता", + "energy": "ऊर्जा", + "instrumentalness": "आलापिकता", + "liveness": "जीवंतता", + "loudness": "शोर", + "speechiness": "बोलचालता", + "valence": "मनोदयता", + "popularity": "लोकप्रियता", + "key": "कुंजी", + "duration": "अवधि (सेकंड)", + "tempo": "गति (BPM)", + "mode": "मोड", + "time_signature": "समय छाप", + "short": "संक्षेप", + "medium": "मध्यम", + "long": "लंबा", + "min": "न्यूनतम", + "max": "अधिकतम", + "target": "लक्ष्य", + "moderate": "मध्यम", + "deselect_all": "सभी को अचयनित करें", + "select_all": "सभी को चुनें", + "are_you_sure": "क्या आपको यकीन है?", + "generating_playlist": "आपकी कस्टम प्लेलिस्ट बनाई जा रही है...", + "selected_count_tracks": "{count} ट्रैक्स चयनित हैं", + "download_warning": "यदि आप सभी ट्रैक्स को बल्क में डाउनलोड करते हैं, तो आप स्पष्ट रूप से संगीत की अवैध नकली बना रहे हैं और संगीत के रचनात्मक समाज को क्षति पहुंचा रहे हैं। मुझे आशा है कि आप इसके बारे में जागरूक हैं। हमेशा कोशिश करें कि कलाकार के मेहनत का सम्मान और समर्थन करें।", + "download_ip_ban_warning": "बाहरी डाउनलोड अनुरोधों के कारण आपका आईपी YouTube पर अधिक से अधिक ब्लॉक हो सकता है। आईपी ब्लॉक का अर्थ है कि आप उसी आईपी उपकरण से कम से कम 2-3 महीनों तक YouTube का उपयोग नहीं कर सकेंगे (यदि आप लॉग इन हैं तो भी)। और स्पोट्यूब किसी भी जिम्मेदारी को नहीं उठाता है अगर ऐसा कभी होता है।", + "by_clicking_accept_terms": "'स्वीकार' पर क्लिक करके आप निम्नलिखित शर्तों से सहमत होते हैं:", + "download_agreement_1": "मुझे पता है कि मैं संगीत की अवैध नकली बना रहा हूं। मैं बुरा हूं", + "download_agreement_2": "मैं कलाकार का समर्थन करूंगा जहां भी मुझे संभव हो और मैं केवल इसल िए ऐसा कर रहा हूं क्योंकि मेरे पास उनकी कला खरीदने के लिए पैसे नहीं हैं।", + "download_agreement_3": "मैं पूरी तरह से जागरूक हूं कि मेरा आईपी YouTube पर ब्लॉक हो सकता है और मैं स्पोट्यूब या उसके मालिकों / सहयोगियों को किसी भी दुर्घटना के लिए जिम्मेदार नहीं मानता।", + "decline": "इनकार करें", + "accept": "स्वीकार करें", + "details": "विवरण", + "youtube": "YouTube", + "channel": "चैनल", + "likes": "पसंद", + "dislikes": "अप्रिय", + "views": "दृश्य", + "streamUrl": "स्ट्रीम URL", + "stop": "रोकें", + "sort_newest": "नवीनतम जोड़े गए के अनुसार क्रमबद्ध करें", + "sort_oldest": "सबसे पुराने जोड़े गए के अनुसार क्रमबद्ध करें", + "sleep_timer": "स्लीप टाइमर", + "mins": "{mins} मिनट", + "hours": "{hours} घंटे", + "hour": "{hour} घंटा", + "custom_hours": "कस्टम घंटे", + "logs": "लॉग", + "developers": "डेवलपर्स", + "not_logged_in": "आप लॉग इन नहीं हैं", + "search_mode": "खोज मोड", + "youtube_api_type": "YouTube API प्रकार" } \ No newline at end of file diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index d6dfe402..a7d64081 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -246,5 +246,8 @@ "hour": "{hours} 時間", "custom_hours": "時間を指定", "logs": "ログ", - "developers": "開発" -} + "developers": "開発", + "not_logged_in": "ログインしていません", + "search_mode": "検索モード", + "youtube_api_type": "YouTube APIの種類" +} \ No newline at end of file diff --git a/untranslated_messages.json b/untranslated_messages.json index 27f19dc8..9e26dfee 100644 --- a/untranslated_messages.json +++ b/untranslated_messages.json @@ -1,220 +1 @@ -{ - "bn": [ - "generate_playlist", - "track_exists", - "replace_downloaded_tracks", - "skip_download_tracks", - "do_you_want_to_replace", - "replace", - "skip", - "select_up_to_count_type", - "select_genres", - "add_genres", - "country", - "number_of_tracks_generate", - "acousticness", - "danceability", - "energy", - "instrumentalness", - "liveness", - "loudness", - "speechiness", - "valence", - "popularity", - "key", - "duration", - "tempo", - "mode", - "time_signature", - "short", - "medium", - "long", - "min", - "max", - "target", - "moderate", - "deselect_all", - "select_all", - "are_you_sure", - "generating_playlist", - "selected_count_tracks", - "download_warning", - "download_ip_ban_warning", - "by_clicking_accept_terms", - "download_agreement_1", - "download_agreement_2", - "download_agreement_3", - "decline", - "accept", - "details", - "youtube", - "channel", - "likes", - "dislikes", - "views", - "streamUrl", - "stop", - "sort_newest", - "sort_oldest", - "sleep_timer", - "mins", - "hours", - "hour", - "custom_hours", - "logs", - "developers", - "not_logged_in", - "search_mode", - "youtube_api_type" - ], - - "de": [ - "not_logged_in", - "search_mode", - "youtube_api_type" - ], - - "fr": [ - "generate_playlist", - "track_exists", - "replace_downloaded_tracks", - "skip_download_tracks", - "do_you_want_to_replace", - "replace", - "skip", - "select_up_to_count_type", - "select_genres", - "add_genres", - "country", - "number_of_tracks_generate", - "acousticness", - "danceability", - "energy", - "instrumentalness", - "liveness", - "loudness", - "speechiness", - "valence", - "popularity", - "key", - "duration", - "tempo", - "mode", - "time_signature", - "short", - "medium", - "long", - "min", - "max", - "target", - "moderate", - "deselect_all", - "select_all", - "are_you_sure", - "generating_playlist", - "selected_count_tracks", - "download_warning", - "download_ip_ban_warning", - "by_clicking_accept_terms", - "download_agreement_1", - "download_agreement_2", - "download_agreement_3", - "decline", - "accept", - "details", - "youtube", - "channel", - "likes", - "dislikes", - "views", - "streamUrl", - "stop", - "sort_newest", - "sort_oldest", - "sleep_timer", - "mins", - "hours", - "hour", - "custom_hours", - "logs", - "developers", - "not_logged_in", - "search_mode", - "youtube_api_type" - ], - - "hi": [ - "generate_playlist", - "track_exists", - "replace_downloaded_tracks", - "skip_download_tracks", - "do_you_want_to_replace", - "replace", - "skip", - "select_up_to_count_type", - "select_genres", - "add_genres", - "country", - "number_of_tracks_generate", - "acousticness", - "danceability", - "energy", - "instrumentalness", - "liveness", - "loudness", - "speechiness", - "valence", - "popularity", - "key", - "duration", - "tempo", - "mode", - "time_signature", - "short", - "medium", - "long", - "min", - "max", - "target", - "moderate", - "deselect_all", - "select_all", - "are_you_sure", - "generating_playlist", - "selected_count_tracks", - "download_warning", - "download_ip_ban_warning", - "by_clicking_accept_terms", - "download_agreement_1", - "download_agreement_2", - "download_agreement_3", - "decline", - "accept", - "details", - "youtube", - "channel", - "likes", - "dislikes", - "views", - "streamUrl", - "stop", - "sort_newest", - "sort_oldest", - "sleep_timer", - "mins", - "hours", - "hour", - "custom_hours", - "logs", - "developers", - "not_logged_in", - "search_mode", - "youtube_api_type" - ], - - "ja": [ - "not_logged_in", - "search_mode", - "youtube_api_type" - ] -} +{} \ No newline at end of file