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_documentation": "التوثيق",
"footer_donate_page": "تبرّع", "footer_donate_page": "تبرّع",
"preferences_region_label": "بلد المحتوى:. ", "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", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` afspilningslister",
"": "`x` afspilningslister" "": "`x` afspilningslister"
}, },
"LIVE": "DIREKTE", "LIVE": "LIVE",
"Shared `x` ago": "Delt for `x` siden", "Shared `x` ago": "Delt for `x` siden",
"Unsubscribe": "Opsig abonnement", "Unsubscribe": "Opsig abonnement",
"Subscribe": "Abonner", "Subscribe": "Abonner",
@ -44,7 +44,7 @@
"Export data as JSON": "Exporter data som JSON", "Export data as JSON": "Exporter data som JSON",
"Delete account?": "Slet konto?", "Delete account?": "Slet konto?",
"History": "Historik", "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", "JavaScript license information": "JavaScript licens information",
"source": "kilde", "source": "kilde",
"Log in": "Log på", "Log in": "Log på",
@ -72,7 +72,7 @@
"preferences_volume_label": "Lydstyrke: ", "preferences_volume_label": "Lydstyrke: ",
"preferences_comments_label": "Standard kommentarer: ", "preferences_comments_label": "Standard kommentarer: ",
"youtube": "YouTube", "youtube": "YouTube",
"reddit": "reddit", "reddit": "Reddit",
"preferences_captions_label": "Standard undertekster: ", "preferences_captions_label": "Standard undertekster: ",
"Fallback captions: ": "Alternative undertekster: ", "Fallback captions: ": "Alternative undertekster: ",
"preferences_related_videos_label": "Vis relaterede videoer: ", "preferences_related_videos_label": "Vis relaterede videoer: ",
@ -150,8 +150,8 @@
"Unlisted": "Skjult", "Unlisted": "Skjult",
"Private": "Privat", "Private": "Privat",
"View all playlists": "Vis alle afspilningslister", "View all playlists": "Vis alle afspilningslister",
"Updated `x` ago": "Opdateret for 'x' siden", "Updated `x` ago": "Opdateret for `x` siden",
"Delete playlist `x`?": "Opdateret `x` siden", "Delete playlist `x`?": "Fjern spilleliste `x`?",
"Delete playlist": "Slet afspilningsliste", "Delete playlist": "Slet afspilningsliste",
"Create playlist": "Opret afspilningsliste", "Create playlist": "Opret afspilningsliste",
"Title": "Titel", "Title": "Titel",
@ -176,7 +176,7 @@
}, },
"Premieres in `x`": "Har premiere om `x`", "Premieres in `x`": "Har premiere om `x`",
"Premieres `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 YouTube comments": "Vis YouTube kommentarer",
"View more comments on Reddit": "Se flere kommentarer på Reddit", "View more comments on Reddit": "Se flere kommentarer på Reddit",
"View `x` comments": { "View `x` comments": {
@ -190,17 +190,17 @@
"Quota exceeded, try again in a few hours": "Kvota overskredet, prøv igen om et par timer", "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.", "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", "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", "Wrong answer": "Forkert svar",
"Erroneous CAPTCHA": "Fejlagtig CAPTCHA", "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", "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", "Wrong username or password": "Forkert brugernavn eller adgangskode",
"Please sign in using 'Log in with Google'": "Venligst tjek in via 'Log in med Google'", "Please sign in using 'Log in with Google'": "Log ind via 'Log ind med Google'",
"Password cannot be empty": "Adgangskode kan ikke være tom", "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", "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'", "channel:`x`": "kanal: 'x'",
"Deleted or invalid channel": "Slettet eller invalid kanal", "Deleted or invalid channel": "Slettet eller invalid kanal",
"This channel does not exist.": "Denne kanal eksisterer ikke.", "This channel does not exist.": "Denne kanal eksisterer ikke.",
@ -219,5 +219,219 @@
"Could not create mix.": "Kunne ikke skabe blanding.", "Could not create mix.": "Kunne ikke skabe blanding.",
"Empty playlist": "Tom playliste", "Empty playlist": "Tom playliste",
"Not a playlist.": "Ikke en 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", "View playlist on YouTube": "Wiedergabeliste auf YouTube anzeigen",
"newest": "neueste", "newest": "neueste",
"oldest": "älteste", "oldest": "älteste",
"popular": "beliebt", "popular": "beliebteste",
"last": "letzte", "last": "neueste",
"Next page": "Nächste Seite", "Next page": "Nächste Seite",
"Previous page": "Vorherige Seite", "Previous page": "Vorherige Seite",
"Clear watch history?": "Verlauf löschen?", "Clear watch history?": "Verlauf löschen?",
@ -72,7 +72,7 @@
"preferences_volume_label": "Wiedergabelautstärke: ", "preferences_volume_label": "Wiedergabelautstärke: ",
"preferences_comments_label": "Standardkommentare: ", "preferences_comments_label": "Standardkommentare: ",
"youtube": "YouTube", "youtube": "YouTube",
"reddit": "reddit", "reddit": "Reddit",
"preferences_captions_label": "Standarduntertitel: ", "preferences_captions_label": "Standarduntertitel: ",
"Fallback captions: ": "Ersatzuntertitel: ", "Fallback captions: ": "Ersatzuntertitel: ",
"preferences_related_videos_label": "Ähnliche Videos anzeigen? ", "preferences_related_videos_label": "Ähnliche Videos anzeigen? ",
@ -84,7 +84,7 @@
"Dark mode: ": "Nachtmodus: ", "Dark mode: ": "Nachtmodus: ",
"preferences_dark_mode_label": "Modus: ", "preferences_dark_mode_label": "Modus: ",
"dark": "Nachtmodus", "dark": "Nachtmodus",
"light": "heller Modus", "light": "Hellermodus",
"preferences_thin_mode_label": "Schlanker Modus: ", "preferences_thin_mode_label": "Schlanker Modus: ",
"preferences_category_misc": "Sonstige Einstellungen", "preferences_category_misc": "Sonstige Einstellungen",
"preferences_automatic_instance_redirect_label": "Automatische Instanzweiterleitung (über redirect.invidious.io): ", "preferences_automatic_instance_redirect_label": "Automatische Instanzweiterleitung (über redirect.invidious.io): ",
@ -431,5 +431,6 @@
"footer_documentation": "Dokumentation", "footer_documentation": "Dokumentation",
"footer_source_code": "Quellcode", "footer_source_code": "Quellcode",
"adminprefs_modified_source_code_url_label": "URL zum Repositorie des modifizierten Quellcodes", "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_local_label": "Proxy videos: ",
"preferences_speed_label": "Default speed: ", "preferences_speed_label": "Default speed: ",
"preferences_quality_label": "Preferred video quality: ", "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_volume_label": "Player volume: ",
"preferences_comments_label": "Default comments: ", "preferences_comments_label": "Default comments: ",
"youtube": "YouTube", "youtube": "YouTube",
"reddit": "Reddit", "reddit": "Reddit",
"invidious": "Invidious",
"preferences_captions_label": "Default captions: ", "preferences_captions_label": "Default captions: ",
"Fallback captions: ": "Fallback captions: ", "Fallback captions: ": "Fallback captions: ",
"preferences_related_videos_label": "Show related videos: ", "preferences_related_videos_label": "Show related videos: ",
@ -89,7 +106,7 @@
"light": "light", "light": "light",
"preferences_thin_mode_label": "Thin mode: ", "preferences_thin_mode_label": "Thin mode: ",
"preferences_category_misc": "Miscellaneous preferences", "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_category_subscription": "Subscription preferences",
"preferences_annotations_subscribed_label": "Show annotations by default for subscribed channels? ", "preferences_annotations_subscribed_label": "Show annotations by default for subscribed channels? ",
"Redirect homepage to feed: ": "Redirect homepage to feed: ", "Redirect homepage to feed: ": "Redirect homepage to feed: ",
@ -423,6 +440,8 @@
"4k": "4K", "4k": "4K",
"location": "Location", "location": "Location",
"hdr": "HDR", "hdr": "HDR",
"purchased" : "Purchased",
"360" : "360°",
"filter": "Filter", "filter": "Filter",
"Current version: ": "Current version: ", "Current version: ": "Current version: ",
"next_steps_error_message": "After which you should try to: ", "next_steps_error_message": "After which you should try to: ",
@ -433,5 +452,14 @@
"footer_source_code": "Source code", "footer_source_code": "Source code",
"footer_original_source_code": "Original source code", "footer_original_source_code": "Original source code",
"footer_modfied_source_code": "Modified 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", "light": "clair",
"preferences_thin_mode_label": "Mode léger : ", "preferences_thin_mode_label": "Mode léger : ",
"preferences_category_misc": "Paramètres divers", "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_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 : ", "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 : ", "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": "Vous pouvez essayer de : ",
"next_steps_error_message_refresh": "Rafraîchir la page", "next_steps_error_message_refresh": "Rafraîchir la page",
"next_steps_error_message_go_to_youtube": "Aller sur YouTube", "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", "footer_source_code": "Code source",
"preferences_region_label": "Pays du contenu : ", "preferences_region_label": "Pays du contenu : ",
"footer_donate_page": "Faire un don", "footer_donate_page": "Faire un don",

View file

@ -87,7 +87,7 @@
"light": "svijetlo", "light": "svijetlo",
"preferences_thin_mode_label": "Pojednostavljen prikaz: ", "preferences_thin_mode_label": "Pojednostavljen prikaz: ",
"preferences_category_misc": "Razne postavke", "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_category_subscription": "Postavke pretplata",
"preferences_annotations_subscribed_label": "Standardno prikaži napomene za pretplaćene kanale: ", "preferences_annotations_subscribed_label": "Standardno prikaži napomene za pretplaćene kanale: ",
"Redirect homepage to feed: ": "Preusmjeri početnu stranicu na feed: ", "Redirect homepage to feed: ": "Preusmjeri početnu stranicu na feed: ",
@ -383,7 +383,7 @@
"Movies": "Filmovi", "Movies": "Filmovi",
"Download": "Preuzmi", "Download": "Preuzmi",
"Download as: ": "Preuzmi kao: ", "Download as: ": "Preuzmi kao: ",
"%A %B %-d, %Y": "%A, %-d. %B %Y.", "%A %B %-d, %Y": "%A, %-d. %B %Y",
"(edited)": "(uređeno)", "(edited)": "(uređeno)",
"YouTube comment permalink": "Stalna poveznica YouTube komentara", "YouTube comment permalink": "Stalna poveznica YouTube komentara",
"permalink": "stalna poveznica", "permalink": "stalna poveznica",
@ -421,7 +421,7 @@
"hdr": "hdr", "hdr": "hdr",
"filter": "filtar", "filter": "filtar",
"Current version: ": "Trenutačna verzija: ", "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_refresh": "Aktualiziraj stranicu",
"next_steps_error_message_go_to_youtube": "Idi na YouTube", "next_steps_error_message_go_to_youtube": "Idi na YouTube",
"footer_donate_page": "Doniraj", "footer_donate_page": "Doniraj",
@ -433,5 +433,5 @@
"footer_documentation": "Dokumentacija", "footer_documentation": "Dokumentacija",
"footer_original_source_code": "Izvoran izvorni kod", "footer_original_source_code": "Izvoran izvorni kod",
"preferences_region_label": "Zemlja sadržaja: ", "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_modfied_source_code": "Kode sumber yang dimodifikasi",
"footer_documentation": "Dokumentasi", "footer_documentation": "Dokumentasi",
"preferences_region_label": "Konten dari negara: ", "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_source_code": "Kildekode",
"footer_original_source_code": "Opprinnelig kildekode", "footer_original_source_code": "Opprinnelig kildekode",
"footer_modfied_source_code": "Endret 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": "Abonnementen exporteren als OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnementen exporteren als OPML (voor NewPipe en FreeTube)", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnementen exporteren als OPML (voor NewPipe en FreeTube)",
"Export data as JSON": "Gegevens exporteren als JSON", "Export data as JSON": "Gegevens exporteren als JSON",
"Delete account?": "Wil je je account verwijderen?", "Delete account?": "Wilt u uw account verwijderen?",
"History": "Geschiedenis", "History": "Geschiedenis",
"An alternative front-end to YouTube": "Een alternatief front-end voor YouTube", "An alternative front-end to YouTube": "Een alternatief front-end voor YouTube",
"JavaScript license information": "JavaScript-licentieinformatie", "JavaScript license information": "JavaScript-licentieinformatie",
@ -414,5 +414,24 @@
"location": "locatie", "location": "locatie",
"hdr": "HDR", "hdr": "HDR",
"filter": "verfijnen", "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": { "`x` subscribers": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` пратилаца", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` pratilac",
"": "`x` пратилаца" "": "`x` pratilaca"
}, },
"`x` videos": { "`x` videos": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` видео записа", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` video zapis",
"": "`x` видео записа" "": "`x` video zapisa"
}, },
"`x` playlists": { "`x` playlists": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` списака извођења", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` spisak izvođenja",
"": "`x` списака извођења" "": "`x` spisaka izvođenja"
}, },
"LIVE": "УЖИВО", "LIVE": "UŽIVO",
"Shared `x` ago": "Подељено пре `x`", "Shared `x` ago": "Podeljeno pre `x`",
"Unsubscribe": "Прекини праћење", "Unsubscribe": "Prekini praćenje",
"Subscribe": "Прати", "Subscribe": "Prati",
"View channel on YouTube": "Погледај канал на YouTube-у", "View channel on YouTube": "Pogledaj kanal na YouTube-u",
"View playlist on YouTube": "Погледај списак извођења на YouTube-у", "View playlist on YouTube": "Pogledaj spisak izvođenja na YouTube-u",
"newest": "најновије", "newest": "najnovije",
"oldest": "најстарије", "oldest": "najstarije",
"popular": "популарно", "popular": "popularno",
"last": "последње", "last": "poslednje",
"Next page": "Следећа страница", "Next page": "Sledeća stranica",
"Previous page": "Претходна страница", "Previous page": "Prethodna stranica",
"Clear watch history?": "Избрисати повест прегледања?", "Clear watch history?": "Izbrisati povest pregledanja?",
"New password": "Нова запорка", "New password": "Nova lozinka",
"New passwords must match": "Нове запорке морају бити истоветне", "New passwords must match": "Nove lozinke moraju biti istovetne",
"Cannot change password for Google accounts": "Није могуће променити запорку за Google налоге", "Cannot change password for Google accounts": "Nije moguće promeniti lozinku za Google naloge",
"Authorize token?": "Овласти токен?", "Authorize token?": "Ovlasti žeton?",
"Authorize token for `x`?": "Овласти токен за `x`?", "Authorize token for `x`?": "Ovlasti žeton za `x`?",
"Yes": "Да", "Yes": "Da",
"No": "Не", "No": "Ne",
"Import and Export Data": "Увоз и извоз података", "Import and Export Data": "Uvoz i Izvoz Podataka",
"Import": "Увези", "Import": "Uvezi",
"Import Invidious data": "Увези податке са Invidious-а", "Import Invidious data": "Uvezi podatke sa Invidious-a",
"Import YouTube subscriptions": "Увези праћења са YouTube-а", "Import YouTube subscriptions": "Uvezi praćenja sa YouTube-a",
"Import FreeTube subscriptions (.db)": "Увези праћења са FreeTube-а (.db)", "Import FreeTube subscriptions (.db)": "Uvezi praćenja sa FreeTube-a (.db)",
"Import NewPipe subscriptions (.json)": "Увези праћења са NewPipe-а (.json)", "Import NewPipe subscriptions (.json)": "Uvezi praćenja sa NewPipe-a (.json)",
"Import NewPipe data (.zip)": "Увези податке са NewPipe-а (.zip)", "Import NewPipe data (.zip)": "Uvezi podatke sa NewPipe-a (.zip)",
"Export": "Извези", "Export": "Izvezi",
"Export subscriptions as OPML": "Извези праћења као OPML датотеку", "Export subscriptions as OPML": "Izvezi praćenja kao OPML datoteku",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Извези праћења као OPML датотеку (за NewPipe и FreeTube)", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Izvezi praćenja kao OPML datoteku (za NewPipe i FreeTube)",
"Export data as JSON": "Извези податке као JSON датотеку", "Export data as JSON": "Izvezi podatke kao JSON datoteku",
"Delete account?": "Избрисати рачун?", "Delete account?": "Izbrišite nalog?",
"History": "Повест", "History": "Istorija",
"An alternative front-end to YouTube": "Заменски кориснички слој за YouTube", "An alternative front-end to YouTube": "Zamenski korisnički sloj za YouTube",
"JavaScript license information": "Извештај о JavaScript одобрењу", "JavaScript license information": "Izveštaj o JavaScript odobrenju",
"source": "извор", "source": "izvor",
"Log in": "Пријави се", "Log in": "Prijavi se",
"Log in/register": "Пријави се/Отвори налог", "Log in/register": "Prijavi se/Otvori nalog",
"Log in with Google": "Пријави се помоћу Google-а", "Log in with Google": "Prijavi se pomoću Google-a",
"User ID": "Кориснички ИД", "User ID": "Korisnički ID",
"Password": "Запорка", "Password": "Lozinka",
"Time (h:mm:ss):": "Време (ч:мм:сс):", "Time (h:mm:ss):": "Vreme (č:mm:ss):",
"Text CAPTCHA": "Знаковни CAPTCHA", "Text CAPTCHA": "Znakovni CAPTCHA",
"Image CAPTCHA": "Сликовни CAPTCHA", "Image CAPTCHA": "Slikovni CAPTCHA",
"Sign In": "Пријава", "Sign In": "Prijava",
"Register": "Отвори налог", "Register": "Otvori nalog",
"E-mail": "Е-пошта", "E-mail": "E-pošta",
"Google verification code": "Google-ов оверни кôд", "Google verification code": "Google-ova overna koda",
"Preferences": "Подешавања", "Preferences": "Podešavanja",
"preferences_category_player": "Подешавања репродуктора", "preferences_category_player": "Podešavanja reproduktora",
"preferences_video_loop_label": "Увек понављај: ", "preferences_video_loop_label": "Uvek ponavljaj: ",
"preferences_autoplay_label": "Самопуштање: ", "preferences_autoplay_label": "Samopuštanje: ",
"preferences_continue_label": "Увек подразумевано пуштај следеће: ", "preferences_continue_label": "Uvek podrazumevano puštaj sledeće: ",
"preferences_continue_autoplay_label": "Самопуштање следећег видео записа: ", "preferences_continue_autoplay_label": "Samopuštanje sledećeg video zapisa: ",
"preferences_listen_label": "Увек подразумевано укључен само звук: ", "preferences_listen_label": "Uvek podrazumevano uključen samo zvuk: ",
"preferences_local_label": "Приказ видео записа преко посредника: ", "preferences_local_label": "Prikaz video zapisa preko posrednika: ",
"Playlist privacy": "Подешавања приватности плеј листе", "Playlist privacy": "Podešavanja privatnosti plej liste",
"Editing playlist `x`": "Измена плеј листе `x`", "Editing playlist `x`": "Izmena plej liste `x`",
"Please sign in using 'Log in with Google'": "Молимо Вас да се пријавите помоћу 'Log in with Google'", "Please sign in using 'Log in with Google'": "Molimo Vas da se prijavite pomoću 'Log in with Google'",
"Playlist does not exist.": "Непостојећа плеј листа.", "Playlist does not exist.": "Nepostojeća plej lista.",
"Erroneous challenge": "Погрешан изазов", "Erroneous challenge": "Pogrešan izazov",
"Maltese": "Малтешки", "Maltese": "Malteški",
"Download": "Преузми", "Download": "Preuzmi",
"Download as: ": "Преузми као: ", "Download as: ": "Preuzmi kao: ",
"Quota exceeded, try again in a few hours": "Квота је премашена, молимо Вас да покушате за пар сати", "Quota exceeded, try again in a few hours": "Kvota je premašena, molimo vas da pokušate ponovo za par sati",
"Bangla": "Бангла/Бенгалски", "Bangla": "Bangla/Bengalski",
"preferences_quality_dash_label": "Преферирани квалитет dash видео формата: ", "preferences_quality_dash_label": "Preferirani kvalitet DASH video formata: ",
"Token manager": "Меначер токена", "Token manager": "Upravljanje žetonima",
"Token": "Токен", "Token": "Žeton",
"`x` tokens": { "`x` tokens": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` токен", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` žeton",
"": "`x` токена" "": "`x` žetona"
}, },
"Import/export": "Увези/Извези", "Import/export": "Uvezi/Izvezi",
"revoke": "опозови", "revoke": "opozovi",
"`x` unseen notifications": { "`x` unseen notifications": {
"": "`x` непрегледаних обавештења", "": "`x` nepregledanih obaveštenja",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` непрегледаних обавештења" "([^.,0-9]|^)1([^.,0-9]|$)": "`x` nepregledanо obaveštenjе"
}, },
"search": "претрага", "search": "pretraga",
"Log out": "Одјава", "Log out": "Odjava",
"Source available here.": "Изворни код.", "Source available here.": "Izvorna koda je ovde dostupna.",
"Trending": "У тренду", "Trending": "U trendu",
"Updated `x` ago": "Ажурирано пре `x`", "Updated `x` ago": "Ažurirano pre `x`",
"Delete playlist `x`?": "Обриши плеј листу `x`?", "Delete playlist `x`?": "Obriši plej listu `x`?",
"Create playlist": "Направи плеј листу", "Create playlist": "Napravi plej listu",
"Show less": "Прикажи мање", "Show less": "Prikaži manje",
"Switch Invidious Instance": "Промени Invidious инстанцу", "Switch Invidious Instance": "Promeni Invidious instancu",
"Hide annotations": "Сакриј напомене", "Hide annotations": "Sakrij napomene",
"User ID is a required field": "Кориснички ID је обавезно поље", "User ID is a required field": "Korisnički ID je obavezno polje",
"Wrong username or password": "Погрешно корисничко име или лозинка", "Wrong username or password": "Pogrešno korisničko ime ili lozinka",
"Please log in": "Молимо Вас да се пријавите", "Please log in": "Molimo vas da se prijavite",
"channel:`x`": "канал:`x`", "channel:`x`": "kanal:`x`",
"Could not fetch comments": "Узимање коментара није успело", "Could not fetch comments": "Uzimanje komentara nije uspelo",
"`x` points": { "`x` points": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` поен", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` poen",
"": "`x` поена" "": "`x` poena"
}, },
"Could not create mix.": "Прављење микса није успело.", "Could not create mix.": "Pravljenje miksa nije uspelo.",
"Empty playlist": "Празна плеј листа", "Empty playlist": "Prazna plej lista",
"Not a playlist.": "Није плеј листа.", "Not a playlist.": "Nije plej lista.",
"Could not pull trending pages.": "Учитавање 'У току' странције није успело.", "Could not pull trending pages.": "Učitavanje 'U toku' stranica nije uspelo.",
"Token is expired, please try again": "Токен је истекао, молимо Вас да покушате поново", "Token is expired, please try again": "Žeton je istekao, molimo vas da pokušate ponovo",
"English (auto-generated)": "Енглески (аутоматски генерисано)", "English (auto-generated)": "Engleski (automatski generisano)",
"Afrikaans": "Африканс", "Afrikaans": "Afrikans",
"Albanian": "Албански", "Albanian": "Albanski",
"Armenian": "Јерменски", "Armenian": "Jermenski",
"Azerbaijani": "Азербејџански", "Azerbaijani": "Azerbejdžanski",
"Basque": "Баскијски", "Basque": "Baskijski",
"Bosnian": "Српски (Босна и Херцеговина)", "Bosnian": "Bosanski",
"Bulgarian": "Бугарски", "Bulgarian": "Bugarski",
"Burmese": "Бурмански", "Burmese": "Burmanski",
"Catalan": "Каталонски", "Catalan": "Katalonski",
"Cebuano": "Cebuano", "Cebuano": "Sebuano",
"Chinese (Traditional)": "Кинески (Традиционални)", "Chinese (Traditional)": "Kineski (Tradicionalni)",
"Corsican": "Корзикански", "Corsican": "Korzikanski",
"Danish": "Дански", "Danish": "Danski",
"Kannada": "Канада (Језик)", "Kannada": "Kanada (Jezik)",
"Kazakh": "Казашки", "Kazakh": "Kazaški",
"Russian": "Руски", "Russian": "Ruski",
"Scottish Gaelic": "Шкотски Гелски", "Scottish Gaelic": "Škotski Gelski",
"Sinhala": "Синхалешки", "Sinhala": "Sinhaleški",
"Slovak": "Словачки", "Slovak": "Slovački",
"Spanish": "Шпански", "Spanish": "Španski",
"Spanish (Latin America)": "Шпански (Јужна Америка)", "Spanish (Latin America)": "Španski (Južna Amerika)",
"Sundanese": "Сундски", "Sundanese": "Sundski",
"Swedish": "Шведски", "Swedish": "Švedski",
"Tajik": "Таџички", "Tajik": "Tadžički",
"Telugu": "Телугу", "Telugu": "Telugu",
"Turkish": "Турски", "Turkish": "Turski",
"Ukrainian": "Украјински", "Ukrainian": "Ukrajinski",
"Urdu": "Урду", "Urdu": "Urdu",
"Uzbek": "Узбечки", "Uzbek": "Uzbečki",
"Vietnamese": "Вијетнамски", "Vietnamese": "Vijetnamski",
"`x` minutes": { "`x` minutes": {
"": "`x` минута", "": "`x` minuta",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` минут" "([^.,0-9]|^)1([^.,0-9]|$)": "`x` minut"
}, },
"`x` seconds": { "`x` seconds": {
"": "`x` секунди", "": "`x` sekundi",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` секунда" "([^.,0-9]|^)1([^.,0-9]|$)": "`x` sekunda"
}, },
"Rating: ": "Оцена/е: ", "Rating: ": "Ocena/e: ",
"View as playlist": "Погледај као плеј листу", "View as playlist": "Pogledaj kao plej listu",
"Default": "Подразумеван/о", "Default": "Podrazumevan/o",
"Gaming": "Гејминг", "Gaming": "Igrice",
"Movies": "Филмови", "Movies": "Filmovi",
"%A %B %-d, %Y": "%A %B %-d, %Y", "%A %B %-d, %Y": "%A %B %-d, %Y",
"(edited)": "(измењено)", "(edited)": "(izmenjeno)",
"YouTube comment permalink": "YouTube коментар трајна веза", "YouTube comment permalink": "YouTube komentar trajna veza",
"Audio mode": "Аудио мод", "Audio mode": "Audio mod",
"Playlists": "Плеј листе", "Playlists": "Plej liste",
"relevance": "Ревелантно", "relevance": "Relevantnost",
"rating": "Оцене", "rating": "Ocene",
"date": "Датум отпремања", "date": "Datum otpremanja",
"views": "Број прегледа", "views": "Broj pregleda",
"`x` marked it with a ❤": "`x` је означио/ла ово са ❤", "`x` marked it with a ❤": "`x` je označio/la ovo sa ❤",
"duration": "Трајање", "duration": "Trajanje",
"features": "Карактеристике", "features": "Karakteristike",
"hour": "Последњи сат", "hour": "Poslednji sat",
"week": "Ове недеље", "week": "Ove sedmice",
"month": "Овај месец", "month": "Ovaj mesec",
"year": "Ове године", "year": "Ove godine",
"video": "Видео", "video": "Video",
"playlist": "Плеј листа", "playlist": "Plej lista",
"movie": "Филм", "movie": "Film",
"long": "Дуг (> 20 минута)", "long": "Dugo (> 20 minuta)",
"hd": "HD", "hd": "HD",
"creative_commons": "Creative Commons (Лиценца)", "creative_commons": "Creative Commons (Licenca)",
"3d": "3Д", "3d": "3D",
"hdr": "Видео високе резолуције", "hdr": "Video Visoke Rezolucije",
"filter": "Филтер", "filter": "Filter",
"next_steps_error_message": "Можете урадити нешта од следећег: ", "next_steps_error_message": "Nakon čega bi trebali probati: ",
"next_steps_error_message_go_to_youtube": "Иди на YouTube", "next_steps_error_message_go_to_youtube": "Idi na YouTube",
"footer_documentation": "Документација", "footer_documentation": "Dokumentacija",
"preferences_region_label": "Држава порекла садржаја: ", "preferences_region_label": "Država porekla sadržaja: ",
"preferences_player_style_label": "Стил плејера: ", "preferences_player_style_label": "Stil plejera: ",
"preferences_dark_mode_label": "Изглед/Тема: ", "preferences_dark_mode_label": "Izgled/Tema: ",
"light": "светла", "light": "svetlo",
"preferences_thin_mode_label": "Компактни режим: ", "preferences_thin_mode_label": "Kompaktni režim: ",
"preferences_category_misc": "Остала подешавања", "preferences_category_misc": "Ostala podešavanja",
"preferences_automatic_instance_redirect_label": "Аутоматско пребацивање на другу инстанцу у случају отказивања (пређи на redirect.invidious.io): ", "preferences_automatic_instance_redirect_label": "Automatsko prebacivanje na drugu instancu u slučaju otkazivanja (preči će nazad na redirect.invidious.io): ",
"alphabetically - reverse": "по алфабету - обрнуто", "alphabetically - reverse": "po alfabetu - obrnuto",
"Enable web notifications": "Омогући обавештења у веб претраживачу", "Enable web notifications": "Omogući obaveštenja u veb pretraživaču",
"`x` is live": "`x` преноси уживо", "`x` is live": "`x` prenosi uživo",
"Manage tokens": "Управљај токенима", "Manage tokens": "Upravljaj žetonima",
"Watch history": "Историја гледања", "Watch history": "Istorija gledanja",
"preferences_feed_menu_label": "Feed мени: ", "preferences_feed_menu_label": "Dovodna stranica: ",
"preferences_show_nick_label": "Прикажи надимке на врху: ", "preferences_show_nick_label": "Prikaži nadimke na vrhu: ",
"CAPTCHA enabled: ": "CAPTCHA омогућена: ", "CAPTCHA enabled: ": "CAPTCHA omogućena: ",
"Registration enabled: ": "Регистрација омогућена: ", "Registration enabled: ": "Registracija omogućena: ",
"Subscription manager": "Менаџер претплата", "Subscription manager": "Upravljanje praćenjima",
"Wilson score: ": "Wilson скор: ", "Wilson score: ": "Wilsonova ocena: ",
"Engagement: ": "Ангажовање: ", "Engagement: ": "Angažovanje: ",
"Whitelisted regions: ": "Дозвољени региони: ", "Whitelisted regions: ": "Dozvoljene oblasti: ",
"Shared `x`": "Подељено `x`", "Shared `x`": "Podeljeno `x`",
"`x` views": { "`x` views": {
"": "`x` прегледа", "": "`x` pregleda",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` преглед" "([^.,0-9]|^)1([^.,0-9]|$)": "`x` pregled"
}, },
"Premieres in `x`": "Премијера у `x`", "Premieres in `x`": "Premera u `x`",
"Premieres `x`": "Премијере у `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.": "Хеј! Изгледа да сте онемогућили JavaScript. Кликните овде да видите коментаре, имајте на уму да ово може да потраје дуже док се не учитају.", "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": { "View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Прикажи `x` коментар", "([^.,0-9]|^)1([^.,0-9]|$)": "Prikaži `x` komentar",
"": "Прикажи `x` коментара" "": "Prikaži `x` komentara"
}, },
"View Reddit comments": "Прикажи Reddit коментаре", "View Reddit comments": "Prikaži Reddit komentare",
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Неуспешна пријава, проверите да ли сте упалили двофакторну аутентикацију (Аутентикатор или СМС).", "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 је обавезно поље", "CAPTCHA is a required field": "CAPTCHA je obavezno polje",
"Croatian": "Хрватски", "Croatian": "Hrvatski",
"Estonian": "Естонски", "Estonian": "Estonski",
"Filipino": "Филипино", "Filipino": "Filipino",
"French": "Француски", "French": "Francuski",
"Galician": "Галицијски", "Galician": "Galicijski",
"German": "Немачки", "German": "Nemački",
"Greek": "Грчки", "Greek": "Grčki",
"Hausa": "Хауса", "Hausa": "Hausa",
"Italian": "Италијански", "Italian": "Talijanski",
"Khmer": "Кмерски", "Khmer": "Kmerski",
"Kurdish": "Курдски", "Kurdish": "Kurdski",
"Kyrgyz": "Киргиски", "Kyrgyz": "Kirgiski",
"Latvian": "Летонски", "Latvian": "Letonski",
"Lithuanian": "Литвански", "Lithuanian": "Litvanski",
"Macedonian": "Македонски", "Macedonian": "Makedonski",
"Malagasy": "Малгашки", "Malagasy": "Malgaški",
"Malay": "Малајски", "Malay": "Malajski",
"Marathi": "Маратхи", "Marathi": "Marathi",
"Mongolian": "Монголски", "Mongolian": "Mongolski",
"Norwegian Bokmål": "Норвешки Бокмал", "Norwegian Bokmål": "Norveški Bokmal",
"Nyanja": "Чева", "Nyanja": "Čeva",
"Pashto": "Паштунски", "Pashto": "Paštunski",
"Persian": "Персијски", "Persian": "Persijski",
"Punjabi": "Пунџаби", "Punjabi": "Pundžabi",
"Romanian": "Румунски", "Romanian": "Rumunski",
"Welsh": "Велшки", "Welsh": "Velški",
"Western Frisian": "Западнофризијски", "Western Frisian": "Zapadnofrizijski",
"`x` years": { "`x` years": {
"": "`x` година", "": "`x` godina",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` година" "([^.,0-9]|^)1([^.,0-9]|$)": "`x` godina"
}, },
"`x` weeks": { "`x` weeks": {
"": "`x` недеља", "": "`x` sedmica",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` недеља" "([^.,0-9]|^)1([^.,0-9]|$)": "`x` sedmica"
}, },
"`x` days": { "`x` days": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` дан", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` dan",
"": "`x` дана" "": "`x` dana"
}, },
"`x` hours": { "`x` hours": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` сат", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` sat",
"": "`x` сати" "": "`x` sati"
}, },
"Fallback comments: ": "Коментари у случају отказивања: ", "Fallback comments: ": "Komentari u slučaju otkazivanja: ",
"Popular": "Популарно", "Popular": "Popularno",
"Search": "Претрага", "Search": "Pretraga",
"About": "О програму", "About": "O programu",
"footer_source_code": "Изворни Код", "footer_source_code": "Izvorna Koda",
"footer_original_source_code": "Оригинални изворни код", "footer_original_source_code": "Originalna Izvorna Koda",
"preferences_related_videos_label": "Прикажи сличне видео клипове: ", "preferences_related_videos_label": "Prikaži slične video klipove: ",
"preferences_annotations_label": "Прикажи напомене подразумевано: ", "preferences_annotations_label": "Prikaži napomene podrazumevano: ",
"preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ", "preferences_extend_desc_label": "Automatski prikaži ceo opis videa: ",
"preferences_vr_mode_label": "Интерактивни видео клипови у 360 степени: ", "preferences_vr_mode_label": "Interaktivni video klipovi u 360 stepeni: ",
"preferences_category_visual": "Визуелне преференце", "preferences_category_visual": "Vizuelne preference",
"preferences_captions_label": "Подразумевани титл: ", "preferences_captions_label": "Podrazumevani titl: ",
"Music": "Музика", "Music": "Muzika",
"content_type": "Тип", "content_type": "Tip",
"Broken? Try another Invidious Instance": "Не функционише исправно? Пробајте другу Invidious инстанцу", "Broken? Try another Invidious Instance": "Ne funkcioniše ispravno? Probajte drugu Invidious instancu",
"Tamil": "Тамилски", "Tamil": "Tamilski",
"Save preferences": "Сачувај подешавања", "Save preferences": "Sačuvaj podešavanja",
"Only show latest unwatched video from channel: ": "Прикажи само последње видео клипове који нису погледани са канала: ", "Only show latest unwatched video from channel: ": "Prikaži samo poslednje video klipove koji nisu pogledani sa kanala: ",
"Xhosa": "Коса (Језик)", "Xhosa": "Kosa (Jezik)",
"channel": "Канал", "channel": "Kanal",
"Hungarian": "Мађарски", "Hungarian": "Mađarski",
"Maori": "Маори (Језик)", "Maori": "Maori (Jezik)",
"Manage subscriptions": "Управљај претплатама", "Manage subscriptions": "Upravljaj zapisima",
"Hindi": "Хинди", "Hindi": "Hindi",
"`x` ago": "пре `x`", "`x` ago": "pre `x`",
"Import/export data": "Увези/Извези податке", "Import/export data": "Uvezi/Izvezi podatke",
"`x` uploaded a video": "`x` је отпремио/ла видео клип", "`x` uploaded a video": "`x` je otpremio/la video klip",
"View `x` replies": { "View `x` replies": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Погледај `x` одоговор", "([^.,0-9]|^)1([^.,0-9]|$)": "Prikaži `x` odgovor",
"": "Погледај `x` одоговора" "": "Prikaži `x` odgovora"
}, },
"Delete account": "Обриши налог", "Delete account": "Obriši nalog",
"preferences_default_home_label": "Подразумевана почетна страница: ", "preferences_default_home_label": "Podrazumevana početna stranica: ",
"Serbian": "Српски", "Serbian": "Srpski",
"License: ": "Лиценца: ", "License: ": "Licenca: ",
"live": "Уживо", "live": "Uživo",
"Report statistics: ": "Извештавај о статистици: ", "Report statistics: ": "Izveštavaj o statistici: ",
"Only show latest video from channel: ": "Приказуј последње видео клипове само са канала: ", "Only show latest video from channel: ": "Prikazuj poslednje video klipove samo sa kanala: ",
"channel name - reverse": "име канала - обрнуто", "channel name - reverse": "ime kanala - obrnuto",
"Could not get channel info.": "Узимање података о каналу није успело.", "Could not get channel info.": "Uzimanje podataka o kanalu nije uspelo.",
"View privacy policy.": "Погледај политику приватности.", "View privacy policy.": "Pogledaj izveštaj o privatnosti.",
"Change password": "Промени лозинку", "Change password": "Promeni lozinku",
"Malayalam": "Малајалам", "Malayalam": "Malajalam",
"View more comments on Reddit": "Прикажи више коментара на Reddit-у", "View more comments on Reddit": "Prikaži više komentara na Reddit-u",
"Portuguese": "Португалски", "Portuguese": "Portugalski",
"View YouTube comments": "Прикажи YouTube коментаре", "View YouTube comments": "Prikaži YouTube komentare",
"published - reverse": "објављено - обрнуто", "published - reverse": "objavljeno - obrnuto",
"Dutch": "Белгијски", "Dutch": "Holandski",
"preferences_volume_label": "Јачина звука: ", "preferences_volume_label": "Jačina zvuka: ",
"preferences_locale_label": "Језик: ", "preferences_locale_label": "Jezik: ",
"`x` subscriptions": { "`x` subscriptions": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` пратиоц", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` praćenje",
"": "`x` пратилаца" "": "`x` praćenja"
}, },
"adminprefs_modified_source_code_url_label": "URL веза до репозиторијума са измењеним изворним кодом", "adminprefs_modified_source_code_url_label": "URL veza do skladišta sa Izmenjenom Izvornom Kodom",
"Community": "Заједница", "Community": "Zajednica",
"Video mode": "Видео мод", "Video mode": "Video mod",
"Fallback captions: ": "Титл у случају да главни није доступан: ", "Fallback captions: ": "Titl u slučaju da glavni nije dostupan: ",
"Private": "Приватно", "Private": "Privatno",
"alphabetically": "по алфабету", "alphabetically": "po alfabetu",
"No such user": "Непостојећи корисник", "No such user": "Nepostojeći korisnik",
"Subscriptions": "Праћења", "Subscriptions": "Praćenja",
"today": "Данас", "today": "Danas",
"Finnish": "Фински", "Finnish": "Finski",
"Lao": "Лаоски", "Lao": "Laoski",
"Login enabled: ": "Пријава омогућена: ", "Login enabled: ": "Prijava omogućena: ",
"Shona": "Шона", "Shona": "Šona",
"location": "Локација", "location": "Lokacija",
"Load more": "Учитај више", "Load more": "Učitaj više",
"Released under the AGPLv3 on Github.": "Избачено под лиценцом AGPLv3 на Github-у.", "Released under the AGPLv3 on Github.": "Izbačeno pod licencom AGPLv3 na Github-u.",
"Slovenian": "Словеначки", "Slovenian": "Slovenački",
"View JavaScript license information.": "Погледај информације лиценце везане за JavaScript.", "View JavaScript license information.": "Pogledaj informacije licence vezane za JavaScript.",
"Chinese (Simplified)": "Кинески (Поједностављени)", "Chinese (Simplified)": "Kineski (Pojednostavljeni)",
"preferences_comments_label": "Подразумевани коментари: ", "preferences_comments_label": "Podrazumevani komentari: ",
"Incorrect password": "Нетачна лозинка", "Incorrect password": "Netačna lozinka",
"Show replies": "Прикажи одговоре", "Show replies": "Prikaži odgovore",
"Invidious Private Feed for `x`": "Invidious приватни Feed за `x`", "Invidious Private Feed for `x`": "Invidious Privatni Dovod za `x`",
"Watch on YouTube": "Гледај на YouTube-у", "Watch on YouTube": "Gledaj na YouTube-u",
"Wrong answer": "Погрешан одговор", "Wrong answer": "Pogrešan odgovor",
"preferences_quality_label": "Преферирани видео квалитет: ", "preferences_quality_label": "Preferirani video kvalitet: ",
"Hide replies": "Сакриј одговоре", "Hide replies": "Sakrij odgovore",
"Invalid TFA code": "Неважећи TFA код", "Invalid TFA code": "Nevažeća TFA koda",
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Неуспешна пријава! Ово се можда дешава јер двофакторна аутентикација није омогућена на Вашем налогу.", "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": "Погрешна CAPTCHA", "Erroneous CAPTCHA": "Pogrešna CAPTCHA",
"Erroneous token": "Погрешан токен", "Erroneous token": "Pogrešan žeton",
"Czech": "Чешки", "Czech": "Češki",
"Latin": "Латински", "Latin": "Latinski",
"Videos": "Видео клипови", "Videos": "Video klipovi",
"4k": "4К", "4k": "4К",
"footer_donate_page": "Донирај", "footer_donate_page": "Doniraj",
"English": "Енглески", "English": "Engleski",
"Arabic": "Арапски", "Arabic": "Arapski",
"Unlisted": "Ненаведено", "Unlisted": "Nenavedeno",
"Hidden field \"challenge\" is a required field": "Сакривено \"challenge\" поље је обавезно", "Hidden field \"challenge\" is a required field": "Sakriveno \"challenge\" polje je obavezno",
"Hidden field \"token\" is a required field": "Сакривено \"token\" поље је обавезно", "Hidden field \"token\" is a required field": "Sakriveno \"token\" polje je obavezno",
"Georgian": "Грузијски", "Georgian": "Gruzijski",
"Hawaiian": "Хавајски", "Hawaiian": "Havajski",
"Hebrew": "Хебрејски", "Hebrew": "Hebrejski",
"Icelandic": "Исландски", "Icelandic": "Islandski",
"Igbo": "Игбо", "Igbo": "Igbo",
"Japanese": "Јапански", "Japanese": "Japanski",
"Javanese": "Јавански", "Javanese": "Javanski",
"Sindhi": "Синди", "Sindhi": "Sindi",
"Swahili": "Свахили", "Swahili": "Svahili",
"Yiddish": "Јидиш", "Yiddish": "Jidiš",
"Zulu": "Зулу", "Zulu": "Zulu",
"subtitles": "Титл", "subtitles": "Titl/Prevod",
"Password cannot be longer than 55 characters": "Лозинка не може бити дужа од 55 карактера", "Password cannot be longer than 55 characters": "Lozinka ne može biti duža od 55 karaktera",
"This channel does not exist.": "Овај канал не постоји.", "This channel does not exist.": "Ovaj kanal ne postoji.",
"Belarusian": "Белоруски", "Belarusian": "Beloruski",
"Gujarati": "Гуџарати", "Gujarati": "Gudžarati",
"Haitian Creole": "Хаићански Креолски", "Haitian Creole": "Haićanski Kreolski",
"Somali": "Сомалијски", "Somali": "Somalijski",
"Top": "Врх", "Top": "Vrh",
"footer_modfied_source_code": "Измењени изворни код", "footer_modfied_source_code": "Izmenjena Izvorna Koda",
"preferences_category_subscription": "Подешавања праћења", "preferences_category_subscription": "Podešavanja praćenja",
"preferences_annotations_subscribed_label": "Подразумевано приказати напомене за канале које пратите? ", "preferences_annotations_subscribed_label": "Podrazumevano prikazati napomene za kanale koje pratite? ",
"preferences_max_results_label": "Број видео клипова приказаних у листи (feed-у): ", "preferences_max_results_label": "Broj video klipova prikazanih u dovodnoj listi: ",
"preferences_sort_label": "Сортирај видео клипове по: ", "preferences_sort_label": "Sortiraj video klipove po: ",
"preferences_unseen_only_label": "Прикажи само видео клипове који нису погледани: ", "preferences_unseen_only_label": "Prikaži samo video klipove koji nisu pogledani: ",
"preferences_notifications_only_label": "Прикажи само обавештења (ако их уопште има): ", "preferences_notifications_only_label": "Prikaži samo obaveštenja (ako ih uopšte ima): ",
"preferences_category_data": "Подешавања података", "preferences_category_data": "Podešavanja podataka",
"Clear watch history": "Обриши историју гледања", "Clear watch history": "Obriši istoriju gledanja",
"preferences_category_admin": "Администраторска подешавања", "preferences_category_admin": "Administratorska podešavanja",
"published": "објављено", "published": "objavljeno",
"sort": "Сортирај према", "sort": "Poredaj prema",
"show": "Шоу", "show": "Emisija",
"short": "Кратак (< 4 минута)", "short": "Kratko (< 4 minute)",
"Current version: ": "Тренутна верзија: ", "Current version: ": "Trenutna verzija: ",
"Top enabled: ": "Врх омогућен: ", "Top enabled: ": "Vrh omogućen: ",
"Public": "Јавно", "Public": "Javno",
"Delete playlist": "Обриши плеј листу", "Delete playlist": "Obriši plej listu",
"Title": "Наслов", "Title": "Naslov",
"Show annotations": "Прикажи напомене", "Show annotations": "Prikaži napomene",
"Password cannot be empty": "Лозинка не може бити празна", "Password cannot be empty": "Lozinka ne može biti prazna",
"Deleted or invalid channel": "Обрисан или непостојећи канал", "Deleted or invalid channel": "Obrisan ili nepostojeći kanal",
"Esperanto": "Есперанто", "Esperanto": "Esperanto",
"Hmong": "Хмонг", "Hmong": "Hmong",
"Luxembourgish": "Луксембуршки", "Luxembourgish": "Luksemburški",
"Nepali": "Непалски", "Nepali": "Nepalski",
"Samoan": "Самоански", "Samoan": "Samoanski",
"News": "Вести", "News": "Vesti",
"permalink": "трајна веза", "permalink": "trajna veza",
"Password is a required field": "Лозинка је обавезно поље", "Password is a required field": "Lozinka je obavezno polje",
"Amharic": "Амхарски", "Amharic": "Amharski",
"Indonesian": "Индонежански", "Indonesian": "Indonežanski",
"Irish": "Ирски", "Irish": "Irski",
"Korean": "Корејски", "Korean": "Korejski",
"Southern Sotho": "Сото", "Southern Sotho": "Južni Soto",
"Thai": "Тајски", "Thai": "Tajski",
"`x` months": { "`x` months": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` месец", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` mesec",
"": "`x` месеци" "": "`x` meseci"
}, },
"preferences_speed_label": "Подразумевана брзина: ", "preferences_speed_label": "Podrazumevana brzina: ",
"Dark mode: ": "Тамни режим: ", "Dark mode: ": "Tamni režim: ",
"dark": "тамна", "dark": "tamno",
"Redirect homepage to feed: ": "Пребаци са почетне странице на листу (feed): ", "Redirect homepage to feed: ": "Prebaci sa početne stranice na dovodnu listu: ",
"channel name": "име канала", "channel name": "ime kanala",
"View all playlists": "Прегледај све плеј листе", "View all playlists": "Pregledaj sve plej liste",
"Show more": "Прикажи више", "Show more": "Prikaži više",
"Genre: ": "Жанр: ", "Genre: ": "Žanr: ",
"Family friendly? ": "Погодно за породицу? ", "Family friendly? ": "Pogodno za porodicu? ",
"next_steps_error_message_refresh": "Освежи страницу", "next_steps_error_message_refresh": "Osveži stranicu",
"youtube": "YouTube", "youtube": "YouTube",
"reddit": "Reddit", "reddit": "Reddit",
"unsubscribe": "прекини са праћењем", "unsubscribe": "prekini sa praćenjem",
"Blacklisted regions: ": "Блокирани региони: ", "Blacklisted regions: ": "Zabranjene oblasti: ",
"Polish": "Пољски", "Polish": "Poljski",
"Yoruba": "Јоруба" "Yoruba": "Joruba"
} }

