From 9d95e7d2103821e16f16a04b1f93db5e04f25650 Mon Sep 17 00:00:00 2001 From: Christoph Hagen Date: Tue, 7 Jan 2025 11:26:59 +0100 Subject: [PATCH] Add empty page text, playlist text to settings --- CHDataManagement.xcodeproj/project.pbxproj | 16 ++++++++++ .../Commands/AudioPlayerCommand.swift | 8 ++++- .../Page Generators/PageGenerator.swift | 17 +++------- .../Post Lists/FeedGeneratorSource.swift | 6 ++-- .../Post Lists/PostListPageGenerator.swift | 2 +- .../Model/Settings/AudioPlayerSettings.swift | 26 ++++++++++++++-- .../LocalizedAudioPlayerSettings.swift | 19 ++++++++++++ .../Settings/LocalizedPageSettings.swift | 27 ++++++++++++++++ .../Model/Settings/PageSettings.swift | 16 +++++++++- .../Model/Settings/PostSettings.swift | 31 +++++++++++++++++-- .../Model/Settings/Settings.swift | 31 ++----------------- .../AudioPlayer/AudioPlayer.swift | 4 ++- .../Preview Content/WebsiteData+Mock.swift | 7 ----- .../Settings/AudioPlayerSettingsFile.swift | 13 ++++++++ .../Settings/LocalizedPageSettingsFile.swift | 23 ++++++++++++++ .../Model/Settings/PageSettingsFile.swift | 12 ++++++- .../Model/Settings/PostSettingsFile.swift | 8 ++++- .../Storage/Model/Settings/SettingsFile.swift | 8 +---- .../Settings/AudioSettingsDetailView.swift | 16 ++++++++++ .../Views/Settings/GenerationDetailView.swift | 4 +-- .../Settings/LocalizedPageSettingsView.swift | 21 +++++++++++++ .../Settings/PageSettingsDetailView.swift | 25 ++++++++------- .../Views/Settings/PostFeedSettingsView.swift | 20 ++++++------ 23 files changed, 266 insertions(+), 94 deletions(-) create mode 100644 CHDataManagement/Model/Settings/LocalizedAudioPlayerSettings.swift create mode 100644 CHDataManagement/Model/Settings/LocalizedPageSettings.swift create mode 100644 CHDataManagement/Storage/Model/Settings/LocalizedPageSettingsFile.swift create mode 100644 CHDataManagement/Views/Settings/LocalizedPageSettingsView.swift diff --git a/CHDataManagement.xcodeproj/project.pbxproj b/CHDataManagement.xcodeproj/project.pbxproj index 184a372..ab18bb4 100644 --- a/CHDataManagement.xcodeproj/project.pbxproj +++ b/CHDataManagement.xcodeproj/project.pbxproj @@ -243,6 +243,10 @@ E2FE0F622D2C0D8D002963B7 /* VersionedVideo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F612D2C0D8D002963B7 /* VersionedVideo.swift */; }; E2FE0F642D2C2F4D002963B7 /* ButtonBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F632D2C2F46002963B7 /* ButtonBlock.swift */; }; E2FE0F662D2C3B3A002963B7 /* LabelsBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F652D2C3B33002963B7 /* LabelsBlock.swift */; }; + E2FE0F682D2D2CF6002963B7 /* LocalizedPageSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F672D2D2CF0002963B7 /* LocalizedPageSettings.swift */; }; + E2FE0F6A2D2D2D55002963B7 /* LocalizedPageSettingsFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F692D2D2D4F002963B7 /* LocalizedPageSettingsFile.swift */; }; + E2FE0F6C2D2D335E002963B7 /* LocalizedPageSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F6B2D2D3358002963B7 /* LocalizedPageSettingsView.swift */; }; + E2FE0F6E2D2D3689002963B7 /* LocalizedAudioPlayerSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F6D2D2D3685002963B7 /* LocalizedAudioPlayerSettings.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -477,6 +481,10 @@ E2FE0F612D2C0D8D002963B7 /* VersionedVideo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionedVideo.swift; sourceTree = ""; }; E2FE0F632D2C2F46002963B7 /* ButtonBlock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonBlock.swift; sourceTree = ""; }; E2FE0F652D2C3B33002963B7 /* LabelsBlock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelsBlock.swift; sourceTree = ""; }; + E2FE0F672D2D2CF0002963B7 /* LocalizedPageSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedPageSettings.swift; sourceTree = ""; }; + E2FE0F692D2D2D4F002963B7 /* LocalizedPageSettingsFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedPageSettingsFile.swift; sourceTree = ""; }; + E2FE0F6B2D2D3358002963B7 /* LocalizedPageSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedPageSettingsView.swift; sourceTree = ""; }; + E2FE0F6D2D2D3685002963B7 /* LocalizedAudioPlayerSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedAudioPlayerSettings.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -534,6 +542,7 @@ E25DA5372D00420D00AEF16D /* LocalizedPostSettingsFile.swift */, E25DA5352D0041E200AEF16D /* PostSettingsFile.swift */, E25DA5922D023B3600AEF16D /* PageSettingsFile.swift */, + E2FE0F692D2D2D4F002963B7 /* LocalizedPageSettingsFile.swift */, E21850342CFAFA570090B18B /* SettingsFile.swift */, E22990212D0ED129009F8D77 /* TagOverviewFile.swift */, ); @@ -544,10 +553,12 @@ isa = PBXGroup; children = ( E2FE0F392D2B3E4E002963B7 /* AudioPlayerSettings.swift */, + E2FE0F6D2D2D3685002963B7 /* LocalizedAudioPlayerSettings.swift */, E2FE0F012D266FCB002963B7 /* LocalizedNavigationSettings.swift */, E21850362CFCA5580090B18B /* LocalizedPostSettings.swift */, E2FE0EFB2D266D18002963B7 /* NavigationSettings.swift */, E25DA58E2D02368A00AEF16D /* PageSettings.swift */, + E2FE0F672D2D2CF0002963B7 /* LocalizedPageSettings.swift */, E29D31952D0C18690051B7F4 /* PathSettings.swift */, E25DA5402D00446700AEF16D /* PostSettings.swift */, E21850322CFAFA200090B18B /* Settings.swift */, @@ -673,6 +684,7 @@ E29D316E2D0822720051B7F4 /* SettingsListView.swift */, E29D31702D08234D0051B7F4 /* GenerationDetailView.swift */, E25DA5942D023BCC00AEF16D /* PageSettingsDetailView.swift */, + E2FE0F6B2D2D3358002963B7 /* LocalizedPageSettingsView.swift */, E25DA5442D00952D00AEF16D /* SettingsSection.swift */, E2A21C352CB9A3D70060935B /* PathSettingsView.swift */, E25DA56C2D00EBC900AEF16D /* NavigationBarSettingsView.swift */, @@ -1117,6 +1129,7 @@ E29D31AD2D0DA5360051B7F4 /* AudioPlayerIcons.swift in Sources */, E25DA5452D00952E00AEF16D /* SettingsSection.swift in Sources */, E2A21C462CBAE2E60060935B /* FeedEntryContent.swift in Sources */, + E2FE0F682D2D2CF6002963B7 /* LocalizedPageSettings.swift in Sources */, E2A37D1D2CEA922D0000979F /* LocalizedPost.swift in Sources */, E21850172CEE55FC0090B18B /* FileType.swift in Sources */, E2FE0F042D267206002963B7 /* LocalizedNavigationBarSettingsView.swift in Sources */, @@ -1126,12 +1139,14 @@ E242520A2C52C9260029FF16 /* ContentLanguage.swift in Sources */, E2B85F452C429ED60047CD0C /* ImageGallery.swift in Sources */, E2B85F3B2C428F0E0047CD0C /* Post.swift in Sources */, + E2FE0F6A2D2D2D55002963B7 /* LocalizedPageSettingsFile.swift in Sources */, E29D31852D0AE8EE0051B7F4 /* KnownHeaderElement.swift in Sources */, E25DA51B2CFF08BB00AEF16D /* PostFeedPageNavigation.swift in Sources */, E22990422D107A95009F8D77 /* ImageVersion.swift in Sources */, E29D317F2D086F4C0051B7F4 /* StatisticsIcons.swift in Sources */, E2FE0F282D2AFB11002963B7 /* ImageCompare.swift in Sources */, E229904E2D13535C009F8D77 /* SecurityBookmark.swift in Sources */, + E2FE0F6E2D2D3689002963B7 /* LocalizedAudioPlayerSettings.swift in Sources */, E2A21C082CB17B870060935B /* TagView.swift in Sources */, E29D313D2D047C1B0051B7F4 /* LocalizedPageContentView.swift in Sources */, E2FE0F242D2A8C21002963B7 /* TagDisplayView.swift in Sources */, @@ -1274,6 +1289,7 @@ E2A37D0E2CE527070000979F /* Storage.swift in Sources */, E2E06E002CA4A8F00019C2AF /* Page+Mock.swift in Sources */, E29D314D2D04FCBF0051B7F4 /* FileToAddView.swift in Sources */, + E2FE0F6C2D2D335E002963B7 /* LocalizedPageSettingsView.swift in Sources */, E218502D2CF791440090B18B /* PostImagesView.swift in Sources */, E29D312A2D039B090051B7F4 /* FileDescriptions.swift in Sources */, E2B85F572C4BD0BB0047CD0C /* Binding+Extension.swift in Sources */, diff --git a/CHDataManagement/Generator/Commands/AudioPlayerCommand.swift b/CHDataManagement/Generator/Commands/AudioPlayerCommand.swift index 68cf7c5..f1e9493 100644 --- a/CHDataManagement/Generator/Commands/AudioPlayerCommand.swift +++ b/CHDataManagement/Generator/Commands/AudioPlayerCommand.swift @@ -8,9 +8,12 @@ struct AudioPlayerCommand: CommandProcessor { let results: PageGenerationResults + let language: ContentLanguage + init(content: Content, results: PageGenerationResults, language: ContentLanguage) { self.content = content self.results = results + self.language = language } func process(_ arguments: [String], markdown: Substring) -> String { @@ -104,6 +107,9 @@ struct AudioPlayerCommand: CommandProcessor { .audioPlayerPause ) - return AudioPlayer(playingText: titleText, items: playlist).content + return AudioPlayer( + playlistText: content.settings.audioPlayer.localized(in: language).playlistText, + playingText: titleText, + items: playlist).content } } diff --git a/CHDataManagement/Generator/Page Generators/PageGenerator.swift b/CHDataManagement/Generator/Page Generators/PageGenerator.swift index d151af4..1a2fae4 100644 --- a/CHDataManagement/Generator/Page Generators/PageGenerator.swift +++ b/CHDataManagement/Generator/Page Generators/PageGenerator.swift @@ -19,19 +19,10 @@ final class PageGenerator { } private func makeEmptyPageContent(in language: ContentLanguage) -> String { - #warning("Configure empty page text in settings") - switch language { - case .english: - return ContentBox( - title: "Content not available", - text: "This page is not available yet. Try the German version or check back later.") - .content - case .german: - return ContentBox( - title: "Inhalt nicht verfügbar", - text: "Diese Seite ist noch nicht verfügbar. Versuche die englische Version oder komm später hierher zurück.") - .content - } + let settings = content.settings.pages.localized(in: language) + return ContentBox( + title: settings.emptyPageTitle, + text: settings.emptyPageText).content } func generate(page: Page, language: ContentLanguage, results: PageGenerationResults) -> String? { diff --git a/CHDataManagement/Generator/Post Lists/FeedGeneratorSource.swift b/CHDataManagement/Generator/Post Lists/FeedGeneratorSource.swift index f5716d2..23d8d01 100644 --- a/CHDataManagement/Generator/Post Lists/FeedGeneratorSource.swift +++ b/CHDataManagement/Generator/Post Lists/FeedGeneratorSource.swift @@ -16,18 +16,18 @@ struct FeedGeneratorSource: PostListPageGeneratorSource { } var pageTitle: String { - content.settings.localized(in: language).title + content.settings.posts.localized(in: language).title } var pageDescription: String { - content.settings.localized(in: language).description + content.settings.posts.localized(in: language).description } /** The url to the page, including a leading slash */ func pageUrlPrefix(for language: ContentLanguage) -> String { - let prefix = content.settings.localized(in: language).feedUrlPrefix + let prefix = content.settings.posts.localized(in: language).feedUrlPrefix if prefix.hasPrefix( "/" ) { return prefix } diff --git a/CHDataManagement/Generator/Post Lists/PostListPageGenerator.swift b/CHDataManagement/Generator/Post Lists/PostListPageGenerator.swift index 23205dc..07ab27e 100644 --- a/CHDataManagement/Generator/Post Lists/PostListPageGenerator.swift +++ b/CHDataManagement/Generator/Post Lists/PostListPageGenerator.swift @@ -46,7 +46,7 @@ final class PostListPageGenerator { let linkUrl = post.linkedPage.map { FeedEntryData.Link( url: $0.absoluteUrl(in: language), - text: localized.pageLinkText ?? post.content.settings.localized(in: language).defaultPageLinkText) + text: localized.pageLinkText ?? post.content.settings.posts.localized(in: language).defaultPageLinkText) } // Use the tags of the page if one is linked diff --git a/CHDataManagement/Model/Settings/AudioPlayerSettings.swift b/CHDataManagement/Model/Settings/AudioPlayerSettings.swift index ac2ee27..7c32e7c 100644 --- a/CHDataManagement/Model/Settings/AudioPlayerSettings.swift +++ b/CHDataManagement/Model/Settings/AudioPlayerSettings.swift @@ -14,14 +14,24 @@ final class AudioPlayerSettings: ObservableObject { @Published var audioPlayerCssFile: FileResource? + @Published + var german: LocalizedAudioPlayerSettings + + @Published + var english: LocalizedAudioPlayerSettings + init(playlistCoverImageSize: Int, smallCoverImageSize: Int, audioPlayerJsFile: FileResource?, - audioPlayerCssFile: FileResource?) { + audioPlayerCssFile: FileResource?, + german: LocalizedAudioPlayerSettings, + english: LocalizedAudioPlayerSettings) { self.playlistCoverImageSize = playlistCoverImageSize self.smallCoverImageSize = smallCoverImageSize self.audioPlayerJsFile = audioPlayerJsFile self.audioPlayerCssFile = audioPlayerCssFile + self.german = german + self.english = english } init(file: AudioPlayerSettingsFile, files: [String : FileResource]) { @@ -29,13 +39,17 @@ final class AudioPlayerSettings: ObservableObject { self.smallCoverImageSize = file.smallCoverImageSize self.audioPlayerJsFile = file.audioPlayerJsFile.map { files[$0] } self.audioPlayerCssFile = file.audioPlayerCssFile.map { files[$0] } + self.german = .init(file: file.german) + self.english = .init(file: file.english) } var file: AudioPlayerSettingsFile { .init(playlistCoverImageSize: playlistCoverImageSize, smallCoverImageSize: smallCoverImageSize, audioPlayerJsFile: audioPlayerJsFile?.id, - audioPlayerCssFile: audioPlayerCssFile?.id) + audioPlayerCssFile: audioPlayerCssFile?.id, + german: german.file, + english: english.file) } } @@ -45,5 +59,11 @@ extension AudioPlayerSettings { playlistCoverImageSize: 280, smallCoverImageSize: 78, audioPlayerJsFile: nil, - audioPlayerCssFile: nil) + audioPlayerCssFile: nil, + german: .init(playlistText: "Wiedergabeliste"), + english: .init(playlistText: "Playlist")) +} + +extension AudioPlayerSettings: LocalizedItem { + } diff --git a/CHDataManagement/Model/Settings/LocalizedAudioPlayerSettings.swift b/CHDataManagement/Model/Settings/LocalizedAudioPlayerSettings.swift new file mode 100644 index 0000000..61089d7 --- /dev/null +++ b/CHDataManagement/Model/Settings/LocalizedAudioPlayerSettings.swift @@ -0,0 +1,19 @@ +import Foundation + +final class LocalizedAudioPlayerSettings: ObservableObject { + + @Published + var playlistText: String + + init(playlistText: String) { + self.playlistText = playlistText + } + + init(file: LocalizedAudioPlayerSettingsFile) { + self.playlistText = file.playlistText + } + + var file: LocalizedAudioPlayerSettingsFile { + .init(playlistText: playlistText) + } +} diff --git a/CHDataManagement/Model/Settings/LocalizedPageSettings.swift b/CHDataManagement/Model/Settings/LocalizedPageSettings.swift new file mode 100644 index 0000000..1e71a21 --- /dev/null +++ b/CHDataManagement/Model/Settings/LocalizedPageSettings.swift @@ -0,0 +1,27 @@ +import Foundation + +final class LocalizedPageSettings: ObservableObject { + + /// The title to show for the box on an empty page + @Published + var emptyPageTitle: String + + /// The text to show in the box on an empty page + @Published + var emptyPageText: String + + init(emptyPageTitle: String, emptyPageText: String) { + self.emptyPageTitle = emptyPageTitle + self.emptyPageText = emptyPageText + } + + init(file: LocalizedPageSettingsFile) { + self.emptyPageTitle = file.emptyPageTitle + self.emptyPageText = file.emptyPageText + } + + var file: LocalizedPageSettingsFile { + .init(emptyPageTitle: emptyPageTitle, + emptyPageText: emptyPageText) + } +} diff --git a/CHDataManagement/Model/Settings/PageSettings.swift b/CHDataManagement/Model/Settings/PageSettings.swift index ea536be..8187e2f 100644 --- a/CHDataManagement/Model/Settings/PageSettings.swift +++ b/CHDataManagement/Model/Settings/PageSettings.swift @@ -26,6 +26,12 @@ final class PageSettings: ObservableObject { @Published var imageCompareCssFile: FileResource? + @Published + var german: LocalizedPageSettings + + @Published + var english: LocalizedPageSettings + init(file: PageSettingsFile, files: [String : FileResource]) { self.contentWidth = file.contentWidth self.largeImageWidth = file.largeImageWidth @@ -35,6 +41,8 @@ final class PageSettings: ObservableObject { self.modelViewerJsFile = file.modelViewerJsFile.map { files[$0] } self.imageCompareCssFile = file.imageCompareCssFile.map { files[$0] } self.imageCompareJsFile = file.imageCompareJsFile.map { files[$0] } + self.german = .init(file: file.german) + self.english = .init(file: file.english) } var file: PageSettingsFile { @@ -45,6 +53,12 @@ final class PageSettings: ObservableObject { codeHighlightingJsFile: codeHighlightingJsFile?.id, modelViewerJsFile: modelViewerJsFile?.id, imageCompareJsFile: imageCompareJsFile?.id, - imageCompareCssFile: imageCompareCssFile?.id) + imageCompareCssFile: imageCompareCssFile?.id, + german: german.file, + english: english.file) } } + +extension PageSettings: LocalizedItem { + +} diff --git a/CHDataManagement/Model/Settings/PostSettings.swift b/CHDataManagement/Model/Settings/PostSettings.swift index b159eea..068e86d 100644 --- a/CHDataManagement/Model/Settings/PostSettings.swift +++ b/CHDataManagement/Model/Settings/PostSettings.swift @@ -19,26 +19,38 @@ final class PostSettings: ObservableObject { @Published var defaultCssFile: FileResource? + @Published + var german: LocalizedPostSettings + + @Published + var english: LocalizedPostSettings + init(postsPerPage: Int, contentWidth: Int, swiperCssFile: FileResource?, swiperJsFile: FileResource?, - defaultCssFile: FileResource?) { + defaultCssFile: FileResource?, + german: LocalizedPostSettings, + english: LocalizedPostSettings) { self.postsPerPage = postsPerPage self.contentWidth = contentWidth self.swiperCssFile = swiperCssFile self.swiperJsFile = swiperJsFile self.defaultCssFile = defaultCssFile + self.german = german + self.english = english } // MARK: Storage - + init(file: PostSettingsFile, files: [String : FileResource]) { self.postsPerPage = file.postsPerPage self.contentWidth = file.contentWidth self.swiperCssFile = file.swiperCssFile.map { files[$0] } self.swiperJsFile = file.swiperJsFile.map { files[$0] } self.defaultCssFile = file.defaultCssFile.map { files[$0] } + self.german = .init(file: file.german) + self.english = .init(file: file.english) } var file: PostSettingsFile { @@ -46,6 +58,19 @@ final class PostSettings: ObservableObject { contentWidth: contentWidth, swiperCssFile: swiperCssFile?.id, swiperJsFile: swiperJsFile?.id, - defaultCssFile: defaultCssFile?.id) + defaultCssFile: defaultCssFile?.id, + german: german.file, + english: english.file) } } + +extension PostSettings { + + static var `default`: PostSettings { + .init(file: .default, files: [:]) + } +} + +extension PostSettings: LocalizedItem { + +} diff --git a/CHDataManagement/Model/Settings/Settings.swift b/CHDataManagement/Model/Settings/Settings.swift index 9d75ff4..14918a7 100644 --- a/CHDataManagement/Model/Settings/Settings.swift +++ b/CHDataManagement/Model/Settings/Settings.swift @@ -18,34 +18,16 @@ final class Settings: ObservableObject { @Published var audioPlayer: AudioPlayerSettings - @Published - var german: LocalizedPostSettings - - @Published - var english: LocalizedPostSettings - - init(paths: PathSettings, navigation: NavigationSettings, posts: PostSettings, pages: PageSettings, - audioPlayer: AudioPlayerSettings, - german: LocalizedPostSettings, - english: LocalizedPostSettings) { + audioPlayer: AudioPlayerSettings) { self.paths = paths self.navigation = navigation self.posts = posts self.pages = pages self.audioPlayer = audioPlayer - self.german = german - self.english = english - } - - func localized(in language: ContentLanguage) -> LocalizedPostSettings { - switch language { - case .english: return english - case .german: return german - } } init(file: SettingsFile, files: [String : FileResource], map: (String) -> Item?) { @@ -55,9 +37,6 @@ final class Settings: ObservableObject { self.pages = PageSettings(file: file.pages, files: files) self.paths = PathSettings(file: file.paths) self.audioPlayer = .init(file: file.audioPlayer, files: files) - - self.german = .init(file: file.german) - self.english = .init(file: file.english) } func file(tagOverview: TagOverviewPage?) -> SettingsFile { @@ -67,9 +46,7 @@ final class Settings: ObservableObject { posts: posts.file, pages: pages.file, audioPlayer: audioPlayer.file, - tagOverview: tagOverview?.file, - german: german.file, - english: english.file) + tagOverview: tagOverview?.file) } } @@ -80,7 +57,5 @@ extension Settings { navigation: .default, posts: .default, pages: .default, - audioPlayer: .default, - german: .german, - english: .english) + audioPlayer: .default) } diff --git a/CHDataManagement/Page Elements/ContentElements/AudioPlayer/AudioPlayer.swift b/CHDataManagement/Page Elements/ContentElements/AudioPlayer/AudioPlayer.swift index ec73e27..614e372 100644 --- a/CHDataManagement/Page Elements/ContentElements/AudioPlayer/AudioPlayer.swift +++ b/CHDataManagement/Page Elements/ContentElements/AudioPlayer/AudioPlayer.swift @@ -1,6 +1,8 @@ struct AudioPlayer: HtmlProducer { + let playlistText: String + let playingText: String let items: [PlaylistItem] @@ -59,7 +61,7 @@ struct AudioPlayer: HtmlProducer { """
-
Playlist
+
\(playlistText)
diff --git a/CHDataManagement/Preview Content/WebsiteData+Mock.swift b/CHDataManagement/Preview Content/WebsiteData+Mock.swift index cbfc8d1..420d4f2 100644 --- a/CHDataManagement/Preview Content/WebsiteData+Mock.swift +++ b/CHDataManagement/Preview Content/WebsiteData+Mock.swift @@ -7,13 +7,6 @@ extension PathSettings { } } -extension PostSettings { - - static var `default`: PostSettings { - .init(file: .default, files: [:]) - } -} - extension PageSettings { static var `default`: PageSettings { diff --git a/CHDataManagement/Storage/Model/Settings/AudioPlayerSettingsFile.swift b/CHDataManagement/Storage/Model/Settings/AudioPlayerSettingsFile.swift index 41cf55c..f0829b7 100644 --- a/CHDataManagement/Storage/Model/Settings/AudioPlayerSettingsFile.swift +++ b/CHDataManagement/Storage/Model/Settings/AudioPlayerSettingsFile.swift @@ -8,4 +8,17 @@ struct AudioPlayerSettingsFile: Codable { let audioPlayerJsFile: String? let audioPlayerCssFile: String? + + let german: LocalizedAudioPlayerSettingsFile + + let english: LocalizedAudioPlayerSettingsFile +} + +struct LocalizedAudioPlayerSettingsFile: Codable { + + let playlistText: String +} + +extension AudioPlayerSettingsFile: LocalizedItem { + } diff --git a/CHDataManagement/Storage/Model/Settings/LocalizedPageSettingsFile.swift b/CHDataManagement/Storage/Model/Settings/LocalizedPageSettingsFile.swift new file mode 100644 index 0000000..c08be1a --- /dev/null +++ b/CHDataManagement/Storage/Model/Settings/LocalizedPageSettingsFile.swift @@ -0,0 +1,23 @@ + +struct LocalizedPageSettingsFile { + + let emptyPageTitle: String + + let emptyPageText: String + + init(emptyPageTitle: String, emptyPageText: String) { + self.emptyPageTitle = emptyPageTitle + self.emptyPageText = emptyPageText + } +} + +extension LocalizedPageSettingsFile: Codable { + +} + +extension LocalizedPageSettingsFile { + + static var `default`: LocalizedPageSettingsFile { + .init(emptyPageTitle: "Empty Page", emptyPageText: "This page is empty.") + } +} diff --git a/CHDataManagement/Storage/Model/Settings/PageSettingsFile.swift b/CHDataManagement/Storage/Model/Settings/PageSettingsFile.swift index 5a10b28..f09da9f 100644 --- a/CHDataManagement/Storage/Model/Settings/PageSettingsFile.swift +++ b/CHDataManagement/Storage/Model/Settings/PageSettingsFile.swift @@ -16,6 +16,10 @@ struct PageSettingsFile { let imageCompareJsFile: String? let imageCompareCssFile: String? + + let german: LocalizedPageSettingsFile + + let english: LocalizedPageSettingsFile } extension PageSettingsFile: Codable { @@ -32,6 +36,12 @@ extension PageSettingsFile { codeHighlightingJsFile: nil, modelViewerJsFile: nil, imageCompareJsFile: nil, - imageCompareCssFile: nil) + imageCompareCssFile: nil, + german: .default, + english: .default) } } + +extension PageSettingsFile: LocalizedItem { + +} diff --git a/CHDataManagement/Storage/Model/Settings/PostSettingsFile.swift b/CHDataManagement/Storage/Model/Settings/PostSettingsFile.swift index 122ad6e..5be6a54 100644 --- a/CHDataManagement/Storage/Model/Settings/PostSettingsFile.swift +++ b/CHDataManagement/Storage/Model/Settings/PostSettingsFile.swift @@ -13,6 +13,10 @@ struct PostSettingsFile { let swiperJsFile: String? let defaultCssFile: String? + + let german: LocalizedPostSettingsFile + + let english: LocalizedPostSettingsFile } extension PostSettingsFile: Codable { } @@ -24,6 +28,8 @@ extension PostSettingsFile { contentWidth: 600, swiperCssFile: nil, swiperJsFile: nil, - defaultCssFile: nil) + defaultCssFile: nil, + german: .default, + english: .default) } } diff --git a/CHDataManagement/Storage/Model/Settings/SettingsFile.swift b/CHDataManagement/Storage/Model/Settings/SettingsFile.swift index e0b8ccd..cff05e1 100644 --- a/CHDataManagement/Storage/Model/Settings/SettingsFile.swift +++ b/CHDataManagement/Storage/Model/Settings/SettingsFile.swift @@ -14,10 +14,6 @@ struct SettingsFile { let audioPlayer: AudioPlayerSettingsFile let tagOverview: TagOverviewFile? - - let german: LocalizedPostSettingsFile - - let english: LocalizedPostSettingsFile } extension SettingsFile: Codable { } @@ -31,9 +27,7 @@ extension SettingsFile { posts: .default, pages: .default, audioPlayer: AudioPlayerSettings.default.file, - tagOverview: nil, - german: .default, - english: .default + tagOverview: nil ) } } diff --git a/CHDataManagement/Views/Settings/AudioSettingsDetailView.swift b/CHDataManagement/Views/Settings/AudioSettingsDetailView.swift index f11dd23..c75401a 100644 --- a/CHDataManagement/Views/Settings/AudioSettingsDetailView.swift +++ b/CHDataManagement/Views/Settings/AudioSettingsDetailView.swift @@ -36,8 +36,24 @@ struct AudioSettingsDetailView: View { footer: "The CSS file to provide the functionality for the audio player", selectedFile: $audioPlayer.audioPlayerJsFile, allowedType: .asset) + + LocalizedAudioSettingsDetailView(settings: audioPlayer.localized(in: language)) + .id(language) } .padding() } } } + +struct LocalizedAudioSettingsDetailView: View { + + @ObservedObject + var settings: LocalizedAudioPlayerSettings + + var body: some View { + StringPropertyView( + title: "Playlist Text", + text: $settings.playlistText, + footer: "The text on the audio player indicating the playlist") + } +} diff --git a/CHDataManagement/Views/Settings/GenerationDetailView.swift b/CHDataManagement/Views/Settings/GenerationDetailView.swift index 670559d..54206ea 100644 --- a/CHDataManagement/Views/Settings/GenerationDetailView.swift +++ b/CHDataManagement/Views/Settings/GenerationDetailView.swift @@ -14,9 +14,9 @@ struct GenerationDetailView: View { case .navigationBar: NavigationBarSettingsView() case .postFeed: - PostFeedSettingsView() + PostFeedSettingsView(postSettings: content.settings.posts) case .pages: - PageSettingsDetailView() + PageSettingsDetailView(pageSettings: content.settings.pages) case .tagOverview: TagOverviewDetailView() case .audioPlayer: diff --git a/CHDataManagement/Views/Settings/LocalizedPageSettingsView.swift b/CHDataManagement/Views/Settings/LocalizedPageSettingsView.swift new file mode 100644 index 0000000..f2c71bb --- /dev/null +++ b/CHDataManagement/Views/Settings/LocalizedPageSettingsView.swift @@ -0,0 +1,21 @@ +import SwiftUI + +struct LocalizedPageSettingsView: View { + + @ObservedObject + var settings: LocalizedPageSettings + + var body: some View { + VStack(alignment: .leading) { + StringPropertyView( + title: "Empty Page Title", + text: $settings.emptyPageTitle, + footer: "The title to show for the box on an empty page") + + TextFieldPropertyView( + title: "Empty Page Text", + text: $settings.emptyPageText, + footer: "The text to show in the box on an empty page") + } + } +} diff --git a/CHDataManagement/Views/Settings/PageSettingsDetailView.swift b/CHDataManagement/Views/Settings/PageSettingsDetailView.swift index 476a38b..b4f3dce 100644 --- a/CHDataManagement/Views/Settings/PageSettingsDetailView.swift +++ b/CHDataManagement/Views/Settings/PageSettingsDetailView.swift @@ -5,8 +5,8 @@ struct PageSettingsDetailView: View { @Environment(\.language) private var language - @EnvironmentObject - private var content: Content + @ObservedObject + var pageSettings: PageSettings var body: some View { ScrollView { @@ -17,50 +17,52 @@ struct PageSettingsDetailView: View { IntegerPropertyView( title: "Content Width", - value: $content.settings.pages.contentWidth, + value: $pageSettings.contentWidth, footer: "The maximum width of the content in pages (in pixels)") IntegerPropertyView( title: "Fullscreen Image Width", - value: $content.settings.pages.largeImageWidth, + value: $pageSettings.largeImageWidth, footer: "The maximum width of images that are diplayed fullscreen") IntegerPropertyView( title: "Page Link Image Width", - value: $content.settings.pages.pageLinkImageSize, + value: $pageSettings.pageLinkImageSize, footer: "The maximum width of images diplayed as thumbnails on page links") FilePropertyView( title: "Default CSS File", footer: "The CSS file containing the styling of all pages", - selectedFile: $content.settings.pages.defaultCssFile, + selectedFile: $pageSettings.defaultCssFile, allowedType: .asset) FilePropertyView( title: "Code Highlighting File", footer: "The JavaScript file to provide syntax highlighting of code blocks", - selectedFile: $content.settings.pages.codeHighlightingJsFile, + selectedFile: $pageSettings.codeHighlightingJsFile, allowedType: .asset) FilePropertyView( title: "3D Model Viewer File", footer: "The JavaScript file to provide the functionality for the 3D model viewer", - selectedFile: $content.settings.pages.modelViewerJsFile, + selectedFile: $pageSettings.modelViewerJsFile, allowedType: .asset) FilePropertyView( title: "Image Comparison CSS File", footer: "The CSS file to provide image comparisons", - selectedFile: $content.settings.pages.imageCompareCssFile, + selectedFile: $pageSettings.imageCompareCssFile, allowedType: .asset) FilePropertyView( title: "Image Comparison JaveScript File", footer: "The JavaScript file to provide image comparisons", - selectedFile: $content.settings.pages.imageCompareJsFile, + selectedFile: $pageSettings.imageCompareJsFile, allowedType: .asset) + LocalizedPageSettingsView(settings: pageSettings.localized(in: language)) + .id(language) } .padding() } @@ -69,7 +71,6 @@ struct PageSettingsDetailView: View { #Preview { - PageSettingsDetailView() - .environmentObject(Content.mock) + PageSettingsDetailView(pageSettings: .default) .padding() } diff --git a/CHDataManagement/Views/Settings/PostFeedSettingsView.swift b/CHDataManagement/Views/Settings/PostFeedSettingsView.swift index 90212c1..112d5bd 100644 --- a/CHDataManagement/Views/Settings/PostFeedSettingsView.swift +++ b/CHDataManagement/Views/Settings/PostFeedSettingsView.swift @@ -5,8 +5,8 @@ struct PostFeedSettingsView: View { @Environment(\.language) private var language - @EnvironmentObject - private var content: Content + @ObservedObject + var postSettings: PostSettings var body: some View { ScrollView { @@ -16,31 +16,32 @@ struct PostFeedSettingsView: View { IntegerPropertyView( title: "Content Width", - value: $content.settings.posts.contentWidth, + value: $postSettings.contentWidth, footer: "The maximum width of the content the post feed (in pixels)") IntegerPropertyView( title: "Posts Per Page", - value: $content.settings.posts.postsPerPage, + value: $postSettings.postsPerPage, footer: "The maximum number of posts displayed on a single page") FilePropertyView( title: "Default CSS File", footer: "The CSS file containing the styling of all post pages", - selectedFile: $content.settings.posts.defaultCssFile) + selectedFile: $postSettings.defaultCssFile) FilePropertyView( title: "Swiper CSS File", footer: "The CSS file containing the styling of image galleries in post feeds", - selectedFile: $content.settings.posts.swiperCssFile) + selectedFile: $postSettings.swiperCssFile) FilePropertyView( title: "Swiper JavaScript File", footer: "The JavaScript file to load the image gallery code in post feeds", - selectedFile: $content.settings.posts.swiperJsFile) + selectedFile: $postSettings.swiperJsFile) LocalizedPostFeedSettingsView( - settings: content.settings.localized(in: language)) + settings: postSettings.localized(in: language)) + .id(language) } .padding() } @@ -49,7 +50,6 @@ struct PostFeedSettingsView: View { #Preview { - PostFeedSettingsView() - .environmentObject(Content.mock) + PostFeedSettingsView(postSettings: .default) .padding() }