Replace the existing strings and texts with R.swift

This commit is contained in:
PangMo5 2021-11-08 02:56:07 +09:00
parent 2e32beb20e
commit 1e0ae4745c
53 changed files with 266 additions and 225 deletions

View File

@ -20,7 +20,7 @@ struct MediaPlayButtonRowView: View {
NavigationLink(destination: VideoPlayerView(item: viewModel.item).ignoresSafeArea()) {
MediaViewActionButton(icon: "play.fill", scrollView: $wrappedScrollView)
}
Text(viewModel.item.getItemProgressString() != "" ? "\(viewModel.item.getItemProgressString()) left" : "Play")
Text(viewModel.item.getItemProgressString() != "" ? "\(viewModel.item.getItemProgressString()) left" : R.string.localizable.play())
.font(.caption)
}
VStack {

View File

@ -68,7 +68,7 @@ struct PortraitItemElement: View {
.font(.caption)
.fontWeight(.medium)
} else {
Text("S\(String(item.parentIndexNumber ?? 0)):E\(String(item.indexNumber ?? 0))")
Text(R.string.localizable.seasonAndEpisode(String(item.parentIndexNumber ?? 0), String(item.indexNumber ?? 0)))
.foregroundColor(.secondary)
.font(.caption)
.fontWeight(.medium)

View File

@ -22,7 +22,7 @@ struct BasicAppSettingsView: View {
var body: some View {
Form {
Section {
Picker(NSLocalizedString("Appearance", comment: ""), selection: $appAppearance) {
Picker(R.string.localizable.appearance(), selection: $appAppearance) {
ForEach(self.viewModel.appearances, id: \.self) { appearance in
Text(appearance.localizedName).tag(appearance.rawValue)
}
@ -30,21 +30,21 @@ struct BasicAppSettingsView: View {
UIApplication.shared.windows.first?.overrideUserInterfaceStyle = appAppearance.style
})
} header: {
Text("Accessibility")
R.string.localizable.accessibility.text
}
Button {
resetTapped = true
} label: {
Text("Reset")
R.string.localizable.reset.text
}
}
.alert("Reset", isPresented: $resetTapped, actions: {
.alert(R.string.localizable.reset(), isPresented: $resetTapped, actions: {
Button(role: .destructive) {
viewModel.reset()
basicAppSettingsRouter.dismissCoordinator()
} label: {
Text("Reset")
R.string.localizable.reset.text
}
})
.navigationTitle("Settings")

View File

@ -17,7 +17,7 @@ struct ConnectToServerView: View {
var body: some View {
List {
Section {
TextField(NSLocalizedString("Server URL", comment: ""), text: $uri)
TextField(R.string.localizable.serverURL(), text: $uri)
.disableAutocorrection(true)
.autocapitalization(.none)
.keyboardType(.URL)
@ -25,7 +25,7 @@ struct ConnectToServerView: View {
viewModel.connectToServer(uri: uri)
} label: {
HStack {
Text("Connect")
R.string.localizable.connect.text
Spacer()
if viewModel.isLoading {
ProgressView()
@ -37,7 +37,7 @@ struct ConnectToServerView: View {
Text("Connect to a Jellyfin server")
}
Section(header: Text("Local Servers")) {
Section(header: R.string.localizable.localServers.text) {
if viewModel.searching {
ProgressView()
}
@ -68,6 +68,6 @@ struct ConnectToServerView: View {
message: Text(viewModel.errorMessage?.displayMessage ?? "Unknown Error"),
dismissButton: .cancel())
}
.navigationTitle("Connect")
.navigationTitle(R.string.localizable.connect())
}
}

View File

@ -20,7 +20,7 @@ struct ContinueWatchingView: View {
var body: some View {
VStack(alignment: .leading) {
if items.count > 0 {
Text("Continue Watching")
R.string.localizable.continueWatching.text
.font(.headline)
.fontWeight(.semibold)
.padding(.leading, 90)

View File

@ -38,7 +38,7 @@ struct HomeView: View {
self.homeRouter.route(to: \.modalLibrary, (.init(parentID: libraryID, filters: viewModel.recentFilterSet), title: library?.name ?? ""))
} label: {
HStack {
Text("Latest \(library?.name ?? "")")
Text(R.string.localizable.latestWithString(library?.name ?? ""))
.font(.headline)
.fontWeight(.semibold)
Image(systemName: "chevron.forward.circle.fill")

View File

@ -76,7 +76,7 @@ struct EpisodeItemView: View {
HStack(alignment: .top) {
VStack(alignment: .trailing) {
if studio != nil {
Text("STUDIO")
R.string.localizable.studio.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -88,7 +88,7 @@ struct EpisodeItemView: View {
}
if director != nil {
Text("DIRECTOR")
R.string.localizable.director.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -100,7 +100,7 @@ struct EpisodeItemView: View {
}
if !actors.isEmpty {
Text("CAST")
R.string.localizable.cast.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -133,7 +133,7 @@ struct EpisodeItemView: View {
NavigationLink(destination: VideoPlayerView(item: viewModel.item).ignoresSafeArea()) {
MediaViewActionButton(icon: "play.fill")
}
Text(viewModel.item.getItemProgressString() != "" ? "\(viewModel.item.getItemProgressString()) left" : "Play")
Text(viewModel.item.getItemProgressString() != "" ? "\(viewModel.item.getItemProgressString()) left" : R.string.localizable.play())
.font(.caption)
}
VStack {
@ -152,7 +152,7 @@ struct EpisodeItemView: View {
}.padding(.top, 50)
if !viewModel.similarItems.isEmpty {
Text("More Like This")
R.string.localizable.moreLikeThis.text
.font(.headline)
.fontWeight(.semibold)
ScrollView(.horizontal) {

View File

@ -39,8 +39,8 @@ struct ItemView: View {
SeasonItemView(viewModel: .init(item: item))
} else if item.type == "Episode" {
EpisodeItemView(viewModel: .init(item: item))
} else {
Text("Type: \(item.type ?? "") not implemented yet :(")
} else {
Text(R.string.localizable.notImplementedYetWithType(item.type ?? ""))
}
}
}

View File

@ -77,7 +77,7 @@ struct MovieItemView: View {
HStack {
VStack(alignment: .trailing) {
if studio != nil {
Text("STUDIO")
R.string.localizable.studio.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -89,7 +89,7 @@ struct MovieItemView: View {
}
if director != nil {
Text("DIRECTOR")
R.string.localizable.director.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -101,7 +101,7 @@ struct MovieItemView: View {
}
if !actors.isEmpty {
Text("CAST")
R.string.localizable.cast.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -133,7 +133,7 @@ struct MovieItemView: View {
}.padding(.top, 50)
if !viewModel.similarItems.isEmpty {
Text("More Like This")
R.string.localizable.moreLikeThis.text
.font(.headline)
.fontWeight(.semibold)
ScrollView(.horizontal) {

View File

@ -95,7 +95,7 @@ struct SeasonItemView: View {
}.padding(.top, 50)
if !viewModel.episodes.isEmpty {
Text("Episodes")
R.string.localizable.episodes.text
.font(.headline)
.fontWeight(.semibold)
ScrollView(.horizontal) {

View File

@ -79,7 +79,7 @@ struct SeriesItemView: View {
HStack {
VStack(alignment: .trailing) {
if studio != nil {
Text("STUDIO")
R.string.localizable.studio.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -91,7 +91,7 @@ struct SeriesItemView: View {
}
if director != nil {
Text("DIRECTOR")
R.string.localizable.director.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -103,7 +103,7 @@ struct SeriesItemView: View {
}
if !actors.isEmpty {
Text("CAST")
R.string.localizable.cast.text
.font(.body)
.fontWeight(.semibold)
.foregroundColor(.primary)
@ -135,7 +135,7 @@ struct SeriesItemView: View {
}
}.padding(.top, 50)
if !viewModel.seasons.isEmpty {
Text("Seasons")
R.string.localizable.seasons.text
.font(.headline)
.fontWeight(.semibold)
ScrollView(.horizontal) {
@ -153,7 +153,7 @@ struct SeriesItemView: View {
}
if !viewModel.similarItems.isEmpty {
Text("More Like This")
R.string.localizable.moreLikeThis.text
.font(.headline)
.fontWeight(.semibold)
ScrollView(.horizontal) {

View File

@ -31,32 +31,32 @@ struct LibraryFilterView: View {
} else {
Form {
if viewModel.enabledFilterType.contains(.genre) {
MultiSelector(label: NSLocalizedString("Genres", comment: ""),
MultiSelector(label: R.string.localizable.genres(),
options: viewModel.possibleGenres,
optionToString: { $0.name ?? "" },
selected: $viewModel.modifiedFilters.withGenres)
}
if viewModel.enabledFilterType.contains(.filter) {
MultiSelector(label: NSLocalizedString("Filters", comment: ""),
MultiSelector(label: R.string.localizable.filters(),
options: viewModel.possibleItemFilters,
optionToString: { $0.localized },
selected: $viewModel.modifiedFilters.filters)
}
if viewModel.enabledFilterType.contains(.tag) {
MultiSelector(label: NSLocalizedString("Tags", comment: ""),
MultiSelector(label: R.string.localizable.tags(),
options: viewModel.possibleTags,
optionToString: { $0 },
selected: $viewModel.modifiedFilters.tags)
}
if viewModel.enabledFilterType.contains(.sortBy) {
Picker(selection: $viewModel.selectedSortBy, label: Text("Sort by")) {
Picker(selection: $viewModel.selectedSortBy, label: R.string.localizable.sortBy.text) {
ForEach(viewModel.possibleSortBys, id: \.self) { so in
Text(so.localized).tag(so)
}
}
}
if viewModel.enabledFilterType.contains(.sortOrder) {
Picker(selection: $viewModel.selectedSortOrder, label: Text("Display order")) {
Picker(selection: $viewModel.selectedSortOrder, label: R.string.localizable.displayOrder.text) {
ForEach(viewModel.possibleSortOrders, id: \.self) { so in
Text(so.rawValue).tag(so)
}
@ -68,7 +68,7 @@ struct LibraryFilterView: View {
self.filters = viewModel.modifiedFilters
filterRouter.dismissCoordinator()
} label: {
Text("Reset")
R.string.localizable.reset.text
}
}
}
@ -86,7 +86,7 @@ struct LibraryFilterView: View {
self.filters = viewModel.modifiedFilters
filterRouter.dismissCoordinator()
} label: {
Text("Apply")
R.string.localizable.apply.text
}
}
}

View File

@ -44,7 +44,7 @@ struct LibrarySearchView: View {
var suggestionsListView: some View {
ScrollView {
LazyVStack(spacing: 8) {
Text("Suggestions")
R.string.localizable.suggestions.text
.font(.headline)
.fontWeight(.bold)
.foregroundColor(.primary)

View File

@ -88,7 +88,7 @@ struct LibraryView: View {
.ignoresSafeArea(.all)
} else {
VStack {
Text("No results.")
R.string.localizable.noResults.text
Button { } label: {
Text("Reload")
}

View File

@ -77,7 +77,7 @@ struct MovieLibrariesView: View {
.ignoresSafeArea(.all)
} else {
VStack {
Text("No results.")
R.string.localizable.noResults.text
Button {
print("movieLibraries reload")
} label: {

View File

@ -19,7 +19,7 @@ struct NextUpView: View {
var body: some View {
VStack(alignment: .leading) {
if items.count > 0 {
Text("Next Up")
R.string.localizable.nextUp.text
.font(.headline)
.fontWeight(.semibold)
.padding(.leading, 90)

View File

@ -72,7 +72,7 @@ struct ServerListView: View {
Button {
serverListRouter.route(to: \.connectToServer)
} label: {
Text("Connect")
R.string.localizable.connect.text
.bold()
.font(.callout)
}

View File

@ -22,7 +22,7 @@ struct SettingsView: View {
var body: some View {
Form {
Section(header: Text("Playback settings")) {
Section(header: R.string.localizable.playbackSettings()) {
Picker("Default local quality", selection: $inNetworkStreamBitrate) {
ForEach(self.viewModel.bitrates, id: \.self) { bitrate in
Text(bitrate.name).tag(bitrate.value)
@ -36,7 +36,7 @@ struct SettingsView: View {
}
}
Section(header: Text("Accessibility")) {
Section(header: R.string.localizable.accessibility.text) {
Toggle("Automatically show subtitles", isOn: $isAutoSelectSubtitles)
SearchablePicker(label: "Preferred subtitle language",
options: viewModel.langs,
@ -58,12 +58,12 @@ struct SettingsView: View {
Section(header: Text(SessionManager.main.currentLogin.server.name)) {
HStack {
Text("Signed in as \(SessionManager.main.currentLogin.user.username)").foregroundColor(.primary)
Text(R.string.localizable.signedInAsWithString(SessionManager.main.currentLogin.user.username))).foregroundColor(.primary)
Spacer()
Button {
SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didSignOut, object: nil)
} label: {
Text("Switch user").font(.callout)
R.string.localizable.switchUser.text.font(.callout)
}
}
Button {

View File

@ -77,7 +77,7 @@ struct TVLibrariesView: View {
.ignoresSafeArea(.all)
} else {
VStack {
Text("No results.")
R.string.localizable.noResults.text
Button {
print("tvLibraries reload")
} label: {

View File

@ -20,11 +20,11 @@ struct UserSignInView: View {
Form {
Section {
TextField("Username", text: $username)
TextField(R.string.localizable.username(), text: $username)
.disableAutocorrection(true)
.autocapitalization(.none)
SecureField("Password", text: $password)
SecureField(R.string.localizable.password(), text: $password)
.disableAutocorrection(true)
.autocapitalization(.none)
@ -32,7 +32,7 @@ struct UserSignInView: View {
viewModel.login(username: username, password: password)
} label: {
HStack {
Text("Connect")
R.string.localizable.connect.text
Spacer()
if viewModel.isLoading {
ProgressView()

View File

@ -14,7 +14,7 @@ class AudioViewController: InfoTabViewController {
override func viewDidLoad() {
super.viewDidLoad()
tabBarItem.title = NSLocalizedString("Audio", comment: "")
tabBarItem.title = "Audio"
}

View File

@ -16,7 +16,7 @@ class MediaInfoViewController: InfoTabViewController {
override func viewDidLoad() {
super.viewDidLoad()
tabBarItem.title = NSLocalizedString("Info", comment: "")
tabBarItem.title = "Info"
}
func setMedia(item: BaseItemDto) {

View File

@ -14,7 +14,7 @@ class SubtitlesViewController: InfoTabViewController {
override func viewDidLoad() {
super.viewDidLoad()
tabBarItem.title = NSLocalizedString("Subtitles", comment: "")
tabBarItem.title = "Subtitles"
}

View File

@ -15,6 +15,7 @@
09389CC726819B4600AE350E /* VideoPlayerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09389CC626819B4500AE350E /* VideoPlayerModel.swift */; };
09389CC826819B4600AE350E /* VideoPlayerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09389CC626819B4500AE350E /* VideoPlayerModel.swift */; };
0959A5FD2686D29800C7C9A9 /* VideoUpNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0959A5FC2686D29800C7C9A9 /* VideoUpNextView.swift */; };
363CADF08820D3B2055CF1D8 /* Pods_JellyfinPlayer_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BE2D324B040DCA2629C110D /* Pods_JellyfinPlayer_tvOS.framework */; };
531069572684E7EE00CFFDBA /* InfoTabBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531069502684E7EE00CFFDBA /* InfoTabBarViewController.swift */; };
531069582684E7EE00CFFDBA /* MediaInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531069512684E7EE00CFFDBA /* MediaInfoView.swift */; };
531069592684E7EE00CFFDBA /* SubtitlesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531069522684E7EE00CFFDBA /* SubtitlesView.swift */; };
@ -148,15 +149,15 @@
53DE4BD2267098F300739748 /* SearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DE4BD1267098F300739748 /* SearchBarView.swift */; };
53DF641E263D9C0600A7CD1A /* LibraryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DF641D263D9C0600A7CD1A /* LibraryView.swift */; };
53E4E649263F725B00F67C6B /* MultiSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E4E648263F725B00F67C6B /* MultiSelectorView.swift */; };
53EC6E1E267E80AC006DD26A /* Pods_JellyfinPlayer_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EBFE1F64394BCC2EFFF1610D /* Pods_JellyfinPlayer_tvOS.framework */; };
53EC6E21267E80B1006DD26A /* Pods_JellyfinPlayer_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F905C1D3D3A0C9E13E7A0BC /* Pods_JellyfinPlayer_iOS.framework */; };
53EE24E6265060780068F029 /* LibrarySearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53EE24E5265060780068F029 /* LibrarySearchView.swift */; };
53F8377D265FF67C00F456B3 /* VideoPlayerSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F8377C265FF67C00F456B3 /* VideoPlayerSettingsView.swift */; };
53F866442687A45F00DCD1D7 /* PortraitItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F866432687A45F00DCD1D7 /* PortraitItemView.swift */; };
53FF7F2A263CF3F500585C35 /* LatestMediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FF7F29263CF3F500585C35 /* LatestMediaView.swift */; };
560CA59B3956A4CA13EDAC05 /* Pods_JellyfinPlayer_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86BAC42C3764D232C8DF8F5E /* Pods_JellyfinPlayer_iOS.framework */; };
62133890265F83A900A81A2A /* LibraryListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6213388F265F83A900A81A2A /* LibraryListView.swift */; };
621338932660107500A81A2A /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338922660107500A81A2A /* StringExtensions.swift */; };
621338B32660A07800A81A2A /* LazyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338B22660A07800A81A2A /* LazyView.swift */; };
62167B882738411700167ECE /* R.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6286F0A0271C0AA500C40ED5 /* R.generated.swift */; };
6220D0AD26D5EABB00B8E046 /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0AC26D5EABB00B8E046 /* ViewExtensions.swift */; };
6220D0AE26D5EABB00B8E046 /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0AC26D5EABB00B8E046 /* ViewExtensions.swift */; };
6220D0AF26D5EABE00B8E046 /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0AC26D5EABB00B8E046 /* ViewExtensions.swift */; };
@ -175,6 +176,7 @@
625CB5752678C33500530A6E /* LibraryListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5742678C33500530A6E /* LibraryListViewModel.swift */; };
625CB5772678C34300530A6E /* ConnectToServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5762678C34300530A6E /* ConnectToServerViewModel.swift */; };
625CB57A2678C4A400530A6E /* ActivityIndicator in Frameworks */ = {isa = PBXBuildFile; productRef = 625CB5792678C4A400530A6E /* ActivityIndicator */; };
6264E88A27384A6F0081A12A /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
62671DB327159C1800199D95 /* ItemCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0BF26D61C5000B8E046 /* ItemCoordinator.swift */; };
6267B3D626710B8900A7371D /* CollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6267B3D526710B8900A7371D /* CollectionExtensions.swift */; };
6267B3D726710B9700A7371D /* CollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6267B3D526710B8900A7371D /* CollectionExtensions.swift */; };
@ -356,17 +358,17 @@
E1FCD08926C35A0D007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
E1FCD09626C47118007C8DCF /* ErrorMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD09526C47118007C8DCF /* ErrorMessage.swift */; };
E1FCD09726C47118007C8DCF /* ErrorMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD09526C47118007C8DCF /* ErrorMessage.swift */; };
E1FCD09926C4F358007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
E1FCD09A26C4F35A007C8DCF /* ErrorMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD09526C47118007C8DCF /* ErrorMessage.swift */; };
EABFD69FA6D5DBB248A494AA /* Pods_WidgetExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59AFF849629F3C787909A911 /* Pods_WidgetExtension.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
628B952B2670CABE0091AF3B /* PBXContainerItemProxy */ = {
6264E888273848760081A12A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5377CBE9263B596A003A4E83 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 628B951F2670CABD0091AF3B;
remoteInfo = WidgetExtensionExtension;
remoteInfo = WidgetExtension;
};
/* End PBXContainerItemProxy section */
@ -398,8 +400,10 @@
091B5A882683142E00D78B61 /* UDPBroadCastConnection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UDPBroadCastConnection.swift; sourceTree = "<group>"; };
09389CC626819B4500AE350E /* VideoPlayerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerModel.swift; sourceTree = "<group>"; };
0959A5FC2686D29800C7C9A9 /* VideoUpNextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoUpNextView.swift; sourceTree = "<group>"; };
3773C07648173CE7FEC083D5 /* Pods-JellyfinPlayer iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer iOS.debug.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS.debug.xcconfig"; sourceTree = "<group>"; };
3F905C1D3D3A0C9E13E7A0BC /* Pods_JellyfinPlayer_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JellyfinPlayer_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
14E199C7BBA98782CAD2F0D4 /* Pods-JellyfinPlayer iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer iOS.release.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS.release.xcconfig"; sourceTree = "<group>"; };
20CA36DDD247EED8D16438A5 /* Pods-JellyfinPlayer tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer tvOS.release.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer tvOS/Pods-JellyfinPlayer tvOS.release.xcconfig"; sourceTree = "<group>"; };
4BDCEE3B49CF70A9E9BA3CD8 /* Pods-WidgetExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetExtension.debug.xcconfig"; path = "Target Support Files/Pods-WidgetExtension/Pods-WidgetExtension.debug.xcconfig"; sourceTree = "<group>"; };
4BE2D324B040DCA2629C110D /* Pods_JellyfinPlayer_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JellyfinPlayer_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
531069502684E7EE00CFFDBA /* InfoTabBarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InfoTabBarViewController.swift; sourceTree = "<group>"; };
531069512684E7EE00CFFDBA /* MediaInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaInfoView.swift; sourceTree = "<group>"; };
531069522684E7EE00CFFDBA /* SubtitlesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubtitlesView.swift; sourceTree = "<group>"; };
@ -497,6 +501,7 @@
53F8377C265FF67C00F456B3 /* VideoPlayerSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerSettingsView.swift; sourceTree = "<group>"; };
53F866432687A45F00DCD1D7 /* PortraitItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortraitItemView.swift; sourceTree = "<group>"; };
53FF7F29263CF3F500585C35 /* LatestMediaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LatestMediaView.swift; sourceTree = "<group>"; };
59AFF849629F3C787909A911 /* Pods_WidgetExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WidgetExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
6213388F265F83A900A81A2A /* LibraryListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryListView.swift; sourceTree = "<group>"; };
621338922660107500A81A2A /* StringExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtensions.swift; sourceTree = "<group>"; };
621338B22660A07800A81A2A /* LazyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyView.swift; sourceTree = "<group>"; };
@ -544,8 +549,10 @@
62EC352E267666A5000E9F2D /* SessionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionManager.swift; sourceTree = "<group>"; };
62EC353326766B03000E9F2D /* DeviceRotationViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceRotationViewModifier.swift; sourceTree = "<group>"; };
62ECA01726FA685A00E8EBB7 /* DeepLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLink.swift; sourceTree = "<group>"; };
772F6DAB8534FD1DB45B7687 /* Pods-JellyfinPlayer iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer iOS.debug.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS.debug.xcconfig"; sourceTree = "<group>"; };
86BAC42C3764D232C8DF8F5E /* Pods_JellyfinPlayer_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JellyfinPlayer_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
AE8C3158265D6F90008AA076 /* bitrates.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = bitrates.json; sourceTree = "<group>"; };
BEEC50E7EFD4848C0E320941 /* Pods-JellyfinPlayer iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer iOS.release.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS.release.xcconfig"; sourceTree = "<group>"; };
B598C62749E5EFD37280FCC3 /* Pods-JellyfinPlayer tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer tvOS.debug.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer tvOS/Pods-JellyfinPlayer tvOS.debug.xcconfig"; sourceTree = "<group>"; };
C40CD921271F8CD8000FB198 /* MoviesLibrariesCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesLibrariesCoordinator.swift; sourceTree = "<group>"; };
C40CD924271F8D1E000FB198 /* MovieLibrariesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieLibrariesViewModel.swift; sourceTree = "<group>"; };
C40CD927271F8DAB000FB198 /* MovieLibrariesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieLibrariesView.swift; sourceTree = "<group>"; };
@ -555,8 +562,6 @@
C4BE076D2720FEA8003F4AD1 /* PortraitItemElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortraitItemElement.swift; sourceTree = "<group>"; };
C4E508172703E8190045C9AB /* LibraryListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryListView.swift; sourceTree = "<group>"; };
C4E5081C2703F8370045C9AB /* LibrarySearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrarySearchView.swift; sourceTree = "<group>"; };
D79953919FED0C4DF72BA578 /* Pods-JellyfinPlayer tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer tvOS.release.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer tvOS/Pods-JellyfinPlayer tvOS.release.xcconfig"; sourceTree = "<group>"; };
DE5004F745B19E28744A7DE7 /* Pods-JellyfinPlayer tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer tvOS.debug.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer tvOS/Pods-JellyfinPlayer tvOS.debug.xcconfig"; sourceTree = "<group>"; };
E100720626BDABC100CE3E31 /* MediaPlayButtonRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPlayButtonRowView.swift; sourceTree = "<group>"; };
E11B1B6B2718CD68006DA3E8 /* JellyfinAPIError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JellyfinAPIError.swift; sourceTree = "<group>"; };
E1267D3D271A1F46003C492E /* PreferenceUIHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceUIHostingController.swift; sourceTree = "<group>"; };
@ -612,7 +617,7 @@
E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerJumpLength.swift; sourceTree = "<group>"; };
E1FCD08726C35A0D007C8DCF /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = "<group>"; };
E1FCD09526C47118007C8DCF /* ErrorMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorMessage.swift; sourceTree = "<group>"; };
EBFE1F64394BCC2EFFF1610D /* Pods_JellyfinPlayer_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JellyfinPlayer_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
FDEDADB92FA8523BC8432E45 /* Pods-WidgetExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetExtension.release.xcconfig"; path = "Target Support Files/Pods-WidgetExtension/Pods-WidgetExtension.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -622,7 +627,6 @@
files = (
53649AAF269CFAF600A2D8B7 /* Puppy in Frameworks */,
E1218C9E271A2CD600EA0737 /* CombineExt in Frameworks */,
53EC6E1E267E80AC006DD26A /* Pods_JellyfinPlayer_tvOS.framework in Frameworks */,
E1218CA0271A2CF200EA0737 /* Nuke in Frameworks */,
6220D0C926D63F3700B8E046 /* Stinsen in Frameworks */,
53A431BF266B0FFE0016769F /* JellyfinAPI in Frameworks */,
@ -633,6 +637,7 @@
E13DD3CD27164CA7009D4DAF /* CoreStore in Frameworks */,
E12186DE2718F1C50010884C /* Defaults in Frameworks */,
53ABFDED26799D7700886593 /* ActivityIndicator in Frameworks */,
363CADF08820D3B2055CF1D8 /* Pods_JellyfinPlayer_tvOS.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -644,7 +649,6 @@
53649AAD269CFAEA00A2D8B7 /* Puppy in Frameworks */,
62C29E9C26D0FE4200C1D2E7 /* Stinsen in Frameworks */,
E1A99999271A3429008E78C0 /* SwiftUICollection in Frameworks */,
53EC6E21267E80B1006DD26A /* Pods_JellyfinPlayer_iOS.framework in Frameworks */,
E1218C9A271A26BA00EA0737 /* Nuke in Frameworks */,
E1B6DCEA271A23880015B715 /* SwiftyJSON in Frameworks */,
53352571265EA0A0006CCA86 /* Introspect in Frameworks */,
@ -652,6 +656,7 @@
625CB57A2678C4A400530A6E /* ActivityIndicator in Frameworks */,
E1B6DCE8271A23780015B715 /* CombineExt in Frameworks */,
53A431BD266B0FF20016769F /* JellyfinAPI in Frameworks */,
560CA59B3956A4CA13EDAC05 /* Pods_JellyfinPlayer_iOS.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -667,6 +672,7 @@
E13DD3CF27164E1F009D4DAF /* CoreStore in Frameworks */,
628B95352670CAEA0091AF3B /* JellyfinAPI in Frameworks */,
E1218C9C271A26C400EA0737 /* Nuke in Frameworks */,
EABFD69FA6D5DBB248A494AA /* Pods_WidgetExtension.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1033,8 +1039,9 @@
53D5E3DC264B47EE00BADDC8 /* MobileVLCKit.xcframework */,
628B95212670CABD0091AF3B /* WidgetKit.framework */,
628B95232670CABD0091AF3B /* SwiftUI.framework */,
3F905C1D3D3A0C9E13E7A0BC /* Pods_JellyfinPlayer_iOS.framework */,
EBFE1F64394BCC2EFFF1610D /* Pods_JellyfinPlayer_tvOS.framework */,
86BAC42C3764D232C8DF8F5E /* Pods_JellyfinPlayer_iOS.framework */,
4BE2D324B040DCA2629C110D /* Pods_JellyfinPlayer_tvOS.framework */,
59AFF849629F3C787909A911 /* Pods_WidgetExtension.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@ -1140,10 +1147,12 @@
C78797A232E2B8774099D1E9 /* Pods */ = {
isa = PBXGroup;
children = (
3773C07648173CE7FEC083D5 /* Pods-JellyfinPlayer iOS.debug.xcconfig */,
BEEC50E7EFD4848C0E320941 /* Pods-JellyfinPlayer iOS.release.xcconfig */,
DE5004F745B19E28744A7DE7 /* Pods-JellyfinPlayer tvOS.debug.xcconfig */,
D79953919FED0C4DF72BA578 /* Pods-JellyfinPlayer tvOS.release.xcconfig */,
772F6DAB8534FD1DB45B7687 /* Pods-JellyfinPlayer iOS.debug.xcconfig */,
14E199C7BBA98782CAD2F0D4 /* Pods-JellyfinPlayer iOS.release.xcconfig */,
B598C62749E5EFD37280FCC3 /* Pods-JellyfinPlayer tvOS.debug.xcconfig */,
20CA36DDD247EED8D16438A5 /* Pods-JellyfinPlayer tvOS.release.xcconfig */,
4BDCEE3B49CF70A9E9BA3CD8 /* Pods-WidgetExtension.debug.xcconfig */,
FDEDADB92FA8523BC8432E45 /* Pods-WidgetExtension.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@ -1342,12 +1351,12 @@
isa = PBXNativeTarget;
buildConfigurationList = 535870712669D21700D05A09 /* Build configuration list for PBXNativeTarget "JellyfinPlayer tvOS" */;
buildPhases = (
E7370E1AA68C6CB254E46F2C /* [CP] Check Pods Manifest.lock */,
3D0F2756C71CDF6B9EEBD4E0 /* [CP] Check Pods Manifest.lock */,
6286F0A3271C0ABA00C40ED5 /* R.swift */,
5358705C2669D21600D05A09 /* Sources */,
5358705D2669D21600D05A09 /* Frameworks */,
5358705E2669D21600D05A09 /* Resources */,
6AB6F1DD2C8AD942F71C8A32 /* [CP] Embed Pods Frameworks */,
879C22C1CCC48E68C86E904C /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@ -1375,20 +1384,20 @@
isa = PBXNativeTarget;
buildConfigurationList = 5377CC1B263B596B003A4E83 /* Build configuration list for PBXNativeTarget "JellyfinPlayer iOS" */;
buildPhases = (
6435C3C2E610FE34AD537AC1 /* [CP] Check Pods Manifest.lock */,
1C7487D3432E90546DA855B5 /* [CP] Check Pods Manifest.lock */,
6286F09E271C093000C40ED5 /* R.swift */,
5377CBED263B596A003A4E83 /* Sources */,
5377CBEE263B596A003A4E83 /* Frameworks */,
5377CBEF263B596A003A4E83 /* Resources */,
5302F8322658B74800647A2E /* CopyFiles */,
628B95312670CABE0091AF3B /* Embed App Extensions */,
E8DDF21F62DFCE8CE76666BA /* [CP] Embed Pods Frameworks */,
83FD120CA10FD0E91DAD83C9 /* [CP] Copy Pods Resources */,
8D1E0C963DCE6C6F328B3EBB /* [CP] Embed Pods Frameworks */,
DB8CA7C37DF78BEDCE4E37C1 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
628B952C2670CABE0091AF3B /* PBXTargetDependency */,
6264E889273848760081A12A /* PBXTargetDependency */,
);
name = "JellyfinPlayer iOS";
packageProductDependencies = (
@ -1412,6 +1421,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 628B952E2670CABE0091AF3B /* Build configuration list for PBXNativeTarget "WidgetExtension" */;
buildPhases = (
D4D3981ADF75BCD341D590C0 /* [CP] Check Pods Manifest.lock */,
628B951C2670CABD0091AF3B /* Sources */,
628B951D2670CABD0091AF3B /* Frameworks */,
628B951E2670CABD0091AF3B /* Resources */,
@ -1586,6 +1596,50 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
1C7487D3432E90546DA855B5 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-JellyfinPlayer iOS-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
3D0F2756C71CDF6B9EEBD4E0 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-JellyfinPlayer tvOS-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
6286F09E271C093000C40ED5 /* R.swift */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -1626,29 +1680,7 @@
shellPath = /bin/sh;
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nif [ $ACTION != \"indexbuild\" ]; then\n \"$PODS_ROOT/R.swift/rswift\" generate \"$SRCROOT/Shared/Generated/R.generated.swift\" --generators string\nfi\n";
};
6435C3C2E610FE34AD537AC1 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-JellyfinPlayer iOS-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
6AB6F1DD2C8AD942F71C8A32 /* [CP] Embed Pods Frameworks */ = {
879C22C1CCC48E68C86E904C /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@ -1665,46 +1697,7 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JellyfinPlayer tvOS/Pods-JellyfinPlayer tvOS-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
83FD120CA10FD0E91DAD83C9 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS-resources.sh\"\n";
showEnvVarsInLog = 0;
};
E7370E1AA68C6CB254E46F2C /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-JellyfinPlayer tvOS-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
E8DDF21F62DFCE8CE76666BA /* [CP] Embed Pods Frameworks */ = {
8D1E0C963DCE6C6F328B3EBB /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@ -1721,6 +1714,45 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
D4D3981ADF75BCD341D590C0 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-WidgetExtension-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
DB8CA7C37DF78BEDCE4E37C1 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JellyfinPlayer iOS/Pods-JellyfinPlayer iOS-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@ -1985,6 +2017,7 @@
files = (
53649AB3269D3F5B00A2D8B7 /* LogManager.swift in Sources */,
E13DD3CB27164BA8009D4DAF /* UIDeviceExtensions.swift in Sources */,
6264E88A27384A6F0081A12A /* NetworkError.swift in Sources */,
E19169D0272514760085832A /* HTTPScheme.swift in Sources */,
6267B3D726710B9700A7371D /* CollectionExtensions.swift in Sources */,
628B953C2670D2430091AF3B /* StringExtensions.swift in Sources */,
@ -1995,11 +2028,11 @@
E1AD105426D97161003E4A08 /* BaseItemDtoExtensions.swift in Sources */,
E1FCD09A26C4F35A007C8DCF /* ErrorMessage.swift in Sources */,
628B95272670CABD0091AF3B /* NextUpWidget.swift in Sources */,
62167B882738411700167ECE /* R.generated.swift in Sources */,
E13DD3F72717E87D009D4DAF /* SwiftfinNotificationCenter.swift in Sources */,
E1D4BF8D2719F3A300A11E64 /* VideoPlayerJumpLength.swift in Sources */,
6220D0AF26D5EABE00B8E046 /* ViewExtensions.swift in Sources */,
E13DD3D7271693CD009D4DAF /* SwiftfinStoreDefaults.swift in Sources */,
E1FCD09926C4F358007C8DCF /* NetworkError.swift in Sources */,
E131691926C583BC0074BFEE /* LogConstructor.swift in Sources */,
E13DD3CA27164B80009D4DAF /* SwiftfinStore.swift in Sources */,
62EC353226766849000E9F2D /* SessionManager.swift in Sources */,
@ -2011,10 +2044,10 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
628B952C2670CABE0091AF3B /* PBXTargetDependency */ = {
6264E889273848760081A12A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 628B951F2670CABD0091AF3B /* WidgetExtension */;
targetProxy = 628B952B2670CABE0091AF3B /* PBXContainerItemProxy */;
targetProxy = 6264E888273848760081A12A /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@ -2152,7 +2185,7 @@
/* Begin XCBuildConfiguration section */
535870722669D21700D05A09 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = DE5004F745B19E28744A7DE7 /* Pods-JellyfinPlayer tvOS.debug.xcconfig */;
baseConfigurationReference = B598C62749E5EFD37280FCC3 /* Pods-JellyfinPlayer tvOS.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = "Dev App Icon & Top Shelf Image";
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
@ -2182,7 +2215,7 @@
};
535870732669D21700D05A09 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D79953919FED0C4DF72BA578 /* Pods-JellyfinPlayer tvOS.release.xcconfig */;
baseConfigurationReference = 20CA36DDD247EED8D16438A5 /* Pods-JellyfinPlayer tvOS.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
@ -2332,7 +2365,7 @@
};
5377CC1C263B596B003A4E83 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 3773C07648173CE7FEC083D5 /* Pods-JellyfinPlayer iOS.debug.xcconfig */;
baseConfigurationReference = 772F6DAB8534FD1DB45B7687 /* Pods-JellyfinPlayer iOS.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-Dev";
@ -2368,7 +2401,7 @@
};
5377CC1D263B596B003A4E83 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = BEEC50E7EFD4848C0E320941 /* Pods-JellyfinPlayer iOS.release.xcconfig */;
baseConfigurationReference = 14E199C7BBA98782CAD2F0D4 /* Pods-JellyfinPlayer iOS.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
@ -2404,6 +2437,7 @@
};
628B952F2670CABE0091AF3B /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4BDCEE3B49CF70A9E9BA3CD8 /* Pods-WidgetExtension.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
@ -2430,6 +2464,7 @@
};
628B95302670CABE0091AF3B /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = FDEDADB92FA8523BC8432E45 /* Pods-WidgetExtension.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;

View File

@ -75,7 +75,7 @@ struct PortraitItemView: View {
.font(.caption)
.fontWeight(.medium)
} else {
Text("S\(String(item.parentIndexNumber ?? 0)):E\(String(item.indexNumber ?? 0))")
Text(R.string.localizable.seasonAndEpisode(String(item.parentIndexNumber ?? 0), String(item.indexNumber ?? 0))
.foregroundColor(.secondary)
.font(.caption)
.fontWeight(.medium)

View File

@ -23,7 +23,7 @@ struct BasicAppSettingsView: View {
var body: some View {
Form {
Section {
Picker(NSLocalizedString("Appearance", comment: ""), selection: $appAppearance) {
Picker(R.string.localizable.appearance(), selection: $appAppearance) {
ForEach(self.viewModel.appearances, id: \.self) { appearance in
Text(appearance.localizedName).tag(appearance.rawValue)
}
@ -31,7 +31,7 @@ struct BasicAppSettingsView: View {
UIApplication.shared.windows.first?.overrideUserInterfaceStyle = appAppearance.style
})
} header: {
Text("Accessibility")
R.string.localizable.accessibility.text
}
Section {
@ -47,15 +47,15 @@ struct BasicAppSettingsView: View {
Button {
resetTapped = true
} label: {
Text("Reset")
R.string.localizable.reset.text
}
}
.alert("Reset", isPresented: $resetTapped, actions: {
.alert(R.string.localizable.reset(), isPresented: $resetTapped, actions: {
Button(role: .destructive) {
viewModel.reset()
basicAppSettingsRouter.dismissCoordinator()
} label: {
Text("Reset")
R.string.localizable.reset.text
}
})
.navigationBarTitle("Settings", displayMode: .inline)

View File

@ -20,7 +20,7 @@ struct ConnectToServerView: View {
var body: some View {
List {
Section {
TextField(NSLocalizedString("Server URL", comment: ""), text: $uri)
TextField(R.string.localizable.serverURL(), text: $uri)
.disableAutocorrection(true)
.autocapitalization(.none)
.keyboardType(.URL)
@ -40,7 +40,7 @@ struct ConnectToServerView: View {
Button {
viewModel.connectToServer(uri: uri)
} label: {
Text("Connect")
R.string.localizable.connect.text
}
.disabled(uri.isEmpty)
}
@ -88,7 +88,7 @@ struct ConnectToServerView: View {
}
} header: {
HStack {
Text("Local Servers")
R.string.localizable.localServers.text
Spacer()
Button {
@ -106,7 +106,7 @@ struct ConnectToServerView: View {
message: Text(viewModel.errorMessage?.displayMessage ?? "Unknown Error"),
dismissButton: .cancel())
}
.navigationTitle("Connect")
.navigationTitle(R.string.localizable.connect())
.onAppear {
viewModel.discoverServers()
AppURLHandler.shared.appURLState = .allowedInLogin

View File

@ -34,7 +34,7 @@ struct HomeView: View {
ForEach(viewModel.libraries, id: \.self) { library in
HStack {
Text("Latest \(library.name ?? "")")
Text(R.string.localizable.latestWithString(library.name ?? ""))
.font(.title2)
.fontWeight(.bold)
Spacer()
@ -45,7 +45,7 @@ struct HomeView: View {
title: library.name ?? ""))
} label: {
HStack {
Text("See All").font(.subheadline).fontWeight(.bold)
R.string.localizable.seeAll.text.font(.subheadline).fontWeight(.bold)
Image(systemName: "chevron.right").font(Font.subheadline.bold())
}
}
@ -70,7 +70,7 @@ struct HomeView: View {
var body: some View {
innerBody
.navigationTitle(NSLocalizedString("Home", comment: ""))
.navigationTitle(R.string.localizable.home())
.toolbar {
ToolbarItemGroup(placement: .navigationBarTrailing) {
Button {

View File

@ -29,7 +29,7 @@ struct ItemViewBody: View {
PortraitImageHStackView(items: seriesViewModel.seasons,
maxWidth: 150,
topBarView: {
Text("Seasons")
R.string.localizable.seasons.text
.font(.callout)
.fontWeight(.semibold)
.padding(.top, 3)
@ -41,7 +41,7 @@ struct ItemViewBody: View {
// MARK: Genres
PillHStackView(title: "Genres",
PillHStackView(title: R.string.localizable.genres(),
items: viewModel.item.genreItems ?? [],
selectedAction: { genre in
itemRouter.route(to: \.library, (viewModel: .init(genre: genre), title: genre.title))
@ -50,7 +50,7 @@ struct ItemViewBody: View {
// MARK: Studios
if let studios = viewModel.item.studios {
PillHStackView(title: "Studios",
PillHStackView(title: R.string.localizable.studios(),
items: studios) { studio in
itemRouter.route(to: \.library, (viewModel: .init(studio: studio), title: studio.name ?? ""))
}
@ -79,7 +79,7 @@ struct ItemViewBody: View {
PortraitImageHStackView(items: viewModel.similarItems,
maxWidth: 150,
topBarView: {
Text("More Like This")
R.string.localizable.moreLikeThis.text
.font(.callout)
.fontWeight(.semibold)
.padding(.top, 3)

View File

@ -31,32 +31,32 @@ struct LibraryFilterView: View {
} else {
Form {
if viewModel.enabledFilterType.contains(.genre) {
MultiSelector(label: NSLocalizedString("Genres", comment: ""),
MultiSelector(label: R.string.localizable.genres(),
options: viewModel.possibleGenres,
optionToString: { $0.name ?? "" },
selected: $viewModel.modifiedFilters.withGenres)
}
if viewModel.enabledFilterType.contains(.filter) {
MultiSelector(label: NSLocalizedString("Filters", comment: ""),
MultiSelector(label: R.string.localizable.filters(),
options: viewModel.possibleItemFilters,
optionToString: { $0.localized },
selected: $viewModel.modifiedFilters.filters)
}
if viewModel.enabledFilterType.contains(.tag) {
MultiSelector(label: NSLocalizedString("Tags", comment: ""),
MultiSelector(label: R.string.localizable.tags(),
options: viewModel.possibleTags,
optionToString: { $0 },
selected: $viewModel.modifiedFilters.tags)
}
if viewModel.enabledFilterType.contains(.sortBy) {
Picker(selection: $viewModel.selectedSortBy, label: Text("Sort by")) {
Picker(selection: $viewModel.selectedSortBy, label: R.string.localizable.sortBy.text) {
ForEach(viewModel.possibleSortBys, id: \.self) { so in
Text(so.localized).tag(so)
}
}
}
if viewModel.enabledFilterType.contains(.sortOrder) {
Picker(selection: $viewModel.selectedSortOrder, label: Text("Display order")) {
Picker(selection: $viewModel.selectedSortOrder, label: R.string.localizable.displayOrder.text) {
ForEach(viewModel.possibleSortOrders, id: \.self) { so in
Text(so.rawValue).tag(so)
}
@ -68,11 +68,11 @@ struct LibraryFilterView: View {
self.filters = viewModel.modifiedFilters
filterRouter.dismissCoordinator()
} label: {
Text("Reset")
R.string.localizable.reset.text
}
}
}
.navigationBarTitle(NSLocalizedString("Filter Results", comment: ""), displayMode: .inline)
.navigationBarTitle(R.string.localizable.filterResults(), displayMode: .inline)
.toolbar {
ToolbarItemGroup(placement: .navigationBarLeading) {
Button {
@ -87,7 +87,7 @@ struct LibraryFilterView: View {
self.filters = viewModel.modifiedFilters
filterRouter.dismissCoordinator()
} label: {
Text("Apply")
R.string.localizable.apply.text
}
}
}

View File

@ -23,7 +23,7 @@ struct LibraryListView: View {
ZStack {
HStack {
Spacer()
Text("Your Favorites")
R.string.localizable.yourFavorites.text
.foregroundColor(.black)
.font(.subheadline)
.fontWeight(.semibold)
@ -39,12 +39,12 @@ struct LibraryListView: View {
.padding(.bottom, 5)
NavigationLink(destination: LazyView {
Text("WIP")
R.string.localizable.wip.text
}) {
ZStack {
HStack {
Spacer()
Text("All Genres")
R.string.localizable.allGenres.text
.foregroundColor(.black)
.font(.subheadline)
.fontWeight(.semibold)
@ -98,7 +98,7 @@ struct LibraryListView: View {
.padding(.trailing, 16)
.padding(.top, 8)
}
.navigationTitle(NSLocalizedString("All Media", comment: ""))
.navigationTitle(R.string.localizable.allMedia())
.toolbar {
ToolbarItemGroup(placement: .navigationBarTrailing) {
Button {

View File

@ -46,7 +46,7 @@ struct LibrarySearchView: View {
var suggestionsListView: some View {
ScrollView {
LazyVStack(spacing: 8) {
Text("Suggestions")
R.string.localizable.suggestions.text
.font(.headline)
.fontWeight(.bold)
.foregroundColor(.primary)

View File

@ -55,7 +55,7 @@ struct LibraryView: View {
Image(systemName: "chevron.left")
.font(.system(size: 25))
}.disabled(!viewModel.hasPreviousPage)
Text("Page \(String(viewModel.currentPage + 1)) of \(String(viewModel.totalPages))")
Text(R.string.localizable.pageOfWithNumbers(String(viewModel.currentPage + 1), String(viewModel.totalPages)))
.font(.subheadline)
.fontWeight(.medium)
Button {
@ -72,7 +72,7 @@ struct LibraryView: View {
}
}
} else {
Text("No results.")
R.string.localizable.noResults.text
}
}
.navigationBarTitle(title, displayMode: .inline)

View File

@ -32,7 +32,7 @@ struct LoadingView<Content>: View where Content: View {
// indicator, with some text underneath showing what we are doing
HStack {
ProgressView()
Text(text ?? "Loading").fontWeight(.semibold).font(.callout).offset(x: 60)
Text(text ?? R.string.localizable.loading()).fontWeight(.semibold).font(.callout).offset(x: 60)
Spacer()
}
.padding(EdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 10))
@ -70,7 +70,7 @@ struct LoadingViewNoBlur<Content>: View where Content: View {
// indicator, with some text underneath showing what we are doing
HStack {
ProgressView()
Text(text ?? "Loading").fontWeight(.semibold).font(.callout).offset(x: 60)
Text(text ?? R.string.localizable.loading()).fontWeight(.semibold).font(.callout).offset(x: 60)
Spacer()
}
.padding(EdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 10))

View File

@ -17,7 +17,7 @@ struct NextUpView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Next Up")
R.string.localizable.nextUp.text
.font(.title2)
.fontWeight(.bold)
.padding(.leading, 16)

View File

@ -81,7 +81,7 @@ struct ServerListView: View {
.padding(.horizontal, 30)
.padding([.top, .bottom], 20)
Text("Connect")
R.string.localizable.connect.text
.foregroundColor(Color.white)
.bold()
}

View File

@ -108,7 +108,7 @@ struct SettingsView: View {
}
}
Section(header: Text("Accessibility")) {
Section(header: R.string.localizable.accessibility.text) {
Toggle("Automatically show subtitles", isOn: $isAutoSelectSubtitles)
SearchablePicker(label: "Preferred subtitle language",
options: viewModel.langs,
@ -129,7 +129,7 @@ struct SettingsView: View {
.auto
},
set: { autoSelectAudioLangcode = $0.isoCode }))
Picker(NSLocalizedString("Appearance", comment: ""), selection: $appAppearance) {
Picker(R.string.localizable.appearance(), selection: $appAppearance) {
ForEach(self.viewModel.appearances, id: \.self) { appearance in
Text(appearance.localizedName).tag(appearance.rawValue)
}

View File

@ -20,11 +20,11 @@ struct UserSignInView: View {
Form {
Section {
TextField("Username", text: $username)
TextField(R.string.localizable.username(), text: $username)
.disableAutocorrection(true)
.autocapitalization(.none)
SecureField("Password", text: $password)
SecureField(R.string.localizable.password(), text: $password)
.disableAutocorrection(true)
.autocapitalization(.none)

View File

@ -421,7 +421,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
if manifest.type == "Movie" {
titleLabel.text = manifest.name ?? ""
} else {
titleLabel.text = "S\(String(manifest.parentIndexNumber ?? 0)):E\(String(manifest.indexNumber ?? 0))\(manifest.name ?? "")"
titleLabel.text = "\(R.string.localizable.seasonAndEpisode(String(manifest.parentIndexNumber ?? 0), String(manifest.indexNumber ?? 0)))\(manifest.name ?? "")"
setupNextUpView()
upNextViewModel.delegate = self
@ -816,7 +816,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
shouldShowLoadingScreen = true
videoControlsView.isHidden = true
titleLabel.text = "S\(String(manifest.parentIndexNumber ?? 0)):E\(String(manifest.indexNumber ?? 0))\(manifest.name ?? "")"
titleLabel.text = "\(R.string.localizable.seasonAndEpisode(String(manifest.parentIndexNumber ?? 0), String(manifest.indexNumber ?? 0)))\(manifest.name ?? "")"
setupMediaPlayer()
getNextEpisode()

View File

@ -56,7 +56,7 @@ struct VideoPlayerCastDeviceSelector: View {
delegate?.castPopoverDismissed()
} label: {
HStack {
Text("Connect")
R.string.localizable.connect.text
.font(.caption)
.fontWeight(.medium)
Image(systemName: "bonjour")
@ -66,14 +66,14 @@ struct VideoPlayerCastDeviceSelector: View {
}
}
} else {
Text("No Cast devices found..")
R.string.localizable.noCastdevicesfound.text
.foregroundColor(.secondary)
.font(.subheadline)
.fontWeight(.medium)
}
}
.navigationBarTitleDisplayMode(.inline)
.navigationTitle(NSLocalizedString("Select Cast Destination", comment: ""))
.navigationTitle(R.string.localizable.selectCastDestination())
.toolbar {
ToolbarItemGroup(placement: .navigationBarLeading) {
if UIDevice.current.userInterfaceIdiom == .phone {
@ -82,7 +82,7 @@ struct VideoPlayerCastDeviceSelector: View {
} label: {
HStack {
Image(systemName: "chevron.left")
Text("Back").font(.callout)
R.string.localizable.back.text.font(.callout)
}
}
}

View File

@ -40,7 +40,7 @@ struct VideoPlayerSettings: View {
var body: some View {
Form {
Picker(NSLocalizedString("Closed Captions", comment: ""), selection: $captionTrack) {
Picker(R.string.localizable.closedCaptions(), selection: $captionTrack) {
ForEach(delegate.subtitleTrackArray, id: \.id) { caption in
Text(caption.name).tag(caption.id)
}
@ -48,14 +48,14 @@ struct VideoPlayerSettings: View {
.onChange(of: captionTrack) { track in
self.delegate.subtitleTrackChanged(newTrackID: track)
}
Picker(NSLocalizedString("Audio Track", comment: ""), selection: $audioTrack) {
Picker(R.string.localizable.audioTrack(), selection: $audioTrack) {
ForEach(delegate.audioTrackArray, id: \.id) { caption in
Text(caption.name).tag(caption.id).lineLimit(1)
}
}.onChange(of: audioTrack) { track in
self.delegate.audioTrackChanged(newTrackID: track)
}
Picker(NSLocalizedString("Playback Speed", comment: ""), selection: $playbackSpeedSelection) {
Picker(R.string.localizable.playbackSpeed(), selection: $playbackSpeedSelection) {
ForEach(delegate.playbackSpeeds.indices, id: \.self) { speedIndex in
let speed = delegate.playbackSpeeds[speedIndex]
Text("\(String(speed))x").tag(speedIndex)
@ -65,7 +65,7 @@ struct VideoPlayerSettings: View {
self.delegate.playbackSpeedChanged(index: index)
})
}.navigationBarTitleDisplayMode(.inline)
.navigationTitle(NSLocalizedString("Audio & Captions", comment: ""))
.navigationTitle(R.string.localizable.audioAndCaptions())
.toolbar {
ToolbarItemGroup(placement: .navigationBarLeading) {
if UIDevice.current.userInterfaceIdiom == .phone {
@ -74,7 +74,7 @@ struct VideoPlayerSettings: View {
} label: {
HStack {
Image(systemName: "chevron.left")
Text("Back").font(.callout)
R.string.localizable.back.text.font(.callout)
}
}
}

View File

@ -32,7 +32,7 @@ struct VideoUpNextView: View {
} label: {
HStack {
VStack {
Text("Play Next")
R.string.localizable.playNext.text
.foregroundColor(.white)
.font(.subheadline)
.fontWeight(.semibold)

View File

@ -26,7 +26,7 @@ final class MainTabCoordinator: TabCoordinatable {
@ViewBuilder func makeHomeTab(isActive: Bool) -> some View {
Image(systemName: "house")
Text("Home")
R.string.localizable.home.text
}
func makeAllMedia() -> NavigationViewCoordinator<LibraryListCoordinator> {
@ -35,7 +35,7 @@ final class MainTabCoordinator: TabCoordinatable {
@ViewBuilder func makeAllMediaTab(isActive: Bool) -> some View {
Image(systemName: "folder")
Text("All Media")
R.string.localizable.allMedia.text
}
@ViewBuilder func customize(_ view: AnyView) -> some View {

View File

@ -33,7 +33,7 @@ final class MainTabCoordinator: TabCoordinatable {
@ViewBuilder func makeHomeTab(isActive: Bool) -> some View {
HStack {
Image(systemName: "house")
Text("Home")
R.string.localizable.home.text
}
}

View File

@ -85,13 +85,13 @@ enum NetworkError: Error {
logMessage = "Cannot connect to host."
logConstructor.message = logMessage
errorMessage = ErrorMessage(code: err._code,
title: "Error",
title: R.string.localizable.error(),
displayMessage: displayMessage,
logConstructor: logConstructor)
default:
logConstructor.message = logMessage
errorMessage = ErrorMessage(code: err._code,
title: "Error",
title: R.string.localizable.error(),
displayMessage: displayMessage,
logConstructor: logConstructor)
}
@ -111,7 +111,7 @@ enum NetworkError: Error {
case .error:
logConstructor.message = logMessage
errorMessage = ErrorMessage(code: 0,
title: "Error",
title: R.string.localizable.error(),
displayMessage: displayMessage,
logConstructor: logConstructor)
}
@ -140,7 +140,7 @@ enum NetworkError: Error {
default:
logConstructor.message = logMessage
errorMessage = ErrorMessage(code: code,
title: "Error",
title: R.string.localizable.error(),
displayMessage: displayMessage,
logConstructor: logConstructor)
}

View File

@ -80,7 +80,7 @@ public extension BaseItemDto {
func getEpisodeLocator() -> String? {
if let seasonNo = parentIndexNumber, let episodeNo = indexNumber {
return "S\(seasonNo):E\(episodeNo)"
return R.string.localizable.seasonAndEpisode(String(seasonNo), String(episodeNo))
}
return nil
}

View File

@ -16,7 +16,14 @@ enum AppAppearance: String, CaseIterable, Defaults.Serializable {
case light
var localizedName: String {
return NSLocalizedString(self.rawValue.capitalized, comment: "")
switch self {
case .system:
return R.string.localizable.system()
case .dark:
return R.string.localizable.dark()
case .light:
return R.string.localizable.light()
}
}
var style: UIUserInterfaceStyle {

View File

@ -77,7 +77,7 @@ enum ItemType: String {
var localized: String {
switch self {
case .episode:
return "Episodes"
return R.string.localizable.episodes()
case .movie:
return "Movies"
case .series:

View File

@ -35,7 +35,7 @@ class ItemViewModel: ViewModel {
}
func playButtonText() -> String {
return item.getItemProgressString() == "" ? "Play" : item.getItemProgressString()
return item.getItemProgressString() == "" ? R.string.localizable.play() : item.getItemProgressString()
}
func getItemDisplayName() -> String {

View File

@ -24,8 +24,8 @@ final class SeasonItemViewModel: ItemViewModel {
}
override func playButtonText() -> String {
guard let playButtonItem = playButtonItem else { return "Play" }
guard let episodeLocator = playButtonItem.getEpisodeLocator() else { return "Play" }
guard let playButtonItem = playButtonItem else { return R.string.localizable.play() }
guard let episodeLocator = playButtonItem.getEpisodeLocator() else { return R.string.localizable.play() }
return episodeLocator
}

View File

@ -23,8 +23,8 @@ final class SeriesItemViewModel: ItemViewModel {
}
override func playButtonText() -> String {
guard let playButtonItem = playButtonItem else { return "Play" }
guard let episodeLocator = playButtonItem.getEpisodeLocator() else { return "Play" }
guard let playButtonItem = playButtonItem else { return R.string.localizable.play() }
guard let episodeLocator = playButtonItem.getEpisodeLocator() else { return R.string.localizable.play() }
return episodeLocator
}

View File

@ -16,7 +16,7 @@ struct SearchBar: View {
var body: some View {
HStack(spacing: 8) {
TextField(NSLocalizedString("Search...", comment: ""), text: $text)
TextField(R.string.localizable.search(), text: $text)
.padding(8)
.padding(.horizontal, 16)
#if os(iOS)

View File

@ -24,9 +24,8 @@ struct NextUpWidgetProvider: TimelineProvider {
}
func getSnapshot(in context: Context, completion: @escaping (NextUpEntry) -> Void) {
guard let currentLogin = SessionManager.main.currentLogin else { return }
let currentDate = Date()
let server = currentLogin.server
let savedUser = currentLogin.user
@ -68,9 +67,8 @@ struct NextUpWidgetProvider: TimelineProvider {
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
guard let currentLogin = SessionManager.main.currentLogin else { return }
let currentDate = Date()
let entryDate = Calendar.current.date(byAdding: .hour, value: 1, to: currentDate)!
let server = currentLogin.server
@ -137,7 +135,7 @@ struct NextUpEntryView: View {
}
.background(Color.blue)
} else if entry.items.isEmpty {
Text("Empty Next Up")
R.string.localizable.emptyNextUp()
.font(.body)
.bold()
.foregroundColor(.primary)
@ -216,7 +214,7 @@ extension NextUpEntryView {
.fontWeight(.semibold)
.foregroundColor(.primary)
.lineLimit(1)
Text("\(item.0.name ?? "") · S\(item.0.parentIndexNumber ?? 0):E\(item.0.indexNumber ?? 0)")
Text("\(item.0.name ?? "") · \(R.string.localizable.seasonAndEpisode(String(item.0.parentIndexNumber ?? 0), String(item.0.indexNumber ?? 0)))")
.font(.caption)
.fontWeight(.semibold)
.foregroundColor(.secondary)
@ -243,7 +241,8 @@ extension NextUpEntryView {
.fontWeight(.semibold)
.foregroundColor(.primary)
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
Text("\(item.0.name ?? "") · S\(item.0.parentIndexNumber ?? 0):E\(item.0.indexNumber ?? 0)")
Text("\(item.0.name ?? "") · \(R.string.localizable.seasonAndEpisode(String(item.0.parentIndexNumber ?? 0), String(item.0.indexNumber ?? 0)))")
.font(.caption)
.fontWeight(.semibold)
.foregroundColor(.secondary)
@ -305,7 +304,7 @@ extension NextUpEntryView {
.fontWeight(.semibold)
.foregroundColor(.white)
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
Text("\(firstItem.0.name ?? "") · S\(firstItem.0.parentIndexNumber ?? 0):E\(firstItem.0.indexNumber ?? 0)")
Text("\(firstItem.0.name ?? "") · \(R.string.localizable.seasonAndEpisode(String(firstItem.0.parentIndexNumber ?? 0), String(firstItem.0.indexNumber ?? 0)))")
.font(.caption)
.fontWeight(.semibold)
.foregroundColor(.gray)
@ -347,7 +346,7 @@ struct NextUpWidget: Widget {
provider: NextUpWidgetProvider()) { entry in
NextUpEntryView(entry: entry)
}
.configurationDisplayName("Next Up")
.configurationDisplayName(R.string.localizable.nextUp())
.description("Keep watching where you left off or see what's up next.")
.supportedFamilies([.systemSmall, .systemMedium, .systemLarge])
}