View file

@ -1,170 +1,437 @@
{ {
"`x` subscribers": { "`x` subscribers": {
"": "`x` пратилац" "": "`x` пратилацa",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` пратилац"
}, },
"`x` videos": { "`x` videos": {
"": "`x` видеа" "": "`x` видео записа",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` видео запис"
}, },
"`x` playlists": { "`x` playlists": {
"": "`x` плејлиста/е" "": "`x` списака извођења",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` списак извођења"
}, },
"LIVE": "УЖИВО", "LIVE": "УЖИВО",
"Shared `x` ago": "Објављено пре `x`", "Shared `x` ago": "Подељено пре `x`",
"Unsubscribe": "Прекините праћење", "Unsubscribe": "Прекини праћење",
"Subscribe": "Пратите", "Subscribe": "Прати",
"View channel on YouTube": "Погледајте канал на YouTube-у", "View channel on YouTube": "Погледај канал на YouTube-у",
"View playlist on YouTube": "Погледајте плејлисту на YouTube-у", "View playlist on YouTube": "Погледај списак извођења на YоуТубе-у",
"newest": "најновије", "newest": "најновије",
"oldest": "најстарије", "oldest": "најстарије",
"popular": "популарно", "popular": "популарно",
"last": "последње", "last": "последње",
"Next page": "Следећа страна", "Next page": "Следећа страна",
"Previous page": "Претходна страна", "Previous page": "Претходна страна",
"Clear watch history?": "Обришите историју прегледања?", "Clear watch history?": "Избрисати повест прегледања?",
"New password": "Нова лозинка", "New password": "Нова лозинка",
"New passwords must match": "Нове лозинке се морају поклапати", "New passwords must match": "Нове лозинке морају бити истоветне",
"Cannot change password for Google accounts": "Није могуће променити лозинку за Google налоге", "Cannot change password for Google accounts": "Није могуће променити лозинку за Google налоге",
"Authorize token?": "Овластите токен?", "Authorize token?": "Овласти жетон?",
"Authorize token for `x`?": "Овластите токен за `x`?", "Authorize token for `x`?": "Овласти жетон за `x`?",
"Yes": "Да", "Yes": "Да",
"No": "Не", "No": "Не",
"Import and Export Data": "Увоз и извоз података", "Import and Export Data": "Увоз и извоз података",
"Import": "Увезите", "Import": "Увези",
"Import Invidious data": "Увезите Invidious податке", "Import Invidious data": "Увези податке са Individious-а",
"Import YouTube subscriptions": "Увезите праћења са YouTube-а", "Import YouTube subscriptions": "Увези праћења са YouTube-а",
"Import FreeTube subscriptions (.db)": "Увезите праћења са FreeTube-а (.db)", "Import FreeTube subscriptions (.db)": "Увези праћења са FreeTube-а (.db)",
"Import NewPipe subscriptions (.json)": "Увезите праћења са NewPipe-а (.json)", "Import NewPipe subscriptions (.json)": "Увези праћења са NewPipe-а (.json)",
"Import NewPipe data (.zip)": "Увезите NewPipe податке (.zip)", "Import NewPipe data (.zip)": "Увези податке са NewPipe-a (.zip)",
"Export": "Извезите", "Export": "Извези",
"Export subscriptions as OPML": "Извезите праћења у OPML формату", "Export subscriptions as OPML": "Извези праћења као ОПМЛ датотеку",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Извезите праћења у OPML формату (за NewPipe и FreeTube )", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Извези праћења као ОПМЛ датотеку (за NewPipe и FreeTube)",
"Export data as JSON": "Изветизе податке у JSON формату", "Export data as JSON": "Извези податке као JSON датотеку",
"Delete account?": "Избришите налог?", "Delete account?": "Избришите налог?",
"History": "Историја", "History": "Историја",
"An alternative front-end to YouTube": "Алтернативни фронтенд за YouTube", "An alternative front-end to YouTube": "Заменски кориснички слој за YouTube",
"JavaScript license information": "Извештај о JavaScript лиценци", "JavaScript license information": "Извештај о JavaScript одобрењу",
"source": "извор", "source": "извор",
"Log in": "Пријавите се", "Log in": "Пријави се",
"Log in/register": "Пријавите се/направите налог", "Log in/register": "Пријави се/Отворите налог",
"Log in with Google": "Пријавите се помоћу Google-а", "Log in with Google": "Пријави се помоћу Google-а",
"User ID": "ИД корисника", "User ID": "Кориснички ИД",
"Password": "Лозинка", "Password": "Лозинка",
"Time (h:mm:ss):": "Колико је сати? (ч:мм:сс):", "Time (h:mm:ss):": "Време (ч:мм:сс):",
"Text CAPTCHA": "Текстуална CAPTCHA", "Text CAPTCHA": "Знаковни ЦАПТЧА",
"Image CAPTCHA": "Сликовна CAPTCHA", "Image CAPTCHA": "Сликовни CAPTCHA",
"Sign In": "Пријавите се", "Sign In": "Пријава",
"Register": "Направите налог", "Register": "Отвори налог",
"E-mail": "Е-пошта", "E-mail": "Е-пошта",
"Google verification code": "Google верификациони кôд", "Google verification code": "Google-ова оверна кода",
"Preferences": "Подешавања", "Preferences": "Подешавања",
"preferences_category_player": "Подешавања видео плејера", "preferences_category_player": "Подешавања репродуктора",
"preferences_video_loop_label": "Увек понављај: ", "preferences_video_loop_label": "Увек понављај: ",
"preferences_autoplay_label": "Аутоматско пуштање: ", "preferences_autoplay_label": "Самопуштање: ",
"preferences_continue_label": "Увек пуштај следеће: ", "preferences_continue_label": "Увек подразумевано пуштај следеће: ",
"preferences_continue_autoplay_label": "Аутоматско пуштање следећег видеа: ", "preferences_continue_autoplay_label": "Самопуштање следећег видео записа: ",
"preferences_listen_label": "Режим слушања као подразумевано: ", "preferences_listen_label": "Увек подразумевано укључен само звук: ",
"preferences_local_label": уштање видеа кроз прокси сервер: ", "preferences_local_label": риказ видео записа преко посредника: ",
"preferences_speed_label": "Подразумевана брзина репродукције: ", "preferences_speed_label": "Подразумевана брзина: ",
"preferences_quality_label": "Претпостављени квалитет видеа: ", "preferences_quality_label": "Преферирани видео квалитет: ",
"preferences_volume_label": "Јачина звука: ", "preferences_volume_label": "Јачина звука: ",
"preferences_comments_label": "Подразумевани коментари: ", "preferences_comments_label": "Подразумевани коментари: ",
"youtube": "са YouTube-а", "youtube": "YouTube",
"reddit": "са редита", "reddit": "Reddit",
"preferences_captions_label": "Подразумевани титлови: ", "preferences_captions_label": "Подразумевани титл: ",
"Fallback captions: ": "Алтернативни титлови: ", "Fallback captions: ": "Титл у случају да главни није доступан: ",
"preferences_related_videos_label": "Прикажи сличне видее: ", "preferences_related_videos_label": "Прикажи сличне видео клипове: ",
"preferences_annotations_label": "Увек приказуј анотације: ", "preferences_annotations_label": "Прикажи напомене подразумевано: ",
"preferences_category_visual": "Подешавања изгледа", "preferences_category_visual": "Визуелне преференце",
"preferences_player_style_label": "Стил плејера: ", "preferences_player_style_label": "Стил плејера: ",
"Dark mode: ": "Тамни режим: ", "Dark mode: ": "Тамни режим: ",
"preferences_dark_mode_label": "Тема: ", "preferences_dark_mode_label": "Изглед/Тема: ",
"dark": "тамна", "dark": "тамно",
"light": "светла", "light": "светло",
"preferences_thin_mode_label": "Узани режим: ", "preferences_thin_mode_label": "Компактни режим: ",
"preferences_category_subscription": "Подешавања о праћењима", "preferences_category_subscription": "Подешавања праћења",
"preferences_annotations_subscribed_label": "Увек приказуј анотације за канале које пратим: ", "preferences_annotations_subscribed_label": "Подразумевано приказати напомене за канале које пратите? ",
"Redirect homepage to feed: ": "Прикажи праћења као почетну страницу: ", "Redirect homepage to feed: ": "Пребаци са почетне странице на доводну листу: ",
"preferences_max_results_label": "Количина приказаних видеа на доводу: ", "preferences_max_results_label": "Број видео клипова приказаних у доводној листи: ",
"preferences_sort_label": "Сортирај према: ", "preferences_sort_label": "Сортирај видео клипове по: ",
"published": "датуму објављивања", "published": "објављено",
"published - reverse": "датуму објављивања - обрнуто", "published - reverse": "објављено - обрнуто",
"alphabetically": "алфабету", "alphabetically": "по алфабету",
"alphabetically - reverse": "алфабету - обрнуто", "alphabetically - reverse": "по алфабету - обрнуто",
"channel name": "називу канала", "channel name": "име канала",
"channel name - reverse": "називу канала - обрнуто", "channel name - reverse": "име канала - обрнуто",
"Only show latest video from channel: ": "Прикажи само најновији видео са канала: ", "Only show latest video from channel: ": "Приказуј последње видео клипове само са канала: ",
"Only show latest unwatched video from channel: ": "Прикажи само најновији негледани видео са канала: ", "Only show latest unwatched video from channel: ": "Прикажи само последње видео клипове који нису погледани са канала: ",
"preferences_unseen_only_label": "Прикажи само негледано: ", "preferences_unseen_only_label": "Прикажи само видео клипове који нису погледани: ",
"preferences_notifications_only_label": "Прикажи само обавештења (ако их има): ", "preferences_notifications_only_label": "Прикажи само обавештења (ако их уопште има): ",
"Enable web notifications": "Укључи обавештења преко претраживача", "Enable web notifications": "Омогући обавештења у веб претраживачу",
"`x` uploaded a video": "`x`је објавио/ла видео", "`x` uploaded a video": "`x` је отпремио/ла видео клип",
"`x` is live": "`x` емитује уживо", "`x` is live": "`x` преноси уживо",
"preferences_category_data": "Подешавања о подацима", "preferences_category_data": "Подешавања података",
"Clear watch history": "Обришите историју прегледања", "Clear watch history": "Обриши историју гледања",
"Import/export data": "Увезите или извезите податке", "Import/export data": "Увези/Извези податке",
"Change password": "Промените лозинку", "Change password": "Промени лозинку",
"Manage subscriptions": "Управљајте праћењима", "Manage subscriptions": "Управљај записима",
"Manage tokens": "Управљајте токенима", "Manage tokens": "Управљај жетонима",
"Watch history": "Историја прегледања", "Watch history": "Историја гледања",
"Delete account": "Избришите налог", "Delete account": "Обриши налог",
"preferences_category_admin": "Подешавања администратора", "preferences_category_admin": "Администраторска подешавања",
"preferences_default_home_label": "Подразумевана главна страница: ", "preferences_default_home_label": "Подразумевана почетна страница: ",
"preferences_feed_menu_label": "Мени довода: ", "preferences_feed_menu_label": "Доводна страница: ",
"CAPTCHA enabled: ": "CAPTCHA укључена?: ", "CAPTCHA enabled: ": "CAPTCHA омогућена: ",
"Login enabled: ": "Пријава укључена?: ", "Login enabled: ": "Пријава омогућена: ",
"Registration enabled: ": "Регистрација укључена?: ", "Registration enabled: ": "Регистрација омогућена: ",
"Save preferences": "Сачувај подешавања", "Save preferences": "Сачувај подешавања",
"Subscription manager": "Управљање праћењима", "Subscription manager": "Управљање праћењима",
"Token manager": "Управљање токенима", "Token manager": "Управљање жетонима",
"Token": "Токен", "Token": "Жетон",
"`x` subscriptions": { "`x` subscriptions": {
"": "`x`праћења" "": "`x` праћења",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` праћење"
}, },
"`x` tokens": { "`x` tokens": {
"": "`x`токена" "": "`x` жетона",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` жетон"
}, },
"Import/export": "Увези/извези", "Import/export": "Увези/Извези",
"unsubscribe": "укини праћење", "unsubscribe": "прекини са праћењем",
"revoke": "опозови", "revoke": "опозови",
"Subscriptions": "Праћења", "Subscriptions": "Праћења",
"`x` unseen notifications": { "`x` unseen notifications": {
"": "`x` непрочитаних обавештења" "": "`x` непрочитаних обавештења",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` непрегледано обавештење"
}, },
"search": "претрага", "search": "претрага",
"Log out": "Одјавите се", "Log out": "Одјава",
"Source available here.": "Изворни код доступан овде.", "Source available here.": "Изворна кода је овде доступна.",
"View JavaScript license information.": рикажи информације о JavaScript лиценци.", "View JavaScript license information.": огледај информације лиценце везане за JavaScript.",
"View privacy policy.": рикажи извештај о приватности.", "View privacy policy.": огледај извештај о приватности.",
"Trending": "У тренду", "Trending": "У тренду",
"Public": "Јавно", "Public": "Јавно",
"Unlisted": "По позиву", "Unlisted": "Ненаведено",
"Private": "Приватно", "Private": "Приватно",
"View all playlists": "Прикажи све плејлисте", "View all playlists": "Прегледај све плеј листе",
"Updated `x` ago": "Ажурирано пре `x`", "Updated `x` ago": "Ажурирано пре `x`",
"Delete playlist `x`?": "Избриши плејлисту `x`?", "Delete playlist `x`?": "Обриши плеј листу `x`?",
"Delete playlist": "Избриши плејлисту", "Delete playlist": "Обриши плеј листу",
"Create playlist": "Направи плејлисту", "Create playlist": "Направи плеј листу",
"Title": "Наслов", "Title": "Наслов",
"Playlist privacy": "Видљивост плејлисте", "Playlist privacy": "Подешавања приватности плеј листе",
"Editing playlist `x`": "Уређујете плејлисту `x`", "Editing playlist `x`": "Измена плеј листе `x`",
"Watch on YouTube": "Гледајте на YouTube-у", "Watch on YouTube": "Гледај на YouTube-у",
"Hide annotations": "Сакриј анотације", "Hide annotations": "Сакриј напомене",
"Show annotations": "Прикажи анотације", "Show annotations": "Прикажи напомене",
"Genre: ": "Жанр: ", "Genre: ": "Жанр: ",
"License: ": "Лиценца: ", "License: ": "Лиценца: ",
"Engagement: ": "Ангажовање: ", "Engagement: ": "Ангажовање: ",
"Whitelisted regions: ": "Дозвољене области: ", "Whitelisted regions: ": "Дозвољене области: ",
"Blacklisted regions: ": "Забрањене области: ", "Blacklisted regions: ": "Забрањене области: ",
"`x` views": { "`x` views": {
"": "`x` прегледа" "": "`x` прегледа",
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` преглед"
}, },
"Premieres in `x`": "Емитује се уживо за `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. Кликните овде да бисте приказали коментаре. Требаће мало дуже да се учитају.", "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 YouTube comments": "Прикажи YouTube коментаре",
"View more comments on Reddit": "Прикажи још коментара на Reddit-у", "View more comments on Reddit": "Прикажи више коментара на Reddit-у",
"View Reddit comments": "Прикажи коментаре са Reddit-а", "View Reddit comments": "Прикажи Reddit коментаре",
"Hide replies": "Сакриј одговоре", "Hide replies": "Сакриј одговоре",
"Show replies": "Прикажи одговоре", "Show replies": "Прикажи одговоре",
"Incorrect password": "Неисправна лозинка", "Incorrect password": "Нетачна лозинка",
"Current version: ": "Тренутна верзија: " "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", "adminprefs_modified_source_code_url_label": "Değiştirilmiş kaynak kodları deposunun URL'si",
"footer_donate_page": "Bağış yap", "footer_donate_page": "Bağış yap",
"preferences_region_label": "İçerik ülkesi: ", "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_original_source_code": "原始源代码",
"footer_donate_page": "捐赠", "footer_donate_page": "捐赠",
"preferences_region_label": "内容国家: ", "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", "adminprefs_modified_source_code_url_label": "修改後的原始碼倉庫 URL",
"footer_donate_page": "捐款", "footer_donate_page": "捐款",
"preferences_region_label": "內容國家: ", "preferences_region_label": "內容國家: ",
"preferences_quality_dash_label": "偏好的 dash 影片品質: " "preferences_quality_dash_label": "偏好的 DASH 影片品質: "
} }

View file

@ -408,7 +408,7 @@ define_video_playback_routes()
# Users # Users
post "/watch_ajax" do |env| post "/watch_ajax" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -478,7 +478,7 @@ end
# /modify_notifications?receive_all_updates=false&receive_no_updates=false # /modify_notifications?receive_all_updates=false&receive_no_updates=false
# will "unding" all subscriptions. # will "unding" all subscriptions.
get "/modify_notifications" do |env| get "/modify_notifications" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -551,7 +551,7 @@ get "/modify_notifications" do |env|
end end
post "/subscription_ajax" do |env| post "/subscription_ajax" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -621,7 +621,7 @@ post "/subscription_ajax" do |env|
end end
get "/subscription_manager" do |env| get "/subscription_manager" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -724,7 +724,7 @@ get "/subscription_manager" do |env|
end end
get "/data_control" do |env| get "/data_control" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
referer = get_referer(env) referer = get_referer(env)
@ -739,7 +739,7 @@ get "/data_control" do |env|
end end
post "/data_control" do |env| post "/data_control" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
referer = get_referer(env) referer = get_referer(env)
@ -902,7 +902,7 @@ post "/data_control" do |env|
end end
get "/change_password" do |env| get "/change_password" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -920,7 +920,7 @@ get "/change_password" do |env|
end end
post "/change_password" do |env| post "/change_password" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -976,7 +976,7 @@ post "/change_password" do |env|
end end
get "/delete_account" do |env| get "/delete_account" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -994,7 +994,7 @@ get "/delete_account" do |env|
end end
post "/delete_account" do |env| post "/delete_account" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -1028,7 +1028,7 @@ post "/delete_account" do |env|
end end
get "/clear_watch_history" do |env| 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" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -1046,7 +1046,7 @@ get "/clear_watch_history" do |env|
end end
post "/clear_watch_history" do |env| 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" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -1071,7 +1071,7 @@ post "/clear_watch_history" do |env|
end end
get "/authorize_token" do |env| get "/authorize_token" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -1099,7 +1099,7 @@ get "/authorize_token" do |env|
end end
post "/authorize_token" do |env| post "/authorize_token" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -1147,7 +1147,7 @@ post "/authorize_token" do |env|
end end
get "/token_manager" do |env| get "/token_manager" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -1165,7 +1165,7 @@ get "/token_manager" do |env|
end end
post "/token_ajax" do |env| post "/token_ajax" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -1225,7 +1225,7 @@ end
{"/channel/:ucid/live", "/user/:user/live", "/c/:user/live"}.each do |route| {"/channel/:ucid/live", "/user/:user/live", "/c/:user/live"}.each do |route|
get route do |env| 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 # Appears to be a bug in routing, having several routes configured
# as `/a/:a`, `/b/:a`, `/c/:a` results in 404 # as `/a/:a`, `/b/:a`, `/c/:a` results in 404
@ -1347,7 +1347,7 @@ error 404 do |env|
end end
error 500 do |env, ex| error 500 do |env, ex|
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
error_template(500, ex) error_template(500, ex)
end end

View file

@ -22,7 +22,7 @@ def github_details(summary : String, content : String)
return HTML.escape(details) return HTML.escape(details)
end 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) if exception.is_a?(InfoException)
return error_template_helper(env, locale, status_code, exception.message || "") return error_template_helper(env, locale, status_code, exception.message || "")
end end
@ -46,7 +46,7 @@ def error_template_helper(env : HTTP::Server::Context, locale : Hash(String, JSO
return templated "error" return templated "error"
end 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.content_type = "text/html"
env.response.status_code = status_code env.response.status_code = status_code
error_message = translate(locale, message) error_message = translate(locale, message)
@ -58,7 +58,7 @@ macro error_atom(*args)
error_atom_helper(env, locale, {{*args}}) error_atom_helper(env, locale, {{*args}})
end 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) if exception.is_a?(InfoException)
return error_atom_helper(env, locale, status_code, exception.message || "") return error_atom_helper(env, locale, status_code, exception.message || "")
end 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>" return "<error>#{exception.inspect_with_backtrace}</error>"
end 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.content_type = "application/atom+xml"
env.response.status_code = status_code env.response.status_code = status_code
return "<error>#{message}</error>" return "<error>#{message}</error>"
@ -77,7 +77,7 @@ macro error_json(*args)
error_json_helper(env, locale, {{*args}}) error_json_helper(env, locale, {{*args}})
end 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) if exception.is_a?(InfoException)
return error_json_helper(env, locale, status_code, exception.message || "", additional_fields) return error_json_helper(env, locale, status_code, exception.message || "", additional_fields)
end end
@ -90,11 +90,11 @@ def error_json_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::A
return error_message.to_json return error_message.to_json
end 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) return error_json_helper(env, locale, status_code, exception, nil)
end 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.content_type = "application/json"
env.response.status_code = status_code env.response.status_code = status_code
error_message = {"error" => message} 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 return error_message.to_json
end 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) error_json_helper(env, locale, status_code, message, nil)
end 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 request_path = env.request.path
if request_path.starts_with?("/search") || request_path.starts_with?("/watch") || 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(PQ::Notification).new(8)
connection_channel.send({true, connection}) 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? since = env.params.query["since"]?.try &.to_i?
id = 0 id = 0

