From 2c46f3af6c781d4fc59c91ef47b58348dc3ff5a3 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 28 Aug 2021 04:39:12 +0530 Subject: [PATCH] Implement i18n with a WIP Bengali Latin translation --- package.json | 6 ++- src/plugins/i18n.js | 73 +++++++++++++++++++++++++++++++++++ src/styles/main.scss | 22 +++++++++++ src/translations/bn-latn.json | 49 +++++++++++++++++++++++ src/translations/de.json | 48 +++++++++++++++++++++++ src/translations/el.json | 48 +++++++++++++++++++++++ src/translations/en.json | 49 +++++++++++++++++++++++ src/translations/fr.json | 48 +++++++++++++++++++++++ src/translations/lt.json | 48 +++++++++++++++++++++++ src/translations/ml.json | 44 +++++++++++++++++++++ src/translations/nb_NO.json | 48 +++++++++++++++++++++++ src/translations/tr.json | 48 +++++++++++++++++++++++ src/translations/zh_Hant.json | 23 +++++++++++ yarn.lock | 43 ++++++++++++--------- 14 files changed, 577 insertions(+), 20 deletions(-) create mode 100644 src/plugins/i18n.js create mode 100644 src/styles/main.scss create mode 100644 src/translations/bn-latn.json create mode 100644 src/translations/de.json create mode 100644 src/translations/el.json create mode 100644 src/translations/en.json create mode 100644 src/translations/fr.json create mode 100644 src/translations/lt.json create mode 100644 src/translations/ml.json create mode 100644 src/translations/nb_NO.json create mode 100644 src/translations/tr.json create mode 100644 src/translations/zh_Hant.json diff --git a/package.json b/package.json index 80a2d32..d0cc763 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "lint": "vue-cli-service lint" }, "dependencies": { + "@babel/eslint-parser": "^7.15.0", + "@fontsource/baloo-da-2": "^4.5.0", "core-js": "^3.16.1", "dompurify": "^2.3.1", "hotkeys-js": "^3.8.7", @@ -19,6 +21,7 @@ "sass-loader": "^10", "shaka-player": "^3.2.0", "vue": "^2.6.14", + "vue-i18n": "^8.25.0", "vue-meta": "^2.4.0", "vue-router": "^3.5.2", "vuetify": "^2.5.8", @@ -33,7 +36,6 @@ "@vue/cli-plugin-vuex": "~4.5.13", "@vue/cli-service": "~4.5.13", "@vue/eslint-config-standard": "^6.1.0", - "babel-eslint": "^10.1.0", "eslint": "^7.32.0", "eslint-plugin-import": "^2.24.0", "eslint-plugin-node": "^11.1.0", @@ -57,7 +59,7 @@ "@vue/standard" ], "parserOptions": { - "parser": "babel-eslint" + "parser": "@babel/eslint-parser" }, "rules": {} }, diff --git a/src/plugins/i18n.js b/src/plugins/i18n.js new file mode 100644 index 0000000..142565d --- /dev/null +++ b/src/plugins/i18n.js @@ -0,0 +1,73 @@ +import Vue from 'vue' +import VueI18n from 'vue-i18n' + +import ENTranslations from '@/translations/en.json' + +Vue.use(VueI18n) + +const messages = { + en: ENTranslations +} + +export const i18n = VueI18n.createI18n({ + locale: 'en', // set default locale + messages +}) + +async function syncStylesPerLanguage (locale) { + switch (locale) { + // All the latin languages + case 'de': + case 'en': + case 'el': + case 'fr': + case 'lt': + case 'ml': + case 'tr': + case 'bn-latn': + // Don't need to import fonts because Latin fonts are always loaded + document.body.classList.remove(...document.body.classList) + document.body.classList.add('latin') + break + // Bengali script + case 'bn-beng': + await import('@fontsource/baloo-da-2/index.css') + document.body.classList.remove(...document.body.classList) + document.body.classList.add('bengali') + break + // Chinese languages + case 'zh_Hant': + // NOTE: if you are Chinese and want to see a different font, just email me + document.body.classList.remove(...document.body.classList) + document.body.classList.add('chinese') + } +} + +export async function loadLocale (locale) { + if (i18n.availableLocales.includes(locale)) { + return + } + // load locale messages with dynamic import + const messages = await import(/* webpackChunkName: "locale-[request]" */ `@/translations/${locale}.json`) + + // set locale and locale message + i18n.global.setLocaleMessage(locale, messages.default) + + return Vue.nextTick() +} + +export async function changeLocale (lang) { + await loadLocale(lang) + await syncStylesPerLanguage(lang) + i18n.locale.value = lang + window.localStorage.setItem('LOCALE', lang) +} + +function initializeLocalLocale () { + const lang = window.localStorage.getItem('LOCALE') + if (lang != null) { + changeLocale(lang).catch(e => console.error(e)) + } +} + +initializeLocalLocale() diff --git a/src/styles/main.scss b/src/styles/main.scss new file mode 100644 index 0000000..313c1e8 --- /dev/null +++ b/src/styles/main.scss @@ -0,0 +1,22 @@ +@mixin addFonts ($font-primary) { + .v-application { + [class*='text-'],[class*='body-'] { + color: #36405a; + font-family: $font-primary, sans-serif !important; + } + .headline, .title { + font-family: $font-primary, sans-serif !important; + } + + font-family: $font-primary, sans-serif !important; + } +} + +.bengali { + @include addFonts('Baloo Da 2'); +} +/* +.latin { + @include addFonts('Some Font'); +} +*/ diff --git a/src/translations/bn-latn.json b/src/translations/bn-latn.json new file mode 100644 index 0000000..bf279f0 --- /dev/null +++ b/src/translations/bn-latn.json @@ -0,0 +1,49 @@ +{ + "titles": { + "trending": "Trending", + "login": "Login", + "register": "Register", + "feed": "Āpanāra phiḍ", + "preferences": "Āpanāra pachanda anuyāẏī māniẏē nin", + "watchHistory": "Ēkhana paryanta ki dēkhēchēn" + }, + "player": { + "watchOnYT": "YouTube ē dēkhun" + }, + "actions": { + "subscribe": "Subscribe", + "unsubscribe": "Unsubscribe", + "view_subscriptions": "View Subscriptions", + "sort_by": "Sort by:", + "most_recent": "Most Recent", + "least_recent": "Least Recent", + "channel_name_asc": "Channel Name (A-Z)", + "channel_name_desc": "Channel Name (Z-A)", + "back": "Back", + "uses_api_from": "Uses the API from ", + "enable_sponsorblock": "Enable Sponsorblock", + "skip_sponsors": "Skip Sponsors", + "skip_intro": "Skip Intermission/Intro Animation", + "skip_outro": "Skip Endcards/Credits", + "skip_preview": "Skip Preview/Recap", + "skip_interaction": "Skip Interaction Reminder (Subscribe)", + "skip_self_promo": "Skip Unpaid/Self Promotion", + "skip_non_music": "Skip Music: Non-Music Section", + "theme": "Theme", + "auto": "Auto", + "dark": "Dark", + "light": "Light", + "autoplay_video": "Autoplay Video", + "audio_only": "Audio Only", + "default_quality": "Default Quality", + "buffering_goal": "Buffering Goal (in seconds)", + "country_selection": "Country Selection", + "default_homepage": "Default Homepage", + "show_comments": "Show Comments", + "minimize_description": "Minimize Description by default", + "store_watch_history": "Store Watch History", + "language_selection": "Language Selection", + "instances_list": "Instances List", + "enabled_codecs": "Enabled Codecs (Multiple)" + } +} diff --git a/src/translations/de.json b/src/translations/de.json new file mode 100644 index 0000000..8afc435 --- /dev/null +++ b/src/translations/de.json @@ -0,0 +1,48 @@ +{ + "actions": { + "skip_outro": "Nachspann überspringen", + "skip_non_music": "Musik überspringen: Nicht-Musik-Bereich", + "skip_self_promo": "Unbezahlte Werbung/Eigenwerbung überspringen", + "skip_interaction": "Interaktionserinnerung überspringen (Abonnieren)", + "skip_preview": "Vorschau/Zusammenfassung überspringen", + "instances_list": "Liste der Instanzen", + "language_selection": "Sprachauswahl", + "store_watch_history": "Wiedergabeverlauf speichern", + "minimize_description": "Beschreibung standardmäßig minimieren", + "show_comments": "Kommentare anzeigen", + "default_homepage": "Standard-Startseite", + "country_selection": "Länderauswahl", + "buffering_goal": "Pufferungsziel (in Sekunden)", + "default_quality": "Standardqualität", + "audio_only": "Nur Audio", + "autoplay_video": "Video automatisch abspielen", + "light": "Hell", + "dark": "Dunkel", + "auto": "Automatisch", + "theme": "Design", + "skip_intro": "Pausen-/Einführungsanimation überspringen", + "skip_sponsors": "Sponsoren überspringen", + "enable_sponsorblock": "Sponsorblock einschalten", + "uses_api_from": "Verwendet die API von ", + "back": "Zurück", + "channel_name_desc": "Kanalname (Z-A)", + "channel_name_asc": "Kanalname (A-Z)", + "least_recent": "Am wenigsten neu", + "most_recent": "Am Neuesten", + "sort_by": "Sortieren nach:", + "view_subscriptions": "Abonnements anzeigen", + "unsubscribe": "Deabonnieren", + "subscribe": "Abonnieren" + }, + "player": { + "watch_on": "Ansehen auf" + }, + "titles": { + "history": "Verlauf", + "preferences": "Einstellungen", + "feed": "Feed", + "register": "Registrieren", + "login": "Anmelden", + "trending": "Trends" + } +} diff --git a/src/translations/el.json b/src/translations/el.json new file mode 100644 index 0000000..7368384 --- /dev/null +++ b/src/translations/el.json @@ -0,0 +1,48 @@ +{ + "actions": { + "instances_list": "Λίστα διακομιστών", + "store_watch_history": "Αποθήκευση ιστορικού παρακολούθησης", + "default_homepage": "Προεπιλεγμένη αρχική σελίδα", + "country_selection": "Επιλογή χώρας", + "audio_only": "Ήχος μόνο", + "skip_non_music": "Παράλειψη μουσικής: Μη-μουσικό τμήμα", + "skip_self_promo": "Παράλειψη μη-χορηγούμενης/προσωπικής προώθησης", + "skip_preview": "Παράλειψη προεπισκόπησης/ανακεφαλαίωσης", + "skip_outro": "Παράλειψη τίτλων τέλους/ευσημάτων", + "skip_intro": "Παράλειψη διακοπών/εισαγωγής", + "skip_sponsors": "Παράλειψη χορηγών", + "channel_name_desc": "Όνομα καναλιού (Ζ-Α)", + "channel_name_asc": "Όνομα καναλιού (Α-Ζ)", + "least_recent": "Λιγότερο πρόσφατα", + "most_recent": "Πιο πρόσφατα", + "skip_interaction": "Παράλειψη υπενθύμισης αλληλεπίδρασης (Εγγραφή)", + "uses_api_from": "Χρήση API από ", + "view_subscriptions": "Προβολή συνδρομών", + "language_selection": "Επιλογή γλώσσας", + "minimize_description": "Ελαχιστοποίηση περιγραφής από προεπιλογή", + "show_comments": "Εμφάνιση σχολίων", + "buffering_goal": "Στόχος Buffering (σε δευτερόλεπτα)", + "default_quality": "Προεπιλεγμένη ποιότητα", + "autoplay_video": "Αυτόματη αναπαραγωγή βίντεο", + "dark": "Σκούρο", + "light": "Φωτεινό", + "auto": "Αυτόματο", + "theme": "Θέμα", + "enable_sponsorblock": "Ενεργοποίηση Sponsorblock", + "back": "Επιστροφή", + "sort_by": "Ταξινόμηση κατά:", + "unsubscribe": "Απεγγραφή", + "subscribe": "Εγγραφή" + }, + "titles": { + "feed": "Τροφοδοσία", + "history": "Ιστορικό", + "preferences": "Ρυθμίσεις", + "register": "Εγγραφή", + "login": "Σύνδεση", + "trending": "Τάσεις" + }, + "player": { + "watch_on": "Παρακολούθηση σε" + } +} diff --git a/src/translations/en.json b/src/translations/en.json new file mode 100644 index 0000000..79c9c85 --- /dev/null +++ b/src/translations/en.json @@ -0,0 +1,49 @@ +{ + "titles": { + "trending": "Trending", + "login": "Login", + "register": "Register", + "feed": "Feed", + "preferences": "Preferences", + "history": "History" + }, + "player": { + "watch_on": "Watch on" + }, + "actions": { + "subscribe": "Subscribe", + "unsubscribe": "Unsubscribe", + "view_subscriptions": "View Subscriptions", + "sort_by": "Sort by:", + "most_recent": "Most Recent", + "least_recent": "Least Recent", + "channel_name_asc": "Channel Name (A-Z)", + "channel_name_desc": "Channel Name (Z-A)", + "back": "Back", + "uses_api_from": "Uses the API from ", + "enable_sponsorblock": "Enable Sponsorblock", + "skip_sponsors": "Skip Sponsors", + "skip_intro": "Skip Intermission/Intro Animation", + "skip_outro": "Skip Endcards/Credits", + "skip_preview": "Skip Preview/Recap", + "skip_interaction": "Skip Interaction Reminder (Subscribe)", + "skip_self_promo": "Skip Unpaid/Self Promotion", + "skip_non_music": "Skip Music: Non-Music Section", + "theme": "Theme", + "auto": "Auto", + "dark": "Dark", + "light": "Light", + "autoplay_video": "Autoplay Video", + "audio_only": "Audio Only", + "default_quality": "Default Quality", + "buffering_goal": "Buffering Goal (in seconds)", + "country_selection": "Country Selection", + "default_homepage": "Default Homepage", + "show_comments": "Show Comments", + "minimize_description": "Minimize Description by default", + "store_watch_history": "Store Watch History", + "language_selection": "Language Selection", + "instances_list": "Instances List", + "enabled_codecs": "Enabled Codecs (Multiple)" + } +} diff --git a/src/translations/fr.json b/src/translations/fr.json new file mode 100644 index 0000000..f0f1d5d --- /dev/null +++ b/src/translations/fr.json @@ -0,0 +1,48 @@ +{ + "titles": { + "trending": "Tendances", + "login": "Se connecter", + "register": "S'inscrire", + "feed": "Abonnements", + "preferences": "Préférences", + "history": "Historique" + }, + "actions": { + "subscribe": "S'abonner", + "unsubscribe": "Se désabonner", + "buffering_goal": "Objectif de mise en mémoire tampon (en secondes)", + "skip_non_music": "Ignorer la musique : section non musicale", + "skip_self_promo": "Ignorer la promotion non rémunérée / l'autopromotion", + "skip_interaction": "Ignorer les rappels d'interaction (S'abonner)", + "skip_preview": "Ignorer l'aperçu / le récapitulatif", + "skip_outro": "Ignorer les crédits de fin", + "skip_intro": "Ignorer l'animation de l'entracte/Intro", + "skip_sponsors": "Ignorer les sponsors", + "instances_list": "Liste des instances", + "language_selection": "Sélection de la langue", + "store_watch_history": "Conserver l'historique de visionnage", + "minimize_description": "Minimiser la description par défaut", + "show_comments": "Afficher les commentaires", + "default_homepage": "Page d'accueil par défaut", + "country_selection": "Sélection du pays", + "autoplay_video": "Lire automatique la vidéo", + "light": "Clair", + "dark": "Sombre", + "auto": "Auto", + "theme": "Thème", + "enable_sponsorblock": "Activer Sponsorblock", + "default_quality": "Qualité par défaut", + "audio_only": "Audio seulement", + "channel_name_desc": "Nom de la chaîne (Z-A)", + "view_subscriptions": "Voir les abonnements", + "back": "Retour", + "uses_api_from": "Utilise l'API de ", + "sort_by": "Trier par :", + "channel_name_asc": "Nom de la chaîne (A-Z)", + "least_recent": "Le moins récent", + "most_recent": "Le plus récent" + }, + "player": { + "watch_on": "Regarder sur" + } +} diff --git a/src/translations/lt.json b/src/translations/lt.json new file mode 100644 index 0000000..c48830c --- /dev/null +++ b/src/translations/lt.json @@ -0,0 +1,48 @@ +{ + "actions": { + "unsubscribe": "Atšaukti prenumeratą", + "subscribe": "Prenumeruoti", + "instances_list": "Perdavimo šaltinių sąrašas", + "language_selection": "Kalbos pasirinkimas", + "store_watch_history": "Saugoti žiūrėjimo istoriją", + "minimize_description": "Suskleisti aprašymą automatiškai", + "show_comments": "Rodyti komentarus", + "default_homepage": "Numatytasis pagrindinis puslapis", + "country_selection": "Šalies pasirinkimas", + "buffering_goal": "Užkrovimo tikslas (sekundėmis)", + "default_quality": "Numatytoji kokybė", + "audio_only": "Tik garsas", + "autoplay_video": "Automatiškai leisti vaizdo įrašus", + "light": "Šviesi", + "auto": "Automatinė", + "dark": "Tamsi", + "theme": "Tema", + "skip_non_music": "Praleisti muziką: ne muzikos įkėlimų pasirinkimas", + "skip_self_promo": "Praleisti nemokamą/savireklamą", + "skip_interaction": "Praleisti sąveikos priminimą (prenumeruoti)", + "skip_preview": "Praleisti peržiūrą/apibendrinimą", + "skip_outro": "Praleisti pabaigos užsklandas/padėkas", + "skip_intro": "Praleisti pertrauką/įžanginę animaciją", + "skip_sponsors": "Praleisti rėmėjus", + "enable_sponsorblock": "Įjungti SponsorBlock", + "uses_api_from": "Naudoja API iš ", + "back": "Atgal", + "channel_name_desc": "Kanalo pavadinimas (Z-A)", + "channel_name_asc": "Kanalo pavadinimas (A-Z)", + "least_recent": "Seniausi", + "most_recent": "Naujausi", + "sort_by": "Rikiuoti pagal:", + "view_subscriptions": "Peržiūrėti prenumeratas" + }, + "player": { + "watch_on": "Žiūrėti per" + }, + "titles": { + "preferences": "Nuostatos", + "feed": "Sklaidos kanalas", + "register": "Registruotis", + "login": "Prisijungti", + "trending": "Tendencijos", + "history": "Istorija" + } +} diff --git a/src/translations/ml.json b/src/translations/ml.json new file mode 100644 index 0000000..f00ef36 --- /dev/null +++ b/src/translations/ml.json @@ -0,0 +1,44 @@ +{ + "titles": { + "trending": "പ്രചരിക്കുന്നത്", + "register": "രജിസ്റ്റർ ചെയ്യുക", + "history": "ചരിത്രം", + "preferences": "ക്രമീകരണങ്ങൾ", + "feed": "ഫീഡ്", + "login": "പ്രവേശിക്കുക" + }, + "actions": { + "view_subscriptions": "സബ്സ്ക്രിപ്ഷനുകൾ കാണുക", + "unsubscribe": "സബ്സ്ക്രൈബ് ചെയ്യേണ്ട", + "subscribe": "സബ്സ്ക്രൈബ് ചെയ്യുക", + "instances_list": "ഇൻസ്റ്റൻസുകളുടെ പട്ടിക", + "minimize_description": "സ്ഥിരമായി വിവരണം ചെറുതാക്കുക", + "skip_intro": "ഇടവേള/ആമുഖ ആനിമേഷൻ ഒഴിവാക്കുക", + "skip_sponsors": "സ്പോൺസർമാരെ ഒഴിവാക്കുക", + "default_quality": "സ്ഥിര വീഡിയോ നിലവാരം", + "skip_outro": "എൻഡ്കാർഡുകൾ/ക്രെഡിറ്റുകൾ ഒഴിവാക്കുക", + "skip_preview": "പ്രിവ്യൂ/റീക്യാപ്പ് ഒഴിവാക്കുക", + "skip_interaction": "ഇടപെടൽ ഓർമ്മപ്പെടുത്തൽ ഒഴിവാക്കുക (സബ്സ്ക്രൈബ് ചെയ്യുക)", + "skip_self_promo": "പണം അടയ്ക്കാത്ത/സ്വയം പ്രമോഷൻ ഒഴിവാക്കുക", + "auto": "സ്വയം തിരഞ്ഞെടുക്കുക", + "theme": "തീം", + "dark": "കറുപ്പ് നിറം", + "light": "വെള്ള നിറം", + "default_homepage": "സ്ഥിര ഹോംപേജ്", + "show_comments": "അഭിപ്രായങ്ങൾ കാണിക്കുക", + "language_selection": "ഭാഷ തിരഞ്ഞെടുക്കുക", + "store_watch_history": "വീഡിയോ ചരിത്രം സംരക്ഷിക്കുക", + "country_selection": "രാജ്യം തിരഞ്ഞെടുക്കുക", + "audio_only": "ശബ്ദം മാത്രം", + "enable_sponsorblock": "Sponsorblock സജ്ജമാക്കുക", + "uses_api_from": "ഇതിൽ നിന്ന് എപിഐ ഉപയോഗിക്കുന്നു ", + "back": "തിരികെ പോവുക", + "channel_name_desc": "ചാനലിൻ്റെ പേര് (Z-A)", + "channel_name_asc": "ചാനലിന്റെ പേര് (A-Z)", + "most_recent": "ഏറ്റവും പുതിയത്", + "sort_by": "ഇങ്ങനെ അടുക്കുക:" + }, + "player": { + "watch_on": "ൽ കാണുക" + } +} diff --git a/src/translations/nb_NO.json b/src/translations/nb_NO.json new file mode 100644 index 0000000..d821c8c --- /dev/null +++ b/src/translations/nb_NO.json @@ -0,0 +1,48 @@ +{ + "actions": { + "instances_list": "Liste over instanser", + "minimize_description": "Minimer beskrivelse som forvalg", + "country_selection": "Land", + "buffering_goal": "Mellomlagringsmål (i sekunder)", + "autoplay_video": "Spill video automatisk", + "skip_non_music": "Hopp over musikk:Del uten musikk", + "auto": "Auto", + "skip_self_promo": "Hopp over ubetalt/selvpromotering", + "skip_interaction": "Hopp over interaksjonspåminnelse (abonnering)", + "skip_preview": "Hopp over forhåndsvisning/reintroduksjon", + "skip_outro": "Skru av rulletekst/sluttpresentasjon", + "skip_intro": "Hopp over forvideo/introanimasjon", + "enable_sponsorblock": "Skru på sponsorblokkering", + "language_selection": "Språk", + "store_watch_history": "Lagre visningshistorikk", + "show_comments": "Vis kommentarer", + "default_homepage": "Forvalgt hjemmeside", + "default_quality": "Forvalgt kvalitet", + "audio_only": "Kun lyd", + "light": "Lys", + "dark": "Mørk", + "theme": "Drakt", + "skip_sponsors": "Hopp over sponsorer", + "uses_api_from": "Bruker API-et fra ", + "back": "Tilbake", + "channel_name_desc": "Kanalnavn (Å-A)", + "channel_name_asc": "Kanalnavn (A-Å)", + "least_recent": "Eldst", + "most_recent": "Nyligst", + "sort_by": "Sorter etter:", + "view_subscriptions": "Vis abonnementer", + "unsubscribe": "Opphev abonnement", + "subscribe": "Abonner" + }, + "player": { + "watch_on": "Vis på" + }, + "titles": { + "feed": "Strøm", + "history": "HIstorikk", + "preferences": "Innstillinger", + "register": "Registrering", + "login": "Logg inn", + "trending": "På vei opp" + } +} diff --git a/src/translations/tr.json b/src/translations/tr.json new file mode 100644 index 0000000..821756a --- /dev/null +++ b/src/translations/tr.json @@ -0,0 +1,48 @@ +{ + "actions": { + "instances_list": "Örnek Listesi", + "language_selection": "Dil Seçimi", + "store_watch_history": "İzleme Geçmişini Sakla", + "minimize_description": "Açıklamayı öntanımlı olarak küçült", + "show_comments": "Yorumları Göster", + "default_homepage": "Öntanımlı Ana Sayfa", + "country_selection": "Ülke Seçimi", + "buffering_goal": "Arabelleğe Alma Hedefi (saniye cinsinden)", + "default_quality": "Öntanımlı Kalite", + "audio_only": "Yalnızca Ses", + "autoplay_video": "Videoyu Otomatik Oynat", + "light": "Açık", + "dark": "Koyu", + "auto": "Otomatik", + "theme": "Tema", + "skip_non_music": "Müziği Atla: Müzik Dışı Bölüm", + "skip_self_promo": "Ücretsiz/Kendini Tanıtmayı Atla", + "skip_interaction": "Etkileşim Hatırlatıcısını (Abone Ol) Atla", + "skip_preview": "Ön İzlemeyi/Özetlemeyi Atla", + "skip_outro": "Bitiş/Teşekkür Bölümlerini Atla", + "skip_intro": "Ara/Giriş Animasyonunu Atla", + "skip_sponsors": "Sponsorları Atla", + "enable_sponsorblock": "Sponsorblock'u Etkinleştir", + "uses_api_from": "Kullanılan API: ", + "back": "Geri", + "channel_name_desc": "Kanal Adı (Z-A)", + "channel_name_asc": "Kanal Adı (A-Z)", + "least_recent": "En Eski", + "most_recent": "En Yeni", + "sort_by": "Sıralama ölçütü:", + "view_subscriptions": "Abonelikleri Görüntüle", + "unsubscribe": "Abonelikten çık", + "subscribe": "Abone ol" + }, + "player": { + "watch_on": "İzle" + }, + "titles": { + "history": "Geçmiş", + "preferences": "Tercihler", + "feed": "Akış", + "register": "Kaydol", + "login": "Oturum Aç", + "trending": "Öne Çıkanlar" + } +} diff --git a/src/translations/zh_Hant.json b/src/translations/zh_Hant.json new file mode 100644 index 0000000..a189dd9 --- /dev/null +++ b/src/translations/zh_Hant.json @@ -0,0 +1,23 @@ +{ + "actions": { + "skip_intro": "跳過中場休息/介紹動畫", + "skip_sponsors": "跳過贊助商", + "enable_sponsorblock": "啟用 SponsorBlock", + "country_selection": "國家/地區選擇", + "channel_name_desc": "通道名稱 (Z-A)", + "channel_name_asc": "通道名稱 (A-Z)", + "unsubscribe": "取消訂閱", + "subscribe": "訂閱", + "sort_by": "排序方式:", + "view_subscriptions": "查看訂閱", + "language_selection": "語言選擇" + }, + "titles": { + "history": "歷史記錄", + "preferences": "偏好設定", + "feed": "摘要", + "trending": "趨勢", + "register": "註冊", + "login": "登錄" + } +} diff --git a/yarn.lock b/yarn.lock index 5283b24..95d6261 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,6 +42,15 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/eslint-parser@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.15.0.tgz#b54f06e04d0e93aebcba99f89251e3bf0ee39f21" + integrity sha512-+gSPtjSBxOZz4Uh8Ggqu7HbfpB8cT1LwW0DnVVLZEJvzXauiD0Di3zszcBkRmfGGrLdYeHUwcflG7i3tr9kQlw== + dependencies: + eslint-scope "^5.1.1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + "@babel/generator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" @@ -258,7 +267,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.7.0": +"@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== @@ -894,7 +903,7 @@ "@babel/parser" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.7.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== @@ -909,7 +918,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.4.4", "@babel/types@^7.7.0": +"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.4.4": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== @@ -932,6 +941,11 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@fontsource/baloo-da-2@^4.5.0": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@fontsource/baloo-da-2/-/baloo-da-2-4.5.0.tgz#2174da30951e71103859cee9661e80f81d72fed8" + integrity sha512-M3eJ9rXCYt83ENTIpYqy7OuA/Epqd8LYfqUEerT2XVEVXkHMfb+J7BJu8OIv+fq1COegntL1YyznkJuDzF40RQ== + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1984,18 +1998,6 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - babel-extract-comments@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" @@ -3877,12 +3879,12 @@ eslint-utils@^2.0.0, eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0: +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== @@ -7868,7 +7870,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.20.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -9218,6 +9220,11 @@ vue-hot-reload-api@^2.3.0: resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== +vue-i18n@^8.25.0: + version "8.25.0" + resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.25.0.tgz#1037d9295fa2845a230b771de473481edb2cfc4c" + integrity sha512-ynhcL+PmTxuuSE1T10htiSXzjBozxYIE3ffbM1RfgAkVbr/v1SP+9Mi/7/uv8ZVV1yGuKjFAYp9BXq+X7op6MQ== + "vue-loader-v16@npm:vue-loader@^16.1.0": version "16.3.1" resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.3.1.tgz#5b675ae28ac97080111e93b26d22adca36dd57aa"