diff --git a/locales/ar.json b/locales/ar.json index f2d457b6..7deeb553 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -433,5 +433,5 @@ "footer_documentation": "التوثيق", "footer_donate_page": "تبرّع", "preferences_region_label": "بلد المحتوى:. ", - "preferences_quality_dash_label": "جودة الفيديو المفضلة dash: " + "preferences_quality_dash_label": "جودة فيديو DASH المفضلة: " } diff --git a/locales/da.json b/locales/da.json index 72e282bb..d8954f45 100644 --- a/locales/da.json +++ b/locales/da.json @@ -11,7 +11,7 @@ "([^.,0-9]|^)1([^.,0-9]|$)": "`x` afspilningslister", "": "`x` afspilningslister" }, - "LIVE": "DIREKTE", + "LIVE": "LIVE", "Shared `x` ago": "Delt for `x` siden", "Unsubscribe": "Opsig abonnement", "Subscribe": "Abonner", @@ -44,7 +44,7 @@ "Export data as JSON": "Exporter data som JSON", "Delete account?": "Slet konto?", "History": "Historik", - "An alternative front-end to YouTube": "En alternativ forside til YouTube", + "An alternative front-end to YouTube": "Et alternativt front-end til YouTube", "JavaScript license information": "JavaScript licens information", "source": "kilde", "Log in": "Log på", @@ -72,7 +72,7 @@ "preferences_volume_label": "Lydstyrke: ", "preferences_comments_label": "Standard kommentarer: ", "youtube": "YouTube", - "reddit": "reddit", + "reddit": "Reddit", "preferences_captions_label": "Standard undertekster: ", "Fallback captions: ": "Alternative undertekster: ", "preferences_related_videos_label": "Vis relaterede videoer: ", @@ -150,8 +150,8 @@ "Unlisted": "Skjult", "Private": "Privat", "View all playlists": "Vis alle afspilningslister", - "Updated `x` ago": "Opdateret for 'x' siden", - "Delete playlist `x`?": "Opdateret `x` siden", + "Updated `x` ago": "Opdateret for `x` siden", + "Delete playlist `x`?": "Fjern spilleliste `x`?", "Delete playlist": "Slet afspilningsliste", "Create playlist": "Opret afspilningsliste", "Title": "Titel", @@ -176,7 +176,7 @@ }, "Premieres in `x`": "Har premiere om `x`", "Premieres `x`": "Har premiere om `x`", - "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Hej! Det ser ud til at du har JavaScript slået fra. Klik her for at se kommentarer, vær opmærksom på at de kan tage længere om at loade.", + "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Hej! Det ser ud til at du har JavaScript slået fra. Klik her for at se kommentarer, vær opmærksom på at de kan tage længere om at indlæse.", "View YouTube comments": "Vis YouTube kommentarer", "View more comments on Reddit": "Se flere kommentarer på Reddit", "View `x` comments": { @@ -190,17 +190,17 @@ "Quota exceeded, try again in a few hours": "Kvota overskredet, prøv igen om et par timer", "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Login fejlet, tjek at totrinsbekræftelse (Authenticator eller SMS) er slået til.", "Invalid TFA code": "Ugyldig TFA kode", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Login fejlede. Det er måske på grund af to-faktor-autentisering ikk er slået til for din konto.", + "Login failed. This may be because two-factor authentication is not turned on for your account.": "Login fejlede. Dette kan skyldes, at to-faktor autentificering ikke er aktiveret for din konto.", "Wrong answer": "Forkert svar", "Erroneous CAPTCHA": "Fejlagtig CAPTCHA", - "CAPTCHA is a required field": "CAPTCHA er et krævet felt", + "CAPTCHA is a required field": "CAPTCHA er et obligatorisk felt", "User ID is a required field": "Bruger ID er et krævet felt", - "Password is a required field": "Adgangskode er et krævet felt", + "Password is a required field": "Adgangskode er et obligatorisk felt", "Wrong username or password": "Forkert brugernavn eller adgangskode", - "Please sign in using 'Log in with Google'": "Venligst tjek in via 'Log in med Google'", - "Password cannot be empty": "Adgangskode kan ikke være tom", + "Please sign in using 'Log in with Google'": "Log ind via 'Log ind med Google'", + "Password cannot be empty": "Adgangskoden må ikke være tom", "Password cannot be longer than 55 characters": "Adgangskoden må ikke være længere end 55 tegn", - "Please log in": "Venligst log in", + "Please log in": "Venligst log ind", "channel:`x`": "kanal: 'x'", "Deleted or invalid channel": "Slettet eller invalid kanal", "This channel does not exist.": "Denne kanal eksisterer ikke.", @@ -219,5 +219,219 @@ "Could not create mix.": "Kunne ikke skabe blanding.", "Empty playlist": "Tom playliste", "Not a playlist.": "Ikke en playliste.", - "Playlist does not exist.": "Playlist eksisterer ikke." + "Playlist does not exist.": "Playlist eksisterer ikke.", + "Esperanto": "Esperanto", + "Czech": "Tjekkisk", + "Danish": "Dansk", + "Community": "Samfund", + "Afrikaans": "Afrikansk", + "Portuguese": "Portugisisk", + "Ukrainian": "Ukrainsk", + "Fallback comments: ": "Fallback kommentarer: ", + "Popular": "Populær", + "footer_donate_page": "Doner", + "Gujarati": "Gujarati", + "Punjabi": "Punjabi", + "Sundanese": "Sundanesisk", + "Urdu": "Urdu", + "preferences_region_label": "Indhold land: ", + "Hidden field \"challenge\" is a required field": "Det skjulte felt \"challenge\" er et påkrævet felt", + "Albanian": "Albansk", + "preferences_quality_dash_label": "Fortrukket DASH video kvalitet: ", + "live": "Direkte", + "Lao": "Lao-tse", + "Filipino": "Filippinsk", + "Greek": "Græsk", + "Kurdish": "Kurdisk", + "Malay": "Malaysisk", + "Romanian": "Rumænsk", + "Somali": "Somalisk", + "`x` years": { + "": "`x`år", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` år" + }, + "preferences_locale_label": "Sprog: ", + "News": "Nyheder", + "permalink": "permalink", + "date": "Upload dato", + "features": "Funktioner", + "filter": "Filter", + "Khmer": "Khmer", + "Finnish": "Finsk", + "week": "Denne uge", + "Korean": "Koreansk", + "Telugu": "Telugu", + "Malayalam": "Malayalam", + "View as playlist": "Se som spilleliste", + "Hungarian": "Ungarsk", + "Welsh": "Walisisk", + "subtitles": "Undertekster/CC", + "Bosnian": "Bosnisk", + "Yiddish": "Jiddisch", + "Belarusian": "Belarussisk", + "today": "I dag", + "Shona": "Shona", + "Slovenian": "Slovensk", + "Gaming": "Gaming", + "Bangla": "Bengali", + "Swahili": "Swahili", + "`x` marked it with a ❤": "`x`markeret med et ❤", + "Kyrgyz": "Kirgisisk", + "Turkish": "Tyrkisk", + "adminprefs_modified_source_code_url_label": "URL-adresse til modificeret kildekodelager", + "Switch Invidious Instance": "Skift Invidious instans", + "Samoan": "Samoansk", + "Spanish": "Spansk", + "%A %B %-d, %Y": "%A %B %-d, %Y", + "footer_documentation": "Dokumentation", + "Pashto": "Pashto", + "footer_modfied_source_code": "Modificeret Kildekode", + "Released under the AGPLv3 on Github.": "Udgivet under AGPLv3 på Github.", + "Tajik": "Tadsjikisk", + "`x` months": { + "": "`x`måneder", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x`måned" + }, + "month": "Denne måned", + "Hebrew": "Hebraisk", + "Kannada": "Kannada", + "`x` weeks": { + "": "`x`uger", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x`uge" + }, + "Current version: ": "Nuværende version: ", + "Amharic": "Amharisk", + "`x` days": { + "([^.,0-9]|^)1([^.,0-9]|$)": "`x`dag", + "": "`x`dage" + }, + "Swedish": "Svensk", + "Corsican": "Korsikansk", + "movie": "Film", + "Could not pull trending pages.": "Kunne ikke hente trending sider.", + "English": "Engelsk", + "hd": "HD", + "Hausa": "Islandsk", + "year": "Dette år", + "Japanese": "Japansk", + "content_type": "Type", + "Icelandic": "Islandsk", + "Basque": "Baskisk", + "rating": "Bedømmelse", + "Yoruba": "Yoruba", + "Erroneous token": "Fejlagtig token", + "Videos": "Videoer", + "show": "Vis", + "Luxembourgish": "Luxemboursk", + "Vietnamese": "Vietnamesisk", + "Latvian": "Lettisk", + "Indonesian": "Indonesisk", + "duration": "Varighed", + "footer_original_source_code": "Original kildekode", + "Search": "Søg", + "Serbian": "Serbisk", + "Armenian": "Armensk", + "Bulgarian": "Bulgarsk", + "French": "Fransk", + "Burmese": "Burmesisk", + "Macedonian": "Makedonsk", + "Southern Sotho": "Sydlige Sotho", + "About": "Omkring", + "Malagasy": "Madagaskiske", + "Rating: ": "Bedømmelse: ", + "Movies": "Film", + "YouTube comment permalink": "Youtube kommentarer permalink", + "location": "Lokation", + "hdr": "HDR", + "Cebuano": "Cebuano (Sugbuanon)", + "Nyanja": "Nyanja", + "Chinese (Simplified)": "Kinesisk (forenklet)", + "Chinese (Traditional)": "Kinesisk (traditionelt)", + "Dutch": "Hollandsk", + "Estonian": "Estisk", + "preferences_automatic_instance_redirect_label": "Automatisk eksempel omdirigering (Fallback til redirect.invidious.io): ", + "Nepali": "Nepalesisk", + "Norwegian Bokmål": "Norsk Bokmål", + "`x` hours": { + "": "`x` timer", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x`time" + }, + "`x` minutes": { + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` minut", + "": "`x` minuter" + }, + "`x` seconds": { + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` sekund", + "": "`x` sekunder" + }, + "(edited)": "(ændret)", + "preferences_show_nick_label": "Vis kælenavn på toppen: ", + "Galician": "Galisisk", + "German": "Tysk", + "Maori": "Maori", + "Slovak": "Slovakisk", + "relevance": "Relevans", + "hour": "Sidste time", + "playlist": "Spilleliste", + "long": "Lang (> 20 minutter)", + "creative_commons": "Creative Commons", + "Marathi": "Marathi", + "Sindhi": "Sindhi", + "preferences_category_misc": "Diverse indstillinger", + "Erroneous challenge": "Fejlagtig udfordring", + "Hindi": "Hindi", + "Igbo": "Igbo", + "Javanese": "Javanesisk", + "Kazakh": "Kasabhisk", + "Latin": "Latinsk", + "Lithuanian": "Lituaisk", + "Mongolian": "Mongolsk", + "Spanish (Latin America)": "Spansk (Latinamerika)", + "Uzbek": "Usbekisk", + "Western Frisian": "Vestfrisisk", + "Top": "Top", + "Music": "Musik", + "views": "Antal visninger", + "sort": "Sorter efter", + "Zulu": "Zulu", + "Invidious Private Feed for `x`": "Invidious Privat Feed til `x`", + "English (auto-generated)": "Engelsk (autogenereret)", + "Arabic": "Arabisk", + "Croatian": "Kroatisk", + "Hawaiian": "Hawaiiansk", + "Maltese": "Maltesisk", + "Polish": "Polsk", + "Russian": "Russisk", + "Download": "Hent", + "Download as: ": "Hent som: ", + "Playlists": "Spillelister", + "next_steps_error_message_refresh": "Opdater", + "next_steps_error_message_go_to_youtube": "Gå til Youtube", + "footer_source_code": "Kildekode", + "Tamil": "Tamil", + "Xhosa": "Xhosa", + "next_steps_error_message": "Efter det burde du prøve at: ", + "Sinhala": "Singalesisk (Sinhala)", + "Thai": "Thai", + "Broken? Try another Invidious Instance": "I stykker? Prøv en anden Invidious instans", + "No such user": "Brugeren findes ikke", + "Token is expired, please try again": "Token er udløbet, prøv igen", + "Catalan": "Catalansk", + "Haitian Creole": "Haitiansk", + "Irish": "Irsk", + "Persian": "Persisk", + "Scottish Gaelic": "Skotsk Gælisk", + "Default": "Standard", + "Video mode": "Videotilstand", + "short": "Kort (< 4 minutter)", + "Hidden field \"token\" is a required field": "Det skjulte felt \"token\" er et påkrævet felt", + "Azerbaijani": "Aserbajdsjansk", + "Georgian": "Georgisk", + "Italian": "Italiensk", + "Audio mode": "Lydtilstand", + "video": "Video", + "channel": "Kanal", + "3d": "3D", + "4k": "4K", + "Hmong": "Hmong" } diff --git a/locales/de.json b/locales/de.json index 7ec11fef..f0663f12 100644 --- a/locales/de.json +++ b/locales/de.json @@ -19,8 +19,8 @@ "View playlist on YouTube": "Wiedergabeliste auf YouTube anzeigen", "newest": "neueste", "oldest": "älteste", - "popular": "beliebt", - "last": "letzte", + "popular": "beliebteste", + "last": "neueste", "Next page": "Nächste Seite", "Previous page": "Vorherige Seite", "Clear watch history?": "Verlauf löschen?", @@ -72,7 +72,7 @@ "preferences_volume_label": "Wiedergabelautstärke: ", "preferences_comments_label": "Standardkommentare: ", "youtube": "YouTube", - "reddit": "reddit", + "reddit": "Reddit", "preferences_captions_label": "Standarduntertitel: ", "Fallback captions: ": "Ersatzuntertitel: ", "preferences_related_videos_label": "Ähnliche Videos anzeigen? ", @@ -84,7 +84,7 @@ "Dark mode: ": "Nachtmodus: ", "preferences_dark_mode_label": "Modus: ", "dark": "Nachtmodus", - "light": "heller Modus", + "light": "Hellermodus", "preferences_thin_mode_label": "Schlanker Modus: ", "preferences_category_misc": "Sonstige Einstellungen", "preferences_automatic_instance_redirect_label": "Automatische Instanzweiterleitung (über redirect.invidious.io): ", @@ -431,5 +431,6 @@ "footer_documentation": "Dokumentation", "footer_source_code": "Quellcode", "adminprefs_modified_source_code_url_label": "URL zum Repositorie des modifizierten Quellcodes", - "short": "Kurz (< 4 Minuten)" + "short": "Kurz (< 4 Minuten)", + "preferences_region_label": "Land der Inhalte: " } diff --git a/locales/en-US.json b/locales/en-US.json index 036c22f4..8bdf719b 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -69,11 +69,28 @@ "preferences_local_label": "Proxy videos: ", "preferences_speed_label": "Default speed: ", "preferences_quality_label": "Preferred video quality: ", - "preferences_quality_dash_label": "Preferred dash video quality: ", + "preferences_quality_option_dash": "DASH (adaptative quality)", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_option_medium": "Medium", + "preferences_quality_option_small": "Small", + "preferences_quality_dash_label": "Preferred DASH video quality: ", + "preferences_quality_dash_option_auto": "Auto", + "preferences_quality_dash_option_best": "Best", + "preferences_quality_dash_option_worst": "Worst", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_dash_option_2160p": "2160p", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_1080p": "1080p", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_dash_option_480p": "480p", + "preferences_quality_dash_option_360p": "360p", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", "preferences_volume_label": "Player volume: ", "preferences_comments_label": "Default comments: ", "youtube": "YouTube", "reddit": "Reddit", + "invidious": "Invidious", "preferences_captions_label": "Default captions: ", "Fallback captions: ": "Fallback captions: ", "preferences_related_videos_label": "Show related videos: ", @@ -89,7 +106,7 @@ "light": "light", "preferences_thin_mode_label": "Thin mode: ", "preferences_category_misc": "Miscellaneous preferences", - "preferences_automatic_instance_redirect_label": "Automaticatic instance redirection (fallback to redirect.invidious.io): ", + "preferences_automatic_instance_redirect_label": "Automatic instance redirection (fallback to redirect.invidious.io): ", "preferences_category_subscription": "Subscription preferences", "preferences_annotations_subscribed_label": "Show annotations by default for subscribed channels? ", "Redirect homepage to feed: ": "Redirect homepage to feed: ", @@ -423,6 +440,8 @@ "4k": "4K", "location": "Location", "hdr": "HDR", + "purchased" : "Purchased", + "360" : "360°", "filter": "Filter", "Current version: ": "Current version: ", "next_steps_error_message": "After which you should try to: ", @@ -433,5 +452,14 @@ "footer_source_code": "Source code", "footer_original_source_code": "Original source code", "footer_modfied_source_code": "Modified Source code", - "adminprefs_modified_source_code_url_label": "URL to modified source code repository" + "adminprefs_modified_source_code_url_label": "URL to modified source code repository", + "none": "none", + "videoinfo_started_streaming_x_ago": "Started streaming `x` ago", + "videoinfo_watch_on_youTube": "Watch on YouTube", + "videoinfo_youTube_embed_link": "Embed", + "videoinfo_invidious_embed_link": "Embed Link", + "download_subtitles": "Subtitles - `x` (.vtt)", + "user_created_playlists": "`x` created playlists", + "user_saved_playlists": "`x` saved playlists", + "Video unavailable": "Video unavailable" } diff --git a/locales/fr.json b/locales/fr.json index 00971576..d521eb1f 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -87,7 +87,7 @@ "light": "clair", "preferences_thin_mode_label": "Mode léger : ", "preferences_category_misc": "Paramètres divers", - "preferences_automatic_instance_redirect_label": "Redirection vers une autre instance automatique (via redirect.invidious.io) : ", + "preferences_automatic_instance_redirect_label": "Redirection automatique vers une autre instance (via redirect.invidious.io) : ", "preferences_category_subscription": "Préférences des abonnements", "preferences_annotations_subscribed_label": "Afficher les annotations par défaut sur les chaînes auxquelles vous êtes abonnés : ", "Redirect homepage to feed: ": "Rediriger la page d'accueil vers la page d'abonnements : ", @@ -424,7 +424,7 @@ "next_steps_error_message": "Vous pouvez essayer de : ", "next_steps_error_message_refresh": "Rafraîchir la page", "next_steps_error_message_go_to_youtube": "Aller sur YouTube", - "preferences_quality_dash_label": "Qualité préférée de la vidéo du tableau de bord : ", + "preferences_quality_dash_label": "Qualité vidéo DASH préférée : ", "footer_source_code": "Code source", "preferences_region_label": "Pays du contenu : ", "footer_donate_page": "Faire un don", diff --git a/locales/hr.json b/locales/hr.json index 9b5f9250..d005e0dc 100644 --- a/locales/hr.json +++ b/locales/hr.json @@ -87,7 +87,7 @@ "light": "svijetlo", "preferences_thin_mode_label": "Pojednostavljen prikaz: ", "preferences_category_misc": "Razne postavke", - "preferences_automatic_instance_redirect_label": "Automatsko preusmjeravanje instance (u krajnjem slučaju koristi redirect.invidious.io): ", + "preferences_automatic_instance_redirect_label": "Automatsko preusmjeravanje instance (u krajnjem slučaju će se koristiti redirect.invidious.io): ", "preferences_category_subscription": "Postavke pretplata", "preferences_annotations_subscribed_label": "Standardno prikaži napomene za pretplaćene kanale: ", "Redirect homepage to feed: ": "Preusmjeri početnu stranicu na feed: ", @@ -383,7 +383,7 @@ "Movies": "Filmovi", "Download": "Preuzmi", "Download as: ": "Preuzmi kao: ", - "%A %B %-d, %Y": "%A, %-d. %B %Y.", + "%A %B %-d, %Y": "%A, %-d. %B %Y", "(edited)": "(uređeno)", "YouTube comment permalink": "Stalna poveznica YouTube komentara", "permalink": "stalna poveznica", @@ -421,7 +421,7 @@ "hdr": "hdr", "filter": "filtar", "Current version: ": "Trenutačna verzija: ", - "next_steps_error_message": "Nakon toga pokušaj sljedeće: ", + "next_steps_error_message": "Nakon toga bi trebali pokušati sljedeće: ", "next_steps_error_message_refresh": "Aktualiziraj stranicu", "next_steps_error_message_go_to_youtube": "Idi na YouTube", "footer_donate_page": "Doniraj", @@ -433,5 +433,5 @@ "footer_documentation": "Dokumentacija", "footer_original_source_code": "Izvoran izvorni kod", "preferences_region_label": "Zemlja sadržaja: ", - "preferences_quality_dash_label": "Preferirana kvaliteta dash-videa: " + "preferences_quality_dash_label": "Preferirana DASH videokvaliteta: " } diff --git a/locales/id.json b/locales/id.json index 054a2557..72221883 100644 --- a/locales/id.json +++ b/locales/id.json @@ -433,5 +433,5 @@ "footer_modfied_source_code": "Kode sumber yang dimodifikasi", "footer_documentation": "Dokumentasi", "preferences_region_label": "Konten dari negara: ", - "preferences_quality_dash_label": "Kualitas video dash yang disukai: " + "preferences_quality_dash_label": "Kualitas video DASH yang disukai: " } diff --git a/locales/nb-NO.json b/locales/nb-NO.json index 3dd76c1f..818bfb25 100644 --- a/locales/nb-NO.json +++ b/locales/nb-NO.json @@ -431,5 +431,7 @@ "footer_source_code": "Kildekode", "footer_original_source_code": "Opprinnelig kildekode", "footer_modfied_source_code": "Endret kildekode", - "adminprefs_modified_source_code_url_label": "Nettadresse til kodelager inneholdende endret kildekode" + "adminprefs_modified_source_code_url_label": "Nettadresse til kodelager inneholdende endret kildekode", + "preferences_quality_dash_label": "Foretrukket DASH-videokvalitet: ", + "preferences_region_label": "Innholdsland: " } diff --git a/locales/nl.json b/locales/nl.json index e523246b..9214602c 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -42,7 +42,7 @@ "Export subscriptions as OPML": "Abonnementen exporteren als OPML", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnementen exporteren als OPML (voor NewPipe en FreeTube)", "Export data as JSON": "Gegevens exporteren als JSON", - "Delete account?": "Wil je je account verwijderen?", + "Delete account?": "Wilt u uw account verwijderen?", "History": "Geschiedenis", "An alternative front-end to YouTube": "Een alternatief front-end voor YouTube", "JavaScript license information": "JavaScript-licentieinformatie", @@ -414,5 +414,24 @@ "location": "locatie", "hdr": "HDR", "filter": "verfijnen", - "Current version: ": "Huidige versie: " + "Current version: ": "Huidige versie: ", + "Switch Invidious Instance": "Schakel tussen de Invidious Instanties", + "preferences_automatic_instance_redirect_label": "Automatische instantie-omleiding (terugval naar redirect.invidious.io): ", + "preferences_quality_dash_label": "Gewenste DASH-videokwaliteit: ", + "preferences_region_label": "Inhoud land: ", + "preferences_category_misc": "Diverse voorkeuren", + "preferences_show_nick_label": "Toon bijnaam bovenaan: ", + "Released under the AGPLv3 on Github.": "Uitgebracht onder de AGPLv3 op Github.", + "short": "Kort (<4 minuten)", + "next_steps_error_message_refresh": "Vernieuwen", + "next_steps_error_message_go_to_youtube": "Ga naar YouTube", + "footer_donate_page": "Doneren", + "footer_documentation": "Documentatie", + "footer_original_source_code": "Originele bron-code", + "footer_modfied_source_code": "Gewijzigde bron-code", + "adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats", + "Broken? Try another Invidious Instance": "Kapot? Probeer een andere Invidious Instantie", + "next_steps_error_message": "Waarna u moet proberen om: ", + "footer_source_code": "Bron-code", + "long": "Lang (> 20 minuten)" } diff --git a/locales/sr.json b/locales/sr.json index e0713b43..03b6cf9e 100644 --- a/locales/sr.json +++ b/locales/sr.json @@ -1,437 +1,437 @@ { "`x` subscribers": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` пратилаца", - "": "`x` пратилаца" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` pratilac", + "": "`x` pratilaca" }, "`x` videos": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` видео записа", - "": "`x` видео записа" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` video zapis", + "": "`x` video zapisa" }, "`x` playlists": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` списака извођења", - "": "`x` списака извођења" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` spisak izvođenja", + "": "`x` spisaka izvođenja" }, - "LIVE": "УЖИВО", - "Shared `x` ago": "Подељено пре `x`", - "Unsubscribe": "Прекини праћење", - "Subscribe": "Прати", - "View channel on YouTube": "Погледај канал на YouTube-у", - "View playlist on YouTube": "Погледај списак извођења на YouTube-у", - "newest": "најновије", - "oldest": "најстарије", - "popular": "популарно", - "last": "последње", - "Next page": "Следећа страница", - "Previous page": "Претходна страница", - "Clear watch history?": "Избрисати повест прегледања?", - "New password": "Нова запорка", - "New passwords must match": "Нове запорке морају бити истоветне", - "Cannot change password for Google accounts": "Није могуће променити запорку за Google налоге", - "Authorize token?": "Овласти токен?", - "Authorize token for `x`?": "Овласти токен за `x`?", - "Yes": "Да", - "No": "Не", - "Import and Export Data": "Увоз и извоз података", - "Import": "Увези", - "Import Invidious data": "Увези податке са Invidious-а", - "Import YouTube subscriptions": "Увези праћења са YouTube-а", - "Import FreeTube subscriptions (.db)": "Увези праћења са FreeTube-а (.db)", - "Import NewPipe subscriptions (.json)": "Увези праћења са NewPipe-а (.json)", - "Import NewPipe data (.zip)": "Увези податке са NewPipe-а (.zip)", - "Export": "Извези", - "Export subscriptions as OPML": "Извези праћења као OPML датотеку", - "Export subscriptions as OPML (for NewPipe & FreeTube)": "Извези праћења као OPML датотеку (за NewPipe и FreeTube)", - "Export data as JSON": "Извези податке као JSON датотеку", - "Delete account?": "Избрисати рачун?", - "History": "Повест", - "An alternative front-end to YouTube": "Заменски кориснички слој за YouTube", - "JavaScript license information": "Извештај о JavaScript одобрењу", - "source": "извор", - "Log in": "Пријави се", - "Log in/register": "Пријави се/Отвори налог", - "Log in with Google": "Пријави се помоћу Google-а", - "User ID": "Кориснички ИД", - "Password": "Запорка", - "Time (h:mm:ss):": "Време (ч:мм:сс):", - "Text CAPTCHA": "Знаковни CAPTCHA", - "Image CAPTCHA": "Сликовни CAPTCHA", - "Sign In": "Пријава", - "Register": "Отвори налог", - "E-mail": "Е-пошта", - "Google verification code": "Google-ов оверни кôд", - "Preferences": "Подешавања", - "preferences_category_player": "Подешавања репродуктора", - "preferences_video_loop_label": "Увек понављај: ", - "preferences_autoplay_label": "Самопуштање: ", - "preferences_continue_label": "Увек подразумевано пуштај следеће: ", - "preferences_continue_autoplay_label": "Самопуштање следећег видео записа: ", - "preferences_listen_label": "Увек подразумевано укључен само звук: ", - "preferences_local_label": "Приказ видео записа преко посредника: ", - "Playlist privacy": "Подешавања приватности плеј листе", - "Editing playlist `x`": "Измена плеј листе `x`", - "Please sign in using 'Log in with Google'": "Молимо Вас да се пријавите помоћу 'Log in with Google'", - "Playlist does not exist.": "Непостојећа плеј листа.", - "Erroneous challenge": "Погрешан изазов", - "Maltese": "Малтешки", - "Download": "Преузми", - "Download as: ": "Преузми као: ", - "Quota exceeded, try again in a few hours": "Квота је премашена, молимо Вас да покушате за пар сати", - "Bangla": "Бангла/Бенгалски", - "preferences_quality_dash_label": "Преферирани квалитет dash видео формата: ", - "Token manager": "Меначер токена", - "Token": "Токен", + "LIVE": "UŽIVO", + "Shared `x` ago": "Podeljeno pre `x`", + "Unsubscribe": "Prekini praćenje", + "Subscribe": "Prati", + "View channel on YouTube": "Pogledaj kanal na YouTube-u", + "View playlist on YouTube": "Pogledaj spisak izvođenja na YouTube-u", + "newest": "najnovije", + "oldest": "najstarije", + "popular": "popularno", + "last": "poslednje", + "Next page": "Sledeća stranica", + "Previous page": "Prethodna stranica", + "Clear watch history?": "Izbrisati povest pregledanja?", + "New password": "Nova lozinka", + "New passwords must match": "Nove lozinke moraju biti istovetne", + "Cannot change password for Google accounts": "Nije moguće promeniti lozinku za Google naloge", + "Authorize token?": "Ovlasti žeton?", + "Authorize token for `x`?": "Ovlasti žeton za `x`?", + "Yes": "Da", + "No": "Ne", + "Import and Export Data": "Uvoz i Izvoz Podataka", + "Import": "Uvezi", + "Import Invidious data": "Uvezi podatke sa Invidious-a", + "Import YouTube subscriptions": "Uvezi praćenja sa YouTube-a", + "Import FreeTube subscriptions (.db)": "Uvezi praćenja sa FreeTube-a (.db)", + "Import NewPipe subscriptions (.json)": "Uvezi praćenja sa NewPipe-a (.json)", + "Import NewPipe data (.zip)": "Uvezi podatke sa NewPipe-a (.zip)", + "Export": "Izvezi", + "Export subscriptions as OPML": "Izvezi praćenja kao OPML datoteku", + "Export subscriptions as OPML (for NewPipe & FreeTube)": "Izvezi praćenja kao OPML datoteku (za NewPipe i FreeTube)", + "Export data as JSON": "Izvezi podatke kao JSON datoteku", + "Delete account?": "Izbrišite nalog?", + "History": "Istorija", + "An alternative front-end to YouTube": "Zamenski korisnički sloj za YouTube", + "JavaScript license information": "Izveštaj o JavaScript odobrenju", + "source": "izvor", + "Log in": "Prijavi se", + "Log in/register": "Prijavi se/Otvori nalog", + "Log in with Google": "Prijavi se pomoću Google-a", + "User ID": "Korisnički ID", + "Password": "Lozinka", + "Time (h:mm:ss):": "Vreme (č:mm:ss):", + "Text CAPTCHA": "Znakovni CAPTCHA", + "Image CAPTCHA": "Slikovni CAPTCHA", + "Sign In": "Prijava", + "Register": "Otvori nalog", + "E-mail": "E-pošta", + "Google verification code": "Google-ova overna koda", + "Preferences": "Podešavanja", + "preferences_category_player": "Podešavanja reproduktora", + "preferences_video_loop_label": "Uvek ponavljaj: ", + "preferences_autoplay_label": "Samopuštanje: ", + "preferences_continue_label": "Uvek podrazumevano puštaj sledeće: ", + "preferences_continue_autoplay_label": "Samopuštanje sledećeg video zapisa: ", + "preferences_listen_label": "Uvek podrazumevano uključen samo zvuk: ", + "preferences_local_label": "Prikaz video zapisa preko posrednika: ", + "Playlist privacy": "Podešavanja privatnosti plej liste", + "Editing playlist `x`": "Izmena plej liste `x`", + "Please sign in using 'Log in with Google'": "Molimo Vas da se prijavite pomoću 'Log in with Google'", + "Playlist does not exist.": "Nepostojeća plej lista.", + "Erroneous challenge": "Pogrešan izazov", + "Maltese": "Malteški", + "Download": "Preuzmi", + "Download as: ": "Preuzmi kao: ", + "Quota exceeded, try again in a few hours": "Kvota je premašena, molimo vas da pokušate ponovo za par sati", + "Bangla": "Bangla/Bengalski", + "preferences_quality_dash_label": "Preferirani kvalitet DASH video formata: ", + "Token manager": "Upravljanje žetonima", + "Token": "Žeton", "`x` tokens": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` токен", - "": "`x` токена" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` žeton", + "": "`x` žetona" }, - "Import/export": "Увези/Извези", - "revoke": "опозови", + "Import/export": "Uvezi/Izvezi", + "revoke": "opozovi", "`x` unseen notifications": { - "": "`x` непрегледаних обавештења", - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` непрегледаних обавештења" + "": "`x` nepregledanih obaveštenja", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` nepregledanо obaveštenjе" }, - "search": "претрага", - "Log out": "Одјава", - "Source available here.": "Изворни код.", - "Trending": "У тренду", - "Updated `x` ago": "Ажурирано пре `x`", - "Delete playlist `x`?": "Обриши плеј листу `x`?", - "Create playlist": "Направи плеј листу", - "Show less": "Прикажи мање", - "Switch Invidious Instance": "Промени Invidious инстанцу", - "Hide annotations": "Сакриј напомене", - "User ID is a required field": "Кориснички ID је обавезно поље", - "Wrong username or password": "Погрешно корисничко име или лозинка", - "Please log in": "Молимо Вас да се пријавите", - "channel:`x`": "канал:`x`", - "Could not fetch comments": "Узимање коментара није успело", + "search": "pretraga", + "Log out": "Odjava", + "Source available here.": "Izvorna koda je ovde dostupna.", + "Trending": "U trendu", + "Updated `x` ago": "Ažurirano pre `x`", + "Delete playlist `x`?": "Obriši plej listu `x`?", + "Create playlist": "Napravi plej listu", + "Show less": "Prikaži manje", + "Switch Invidious Instance": "Promeni Invidious instancu", + "Hide annotations": "Sakrij napomene", + "User ID is a required field": "Korisnički ID je obavezno polje", + "Wrong username or password": "Pogrešno korisničko ime ili lozinka", + "Please log in": "Molimo vas da se prijavite", + "channel:`x`": "kanal:`x`", + "Could not fetch comments": "Uzimanje komentara nije uspelo", "`x` points": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` поен", - "": "`x` поена" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` poen", + "": "`x` poena" }, - "Could not create mix.": "Прављење микса није успело.", - "Empty playlist": "Празна плеј листа", - "Not a playlist.": "Није плеј листа.", - "Could not pull trending pages.": "Учитавање 'У току' странције није успело.", - "Token is expired, please try again": "Токен је истекао, молимо Вас да покушате поново", - "English (auto-generated)": "Енглески (аутоматски генерисано)", - "Afrikaans": "Африканс", - "Albanian": "Албански", - "Armenian": "Јерменски", - "Azerbaijani": "Азербејџански", - "Basque": "Баскијски", - "Bosnian": "Српски (Босна и Херцеговина)", - "Bulgarian": "Бугарски", - "Burmese": "Бурмански", - "Catalan": "Каталонски", - "Cebuano": "Cebuano", - "Chinese (Traditional)": "Кинески (Традиционални)", - "Corsican": "Корзикански", - "Danish": "Дански", - "Kannada": "Канада (Језик)", - "Kazakh": "Казашки", - "Russian": "Руски", - "Scottish Gaelic": "Шкотски Гелски", - "Sinhala": "Синхалешки", - "Slovak": "Словачки", - "Spanish": "Шпански", - "Spanish (Latin America)": "Шпански (Јужна Америка)", - "Sundanese": "Сундски", - "Swedish": "Шведски", - "Tajik": "Таџички", - "Telugu": "Телугу", - "Turkish": "Турски", - "Ukrainian": "Украјински", - "Urdu": "Урду", - "Uzbek": "Узбечки", - "Vietnamese": "Вијетнамски", + "Could not create mix.": "Pravljenje miksa nije uspelo.", + "Empty playlist": "Prazna plej lista", + "Not a playlist.": "Nije plej lista.", + "Could not pull trending pages.": "Učitavanje 'U toku' stranica nije uspelo.", + "Token is expired, please try again": "Žeton je istekao, molimo vas da pokušate ponovo", + "English (auto-generated)": "Engleski (automatski generisano)", + "Afrikaans": "Afrikans", + "Albanian": "Albanski", + "Armenian": "Jermenski", + "Azerbaijani": "Azerbejdžanski", + "Basque": "Baskijski", + "Bosnian": "Bosanski", + "Bulgarian": "Bugarski", + "Burmese": "Burmanski", + "Catalan": "Katalonski", + "Cebuano": "Sebuano", + "Chinese (Traditional)": "Kineski (Tradicionalni)", + "Corsican": "Korzikanski", + "Danish": "Danski", + "Kannada": "Kanada (Jezik)", + "Kazakh": "Kazaški", + "Russian": "Ruski", + "Scottish Gaelic": "Škotski Gelski", + "Sinhala": "Sinhaleški", + "Slovak": "Slovački", + "Spanish": "Španski", + "Spanish (Latin America)": "Španski (Južna Amerika)", + "Sundanese": "Sundski", + "Swedish": "Švedski", + "Tajik": "Tadžički", + "Telugu": "Telugu", + "Turkish": "Turski", + "Ukrainian": "Ukrajinski", + "Urdu": "Urdu", + "Uzbek": "Uzbečki", + "Vietnamese": "Vijetnamski", "`x` minutes": { - "": "`x` минута", - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` минут" + "": "`x` minuta", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` minut" }, "`x` seconds": { - "": "`x` секунди", - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` секунда" + "": "`x` sekundi", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` sekunda" }, - "Rating: ": "Оцена/е: ", - "View as playlist": "Погледај као плеј листу", - "Default": "Подразумеван/о", - "Gaming": "Гејминг", - "Movies": "Филмови", + "Rating: ": "Ocena/e: ", + "View as playlist": "Pogledaj kao plej listu", + "Default": "Podrazumevan/o", + "Gaming": "Igrice", + "Movies": "Filmovi", "%A %B %-d, %Y": "%A %B %-d, %Y", - "(edited)": "(измењено)", - "YouTube comment permalink": "YouTube коментар трајна веза", - "Audio mode": "Аудио мод", - "Playlists": "Плеј листе", - "relevance": "Ревелантно", - "rating": "Оцене", - "date": "Датум отпремања", - "views": "Број прегледа", - "`x` marked it with a ❤": "`x` је означио/ла ово са ❤", - "duration": "Трајање", - "features": "Карактеристике", - "hour": "Последњи сат", - "week": "Ове недеље", - "month": "Овај месец", - "year": "Ове године", - "video": "Видео", - "playlist": "Плеј листа", - "movie": "Филм", - "long": "Дуг (> 20 минута)", + "(edited)": "(izmenjeno)", + "YouTube comment permalink": "YouTube komentar trajna veza", + "Audio mode": "Audio mod", + "Playlists": "Plej liste", + "relevance": "Relevantnost", + "rating": "Ocene", + "date": "Datum otpremanja", + "views": "Broj pregleda", + "`x` marked it with a ❤": "`x` je označio/la ovo sa ❤", + "duration": "Trajanje", + "features": "Karakteristike", + "hour": "Poslednji sat", + "week": "Ove sedmice", + "month": "Ovaj mesec", + "year": "Ove godine", + "video": "Video", + "playlist": "Plej lista", + "movie": "Film", + "long": "Dugo (> 20 minuta)", "hd": "HD", - "creative_commons": "Creative Commons (Лиценца)", - "3d": "3Д", - "hdr": "Видео високе резолуције", - "filter": "Филтер", - "next_steps_error_message": "Можете урадити нешта од следећег: ", - "next_steps_error_message_go_to_youtube": "Иди на YouTube", - "footer_documentation": "Документација", - "preferences_region_label": "Држава порекла садржаја: ", - "preferences_player_style_label": "Стил плејера: ", - "preferences_dark_mode_label": "Изглед/Тема: ", - "light": "светла", - "preferences_thin_mode_label": "Компактни режим: ", - "preferences_category_misc": "Остала подешавања", - "preferences_automatic_instance_redirect_label": "Аутоматско пребацивање на другу инстанцу у случају отказивања (пређи на redirect.invidious.io): ", - "alphabetically - reverse": "по алфабету - обрнуто", - "Enable web notifications": "Омогући обавештења у веб претраживачу", - "`x` is live": "`x` преноси уживо", - "Manage tokens": "Управљај токенима", - "Watch history": "Историја гледања", - "preferences_feed_menu_label": "Feed мени: ", - "preferences_show_nick_label": "Прикажи надимке на врху: ", - "CAPTCHA enabled: ": "CAPTCHA омогућена: ", - "Registration enabled: ": "Регистрација омогућена: ", - "Subscription manager": "Менаџер претплата", - "Wilson score: ": "Wilson скор: ", - "Engagement: ": "Ангажовање: ", - "Whitelisted regions: ": "Дозвољени региони: ", - "Shared `x`": "Подељено `x`", + "creative_commons": "Creative Commons (Licenca)", + "3d": "3D", + "hdr": "Video Visoke Rezolucije", + "filter": "Filter", + "next_steps_error_message": "Nakon čega bi trebali probati: ", + "next_steps_error_message_go_to_youtube": "Idi na YouTube", + "footer_documentation": "Dokumentacija", + "preferences_region_label": "Država porekla sadržaja: ", + "preferences_player_style_label": "Stil plejera: ", + "preferences_dark_mode_label": "Izgled/Tema: ", + "light": "svetlo", + "preferences_thin_mode_label": "Kompaktni režim: ", + "preferences_category_misc": "Ostala podešavanja", + "preferences_automatic_instance_redirect_label": "Automatsko prebacivanje na drugu instancu u slučaju otkazivanja (preči će nazad na redirect.invidious.io): ", + "alphabetically - reverse": "po alfabetu - obrnuto", + "Enable web notifications": "Omogući obaveštenja u veb pretraživaču", + "`x` is live": "`x` prenosi uživo", + "Manage tokens": "Upravljaj žetonima", + "Watch history": "Istorija gledanja", + "preferences_feed_menu_label": "Dovodna stranica: ", + "preferences_show_nick_label": "Prikaži nadimke na vrhu: ", + "CAPTCHA enabled: ": "CAPTCHA omogućena: ", + "Registration enabled: ": "Registracija omogućena: ", + "Subscription manager": "Upravljanje praćenjima", + "Wilson score: ": "Wilsonova ocena: ", + "Engagement: ": "Angažovanje: ", + "Whitelisted regions: ": "Dozvoljene oblasti: ", + "Shared `x`": "Podeljeno `x`", "`x` views": { - "": "`x` прегледа", - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` преглед" + "": "`x` pregleda", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` pregled" }, - "Premieres in `x`": "Премијера у `x`", - "Premieres `x`": "Премијере у `x`", - "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Хеј! Изгледа да сте онемогућили JavaScript. Кликните овде да видите коментаре, имајте на уму да ово може да потраје дуже док се не учитају.", + "Premieres in `x`": "Premera u `x`", + "Premieres `x`": "Premere u `x`", + "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Hej! Izgleda da ste onemogućili JavaScript. Kliknite ovde da vidite komentare, čuvajte na umu da ovo može da potraje duže dok se ne učitaju.", "View `x` comments": { - "([^.,0-9]|^)1([^.,0-9]|$)": "Прикажи `x` коментар", - "": "Прикажи `x` коментара" + "([^.,0-9]|^)1([^.,0-9]|$)": "Prikaži `x` komentar", + "": "Prikaži `x` komentara" }, - "View Reddit comments": "Прикажи Reddit коментаре", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Неуспешна пријава, проверите да ли сте упалили двофакторну аутентикацију (Аутентикатор или СМС).", - "CAPTCHA is a required field": "CAPTCHA је обавезно поље", - "Croatian": "Хрватски", - "Estonian": "Естонски", - "Filipino": "Филипино", - "French": "Француски", - "Galician": "Галицијски", - "German": "Немачки", - "Greek": "Грчки", - "Hausa": "Хауса", - "Italian": "Италијански", - "Khmer": "Кмерски", - "Kurdish": "Курдски", - "Kyrgyz": "Киргиски", - "Latvian": "Летонски", - "Lithuanian": "Литвански", - "Macedonian": "Македонски", - "Malagasy": "Малгашки", - "Malay": "Малајски", - "Marathi": "Маратхи", - "Mongolian": "Монголски", - "Norwegian Bokmål": "Норвешки Бокмал", - "Nyanja": "Чева", - "Pashto": "Паштунски", - "Persian": "Персијски", - "Punjabi": "Пунџаби", - "Romanian": "Румунски", - "Welsh": "Велшки", - "Western Frisian": "Западнофризијски", + "View Reddit comments": "Prikaži Reddit komentare", + "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Neuspešna prijava, proverite da li ste upalili dvofaktornu autentikaciju (Autentikator ili SMS).", + "CAPTCHA is a required field": "CAPTCHA je obavezno polje", + "Croatian": "Hrvatski", + "Estonian": "Estonski", + "Filipino": "Filipino", + "French": "Francuski", + "Galician": "Galicijski", + "German": "Nemački", + "Greek": "Grčki", + "Hausa": "Hausa", + "Italian": "Talijanski", + "Khmer": "Kmerski", + "Kurdish": "Kurdski", + "Kyrgyz": "Kirgiski", + "Latvian": "Letonski", + "Lithuanian": "Litvanski", + "Macedonian": "Makedonski", + "Malagasy": "Malgaški", + "Malay": "Malajski", + "Marathi": "Marathi", + "Mongolian": "Mongolski", + "Norwegian Bokmål": "Norveški Bokmal", + "Nyanja": "Čeva", + "Pashto": "Paštunski", + "Persian": "Persijski", + "Punjabi": "Pundžabi", + "Romanian": "Rumunski", + "Welsh": "Velški", + "Western Frisian": "Zapadnofrizijski", "`x` years": { - "": "`x` година", - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` година" + "": "`x` godina", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` godina" }, "`x` weeks": { - "": "`x` недеља", - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` недеља" + "": "`x` sedmica", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` sedmica" }, "`x` days": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` дан", - "": "`x` дана" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` dan", + "": "`x` dana" }, "`x` hours": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` сат", - "": "`x` сати" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` sat", + "": "`x` sati" }, - "Fallback comments: ": "Коментари у случају отказивања: ", - "Popular": "Популарно", - "Search": "Претрага", - "About": "О програму", - "footer_source_code": "Изворни Код", - "footer_original_source_code": "Оригинални изворни код", - "preferences_related_videos_label": "Прикажи сличне видео клипове: ", - "preferences_annotations_label": "Прикажи напомене подразумевано: ", - "preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ", - "preferences_vr_mode_label": "Интерактивни видео клипови у 360 степени: ", - "preferences_category_visual": "Визуелне преференце", - "preferences_captions_label": "Подразумевани титл: ", - "Music": "Музика", - "content_type": "Тип", - "Broken? Try another Invidious Instance": "Не функционише исправно? Пробајте другу Invidious инстанцу", - "Tamil": "Тамилски", - "Save preferences": "Сачувај подешавања", - "Only show latest unwatched video from channel: ": "Прикажи само последње видео клипове који нису погледани са канала: ", - "Xhosa": "Коса (Језик)", - "channel": "Канал", - "Hungarian": "Мађарски", - "Maori": "Маори (Језик)", - "Manage subscriptions": "Управљај претплатама", - "Hindi": "Хинди", - "`x` ago": "пре `x`", - "Import/export data": "Увези/Извези податке", - "`x` uploaded a video": "`x` је отпремио/ла видео клип", + "Fallback comments: ": "Komentari u slučaju otkazivanja: ", + "Popular": "Popularno", + "Search": "Pretraga", + "About": "O programu", + "footer_source_code": "Izvorna Koda", + "footer_original_source_code": "Originalna Izvorna Koda", + "preferences_related_videos_label": "Prikaži slične video klipove: ", + "preferences_annotations_label": "Prikaži napomene podrazumevano: ", + "preferences_extend_desc_label": "Automatski prikaži ceo opis videa: ", + "preferences_vr_mode_label": "Interaktivni video klipovi u 360 stepeni: ", + "preferences_category_visual": "Vizuelne preference", + "preferences_captions_label": "Podrazumevani titl: ", + "Music": "Muzika", + "content_type": "Tip", + "Broken? Try another Invidious Instance": "Ne funkcioniše ispravno? Probajte drugu Invidious instancu", + "Tamil": "Tamilski", + "Save preferences": "Sačuvaj podešavanja", + "Only show latest unwatched video from channel: ": "Prikaži samo poslednje video klipove koji nisu pogledani sa kanala: ", + "Xhosa": "Kosa (Jezik)", + "channel": "Kanal", + "Hungarian": "Mađarski", + "Maori": "Maori (Jezik)", + "Manage subscriptions": "Upravljaj zapisima", + "Hindi": "Hindi", + "`x` ago": "pre `x`", + "Import/export data": "Uvezi/Izvezi podatke", + "`x` uploaded a video": "`x` je otpremio/la video klip", "View `x` replies": { - "([^.,0-9]|^)1([^.,0-9]|$)": "Погледај `x` одоговор", - "": "Погледај `x` одоговора" + "([^.,0-9]|^)1([^.,0-9]|$)": "Prikaži `x` odgovor", + "": "Prikaži `x` odgovora" }, - "Delete account": "Обриши налог", - "preferences_default_home_label": "Подразумевана почетна страница: ", - "Serbian": "Српски", - "License: ": "Лиценца: ", - "live": "Уживо", - "Report statistics: ": "Извештавај о статистици: ", - "Only show latest video from channel: ": "Приказуј последње видео клипове само са канала: ", - "channel name - reverse": "име канала - обрнуто", - "Could not get channel info.": "Узимање података о каналу није успело.", - "View privacy policy.": "Погледај политику приватности.", - "Change password": "Промени лозинку", - "Malayalam": "Малајалам", - "View more comments on Reddit": "Прикажи више коментара на Reddit-у", - "Portuguese": "Португалски", - "View YouTube comments": "Прикажи YouTube коментаре", - "published - reverse": "објављено - обрнуто", - "Dutch": "Белгијски", - "preferences_volume_label": "Јачина звука: ", - "preferences_locale_label": "Језик: ", + "Delete account": "Obriši nalog", + "preferences_default_home_label": "Podrazumevana početna stranica: ", + "Serbian": "Srpski", + "License: ": "Licenca: ", + "live": "Uživo", + "Report statistics: ": "Izveštavaj o statistici: ", + "Only show latest video from channel: ": "Prikazuj poslednje video klipove samo sa kanala: ", + "channel name - reverse": "ime kanala - obrnuto", + "Could not get channel info.": "Uzimanje podataka o kanalu nije uspelo.", + "View privacy policy.": "Pogledaj izveštaj o privatnosti.", + "Change password": "Promeni lozinku", + "Malayalam": "Malajalam", + "View more comments on Reddit": "Prikaži više komentara na Reddit-u", + "Portuguese": "Portugalski", + "View YouTube comments": "Prikaži YouTube komentare", + "published - reverse": "objavljeno - obrnuto", + "Dutch": "Holandski", + "preferences_volume_label": "Jačina zvuka: ", + "preferences_locale_label": "Jezik: ", "`x` subscriptions": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` пратиоц", - "": "`x` пратилаца" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` praćenje", + "": "`x` praćenja" }, - "adminprefs_modified_source_code_url_label": "URL веза до репозиторијума са измењеним изворним кодом", - "Community": "Заједница", - "Video mode": "Видео мод", - "Fallback captions: ": "Титл у случају да главни није доступан: ", - "Private": "Приватно", - "alphabetically": "по алфабету", - "No such user": "Непостојећи корисник", - "Subscriptions": "Праћења", - "today": "Данас", - "Finnish": "Фински", - "Lao": "Лаоски", - "Login enabled: ": "Пријава омогућена: ", - "Shona": "Шона", - "location": "Локација", - "Load more": "Учитај више", - "Released under the AGPLv3 on Github.": "Избачено под лиценцом AGPLv3 на Github-у.", - "Slovenian": "Словеначки", - "View JavaScript license information.": "Погледај информације лиценце везане за JavaScript.", - "Chinese (Simplified)": "Кинески (Поједностављени)", - "preferences_comments_label": "Подразумевани коментари: ", - "Incorrect password": "Нетачна лозинка", - "Show replies": "Прикажи одговоре", - "Invidious Private Feed for `x`": "Invidious приватни Feed за `x`", - "Watch on YouTube": "Гледај на YouTube-у", - "Wrong answer": "Погрешан одговор", - "preferences_quality_label": "Преферирани видео квалитет: ", - "Hide replies": "Сакриј одговоре", - "Invalid TFA code": "Неважећи TFA код", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Неуспешна пријава! Ово се можда дешава јер двофакторна аутентикација није омогућена на Вашем налогу.", - "Erroneous CAPTCHA": "Погрешна CAPTCHA", - "Erroneous token": "Погрешан токен", - "Czech": "Чешки", - "Latin": "Латински", - "Videos": "Видео клипови", + "adminprefs_modified_source_code_url_label": "URL veza do skladišta sa Izmenjenom Izvornom Kodom", + "Community": "Zajednica", + "Video mode": "Video mod", + "Fallback captions: ": "Titl u slučaju da glavni nije dostupan: ", + "Private": "Privatno", + "alphabetically": "po alfabetu", + "No such user": "Nepostojeći korisnik", + "Subscriptions": "Praćenja", + "today": "Danas", + "Finnish": "Finski", + "Lao": "Laoski", + "Login enabled: ": "Prijava omogućena: ", + "Shona": "Šona", + "location": "Lokacija", + "Load more": "Učitaj više", + "Released under the AGPLv3 on Github.": "Izbačeno pod licencom AGPLv3 na Github-u.", + "Slovenian": "Slovenački", + "View JavaScript license information.": "Pogledaj informacije licence vezane za JavaScript.", + "Chinese (Simplified)": "Kineski (Pojednostavljeni)", + "preferences_comments_label": "Podrazumevani komentari: ", + "Incorrect password": "Netačna lozinka", + "Show replies": "Prikaži odgovore", + "Invidious Private Feed for `x`": "Invidious Privatni Dovod za `x`", + "Watch on YouTube": "Gledaj na YouTube-u", + "Wrong answer": "Pogrešan odgovor", + "preferences_quality_label": "Preferirani video kvalitet: ", + "Hide replies": "Sakrij odgovore", + "Invalid TFA code": "Nevažeća TFA koda", + "Login failed. This may be because two-factor authentication is not turned on for your account.": "Neuspešna prijava! Ovo se možda dešava jer dvofaktorna autentikacija nije omogućena na vašem nalogu.", + "Erroneous CAPTCHA": "Pogrešna CAPTCHA", + "Erroneous token": "Pogrešan žeton", + "Czech": "Češki", + "Latin": "Latinski", + "Videos": "Video klipovi", "4k": "4К", - "footer_donate_page": "Донирај", - "English": "Енглески", - "Arabic": "Арапски", - "Unlisted": "Ненаведено", - "Hidden field \"challenge\" is a required field": "Сакривено \"challenge\" поље је обавезно", - "Hidden field \"token\" is a required field": "Сакривено \"token\" поље је обавезно", - "Georgian": "Грузијски", - "Hawaiian": "Хавајски", - "Hebrew": "Хебрејски", - "Icelandic": "Исландски", - "Igbo": "Игбо", - "Japanese": "Јапански", - "Javanese": "Јавански", - "Sindhi": "Синди", - "Swahili": "Свахили", - "Yiddish": "Јидиш", - "Zulu": "Зулу", - "subtitles": "Титл", - "Password cannot be longer than 55 characters": "Лозинка не може бити дужа од 55 карактера", - "This channel does not exist.": "Овај канал не постоји.", - "Belarusian": "Белоруски", - "Gujarati": "Гуџарати", - "Haitian Creole": "Хаићански Креолски", - "Somali": "Сомалијски", - "Top": "Врх", - "footer_modfied_source_code": "Измењени изворни код", - "preferences_category_subscription": "Подешавања праћења", - "preferences_annotations_subscribed_label": "Подразумевано приказати напомене за канале које пратите? ", - "preferences_max_results_label": "Број видео клипова приказаних у листи (feed-у): ", - "preferences_sort_label": "Сортирај видео клипове по: ", - "preferences_unseen_only_label": "Прикажи само видео клипове који нису погледани: ", - "preferences_notifications_only_label": "Прикажи само обавештења (ако их уопште има): ", - "preferences_category_data": "Подешавања података", - "Clear watch history": "Обриши историју гледања", - "preferences_category_admin": "Администраторска подешавања", - "published": "објављено", - "sort": "Сортирај према", - "show": "Шоу", - "short": "Кратак (< 4 минута)", - "Current version: ": "Тренутна верзија: ", - "Top enabled: ": "Врх омогућен: ", - "Public": "Јавно", - "Delete playlist": "Обриши плеј листу", - "Title": "Наслов", - "Show annotations": "Прикажи напомене", - "Password cannot be empty": "Лозинка не може бити празна", - "Deleted or invalid channel": "Обрисан или непостојећи канал", - "Esperanto": "Есперанто", - "Hmong": "Хмонг", - "Luxembourgish": "Луксембуршки", - "Nepali": "Непалски", - "Samoan": "Самоански", - "News": "Вести", - "permalink": "трајна веза", - "Password is a required field": "Лозинка је обавезно поље", - "Amharic": "Амхарски", - "Indonesian": "Индонежански", - "Irish": "Ирски", - "Korean": "Корејски", - "Southern Sotho": "Сото", - "Thai": "Тајски", + "footer_donate_page": "Doniraj", + "English": "Engleski", + "Arabic": "Arapski", + "Unlisted": "Nenavedeno", + "Hidden field \"challenge\" is a required field": "Sakriveno \"challenge\" polje je obavezno", + "Hidden field \"token\" is a required field": "Sakriveno \"token\" polje je obavezno", + "Georgian": "Gruzijski", + "Hawaiian": "Havajski", + "Hebrew": "Hebrejski", + "Icelandic": "Islandski", + "Igbo": "Igbo", + "Japanese": "Japanski", + "Javanese": "Javanski", + "Sindhi": "Sindi", + "Swahili": "Svahili", + "Yiddish": "Jidiš", + "Zulu": "Zulu", + "subtitles": "Titl/Prevod", + "Password cannot be longer than 55 characters": "Lozinka ne može biti duža od 55 karaktera", + "This channel does not exist.": "Ovaj kanal ne postoji.", + "Belarusian": "Beloruski", + "Gujarati": "Gudžarati", + "Haitian Creole": "Haićanski Kreolski", + "Somali": "Somalijski", + "Top": "Vrh", + "footer_modfied_source_code": "Izmenjena Izvorna Koda", + "preferences_category_subscription": "Podešavanja praćenja", + "preferences_annotations_subscribed_label": "Podrazumevano prikazati napomene za kanale koje pratite? ", + "preferences_max_results_label": "Broj video klipova prikazanih u dovodnoj listi: ", + "preferences_sort_label": "Sortiraj video klipove po: ", + "preferences_unseen_only_label": "Prikaži samo video klipove koji nisu pogledani: ", + "preferences_notifications_only_label": "Prikaži samo obaveštenja (ako ih uopšte ima): ", + "preferences_category_data": "Podešavanja podataka", + "Clear watch history": "Obriši istoriju gledanja", + "preferences_category_admin": "Administratorska podešavanja", + "published": "objavljeno", + "sort": "Poredaj prema", + "show": "Emisija", + "short": "Kratko (< 4 minute)", + "Current version: ": "Trenutna verzija: ", + "Top enabled: ": "Vrh omogućen: ", + "Public": "Javno", + "Delete playlist": "Obriši plej listu", + "Title": "Naslov", + "Show annotations": "Prikaži napomene", + "Password cannot be empty": "Lozinka ne može biti prazna", + "Deleted or invalid channel": "Obrisan ili nepostojeći kanal", + "Esperanto": "Esperanto", + "Hmong": "Hmong", + "Luxembourgish": "Luksemburški", + "Nepali": "Nepalski", + "Samoan": "Samoanski", + "News": "Vesti", + "permalink": "trajna veza", + "Password is a required field": "Lozinka je obavezno polje", + "Amharic": "Amharski", + "Indonesian": "Indonežanski", + "Irish": "Irski", + "Korean": "Korejski", + "Southern Sotho": "Južni Soto", + "Thai": "Tajski", "`x` months": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` месец", - "": "`x` месеци" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` mesec", + "": "`x` meseci" }, - "preferences_speed_label": "Подразумевана брзина: ", - "Dark mode: ": "Тамни режим: ", - "dark": "тамна", - "Redirect homepage to feed: ": "Пребаци са почетне странице на листу (feed): ", - "channel name": "име канала", - "View all playlists": "Прегледај све плеј листе", - "Show more": "Прикажи више", - "Genre: ": "Жанр: ", - "Family friendly? ": "Погодно за породицу? ", - "next_steps_error_message_refresh": "Освежи страницу", + "preferences_speed_label": "Podrazumevana brzina: ", + "Dark mode: ": "Tamni režim: ", + "dark": "tamno", + "Redirect homepage to feed: ": "Prebaci sa početne stranice na dovodnu listu: ", + "channel name": "ime kanala", + "View all playlists": "Pregledaj sve plej liste", + "Show more": "Prikaži više", + "Genre: ": "Žanr: ", + "Family friendly? ": "Pogodno za porodicu? ", + "next_steps_error_message_refresh": "Osveži stranicu", "youtube": "YouTube", "reddit": "Reddit", - "unsubscribe": "прекини са праћењем", - "Blacklisted regions: ": "Блокирани региони: ", - "Polish": "Пољски", - "Yoruba": "Јоруба" + "unsubscribe": "prekini sa praćenjem", + "Blacklisted regions: ": "Zabranjene oblasti: ", + "Polish": "Poljski", + "Yoruba": "Joruba" } diff --git a/locales/sr_Cyrl.json b/locales/sr_Cyrl.json index 3a6d6c0b..628fab85 100644 --- a/locales/sr_Cyrl.json +++ b/locales/sr_Cyrl.json @@ -1,170 +1,437 @@ { "`x` subscribers": { - "": "`x` пратилац" + "": "`x` пратилацa", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` пратилац" }, "`x` videos": { - "": "`x` видеа" + "": "`x` видео записа", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` видео запис" }, "`x` playlists": { - "": "`x` плејлиста/е" + "": "`x` списака извођења", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` списак извођења" }, "LIVE": "УЖИВО", - "Shared `x` ago": "Објављено пре `x`", - "Unsubscribe": "Прекините праћење", - "Subscribe": "Пратите", - "View channel on YouTube": "Погледајте канал на YouTube-у", - "View playlist on YouTube": "Погледајте плејлисту на YouTube-у", + "Shared `x` ago": "Подељено пре `x`", + "Unsubscribe": "Прекини праћење", + "Subscribe": "Прати", + "View channel on YouTube": "Погледај канал на YouTube-у", + "View playlist on YouTube": "Погледај списак извођења на YоуТубе-у", "newest": "најновије", "oldest": "најстарије", "popular": "популарно", "last": "последње", "Next page": "Следећа страна", "Previous page": "Претходна страна", - "Clear watch history?": "Обришите историју прегледања?", + "Clear watch history?": "Избрисати повест прегледања?", "New password": "Нова лозинка", - "New passwords must match": "Нове лозинке се морају поклапати", + "New passwords must match": "Нове лозинке морају бити истоветне", "Cannot change password for Google accounts": "Није могуће променити лозинку за Google налоге", - "Authorize token?": "Овластите токен?", - "Authorize token for `x`?": "Овластите токен за `x`?", + "Authorize token?": "Овласти жетон?", + "Authorize token for `x`?": "Овласти жетон за `x`?", "Yes": "Да", "No": "Не", "Import and Export Data": "Увоз и извоз података", - "Import": "Увезите", - "Import Invidious data": "Увезите Invidious податке", - "Import YouTube subscriptions": "Увезите праћења са YouTube-а", - "Import FreeTube subscriptions (.db)": "Увезите праћења са FreeTube-а (.db)", - "Import NewPipe subscriptions (.json)": "Увезите праћења са NewPipe-а (.json)", - "Import NewPipe data (.zip)": "Увезите NewPipe податке (.zip)", - "Export": "Извезите", - "Export subscriptions as OPML": "Извезите праћења у OPML формату", - "Export subscriptions as OPML (for NewPipe & FreeTube)": "Извезите праћења у OPML формату (за NewPipe и FreeTube )", - "Export data as JSON": "Изветизе податке у JSON формату", + "Import": "Увези", + "Import Invidious data": "Увези податке са Individious-а", + "Import YouTube subscriptions": "Увези праћења са YouTube-а", + "Import FreeTube subscriptions (.db)": "Увези праћења са FreeTube-а (.db)", + "Import NewPipe subscriptions (.json)": "Увези праћења са NewPipe-а (.json)", + "Import NewPipe data (.zip)": "Увези податке са NewPipe-a (.zip)", + "Export": "Извези", + "Export subscriptions as OPML": "Извези праћења као ОПМЛ датотеку", + "Export subscriptions as OPML (for NewPipe & FreeTube)": "Извези праћења као ОПМЛ датотеку (за NewPipe и FreeTube)", + "Export data as JSON": "Извези податке као JSON датотеку", "Delete account?": "Избришите налог?", "History": "Историја", - "An alternative front-end to YouTube": "Алтернативни фронтенд за YouTube", - "JavaScript license information": "Извештај о JavaScript лиценци", + "An alternative front-end to YouTube": "Заменски кориснички слој за YouTube", + "JavaScript license information": "Извештај о JavaScript одобрењу", "source": "извор", - "Log in": "Пријавите се", - "Log in/register": "Пријавите се/направите налог", - "Log in with Google": "Пријавите се помоћу Google-а", - "User ID": "ИД корисника", + "Log in": "Пријави се", + "Log in/register": "Пријави се/Отворите налог", + "Log in with Google": "Пријави се помоћу Google-а", + "User ID": "Кориснички ИД", "Password": "Лозинка", - "Time (h:mm:ss):": "Колико је сати? (ч:мм:сс):", - "Text CAPTCHA": "Текстуална CAPTCHA", - "Image CAPTCHA": "Сликовна CAPTCHA", - "Sign In": "Пријавите се", - "Register": "Направите налог", + "Time (h:mm:ss):": "Време (ч:мм:сс):", + "Text CAPTCHA": "Знаковни ЦАПТЧА", + "Image CAPTCHA": "Сликовни CAPTCHA", + "Sign In": "Пријава", + "Register": "Отвори налог", "E-mail": "Е-пошта", - "Google verification code": "Google верификациони кôд", + "Google verification code": "Google-ова оверна кода", "Preferences": "Подешавања", - "preferences_category_player": "Подешавања видео плејера", + "preferences_category_player": "Подешавања репродуктора", "preferences_video_loop_label": "Увек понављај: ", - "preferences_autoplay_label": "Аутоматско пуштање: ", - "preferences_continue_label": "Увек пуштај следеће: ", - "preferences_continue_autoplay_label": "Аутоматско пуштање следећег видеа: ", - "preferences_listen_label": "Режим слушања као подразумевано: ", - "preferences_local_label": "Пуштање видеа кроз прокси сервер: ", - "preferences_speed_label": "Подразумевана брзина репродукције: ", - "preferences_quality_label": "Претпостављени квалитет видеа: ", + "preferences_autoplay_label": "Самопуштање: ", + "preferences_continue_label": "Увек подразумевано пуштај следеће: ", + "preferences_continue_autoplay_label": "Самопуштање следећег видео записа: ", + "preferences_listen_label": "Увек подразумевано укључен само звук: ", + "preferences_local_label": "Приказ видео записа преко посредника: ", + "preferences_speed_label": "Подразумевана брзина: ", + "preferences_quality_label": "Преферирани видео квалитет: ", "preferences_volume_label": "Јачина звука: ", "preferences_comments_label": "Подразумевани коментари: ", - "youtube": "са YouTube-а", - "reddit": "са редита", - "preferences_captions_label": "Подразумевани титлови: ", - "Fallback captions: ": "Алтернативни титлови: ", - "preferences_related_videos_label": "Прикажи сличне видее: ", - "preferences_annotations_label": "Увек приказуј анотације: ", - "preferences_category_visual": "Подешавања изгледа", + "youtube": "YouTube", + "reddit": "Reddit", + "preferences_captions_label": "Подразумевани титл: ", + "Fallback captions: ": "Титл у случају да главни није доступан: ", + "preferences_related_videos_label": "Прикажи сличне видео клипове: ", + "preferences_annotations_label": "Прикажи напомене подразумевано: ", + "preferences_category_visual": "Визуелне преференце", "preferences_player_style_label": "Стил плејера: ", "Dark mode: ": "Тамни режим: ", - "preferences_dark_mode_label": "Тема: ", - "dark": "тамна", - "light": "светла", - "preferences_thin_mode_label": "Узани режим: ", - "preferences_category_subscription": "Подешавања о праћењима", - "preferences_annotations_subscribed_label": "Увек приказуј анотације за канале које пратим: ", - "Redirect homepage to feed: ": "Прикажи праћења као почетну страницу: ", - "preferences_max_results_label": "Количина приказаних видеа на доводу: ", - "preferences_sort_label": "Сортирај према: ", - "published": "датуму објављивања", - "published - reverse": "датуму објављивања - обрнуто", - "alphabetically": "алфабету", - "alphabetically - reverse": "алфабету - обрнуто", - "channel name": "називу канала", - "channel name - reverse": "називу канала - обрнуто", - "Only show latest video from channel: ": "Прикажи само најновији видео са канала: ", - "Only show latest unwatched video from channel: ": "Прикажи само најновији негледани видео са канала: ", - "preferences_unseen_only_label": "Прикажи само негледано: ", - "preferences_notifications_only_label": "Прикажи само обавештења (ако их има): ", - "Enable web notifications": "Укључи обавештења преко претраживача", - "`x` uploaded a video": "`x`је објавио/ла видео", - "`x` is live": "`x` емитује уживо", - "preferences_category_data": "Подешавања о подацима", - "Clear watch history": "Обришите историју прегледања", - "Import/export data": "Увезите или извезите податке", - "Change password": "Промените лозинку", - "Manage subscriptions": "Управљајте праћењима", - "Manage tokens": "Управљајте токенима", - "Watch history": "Историја прегледања", - "Delete account": "Избришите налог", - "preferences_category_admin": "Подешавања администратора", - "preferences_default_home_label": "Подразумевана главна страница: ", - "preferences_feed_menu_label": "Мени довода: ", - "CAPTCHA enabled: ": "CAPTCHA укључена?: ", - "Login enabled: ": "Пријава укључена?: ", - "Registration enabled: ": "Регистрација укључена?: ", + "preferences_dark_mode_label": "Изглед/Тема: ", + "dark": "тамно", + "light": "светло", + "preferences_thin_mode_label": "Компактни режим: ", + "preferences_category_subscription": "Подешавања праћења", + "preferences_annotations_subscribed_label": "Подразумевано приказати напомене за канале које пратите? ", + "Redirect homepage to feed: ": "Пребаци са почетне странице на доводну листу: ", + "preferences_max_results_label": "Број видео клипова приказаних у доводној листи: ", + "preferences_sort_label": "Сортирај видео клипове по: ", + "published": "објављено", + "published - reverse": "објављено - обрнуто", + "alphabetically": "по алфабету", + "alphabetically - reverse": "по алфабету - обрнуто", + "channel name": "име канала", + "channel name - reverse": "име канала - обрнуто", + "Only show latest video from channel: ": "Приказуј последње видео клипове само са канала: ", + "Only show latest unwatched video from channel: ": "Прикажи само последње видео клипове који нису погледани са канала: ", + "preferences_unseen_only_label": "Прикажи само видео клипове који нису погледани: ", + "preferences_notifications_only_label": "Прикажи само обавештења (ако их уопште има): ", + "Enable web notifications": "Омогући обавештења у веб претраживачу", + "`x` uploaded a video": "`x` је отпремио/ла видео клип", + "`x` is live": "`x` преноси уживо", + "preferences_category_data": "Подешавања података", + "Clear watch history": "Обриши историју гледања", + "Import/export data": "Увези/Извези податке", + "Change password": "Промени лозинку", + "Manage subscriptions": "Управљај записима", + "Manage tokens": "Управљај жетонима", + "Watch history": "Историја гледања", + "Delete account": "Обриши налог", + "preferences_category_admin": "Администраторска подешавања", + "preferences_default_home_label": "Подразумевана почетна страница: ", + "preferences_feed_menu_label": "Доводна страница: ", + "CAPTCHA enabled: ": "CAPTCHA омогућена: ", + "Login enabled: ": "Пријава омогућена: ", + "Registration enabled: ": "Регистрација омогућена: ", "Save preferences": "Сачувај подешавања", "Subscription manager": "Управљање праћењима", - "Token manager": "Управљање токенима", - "Token": "Токен", + "Token manager": "Управљање жетонима", + "Token": "Жетон", "`x` subscriptions": { - "": "`x`праћења" + "": "`x` праћења", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` праћење" }, "`x` tokens": { - "": "`x`токена" + "": "`x` жетона", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` жетон" }, - "Import/export": "Увези/извези", - "unsubscribe": "укини праћење", + "Import/export": "Увези/Извези", + "unsubscribe": "прекини са праћењем", "revoke": "опозови", "Subscriptions": "Праћења", "`x` unseen notifications": { - "": "`x` непрочитаних обавештења" + "": "`x` непрочитаних обавештења", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` непрегледано обавештење" }, "search": "претрага", - "Log out": "Одјавите се", - "Source available here.": "Изворни код доступан овде.", - "View JavaScript license information.": "Прикажи информације о JavaScript лиценци.", - "View privacy policy.": "Прикажи извештај о приватности.", + "Log out": "Одјава", + "Source available here.": "Изворна кода је овде доступна.", + "View JavaScript license information.": "Погледај информације лиценце везане за JavaScript.", + "View privacy policy.": "Погледај извештај о приватности.", "Trending": "У тренду", "Public": "Јавно", - "Unlisted": "По позиву", + "Unlisted": "Ненаведено", "Private": "Приватно", - "View all playlists": "Прикажи све плејлисте", + "View all playlists": "Прегледај све плеј листе", "Updated `x` ago": "Ажурирано пре `x`", - "Delete playlist `x`?": "Избриши плејлисту `x`?", - "Delete playlist": "Избриши плејлисту", - "Create playlist": "Направи плејлисту", + "Delete playlist `x`?": "Обриши плеј листу `x`?", + "Delete playlist": "Обриши плеј листу", + "Create playlist": "Направи плеј листу", "Title": "Наслов", - "Playlist privacy": "Видљивост плејлисте", - "Editing playlist `x`": "Уређујете плејлисту `x`", - "Watch on YouTube": "Гледајте на YouTube-у", - "Hide annotations": "Сакриј анотације", - "Show annotations": "Прикажи анотације", + "Playlist privacy": "Подешавања приватности плеј листе", + "Editing playlist `x`": "Измена плеј листе `x`", + "Watch on YouTube": "Гледај на YouTube-у", + "Hide annotations": "Сакриј напомене", + "Show annotations": "Прикажи напомене", "Genre: ": "Жанр: ", "License: ": "Лиценца: ", "Engagement: ": "Ангажовање: ", "Whitelisted regions: ": "Дозвољене области: ", "Blacklisted regions: ": "Забрањене области: ", "`x` views": { - "": "`x` прегледа" + "": "`x` прегледа", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` преглед" }, - "Premieres in `x`": "Емитује се уживо за `x`", - "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Здраво! Изгледа да је искључен JavaScript. Кликните овде да бисте приказали коментаре. Требаће мало дуже да се учитају.", - "View YouTube comments": "Прикажи коментаре са YouTube-а", - "View more comments on Reddit": "Прикажи још коментара на Reddit-у", - "View Reddit comments": "Прикажи коментаре са Reddit-а", + "Premieres in `x`": "Премера у `x`", + "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Хеј! Изгледа да сте онемогућили JavaScript. Кликните овде да видите коментаре, чувајте на уму да ово може да потраје дуже док се не учитају.", + "View YouTube comments": "Прикажи YouTube коментаре", + "View more comments on Reddit": "Прикажи више коментара на Reddit-у", + "View Reddit comments": "Прикажи Reddit коментаре", "Hide replies": "Сакриј одговоре", "Show replies": "Прикажи одговоре", - "Incorrect password": "Неисправна лозинка", - "Current version: ": "Тренутна верзија: " + "Incorrect password": "Нетачна лозинка", + "Current version: ": "Тренутна верзија: ", + "Wilson score: ": "Wилсонова оцена: ", + "Burmese": "Бурмански", + "preferences_quality_dash_label": "Преферирани квалитет DASH видео формата: ", + "Erroneous token": "Погрешан жетон", + "Quota exceeded, try again in a few hours": "Квота је премашена, молимо вас да покушате поново за пар сати", + "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Неуспешна пријава, проверите да ли сте упалили двофакторну аутентикацију (Аутентикатор или СМС).", + "CAPTCHA is a required field": "CAPTCHA је обавезно поље", + "No such user": "Непостојећи корисник", + "Chinese (Traditional)": "Кинески (Традиционални)", + "adminprefs_modified_source_code_url_label": "УРЛ веза до складишта са Измењеном Изворном Кодом", + "`x` hours": { + "": "`x` сати", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` сат" + }, + "Lao": "Лаоски", + "Czech": "Чешки", + "Kannada": "Канада (Језик)", + "Polish": "Пољски", + "Cebuano": "Себуано", + "preferences_show_nick_label": "Прикажи надимке на врху: ", + "Report statistics: ": "Извештавај о статистици: ", + "Show more": "Прикажи више", + "Login failed. This may be because two-factor authentication is not turned on for your account.": "Неуспешна пријава! Ово се можда дешава јер двофакторна аутентикација није омогућена на vашем налогу.", + "Wrong answer": "Погрешан одговор", + "Hidden field \"token\" is a required field": "Сакривено \"token\" поље је обавезно", + "English": "Енглески", + "Albanian": "Албански", + "Amharic": "Амхарски", + "Azerbaijani": "Азербејџански", + "Basque": "Баскијски", + "Belarusian": "Белоруски", + "Chinese (Simplified)": "Кинески (Поједностављени)", + "Croatian": "Хрватски", + "Dutch": "Холандски", + "Esperanto": "Есперанто", + "Finnish": "Фински", + "French": "Француски", + "Georgian": "Грузијски", + "Greek": "Грчки", + "Hausa": "Хауса", + "video": "Видео", + "playlist": "Плеј листа", + "movie": "Филм", + "long": "Дуго (> 20 минута)", + "creative_commons": "Creative Commons (Лиценца)", + "live": "Уживо", + "location": "Локација", + "filter": "Филтер", + "next_steps_error_message": "Након чега би требали пробати: ", + "footer_donate_page": "Донирај", + "footer_documentation": "Документација", + "footer_modfied_source_code": "Измењена Изворна Кода", + "preferences_region_label": "Држава порекла садржаја: ", + "preferences_category_misc": "Остала подешавања", + "User ID is a required field": "Кориснички ИД је обавезно поље", + "Password is a required field": "Лозинка је обавезно поље", + "Wrong username or password": "Погрешно корисничко име или лозинка", + "Please sign in using 'Log in with Google'": "Молимо Вас да се пријавите помоћу 'Log in with Google'", + "Password cannot be empty": "Лозинка не може бити празна", + "Password cannot be longer than 55 characters": "Лозинка не може бити дужа од 55 карактера", + "Invidious Private Feed for `x`": "Инвидиоус Приватни Довод за `x`", + "Deleted or invalid channel": "Обрисан или непостојећи канал", + "This channel does not exist.": "Овај канал не постоји.", + "`x` points": { + "": "`x` поена", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` поен" + }, + "Could not create mix.": "Прављење микса није успело.", + "Empty playlist": "Празна плеј листа", + "Not a playlist.": "Није плеј листа.", + "Playlist does not exist.": "Непостојећа плеј листа.", + "Could not pull trending pages.": "Учитавање 'У току' страница није успело.", + "Hidden field \"challenge\" is a required field": "Сакривено \"challenge\" поље је обавезно", + "Telugu": "Телугу", + "Turkish": "Турски", + "Urdu": "Урду", + "Western Frisian": "Западнофрисијски", + "Xhosa": "Коса (Језик)", + "Yiddish": "Јидиш", + "`x` years": { + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` година", + "": "`x` година" + }, + "`x` weeks": { + "": "`x` седмица", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` седмица" + }, + "Hawaiian": "Хавајски", + "Hmong": "Хмонг", + "Hungarian": "Мађарски", + "Igbo": "Игбо", + "Javanese": "Јавански", + "Khmer": "Кмерски", + "Kyrgyz": "Киргиски", + "Macedonian": "Македонски", + "Maori": "Маори (Језик)", + "Marathi": "Маратхи", + "Nepali": "Непалски", + "Norwegian Bokmål": "Норвешки Бокмал", + "Nyanja": "Чева", + "Russian": "Руски", + "Scottish Gaelic": "Шкотски Гелски", + "Shona": "Шона", + "Slovak": "Словачки", + "Spanish (Latin America)": "Шпански (Јужна Америка)", + "Sundanese": "Сундски", + "Swahili": "Свахили", + "Tajik": "Таџички", + "`x` days": { + "": "`x` дана", + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` дан" + }, + "`x` minutes": { + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` минут", + "": "`x` минута" + }, + "`x` seconds": { + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` секунда", + "": "`x` секунди" + }, + "Search": "Претрага", + "Rating: ": "Ocena/e: ", + "Default": "Подразумеван/о", + "News": "Вести", + "Download": "Преузми", + "(edited)": "(измењено)", + "`x` marked it with a ❤": "`x` је означио/ла ово са ❤", + "Audio mode": "Аудио мод", + "Videos": "Видео клипови", + "views": "Број прегледа", + "features": "Карактеристике", + "today": "Данас", + "%A %B %-d, %Y": "%A %B %-d, %Y", + "preferences_locale_label": "Језик: ", + "Persian": "Перзијски", + "View `x` comments": { + "": "Прикажи `x` коментара", + "([^.,0-9]|^)1([^.,0-9]|$)": "Прикажи `x` коментар" + }, + "channel": "Канал", + "Haitian Creole": "Хаићански Креолски", + "Armenian": "Јерменски", + "View `x` replies": { + "": "Прикажи `x` одговора", + "([^.,0-9]|^)1([^.,0-9]|$)": "Прикажи `x` одговор" + }, + "next_steps_error_message_go_to_youtube": "Иди на YouTube", + "`x` months": { + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` месец", + "": "`x` месеци" + }, + "Indonesian": "Индонежански", + "preferences_vr_mode_label": "Интерактивни видео клипови у 360 степени: ", + "Switch Invidious Instance": "Промени Invidious инстанцу", + "Portuguese": "Португалски", + "week": "Ове седмице", + "show": "Емисија", + "Fallback comments: ": "Коментари у случају отказивања: ", + "hdr": "Видео Високе Резолуције", + "About": "О програму", + "Kazakh": "Казашки", + "Shared `x`": "Подељено `x`", + "Playlists": "Плеј листе", + "Yoruba": "Јоруба", + "Erroneous challenge": "Погрешан изазов", + "Danish": "Дански", + "Could not get channel info.": "Узимање података о каналу није успело.", + "hd": "HD", + "Slovenian": "Словеначки", + "Load more": "Учитај више", + "German": "Немачки", + "Luxembourgish": "Луксембуршки", + "Mongolian": "Монголски", + "Latvian": "Летонски", + "channel:`x`": "kanal:`x`", + "Southern Sotho": "Јужни Сото", + "Popular": "Популарно", + "Gujarati": "Гуџарати", + "year": "Ове године", + "Irish": "Ирски", + "YouTube comment permalink": "YouTube коментар трајна веза", + "Malagasy": "Малгашки", + "Token is expired, please try again": "Жетон је истекао, молимо вас да покушате поново", + "short": "Кратко (< 4 минуте)", + "Samoan": "Самоански", + "Tamil": "Тамилски", + "Ukrainian": "Украјински", + "permalink": "трајна веза", + "Pashto": "Паштунски", + "Community": "Заједница", + "Sindhi": "Синди", + "Could not fetch comments": "Узимање коментара није успело", + "Bangla": "Бангла/Бенгалски", + "Uzbek": "Узбечки", + "Lithuanian": "Литвански", + "Icelandic": "Исландски", + "Thai": "Тајски", + "month": "Овај месец", + "content_type": "Тип", + "hour": "Последњи сат", + "Spanish": "Шпански", + "date": "Датум отпремања", + "View as playlist": "Погледај као плеј листу", + "relevance": "Релевантност", + "Estonian": "Естонски", + "Sinhala": "Синхалешки", + "Corsican": "Корзикански", + "Filipino": "Филипино", + "Gaming": "Игрице", + "Movies": "Филмови", + "rating": "Оцене", + "Top enabled: ": "Врх омогућен: ", + "Released under the AGPLv3 on Github.": "Избачено под лиценцом AGPLv3 на Github-у.", + "Afrikaans": "Африканс", + "preferences_automatic_instance_redirect_label": "Аутоматско пребацивање на другу инстанцу у случају отказивања (пречи ће назад на редирецт.инвидиоус.ио): ", + "Invalid TFA code": "Неважећа TFA кода", + "Please log in": "Молимо вас да се пријавите", + "English (auto-generated)": "Енглески (аутоматски генерисано)", + "Hindi": "Хинди", + "Italian": "Талијански", + "Malayalam": "Малајалам", + "Punjabi": "Пунџаби", + "Somali": "Сомалијски", + "Vietnamese": "Вијетнамски", + "Welsh": "Велшки", + "Zulu": "Зулу", + "Maltese": "Малтешки", + "Swedish": "Шведски", + "Music": "Музика", + "Download as: ": "Преузми као: ", + "duration": "Трајање", + "sort": "Поредај према", + "subtitles": "Титл/Превод", + "preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ", + "Show less": "Прикажи мање", + "Broken? Try another Invidious Instance": "Не функционише исправно? Пробајте другу Invidious инстанцу", + "Family friendly? ": "Погодно за породицу? ", + "Premieres `x`": "Премерe у `x`", + "Bosnian": "Босански", + "Catalan": "Каталонски", + "Japanese": "Јапански", + "Latin": "Латински", + "next_steps_error_message_refresh": "Освежи страницу", + "footer_original_source_code": "Оригинална Изворна Кода", + "Romanian": "Румунски", + "Serbian": "Српски", + "Top": "Врх", + "Video mode": "Видео мод", + "footer_source_code": "Изворна Кода", + "3d": "3D", + "4k": "4K", + "Erroneous CAPTCHA": "Погрешна CAPTCHA", + "`x` ago": "пре `x`", + "Arabic": "Арапски", + "Bulgarian": "Бугарски", + "Galician": "Галицијски", + "Hebrew": "Хебрејски", + "Korean": "Корејски", + "Kurdish": "Курдски", + "Malay": "Малајски" } diff --git a/locales/tr.json b/locales/tr.json index 6e753bfc..372c09a3 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -433,5 +433,5 @@ "adminprefs_modified_source_code_url_label": "Değiştirilmiş kaynak kodları deposunun URL'si", "footer_donate_page": "Bağış yap", "preferences_region_label": "İçerik ülkesi: ", - "preferences_quality_dash_label": "Tercih edilen dash video kalitesi: " + "preferences_quality_dash_label": "Tercih edilen DASH video kalitesi: " } diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 8821ccf9..ed5d82ce 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -433,5 +433,5 @@ "footer_original_source_code": "原始源代码", "footer_donate_page": "捐赠", "preferences_region_label": "内容国家: ", - "preferences_quality_dash_label": "首选 dash 视频分辨率: " + "preferences_quality_dash_label": "首选 DASH 视频分辨率: " } diff --git a/locales/zh-TW.json b/locales/zh-TW.json index b23e439a..2c274969 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -433,5 +433,5 @@ "adminprefs_modified_source_code_url_label": "修改後的原始碼倉庫 URL", "footer_donate_page": "捐款", "preferences_region_label": "內容國家: ", - "preferences_quality_dash_label": "偏好的 dash 影片品質: " + "preferences_quality_dash_label": "偏好的 DASH 影片品質: " } diff --git a/src/invidious.cr b/src/invidious.cr index 4a30f16e..2879853d 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -408,7 +408,7 @@ define_video_playback_routes() # Users post "/watch_ajax" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -478,7 +478,7 @@ end # /modify_notifications?receive_all_updates=false&receive_no_updates=false # will "unding" all subscriptions. get "/modify_notifications" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -551,7 +551,7 @@ get "/modify_notifications" do |env| end post "/subscription_ajax" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -621,7 +621,7 @@ post "/subscription_ajax" do |env| end get "/subscription_manager" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -724,7 +724,7 @@ get "/subscription_manager" do |env| end get "/data_control" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" referer = get_referer(env) @@ -739,7 +739,7 @@ get "/data_control" do |env| end post "/data_control" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" referer = get_referer(env) @@ -902,7 +902,7 @@ post "/data_control" do |env| end get "/change_password" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -920,7 +920,7 @@ get "/change_password" do |env| end post "/change_password" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -976,7 +976,7 @@ post "/change_password" do |env| end get "/delete_account" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -994,7 +994,7 @@ get "/delete_account" do |env| end post "/delete_account" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -1028,7 +1028,7 @@ post "/delete_account" do |env| end get "/clear_watch_history" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -1046,7 +1046,7 @@ get "/clear_watch_history" do |env| end post "/clear_watch_history" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -1071,7 +1071,7 @@ post "/clear_watch_history" do |env| end get "/authorize_token" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -1099,7 +1099,7 @@ get "/authorize_token" do |env| end post "/authorize_token" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -1147,7 +1147,7 @@ post "/authorize_token" do |env| end get "/token_manager" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -1165,7 +1165,7 @@ get "/token_manager" do |env| end post "/token_ajax" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -1225,7 +1225,7 @@ end {"/channel/:ucid/live", "/user/:user/live", "/c/:user/live"}.each do |route| get route do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale # Appears to be a bug in routing, having several routes configured # as `/a/:a`, `/b/:a`, `/c/:a` results in 404 @@ -1347,7 +1347,7 @@ error 404 do |env| end error 500 do |env, ex| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale error_template(500, ex) end diff --git a/src/invidious/helpers/errors.cr b/src/invidious/helpers/errors.cr index e5c77fbc..d10762c5 100644 --- a/src/invidious/helpers/errors.cr +++ b/src/invidious/helpers/errors.cr @@ -22,7 +22,7 @@ def github_details(summary : String, content : String) return HTML.escape(details) end -def error_template_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, exception : Exception) +def error_template_helper(env : HTTP::Server::Context, locale : String?, status_code : Int32, exception : Exception) if exception.is_a?(InfoException) return error_template_helper(env, locale, status_code, exception.message || "") end @@ -46,7 +46,7 @@ def error_template_helper(env : HTTP::Server::Context, locale : Hash(String, JSO return templated "error" end -def error_template_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, message : String) +def error_template_helper(env : HTTP::Server::Context, locale : String?, status_code : Int32, message : String) env.response.content_type = "text/html" env.response.status_code = status_code error_message = translate(locale, message) @@ -58,7 +58,7 @@ macro error_atom(*args) error_atom_helper(env, locale, {{*args}}) end -def error_atom_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, exception : Exception) +def error_atom_helper(env : HTTP::Server::Context, locale : String?, status_code : Int32, exception : Exception) if exception.is_a?(InfoException) return error_atom_helper(env, locale, status_code, exception.message || "") end @@ -67,7 +67,7 @@ def error_atom_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::A return "#{exception.inspect_with_backtrace}" end -def error_atom_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, message : String) +def error_atom_helper(env : HTTP::Server::Context, locale : String?, status_code : Int32, message : String) env.response.content_type = "application/atom+xml" env.response.status_code = status_code return "#{message}" @@ -77,7 +77,7 @@ macro error_json(*args) error_json_helper(env, locale, {{*args}}) end -def error_json_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, exception : Exception, additional_fields : Hash(String, Object) | Nil) +def error_json_helper(env : HTTP::Server::Context, locale : String?, status_code : Int32, exception : Exception, additional_fields : Hash(String, Object) | Nil) if exception.is_a?(InfoException) return error_json_helper(env, locale, status_code, exception.message || "", additional_fields) end @@ -90,11 +90,11 @@ def error_json_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::A return error_message.to_json end -def error_json_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, exception : Exception) +def error_json_helper(env : HTTP::Server::Context, locale : String?, status_code : Int32, exception : Exception) return error_json_helper(env, locale, status_code, exception, nil) end -def error_json_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, message : String, additional_fields : Hash(String, Object) | Nil) +def error_json_helper(env : HTTP::Server::Context, locale : String?, status_code : Int32, message : String, additional_fields : Hash(String, Object) | Nil) env.response.content_type = "application/json" env.response.status_code = status_code error_message = {"error" => message} @@ -104,11 +104,11 @@ def error_json_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::A return error_message.to_json end -def error_json_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, message : String) +def error_json_helper(env : HTTP::Server::Context, locale : String?, status_code : Int32, message : String) error_json_helper(env, locale, status_code, message, nil) end -def error_redirect_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil) +def error_redirect_helper(env : HTTP::Server::Context, locale : String?) request_path = env.request.path if request_path.starts_with?("/search") || request_path.starts_with?("/watch") || diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr index c3b356a9..96a78eb9 100644 --- a/src/invidious/helpers/helpers.cr +++ b/src/invidious/helpers/helpers.cr @@ -190,7 +190,7 @@ def create_notification_stream(env, topics, connection_channel) connection = Channel(PQ::Notification).new(8) connection_channel.send({true, connection}) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale since = env.params.query["since"]?.try &.to_i? id = 0 diff --git a/src/invidious/helpers/i18n.cr b/src/invidious/helpers/i18n.cr index 9e42fad0..6e29b498 100644 --- a/src/invidious/helpers/i18n.cr +++ b/src/invidious/helpers/i18n.cr @@ -1,46 +1,47 @@ # "bn_BD" => load_locale("bn_BD"), # Bengali (Bangladesh) [Incomplete] # "eu" => load_locale("eu"), # Basque [Incomplete] -# "si" => load_locale("si"), # Sinhala [Incomplete] # "sk" => load_locale("sk"), # Slovak [Incomplete] # "sr" => load_locale("sr"), # Serbian [Incomplete] # "sr_Cyrl" => load_locale("sr_Cyrl"), # Serbian (cyrillic) [Incomplete] -LOCALES = { - "ar" => load_locale("ar"), # Arabic - "cs" => load_locale("cs"), # Czech - "da" => load_locale("da"), # Danish - "de" => load_locale("de"), # German - "el" => load_locale("el"), # Greek - "en-US" => load_locale("en-US"), # English (US) - "eo" => load_locale("eo"), # Esperanto - "es" => load_locale("es"), # Spanish - "fa" => load_locale("fa"), # Persian - "fi" => load_locale("fi"), # Finnish - "fr" => load_locale("fr"), # French - "he" => load_locale("he"), # Hebrew - "hr" => load_locale("hr"), # Croatian - "hu-HU" => load_locale("hu-HU"), # Hungarian - "id" => load_locale("id"), # Indonesian - "is" => load_locale("is"), # Icelandic - "it" => load_locale("it"), # Italian - "ja" => load_locale("ja"), # Japanese - "ko" => load_locale("ko"), # Korean - "lt" => load_locale("lt"), # Lithuanian - "nb-NO" => load_locale("nb-NO"), # Norwegian Bokmål - "nl" => load_locale("nl"), # Dutch - "pl" => load_locale("pl"), # Polish - "pt" => load_locale("pt"), # Portuguese - "pt-BR" => load_locale("pt-BR"), # Portuguese (Brazil) - "pt-PT" => load_locale("pt-PT"), # Portuguese (Portugal) - "ro" => load_locale("ro"), # Romanian - "ru" => load_locale("ru"), # Russian - "sv-SE" => load_locale("sv-SE"), # Swedish - "tr" => load_locale("tr"), # Turkish - "uk" => load_locale("uk"), # Ukrainian - "vi" => load_locale("vi"), # Vietnamese - "zh-CN" => load_locale("zh-CN"), # Chinese (Simplified) - "zh-TW" => load_locale("zh-TW"), # Chinese (Traditional) +LOCALES_LIST = { + "ar" => "العربية", # Arabic + "cs" => "Čeština", # Czech + "da" => "Dansk", # Danish + "de" => "Deutsch", # German + "el" => "Ελληνικά", # Greek + "en-US" => "English", # English + "eo" => "Esperanto", # Esperanto + "es" => "Español", # Spanish + "fa" => "فارسی", # Persian + "fi" => "Suomi", # Finnish + "fr" => "Français", # French + "he" => "עברית", # Hebrew + "hr" => "Hrvatski", # Croatian + "hu-HU" => "Magyar Nyelv", # Hungarian + "id" => "Bahasa Indonesia", # Indonesian + "is" => "Íslenska", # Icelandic + "it" => "Italiano", # Italian + "ja" => "日本語", # Japanese + "ko" => "한국어", # Korean + "lt" => "Lietuvių", # Lithuanian + "nb-NO" => "Norsk bokmål", # Norwegian Bokmål + "nl" => "Nederlands", # Dutch + "pl" => "Polski", # Polish + "pt" => "Português", # Portuguese + "pt-BR" => "Português Brasileiro", # Portuguese (Brazil) + "pt-PT" => "Português de Portugal", # Portuguese (Portugal) + "ro" => "Română", # Romanian + "ru" => "русский", # Russian + "sv-SE" => "Svenska", # Swedish + "tr" => "Türkçe", # Turkish + "uk" => "Українська", # Ukrainian + "vi" => "Tiếng Việt", # Vietnamese + "zh-CN" => "汉语", # Chinese (Simplified) + "zh-TW" => "漢語", # Chinese (Traditional) } +LOCALES = load_all_locales() + CONTENT_REGIONS = { "AE", "AR", "AT", "AU", "AZ", "BA", "BD", "BE", "BG", "BH", "BO", "BR", "BY", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "DZ", "EC", "EE", @@ -53,35 +54,50 @@ CONTENT_REGIONS = { "YE", "ZA", "ZW", } -def load_locale(name) - return JSON.parse(File.read("locales/#{name}.json")).as_h +def load_all_locales + locales = {} of String => Hash(String, JSON::Any) + + LOCALES_LIST.each_key do |name| + locales[name] = JSON.parse(File.read("locales/#{name}.json")).as_h + end + + return locales end -def translate(locale : Hash(String, JSON::Any) | Nil, translation : String, text : String | Nil = nil) - # if locale && !locale[translation]? - # puts "Could not find translation for #{translation.dump}" - # end +def translate(locale : String?, key : String, text : String | Nil = nil) : String + # Log a warning if "key" doesn't exist in en-US locale and return + # that key as the text, so this is more or less transparent to the user. + if !LOCALES["en-US"].has_key?(key) + LOGGER.warn("i18n: Missing translation key \"#{key}\"") + return key + end - if locale && locale[translation]? - case locale[translation] - when .as_h? - match_length = 0 + # Default to english, whenever the locale doesn't exist, + # or the key requested has not been translated + if locale && LOCALES.has_key?(locale) && LOCALES[locale].has_key?(key) + raw_data = LOCALES[locale][key] + else + raw_data = LOCALES["en-US"][key] + end - locale[translation].as_h.each do |key, value| - if md = text.try &.match(/#{key}/) - if md[0].size >= match_length - translation = value.as_s - match_length = md[0].size - end + case raw_data + when .as_h? + # Init + translation = "" + match_length = 0 + + raw_data.as_h.each do |key, value| + if md = text.try &.match(/#{key}/) + if md[0].size >= match_length + translation = value.as_s + match_length = md[0].size end end - when .as_s? - if !locale[translation].as_s.empty? - translation = locale[translation].as_s - end - else - raise "Invalid translation #{translation}" end + when .as_s? + translation = raw_data.as_s + else + raise "Invalid translation \"#{raw_data}\"" end if text @@ -91,7 +107,7 @@ def translate(locale : Hash(String, JSON::Any) | Nil, translation : String, text return translation end -def translate_bool(locale : Hash(String, JSON::Any) | Nil, translation : Bool) +def translate_bool(locale : String?, translation : Bool) case translation when true return translate(locale, "Yes") diff --git a/src/invidious/helpers/serialized_yt_data.cr b/src/invidious/helpers/serialized_yt_data.cr index f92b7b89..bfbc237c 100644 --- a/src/invidious/helpers/serialized_yt_data.cr +++ b/src/invidious/helpers/serialized_yt_data.cr @@ -64,7 +64,7 @@ struct SearchVideo end end - def to_json(locale : Hash(String, JSON::Any) | Nil, json : JSON::Builder) + def to_json(locale : String?, json : JSON::Builder) json.object do json.field "type", "video" json.field "title", self.title @@ -96,7 +96,7 @@ struct SearchVideo end # TODO: remove the locale and follow the crystal convention - def to_json(locale : Hash(String, JSON::Any) | Nil, _json : Nil) + def to_json(locale : String?, _json : Nil) JSON.build do |json| to_json(locale, json) end @@ -130,7 +130,7 @@ struct SearchPlaylist property videos : Array(SearchPlaylistVideo) property thumbnail : String? - def to_json(locale : Hash(String, JSON::Any) | Nil, json : JSON::Builder) + def to_json(locale : String?, json : JSON::Builder) json.object do json.field "type", "playlist" json.field "title", self.title @@ -161,7 +161,7 @@ struct SearchPlaylist end # TODO: remove the locale and follow the crystal convention - def to_json(locale : Hash(String, JSON::Any) | Nil, _json : Nil) + def to_json(locale : String?, _json : Nil) JSON.build do |json| to_json(locale, json) end @@ -183,7 +183,7 @@ struct SearchChannel property description_html : String property auto_generated : Bool - def to_json(locale : Hash(String, JSON::Any) | Nil, json : JSON::Builder) + def to_json(locale : String?, json : JSON::Builder) json.object do json.field "type", "channel" json.field "author", self.author @@ -214,7 +214,7 @@ struct SearchChannel end # TODO: remove the locale and follow the crystal convention - def to_json(locale : Hash(String, JSON::Any) | Nil, _json : Nil) + def to_json(locale : String?, _json : Nil) JSON.build do |json| to_json(locale, json) end @@ -234,7 +234,7 @@ class Category property description_html : String property badges : Array(Tuple(String, String))? - def to_json(locale : Hash(String, JSON::Any) | Nil, json : JSON::Builder) + def to_json(locale : String?, json : JSON::Builder) json.object do json.field "type", "category" json.field "title", self.title @@ -249,7 +249,7 @@ class Category end # TODO: remove the locale and follow the crystal convention - def to_json(locale : Hash(String, JSON::Any) | Nil, _json : Nil) + def to_json(locale : String?, _json : Nil) JSON.build do |json| to_json(locale, json) end diff --git a/src/invidious/routes/api/v1/authenticated.cr b/src/invidious/routes/api/v1/authenticated.cr index cdd9e2f6..aaf728ff 100644 --- a/src/invidious/routes/api/v1/authenticated.cr +++ b/src/invidious/routes/api/v1/authenticated.cr @@ -36,7 +36,7 @@ module Invidious::Routes::API::V1::Authenticated env.response.content_type = "application/json" user = env.get("user").as(User) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale max_results = env.params.query["max_results"]?.try &.to_i? max_results ||= user.preferences.max_results @@ -122,7 +122,7 @@ module Invidious::Routes::API::V1::Authenticated end def self.list_playlists(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" user = env.get("user").as(User) @@ -141,7 +141,7 @@ module Invidious::Routes::API::V1::Authenticated def self.create_playlist(env) env.response.content_type = "application/json" user = env.get("user").as(User) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale title = env.params.json["title"]?.try &.as(String).delete("<>").byte_slice(0, 150) if !title @@ -167,7 +167,7 @@ module Invidious::Routes::API::V1::Authenticated end def self.update_playlist_attribute(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" user = env.get("user").as(User) @@ -200,7 +200,7 @@ module Invidious::Routes::API::V1::Authenticated end def self.delete_playlist(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" user = env.get("user").as(User) @@ -223,7 +223,7 @@ module Invidious::Routes::API::V1::Authenticated end def self.insert_video_into_playlist(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" user = env.get("user").as(User) @@ -281,7 +281,7 @@ module Invidious::Routes::API::V1::Authenticated end def self.delete_video_in_playlist(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" user = env.get("user").as(User) @@ -334,7 +334,7 @@ module Invidious::Routes::API::V1::Authenticated def self.register_token(env) user = env.get("user").as(User) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale case env.request.headers["Content-Type"]? when "application/x-www-form-urlencoded" @@ -396,7 +396,7 @@ module Invidious::Routes::API::V1::Authenticated end def self.unregister_token(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" user = env.get("user").as(User) scopes = env.get("scopes").as(Array(String)) diff --git a/src/invidious/routes/api/v1/channels.cr b/src/invidious/routes/api/v1/channels.cr index da39661c..8b6df3fd 100644 --- a/src/invidious/routes/api/v1/channels.cr +++ b/src/invidious/routes/api/v1/channels.cr @@ -1,6 +1,6 @@ module Invidious::Routes::API::V1::Channels def self.home(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -124,7 +124,7 @@ module Invidious::Routes::API::V1::Channels end def self.latest(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -146,7 +146,7 @@ module Invidious::Routes::API::V1::Channels end def self.videos(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -182,7 +182,7 @@ module Invidious::Routes::API::V1::Channels end def self.playlists(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -219,7 +219,7 @@ module Invidious::Routes::API::V1::Channels end def self.community(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -242,7 +242,7 @@ module Invidious::Routes::API::V1::Channels end def self.search(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" diff --git a/src/invidious/routes/api/v1/feeds.cr b/src/invidious/routes/api/v1/feeds.cr index bb8f661b..41865f34 100644 --- a/src/invidious/routes/api/v1/feeds.cr +++ b/src/invidious/routes/api/v1/feeds.cr @@ -1,6 +1,6 @@ module Invidious::Routes::API::V1::Feeds def self.trending(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -25,7 +25,7 @@ module Invidious::Routes::API::V1::Feeds end def self.popular(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" diff --git a/src/invidious/routes/api/v1/misc.cr b/src/invidious/routes/api/v1/misc.cr index 80b59fd5..1621c9ef 100644 --- a/src/invidious/routes/api/v1/misc.cr +++ b/src/invidious/routes/api/v1/misc.cr @@ -1,7 +1,7 @@ module Invidious::Routes::API::V1::Misc # Stats API endpoint for Invidious def self.stats(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" if !CONFIG.statistics_enabled @@ -15,7 +15,7 @@ module Invidious::Routes::API::V1::Misc # user playlists and Invidious playlists. This means that we can't # reasonably split them yet. This should be addressed in APIv2 def self.get_playlist(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" plid = env.params.url["plid"] @@ -84,7 +84,7 @@ module Invidious::Routes::API::V1::Misc end def self.mixes(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" diff --git a/src/invidious/routes/api/v1/search.cr b/src/invidious/routes/api/v1/search.cr index 7234dcdd..a3b6c795 100644 --- a/src/invidious/routes/api/v1/search.cr +++ b/src/invidious/routes/api/v1/search.cr @@ -1,6 +1,6 @@ module Invidious::Routes::API::V1::Search def self.search(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale region = env.params.query["region"]? env.response.content_type = "application/json" @@ -43,7 +43,7 @@ module Invidious::Routes::API::V1::Search end def self.search_suggestions(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale region = env.params.query["region"]? env.response.content_type = "application/json" diff --git a/src/invidious/routes/api/v1/videos.cr b/src/invidious/routes/api/v1/videos.cr index 1edee29c..4c7179ce 100644 --- a/src/invidious/routes/api/v1/videos.cr +++ b/src/invidious/routes/api/v1/videos.cr @@ -1,6 +1,6 @@ module Invidious::Routes::API::V1::Videos def self.videos(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -20,7 +20,7 @@ module Invidious::Routes::API::V1::Videos end def self.captions(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -149,7 +149,7 @@ module Invidious::Routes::API::V1::Videos # thumbnails for individual scenes in a video. # See https://support.jwplayer.com/articles/how-to-add-preview-thumbnails def self.storyboards(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/json" @@ -223,7 +223,7 @@ module Invidious::Routes::API::V1::Videos end def self.annotations(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "text/xml" @@ -293,7 +293,7 @@ module Invidious::Routes::API::V1::Videos end def self.comments(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale region = env.params.query["region"]? env.response.content_type = "application/json" diff --git a/src/invidious/routes/channels.cr b/src/invidious/routes/channels.cr index 29748cd0..6cb1e1f7 100644 --- a/src/invidious/routes/channels.cr +++ b/src/invidious/routes/channels.cr @@ -104,7 +104,7 @@ module Invidious::Routes::Channels # Redirects brand url channels to a normal /channel/:ucid route def self.brand_redirect(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale # /attribution_link endpoint needs both the `a` and `u` parameter # and in order to avoid detection from YouTube we should only send the required ones @@ -148,7 +148,7 @@ module Invidious::Routes::Channels end private def self.fetch_basic_information(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" if user diff --git a/src/invidious/routes/embed.cr b/src/invidious/routes/embed.cr index ffbf8c14..049ee344 100644 --- a/src/invidious/routes/embed.cr +++ b/src/invidious/routes/embed.cr @@ -2,7 +2,7 @@ module Invidious::Routes::Embed def self.redirect(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale if plid = env.params.query["list"]?.try &.gsub(/[^a-zA-Z0-9_-]/, "") begin @@ -26,7 +26,7 @@ module Invidious::Routes::Embed end def self.show(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale id = env.params.url["id"] plid = env.params.query["list"]?.try &.gsub(/[^a-zA-Z0-9_-]/, "") diff --git a/src/invidious/routes/feeds.cr b/src/invidious/routes/feeds.cr index f4a8467b..9650bcf4 100644 --- a/src/invidious/routes/feeds.cr +++ b/src/invidious/routes/feeds.cr @@ -6,7 +6,7 @@ module Invidious::Routes::Feeds end def self.playlists(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" referer = get_referer(env) @@ -31,7 +31,7 @@ module Invidious::Routes::Feeds end def self.popular(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale if CONFIG.popular_enabled templated "feeds/popular" @@ -42,7 +42,7 @@ module Invidious::Routes::Feeds end def self.trending(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale trending_type = env.params.query["type"]? trending_type ||= "Default" @@ -60,7 +60,7 @@ module Invidious::Routes::Feeds end def self.subscriptions(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -108,7 +108,7 @@ module Invidious::Routes::Feeds end def self.history(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" referer = get_referer(env) @@ -137,7 +137,7 @@ module Invidious::Routes::Feeds # RSS feeds def self.rss_channel(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.headers["Content-Type"] = "application/atom+xml" env.response.content_type = "application/atom+xml" @@ -209,7 +209,7 @@ module Invidious::Routes::Feeds end def self.rss_private(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.headers["Content-Type"] = "application/atom+xml" env.response.content_type = "application/atom+xml" @@ -253,7 +253,7 @@ module Invidious::Routes::Feeds end def self.rss_playlist(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.headers["Content-Type"] = "application/atom+xml" env.response.content_type = "application/atom+xml" @@ -374,7 +374,7 @@ module Invidious::Routes::Feeds end def self.push_notifications_post(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale token = env.params.url["token"] body = env.request.body.not_nil!.gets_to_end diff --git a/src/invidious/routes/login.cr b/src/invidious/routes/login.cr index 7a74e861..2d628b91 100644 --- a/src/invidious/routes/login.cr +++ b/src/invidious/routes/login.cr @@ -2,7 +2,7 @@ module Invidious::Routes::Login def self.login_page(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" @@ -31,7 +31,7 @@ module Invidious::Routes::Login end def self.login(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale referer = get_referer(env, "/feed/subscriptions") @@ -491,7 +491,7 @@ module Invidious::Routes::Login end def self.signout(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" diff --git a/src/invidious/routes/misc.cr b/src/invidious/routes/misc.cr index 3ea4c272..d6bd9571 100644 --- a/src/invidious/routes/misc.cr +++ b/src/invidious/routes/misc.cr @@ -3,7 +3,7 @@ module Invidious::Routes::Misc def self.home(env) preferences = env.get("preferences").as(Preferences) - locale = LOCALES[preferences.locale]? + locale = preferences.locale user = env.get? "user" case preferences.default_home @@ -29,12 +29,12 @@ module Invidious::Routes::Misc end def self.privacy(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale templated "privacy" end def self.licenses(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale rendered "licenses" end diff --git a/src/invidious/routes/playlists.cr b/src/invidious/routes/playlists.cr index 21126d7e..7b7bd03f 100644 --- a/src/invidious/routes/playlists.cr +++ b/src/invidious/routes/playlists.cr @@ -2,7 +2,7 @@ module Invidious::Routes::Playlists def self.new(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -18,7 +18,7 @@ module Invidious::Routes::Playlists end def self.create(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -56,7 +56,7 @@ module Invidious::Routes::Playlists end def self.subscribe(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" referer = get_referer(env) @@ -73,7 +73,7 @@ module Invidious::Routes::Playlists end def self.delete_page(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -96,7 +96,7 @@ module Invidious::Routes::Playlists end def self.delete(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -129,7 +129,7 @@ module Invidious::Routes::Playlists end def self.edit(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -169,7 +169,7 @@ module Invidious::Routes::Playlists end def self.update(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -213,7 +213,7 @@ module Invidious::Routes::Playlists end def self.add_playlist_items_page(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -260,7 +260,7 @@ module Invidious::Routes::Playlists end def self.playlist_ajax(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get? "user" sid = env.get? "sid" @@ -387,7 +387,7 @@ module Invidious::Routes::Playlists end def self.show(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale user = env.get?("user").try &.as(User) referer = get_referer(env) @@ -435,7 +435,7 @@ module Invidious::Routes::Playlists end def self.mix(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale rdid = env.params.query["list"]? if !rdid diff --git a/src/invidious/routes/preferences.cr b/src/invidious/routes/preferences.cr index 8793d4e9..edf9e1e7 100644 --- a/src/invidious/routes/preferences.cr +++ b/src/invidious/routes/preferences.cr @@ -2,7 +2,7 @@ module Invidious::Routes::PreferencesRoute def self.show(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale referer = get_referer(env) @@ -12,7 +12,7 @@ module Invidious::Routes::PreferencesRoute end def self.update(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale referer = get_referer(env) video_loop = env.params.body["video_loop"]?.try &.as(String) @@ -227,7 +227,7 @@ module Invidious::Routes::PreferencesRoute end def self.toggle_theme(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale referer = get_referer(env, unroll: false) redirect = env.params.query["redirect"]? diff --git a/src/invidious/routes/search.cr b/src/invidious/routes/search.cr index 3f1e219f..c256d156 100644 --- a/src/invidious/routes/search.cr +++ b/src/invidious/routes/search.cr @@ -2,7 +2,7 @@ module Invidious::Routes::Search def self.opensearch(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale env.response.content_type = "application/opensearchdescription+xml" XML.build(indent: " ", encoding: "UTF-8") do |xml| @@ -18,7 +18,7 @@ module Invidious::Routes::Search end def self.results(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale query = env.params.query["search_query"]? query ||= env.params.query["q"]? @@ -37,7 +37,7 @@ module Invidious::Routes::Search end def self.search(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale region = env.params.query["region"]? query = env.params.query["search_query"]? diff --git a/src/invidious/routes/video_playback.cr b/src/invidious/routes/video_playback.cr index 394b1592..06ba6b8c 100644 --- a/src/invidious/routes/video_playback.cr +++ b/src/invidious/routes/video_playback.cr @@ -1,7 +1,7 @@ module Invidious::Routes::VideoPlayback # /videoplayback def self.get_video_playback(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale query_params = env.params.query fvip = query_params["fvip"]? || "3" diff --git a/src/invidious/routes/watch.cr b/src/invidious/routes/watch.cr index abcf427e..b24222ff 100644 --- a/src/invidious/routes/watch.cr +++ b/src/invidious/routes/watch.cr @@ -2,7 +2,7 @@ module Invidious::Routes::Watch def self.handle(env) - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + locale = env.get("preferences").as(Preferences).locale region = env.params.query["region"]? if env.params.query.to_s.includes?("%20") || env.params.query.to_s.includes?("+") diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index 00fea49f..621ff386 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -275,7 +275,7 @@ struct Video end end - def to_json(locale : Hash(String, JSON::Any) | Nil, json : JSON::Builder) + def to_json(locale : String?, json : JSON::Builder) json.object do json.field "type", "video" @@ -475,7 +475,7 @@ struct Video end # TODO: remove the locale and follow the crystal convention - def to_json(locale : Hash(String, JSON::Any) | Nil, _json : Nil) + def to_json(locale : String?, _json : Nil) JSON.build { |json| to_json(locale, json) } end diff --git a/src/invidious/views/components/player.ecr b/src/invidious/views/components/player.ecr index 6418f66b..206ba380 100644 --- a/src/invidious/views/components/player.ecr +++ b/src/invidious/views/components/player.ecr @@ -32,13 +32,11 @@ <% end %> <% preferred_captions.each do |caption| %> - " - label="<%= caption.name %>"> + <% end %> <% captions.each do |caption| %> - " - label="<%= caption.name %>"> + <% end %> <% end %> diff --git a/src/invidious/views/components/video-context-buttons.ecr b/src/invidious/views/components/video-context-buttons.ecr index daa107f0..ddb6c983 100644 --- a/src/invidious/views/components/video-context-buttons.ecr +++ b/src/invidious/views/components/video-context-buttons.ecr @@ -1,6 +1,6 @@
- " href="https://www.youtube.com/watch<%=endpoint_params%>"> + " href="https://www.youtube.com/watch<%=endpoint_params%>"> " href="/watch<%=endpoint_params%>&listen=1"> diff --git a/src/invidious/views/feeds/playlists.ecr b/src/invidious/views/feeds/playlists.ecr index 868cfeda..a59344c4 100644 --- a/src/invidious/views/feeds/playlists.ecr +++ b/src/invidious/views/feeds/playlists.ecr @@ -6,7 +6,7 @@
-