View file

@ -1,46 +1,47 @@
# "bn_BD" => load_locale("bn_BD"), # Bengali (Bangladesh) [Incomplete] # "bn_BD" => load_locale("bn_BD"), # Bengali (Bangladesh) [Incomplete]
# "eu" => load_locale("eu"), # Basque [Incomplete] # "eu" => load_locale("eu"), # Basque [Incomplete]
# "si" => load_locale("si"), # Sinhala [Incomplete]
# "sk" => load_locale("sk"), # Slovak [Incomplete] # "sk" => load_locale("sk"), # Slovak [Incomplete]
# "sr" => load_locale("sr"), # Serbian [Incomplete] # "sr" => load_locale("sr"), # Serbian [Incomplete]
# "sr_Cyrl" => load_locale("sr_Cyrl"), # Serbian (cyrillic) [Incomplete] # "sr_Cyrl" => load_locale("sr_Cyrl"), # Serbian (cyrillic) [Incomplete]
LOCALES = { LOCALES_LIST = {
"ar" => load_locale("ar"), # Arabic "ar" => "العربية", # Arabic
"cs" => load_locale("cs"), # Czech "cs" => "Čeština", # Czech
"da" => load_locale("da"), # Danish "da" => "Dansk", # Danish
"de" => load_locale("de"), # German "de" => "Deutsch", # German
"el" => load_locale("el"), # Greek "el" => "Ελληνικά", # Greek
"en-US" => load_locale("en-US"), # English (US) "en-US" => "English", # English
"eo" => load_locale("eo"), # Esperanto "eo" => "Esperanto", # Esperanto
"es" => load_locale("es"), # Spanish "es" => "Español", # Spanish
"fa" => load_locale("fa"), # Persian "fa" => "فارسی", # Persian
"fi" => load_locale("fi"), # Finnish "fi" => "Suomi", # Finnish
"fr" => load_locale("fr"), # French "fr" => "Français", # French
"he" => load_locale("he"), # Hebrew "he" => "עברית", # Hebrew
"hr" => load_locale("hr"), # Croatian "hr" => "Hrvatski", # Croatian
"hu-HU" => load_locale("hu-HU"), # Hungarian "hu-HU" => "Magyar Nyelv", # Hungarian
"id" => load_locale("id"), # Indonesian "id" => "Bahasa Indonesia", # Indonesian
"is" => load_locale("is"), # Icelandic "is" => "Íslenska", # Icelandic
"it" => load_locale("it"), # Italian "it" => "Italiano", # Italian
"ja" => load_locale("ja"), # Japanese "ja" => "日本語", # Japanese
"ko" => load_locale("ko"), # Korean "ko" => "한국어", # Korean
"lt" => load_locale("lt"), # Lithuanian "lt" => "Lietuvių", # Lithuanian
"nb-NO" => load_locale("nb-NO"), # Norwegian Bokmål "nb-NO" => "Norsk bokmål", # Norwegian Bokmål
"nl" => load_locale("nl"), # Dutch "nl" => "Nederlands", # Dutch
"pl" => load_locale("pl"), # Polish "pl" => "Polski", # Polish
"pt" => load_locale("pt"), # Portuguese "pt" => "Português", # Portuguese
"pt-BR" => load_locale("pt-BR"), # Portuguese (Brazil) "pt-BR" => "Português Brasileiro", # Portuguese (Brazil)
"pt-PT" => load_locale("pt-PT"), # Portuguese (Portugal) "pt-PT" => "Português de Portugal", # Portuguese (Portugal)
"ro" => load_locale("ro"), # Romanian "ro" => "Română", # Romanian
"ru" => load_locale("ru"), # Russian "ru" => "русский", # Russian
"sv-SE" => load_locale("sv-SE"), # Swedish "sv-SE" => "Svenska", # Swedish
"tr" => load_locale("tr"), # Turkish "tr" => "Türkçe", # Turkish
"uk" => load_locale("uk"), # Ukrainian "uk" => "Українська", # Ukrainian
"vi" => load_locale("vi"), # Vietnamese "vi" => "Tiếng Việt", # Vietnamese
"zh-CN" => load_locale("zh-CN"), # Chinese (Simplified) "zh-CN" => "汉语", # Chinese (Simplified)
"zh-TW" => load_locale("zh-TW"), # Chinese (Traditional) "zh-TW" => "漢語", # Chinese (Traditional)
} }
LOCALES = load_all_locales()
CONTENT_REGIONS = { CONTENT_REGIONS = {
"AE", "AR", "AT", "AU", "AZ", "BA", "BD", "BE", "BG", "BH", "BO", "BR", "BY", "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", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "DZ", "EC", "EE",
@ -53,21 +54,39 @@ CONTENT_REGIONS = {
"YE", "ZA", "ZW", "YE", "ZA", "ZW",
} }
def load_locale(name) def load_all_locales
return JSON.parse(File.read("locales/#{name}.json")).as_h 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 end
def translate(locale : Hash(String, JSON::Any) | Nil, translation : String, text : String | Nil = nil) def translate(locale : String?, key : String, text : String | Nil = nil) : String
# if locale && !locale[translation]? # Log a warning if "key" doesn't exist in en-US locale and return
# puts "Could not find translation for #{translation.dump}" # that key as the text, so this is more or less transparent to the user.
# end if !LOCALES["en-US"].has_key?(key)
LOGGER.warn("i18n: Missing translation key \"#{key}\"")
return key
end
if locale && locale[translation]? # Default to english, whenever the locale doesn't exist,
case locale[translation] # 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
case raw_data
when .as_h? when .as_h?
# Init
translation = ""
match_length = 0 match_length = 0
locale[translation].as_h.each do |key, value| raw_data.as_h.each do |key, value|
if md = text.try &.match(/#{key}/) if md = text.try &.match(/#{key}/)
if md[0].size >= match_length if md[0].size >= match_length
translation = value.as_s translation = value.as_s
@ -76,12 +95,9 @@ def translate(locale : Hash(String, JSON::Any) | Nil, translation : String, text
end end
end end
when .as_s? when .as_s?
if !locale[translation].as_s.empty? translation = raw_data.as_s
translation = locale[translation].as_s
end
else else
raise "Invalid translation #{translation}" raise "Invalid translation \"#{raw_data}\""
end
end end
if text if text
@ -91,7 +107,7 @@ def translate(locale : Hash(String, JSON::Any) | Nil, translation : String, text
return translation return translation
end end
def translate_bool(locale : Hash(String, JSON::Any) | Nil, translation : Bool) def translate_bool(locale : String?, translation : Bool)
case translation case translation
when true when true
return translate(locale, "Yes") return translate(locale, "Yes")

View file

@ -64,7 +64,7 @@ struct SearchVideo
end end
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.object do
json.field "type", "video" json.field "type", "video"
json.field "title", self.title json.field "title", self.title
@ -96,7 +96,7 @@ struct SearchVideo
end end
# TODO: remove the locale and follow the crystal convention # 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| JSON.build do |json|
to_json(locale, json) to_json(locale, json)
end end
@ -130,7 +130,7 @@ struct SearchPlaylist
property videos : Array(SearchPlaylistVideo) property videos : Array(SearchPlaylistVideo)
property thumbnail : String? 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.object do
json.field "type", "playlist" json.field "type", "playlist"
json.field "title", self.title json.field "title", self.title
@ -161,7 +161,7 @@ struct SearchPlaylist
end end
# TODO: remove the locale and follow the crystal convention # 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| JSON.build do |json|
to_json(locale, json) to_json(locale, json)
end end
@ -183,7 +183,7 @@ struct SearchChannel
property description_html : String property description_html : String
property auto_generated : Bool 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.object do
json.field "type", "channel" json.field "type", "channel"
json.field "author", self.author json.field "author", self.author
@ -214,7 +214,7 @@ struct SearchChannel
end end
# TODO: remove the locale and follow the crystal convention # 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| JSON.build do |json|
to_json(locale, json) to_json(locale, json)
end end
@ -234,7 +234,7 @@ class Category
property description_html : String property description_html : String
property badges : Array(Tuple(String, 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.object do
json.field "type", "category" json.field "type", "category"
json.field "title", self.title json.field "title", self.title
@ -249,7 +249,7 @@ class Category
end end
# TODO: remove the locale and follow the crystal convention # 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| JSON.build do |json|
to_json(locale, json) to_json(locale, json)
end end

View file

@ -36,7 +36,7 @@ module Invidious::Routes::API::V1::Authenticated
env.response.content_type = "application/json" env.response.content_type = "application/json"
user = env.get("user").as(User) 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 = env.params.query["max_results"]?.try &.to_i?
max_results ||= user.preferences.max_results max_results ||= user.preferences.max_results
@ -122,7 +122,7 @@ module Invidious::Routes::API::V1::Authenticated
end end
def self.list_playlists(env) 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" env.response.content_type = "application/json"
user = env.get("user").as(User) user = env.get("user").as(User)
@ -141,7 +141,7 @@ module Invidious::Routes::API::V1::Authenticated
def self.create_playlist(env) def self.create_playlist(env)
env.response.content_type = "application/json" env.response.content_type = "application/json"
user = env.get("user").as(User) 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) title = env.params.json["title"]?.try &.as(String).delete("<>").byte_slice(0, 150)
if !title if !title
@ -167,7 +167,7 @@ module Invidious::Routes::API::V1::Authenticated
end end
def self.update_playlist_attribute(env) 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" env.response.content_type = "application/json"
user = env.get("user").as(User) user = env.get("user").as(User)
@ -200,7 +200,7 @@ module Invidious::Routes::API::V1::Authenticated
end end
def self.delete_playlist(env) 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" env.response.content_type = "application/json"
user = env.get("user").as(User) user = env.get("user").as(User)
@ -223,7 +223,7 @@ module Invidious::Routes::API::V1::Authenticated
end end
def self.insert_video_into_playlist(env) 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" env.response.content_type = "application/json"
user = env.get("user").as(User) user = env.get("user").as(User)
@ -281,7 +281,7 @@ module Invidious::Routes::API::V1::Authenticated
end end
def self.delete_video_in_playlist(env) 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" env.response.content_type = "application/json"
user = env.get("user").as(User) user = env.get("user").as(User)
@ -334,7 +334,7 @@ module Invidious::Routes::API::V1::Authenticated
def self.register_token(env) def self.register_token(env)
user = env.get("user").as(User) 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"]? case env.request.headers["Content-Type"]?
when "application/x-www-form-urlencoded" when "application/x-www-form-urlencoded"
@ -396,7 +396,7 @@ module Invidious::Routes::API::V1::Authenticated
end end
def self.unregister_token(env) 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" env.response.content_type = "application/json"
user = env.get("user").as(User) user = env.get("user").as(User)
scopes = env.get("scopes").as(Array(String)) scopes = env.get("scopes").as(Array(String))

View file

@ -1,6 +1,6 @@
module Invidious::Routes::API::V1::Channels module Invidious::Routes::API::V1::Channels
def self.home(env) 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" env.response.content_type = "application/json"
@ -124,7 +124,7 @@ module Invidious::Routes::API::V1::Channels
end end
def self.latest(env) 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" env.response.content_type = "application/json"
@ -146,7 +146,7 @@ module Invidious::Routes::API::V1::Channels
end end
def self.videos(env) 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" env.response.content_type = "application/json"
@ -182,7 +182,7 @@ module Invidious::Routes::API::V1::Channels
end end
def self.playlists(env) 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" env.response.content_type = "application/json"
@ -219,7 +219,7 @@ module Invidious::Routes::API::V1::Channels
end end
def self.community(env) 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" env.response.content_type = "application/json"
@ -242,7 +242,7 @@ module Invidious::Routes::API::V1::Channels
end end
def self.search(env) 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" env.response.content_type = "application/json"

View file

@ -1,6 +1,6 @@
module Invidious::Routes::API::V1::Feeds module Invidious::Routes::API::V1::Feeds
def self.trending(env) 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" env.response.content_type = "application/json"
@ -25,7 +25,7 @@ module Invidious::Routes::API::V1::Feeds
end end
def self.popular(env) 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" env.response.content_type = "application/json"

View file

@ -1,7 +1,7 @@
module Invidious::Routes::API::V1::Misc module Invidious::Routes::API::V1::Misc
# Stats API endpoint for Invidious # Stats API endpoint for Invidious
def self.stats(env) 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" env.response.content_type = "application/json"
if !CONFIG.statistics_enabled 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 # user playlists and Invidious playlists. This means that we can't
# reasonably split them yet. This should be addressed in APIv2 # reasonably split them yet. This should be addressed in APIv2
def self.get_playlist(env) 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" env.response.content_type = "application/json"
plid = env.params.url["plid"] plid = env.params.url["plid"]
@ -84,7 +84,7 @@ module Invidious::Routes::API::V1::Misc
end end
def self.mixes(env) 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" env.response.content_type = "application/json"

View file

@ -1,6 +1,6 @@
module Invidious::Routes::API::V1::Search module Invidious::Routes::API::V1::Search
def self.search(env) def self.search(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
region = env.params.query["region"]? region = env.params.query["region"]?
env.response.content_type = "application/json" env.response.content_type = "application/json"
@ -43,7 +43,7 @@ module Invidious::Routes::API::V1::Search
end end
def self.search_suggestions(env) 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"]? region = env.params.query["region"]?
env.response.content_type = "application/json" env.response.content_type = "application/json"

View file

@ -1,6 +1,6 @@
module Invidious::Routes::API::V1::Videos module Invidious::Routes::API::V1::Videos
def self.videos(env) 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" env.response.content_type = "application/json"
@ -20,7 +20,7 @@ module Invidious::Routes::API::V1::Videos
end end
def self.captions(env) 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" env.response.content_type = "application/json"
@ -149,7 +149,7 @@ module Invidious::Routes::API::V1::Videos
# thumbnails for individual scenes in a video. # thumbnails for individual scenes in a video.
# See https://support.jwplayer.com/articles/how-to-add-preview-thumbnails # See https://support.jwplayer.com/articles/how-to-add-preview-thumbnails
def self.storyboards(env) 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" env.response.content_type = "application/json"
@ -223,7 +223,7 @@ module Invidious::Routes::API::V1::Videos
end end
def self.annotations(env) 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" env.response.content_type = "text/xml"
@ -293,7 +293,7 @@ module Invidious::Routes::API::V1::Videos
end end
def self.comments(env) def self.comments(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
region = env.params.query["region"]? region = env.params.query["region"]?
env.response.content_type = "application/json" 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 # Redirects brand url channels to a normal /channel/:ucid route
def self.brand_redirect(env) 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 # /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 # and in order to avoid detection from YouTube we should only send the required ones
@ -148,7 +148,7 @@ module Invidious::Routes::Channels
end end
private def self.fetch_basic_information(env) 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" user = env.get? "user"
if user if user

View file

@ -2,7 +2,7 @@
module Invidious::Routes::Embed module Invidious::Routes::Embed
def self.redirect(env) 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_-]/, "") if plid = env.params.query["list"]?.try &.gsub(/[^a-zA-Z0-9_-]/, "")
begin begin
@ -26,7 +26,7 @@ module Invidious::Routes::Embed
end end
def self.show(env) def self.show(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
id = env.params.url["id"] id = env.params.url["id"]
plid = env.params.query["list"]?.try &.gsub(/[^a-zA-Z0-9_-]/, "") plid = env.params.query["list"]?.try &.gsub(/[^a-zA-Z0-9_-]/, "")

View file

@ -6,7 +6,7 @@ module Invidious::Routes::Feeds
end end
def self.playlists(env) def self.playlists(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
referer = get_referer(env) referer = get_referer(env)
@ -31,7 +31,7 @@ module Invidious::Routes::Feeds
end end
def self.popular(env) def self.popular(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
if CONFIG.popular_enabled if CONFIG.popular_enabled
templated "feeds/popular" templated "feeds/popular"
@ -42,7 +42,7 @@ module Invidious::Routes::Feeds
end end
def self.trending(env) 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 = env.params.query["type"]?
trending_type ||= "Default" trending_type ||= "Default"
@ -60,7 +60,7 @@ module Invidious::Routes::Feeds
end end
def self.subscriptions(env) def self.subscriptions(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -108,7 +108,7 @@ module Invidious::Routes::Feeds
end end
def self.history(env) def self.history(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
referer = get_referer(env) referer = get_referer(env)
@ -137,7 +137,7 @@ module Invidious::Routes::Feeds
# RSS feeds # RSS feeds
def self.rss_channel(env) 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.headers["Content-Type"] = "application/atom+xml"
env.response.content_type = "application/atom+xml" env.response.content_type = "application/atom+xml"
@ -209,7 +209,7 @@ module Invidious::Routes::Feeds
end end
def self.rss_private(env) 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.headers["Content-Type"] = "application/atom+xml"
env.response.content_type = "application/atom+xml" env.response.content_type = "application/atom+xml"
@ -253,7 +253,7 @@ module Invidious::Routes::Feeds
end end
def self.rss_playlist(env) 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.headers["Content-Type"] = "application/atom+xml"
env.response.content_type = "application/atom+xml" env.response.content_type = "application/atom+xml"
@ -374,7 +374,7 @@ module Invidious::Routes::Feeds
end end
def self.push_notifications_post(env) 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"] token = env.params.url["token"]
body = env.request.body.not_nil!.gets_to_end body = env.request.body.not_nil!.gets_to_end

View file

@ -2,7 +2,7 @@
module Invidious::Routes::Login module Invidious::Routes::Login
def self.login_page(env) def self.login_page(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
@ -31,7 +31,7 @@ module Invidious::Routes::Login
end end
def self.login(env) 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") referer = get_referer(env, "/feed/subscriptions")
@ -491,7 +491,7 @@ module Invidious::Routes::Login
end end
def self.signout(env) def self.signout(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"

View file

@ -3,7 +3,7 @@
module Invidious::Routes::Misc module Invidious::Routes::Misc
def self.home(env) def self.home(env)
preferences = env.get("preferences").as(Preferences) preferences = env.get("preferences").as(Preferences)
locale = LOCALES[preferences.locale]? locale = preferences.locale
user = env.get? "user" user = env.get? "user"
case preferences.default_home case preferences.default_home
@ -29,12 +29,12 @@ module Invidious::Routes::Misc
end end
def self.privacy(env) def self.privacy(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
templated "privacy" templated "privacy"
end end
def self.licenses(env) def self.licenses(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
rendered "licenses" rendered "licenses"
end end

View file

@ -2,7 +2,7 @@
module Invidious::Routes::Playlists module Invidious::Routes::Playlists
def self.new(env) def self.new(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -18,7 +18,7 @@ module Invidious::Routes::Playlists
end end
def self.create(env) def self.create(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -56,7 +56,7 @@ module Invidious::Routes::Playlists
end end
def self.subscribe(env) def self.subscribe(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
referer = get_referer(env) referer = get_referer(env)
@ -73,7 +73,7 @@ module Invidious::Routes::Playlists
end end
def self.delete_page(env) def self.delete_page(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -96,7 +96,7 @@ module Invidious::Routes::Playlists
end end
def self.delete(env) def self.delete(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -129,7 +129,7 @@ module Invidious::Routes::Playlists
end end
def self.edit(env) def self.edit(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -169,7 +169,7 @@ module Invidious::Routes::Playlists
end end
def self.update(env) def self.update(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -213,7 +213,7 @@ module Invidious::Routes::Playlists
end end
def self.add_playlist_items_page(env) 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" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -260,7 +260,7 @@ module Invidious::Routes::Playlists
end end
def self.playlist_ajax(env) def self.playlist_ajax(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
user = env.get? "user" user = env.get? "user"
sid = env.get? "sid" sid = env.get? "sid"
@ -387,7 +387,7 @@ module Invidious::Routes::Playlists
end end
def self.show(env) 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) user = env.get?("user").try &.as(User)
referer = get_referer(env) referer = get_referer(env)
@ -435,7 +435,7 @@ module Invidious::Routes::Playlists
end end
def self.mix(env) def self.mix(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
rdid = env.params.query["list"]? rdid = env.params.query["list"]?
if !rdid if !rdid

View file

@ -2,7 +2,7 @@
module Invidious::Routes::PreferencesRoute module Invidious::Routes::PreferencesRoute
def self.show(env) def self.show(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
referer = get_referer(env) referer = get_referer(env)
@ -12,7 +12,7 @@ module Invidious::Routes::PreferencesRoute
end end
def self.update(env) def self.update(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
referer = get_referer(env) referer = get_referer(env)
video_loop = env.params.body["video_loop"]?.try &.as(String) video_loop = env.params.body["video_loop"]?.try &.as(String)
@ -227,7 +227,7 @@ module Invidious::Routes::PreferencesRoute
end end
def self.toggle_theme(env) 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) referer = get_referer(env, unroll: false)
redirect = env.params.query["redirect"]? redirect = env.params.query["redirect"]?

View file

@ -2,7 +2,7 @@
module Invidious::Routes::Search module Invidious::Routes::Search
def self.opensearch(env) 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" env.response.content_type = "application/opensearchdescription+xml"
XML.build(indent: " ", encoding: "UTF-8") do |xml| XML.build(indent: " ", encoding: "UTF-8") do |xml|
@ -18,7 +18,7 @@ module Invidious::Routes::Search
end end
def self.results(env) 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["search_query"]?
query ||= env.params.query["q"]? query ||= env.params.query["q"]?
@ -37,7 +37,7 @@ module Invidious::Routes::Search
end end
def self.search(env) def self.search(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
region = env.params.query["region"]? region = env.params.query["region"]?
query = env.params.query["search_query"]? query = env.params.query["search_query"]?

View file

@ -1,7 +1,7 @@
module Invidious::Routes::VideoPlayback module Invidious::Routes::VideoPlayback
# /videoplayback # /videoplayback
def self.get_video_playback(env) 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 query_params = env.params.query
fvip = query_params["fvip"]? || "3" fvip = query_params["fvip"]? || "3"

View file

@ -2,7 +2,7 @@
module Invidious::Routes::Watch module Invidious::Routes::Watch
def self.handle(env) def self.handle(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]? locale = env.get("preferences").as(Preferences).locale
region = env.params.query["region"]? region = env.params.query["region"]?
if env.params.query.to_s.includes?("%20") || env.params.query.to_s.includes?("+") if env.params.query.to_s.includes?("%20") || env.params.query.to_s.includes?("+")

View file

@ -275,7 +275,7 @@ struct Video
end end
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.object do
json.field "type", "video" json.field "type", "video"
@ -475,7 +475,7 @@ struct Video
end end
# TODO: remove the locale and follow the crystal convention # 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) } JSON.build { |json| to_json(locale, json) }
end end

View file

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

View file

@ -1,6 +1,6 @@
<div class="flex-right"> <div class="flex-right">
<div class="icon-buttons"> <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> <i class="icon ion-logo-youtube"></i>
</a> </a>
<a title="<%=translate(locale, "Audio mode")%>" href="/watch<%=endpoint_params%>&listen=1"> <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-g h-box">
<div class="pure-u-2-3"> <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>
<div class="pure-u-1-3" style="text-align:right"> <div class="pure-u-1-3" style="text-align:right">
<h3> <h3>
@ -23,7 +23,7 @@
<div class="pure-g h-box"> <div class="pure-g h-box">
<div class="pure-u-1"> <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>
</div> </div>

View file

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

View file

@ -20,8 +20,10 @@
<link rel="stylesheet" href="/css/keromod.css?v=<%= ASSET_COMMIT %>"> <link rel="stylesheet" href="/css/keromod.css?v=<%= ASSET_COMMIT %>">
</head> </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"> <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> <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> </h3>
<% elsif video.live_now %> <% elsif video.live_now %>
<h3> <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> </h3>
<% end %> <% end %>
</div> </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="pure-u-1 pure-u-lg-1-5">
<div class="h-box"> <div class="h-box">
<span id="watch-on-youtube"> <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/watch?v=<%= video.id %>"><%= translate(locale, "videoinfo_watch_on_youTube") %></a>
(<a href="https://www.youtube.com/embed/<%= video.id %>"><%= translate(locale, "Embed") %></a>) (<a href="https://www.youtube.com/embed/<%= video.id %>"><%= translate(locale, "videoinfo_youTube_embed_link") %></a>)
</span> </span>
<p id="watch-on-another-invidious-instance"> <p id="watch-on-another-invidious-instance">
<% if env.get("preferences").as(Preferences).automatic_instance_redirect%> <% 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 %> <% end %>
</p> </p>
<p id="embed-link"> <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>
<p id="annotations"> <p id="annotations">
<% if params.annotations %> <% if params.annotations %>
@ -189,7 +189,7 @@ we're going to need to do it here in order to allow for translations.
<% end %> <% end %>
<% captions.each do |caption| %> <% 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"}'> <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> </option>
<% end %> <% end %>
</select> </select>