From b66e1771140cdbe77c11f3f9695b67bd08887b66 Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Sun, 4 Sep 2022 17:28:30 +0200 Subject: [PATCH] Localizations --- Extensions/String+Localizable.swift | 7 + Model/Accounts/Instance.swift | 2 +- Model/Search/SearchQuery.swift | 10 +- Model/SponsorBlock/SponsorBlockAPI.swift | 32 +- Model/TrendingCategory.swift | 16 +- Shared/Defaults.swift | 13 +- Shared/Player/Controls/OSD/Buffering.swift | 2 +- .../Player/Controls/OSD/OpeningStream.swift | 10 +- .../Controls/PlayerControlsLayout.swift | 6 +- Shared/Player/VideoDetails.swift | 25 +- Shared/Player/VideoPlayerView.swift | 1 + Shared/Playlists/PlaylistsView.swift | 43 +- Shared/Settings/AdvancedSettings.swift | 2 +- Shared/Settings/BrowsingSettings.swift | 8 +- Shared/Settings/Help.swift | 27 +- Shared/Settings/HistorySettings.swift | 16 +- Shared/Settings/InstanceSettings.swift | 4 +- Shared/Settings/LocationsSettings.swift | 10 +- Shared/Settings/PlayerSettings.swift | 26 +- Shared/Settings/QualitySettings.swift | 2 +- Shared/Settings/SettingsView.swift | 2 +- Shared/Settings/SponsorBlockSettings.swift | 2 +- Shared/Trending/TrendingCountry.swift | 2 +- Shared/Videos/VideoBanner.swift | 2 +- Shared/Views/ControlsBar.swift | 3 +- Shared/Views/ShareButton.swift | 20 +- Shared/Views/SubscriptionsView.swift | 2 +- Shared/Views/VideoContextMenuView.swift | 7 +- Shared/Views/WelcomeScreen.swift | 4 +- Shared/en.lproj/Localizable.strings | 976 ++++++++++++++++++ Shared/pl.lproj/Localizable.strings | 976 ++++++++++++++++++ Yattee.xcodeproj/project.pbxproj | 40 + macOS/InstancesSettings.swift | 4 +- 33 files changed, 2180 insertions(+), 122 deletions(-) create mode 100644 Extensions/String+Localizable.swift create mode 100644 Shared/en.lproj/Localizable.strings create mode 100644 Shared/pl.lproj/Localizable.strings diff --git a/Extensions/String+Localizable.swift b/Extensions/String+Localizable.swift new file mode 100644 index 00000000..c00f9c9d --- /dev/null +++ b/Extensions/String+Localizable.swift @@ -0,0 +1,7 @@ +import Foundation + +extension String { + func localized(_ comment: String = "") -> Self { + NSLocalizedString(self, tableName: "Localizable", bundle: .main, comment: comment) + } +} diff --git a/Model/Accounts/Instance.swift b/Model/Accounts/Instance.swift index 8d3d912a..4275f134 100644 --- a/Model/Accounts/Instance.swift +++ b/Model/Accounts/Instance.swift @@ -42,7 +42,7 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable { } var anonymousAccount: Account { - Account(instanceID: id, name: "Anonymous", url: apiURL, anonymous: true) + Account(instanceID: id, name: "Anonymous".localized(), url: apiURL, anonymous: true) } var urlComponents: URLComponents { diff --git a/Model/Search/SearchQuery.swift b/Model/Search/SearchQuery.swift index 6bb50c6b..4f63a1ff 100644 --- a/Model/Search/SearchQuery.swift +++ b/Model/Search/SearchQuery.swift @@ -10,7 +10,7 @@ final class SearchQuery: ObservableObject { } var name: String { - rawValue.capitalized + rawValue.capitalized.localized() } } @@ -22,7 +22,7 @@ final class SearchQuery: ObservableObject { } var name: String { - rawValue.capitalized + rawValue.capitalized.localized() } } @@ -36,11 +36,11 @@ final class SearchQuery: ObservableObject { var name: String { switch self { case .uploadDate: - return "Date" + return "Date".localized() case .viewCount: - return "Views" + return "Views".localized() default: - return rawValue.capitalized + return rawValue.capitalized.localized() } } diff --git a/Model/SponsorBlock/SponsorBlockAPI.swift b/Model/SponsorBlock/SponsorBlockAPI.swift index 3a514587..395eb59e 100644 --- a/Model/SponsorBlock/SponsorBlockAPI.swift +++ b/Model/SponsorBlock/SponsorBlockAPI.swift @@ -18,12 +18,18 @@ final class SponsorBlockAPI: ObservableObject { } switch name { + case "sponsor": + return "Sponsor".localized() case "selfpromo": - return "Self-promotion" - + return "Self-promotion".localized() + case "intro": + return "Intro".localized() + case "outro": + return "Outro".localized() + case "interaction": + return "Interaction".localized() case "music_offtopic": - return "Offtopic in Music Videos" - + return "Offtopic in Music Videos".localized() default: return name.capitalized } @@ -36,25 +42,25 @@ final class SponsorBlockAPI: ObservableObject { switch name { case "sponsor": - return "Part of a video promoting a product or service not directly related to the creator. " + - "The creator will receive payment or compensation in the form of money or free products." + return ("Part of a video promoting a product or service not directly related to the creator. " + + "The creator will receive payment or compensation in the form of money or free products.").localized() case "selfpromo": - return "Promoting a product or service that is directly related to the creator themselves. " + - "This usually includes merchandise or promotion of monetized platforms." + return ("Promoting a product or service that is directly related to the creator themselves. " + + "This usually includes merchandise or promotion of monetized platforms.").localized() case "intro": - return "Segments typically found at the start of a video that include an animation, " + - "still frame or clip which are also seen in other videos by the same creator." + return ("Segments typically found at the start of a video that include an animation, " + + "still frame or clip which are also seen in other videos by the same creator.").localized() case "outro": - return "Typically near or at the end of the video when the credits pop up and/or endcards are shown." + return ("Typically near or at the end of the video when the credits pop up and/or endcards are shown.").localized() case "interaction": - return "Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." + return ("Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video).").localized() case "music_offtopic": - return "For videos which feature music as the primary content." + return ("For videos which feature music as the primary content.").localized() default: return nil diff --git a/Model/TrendingCategory.swift b/Model/TrendingCategory.swift index 91a7dc09..a56fe2c6 100644 --- a/Model/TrendingCategory.swift +++ b/Model/TrendingCategory.swift @@ -1,4 +1,5 @@ import Defaults +import Foundation enum TrendingCategory: String, CaseIterable, Identifiable, Defaults.Serializable { case `default`, music, gaming, movies @@ -8,14 +9,23 @@ enum TrendingCategory: String, CaseIterable, Identifiable, Defaults.Serializable } var title: RawValue { - rawValue.capitalized + switch self { + case .default: + return "All".localized() + case .music: + return "Music".localized() + case .gaming: + return "Gaming".localized() + case .movies: + return "Movies".localized() + } } var name: String { - id == "default" ? "Trending" : title + id == "default" ? "Trending".localized() : title } var controlLabel: String { - id == "default" ? "All" : title + id == "default" ? "All".localized() : title } } diff --git a/Shared/Defaults.swift b/Shared/Defaults.swift index 6f08700f..53a5f3f6 100644 --- a/Shared/Defaults.swift +++ b/Shared/Defaults.swift @@ -238,7 +238,7 @@ enum VisibleSection: String, CaseIterable, Comparable, Defaults.Serializable { case favorites, subscriptions, popular, trending, playlists var title: String { - rawValue.localizedCapitalized + rawValue.capitalized.localized() } var tabSelection: TabSelection { @@ -312,6 +312,17 @@ enum PlayerDetailsPageButtonLabelStyle: String, CaseIterable, Defaults.Serializa enum ThumbnailsQuality: String, CaseIterable, Defaults.Serializable { case highest, medium, low + + var description: String { + switch self { + case .highest: + return "Highest quality".localized() + case .medium: + return "Medium quality".localized() + case .low: + return "Low quality".localized() + } + } } enum SystemControlsCommands: String, CaseIterable, Defaults.Serializable { diff --git a/Shared/Player/Controls/OSD/Buffering.swift b/Shared/Player/Controls/OSD/Buffering.swift index 6a816466..69dee23f 100644 --- a/Shared/Player/Controls/OSD/Buffering.swift +++ b/Shared/Player/Controls/OSD/Buffering.swift @@ -3,7 +3,7 @@ import Foundation import SwiftUI struct Buffering: View { - var reason = "Buffering stream..." + var reason = "Buffering stream...".localized() var state: String? #if os(iOS) diff --git a/Shared/Player/Controls/OSD/OpeningStream.swift b/Shared/Player/Controls/OSD/OpeningStream.swift index a629d4c4..a855e6c9 100644 --- a/Shared/Player/Controls/OSD/OpeningStream.swift +++ b/Shared/Player/Controls/OSD/OpeningStream.swift @@ -14,7 +14,15 @@ struct OpeningStream: View { } var reason: String { - player.videoBeingOpened.isNil ? "Opening\(streamQuality)stream..." : "Loading streams..." + guard player.videoBeingOpened != nil else { + return "Loading streams...".localized() + } + + if player.musicMode { + return "Opening audio stream...".localized() + } + + return String(format: "Opening %@ stream...".localized(), streamQuality) } var state: String? { diff --git a/Shared/Player/Controls/PlayerControlsLayout.swift b/Shared/Player/Controls/PlayerControlsLayout.swift index 5ef4ae09..19391b26 100644 --- a/Shared/Player/Controls/PlayerControlsLayout.swift +++ b/Shared/Player/Controls/PlayerControlsLayout.swift @@ -45,11 +45,11 @@ enum PlayerControlsLayout: String, CaseIterable, Defaults.Serializable { var description: String { switch self { case .tvRegular: - return "TV" + return "TV".localized() case .veryLarge: - return "Very Large" + return "Very Large".localized() default: - return rawValue.capitalized + return rawValue.capitalized.localized() } } diff --git a/Shared/Player/VideoDetails.swift b/Shared/Player/VideoDetails.swift index ed78e520..4a03fa77 100644 --- a/Shared/Player/VideoDetails.swift +++ b/Shared/Player/VideoDetails.swift @@ -70,11 +70,26 @@ struct VideoDetails: View { ) HStack(spacing: 4) { - pageButton("Info", "info.circle", .info, !video.isNil) - pageButton("Chapters", "bookmark", .chapters, !(video?.chapters.isEmpty ?? true)) - pageButton("Comments", "text.bubble", .comments, !video.isNil) { comments.load() } - pageButton("Related", "rectangle.stack.fill", .related, !video.isNil) - pageButton("Queue", "list.number", .queue, !player.queue.isEmpty) + pageButton( + "Info".localized(), + "info.circle", .info, !video.isNil + ) + pageButton( + "Chapters".localized(), + "bookmark", .chapters, !(video?.chapters.isEmpty ?? true) + ) + pageButton( + "Comments".localized(), + "text.bubble", .comments, !video.isNil + ) { comments.load() } + pageButton( + "Related".localized(), + "rectangle.stack.fill", .related, !video.isNil + ) + pageButton( + "Queue".localized(), + "list.number", .queue, !player.queue.isEmpty + ) } .onChange(of: player.currentItem) { _ in page.update(.moveToFirst) diff --git a/Shared/Player/VideoPlayerView.swift b/Shared/Player/VideoPlayerView.swift index 19a60aab..5929be67 100644 --- a/Shared/Player/VideoPlayerView.swift +++ b/Shared/Player/VideoPlayerView.swift @@ -328,6 +328,7 @@ struct VideoPlayerView: View { if !fullScreenPlayer { VideoDetails(sidebarQueue: sidebarQueue, fullScreen: $fullScreenDetails) #if os(iOS) +// .zIndex(-1) .ignoresSafeArea(.all, edges: .bottom) #endif .background(colorScheme == .dark ? Color.black : Color.white) diff --git a/Shared/Playlists/PlaylistsView.swift b/Shared/Playlists/PlaylistsView.swift index ce56d2d8..173f1ba7 100644 --- a/Shared/Playlists/PlaylistsView.swift +++ b/Shared/Playlists/PlaylistsView.swift @@ -89,28 +89,29 @@ struct PlaylistsView: View { } .padding(.horizontal) }) { - SignInRequiredView(title: "Playlists") { - VStack { - #if os(tvOS) - toolbar - #endif - - if currentPlaylist != nil, items.isEmpty { - hintText("Playlist is empty\n\nTap and hold on a video and then tap \"Add to Playlist\"") - } else if model.all.isEmpty { - hintText("You have no playlists\n\nTap on \"New Playlist\" to create one") - } else { - Group { - #if os(tvOS) - HorizontalCells(items: items) - .padding(.top, 40) - Spacer() - #else - VerticalCells(items: items) - .environment(\.scrollViewBottomPadding, 70) - #endif + SignInRequiredView(title: "Playlists".localized()) { + ScrollView { + VStack { + #if os(tvOS) + toolbar + #endif + if currentPlaylist != nil, items.isEmpty { + hintText("Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"".localized()) + } else if model.all.isEmpty { + hintText("You have no playlists\n\nTap on \"New Playlist\" to create one".localized()) + } else { + Group { + #if os(tvOS) + HorizontalCells(items: items) + .padding(.top, 40) + Spacer() + #else + VerticalCells(items: items) + .environment(\.scrollViewBottomPadding, 70) + #endif + } + .environment(\.currentPlaylistID, currentPlaylist?.id) } - .environment(\.currentPlaylistID, currentPlaylist?.id) } } } diff --git a/Shared/Settings/AdvancedSettings.swift b/Shared/Settings/AdvancedSettings.swift index f8ca19a5..5e91b606 100644 --- a/Shared/Settings/AdvancedSettings.swift +++ b/Shared/Settings/AdvancedSettings.swift @@ -112,7 +112,7 @@ struct AdvancedSettings: View { } var manifestHeader: some View { - SettingsHeader(text: "Public Manifest") + SettingsHeader(text: "Public Manifest".localized()) } var showMPVPlaybackStatsToggle: some View { diff --git a/Shared/Settings/BrowsingSettings.swift b/Shared/Settings/BrowsingSettings.swift index 3f804b9e..9415f183 100644 --- a/Shared/Settings/BrowsingSettings.swift +++ b/Shared/Settings/BrowsingSettings.swift @@ -45,7 +45,7 @@ struct BrowsingSettings: View { } private var interfaceSettings: some View { - Section(header: SettingsHeader(text: "Interface")) { + Section(header: SettingsHeader(text: "Interface".localized())) { #if os(iOS) Toggle("Lock portrait mode", isOn: $lockPortraitWhenBrowsing) .onChange(of: lockPortraitWhenBrowsing) { lock in @@ -66,7 +66,7 @@ struct BrowsingSettings: View { } private var thumbnailsSettings: some View { - Section(header: SettingsHeader(text: "Thumbnails")) { + Section(header: SettingsHeader(text: "Thumbnails".localized())) { thumbnailsQualityPicker #if !os(tvOS) Toggle("Round corners", isOn: $roundedThumbnails) @@ -79,14 +79,14 @@ struct BrowsingSettings: View { private var thumbnailsQualityPicker: some View { Picker("Quality", selection: $thumbnailsQuality) { ForEach(ThumbnailsQuality.allCases, id: \.self) { quality in - Text(quality.rawValue.capitalized + " quality").tag(quality) + Text(quality.description) } } .modifier(SettingsPickerModifier()) } private var visibleSectionsSettings: some View { - Section(header: SettingsHeader(text: "Sections")) { + Section(header: SettingsHeader(text: "Sections".localized())) { #if os(macOS) let list = ForEach(VisibleSection.allCases, id: \.self) { section in VisibleSectionSelectionRow( diff --git a/Shared/Settings/Help.swift b/Shared/Settings/Help.swift index 20699e58..801d4fff 100644 --- a/Shared/Settings/Help.swift +++ b/Shared/Settings/Help.swift @@ -17,34 +17,34 @@ struct Help: View { ScrollView(.vertical, showsIndicators: false) { VStack(alignment: .leading, spacing: 0) { Section { - header("I am lost") + header("I am lost".localized()) Text("You can find information about using Yattee in the Wiki pages.") .padding(.bottom, 8) - helpItemLink("Wiki", url: Self.wikiURL, systemImage: "questionmark.circle") + helpItemLink("Wiki".localized(), url: Self.wikiURL, systemImage: "questionmark.circle") .padding(.bottom, 8) } Spacer() Section { - header("I want to ask a question") + header("I want to ask a question".localized()) Text("Discussions take place in Discord and Matrix. It's a good spot for general questions.") .padding(.bottom, 8) - helpItemLink("Discord Server", url: Self.discordURL, systemImage: "message") + helpItemLink("Discord Server".localized(), url: Self.discordURL, systemImage: "message") .padding(.bottom, 8) - helpItemLink("Matrix Channel", url: Self.matrixURL, systemImage: "message") + helpItemLink("Matrix Channel".localized(), url: Self.matrixURL, systemImage: "message") .padding(.bottom, 8) } Spacer() Section { - header("I found a bug /") - header("I have a feature request") + header("I found a bug /".localized()) + header("I have a feature request".localized()) Text("Bugs and great feature ideas can be sent to the GitHub issues tracker. ") Text("If you are reporting a bug, include all relevant details (especially: app\u{00a0}version, used device and system version, steps to reproduce).") @@ -52,8 +52,8 @@ struct Help: View { .padding(.bottom, 8) VStack(alignment: .leading, spacing: 8) { - helpItemLink("Issues Tracker", url: Self.issuesURL, systemImage: "ladybug") - helpItemLink("Milestones", url: Self.milestonesURL, systemImage: "list.star") + helpItemLink("Issues Tracker".localized(), url: Self.issuesURL, systemImage: "ladybug") + helpItemLink("Milestones".localized(), url: Self.milestonesURL, systemImage: "list.star") } .padding(.bottom, 8) } @@ -61,15 +61,14 @@ struct Help: View { Spacer() Section { - header("I like this app!") + header("I like this app!".localized()) - Text("That's nice to hear. It is fun to deliver apps other people want to use. " + - "You can consider donating to the project or help by contributing to new features development.") + Text("That's nice to hear. It is fun to deliver apps other people want to use. You can consider donating to the project or help by contributing to new features development.") .padding(.bottom, 8) VStack(alignment: .leading, spacing: 8) { - helpItemLink("Donations", url: Self.donationsURL, systemImage: "dollarsign.circle") - helpItemLink("Contributing", url: Self.contributingURL, systemImage: "hammer") + helpItemLink("Donations".localized(), url: Self.donationsURL, systemImage: "dollarsign.circle") + helpItemLink("Contributing".localized(), url: Self.contributingURL, systemImage: "hammer") } .padding(.bottom, 8) } diff --git a/Shared/Settings/HistorySettings.swift b/Shared/Settings/HistorySettings.swift index f69e19de..7990722b 100644 --- a/Shared/Settings/HistorySettings.swift +++ b/Shared/Settings/HistorySettings.swift @@ -39,7 +39,7 @@ struct HistorySettings: View { private var sections: some View { Group { #if os(tvOS) - Section(header: SettingsHeader(text: "History")) { + Section(header: SettingsHeader(text: "History".localized())) { Toggle("Save history of searches, channels and playlists", isOn: $saveRecents) Toggle("Save history of played videos", isOn: $saveHistory) Toggle("Show progress of watching on thumbnails", isOn: $showWatchingProgress) @@ -53,7 +53,7 @@ struct HistorySettings: View { watchedVideoBadgeColorPicker } #else - Section(header: SettingsHeader(text: "History")) { + Section(header: SettingsHeader(text: "History".localized())) { Toggle("Save history of searches, channels and playlists", isOn: $saveRecents) Toggle("Save history of played videos", isOn: $saveHistory) Toggle("Show progress of watching on thumbnails", isOn: $showWatchingProgress) @@ -61,7 +61,7 @@ struct HistorySettings: View { Toggle("Keep last played video in the queue after restart", isOn: $saveLastPlayed) } - Section(header: SettingsHeader(text: "Watched")) { + Section(header: SettingsHeader(text: "Watched".localized())) { watchedVideoPlayNowBehaviorPicker #if os(macOS) .padding(.top, 1) @@ -70,7 +70,7 @@ struct HistorySettings: View { resetWatchedStatusOnPlayingToggle } - Section(header: SettingsHeader(text: "Interface")) { + Section(header: SettingsHeader(text: "Interface".localized())) { watchedVideoStylePicker #if os(macOS) .padding(.top, 1) @@ -88,7 +88,7 @@ struct HistorySettings: View { } private var watchedThresholdPicker: some View { - Section(header: SettingsHeader(text: "Mark video as watched after playing", secondary: true)) { + Section(header: SettingsHeader(text: "Mark video as watched after playing".localized(), secondary: true)) { Picker("Mark video as watched after playing", selection: $watchedThreshold) { ForEach(Self.watchedThresholds, id: \.self) { threshold in Text("\(threshold)%").tag(threshold) @@ -100,7 +100,7 @@ struct HistorySettings: View { } private var watchedVideoStylePicker: some View { - Section(header: SettingsHeader(text: "Mark watched videos with", secondary: true)) { + Section(header: SettingsHeader(text: "Mark watched videos with".localized(), secondary: true)) { Picker("Mark watched videos with", selection: $watchedVideoStyle) { Text("Nothing").tag(WatchedVideoStyle.nothing) Text("Badge").tag(WatchedVideoStyle.badge) @@ -113,7 +113,7 @@ struct HistorySettings: View { } private var watchedVideoBadgeColorPicker: some View { - Section(header: SettingsHeader(text: "Badge color", secondary: true)) { + Section(header: SettingsHeader(text: "Badge color".localized(), secondary: true)) { Picker("Badge color", selection: $watchedVideoBadgeColor) { Text("Based on system color scheme").tag(WatchedVideoBadgeColor.colorSchemeBased) Text("Blue").tag(WatchedVideoBadgeColor.blue) @@ -127,7 +127,7 @@ struct HistorySettings: View { } private var watchedVideoPlayNowBehaviorPicker: some View { - Section(header: SettingsHeader(text: "When partially watched video is played", secondary: true)) { + Section(header: SettingsHeader(text: "When partially watched video is played".localized(), secondary: true)) { Picker("When partially watched video is played", selection: $watchedVideoPlayNowBehavior) { Text("Continue").tag(WatchedVideoPlayNowBehavior.continue) Text("Restart").tag(WatchedVideoPlayNowBehavior.restart) diff --git a/Shared/Settings/InstanceSettings.swift b/Shared/Settings/InstanceSettings.swift index 6419b8c8..1d9f6ded 100644 --- a/Shared/Settings/InstanceSettings.swift +++ b/Shared/Settings/InstanceSettings.swift @@ -11,7 +11,7 @@ struct InstanceSettings: View { var body: some View { List { - Section(header: Text("Accounts")) { + Section(header: Text("Accounts".localized())) { if instance.app.supportsAccounts { ForEach(InstancesModel.accounts(instance.id), id: \.self) { account in #if os(tvOS) @@ -61,7 +61,7 @@ struct InstanceSettings: View { } } if instance.app.hasFrontendURL { - Section(header: Text("Frontend URL")) { + Section(header: Text("Frontend URL".localized())) { TextField( "Frontend URL", text: $frontendURL diff --git a/Shared/Settings/LocationsSettings.swift b/Shared/Settings/LocationsSettings.swift index 77ebe818..c7633f13 100644 --- a/Shared/Settings/LocationsSettings.swift +++ b/Shared/Settings/LocationsSettings.swift @@ -41,7 +41,7 @@ struct LocationsSettings: View { } @ViewBuilder var settings: some View { - Section(header: SettingsHeader(text: "Public Locations"), footer: countryFooter) { + Section(header: SettingsHeader(text: "Public Locations".localized()), footer: countryFooter) { Picker("Country", selection: $countryOfPublicInstances) { Text("Don't use public locations").tag(String?.none) ForEach(countries, id: \.self) { country in @@ -65,7 +65,7 @@ struct LocationsSettings: View { .disabled(countryOfPublicInstances.isNil) } - Section(header: SettingsHeader(text: "Custom Locations")) { + Section(header: SettingsHeader(text: "Custom Locations".localized())) { #if os(macOS) InstancesSettings() .environmentObject(model) @@ -80,8 +80,8 @@ struct LocationsSettings: View { @ViewBuilder var countryFooter: some View { if let account = accounts.current { - let locationType = account.isPublic ? (account.country ?? "Unknown") : "Custom" - let description = account.isPublic ? account.url : account.instance?.description ?? "unknown" + let locationType = account.isPublic ? (account.country ?? "Unknown") : "Custom".localized() + let description = account.isPublic ? account.url : account.instance?.description ?? "unknown".localized() Text("Current: \(locationType)\n\(description)") .foregroundColor(.secondary) @@ -99,7 +99,7 @@ struct LocationsSettings: View { } } .onFailure { _ in - model.presentAlert(title: "Could not load locations manifest") + model.presentAlert(title: "Could not load locations manifest".localized()) } } diff --git a/Shared/Settings/PlayerSettings.swift b/Shared/Settings/PlayerSettings.swift index 73a10fa7..28972022 100644 --- a/Shared/Settings/PlayerSettings.swift +++ b/Shared/Settings/PlayerSettings.swift @@ -61,7 +61,7 @@ struct PlayerSettings: View { private var sections: some View { Group { - Section(header: SettingsHeader(text: "Playback")) { + Section(header: SettingsHeader(text: "Playback".localized())) { sourcePicker pauseOnHidingPlayerToggle #if !os(macOS) @@ -73,20 +73,20 @@ struct PlayerSettings: View { } #if !os(tvOS) - Section(header: SettingsHeader(text: "Controls"), footer: controlsLayoutFooter) { + Section(header: SettingsHeader(text: "Controls".localized()), footer: controlsLayoutFooter) { horizontalPlayerGestureEnabledToggle - SettingsHeader(text: "Seek gesture sensitivity", secondary: true) + SettingsHeader(text: "Seek gesture sensitivity".localized(), secondary: true) seekGestureSensitivityPicker - SettingsHeader(text: "Seek gesture speed", secondary: true) + SettingsHeader(text: "Seek gesture speed".localized(), secondary: true) seekGestureSpeedPicker - SettingsHeader(text: "Regular size", secondary: true) + SettingsHeader(text: "Regular size".localized(), secondary: true) playerControlsLayoutPicker - SettingsHeader(text: "Fullscreen size", secondary: true) + SettingsHeader(text: "Fullscreen size".localized(), secondary: true) fullScreenPlayerControlsLayoutPicker } #endif - Section(header: SettingsHeader(text: "Interface")) { + Section(header: SettingsHeader(text: "Interface".localized())) { #if os(iOS) if idiom == .pad { sidebarPicker @@ -103,7 +103,7 @@ struct PlayerSettings: View { } #if os(iOS) - Section(header: SettingsHeader(text: "Orientation")) { + Section(header: SettingsHeader(text: "Orientation".localized())) { if idiom == .pad { enterFullscreenInLandscapeToggle } @@ -111,7 +111,7 @@ struct PlayerSettings: View { } #endif - Section(header: SettingsHeader(text: "Picture in Picture")) { + Section(header: SettingsHeader(text: "Picture in Picture".localized())) { closePiPOnNavigationToggle closePiPOnOpeningPlayerToggle closePlayerOnOpeningPiPToggle @@ -124,7 +124,7 @@ struct PlayerSettings: View { private var sourcePicker: some View { Picker("Source", selection: $playerInstanceID) { - Text("Account Instance").tag(String?.none) + Text("Instance of current account").tag(String?.none) ForEach(instances) { instance in Text(instance.description).tag(Optional(instance.id)) @@ -136,15 +136,15 @@ struct PlayerSettings: View { private var systemControlsCommandsPicker: some View { func labelText(_ label: String) -> String { #if os(macOS) - "System controls show buttons for \(label)" + String(format: "System controls show buttons for %@".localized(), label) #else label #endif } return Picker("System controls buttons", selection: $systemControlsCommands) { - Text(labelText("10 seconds forwards/backwards")).tag(SystemControlsCommands.seek) - Text(labelText("Restart/Play next")).tag(SystemControlsCommands.restartAndAdvanceToNext) + Text(labelText("10 seconds forwards/backwards".localized())).tag(SystemControlsCommands.seek) + Text(labelText("Restart/Play next".localized())).tag(SystemControlsCommands.restartAndAdvanceToNext) } .onChange(of: systemControlsCommands) { _ in player.updateRemoteCommandCenter() diff --git a/Shared/Settings/QualitySettings.swift b/Shared/Settings/QualitySettings.swift index afe0d3f2..08ff73a6 100644 --- a/Shared/Settings/QualitySettings.swift +++ b/Shared/Settings/QualitySettings.swift @@ -68,7 +68,7 @@ struct QualitySettings: View { forceAVPlayerForLiveStreamsToggle } .disabled(qualityProfiles.isEmpty) - Section(header: SettingsHeader(text: "Profiles"), footer: profilesFooter) { + Section(header: SettingsHeader(text: "Profiles".localized()), footer: profilesFooter) { profilesList Button { diff --git a/Shared/Settings/SettingsView.swift b/Shared/Settings/SettingsView.swift index 1965e691..75d7ec4a 100644 --- a/Shared/Settings/SettingsView.swift +++ b/Shared/Settings/SettingsView.swift @@ -99,7 +99,7 @@ struct SettingsView: View { .tag(Tabs.help) } .padding(20) - .frame(width: 520, height: windowHeight) + .frame(width: 600, height: windowHeight) #else NavigationView { settingsList diff --git a/Shared/Settings/SponsorBlockSettings.swift b/Shared/Settings/SponsorBlockSettings.swift index 5c4c20da..7d5f1bc9 100644 --- a/Shared/Settings/SponsorBlockSettings.swift +++ b/Shared/Settings/SponsorBlockSettings.swift @@ -39,7 +39,7 @@ struct SponsorBlockSettings: View { #endif } - Section(header: SettingsHeader(text: "Categories to Skip"), footer: categoriesDetails) { + Section(header: SettingsHeader(text: "Categories to Skip".localized()), footer: categoriesDetails) { #if os(macOS) let list = ForEach(SponsorBlockAPI.categories, id: \.self) { category in MultiselectRow( diff --git a/Shared/Trending/TrendingCountry.swift b/Shared/Trending/TrendingCountry.swift index 318f6ed8..04e22873 100644 --- a/Shared/Trending/TrendingCountry.swift +++ b/Shared/Trending/TrendingCountry.swift @@ -1,7 +1,7 @@ import SwiftUI struct TrendingCountry: View { - static let prompt = "Country Name or Code" + static let prompt = "Country Name or Code".localized() @Binding var selectedCountry: Country @StateObject private var store = Store(Country.allCases) diff --git a/Shared/Videos/VideoBanner.swift b/Shared/Videos/VideoBanner.swift index 71e0b7d4..8b91292f 100644 --- a/Shared/Videos/VideoBanner.swift +++ b/Shared/Videos/VideoBanner.swift @@ -24,7 +24,7 @@ struct VideoBanner: View { #endif } VStack(alignment: .leading, spacing: 4) { - Text(video?.title ?? "Loading...") + Text(video?.title ?? "Loading...".localized()) .truncationMode(.middle) .lineLimit(2) .font(.headline) diff --git a/Shared/Views/ControlsBar.swift b/Shared/Views/ControlsBar.swift index f5b49b9a..337bb3a3 100644 --- a/Shared/Views/ControlsBar.swift +++ b/Shared/Views/ControlsBar.swift @@ -227,7 +227,8 @@ struct ControlsBar: View { } VStack(alignment: .leading, spacing: 0) { - Text(model.currentVideo?.title ?? "Not Playing") + let notPlaying = "Not Playing".localized() + Text(model.currentVideo?.title ?? notPlaying) .font(.system(size: 14)) .fontWeight(.semibold) .foregroundColor(model.currentVideo.isNil ? .secondary : .accentColor) diff --git a/Shared/Views/ShareButton.swift b/Shared/Views/ShareButton.swift index 3888220b..9f0884a6 100644 --- a/Shared/Views/ShareButton.swift +++ b/Shared/Views/ShareButton.swift @@ -89,13 +89,19 @@ struct ShareButton: View { } private func labelForShareURL(_ app: String, withTime: Bool = false) -> String { - let time = withTime ? "with time" : "" - - #if os(macOS) - return "Copy \(app) link \(time)" - #else - return "Share \(app) link \(time)" - #endif + if withTime { + #if os(macOS) + return String(format: "Copy %@ link with time".localized(), app) + #else + return String(format: "Share %@ link with time".localized(), app) + #endif + } else { + #if os(macOS) + return String(format: "Copy %@ link".localized(), app) + #else + return String(format: "Share %@ link".localized(), app) + #endif + } } } diff --git a/Shared/Views/SubscriptionsView.swift b/Shared/Views/SubscriptionsView.swift index e3fde703..6ca55cde 100644 --- a/Shared/Views/SubscriptionsView.swift +++ b/Shared/Views/SubscriptionsView.swift @@ -16,7 +16,7 @@ struct SubscriptionsView: View { var body: some View { BrowserPlayerControls { - SignInRequiredView(title: "Subscriptions") { + SignInRequiredView(title: "Subscriptions".localized()) { VerticalCells(items: videos) .onAppear { loadResources() diff --git a/Shared/Views/VideoContextMenuView.swift b/Shared/Views/VideoContextMenuView.swift index 18449428..6edac0ad 100644 --- a/Shared/Views/VideoContextMenuView.swift +++ b/Shared/Views/VideoContextMenuView.swift @@ -112,14 +112,15 @@ struct VideoContextMenuView: View { private var watchedAtString: String? { if watchingNow { - return "Watching now" + return "Watching now".localized() } if let watch = watch, let watchedAtString = watch.watchedAtString { if watchedAtString == "in 0 seconds" { - return "Just watched" + return "Just watched".localized() } - return "Watched \(watchedAtString)" + let localizedWatchedString = "Watched %@".localized() + return String(format: localizedWatchedString, watchedAtString) } return nil diff --git a/Shared/Views/WelcomeScreen.swift b/Shared/Views/WelcomeScreen.swift index f31bca69..4109f454 100644 --- a/Shared/Views/WelcomeScreen.swift +++ b/Shared/Views/WelcomeScreen.swift @@ -61,8 +61,8 @@ struct WelcomeScreen: View { .background(RoundedRectangle(cornerRadius: 4).foregroundColor(Color.accentColor)) .frame(maxWidth: .infinity) #endif - Text("This information will be processed only on your device and used to connect you to the server in the specified country.\n" + - "It can be changed later in settings. You can use your own locations too.") + Text("This information will be processed only on your device and used to connect you to the server in the specified country.".localized() + "\n" + + "It can be changed later in settings. You can use your own locations too.".localized()) .font(.caption) .foregroundColor(.secondary) } diff --git a/Shared/en.lproj/Localizable.strings b/Shared/en.lproj/Localizable.strings new file mode 100644 index 00000000..8a7617c6 --- /dev/null +++ b/Shared/en.lproj/Localizable.strings @@ -0,0 +1,976 @@ +/* No comment provided by engineer. */ +" subscribers" = " subscribers"; + +/* No comment provided by engineer. */ +"#" = "#"; + +/* No comment provided by engineer. */ +"%@" = "%@"; + +/* No comment provided by engineer. */ +"%@ %@" = "%@ %@"; + +/* No comment provided by engineer. */ +"%@ Channel" = "%@ Channel"; + +/* No comment provided by engineer. */ +"%@ Playlist" = "%@ Playlist"; + +/* No comment provided by engineer. */ +"%@ subscribers" = "%@ subscribers"; + +/* No comment provided by engineer. */ +"%lld" = "%lld"; + +/* No comment provided by engineer. */ +"%lld videos" = "%lld videos"; + +/* No comment provided by engineer. */ +"%lld%%" = "%lld%%"; + +/* No comment provided by engineer. */ +"1 century ago" = "1 century ago"; + +/* No comment provided by engineer. */ +"1,234M" = "1,234M"; + +/* No comment provided by engineer. */ +"10 seconds forwards/backwards" = "10 seconds forwards/backwards"; + +/* No comment provided by engineer. */ +"1234" = "1234"; + +/* No comment provided by engineer. */ +"a" = "a"; + +/* No comment provided by engineer. */ +"A" = "A"; + +/* No comment provided by engineer. */ +"Accounts" = "Accounts"; + +/* No comment provided by engineer. */ +"Accounts are not supported for the application of this instance" = "Accounts are not supported for the application of this instance"; + +/* No comment provided by engineer. */ +"Add Account" = "Add Account"; + +/* No comment provided by engineer. */ +"Add Account..." = "Add Account..."; + +/* No comment provided by engineer. */ +"Add Location" = "Add Location"; + +/* No comment provided by engineer. */ +"Add Location..." = "Add Location..."; + +/* No comment provided by engineer. */ +"Add profile..." = "Add profile..."; + +/* No comment provided by engineer. */ +"Add Quality Profile" = "Add Quality Profile"; + +/* No comment provided by engineer. */ +"Add to %@" = "Add to %@"; + +/* No comment provided by engineer. */ +"Add to Favorites" = "Add to Favorites"; + +/* No comment provided by engineer. */ +"Add to Playlist" = "Add to Playlist"; + +/* No comment provided by engineer. */ +"Add to Playlist..." = "Add to Playlist..."; + +/* No comment provided by engineer. */ +"Advanced" = "Advanced"; + +/* Trending category, section containing all kinds of videos */ +"All" = "All"; + +/* No comment provided by engineer. */ +"Always use AVPlayer for live videos" = "Always use AVPlayer for live videos"; + +/* No comment provided by engineer. */ +"Anonymous" = "Anonymous"; + +/* Video date filter in search + Video duration filter in search */ +"Any" = "Any"; + +/* No comment provided by engineer. */ +"Apply to all" = "Apply to all"; + +/* No comment provided by engineer. */ +"Are you sure you want to clear history of watched videos?" = "Are you sure you want to clear history of watched videos?"; + +/* No comment provided by engineer. */ +"Are you sure you want to clear search history?" = "Are you sure you want to clear search history?"; + +/* No comment provided by engineer. */ +"Are you sure you want to delete playlist?" = "Are you sure you want to delete playlist?"; + +/* No comment provided by engineer. */ +"Are you sure you want to restore default quality profiles?" = "Are you sure you want to restore default quality profiles?"; + +/* No comment provided by engineer. */ +"Are you sure you want to unsubscribe from %@?" = "Are you sure you want to unsubscribe from %@?"; + +/* No comment provided by engineer. */ +"Automatic" = "Automatic"; + +/* No comment provided by engineer. */ +"Autoplaying Next" = "Autoplaying Next"; + +/* No comment provided by engineer. */ +"Backend" = "Backend"; + +/* No comment provided by engineer. */ +"Badge" = "Badge"; + +/* No comment provided by engineer. */ +"Badge & Decreased opacity" = "Badge & Decreased opacity"; + +/* No comment provided by engineer. */ +"Badge color" = "Badge color"; + +/* No comment provided by engineer. */ +"Based on system color scheme" = "Based on system color scheme"; + +/* No comment provided by engineer. */ +"Battery" = "Battery"; + +/* No comment provided by engineer. */ +"Blue" = "Blue"; + +/* No comment provided by engineer. */ +"Browsing" = "Browsing"; + +/* No comment provided by engineer. */ +"Buffering stream..." = "Buffering stream..."; + +/* No comment provided by engineer. */ +"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "Bugs and great feature ideas can be sent to the GitHub issues tracker. "; + +/* No comment provided by engineer. */ +"Button" = "Button"; + +/* No comment provided by engineer. */ +"cache-pause-wait" = "cache-pause-wait"; + +/* No comment provided by engineer. */ +"cache-secs" = "cache-secs"; + +/* No comment provided by engineer. */ +"Cancel" = "Cancel"; + +/* No comment provided by engineer. */ +"Captions" = "Captions"; + +/* No comment provided by engineer. */ +"Categories to Skip" = "Categories to Skip"; + +/* No comment provided by engineer. */ +"Category" = "Category"; + +/* No comment provided by engineer. */ +"Cellular" = "Cellular"; + +/* No comment provided by engineer. */ +"Chapters" = "Chapters"; + +/* No comment provided by engineer. */ +"Charging" = "Charging"; + +/* No comment provided by engineer. */ +"Clear" = "Clear"; + +/* No comment provided by engineer. */ +"Clear All" = "Clear All"; + +/* No comment provided by engineer. */ +"Clear All Recents" = "Clear All Recents"; + +/* No comment provided by engineer. */ +"Clear History" = "Clear History"; + +/* No comment provided by engineer. */ +"Clear Search History" = "Clear Search History"; + +/* No comment provided by engineer. */ +"Clear Search History..." = "Clear Search History..."; + +/* No comment provided by engineer. */ +"Clear the queue" = "Clear the queue"; + +/* No comment provided by engineer. */ +"Close" = "Close"; + +/* No comment provided by engineer. */ +"Close PiP and open player when application enters foreground" = "Close PiP and open player when application enters foreground"; + +/* No comment provided by engineer. */ +"Close PiP when player is opened" = "Close PiP when player is opened"; + +/* No comment provided by engineer. */ +"Close PiP when starting playing other video" = "Close PiP when starting playing other video"; + +/* No comment provided by engineer. */ +"Close player when closing video" = "Close player when closing video"; + +/* No comment provided by engineer. */ +"Close player when starting PiP" = "Close player when starting PiP"; + +/* No comment provided by engineer. */ +"Close Video" = "Close Video"; + +/* No comment provided by engineer. */ +"Close video after playing last in the queue" = "Close video after playing last in the queue"; + +/* No comment provided by engineer. */ +"Comments" = "Comments"; + +/* No comment provided by engineer. */ +"Connected successfully (%@)" = "Connected successfully (%@)"; + +/* No comment provided by engineer. */ +"Connection failed" = "Connection failed"; + +/* No comment provided by engineer. */ +"Contact" = "Contact"; + +/* No comment provided by engineer. */ +"Continue" = "Continue"; + +/* No comment provided by engineer. */ +"Continue from %@" = "Continue from %@"; + +/* No comment provided by engineer. */ +"Contributing" = "Contributing"; + +/* No comment provided by engineer. */ +"Controls" = "Controls"; + +/* No comment provided by engineer. */ +"Copy %@ link" = "Copy %@ link"; + +/* No comment provided by engineer. */ +"Copy %@ link with time" = "Copy %@ link with time"; + +/* No comment provided by engineer. */ +"Could not load locations manifest" = "Could not load locations manifest"; + +/* No comment provided by engineer. */ +"Country" = "Country"; + +/* No comment provided by engineer. */ +"Country Name or Code" = "Country Name or Code"; + +/* No comment provided by engineer. */ +"Create Playlist" = "Create Playlist"; + +/* No comment provided by engineer. */ +"Current: %@\n%@" = "Current: %@\n%@"; + +/* Locations settings, custom instance is selected as current */ +"Custom" = "Custom"; + +/* No comment provided by engineer. */ +"Custom Locations" = "Custom Locations"; + +/* Video sort order in search */ +"Date" = "Date"; + +/* No comment provided by engineer. */ +"Decrease rate" = "Decrease rate"; + +/* No comment provided by engineer. */ +"Decreased opacity" = "Decreased opacity"; + +/* No comment provided by engineer. */ +"Delete" = "Delete"; + +/* No comment provided by engineer. */ +"Disabled" = "Disabled"; + +/* No comment provided by engineer. */ +"Discord Server" = "Discord Server"; + +/* No comment provided by engineer. */ +"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "Discussions take place in Discord and Matrix. It's a good spot for general questions."; + +/* No comment provided by engineer. */ +"Don't use public locations" = "Don't use public locations"; + +/* No comment provided by engineer. */ +"Donations" = "Donations"; + +/* No comment provided by engineer. */ +"Done" = "Done"; + +/* No comment provided by engineer. */ +"Duration" = "Duration"; + +/* No comment provided by engineer. */ +"Edit" = "Edit"; + +/* No comment provided by engineer. */ +"Edit Playlist" = "Edit Playlist"; + +/* No comment provided by engineer. */ +"Edit Quality Profile" = "Edit Quality Profile"; + +/* No comment provided by engineer. */ +"Edit..." = "Edit..."; + +/* No comment provided by engineer. */ +"Enable logging" = "Enable logging"; + +/* No comment provided by engineer. */ +"Enable Return YouTube Dislike" = "Enable Return YouTube Dislike"; + +/* No comment provided by engineer. */ +"Enter fullscreen in landscape" = "Enter fullscreen in landscape"; + +/* No comment provided by engineer. */ +"Error" = "Error"; + +/* No comment provided by engineer. */ +"Error when accessing playlist" = "Error when accessing playlist"; + +/* No comment provided by engineer. */ +"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)."; + +/* No comment provided by engineer. */ +"Favorites" = "Favorites"; + +/* No comment provided by engineer. */ +"Filter" = "Filter"; + +/* No comment provided by engineer. */ +"Filter: active" = "Filter: active"; + +/* No comment provided by engineer. */ +"Find Other" = "Find Other"; + +/* No comment provided by engineer. */ +"Finding something to play..." = "Finding something to play..."; + +/* No comment provided by engineer. */ +"For videos which feature music as the primary content." = "For videos which feature music as the primary content."; + +/* No comment provided by engineer. */ +"Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)." = "Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)."; + +/* No comment provided by engineer. */ +"Frontend URL" = "Frontend URL"; + +/* No comment provided by engineer. */ +"Fullscreen size" = "Fullscreen size"; + +/* No comment provided by engineer. */ +"Fullscreen Size" = "Fullscreen Size"; + +/* No comment provided by engineer. */ +"Gaming" = "Gaming"; + +/* No comment provided by engineer. */ +"Help" = "Help"; + +/* No comment provided by engineer. */ +"Hide sidebar" = "Hide sidebar"; + +/* No comment provided by engineer. */ +"High" = "High"; + +/* No comment provided by engineer. */ +"Highest" = "Highest"; + +/* No comment provided by engineer. */ +"Highest quality" = "Highest quality"; + +/* No comment provided by engineer. */ +"History" = "History"; + +/* No comment provided by engineer. */ +"Honor orientation lock" = "Honor orientation lock"; + +/* Video date filter in search */ +"Hour" = "Hour"; + +/* No comment provided by engineer. */ +"I am lost" = "I am lost"; + +/* No comment provided by engineer. */ +"I found a bug /" = "I found a bug /"; + +/* No comment provided by engineer. */ +"I have a feature request" = "I have a feature request"; + +/* No comment provided by engineer. */ +"I like this app!" = "I like this app!"; + +/* No comment provided by engineer. */ +"I want to ask a question" = "I want to ask a question"; + +/* No comment provided by engineer. */ +"If you are interested what's coming in future updates, you can track project Milestones." = "If you are interested what's coming in future updates, you can track project Milestones."; + +/* No comment provided by engineer. */ +"If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)." = "If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)."; + +/* No comment provided by engineer. */ +"Increase rate" = "Increase rate"; + +/* No comment provided by engineer. */ +"Info" = "Info"; + +/* No comment provided by engineer. */ +"Instance of current account" = "Instance of current account"; + +/* SponsorBlock category name */ +"Interaction" = "Interaction"; + +/* No comment provided by engineer. */ +"Interface" = "Interface"; + +/* SponsorBlock category name */ +"Intro" = "Intro"; + +/* No comment provided by engineer. */ +"Issues Tracker" = "Issues Tracker"; + +/* Selected video has just finished playing */ +"Just watched" = "Just watched"; + +/* Player controls layout size */ +"Large" = "Large"; + +/* No comment provided by engineer. */ +"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "Large layout is not suitable for all devices and using it may cause controls not to fit on the screen."; + +/* No comment provided by engineer. */ +"LIVE" = "LIVE"; + +/* Loading stream OSD */ +"Loading streams..." = "Loading streams..."; + +/* No comment provided by engineer. */ +"Loading..." = "Loading..."; + +/* No comment provided by engineer. */ +"Locations" = "Locations"; + +/* No comment provided by engineer. */ +"Lock portrait mode" = "Lock portrait mode"; + +/* Video duration filter in search */ +"Long" = "Long"; + +/* No comment provided by engineer. */ +"Low" = "Low"; + +/* No comment provided by engineer. */ +"Low quality" = "Low quality"; + +/* No comment provided by engineer. */ +"Lowest" = "Lowest"; + +/* No comment provided by engineer. */ +"Mark as watched" = "Mark as watched"; + +/* No comment provided by engineer. */ +"Mark video as watched after playing" = "Mark video as watched after playing"; + +/* No comment provided by engineer. */ +"Mark watched videos with" = "Mark watched videos with"; + +/* No comment provided by engineer. */ +"Matrix Channel" = "Matrix Channel"; + +/* No comment provided by engineer. */ +"Matrix Chat" = "Matrix Chat"; + +/* Player controls layout size */ +"Medium" = "Medium"; + +/* No comment provided by engineer. */ +"Medium quality" = "Medium quality"; + +/* No comment provided by engineer. */ +"Milestones" = "Milestones"; + +/* Video date filter in search */ +"Month" = "Month"; + +/* No comment provided by engineer. */ +"More info can be found in:" = "More info can be found in:"; + +/* No comment provided by engineer. */ +"Movies" = "Movies"; + +/* No comment provided by engineer. */ +"MPV Documentation" = "MPV Documentation"; + +/* No comment provided by engineer. */ +"Music" = "Music"; + +/* No comment provided by engineer. */ +"Name" = "Name"; + +/* No comment provided by engineer. */ +"New Playlist" = "New Playlist"; + +/* No comment provided by engineer. */ +"Next" = "Next"; + +/* No comment provided by engineer. */ +"No description" = "No description"; + +/* No comment provided by engineer. */ +"No Playlists" = "No Playlists"; + +/* No comment provided by engineer. */ +"No results" = "No results"; + +/* No comment provided by engineer. */ +"Normal" = "Normal"; + +/* No comment provided by engineer. */ +"Not available" = "Not available"; + +/* No comment provided by engineer. */ +"Not Playing" = "Not Playing"; + +/* No comment provided by engineer. */ +"Nothing" = "Nothing"; + +/* SponsorBlock category name */ +"Offtopic in Music Videos" = "Offtopic in Music Videos"; + +/* No comment provided by engineer. */ +"Only when signed in" = "Only when signed in"; + +/* No comment provided by engineer. */ +"Open \"Playlists\" tab to create new one" = "Open \"Playlists\" tab to create new one"; + +/* No comment provided by engineer. */ +"Open Settings" = "Open Settings"; + +/* Loading stream OSD */ +"Opening %@ stream..." = "Opening %@ stream..."; + +/* No comment provided by engineer. */ +"Opening audio stream..." = "Opening audio stream..."; + +/* No comment provided by engineer. */ +"Orientation" = "Orientation"; + +/* SponsorBlock category name */ +"Outro" = "Outro"; + +/* No comment provided by engineer. */ +"Part of a video promoting a product or service not directly related to the creator. The creator will receive payment or compensation in the form of money or free products." = "Part of a video promoting a product or service not directly related to the creator. The creator will receive payment or compensation in the form of money or free products."; + +/* No comment provided by engineer. */ +"Password" = "Password"; + +/* No comment provided by engineer. */ +"Pause" = "Pause"; + +/* No comment provided by engineer. */ +"Pause when entering background" = "Pause when entering background"; + +/* No comment provided by engineer. */ +"Pause when player is closed" = "Pause when player is closed"; + +/* No comment provided by engineer. */ +"Picture in Picture" = "Picture in Picture"; + +/* No comment provided by engineer. */ +"Play" = "Play"; + +/* No comment provided by engineer. */ +"Play All" = "Play All"; + +/* No comment provided by engineer. */ +"Play in PiP" = "Play in PiP"; + +/* No comment provided by engineer. */ +"Play Last" = "Play Last"; + +/* No comment provided by engineer. */ +"Play Music" = "Play Music"; + +/* No comment provided by engineer. */ +"Play Next" = "Play Next"; + +/* No comment provided by engineer. */ +"Play Now" = "Play Now"; + +/* No comment provided by engineer. */ +"Playback" = "Playback"; + +/* No comment provided by engineer. */ +"Player" = "Player"; + +/* No comment provided by engineer. */ +"Playlist" = "Playlist"; + +/* No comment provided by engineer. */ +"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Playlist \"%@\" will be deleted.\nIt cannot be reverted."; + +/* No comment provided by engineer. */ +"Playlists" = "Playlists"; + +/* No comment provided by engineer. */ +"Popular" = "Popular"; + +/* No comment provided by engineer. */ +"Preferred Formats" = "Preferred Formats"; + +/* No comment provided by engineer. */ +"Profiles" = "Profiles"; + +/* No comment provided by engineer. */ +"Promoting a product or service that is directly related to the creator themselves. This usually includes merchandise or promotion of monetized platforms." = "Promoting a product or service that is directly related to the creator themselves. This usually includes merchandise or promotion of monetized platforms."; + +/* No comment provided by engineer. */ +"Proxy videos" = "Proxy videos"; + +/* No comment provided by engineer. */ +"Public Locations" = "Public Locations"; + +/* No comment provided by engineer. */ +"Public Manifest" = "Public Manifest"; + +/* No comment provided by engineer. */ +"Quality" = "Quality"; + +/* No comment provided by engineer. */ +"Quality Profile" = "Quality Profile"; + +/* No comment provided by engineer. */ +"Queue" = "Queue"; + +/* No comment provided by engineer. */ +"Queue is empty" = "Queue is empty"; + +/* No comment provided by engineer. */ +"Rate" = "Rate"; + +/* Video sort order in search */ +"Rating" = "Rating"; + +/* No comment provided by engineer. */ +"Recents" = "Recents"; + +/* No comment provided by engineer. */ +"Red" = "Red"; + +/* No comment provided by engineer. */ +"Refresh" = "Refresh"; + +/* No comment provided by engineer. */ +"Regular size" = "Regular size"; + +/* No comment provided by engineer. */ +"Regular Size" = "Regular Size"; + +/* No comment provided by engineer. */ +"Related" = "Related"; + +/* Video sort order in search */ +"Relevance" = "Relevance"; + +/* No comment provided by engineer. */ +"Remove" = "Remove"; + +/* No comment provided by engineer. */ +"Remove from Favorites" = "Remove from Favorites"; + +/* No comment provided by engineer. */ +"Remove from history" = "Remove from history"; + +/* No comment provided by engineer. */ +"Remove from Playlist" = "Remove from Playlist"; + +/* No comment provided by engineer. */ +"Remove from the queue" = "Remove from the queue"; + +/* No comment provided by engineer. */ +"Replies" = "Replies"; + +/* No comment provided by engineer. */ +"Reset" = "Reset"; + +/* No comment provided by engineer. */ +"Reset search filters" = "Reset search filters"; + +/* No comment provided by engineer. */ +"Reset watched status when playing again" = "Reset watched status when playing again"; + +/* No comment provided by engineer. */ +"Resolution" = "Resolution"; + +/* No comment provided by engineer. */ +"Restart" = "Restart"; + +/* No comment provided by engineer. */ +"Restart the app to apply the settings above." = "Restart the app to apply the settings above."; + +/* No comment provided by engineer. */ +"Restart/Play next" = "Restart/Play next"; + +/* No comment provided by engineer. */ +"Restore default profiles..." = "Restore default profiles..."; + +/* No comment provided by engineer. */ +"Rotate to portrait when exiting fullscreen" = "Rotate to portrait when exiting fullscreen"; + +/* No comment provided by engineer. */ +"Round corners" = "Round corners"; + +/* No comment provided by engineer. */ +"Save" = "Save"; + +/* No comment provided by engineer. */ +"Save history of played videos" = "Save history of played videos"; + +/* No comment provided by engineer. */ +"Save history of searches, channels and playlists" = "Save history of searches, channels and playlists"; + +/* No comment provided by engineer. */ +"Search" = "Search"; + +/* No comment provided by engineer. */ +"Search history is empty" = "Search history is empty"; + +/* No comment provided by engineer. */ +"Search..." = "Search..."; + +/* No comment provided by engineer. */ +"Sections" = "Sections"; + +/* No comment provided by engineer. */ +"Seek gesture sensitivity" = "Seek gesture sensitivity"; + +/* No comment provided by engineer. */ +"Seek gesture speed" = "Seek gesture speed"; + +/* No comment provided by engineer. */ +"Seek with horizontal swipe on video" = "Seek with horizontal swipe on video"; + +/* No comment provided by engineer. */ +"Segments typically found at the start of a video that include an animation, still frame or clip which are also seen in other videos by the same creator." = "Segments typically found at the start of a video that include an animation, still frame or clip which are also seen in other videos by the same creator."; + +/* No comment provided by engineer. */ +"Select location closest to you:" = "Select location closest to you:"; + +/* SponsorBlock category name */ +"Self-promotion" = "Self-promotion"; + +/* No comment provided by engineer. */ +"Settings" = "Settings"; + +/* No comment provided by engineer. */ +"Share %@ link" = "Share %@ link"; + +/* No comment provided by engineer. */ +"Share %@ link with time" = "Share %@ link with time"; + +/* No comment provided by engineer. */ +"Share..." = "Share..."; + +/* Video duration filter in search */ +"Short" = "Short"; + +/* No comment provided by engineer. */ +"Show account username" = "Show account username"; + +/* No comment provided by engineer. */ +"Show anonymous accounts" = "Show anonymous accounts"; + +/* No comment provided by engineer. */ +"Show channel name" = "Show channel name"; + +/* No comment provided by engineer. */ +"Show history" = "Show history"; + +/* No comment provided by engineer. */ +"Show keywords" = "Show keywords"; + +/* No comment provided by engineer. */ +"Show playback statistics" = "Show playback statistics"; + +/* No comment provided by engineer. */ +"Show progress of watching on thumbnails" = "Show progress of watching on thumbnails"; + +/* No comment provided by engineer. */ +"Show sidebar when space permits" = "Show sidebar when space permits"; + +/* No comment provided by engineer. */ +"Show video length" = "Show video length"; + +/* No comment provided by engineer. */ +"Shuffle" = "Shuffle"; + +/* No comment provided by engineer. */ +"Shuffle All" = "Shuffle All"; + +/* No comment provided by engineer. */ +"Sidebar" = "Sidebar"; + +/* No comment provided by engineer. */ +"Sign In Required" = "Sign In Required"; + +/* Player controls layout size */ +"Small" = "Small"; + +/* Player controls layout size */ +"Smaller" = "Smaller"; + +/* No comment provided by engineer. */ +"Sort" = "Sort"; + +/* No comment provided by engineer. */ +"Sort: %@" = "Sort: %@"; + +/* No comment provided by engineer. */ +"Source" = "Source"; + +/* SponsorBlock category name */ +"Sponsor" = "Sponsor"; + +/* No comment provided by engineer. */ +"SponsorBlock" = "SponsorBlock"; + +/* No comment provided by engineer. */ +"SponsorBlock API Instance" = "SponsorBlock API Instance"; + +/* No comment provided by engineer. */ +"Subscribe" = "Subscribe"; + +/* Subscriptions title */ +"Subscriptions" = "Subscriptions"; + +/* No comment provided by engineer. */ +"Switch to other public location" = "Switch to other public location"; + +/* No comment provided by engineer. */ +"Switch to public locations" = "Switch to public locations"; + +/* No comment provided by engineer. */ +"System controls buttons" = "System controls buttons"; + +/* No comment provided by engineer. */ +"System controls show buttons for %@" = "System controls show buttons for %@"; + +/* No comment provided by engineer. */ +"That's nice to hear. It is fun to deliver apps other people want to use. You can consider donating to the project or help by contributing to new features development." = "That's nice to hear. It is fun to deliver apps other people want to use. You can consider donating to the project or help by contributing to new features development."; + +/* No comment provided by engineer. */ +"This cannot be reverted" = "This cannot be reverted"; + +/* No comment provided by engineer. */ +"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "This cannot be reverted. You might need to switch between views or restart the app to see changes."; + +/* No comment provided by engineer. */ +"This information will be processed only on your device and used to connect you to the server in the specified country." = "This information will be processed only on your device and used to connect you to the server in the specified country."; + +/* No comment provided by engineer. */ +"This will remove all your custom profiles and return their default values. This cannot be reverted." = "This will remove all your custom profiles and return their default values. This cannot be reverted."; + +/* No comment provided by engineer. */ +"Thumbnails" = "Thumbnails"; + +/* Video date filter in search */ +"Today" = "Today"; + +/* No comment provided by engineer. */ +"Trending" = "Trending"; + +/* Player controls layout size for TV */ +"TV" = "TV"; + +/* No comment provided by engineer. */ +"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "Typically near or at the end of the video when the credits pop up and/or endcards are shown."; + +/* No comment provided by engineer. */ +"unknown" = "unknown"; + +/* No comment provided by engineer. */ +"Unsubscribe" = "Unsubscribe"; + +/* No comment provided by engineer. */ +"Upload date" = "Upload date"; + +/* No comment provided by engineer. */ +"URL" = "URL"; + +/* No comment provided by engineer. */ +"Used to create links from videos, channels and playlists" = "Used to create links from videos, channels and playlists"; + +/* No comment provided by engineer. */ +"Username" = "Username"; + +/* Player controls layout size */ +"Very Large" = "Very Large"; + +/* No comment provided by engineer. */ +"Videos" = "Videos"; + +/* Video sort order in search */ +"Views" = "Views"; + +/* No comment provided by engineer. */ +"Watched" = "Watched"; + +/* Selected video was played on given date */ +"Watched %@" = "Watched %@"; + +/* Selected video is being played */ +"Watching now" = "Watching now"; + +/* Video date filter in search */ +"Week" = "Week"; + +/* No comment provided by engineer. */ +"Welcome" = "Welcome"; + +/* No comment provided by engineer. */ +"When partially watched video is played" = "When partially watched video is played"; + +/* No comment provided by engineer. */ +"Wi-Fi" = "Wi-Fi"; + +/* No comment provided by engineer. */ +"Wiki" = "Wiki"; + +/* No comment provided by engineer. */ +"Yattee" = "Yattee"; + +/* No comment provided by engineer. */ +"Yattee %@ (build %@)" = "Yattee %@ (build %@)"; + +/* Video date filter in search */ +"Year" = "Year"; + +/* No comment provided by engineer. */ +"You can find information about using Yattee in the Wiki pages." = "You can find information about using Yattee in the Wiki pages."; + +/* No comment provided by engineer. */ +"You can use automatic profile selection based on current device status or switch it in video playback settings controls." = "You can use automatic profile selection based on current device status or switch it in video playback settings controls."; + +/* No comment provided by engineer. */ +"You have no Playlists" = "You have no Playlists"; + +/* No comment provided by engineer. */ +"You have no playlists\n\nTap on \"New Playlist\" to create one" = "You have no playlists\n\nTap on \"New Playlist\" to create one"; + +/* No comment provided by engineer. */ +"You need to create an instance and accounts\nto access %@ section" = "You need to create an instance and accounts\nto access %@ section"; + +/* No comment provided by engineer. */ +"You need to select an account\nto access %@ section" = "You need to select an account\nto access %@ section"; + diff --git a/Shared/pl.lproj/Localizable.strings b/Shared/pl.lproj/Localizable.strings new file mode 100644 index 00000000..c5b80f38 --- /dev/null +++ b/Shared/pl.lproj/Localizable.strings @@ -0,0 +1,976 @@ +/* No comment provided by engineer. */ +" subscribers" = " subskrybentów"; + +/* No comment provided by engineer. */ +"#" = "#"; + +/* No comment provided by engineer. */ +"%@" = "%@"; + +/* No comment provided by engineer. */ +"%@ %@" = "%@ %@"; + +/* No comment provided by engineer. */ +"%@ Channel" = "Kanał %@"; + +/* No comment provided by engineer. */ +"%@ Playlist" = "Playlista %@"; + +/* No comment provided by engineer. */ +"%@ subscribers" = "%@ subskrybentów"; + +/* No comment provided by engineer. */ +"%lld" = "%lld"; + +/* No comment provided by engineer. */ +"%lld videos" = "%lld wideo"; + +/* No comment provided by engineer. */ +"%lld%%" = "%lld%%"; + +/* No comment provided by engineer. */ +"1 century ago" = "Dawno temu"; + +/* No comment provided by engineer. */ +"1,234M" = "1,234M"; + +/* No comment provided by engineer. */ +"10 seconds forwards/backwards" = "Przewijanie o 10 sekund"; + +/* No comment provided by engineer. */ +"1234" = "1234"; + +/* No comment provided by engineer. */ +"a" = "a"; + +/* No comment provided by engineer. */ +"A" = "A"; + +/* No comment provided by engineer. */ +"Accounts" = "Konta"; + +/* No comment provided by engineer. */ +"Accounts are not supported for the application of this instance" = "Konta nie są obsługiwane dla tej instancji"; + +/* No comment provided by engineer. */ +"Add Account" = "Dodaj konto"; + +/* No comment provided by engineer. */ +"Add Account..." = "Dodaj konto…"; + +/* No comment provided by engineer. */ +"Add Location" = "Dodaj lokalizację"; + +/* No comment provided by engineer. */ +"Add Location..." = "Dodaj lokalizację…"; + +/* No comment provided by engineer. */ +"Add profile..." = "Dodaj profil…"; + +/* No comment provided by engineer. */ +"Add Quality Profile" = "Dodaj profil jakości"; + +/* No comment provided by engineer. */ +"Add to %@" = "Dodaj do %@"; + +/* No comment provided by engineer. */ +"Add to Favorites" = "Dodaj do ulubionych"; + +/* No comment provided by engineer. */ +"Add to Playlist" = "Dodaj do playlisty"; + +/* No comment provided by engineer. */ +"Add to Playlist..." = "Dodaj do playlisty..."; + +/* No comment provided by engineer. */ +"Advanced" = "Zaawansowane"; + +/* Trending category, section containing all kinds of videos */ +"All" = "Wszystkie"; + +/* No comment provided by engineer. */ +"Always use AVPlayer for live videos" = "Zawsze używaj AVPlayera z filmami na żywo"; + +/* No comment provided by engineer. */ +"Anonymous" = "Anonim"; + +/* Video date filter in search + Video duration filter in search */ +"Any" = "Dowolna"; + +/* No comment provided by engineer. */ +"Apply to all" = "Zastosuj do wszystkich"; + +/* No comment provided by engineer. */ +"Are you sure you want to clear history of watched videos?" = "Czy na pewno usunąć historię oglądania filmów?"; + +/* No comment provided by engineer. */ +"Are you sure you want to clear search history?" = "Czy na pewno usunąć historię wyszukiwania?"; + +/* No comment provided by engineer. */ +"Are you sure you want to delete playlist?" = "Czy na pewno usunąć playlistę?"; + +/* No comment provided by engineer. */ +"Are you sure you want to restore default quality profiles?" = "Czy na pewno przywrócić domyślne profile jakości?"; + +/* No comment provided by engineer. */ +"Are you sure you want to unsubscribe from %@?" = "Czy na pewno chcesz przestać subskrybować kanał %@?"; + +/* No comment provided by engineer. */ +"Automatic" = "Automatyczny"; + +/* No comment provided by engineer. */ +"Autoplaying Next" = "Wybrany do kolejki"; + +/* No comment provided by engineer. */ +"Backend" = "Silnik"; + +/* No comment provided by engineer. */ +"Badge" = "Znaczek"; + +/* No comment provided by engineer. */ +"Badge & Decreased opacity" = "Znaczek i przezroczystość"; + +/* No comment provided by engineer. */ +"Badge color" = "Kolor znaczka"; + +/* No comment provided by engineer. */ +"Based on system color scheme" = "Schemat kolorów systemu"; + +/* No comment provided by engineer. */ +"Battery" = "Bateria"; + +/* No comment provided by engineer. */ +"Blue" = "Niebieski"; + +/* No comment provided by engineer. */ +"Browsing" = "Przeglądanie"; + +/* No comment provided by engineer. */ +"Buffering stream..." = "Buforowanie strumienia…"; + +/* No comment provided by engineer. */ +"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "Błędy i wspaniałe pomysły na nowe funkcje wyślij na GitHub Issues "; + +/* No comment provided by engineer. */ +"Button" = "Przycisk"; + +/* No comment provided by engineer. */ +"cache-pause-wait" = "cache-pause-wait"; + +/* No comment provided by engineer. */ +"cache-secs" = "cache-secs"; + +/* No comment provided by engineer. */ +"Cancel" = "Anuluj"; + +/* No comment provided by engineer. */ +"Captions" = "Napisy"; + +/* No comment provided by engineer. */ +"Categories to Skip" = "Kategorie do pomijania"; + +/* No comment provided by engineer. */ +"Category" = "Kategoria"; + +/* No comment provided by engineer. */ +"Cellular" = "Sieć komórkowa"; + +/* No comment provided by engineer. */ +"Chapters" = "Rozdziały"; + +/* No comment provided by engineer. */ +"Charging" = "Ładowanie"; + +/* No comment provided by engineer. */ +"Clear" = "Wyczyść"; + +/* No comment provided by engineer. */ +"Clear All" = "Wyczyść wszystko"; + +/* No comment provided by engineer. */ +"Clear All Recents" = "Wyczyść ostatnie"; + +/* No comment provided by engineer. */ +"Clear History" = "Wyczyść historię"; + +/* No comment provided by engineer. */ +"Clear Search History" = "Wyczyść historię wyszukiwania"; + +/* No comment provided by engineer. */ +"Clear Search History..." = "Wyczyść historię wyszukiwania..."; + +/* No comment provided by engineer. */ +"Clear the queue" = "Wyczyść kolejkę"; + +/* No comment provided by engineer. */ +"Close" = "Zamknij"; + +/* No comment provided by engineer. */ +"Close PiP and open player when application enters foreground" = "Zamknij PiP i otwórz odtwarzacz przy wejściu na pierwszy plan"; + +/* No comment provided by engineer. */ +"Close PiP when player is opened" = "Zamknij PiP przy otwarciu odtwarzacza"; + +/* No comment provided by engineer. */ +"Close PiP when starting playing other video" = "Zamknij PiP przy rozpoczęciu odtwarzania innego filmu"; + +/* No comment provided by engineer. */ +"Close player when closing video" = "Zamknij odtwarzacz przy zamknięciu wideo"; + +/* No comment provided by engineer. */ +"Close player when starting PiP" = "Zamknij odtwarzacz przy uruchomieniu PiP"; + +/* No comment provided by engineer. */ +"Close Video" = "Zamknij wideo"; + +/* No comment provided by engineer. */ +"Close video after playing last in the queue" = "Zamknij wideo po odtworzeniu ostatniego w kolejce"; + +/* No comment provided by engineer. */ +"Comments" = "Komentarze"; + +/* No comment provided by engineer. */ +"Connected successfully (%@)" = "Połączono (%@)"; + +/* No comment provided by engineer. */ +"Connection failed" = "Błąd połączenia"; + +/* No comment provided by engineer. */ +"Contact" = "Kontakt"; + +/* No comment provided by engineer. */ +"Continue" = "Kontynuuj"; + +/* No comment provided by engineer. */ +"Continue from %@" = "Kontynuuj od %@"; + +/* No comment provided by engineer. */ +"Contributing" = "Współpraca nad rozwojem"; + +/* No comment provided by engineer. */ +"Controls" = "Kontrolki"; + +/* No comment provided by engineer. */ +"Copy %@ link" = "Kopiuj link do %@"; + +/* No comment provided by engineer. */ +"Copy %@ link with time" = "Kopiuj link do %@ wraz z czasem"; + +/* No comment provided by engineer. */ +"Could not load locations manifest" = "Nie można wczytać publicznej listy instancji"; + +/* No comment provided by engineer. */ +"Country" = "Kraj"; + +/* No comment provided by engineer. */ +"Country Name or Code" = "Nazwa kraju lub kod"; + +/* No comment provided by engineer. */ +"Create Playlist" = "Dodaj playlistę"; + +/* No comment provided by engineer. */ +"Current: %@\n%@" = "Aktualnie: %@\n%@"; + +/* Locations settings, custom instance is selected as current */ +"Custom" = "Własna"; + +/* No comment provided by engineer. */ +"Custom Locations" = "Własne lokalizacje"; + +/* Video sort order in search */ +"Date" = "Data"; + +/* No comment provided by engineer. */ +"Decrease rate" = "Zmniejsz prędkość odtwarzania"; + +/* No comment provided by engineer. */ +"Decreased opacity" = "Zwiększona przezroczystość"; + +/* No comment provided by engineer. */ +"Delete" = "Usuń"; + +/* No comment provided by engineer. */ +"Disabled" = "Wyłączone"; + +/* No comment provided by engineer. */ +"Discord Server" = "Serwer Discorda"; + +/* No comment provided by engineer. */ +"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "Dysktujemy na Discordzie i Matrixie. To dobre miejsca na ogólne pytania."; + +/* No comment provided by engineer. */ +"Don't use public locations" = "Nie używaj publicznych lokalizacji"; + +/* No comment provided by engineer. */ +"Donations" = "Wsparcie"; + +/* No comment provided by engineer. */ +"Done" = "Gotowe"; + +/* No comment provided by engineer. */ +"Duration" = "Długość"; + +/* No comment provided by engineer. */ +"Edit" = "Edytuj"; + +/* No comment provided by engineer. */ +"Edit Playlist" = "Edytuj playlistę"; + +/* No comment provided by engineer. */ +"Edit Quality Profile" = "Edytuj profil jakości"; + +/* No comment provided by engineer. */ +"Edit..." = "Edytuj..."; + +/* No comment provided by engineer. */ +"Enable logging" = "Włącz logowanie"; + +/* No comment provided by engineer. */ +"Enable Return YouTube Dislike" = "Włącz łapki w dół (Return YouTube Dislike)"; + +/* No comment provided by engineer. */ +"Enter fullscreen in landscape" = "W poziomej orientacji uruchom tryb pełnoekranowy"; + +/* No comment provided by engineer. */ +"Error" = "Błąd"; + +/* No comment provided by engineer. */ +"Error when accessing playlist" = "Błąd podczas pobierania playlisty"; + +/* No comment provided by engineer. */ +"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Wyraźne przypomnienia, aby polubić, zasubskrybować lub wejść w interakcję z nimi na jakiejkolwiek płatnej lub bezpłatnej platformie (np. kliknąć na wideo)."; + +/* No comment provided by engineer. */ +"Favorites" = "Ulubione"; + +/* No comment provided by engineer. */ +"Filter" = "Filtr"; + +/* No comment provided by engineer. */ +"Filter: active" = "Filtr: aktywny"; + +/* No comment provided by engineer. */ +"Find Other" = "Znajdź coś innego"; + +/* No comment provided by engineer. */ +"Finding something to play..." = "Szukanie następnego filmu..."; + +/* No comment provided by engineer. */ +"For videos which feature music as the primary content." = "Dla filmów, których główną treścią jest muzyka."; + +/* No comment provided by engineer. */ +"Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)." = "Formaty będą wybierane w kolejności tak jak wyżej.\nHLS to format adaptacyjny (ustawienie rozdzielczości nie ma zastosowania)."; + +/* No comment provided by engineer. */ +"Frontend URL" = "Adres frontendu"; + +/* No comment provided by engineer. */ +"Fullscreen size" = "Rozmiar pełnoekranowy"; + +/* No comment provided by engineer. */ +"Fullscreen Size" = "Pełen ekran"; + +/* No comment provided by engineer. */ +"Gaming" = "Gry"; + +/* No comment provided by engineer. */ +"Help" = "Pomoc"; + +/* No comment provided by engineer. */ +"Hide sidebar" = "Ukryj pasek boczny"; + +/* No comment provided by engineer. */ +"High" = "Wysoka"; + +/* No comment provided by engineer. */ +"Highest" = "Najwyższa"; + +/* No comment provided by engineer. */ +"Highest quality" = "Najwyższa jakość"; + +/* No comment provided by engineer. */ +"History" = "Historia"; + +/* No comment provided by engineer. */ +"Honor orientation lock" = "Honoruj blokadę orientacji systemu"; + +/* Video date filter in search */ +"Hour" = "Godzina"; + +/* No comment provided by engineer. */ +"I am lost" = "Nic tu nie ogarniam"; + +/* No comment provided by engineer. */ +"I found a bug /" = "Znalazłem błąd /"; + +/* No comment provided by engineer. */ +"I have a feature request" = "Mam prośbę o dodanie funkcji"; + +/* No comment provided by engineer. */ +"I like this app!" = "Podoba mi się ta aplikacja!"; + +/* No comment provided by engineer. */ +"I want to ask a question" = "Chcę zadać pytanie"; + +/* No comment provided by engineer. */ +"If you are interested what's coming in future updates, you can track project Milestones." = "Jeśli interesuje Cię przyszłość projektu, śledź GitHubowe Milestone'y."; + +/* No comment provided by engineer. */ +"If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)." = "Jeśli zgłaszasz błąd, dołącz potrzebne informacje (takie jak: wersja aplikacji, rodzaj urządzenia i jego wersja systemu, lista kroków do zreprodukowania)."; + +/* No comment provided by engineer. */ +"Increase rate" = "Zwiększ prędkość"; + +/* No comment provided by engineer. */ +"Info" = "Info"; + +/* No comment provided by engineer. */ +"Instance of current account" = "Instancja aktualnie wybranego konta"; + +/* SponsorBlock category name */ +"Interaction" = "Interakcja"; + +/* No comment provided by engineer. */ +"Interface" = "Interfejs"; + +/* SponsorBlock category name */ +"Intro" = "Wprowadzenie"; + +/* No comment provided by engineer. */ +"Issues Tracker" = "Śledzenie błędów"; + +/* Selected video has just finished playing */ +"Just watched" = "Właśnie obejrzane"; + +/* Player controls layout size */ +"Large" = "Duży"; + +/* No comment provided by engineer. */ +"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "Duże rozmiary nie są przeznaczone dla wszystkich urządzeń, użycie ich może spowodować że przyciski nie będą mieścić się na ekranie."; + +/* No comment provided by engineer. */ +"LIVE" = "LIVE"; + +/* Loading stream OSD */ +"Loading streams..." = "Ładowanie strumieni..."; + +/* No comment provided by engineer. */ +"Loading..." = "Ładowanie…"; + +/* No comment provided by engineer. */ +"Locations" = "Lokalizacje"; + +/* No comment provided by engineer. */ +"Lock portrait mode" = "Zablokuj tryb portretowy"; + +/* Video duration filter in search */ +"Long" = "Długie"; + +/* No comment provided by engineer. */ +"Low" = "Niska"; + +/* No comment provided by engineer. */ +"Low quality" = "Niska jakość"; + +/* No comment provided by engineer. */ +"Lowest" = "Najniższa"; + +/* No comment provided by engineer. */ +"Mark as watched" = "Oznacz jako obejrzane"; + +/* No comment provided by engineer. */ +"Mark video as watched after playing" = "Oznacz jako obejrzane po odtworzeniu"; + +/* No comment provided by engineer. */ +"Mark watched videos with" = "Oznacz obejrzane wideo"; + +/* No comment provided by engineer. */ +"Matrix Channel" = "Kanał Matrix"; + +/* No comment provided by engineer. */ +"Matrix Chat" = "Chat Matrix"; + +/* Player controls layout size */ +"Medium" = "Średni"; + +/* No comment provided by engineer. */ +"Medium quality" = "Średnia jakość"; + +/* No comment provided by engineer. */ +"Milestones" = "Kamienie milowe"; + +/* Video date filter in search */ +"Month" = "Miesiąc"; + +/* No comment provided by engineer. */ +"More info can be found in:" = "Więcej informacji można znaleźć tutaj:"; + +/* No comment provided by engineer. */ +"Movies" = "Filmy"; + +/* No comment provided by engineer. */ +"MPV Documentation" = "Dokumentacja MPV"; + +/* No comment provided by engineer. */ +"Music" = "Muzyka"; + +/* No comment provided by engineer. */ +"Name" = "Nazwa"; + +/* No comment provided by engineer. */ +"New Playlist" = "Nowa playlista"; + +/* No comment provided by engineer. */ +"Next" = "Następny"; + +/* No comment provided by engineer. */ +"No description" = "Brak opisu"; + +/* No comment provided by engineer. */ +"No Playlists" = "Brak playlist"; + +/* No comment provided by engineer. */ +"No results" = "Brak wyników"; + +/* No comment provided by engineer. */ +"Normal" = "Normalna"; + +/* No comment provided by engineer. */ +"Not available" = "Niedostępne"; + +/* No comment provided by engineer. */ +"Not Playing" = "Nie odtwarza"; + +/* No comment provided by engineer. */ +"Nothing" = "Nic"; + +/* SponsorBlock category name */ +"Offtopic in Music Videos" = "Offtopic w teledyskach"; + +/* No comment provided by engineer. */ +"Only when signed in" = "Tylko gdy zalogowany"; + +/* No comment provided by engineer. */ +"Open \"Playlists\" tab to create new one" = "Otwórz \"Playlisty\" aby stworzyć nową"; + +/* No comment provided by engineer. */ +"Open Settings" = "Otwórz Ustawienia"; + +/* Loading stream OSD */ +"Opening %@ stream..." = "Otwieranie strumienia %@…"; + +/* No comment provided by engineer. */ +"Opening audio stream..." = "Otwieranie strumienia audio..."; + +/* No comment provided by engineer. */ +"Orientation" = "Orientacja"; + +/* SponsorBlock category name */ +"Outro" = "Outro"; + +/* No comment provided by engineer. */ +"Part of a video promoting a product or service not directly related to the creator. The creator will receive payment or compensation in the form of money or free products." = "Część filmu promująca produkt lub usługę niezwiązaną bezpośrednio z twórcą. Twórca otrzyma zapłatę lub rekompensatę w postaci pieniędzy lub darmowych produktów."; + +/* No comment provided by engineer. */ +"Password" = "Hasło"; + +/* No comment provided by engineer. */ +"Pause" = "Pauza"; + +/* No comment provided by engineer. */ +"Pause when entering background" = "Zatrzymaj w tle"; + +/* No comment provided by engineer. */ +"Pause when player is closed" = "Zatrzymaj przy zamykaniu odtwarzacza"; + +/* No comment provided by engineer. */ +"Picture in Picture" = "Obraz w obrazie"; + +/* No comment provided by engineer. */ +"Play" = "Odtwarzaj"; + +/* No comment provided by engineer. */ +"Play All" = "Odtwórz wszystkie"; + +/* No comment provided by engineer. */ +"Play in PiP" = "Otwórz w PiP"; + +/* No comment provided by engineer. */ +"Play Last" = "Odtwórz jako ostatni"; + +/* No comment provided by engineer. */ +"Play Music" = "Odtwarzaj muzykę"; + +/* No comment provided by engineer. */ +"Play Next" = "Odtwarzaj następne"; + +/* No comment provided by engineer. */ +"Play Now" = "Odtwórz teraz"; + +/* No comment provided by engineer. */ +"Playback" = "Odtwarzanie"; + +/* No comment provided by engineer. */ +"Player" = "Odtwarzacz"; + +/* No comment provided by engineer. */ +"Playlist" = "Playlista"; + +/* No comment provided by engineer. */ +"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Playlista \"%@\" zostanie usunięta.\nNie można tego cofnąć."; + +/* No comment provided by engineer. */ +"Playlists" = "Playlisty"; + +/* No comment provided by engineer. */ +"Popular" = "Popularne"; + +/* No comment provided by engineer. */ +"Preferred Formats" = "Preferowane formaty"; + +/* No comment provided by engineer. */ +"Profiles" = "Profile"; + +/* No comment provided by engineer. */ +"Promoting a product or service that is directly related to the creator themselves. This usually includes merchandise or promotion of monetized platforms." = "Promowanie produktu lub usługi bezpośrednio związanej z samym twórcą. Zwykle obejmuje to towary lub promocję platform, na których można zarabiać."; + +/* No comment provided by engineer. */ +"Proxy videos" = "Używaj proxy do odtwarzania wideo"; + +/* No comment provided by engineer. */ +"Public Locations" = "Publiczne lokalizacje"; + +/* No comment provided by engineer. */ +"Public Manifest" = "Manifest publiczny"; + +/* No comment provided by engineer. */ +"Quality" = "Jakość"; + +/* No comment provided by engineer. */ +"Quality Profile" = "Profil jakości"; + +/* No comment provided by engineer. */ +"Queue" = "Kolejka"; + +/* No comment provided by engineer. */ +"Queue is empty" = "Kolejka jest pusta"; + +/* No comment provided by engineer. */ +"Rate" = "Prędkość"; + +/* Video sort order in search */ +"Rating" = "Ocena"; + +/* No comment provided by engineer. */ +"Recents" = "Ostatnie"; + +/* No comment provided by engineer. */ +"Red" = "Czerwony"; + +/* No comment provided by engineer. */ +"Refresh" = "Odśwież"; + +/* No comment provided by engineer. */ +"Regular size" = "Regularny rozmiar"; + +/* No comment provided by engineer. */ +"Regular Size" = "Zwykły rozmiar"; + +/* No comment provided by engineer. */ +"Related" = "Powiązane"; + +/* Video sort order in search */ +"Relevance" = "Dopasowanie"; + +/* No comment provided by engineer. */ +"Remove" = "Usuń"; + +/* No comment provided by engineer. */ +"Remove from Favorites" = "Usuń z ulubionych"; + +/* No comment provided by engineer. */ +"Remove from history" = "Usuń z historii"; + +/* No comment provided by engineer. */ +"Remove from Playlist" = "Usuń z playlisty"; + +/* No comment provided by engineer. */ +"Remove from the queue" = "Usuń z kolejki"; + +/* No comment provided by engineer. */ +"Replies" = "Odpowiedzi"; + +/* No comment provided by engineer. */ +"Reset" = "Zresetuj"; + +/* No comment provided by engineer. */ +"Reset search filters" = "Zresetuj filtry"; + +/* No comment provided by engineer. */ +"Reset watched status when playing again" = "Resetuj status odtwarzania za każdym odtworzeniem"; + +/* No comment provided by engineer. */ +"Resolution" = "Rozdzielczość"; + +/* No comment provided by engineer. */ +"Restart" = "Od początku"; + +/* No comment provided by engineer. */ +"Restart the app to apply the settings above." = "Zrestartuj aplikację aby zastosować powyższe ustawienia."; + +/* No comment provided by engineer. */ +"Restart/Play next" = "Od początku/Następny"; + +/* No comment provided by engineer. */ +"Restore default profiles..." = "Przywróć domyślne profile…"; + +/* No comment provided by engineer. */ +"Rotate to portrait when exiting fullscreen" = "Obróć do trybu portretowego przy zamykaniu pełnego ekranu"; + +/* No comment provided by engineer. */ +"Round corners" = "Zaokrąglaj rogi"; + +/* No comment provided by engineer. */ +"Save" = "Zapisz"; + +/* No comment provided by engineer. */ +"Save history of played videos" = "Zapisuj historię oglądania"; + +/* No comment provided by engineer. */ +"Save history of searches, channels and playlists" = "Zapisuj historię wyszukiwania, kanały i playlisty"; + +/* No comment provided by engineer. */ +"Search" = "Szukaj"; + +/* No comment provided by engineer. */ +"Search history is empty" = "Historia wyszukiwania jest pusta"; + +/* No comment provided by engineer. */ +"Search..." = "Szukaj…"; + +/* No comment provided by engineer. */ +"Sections" = "Sekcje"; + +/* No comment provided by engineer. */ +"Seek gesture sensitivity" = "Czułość gestu przewijania"; + +/* No comment provided by engineer. */ +"Seek gesture speed" = "Prędkość gestu przewijania"; + +/* No comment provided by engineer. */ +"Seek with horizontal swipe on video" = "Przewijaj wideo gestem poziomym"; + +/* No comment provided by engineer. */ +"Segments typically found at the start of a video that include an animation, still frame or clip which are also seen in other videos by the same creator." = "Segmenty, które zwykle znajdują się na początku filmu, zawierają animację, nieruchomą klatkę lub klip, które są również widoczne w innych filmach tego samego twórcy."; + +/* No comment provided by engineer. */ +"Select location closest to you:" = "Wybierz najbliższą lokalizację:"; + +/* SponsorBlock category name */ +"Self-promotion" = "Autopromocja"; + +/* No comment provided by engineer. */ +"Settings" = "Ustawienia"; + +/* No comment provided by engineer. */ +"Share %@ link" = "Udostępnij link do %@"; + +/* No comment provided by engineer. */ +"Share %@ link with time" = "Udostępnij link do %@ wraz z czasem"; + +/* No comment provided by engineer. */ +"Share..." = "Udostępnij…"; + +/* Video duration filter in search */ +"Short" = "Krótkie"; + +/* No comment provided by engineer. */ +"Show account username" = "Pokaż nazwę konta"; + +/* No comment provided by engineer. */ +"Show anonymous accounts" = "Pokaż anonimowe konta"; + +/* No comment provided by engineer. */ +"Show channel name" = "Pokaż nazwę kanału"; + +/* No comment provided by engineer. */ +"Show history" = "Pokaż historię"; + +/* No comment provided by engineer. */ +"Show keywords" = "Pokaż słowa kluczowe"; + +/* No comment provided by engineer. */ +"Show playback statistics" = "Pokaż statystyki odtwarzania"; + +/* No comment provided by engineer. */ +"Show progress of watching on thumbnails" = "Pokazuj postęp odtwarzania na miniaturkach"; + +/* No comment provided by engineer. */ +"Show sidebar when space permits" = "Pokazuj pasek boczny gdy jest na to miejsce"; + +/* No comment provided by engineer. */ +"Show video length" = "Pokaż długość wideo"; + +/* No comment provided by engineer. */ +"Shuffle" = "Mieszaj"; + +/* No comment provided by engineer. */ +"Shuffle All" = "Mieszaj wszystkie"; + +/* No comment provided by engineer. */ +"Sidebar" = "Pasek boczny"; + +/* No comment provided by engineer. */ +"Sign In Required" = "Wymagane logowanie"; + +/* Player controls layout size */ +"Small" = "Mały"; + +/* Player controls layout size */ +"Smaller" = "Mniejszy"; + +/* No comment provided by engineer. */ +"Sort" = "Sortuj"; + +/* No comment provided by engineer. */ +"Sort: %@" = "Sortowanie: %@"; + +/* No comment provided by engineer. */ +"Source" = "Źródło"; + +/* SponsorBlock category name */ +"Sponsor" = "Sponsor"; + +/* No comment provided by engineer. */ +"SponsorBlock" = "SponsorBlock"; + +/* No comment provided by engineer. */ +"SponsorBlock API Instance" = "Instancja SponsorBlock"; + +/* No comment provided by engineer. */ +"Subscribe" = "Subskrybuj"; + +/* Subscriptions title */ +"Subscriptions" = "Subskrybcje"; + +/* No comment provided by engineer. */ +"Switch to other public location" = "Przełącz publiczną lokalizację na inną"; + +/* No comment provided by engineer. */ +"Switch to public locations" = "Przełącz na publiczne lokalizacje"; + +/* No comment provided by engineer. */ +"System controls buttons" = "Przyciski w systemowych kontrolkach"; + +/* No comment provided by engineer. */ +"System controls show buttons for %@" = "Kontrolki systemu pokazują przyciski: %@"; + +/* No comment provided by engineer. */ +"That's nice to hear. It is fun to deliver apps other people want to use. You can consider donating to the project or help by contributing to new features development." = "Miło to słyszeć. Fajnie jest dostarczać aplikacje, których inni ludzie chcą używać. Możesz rozważyć przekazanie darowizny na rzecz projektu lub pomóc poprzez przyczynienie się do rozwoju nowych funkcji."; + +/* No comment provided by engineer. */ +"This cannot be reverted" = "Nie można tego cofnąć"; + +/* No comment provided by engineer. */ +"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Nie można tego cofnąć. Ponowne uruchomienie aplikacji może być wymagane aby zobaczyć zmiany."; + +/* No comment provided by engineer. */ +"This information will be processed only on your device and used to connect you to the server in the specified country." = "Ta informacja będzie przetwarzana tylko na tym urządzeniu aby połączyć się z serwerem najbliższym do podnego kraju. "; + +/* No comment provided by engineer. */ +"This will remove all your custom profiles and return their default values. This cannot be reverted." = "Twoje profile zostaną usunięte i przywrócone zostaną domyślne. Nie można tego cofnąć."; + +/* No comment provided by engineer. */ +"Thumbnails" = "Miniaturki"; + +/* Video date filter in search */ +"Today" = "Dziś"; + +/* No comment provided by engineer. */ +"Trending" = "Na czasie"; + +/* Player controls layout size for TV */ +"TV" = "TV"; + +/* No comment provided by engineer. */ +"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "Zazwyczaj w pobliżu lub na końcu filmu, gdy pojawiają się napisy i/lub karty końcowe."; + +/* No comment provided by engineer. */ +"unknown" = "nieznany"; + +/* No comment provided by engineer. */ +"Unsubscribe" = "Odsubskrybuj"; + +/* No comment provided by engineer. */ +"Upload date" = "Data dodania"; + +/* No comment provided by engineer. */ +"URL" = "Adres"; + +/* No comment provided by engineer. */ +"Used to create links from videos, channels and playlists" = "Do tworzenia linków wideo, kanałów i playlist"; + +/* No comment provided by engineer. */ +"Username" = "Nazwa użytkownika"; + +/* Player controls layout size */ +"Very Large" = "Bardzo duży"; + +/* No comment provided by engineer. */ +"Videos" = "Wideo"; + +/* Video sort order in search */ +"Views" = "Wyświetlenia"; + +/* No comment provided by engineer. */ +"Watched" = "Obejrzane"; + +/* Selected video was played on given date */ +"Watched %@" = "Obejrzano %@"; + +/* Selected video is being played */ +"Watching now" = "Oglądane teraz"; + +/* Video date filter in search */ +"Week" = "Tydzień"; + +/* No comment provided by engineer. */ +"Welcome" = "Witaj"; + +/* No comment provided by engineer. */ +"When partially watched video is played" = "Gdy odtwarzane jest poprzednio widziane wideo"; + +/* No comment provided by engineer. */ +"Wi-Fi" = "Wi-Fi"; + +/* No comment provided by engineer. */ +"Wiki" = "Wiki"; + +/* No comment provided by engineer. */ +"Yattee" = "Yattee"; + +/* No comment provided by engineer. */ +"Yattee %@ (build %@)" = "Yattee %@ (build %@)"; + +/* Video date filter in search */ +"Year" = "Rok"; + +/* No comment provided by engineer. */ +"You can find information about using Yattee in the Wiki pages." = "Trochę informacji jak używać Yattee możesz znaleźć w Wiki."; + +/* No comment provided by engineer. */ +"You can use automatic profile selection based on current device status or switch it in video playback settings controls." = "Możesz używać automatycznego wybierania profilu albo wybrać inny z ustawień odtwarzania wideo."; + +/* No comment provided by engineer. */ +"You have no Playlists" = "Nie masz żadnych playlist"; + +/* No comment provided by engineer. */ +"You have no playlists\n\nTap on \"New Playlist\" to create one" = "Nie masz żadnych list odtwarzania\n\nStuknij w \"Nowa lista odtwarzania\", aby ją stworzyć"; + +/* No comment provided by engineer. */ +"You need to create an instance and accounts\nto access %@ section" = "Musisz dodać instancję i konto\naby otworzyć sekcję: %@"; + +/* No comment provided by engineer. */ +"You need to select an account\nto access %@ section" = "Musisz wybrać konto\naby otworzyć sekcję: %@"; + diff --git a/Yattee.xcodeproj/project.pbxproj b/Yattee.xcodeproj/project.pbxproj index 27432c90..6986383d 100644 --- a/Yattee.xcodeproj/project.pbxproj +++ b/Yattee.xcodeproj/project.pbxproj @@ -186,6 +186,9 @@ 371F2F1C269B43D300E4A7AB /* NavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371F2F19269B43D300E4A7AB /* NavigationModel.swift */; }; 3722AEBC274DA396005EA4D6 /* Badge+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBB274DA396005EA4D6 /* Badge+Backport.swift */; }; 3722AEBE274DA401005EA4D6 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBD274DA401005EA4D6 /* Backport.swift */; }; + 37270F1C28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; }; + 37270F1D28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; }; + 37270F1E28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; }; 3727B74A27872A920021C15E /* VisualEffectBlur-iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3727B74927872A920021C15E /* VisualEffectBlur-iOS.swift */; }; 3727B74B27872B880021C15E /* VisualEffectBlur-macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3727B74727872A500021C15E /* VisualEffectBlur-macOS.swift */; }; 3729037E2739E47400EA99F6 /* MenuCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3729037D2739E47400EA99F6 /* MenuCommands.swift */; }; @@ -356,6 +359,9 @@ 37599F38272B4D740087F250 /* FavoriteButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F37272B4D740087F250 /* FavoriteButton.swift */; }; 37599F39272B4D740087F250 /* FavoriteButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F37272B4D740087F250 /* FavoriteButton.swift */; }; 37599F3A272B4D740087F250 /* FavoriteButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F37272B4D740087F250 /* FavoriteButton.swift */; }; + 375B537428DF6CBB004C1D19 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 375B537828DF6CBB004C1D19 /* Localizable.strings */; }; + 375B537528DF6CBB004C1D19 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 375B537828DF6CBB004C1D19 /* Localizable.strings */; }; + 375B537628DF6CBB004C1D19 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 375B537828DF6CBB004C1D19 /* Localizable.strings */; }; 375B8AB128B57F4200397B31 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 375B8AB028B57F4200397B31 /* KeychainAccess */; }; 375B8AB328B580D300397B31 /* KeychainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 375B8AB228B580D300397B31 /* KeychainModel.swift */; }; 375B8AB428B580D300397B31 /* KeychainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 375B8AB228B580D300397B31 /* KeychainModel.swift */; }; @@ -1040,6 +1046,7 @@ 3722AEBB274DA396005EA4D6 /* Badge+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Badge+Backport.swift"; sourceTree = ""; }; 3722AEBD274DA401005EA4D6 /* Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Backport.swift; sourceTree = ""; }; 3722AEBF274DAEB8005EA4D6 /* Tint+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Tint+Backport.swift"; sourceTree = ""; }; + 37270F1B28E06E3E00856150 /* String+Localizable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Localizable.swift"; sourceTree = ""; }; 3727B74727872A500021C15E /* VisualEffectBlur-macOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "VisualEffectBlur-macOS.swift"; sourceTree = ""; }; 3727B74927872A920021C15E /* VisualEffectBlur-iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "VisualEffectBlur-iOS.swift"; sourceTree = ""; }; 3729037D2739E47400EA99F6 /* MenuCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuCommands.swift; sourceTree = ""; }; @@ -1111,6 +1118,8 @@ 37599F2F272B42810087F250 /* FavoriteItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteItem.swift; sourceTree = ""; }; 37599F33272B44000087F250 /* FavoritesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoritesModel.swift; sourceTree = ""; }; 37599F37272B4D740087F250 /* FavoriteButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteButton.swift; sourceTree = ""; }; + 375B537728DF6CBB004C1D19 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + 375B537928DF6CC4004C1D19 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 375B8AB228B580D300397B31 /* KeychainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainModel.swift; sourceTree = ""; }; 375DFB5726F9DA010013F468 /* InstancesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstancesModel.swift; sourceTree = ""; }; 375E45F427B1976B00BA7902 /* MPVOGLView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPVOGLView.swift; sourceTree = ""; }; @@ -1181,6 +1190,7 @@ 37A3B16C27255E7F000FB5EE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37A3B16D27255E7F000FB5EE /* Open in Yattee.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Open in Yattee.entitlements"; sourceTree = ""; }; 37A3B1792725735F000FB5EE /* Open in Yattee - iOS.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Open in Yattee - iOS.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 37A5967628C4EDD80055F98E /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; 37A5DBC7285E371400CA4DD1 /* ControlBackgroundModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlBackgroundModifier.swift; sourceTree = ""; }; 37A9965926D6F8CA006E3224 /* HorizontalCells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HorizontalCells.swift; sourceTree = ""; }; 37A9965D26D6F9B9006E3224 /* FavoritesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoritesView.swift; sourceTree = ""; }; @@ -1930,6 +1940,7 @@ 37A3B15B27255E7F000FB5EE /* Resources */, 37A3B16427255E7F000FB5EE /* content.js */, 37A3B16C27255E7F000FB5EE /* Info.plist */, + 37BCBC4628C38D8E0088BE85 /* InfoPlist.strings */, 37A3B16D27255E7F000FB5EE /* Open in Yattee.entitlements */, 37A3B15927255E7F000FB5EE /* SafariWebExtensionHandler.swift */, ); @@ -1989,6 +2000,7 @@ 37F7AB4C28A9361F00FB46B5 /* UIDevice+Cellular.swift */, 370B79CB286279BA0045DB77 /* UIViewController+HideHomeIndicator.swift */, 3743CA51270F284F00E4D32B /* View+Borders.swift */, + 37270F1B28E06E3E00856150 /* String+Localizable.swift */, ); path = Extensions; sourceTree = ""; @@ -2035,6 +2047,7 @@ 372915E52687E3B900F5A35B /* Defaults.swift */, 37D2E0D328B67EFC00F64D52 /* Delay.swift */, 3761ABFC26F0F8DE00AA496F /* EnvironmentValues.swift */, + 375B537828DF6CBB004C1D19 /* Localizable.strings */, 3729037D2739E47400EA99F6 /* MenuCommands.swift */, 37B7958F2771DAE0001CF27B /* OpenURLHandler.swift */, 37ECED55289FE166002BC2C9 /* SafeArea.swift */, @@ -2547,6 +2560,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + pl, Base, ); mainGroup = 37D4B0BC2671614700C925CA; @@ -2621,6 +2635,7 @@ buildActionMask = 2147483647; files = ( 37D4B0E82671614900C925CA /* Assets.xcassets in Resources */, + 375B537428DF6CBB004C1D19 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2629,6 +2644,7 @@ buildActionMask = 2147483647; files = ( 37D4B0E92671614900C925CA /* Assets.xcassets in Resources */, + 375B537528DF6CBB004C1D19 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2651,6 +2667,7 @@ buildActionMask = 2147483647; files = ( 37D4B1862671691600C925CA /* Assets.xcassets in Resources */, + 375B537628DF6CBB004C1D19 /* Localizable.strings in Resources */, 37D4B15F267164AF00C925CA /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2891,6 +2908,7 @@ 378AE940274EDFB5006A4EE1 /* Tint+Backport.swift in Sources */, 376BE50927347B5F009AD608 /* SettingsHeader.swift in Sources */, 376527BB285F60F700102284 /* PlayerTimeModel.swift in Sources */, + 37270F1C28E06E3E00856150 /* String+Localizable.swift in Sources */, 3722AEBE274DA401005EA4D6 /* Backport.swift in Sources */, 37EFAC0828C138CD00ED9B89 /* ControlsOverlayModel.swift in Sources */, 37F4AD2628613B81004D0F66 /* Color+Debug.swift in Sources */, @@ -3235,6 +3253,7 @@ 3782B95E2755858100990149 /* NSTextField+FocusRingType.swift in Sources */, 37C3A252272366440087A57A /* ChannelPlaylistView.swift in Sources */, 3754B01628B7F84D009717C8 /* Constants.swift in Sources */, + 37270F1D28E06E3E00856150 /* String+Localizable.swift in Sources */, 373CFADC269663F1003CB2C6 /* Thumbnail.swift in Sources */, 37C0697B2725C09E00F7F6CB /* PlayerQueueItemBridge.swift in Sources */, 37CFB48628AFE2510070024C /* VideoDescription.swift in Sources */, @@ -3459,6 +3478,7 @@ 379775952689365600DD52A8 /* Array+Next.swift in Sources */, 3752069F285E910600CA655F /* ChapterView.swift in Sources */, 37F4AD1D28612B23004D0F66 /* OpeningStream.swift in Sources */, + 37270F1E28E06E3E00856150 /* String+Localizable.swift in Sources */, 3705B180267B4DFB00704544 /* TrendingCountry.swift in Sources */, 375B8AB528B580D300397B31 /* KeychainModel.swift in Sources */, 373CFACD26966264003CB2C6 /* SearchQuery.swift in Sources */, @@ -3544,6 +3564,26 @@ }; /* End PBXTargetDependency section */ +/* Begin PBXVariantGroup section */ + 375B537828DF6CBB004C1D19 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 375B537728DF6CBB004C1D19 /* pl */, + 375B537928DF6CC4004C1D19 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 37BCBC4628C38D8E0088BE85 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 37A5967628C4EDD80055F98E /* pl */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ 3712643F2865FF4500D77974 /* Debug */ = { isa = XCBuildConfiguration; diff --git a/macOS/InstancesSettings.swift b/macOS/InstancesSettings.swift index cd28d8c9..65d6ec76 100644 --- a/macOS/InstancesSettings.swift +++ b/macOS/InstancesSettings.swift @@ -36,7 +36,7 @@ struct InstancesSettings: View { } if !selectedInstance.isNil, selectedInstance.app.supportsAccounts { - SettingsHeader(text: "Accounts") + SettingsHeader(text: "Accounts".localized()) let list = List(selection: $selectedAccount) { if selectedInstanceAccounts.isEmpty { @@ -79,7 +79,7 @@ struct InstancesSettings: View { } if selectedInstance != nil, selectedInstance.app.hasFrontendURL { - SettingsHeader(text: "Frontend URL") + SettingsHeader(text: "Frontend URL".localized()) TextField("Frontend URL", text: $frontendURL) .onChange(of: selectedInstance) { _ in