<%= translate(locale, "`x` created playlists", %(#{items_created.size})) %>

+

<%= translate(locale, "user_created_playlists", %(#{items_created.size})) %>

@@ -23,7 +23,7 @@
-

<%= translate(locale, "`x` saved playlists", %(#{items_saved.size})) %>

+

<%= translate(locale, "user_saved_playlists", %(#{items_saved.size})) %>

diff --git a/src/invidious/views/preferences.ecr b/src/invidious/views/preferences.ecr index 374edc99..6bd9e348 100644 --- a/src/invidious/views/preferences.ecr +++ b/src/invidious/views/preferences.ecr @@ -51,7 +51,7 @@ @@ -62,7 +62,7 @@

@@ -121,8 +121,8 @@
diff --git a/src/invidious/views/template.ecr b/src/invidious/views/template.ecr index dc10a4b2..47cb5c32 100644 --- a/src/invidious/views/template.ecr +++ b/src/invidious/views/template.ecr @@ -20,8 +20,10 @@ -<% locale = LOCALES[env.get("preferences").as(Preferences).locale]? %> -<% dark_mode = env.get("preferences").as(Preferences).dark_mode %> +<% + locale = env.get("preferences").as(Preferences).locale + dark_mode = env.get("preferences").as(Preferences).dark_mode +%> -theme"> diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index 9cf00393..b85ea59d 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -103,7 +103,7 @@ we're going to need to do it here in order to allow for translations. <% elsif video.live_now %>

- <%= video.premiere_timestamp.try { |t| translate(locale, "Started streaming `x` ago", recode_date((Time.utc - t).ago, locale)) } %> + <%= video.premiere_timestamp.try { |t| translate(locale, "videoinfo_started_streaming_x_ago", recode_date((Time.utc - t).ago, locale)) } %>

<% end %>
@@ -112,8 +112,8 @@ we're going to need to do it here in order to allow for translations.
- <%= translate(locale, "Watch on YouTube") %> - (<%= translate(locale, "Embed") %>) + <%= translate(locale, "videoinfo_watch_on_youTube") %> + (<%= translate(locale, "videoinfo_youTube_embed_link") %>)

<% if env.get("preferences").as(Preferences).automatic_instance_redirect%> @@ -123,7 +123,7 @@ we're going to need to do it here in order to allow for translations. <% end %>

<% if params.annotations %> @@ -189,7 +189,7 @@ we're going to need to do it here in order to allow for translations. <% end %> <% captions.each do |caption| %> <% end %>