Merge branch 'master' of github.com:iv-org/invidious

This commit is contained in:
テクニカル諏訪子 2021-12-15 21:29:47 +09:00
commit 33678925cf
42 changed files with 1272 additions and 725 deletions

View file

@ -433,5 +433,5 @@
"footer_documentation": "التوثيق",
"footer_donate_page": "تبرّع",
"preferences_region_label": "بلد المحتوى:. ",
"preferences_quality_dash_label": "جودة الفيديو المفضلة dash: "
"preferences_quality_dash_label": "جودة فيديو DASH المفضلة: "
}

View file

@ -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 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"
}

View file

@ -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: "
}

View file

@ -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"
}

View file

@ -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",

View file

@ -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: "
}

View file

@ -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: "
}

View file

@ -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: "
}

View file

@ -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)"
}

View file

@ -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"
}

View file

@ -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": "Малајски"
}

View file

@ -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: "
}

View file

@ -433,5 +433,5 @@
"footer_original_source_code": "原始源代码",
"footer_donate_page": "捐赠",
"preferences_region_label": "内容国家: ",
"preferences_quality_dash_label": "首选 dash 视频分辨率: "
"preferences_quality_dash_label": "首选 DASH 视频分辨率: "
}

View file

@ -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 影片品質: "
}

View file

@ -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

View file

@ -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 "<error>#{exception.inspect_with_backtrace}</error>"
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 "<error>#{message}</error>"
@ -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") ||

View file

@ -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

View file

@ -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")

View file

@ -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

View file

@ -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))

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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

View file

@ -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_-]/, "")

View file

@ -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

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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"]?

View file

@ -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"]?

View file

@ -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"

View file

@ -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?("+")

View file

@ -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

View file

@ -32,13 +32,11 @@
<% end %>
<% preferred_captions.each do |caption| %>
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name %>&hl=<%= env.get("preferences").as(Preferences).locale %>"
label="<%= caption.name %>">
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name %>" label="<%= caption.name %>">
<% end %>
<% captions.each do |caption| %>
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name %>&hl=<%= env.get("preferences").as(Preferences).locale %>"
label="<%= caption.name %>">
<track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption.name %>" label="<%= caption.name %>">
<% end %>
<% end %>
</video>

View file

@ -1,6 +1,6 @@
<div class="flex-right">
<div class="icon-buttons">
<a title="<%=translate(locale, "Watch on YouTube")%>" href="https://www.youtube.com/watch<%=endpoint_params%>">
<a title="<%=translate(locale, "videoinfo_watch_on_youTube")%>" href="https://www.youtube.com/watch<%=endpoint_params%>">
<i class="icon ion-logo-youtube"></i>
</a>
<a title="<%=translate(locale, "Audio mode")%>" href="/watch<%=endpoint_params%>&listen=1">

View file

@ -6,7 +6,7 @@
<div class="pure-g h-box">
<div class="pure-u-2-3">
<h3><%= translate(locale, "`x` created playlists", %(<span id="count">#{items_created.size}</span>)) %></h3>
<h3><%= translate(locale, "user_created_playlists", %(<span id="count">#{items_created.size}</span>)) %></h3>
</div>
<div class="pure-u-1-3" style="text-align:right">
<h3>
@ -23,7 +23,7 @@
<div class="pure-g h-box">
<div class="pure-u-1">
<h3><%= translate(locale, "`x` saved playlists", %(<span id="count">#{items_saved.size}</span>)) %></h3>
<h3><%= translate(locale, "user_saved_playlists", %(<span id="count">#{items_saved.size}</span>)) %></h3>
</div>
</div>

View file

@ -51,7 +51,7 @@
<select name="quality" id="quality">
<% {"dash", "hd720", "medium", "small"}.each do |option| %>
<% if !(option == "dash" && CONFIG.disabled?("dash")) %>
<option value="<%= option %>" <% if preferences.quality == option %> selected <% end %>><%= translate(locale, option) %></option>
<option value="<%= option %>" <% if preferences.quality == option %> selected <% end %>><%= translate(locale, "preferences_quality_option_" + option) %></option>
<% end %>
<% end %>
</select>
@ -62,7 +62,7 @@
<label for="quality_dash"><%= translate(locale, "preferences_quality_dash_label") %></label>
<select name="quality_dash" id="quality_dash">
<% {"auto", "best", "4320p", "2160p", "1440p", "1080p", "720p", "480p", "360p", "240p", "144p", "worst"}.each do |option| %>
<option value="<%= option %>" <% if preferences.quality_dash == option %> selected <% end %>><%= translate(locale, option) %></option>
<option value="<%= option %>" <% if preferences.quality_dash == option %> selected <% end %>><%= translate(locale, "preferences_quality_dash_option_" + option) %></option>
<% end %>
</select>
</div>
@ -121,8 +121,8 @@
<div class="pure-control-group">
<label for="locale"><%= translate(locale, "preferences_locale_label") %></label>
<select name="locale" id="locale">
<% LOCALES.each_key do |option| %>
<option value="<%= option %>" <% if preferences.locale == option %> selected <% end %>><%= option %></option>
<% LOCALES_LIST.each do |iso_name, full_name| %>
<option value="<%= iso_name %>" <% if preferences.locale == iso_name %> selected <% end %>><%= HTML.escape(full_name) %></option>
<% end %>
</select>
</div>

View file

@ -20,8 +20,10 @@
<link rel="stylesheet" href="/css/keromod.css?v=<%= ASSET_COMMIT %>">
</head>
<% 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
%>
<body class="<%= dark_mode.blank? ? "no" : dark_mode %>-theme">
<span style="display:none" id="dark_mode_pref"><%= env.get("preferences").as(Preferences).dark_mode %></span>

View file

@ -103,7 +103,7 @@ we're going to need to do it here in order to allow for translations.
</h3>
<% elsif video.live_now %>
<h3>
<%= 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)) } %>
</h3>
<% end %>
</div>
@ -112,8 +112,8 @@ we're going to need to do it here in order to allow for translations.
<div class="pure-u-1 pure-u-lg-1-5">
<div class="h-box">
<span id="watch-on-youtube">
<a href="https://www.youtube.com/watch?v=<%= video.id %>"><%= translate(locale, "Watch on YouTube") %></a>
(<a href="https://www.youtube.com/embed/<%= video.id %>"><%= translate(locale, "Embed") %></a>)
<a href="https://www.youtube.com/watch?v=<%= video.id %>"><%= translate(locale, "videoinfo_watch_on_youTube") %></a>
(<a href="https://www.youtube.com/embed/<%= video.id %>"><%= translate(locale, "videoinfo_youTube_embed_link") %></a>)
</span>
<p id="watch-on-another-invidious-instance">
<% 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 %>
</p>
<p id="embed-link">
<a href="<%= embed_link %>"><%= translate(locale, "Embed Link") %></a>
<a href="<%= embed_link %>"><%= translate(locale, "videoinfo_invidious_embed_link") %></a>
</p>
<p id="annotations">
<% 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| %>
<option value='{"id":"<%= video.id %>","label":"<%= caption.name %>","title":"<%= URI.encode_www_form(video.title) %>-<%= video.id %>.<%= caption.language_code %>.vtt"}'>
<%= translate(locale, "Subtitles - `x` (.vtt)", caption.name) %>
<%= translate(locale, "download_subtitles", translate(locale, caption.name)) %>
</option>
<% end %>
</select>