From cc7b3f8b0e8e013b860608b3b167c6b55c0141a2 Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 16:15:42 +0900 Subject: [PATCH 01/12] feat: improvement relogin --- harmonie/ViewModels/AppViewModel.swift | 5 ++--- harmonie/Views/ContentView.swift | 5 ----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/harmonie/ViewModels/AppViewModel.swift b/harmonie/ViewModels/AppViewModel.swift index faf84e5..31d8e7b 100644 --- a/harmonie/ViewModels/AppViewModel.swift +++ b/harmonie/ViewModels/AppViewModel.swift @@ -16,7 +16,6 @@ final class AppViewModel { var isPresentedAlert = false var vrckError: VRCKitError? var isLoggingIn = false - var isRequiredReAuthentication = false var services: APIServiceUtil var verifyType: VerifyType? @ObservationIgnored var client: APIClient @@ -123,8 +122,8 @@ final class AppViewModel { func handleError(_ error: Error) { if let error = error as? VRCKitError { - if error == .unauthorized, step != .loggingIn { - isRequiredReAuthentication = true + guard error != .unauthorized else { + step = .loggingIn return } vrckError = error diff --git a/harmonie/Views/ContentView.swift b/harmonie/Views/ContentView.swift index fba2f3f..80e3875 100644 --- a/harmonie/Views/ContentView.swift +++ b/harmonie/Views/ContentView.swift @@ -26,11 +26,6 @@ struct ContentView: View { MainTabView() .environment(FriendViewModel(appVM: appVM)) .environment(FavoriteViewModel()) - .onChange(of: appVM.isRequiredReAuthentication) { - if appVM.isRequiredReAuthentication { - appVM.step = .loggingIn - } - } .errorAlert() } } From 66f00823bfb7faf240070065c1bb5387e8990783 Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 16:31:06 +0900 Subject: [PATCH 02/12] feat: improvement initializing in LoginView --- harmonie/Views/Authentication/LoginView.swift | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/harmonie/Views/Authentication/LoginView.swift b/harmonie/Views/Authentication/LoginView.swift index 3fba3fe..49ac6de 100644 --- a/harmonie/Views/Authentication/LoginView.swift +++ b/harmonie/Views/Authentication/LoginView.swift @@ -15,35 +15,45 @@ struct LoginView: View { @State private var password = "" @State private var isPresentedSecurityPopover = false @State private var isPresentedSavingPasswordPopover = false + @State private var isInInitializing = true private let titleFont = "Avenir Next" var body: some View { @Bindable var appVM = appVM NavigationStack { - VStack(spacing: 32) { - title - VStack(spacing: 16) { - loginFields - keychainToggle - enterButton + if isInInitializing { + ProgressScreen() + } else { + VStack(spacing: 32) { + title + VStack(spacing: 16) { + loginFields + keychainToggle + enterButton + } + } + .frame(maxWidth: 560) + .padding(.horizontal, 32) + .navigationDestination(item: $appVM.verifyType) { _ in + OtpView() + .navigationBarBackButtonHidden() } - } - .frame(maxWidth: 560) - .padding(.horizontal, 32) - .navigationDestination(item: $appVM.verifyType) { _ in - OtpView() - .navigationBarBackButtonHidden() } } .ignoresSafeArea(.keyboard) .task { - guard isSavedOnKeyChain else { return } - if let password = await KeychainUtil.shared.getPassword(for: username) { - self.password = password - } + defer { isInInitializing = false } + guard isSavedOnKeyChain, !username.isEmpty else { return } + guard let password = await KeychainUtil.shared.getPassword(for: username) else { return } + self.password = password + await appVM.login(credential: cledential, isSavedOnKeyChain: isSavedOnKeyChain) } } + private var cledential: Credential { + Credential(username: username, password: password) + } + private var title: some View { HStack(alignment: .lastTextBaseline) { Text(verbatim: BundleUtil.appName.capitalized) @@ -111,10 +121,7 @@ struct LoginView: View { private var enterButton: some View { AsyncButton { - await appVM.login( - credential: Credential(username: username, password: password), - isSavedOnKeyChain: isSavedOnKeyChain - ) + await appVM.login(credential: cledential, isSavedOnKeyChain: isSavedOnKeyChain) } label: { if appVM.isLoggingIn { ProgressView() From 14d70d3068e419f5a166c7a2a0271fa93272d1df Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 16:31:37 +0900 Subject: [PATCH 03/12] update: localization --- harmonie/Localization/Localizable.xcstrings | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/harmonie/Localization/Localizable.xcstrings b/harmonie/Localization/Localizable.xcstrings index 9569f2a..f0c0c2d 100644 --- a/harmonie/Localization/Localizable.xcstrings +++ b/harmonie/Localization/Localizable.xcstrings @@ -66,22 +66,6 @@ } } }, - "All" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "全て" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "全部" - } - } - } - }, "App Name" : { "localizations" : { "ja" : { From afa772423f3ab1ef9069b532f43a045c18542a4c Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 16:34:57 +0900 Subject: [PATCH 04/12] refact: code refactoring --- .../AppViewModel+PreviewInitializer.swift | 16 ++++++++++++++++ harmonie/ViewModels/AppViewModel.swift | 10 ---------- 2 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 harmonie/Previews/AppViewModel+PreviewInitializer.swift diff --git a/harmonie/Previews/AppViewModel+PreviewInitializer.swift b/harmonie/Previews/AppViewModel+PreviewInitializer.swift new file mode 100644 index 0000000..c228ca5 --- /dev/null +++ b/harmonie/Previews/AppViewModel+PreviewInitializer.swift @@ -0,0 +1,16 @@ +// +// AppViewModel+PreviewInitializer.swift +// Harmonie +// +// Created by makinosp on 2024/10/20. +// + +extension AppViewModel { + /// Initialize as preview mode + /// - Parameter isPreviewMode + convenience init(isPreviewMode: Bool) { + self.init() + services = APIServiceUtil(isPreviewMode: true, client: client) + user = PreviewDataProvider.shared.previewUser + } +} diff --git a/harmonie/ViewModels/AppViewModel.swift b/harmonie/ViewModels/AppViewModel.swift index 31d8e7b..06bd3b7 100644 --- a/harmonie/ViewModels/AppViewModel.swift +++ b/harmonie/ViewModels/AppViewModel.swift @@ -137,13 +137,3 @@ final class AppViewModel { (error as NSError?)?.isCancelled ?? false } } - -extension AppViewModel { - /// Initialize as preview mode - /// - Parameter isPreviewMode - convenience init(isPreviewMode: Bool) { - self.init() - services = APIServiceUtil(isPreviewMode: true, client: client) - user = PreviewDataProvider.shared.previewUser - } -} From 3d088f878c10db84ca10c8771a5e7c723135b8f7 Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 16:38:18 +0900 Subject: [PATCH 05/12] refact: code refactoring --- ...{NSError+isCancelled.swift => Error+isCancelled.swift} | 8 +++++++- harmonie/ViewModels/AppViewModel.swift | 6 +----- 2 files changed, 8 insertions(+), 6 deletions(-) rename harmonie/Extensions/{NSError+isCancelled.swift => Error+isCancelled.swift} (69%) diff --git a/harmonie/Extensions/NSError+isCancelled.swift b/harmonie/Extensions/Error+isCancelled.swift similarity index 69% rename from harmonie/Extensions/NSError+isCancelled.swift rename to harmonie/Extensions/Error+isCancelled.swift index 60e6b04..ff89973 100644 --- a/harmonie/Extensions/NSError+isCancelled.swift +++ b/harmonie/Extensions/Error+isCancelled.swift @@ -1,5 +1,5 @@ // -// NSError+isCancelled.swift +// Error+isCancelled.swift // Harmonie // // Created by makinosp on 2024/09/08. @@ -7,6 +7,12 @@ import Foundation +extension Error { + var isCancelled: Bool { + (self as NSError?)?.isCancelled ?? false + } +} + extension NSError { /// A Boolean value indicating whether the error represents a cancelled network request. var isCancelled: Bool { diff --git a/harmonie/ViewModels/AppViewModel.swift b/harmonie/ViewModels/AppViewModel.swift index 06bd3b7..f84d4bd 100644 --- a/harmonie/ViewModels/AppViewModel.swift +++ b/harmonie/ViewModels/AppViewModel.swift @@ -127,13 +127,9 @@ final class AppViewModel { return } vrckError = error - } else if !isCancelled(error) { + } else if !error.isCancelled { vrckError = .unexpected } isPresentedAlert = vrckError != nil } - - private func isCancelled(_ error: Error) -> Bool { - (error as NSError?)?.isCancelled ?? false - } } From 78819c5309b04a77adca3c285c2641ea149e893d Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 17:35:02 +0900 Subject: [PATCH 06/12] refact: simplified SquareURLImage initializer --- harmonie/Components/SquareURLImage.swift | 26 +++++++----------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/harmonie/Components/SquareURLImage.swift b/harmonie/Components/SquareURLImage.swift index d823a48..475af01 100644 --- a/harmonie/Components/SquareURLImage.swift +++ b/harmonie/Components/SquareURLImage.swift @@ -6,29 +6,17 @@ // import NukeUI +import MemberwiseInit import SwiftUI +@MemberwiseInit struct SquareURLImage: View { @State private var isImageLoaded = false - private let imageUrl: URL? - private let thumbnailImageUrl: URL? - private let frameWidth: CGFloat - private let cornerRadius: CGFloat - private let ratio: CGFloat - - init( - imageUrl: URL?, - thumbnailImageUrl: URL? = nil, - frameWidth: CGFloat = 100, - ratio: CGFloat = 3/4, - cornerRadius: CGFloat = 4 - ) { - self.imageUrl = imageUrl - self.thumbnailImageUrl = thumbnailImageUrl - self.frameWidth = frameWidth - self.cornerRadius = cornerRadius - self.ratio = ratio - } + @Init(.internal) private let imageUrl: URL? + @Init(.internal, default: nil) private let thumbnailImageUrl: URL? + @Init(.internal, default: 100) private let frameWidth: CGFloat + @Init(.internal, default: 3/4) private let cornerRadius: CGFloat + @Init(.internal, default: 4) private let ratio: CGFloat var rect: some Shape { RoundedRectangle(cornerRadius: cornerRadius) From 045464e92af159f53b4a2b6514b06d3c1062c62e Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 17:42:56 +0900 Subject: [PATCH 07/12] refact: code refactoring --- harmonie/Previews/PreviewContainer.swift | 6 +++--- harmonie/Utils/DateUtil.swift | 2 +- harmonie/Utils/KeychainUtil.swift | 2 +- harmonie/Utils/ServiceUtil.swift | 2 +- harmonie/Utils/WindowUtil.swift | 10 +++++----- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/harmonie/Previews/PreviewContainer.swift b/harmonie/Previews/PreviewContainer.swift index a656baf..bc43927 100644 --- a/harmonie/Previews/PreviewContainer.swift +++ b/harmonie/Previews/PreviewContainer.swift @@ -9,14 +9,14 @@ import SwiftUI import VRCKit @MainActor -struct PreviewContainer where Content: View { +struct PreviewContainer { private let content: Content private let appVM: AppViewModel private let friendVM: FriendViewModel private let favoriteVM: FavoriteViewModel } -extension PreviewContainer: View { +extension PreviewContainer: View where Content: View { var body: some View { content .environment(appVM) @@ -36,7 +36,7 @@ extension PreviewContainer: View { } } -extension PreviewContainer { +extension PreviewContainer where Content: View { init(@ViewBuilder content: () -> Content) { self.content = content() appVM = AppViewModel(isPreviewMode: true) diff --git a/harmonie/Utils/DateUtil.swift b/harmonie/Utils/DateUtil.swift index c3d29b0..5039641 100644 --- a/harmonie/Utils/DateUtil.swift +++ b/harmonie/Utils/DateUtil.swift @@ -7,7 +7,7 @@ import Foundation -actor DateUtil: Sendable { +actor DateUtil { static let shared = DateUtil() private let relativeDateTimeFormatter: RelativeDateTimeFormatter private let comparedComponents: Set diff --git a/harmonie/Utils/KeychainUtil.swift b/harmonie/Utils/KeychainUtil.swift index b352a74..3e20883 100644 --- a/harmonie/Utils/KeychainUtil.swift +++ b/harmonie/Utils/KeychainUtil.swift @@ -8,7 +8,7 @@ import Foundation import VRCKit -actor KeychainUtil: Sendable { +actor KeychainUtil { static let shared = KeychainUtil() private init() {} diff --git a/harmonie/Utils/ServiceUtil.swift b/harmonie/Utils/ServiceUtil.swift index 7a994bb..34b9e9a 100644 --- a/harmonie/Utils/ServiceUtil.swift +++ b/harmonie/Utils/ServiceUtil.swift @@ -7,7 +7,7 @@ import VRCKit -actor APIServiceUtil: Sendable { +actor APIServiceUtil { let authenticationService: AuthenticationServiceProtocol let favoriteService: FavoriteServiceProtocol let friendService: FriendServiceProtocol diff --git a/harmonie/Utils/WindowUtil.swift b/harmonie/Utils/WindowUtil.swift index 98140c9..bb3bf40 100644 --- a/harmonie/Utils/WindowUtil.swift +++ b/harmonie/Utils/WindowUtil.swift @@ -7,20 +7,20 @@ import UIKit -@MainActor enum WindowUtil { - static var window: UIWindowScene? { +enum WindowUtil { + @MainActor static var window: UIWindowScene? { UIApplication.shared.connectedScenes.first as? UIWindowScene } - static var bounds: CGRect { + @MainActor static var bounds: CGRect { window?.screen.bounds ?? .zero } - static var height: CGFloat { + @MainActor static var height: CGFloat { window?.screen.bounds.height ?? .zero } - static var width: CGFloat { + @MainActor static var width: CGFloat { window?.screen.bounds.width ?? .zero } } From 5323e49af1a966a5abd4d502648db2ab236823e9 Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 18:10:47 +0900 Subject: [PATCH 08/12] fix: default value on initializing SquareURLImage --- harmonie/Components/SquareURLImage.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/harmonie/Components/SquareURLImage.swift b/harmonie/Components/SquareURLImage.swift index 475af01..bc501eb 100644 --- a/harmonie/Components/SquareURLImage.swift +++ b/harmonie/Components/SquareURLImage.swift @@ -15,8 +15,8 @@ struct SquareURLImage: View { @Init(.internal) private let imageUrl: URL? @Init(.internal, default: nil) private let thumbnailImageUrl: URL? @Init(.internal, default: 100) private let frameWidth: CGFloat - @Init(.internal, default: 3/4) private let cornerRadius: CGFloat - @Init(.internal, default: 4) private let ratio: CGFloat + @Init(.internal, default: 4) private let cornerRadius: CGFloat + @Init(.internal, default: 3/4) private let ratio: CGFloat var rect: some Shape { RoundedRectangle(cornerRadius: cornerRadius) From 00de4954b5e417b8bfa692dd900880bc9ca78ad8 Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 18:11:12 +0900 Subject: [PATCH 09/12] feat: improvement opening URL link button, alert --- harmonie/Views/Setting/AboutSection.swift | 56 ++++++++++++++++ .../Profile/SettingsView+ProfileSection.swift | 2 +- .../Views/Setting/SettingsDestination.swift | 10 +++ .../Setting/SettingsView+AboutSection.swift | 64 ------------------- harmonie/Views/Setting/SettingsView.swift | 34 +++++++--- 5 files changed, 93 insertions(+), 73 deletions(-) create mode 100644 harmonie/Views/Setting/AboutSection.swift create mode 100644 harmonie/Views/Setting/SettingsDestination.swift delete mode 100644 harmonie/Views/Setting/SettingsView+AboutSection.swift diff --git a/harmonie/Views/Setting/AboutSection.swift b/harmonie/Views/Setting/AboutSection.swift new file mode 100644 index 0000000..4a05ef4 --- /dev/null +++ b/harmonie/Views/Setting/AboutSection.swift @@ -0,0 +1,56 @@ +// +// AboutSection.swift +// Harmonie +// +// Created by makinosp on 2024/08/24. +// + +import SwiftUI + +extension SettingsView { + struct AboutSection: View { + @State private var isPresentedAlert = false + var body: some View { + Section("About This App") { + NavigationLabel { + Label { + Text("About This App") + } icon: { + Image(systemName: "info.circle") + } + } + .tag(SettingsDestination.about) + if let sourceCodeUrl = URL(string: "https://github.com/makinosp/harmonie") { + Button { + isPresentedAlert.toggle() + } label: { + LabeledContent { + IconSet.linkExternal.icon + .imageScale(.small) + .foregroundStyle(Color(.tertiaryLabel)) + } label: { + Label("Source Code", systemImage: IconSet.code.systemName) + } + } + .alert("Opening URL", isPresented: $isPresentedAlert) { + Button("Cancel", role: .cancel) {} + Link("OK", destination: sourceCodeUrl) + } message: { + VStack { + Text("The URL below will be opened.") + Text(sourceCodeUrl.absoluteString) + } + } + } + NavigationLabel { + Label { + Text("Third Party Licence") + } icon: { + Image(systemName: "lightbulb") + } + } + .tag(SettingsDestination.license) + } + } + } +} diff --git a/harmonie/Views/Setting/Profile/SettingsView+ProfileSection.swift b/harmonie/Views/Setting/Profile/SettingsView+ProfileSection.swift index 7832f89..75ddee2 100644 --- a/harmonie/Views/Setting/Profile/SettingsView+ProfileSection.swift +++ b/harmonie/Views/Setting/Profile/SettingsView+ProfileSection.swift @@ -18,7 +18,7 @@ extension SettingsView { UserIcon(user: user, size: Constants.IconSize.ll) } } - .tag(Destination.userDetail) + .tag(SettingsDestination.userDetail) .padding(8) Button { diff --git a/harmonie/Views/Setting/SettingsDestination.swift b/harmonie/Views/Setting/SettingsDestination.swift new file mode 100644 index 0000000..942d95a --- /dev/null +++ b/harmonie/Views/Setting/SettingsDestination.swift @@ -0,0 +1,10 @@ +// +// SettingsDestination.swift +// Harmonie +// +// Created by makinosp on 2024/10/20. +// + +enum SettingsDestination: Hashable { + case userDetail, favoriteGroups, about, license +} diff --git a/harmonie/Views/Setting/SettingsView+AboutSection.swift b/harmonie/Views/Setting/SettingsView+AboutSection.swift deleted file mode 100644 index 0728e5f..0000000 --- a/harmonie/Views/Setting/SettingsView+AboutSection.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// SettingsView+AboutSection.swift -// Harmonie -// -// Created by makinosp on 2024/08/24. -// - -import SwiftUI - -extension SettingsView { - var aboutSection: some View { - Section("About This App") { - NavigationLabel { - Label { - Text("About This App") - } icon: { - Image(systemName: "info.circle") - } - } - .tag(Destination.about) - if let sourceCodeUrl = URL(string: "https://github.com/makinosp/harmonie") { - Link(destination: sourceCodeUrl) { - LabeledContent { - IconSet.linkExternal.icon - .imageScale(.small) - .foregroundStyle(Color(.tertiaryLabel)) - } label: { - Label("Source Code", systemImage: IconSet.code.systemName) - } - } - } - NavigationLabel { - Label { - Text("Third Party Licence") - } icon: { - Image(systemName: "lightbulb") - } - } - .tag(Destination.license) - } - } - - var aboutThisApp: some View { - List { - LabeledContent { - Text(BundleUtil.appName) - } label: { - Text("App Name") - } - LabeledContent { - Text(BundleUtil.appVersion) - } label: { - Text("Version") - } - LabeledContent { - Text(BundleUtil.appBuild) - } label: { - Text("Build") - } - } - .navigationTitle("About This App") - .navigationBarTitleDisplayMode(.inline) - } -} diff --git a/harmonie/Views/Setting/SettingsView.swift b/harmonie/Views/Setting/SettingsView.swift index b1ac714..ec34aa1 100644 --- a/harmonie/Views/Setting/SettingsView.swift +++ b/harmonie/Views/Setting/SettingsView.swift @@ -11,15 +11,11 @@ import VRCKit struct SettingsView: View { @Environment(AppViewModel.self) var appVM - @State var destination: Destination? = UIDevice.current.userInterfaceIdiom == .pad ? .userDetail : nil + @State var destination: SettingsDestination? = UIDevice.current.userInterfaceIdiom == .pad ? .userDetail : nil @State var isPresentedForm = false @State private var columnVisibility: NavigationSplitViewVisibility = .all @State private var selectedLibrary: Library? - enum Destination: Hashable { - case userDetail, favoriteGroups, about, license - } - var body: some View { NavigationSplitView(columnVisibility: $columnVisibility) { settingsContent @@ -41,7 +37,7 @@ struct SettingsView: View { } @ViewBuilder - private func presentDestination(_ destination: Destination) -> some View { + private func presentDestination(_ destination: SettingsDestination) -> some View { switch destination { case .userDetail: if let user = appVM.user { @@ -71,12 +67,34 @@ struct SettingsView: View { } Section("Favorite") { Label("Favorite Groups", systemImage: IconSet.favoriteGroup.systemName) - .tag(Destination.favoriteGroups) + .tag(SettingsDestination.favoriteGroups) } - aboutSection + AboutSection() Section { LogoutButton() } } } + + var aboutThisApp: some View { + List { + LabeledContent { + Text(BundleUtil.appName) + } label: { + Text("App Name") + } + LabeledContent { + Text(BundleUtil.appVersion) + } label: { + Text("Version") + } + LabeledContent { + Text(BundleUtil.appBuild) + } label: { + Text("Build") + } + } + .navigationTitle("About This App") + .navigationBarTitleDisplayMode(.inline) + } } From b519296575438dacea3ee1bf91d502bc05777588 Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 18:11:23 +0900 Subject: [PATCH 10/12] update: localization --- harmonie/Localization/Localizable.xcstrings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/harmonie/Localization/Localizable.xcstrings b/harmonie/Localization/Localizable.xcstrings index f0c0c2d..e104286 100644 --- a/harmonie/Localization/Localizable.xcstrings +++ b/harmonie/Localization/Localizable.xcstrings @@ -937,6 +937,9 @@ } } } + }, + "Opening URL" : { + }, "Password" : { "localizations" : { @@ -1273,6 +1276,9 @@ } } } + }, + "The URL below will be opened." : { + }, "Third Party Licence" : { "localizations" : { From 16b43165edc7b1ef00d75d51ed2d1ae297353761 Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 22:01:54 +0900 Subject: [PATCH 11/12] update: localization --- harmonie/Localization/Localizable.xcstrings | 26 ++++++++++++++++----- harmonie/Views/Setting/AboutSection.swift | 2 +- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/harmonie/Localization/Localizable.xcstrings b/harmonie/Localization/Localizable.xcstrings index e104286..7d040f0 100644 --- a/harmonie/Localization/Localizable.xcstrings +++ b/harmonie/Localization/Localizable.xcstrings @@ -552,7 +552,7 @@ "ja" : { "stringUnit" : { "state" : "translated", - "value" : "フレンドのロケーション" + "value" : "フレンドの現在地" } }, "zh-Hans" : { @@ -747,7 +747,7 @@ "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ロケーション" + "value" : "現在地" } }, "zh-Hans" : { @@ -939,7 +939,14 @@ } }, "Opening URL" : { - + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "URLを開く" + } + } + } }, "Password" : { "localizations" : { @@ -1106,7 +1113,7 @@ "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ロケーションを選択" + "value" : "現在地を選択" } }, "zh-Hans" : { @@ -1277,8 +1284,15 @@ } } }, - "The URL below will be opened." : { - + "The URL below will be opened" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "下記のURLを開きます" + } + } + } }, "Third Party Licence" : { "localizations" : { diff --git a/harmonie/Views/Setting/AboutSection.swift b/harmonie/Views/Setting/AboutSection.swift index 4a05ef4..b2bda45 100644 --- a/harmonie/Views/Setting/AboutSection.swift +++ b/harmonie/Views/Setting/AboutSection.swift @@ -37,7 +37,7 @@ extension SettingsView { Link("OK", destination: sourceCodeUrl) } message: { VStack { - Text("The URL below will be opened.") + Text("The URL below will be opened") Text(sourceCodeUrl.absoluteString) } } From 0ddee7d0e65f7110f1bfc0d153f8dbc460093c99 Mon Sep 17 00:00:00 2001 From: makinosp Date: Sun, 20 Oct 2024 22:11:38 +0900 Subject: [PATCH 12/12] update: bump up to 0.9.4 --- Harmonie.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Harmonie.xcodeproj/project.pbxproj b/Harmonie.xcodeproj/project.pbxproj index b8de875..9c796ba 100644 --- a/Harmonie.xcodeproj/project.pbxproj +++ b/Harmonie.xcodeproj/project.pbxproj @@ -473,7 +473,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.9.3; + MARKETING_VERSION = 0.9.4; PRODUCT_BUNDLE_IDENTIFIER = jp.mknn.harmonie; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -509,7 +509,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.9.3; + MARKETING_VERSION = 0.9.4; PRODUCT_BUNDLE_IDENTIFIER = jp.mknn.harmonie; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES;