diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index ea588983c..b2979d002 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -19,8 +19,8 @@ jobs:
steps:
- name: checkout
uses: actions/checkout@v2
- - name: force Xcode 12.5.1
- run: sudo xcode-select -switch /Applications/Xcode_12.5.1.app
+ - name: force Xcode 13.1
+ run: sudo xcode-select -switch /Applications/Xcode_13.1.app
- name: setup
run: exec ./.github/scripts/setup.sh
- name: build
diff --git a/.gitignore b/.gitignore
index 24e748a9e..a605c524d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,6 +58,7 @@ Packages/
.swiftpm
.build/
+!**/swiftpm/Package.resolved
# CocoaPods
# We recommend against adding the Pods directory to your .gitignore. However
@@ -121,5 +122,4 @@ xcuserdata
Localization/StringsConvertor/input
Localization/StringsConvertor/output
-.DS_Store
-/Mastodon.xcworkspace/xcshareddata/swiftpm
+.DS_Store
\ No newline at end of file
diff --git a/AppShared/Info.plist b/AppShared/Info.plist
index 889a6a010..9fe845c60 100644
--- a/AppShared/Info.plist
+++ b/AppShared/Info.plist
@@ -15,8 +15,8 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 1.0.8
+ 1.2.0
CFBundleVersion
- 60
+ 88
diff --git a/AppShared/UserDefaults+Notification.swift b/AppShared/UserDefaults+Notification.swift
new file mode 100644
index 000000000..e743e70a0
--- /dev/null
+++ b/AppShared/UserDefaults+Notification.swift
@@ -0,0 +1,40 @@
+//
+// UserDefaults+Notification.swift
+// AppShared
+//
+// Created by Cirno MainasuK on 2021-10-9.
+//
+
+import UIKit
+import CryptoKit
+
+extension UserDefaults {
+ // always use hash value (SHA256) from accessToken as key
+ private static func deriveKey(from accessToken: String, prefix: String) -> String {
+ let digest = SHA256.hash(data: Data(accessToken.utf8))
+ let bytes = [UInt8](digest)
+ let hex = bytes.toHexString()
+ let key = prefix + "@" + hex
+ return key
+ }
+
+ private static let notificationCountKeyPrefix = "notification_count"
+
+ public func getNotificationCountWithAccessToken(accessToken: String) -> Int {
+ let prefix = UserDefaults.notificationCountKeyPrefix
+ let key = UserDefaults.deriveKey(from: accessToken, prefix: prefix)
+ return integer(forKey: key)
+ }
+
+ public func setNotificationCountWithAccessToken(accessToken: String, value: Int) {
+ let prefix = UserDefaults.notificationCountKeyPrefix
+ let key = UserDefaults.deriveKey(from: accessToken, prefix: prefix)
+ setValue(value, forKey: key)
+ }
+
+ public func increaseNotificationCount(accessToken: String) {
+ let count = getNotificationCountWithAccessToken(accessToken: accessToken)
+ setNotificationCountWithAccessToken(accessToken: accessToken, value: count + 1)
+ }
+
+}
diff --git a/AppShared/UserDefaults.swift b/AppShared/UserDefaults.swift
index 9cecdcf60..753a3284f 100644
--- a/AppShared/UserDefaults.swift
+++ b/AppShared/UserDefaults.swift
@@ -10,3 +10,4 @@ import UIKit
extension UserDefaults {
public static let shared = UserDefaults(suiteName: AppName.groupID)!
}
+
diff --git a/CoreDataStack/CoreData.xcdatamodeld/.xccurrentversion b/CoreDataStack/CoreData.xcdatamodeld/.xccurrentversion
new file mode 100644
index 000000000..3d5e5761c
--- /dev/null
+++ b/CoreDataStack/CoreData.xcdatamodeld/.xccurrentversion
@@ -0,0 +1,8 @@
+
+
+
+
+ _XCCurrentVersionName
+ CoreData 2.xcdatamodel
+
+
diff --git a/CoreDataStack/CoreData.xcdatamodeld/CoreData 2.xcdatamodel/contents b/CoreDataStack/CoreData.xcdatamodeld/CoreData 2.xcdatamodel/contents
new file mode 100644
index 000000000..6d576ca15
--- /dev/null
+++ b/CoreDataStack/CoreData.xcdatamodeld/CoreData 2.xcdatamodel/contents
@@ -0,0 +1,306 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CoreDataStack/CoreDataStack.swift b/CoreDataStack/CoreDataStack.swift
index 2d6224e72..2dfa0c38c 100644
--- a/CoreDataStack/CoreDataStack.swift
+++ b/CoreDataStack/CoreDataStack.swift
@@ -13,6 +13,8 @@ import AppShared
public final class CoreDataStack {
+ static let logger = Logger(subsystem: "CoreDataStack", category: "DB")
+
private(set) var storeDescriptions: [NSPersistentStoreDescription]
public let didFinishLoad = CurrentValueSubject(false)
@@ -90,8 +92,22 @@ public final class CoreDataStack {
container.viewContext.automaticallyMergesChangesFromParent = true
os_log("%{public}s[%{public}ld], %{public}s: %s", ((#file as NSString).lastPathComponent), #line, #function, storeDescription.debugDescription)
-
+
callback()
+
+ #if DEBUG
+ do {
+ let storeURL = URL.storeURL(for: AppName.groupID, databaseName: "shared")
+ let data = try Data(contentsOf: storeURL)
+ let formatter = ByteCountFormatter()
+ formatter.allowedUnits = [.useMB]
+ formatter.countStyle = .file
+ let size = formatter.string(fromByteCount: Int64(data.count))
+ CoreDataStack.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): Database size: \(size)")
+ } catch {
+ CoreDataStack.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): Cannot get database size")
+ }
+ #endif
})
}
diff --git a/CoreDataStack/Entity/Instance.swift b/CoreDataStack/Entity/Instance.swift
new file mode 100644
index 000000000..8976097ef
--- /dev/null
+++ b/CoreDataStack/Entity/Instance.swift
@@ -0,0 +1,70 @@
+//
+// Instance.swift
+// CoreDataStack
+//
+// Created by Cirno MainasuK on 2021-10-9.
+//
+
+import Foundation
+import CoreData
+
+public final class Instance: NSManagedObject {
+ @NSManaged public var domain: String
+
+ @NSManaged public private(set) var createdAt: Date
+ @NSManaged public private(set) var updatedAt: Date
+
+ @NSManaged public private(set) var configurationRaw: Data?
+
+ // MARK: one-to-many relationships
+ @NSManaged public var authentications: Set
+}
+
+extension Instance {
+ public override func awakeFromInsert() {
+ super.awakeFromInsert()
+ let now = Date()
+ setPrimitiveValue(now, forKey: #keyPath(Instance.createdAt))
+ setPrimitiveValue(now, forKey: #keyPath(Instance.updatedAt))
+ }
+
+ @discardableResult
+ public static func insert(
+ into context: NSManagedObjectContext,
+ property: Property
+ ) -> Instance {
+ let instance: Instance = context.insertObject()
+ instance.domain = property.domain
+ return instance
+ }
+
+ public func update(configurationRaw: Data?) {
+ self.configurationRaw = configurationRaw
+ }
+
+ public func didUpdate(at networkDate: Date) {
+ self.updatedAt = networkDate
+ }
+}
+
+extension Instance {
+ public struct Property {
+ public let domain: String
+
+ public init(domain: String) {
+ self.domain = domain
+ }
+ }
+}
+
+extension Instance: Managed {
+ public static var defaultSortDescriptors: [NSSortDescriptor] {
+ return [NSSortDescriptor(keyPath: \Instance.createdAt, ascending: false)]
+ }
+}
+
+extension Instance {
+ public static func predicate(domain: String) -> NSPredicate {
+ return NSPredicate(format: "%K == %@", #keyPath(Instance.domain), domain)
+ }
+}
diff --git a/CoreDataStack/Entity/MastodonAuthentication.swift b/CoreDataStack/Entity/MastodonAuthentication.swift
index 0ee0e343b..7aafd65a4 100644
--- a/CoreDataStack/Entity/MastodonAuthentication.swift
+++ b/CoreDataStack/Entity/MastodonAuthentication.swift
@@ -30,6 +30,9 @@ final public class MastodonAuthentication: NSManagedObject {
// one-to-one relationship
@NSManaged public private(set) var user: MastodonUser
+ // many-to-one relationship
+ @NSManaged public private(set) var instance: Instance?
+
}
extension MastodonAuthentication {
@@ -97,6 +100,12 @@ extension MastodonAuthentication {
}
}
+ public func update(instance: Instance) {
+ if self.instance != instance {
+ self.instance = instance
+ }
+ }
+
public func didUpdate(at networkDate: Date) {
self.updatedAt = networkDate
}
@@ -143,7 +152,7 @@ extension MastodonAuthentication: Managed {
extension MastodonAuthentication {
- static func predicate(domain: String) -> NSPredicate {
+ public static func predicate(domain: String) -> NSPredicate {
return NSPredicate(format: "%K == %@", #keyPath(MastodonAuthentication.domain), domain)
}
@@ -158,4 +167,8 @@ extension MastodonAuthentication {
])
}
+ public static func predicate(userAccessToken: String) -> NSPredicate {
+ return NSPredicate(format: "%K == %@", #keyPath(MastodonAuthentication.userAccessToken), userAccessToken)
+ }
+
}
diff --git a/CoreDataStack/Entity/MastodonUser.swift b/CoreDataStack/Entity/MastodonUser.swift
index b7a101152..913aa1f16 100644
--- a/CoreDataStack/Entity/MastodonUser.swift
+++ b/CoreDataStack/Entity/MastodonUser.swift
@@ -43,11 +43,11 @@ final public class MastodonUser: NSManagedObject {
// one-to-one relationship
@NSManaged public private(set) var pinnedStatus: Status?
@NSManaged public private(set) var mastodonAuthentication: MastodonAuthentication?
- @NSManaged public private(set) var searchHistory: SearchHistory?
// one-to-many relationship
@NSManaged public private(set) var statuses: Set?
@NSManaged public private(set) var notifications: Set?
+ @NSManaged public private(set) var searchHistories: Set
// many-to-many relationship
@NSManaged public private(set) var favourite: Set?
@@ -274,6 +274,15 @@ extension MastodonUser {
}
+extension MastodonUser {
+ public func findSearchHistory(domain: String, userID: MastodonUser.ID) -> SearchHistory? {
+ return searchHistories.first { searchHistory in
+ return searchHistory.domain == domain
+ && searchHistory.userID == userID
+ }
+ }
+}
+
extension MastodonUser {
public struct Property {
public let identifier: String
diff --git a/CoreDataStack/Entity/SearchHistory.swift b/CoreDataStack/Entity/SearchHistory.swift
index 3894d1c1b..05e441906 100644
--- a/CoreDataStack/Entity/SearchHistory.swift
+++ b/CoreDataStack/Entity/SearchHistory.swift
@@ -16,7 +16,7 @@ public final class SearchHistory: NSManagedObject {
@NSManaged public private(set) var createAt: Date
@NSManaged public private(set) var updatedAt: Date
- // one-to-one relationship
+ // many-to-one relationship
@NSManaged public private(set) var account: MastodonUser?
@NSManaged public private(set) var hashtag: Tag?
@NSManaged public private(set) var status: Status?
@@ -31,10 +31,10 @@ extension SearchHistory {
setPrimitiveValue(Date(), forKey: #keyPath(SearchHistory.updatedAt))
}
- public override func willSave() {
- super.willSave()
- setPrimitiveValue(Date(), forKey: #keyPath(SearchHistory.updatedAt))
- }
+// public override func willSave() {
+// super.willSave()
+// setPrimitiveValue(Date(), forKey: #keyPath(SearchHistory.updatedAt))
+// }
@discardableResult
public static func insert(
diff --git a/CoreDataStack/Entity/Setting.swift b/CoreDataStack/Entity/Setting.swift
index 27971157f..94ee50959 100644
--- a/CoreDataStack/Entity/Setting.swift
+++ b/CoreDataStack/Entity/Setting.swift
@@ -13,7 +13,7 @@ public final class Setting: NSManagedObject {
@NSManaged public var domain: String
@NSManaged public var userID: String
- @NSManaged public var appearanceRaw: String
+// @NSManaged public var appearanceRaw: String
@NSManaged public var preferredTrueBlackDarkMode: Bool
@NSManaged public var preferredStaticAvatar: Bool
@NSManaged public var preferredStaticEmoji: Bool
@@ -41,17 +41,17 @@ extension Setting {
property: Property
) -> Setting {
let setting: Setting = context.insertObject()
- setting.appearanceRaw = property.appearanceRaw
+// setting.appearanceRaw = property.appearanceRaw
setting.domain = property.domain
setting.userID = property.userID
return setting
}
- public func update(appearanceRaw: String) {
- guard appearanceRaw != self.appearanceRaw else { return }
- self.appearanceRaw = appearanceRaw
- didUpdate(at: Date())
- }
+// public func update(appearanceRaw: String) {
+// guard appearanceRaw != self.appearanceRaw else { return }
+// self.appearanceRaw = appearanceRaw
+// didUpdate(at: Date())
+// }
public func update(preferredTrueBlackDarkMode: Bool) {
guard preferredTrueBlackDarkMode != self.preferredTrueBlackDarkMode else { return }
@@ -87,12 +87,16 @@ extension Setting {
public struct Property {
public let domain: String
public let userID: String
- public let appearanceRaw: String
+// public let appearanceRaw: String
- public init(domain: String, userID: String, appearanceRaw: String) {
+ public init(
+ domain: String,
+ userID: String
+// appearanceRaw: String
+ ) {
self.domain = domain
self.userID = userID
- self.appearanceRaw = appearanceRaw
+// self.appearanceRaw = appearanceRaw
}
}
}
diff --git a/CoreDataStack/Entity/Status.swift b/CoreDataStack/Entity/Status.swift
index 717e54ab7..ee168e418 100644
--- a/CoreDataStack/Entity/Status.swift
+++ b/CoreDataStack/Entity/Status.swift
@@ -52,18 +52,18 @@ public final class Status: NSManagedObject {
// one-to-one relationship
@NSManaged public private(set) var pinnedBy: MastodonUser?
@NSManaged public private(set) var poll: Poll?
- @NSManaged public private(set) var searchHistory: SearchHistory?
// one-to-many relationship
@NSManaged public private(set) var reblogFrom: Set?
@NSManaged public private(set) var mentions: Set?
- @NSManaged public private(set) var tags: Set?
@NSManaged public private(set) var homeTimelineIndexes: Set?
@NSManaged public private(set) var mediaAttachments: Set?
@NSManaged public private(set) var replyFrom: Set?
@NSManaged public private(set) var inNotifications: Set?
+ @NSManaged public private(set) var searchHistories: Set
+
@NSManaged public private(set) var updatedAt: Date
@NSManaged public private(set) var deletedAt: Date?
@NSManaged public private(set) var revealedAt: Date?
@@ -81,7 +81,6 @@ extension Status {
replyTo: Status?,
poll: Poll?,
mentions: [Mention]?,
- tags: [Tag]?,
mediaAttachments: [Attachment]?,
favouritedBy: MastodonUser?,
rebloggedBy: MastodonUser?,
@@ -126,9 +125,6 @@ extension Status {
if let mentions = mentions {
status.mutableSetValue(forKey: #keyPath(Status.mentions)).addObjects(from: mentions)
}
- if let tags = tags {
- status.mutableSetValue(forKey: #keyPath(Status.tags)).addObjects(from: tags)
- }
if let mediaAttachments = mediaAttachments {
status.mutableSetValue(forKey: #keyPath(Status.mediaAttachments)).addObjects(from: mediaAttachments)
}
diff --git a/CoreDataStack/Entity/Tag.swift b/CoreDataStack/Entity/Tag.swift
index 6aeee520e..fa9e098de 100644
--- a/CoreDataStack/Entity/Tag.swift
+++ b/CoreDataStack/Entity/Tag.swift
@@ -18,13 +18,12 @@ public final class Tag: NSManagedObject {
@NSManaged public private(set) var url: String
// one-to-one relationship
- @NSManaged public private(set) var searchHistory: SearchHistory?
// many-to-many relationship
- @NSManaged public private(set) var statuses: Set?
// one-to-many relationship
@NSManaged public private(set) var histories: Set?
+ @NSManaged public private(set) var searchHistories: Set
}
public extension Tag {
@@ -55,6 +54,15 @@ public extension Tag {
}
}
+extension Tag {
+ public func findSearchHistory(domain: String, userID: MastodonUser.ID) -> SearchHistory? {
+ return searchHistories.first { searchHistory in
+ return searchHistory.domain == domain
+ && searchHistory.userID == userID
+ }
+ }
+}
+
public extension Tag {
struct Property {
public let name: String
diff --git a/CoreDataStack/Info.plist b/CoreDataStack/Info.plist
index 889a6a010..9fe845c60 100644
--- a/CoreDataStack/Info.plist
+++ b/CoreDataStack/Info.plist
@@ -15,8 +15,8 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 1.0.8
+ 1.2.0
CFBundleVersion
- 60
+ 88
diff --git a/CoreDataStackTests/Info.plist b/CoreDataStackTests/Info.plist
index 889a6a010..9fe845c60 100644
--- a/CoreDataStackTests/Info.plist
+++ b/CoreDataStackTests/Info.plist
@@ -15,8 +15,8 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 1.0.8
+ 1.2.0
CFBundleVersion
- 60
+ 88
diff --git a/Localization/Localizable.stringsdict b/Localization/Localizable.stringsdict
index 44fb608bc..ce358b439 100644
--- a/Localization/Localizable.stringsdict
+++ b/Localization/Localizable.stringsdict
@@ -2,6 +2,28 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ zero
+ no unread notification
+ one
+ 1 unread notification
+ few
+ %ld unread notifications
+ many
+ %ld unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/Intents/input/ar_SA/Intents.strings b/Localization/StringsConvertor/Intents/input/ar_SA/Intents.strings
index 6877490ba..cde27dc97 100644
--- a/Localization/StringsConvertor/Intents/input/ar_SA/Intents.strings
+++ b/Localization/StringsConvertor/Intents/input/ar_SA/Intents.strings
@@ -1,51 +1,51 @@
-"16wxgf" = "Post on Mastodon";
+"16wxgf" = "النَشر على ماستودون";
-"751xkl" = "Text Content";
+"751xkl" = "محتوى نصي";
-"CsR7G2" = "Post on Mastodon";
+"CsR7G2" = "انشر على ماستدون";
-"HZSGTr" = "What content to post?";
+"HZSGTr" = "ما المُحتوى المُراد نشره؟";
-"HdGikU" = "Posting failed";
+"HdGikU" = "فَشَلَ النشر";
-"KDNTJ4" = "Failure Reason";
+"KDNTJ4" = "سبب الإخفاق";
-"RHxKOw" = "Send Post with text content";
+"RHxKOw" = "إرسال مَنشور يَحوي نص";
-"RxSqsb" = "Post";
+"RxSqsb" = "مَنشور";
-"WCIR3D" = "Post ${content} on Mastodon";
+"WCIR3D" = "نَشر ${content} على ماستودون";
-"ZKJSNu" = "Post";
+"ZKJSNu" = "مَنشور";
"ZS1XaK" = "${content}";
-"ZbSjzC" = "Visibility";
+"ZbSjzC" = "مدى الظهور";
-"Zo4jgJ" = "Post Visibility";
+"Zo4jgJ" = "مدى ظهور المنشور";
-"apSxMG-dYQ5NN" = "There are ${count} options matching ‘Public’.";
+"apSxMG-dYQ5NN" = "هُناك عدد ${count} خِيار مُطابق لِـ\"عام\".";
-"apSxMG-ehFLjY" = "There are ${count} options matching ‘Followers Only’.";
+"apSxMG-ehFLjY" = "هُناك عدد ${count} خِيار مُطابق لِـ\"المُتابِعُون فقط\".";
-"ayoYEb-dYQ5NN" = "${content}, Public";
+"ayoYEb-dYQ5NN" = "${content}، عام";
-"ayoYEb-ehFLjY" = "${content}, Followers Only";
+"ayoYEb-ehFLjY" = "${content}، المُتابِعُون فقط";
-"dUyuGg" = "Post on Mastodon";
+"dUyuGg" = "النشر على ماستدون";
-"dYQ5NN" = "Public";
+"dYQ5NN" = "للعامة";
-"ehFLjY" = "Followers Only";
+"ehFLjY" = "لمتابعيك فقط";
-"gfePDu" = "Posting failed. ${failureReason}";
+"gfePDu" = "فَشَلَ النشر، ${failureReason}";
-"k7dbKQ" = "Post was sent successfully.";
+"k7dbKQ" = "تمَّ إرسال المنشور بِنجاح.";
-"oGiqmY-dYQ5NN" = "Just to confirm, you wanted ‘Public’?";
+"oGiqmY-dYQ5NN" = "للتأكيد، هل تَريد \"عام\"؟";
-"oGiqmY-ehFLjY" = "Just to confirm, you wanted ‘Followers Only’?";
+"oGiqmY-ehFLjY" = "للتأكيد، هل تُريد \"للمُتابِعين فقط\"؟";
-"rM6dvp" = "URL";
+"rM6dvp" = "عنوان URL";
-"ryJLwG" = "Post was sent successfully. ";
+"ryJLwG" = "تم إرسال المنشور بنجاح. ";
diff --git a/Localization/StringsConvertor/Intents/input/ar_SA/Intents.stringsdict b/Localization/StringsConvertor/Intents/input/ar_SA/Intents.stringsdict
index f273a551d..e44e666ae 100644
--- a/Localization/StringsConvertor/Intents/input/ar_SA/Intents.stringsdict
+++ b/Localization/StringsConvertor/Intents/input/ar_SA/Intents.stringsdict
@@ -5,7 +5,7 @@
There are ${count} options matching ‘${content}’. - 2
NSStringLocalizedFormatKey
- There are %#@count_option@ matching ‘${content}’.
+ هُناك %#@count_option@ تتطابق مَعَ '${content}'.
count_option
NSStringFormatSpecTypeKey
@@ -13,23 +13,23 @@
NSStringFormatValueTypeKey
%ld
zero
- %ld options
+ لا خيار
one
- 1 option
+ خيار واحد
two
- %ld options
+ خياران
few
- %ld options
+ %ld خيارات
many
- %ld options
+ %ld خيارًا
other
- %ld options
+ %ld خيار
There are ${count} options matching ‘${visibility}’.
NSStringLocalizedFormatKey
- There are %#@count_option@ matching ‘${visibility}’.
+ هُناك %#@count_option@ تتطابق مَعَ '${visibility}'.
count_option
NSStringFormatSpecTypeKey
@@ -37,17 +37,17 @@
NSStringFormatValueTypeKey
%ld
zero
- %ld options
+ لا خيار
one
- 1 option
+ خيار واحد
two
- %ld options
+ خياران
few
- %ld options
+ %ld خيارات
many
- %ld options
+ %ld خيارًا
other
- %ld options
+ %ld خيار
diff --git a/Localization/StringsConvertor/Intents/input/fr_FR/Intents.strings b/Localization/StringsConvertor/Intents/input/fr_FR/Intents.strings
index 6877490ba..f4fec3000 100644
--- a/Localization/StringsConvertor/Intents/input/fr_FR/Intents.strings
+++ b/Localization/StringsConvertor/Intents/input/fr_FR/Intents.strings
@@ -1,28 +1,28 @@
-"16wxgf" = "Post on Mastodon";
+"16wxgf" = "Publier sur Mastodon";
-"751xkl" = "Text Content";
+"751xkl" = "Contenu textuel";
-"CsR7G2" = "Post on Mastodon";
+"CsR7G2" = "Publier sur Mastodon";
-"HZSGTr" = "What content to post?";
+"HZSGTr" = "Quel contenu à publier ?";
-"HdGikU" = "Posting failed";
+"HdGikU" = "Échec lors de la publication";
-"KDNTJ4" = "Failure Reason";
+"KDNTJ4" = "Raison de l’échec";
-"RHxKOw" = "Send Post with text content";
+"RHxKOw" = "Envoyer une publication avec du contenu texte";
"RxSqsb" = "Post";
-"WCIR3D" = "Post ${content} on Mastodon";
+"WCIR3D" = "Publier du ${content} sur Mastodon";
-"ZKJSNu" = "Post";
+"ZKJSNu" = "Publication";
"ZS1XaK" = "${content}";
-"ZbSjzC" = "Visibility";
+"ZbSjzC" = "Visibilité";
-"Zo4jgJ" = "Post Visibility";
+"Zo4jgJ" = "Visibilité de la publication";
"apSxMG-dYQ5NN" = "There are ${count} options matching ‘Public’.";
@@ -30,22 +30,22 @@
"ayoYEb-dYQ5NN" = "${content}, Public";
-"ayoYEb-ehFLjY" = "${content}, Followers Only";
+"ayoYEb-ehFLjY" = "${content}, abonné·e·s seulement";
-"dUyuGg" = "Post on Mastodon";
+"dUyuGg" = "Publier sur Mastodon";
"dYQ5NN" = "Public";
-"ehFLjY" = "Followers Only";
+"ehFLjY" = "Abonné·e·s seulement";
-"gfePDu" = "Posting failed. ${failureReason}";
+"gfePDu" = "Échec lors de la publication. ${failureReason}";
-"k7dbKQ" = "Post was sent successfully.";
+"k7dbKQ" = "Message publié avec succès.";
-"oGiqmY-dYQ5NN" = "Just to confirm, you wanted ‘Public’?";
+"oGiqmY-dYQ5NN" = "Juste pour confirmer, vous vouliez « Public » ?";
-"oGiqmY-ehFLjY" = "Just to confirm, you wanted ‘Followers Only’?";
+"oGiqmY-ehFLjY" = "Juste pour confirmer, vous vouliez bien diffuser vers « abonné·e·s uniquement » ?";
"rM6dvp" = "URL";
-"ryJLwG" = "Post was sent successfully. ";
+"ryJLwG" = "La publication a été envoyée avec succès. ";
diff --git a/Localization/StringsConvertor/Intents/input/fr_FR/Intents.stringsdict b/Localization/StringsConvertor/Intents/input/fr_FR/Intents.stringsdict
index 18422c772..53d39da2e 100644
--- a/Localization/StringsConvertor/Intents/input/fr_FR/Intents.stringsdict
+++ b/Localization/StringsConvertor/Intents/input/fr_FR/Intents.stringsdict
@@ -5,7 +5,7 @@
There are ${count} options matching ‘${content}’. - 2
NSStringLocalizedFormatKey
- There are %#@count_option@ matching ‘${content}’.
+ Il y a %#@count_option@ correspondant à « ${content} ».
count_option
NSStringFormatSpecTypeKey
@@ -21,7 +21,7 @@
There are ${count} options matching ‘${visibility}’.
NSStringLocalizedFormatKey
- There are %#@count_option@ matching ‘${visibility}’.
+ Il y a %#@count_option@ correspondant à « ${visibility} ».
count_option
NSStringFormatSpecTypeKey
diff --git a/Localization/StringsConvertor/Intents/input/gd_GB/Intents.strings b/Localization/StringsConvertor/Intents/input/gd_GB/Intents.strings
index 0f8ef5edc..526defecd 100644
--- a/Localization/StringsConvertor/Intents/input/gd_GB/Intents.strings
+++ b/Localization/StringsConvertor/Intents/input/gd_GB/Intents.strings
@@ -24,9 +24,9 @@
"Zo4jgJ" = "Faicsinneachd a’ phuist";
-"apSxMG-dYQ5NN" = "There are ${count} options matching ‘Public’.";
+"apSxMG-dYQ5NN" = "Tha ${count} roghainn(ean) dha “Poblach” ann.";
-"apSxMG-ehFLjY" = "There are ${count} options matching ‘Followers Only’.";
+"apSxMG-ehFLjY" = "Tha ${count} roghainn(ean) dha “Luchd-leantainn a-mhàin” ann.";
"ayoYEb-dYQ5NN" = "${content}, poblach";
diff --git a/Localization/StringsConvertor/Intents/input/gd_GB/Intents.stringsdict b/Localization/StringsConvertor/Intents/input/gd_GB/Intents.stringsdict
index 9a4c7df17..4b93628d7 100644
--- a/Localization/StringsConvertor/Intents/input/gd_GB/Intents.stringsdict
+++ b/Localization/StringsConvertor/Intents/input/gd_GB/Intents.stringsdict
@@ -13,11 +13,11 @@
NSStringFormatValueTypeKey
%ld
one
- 1 option
+ %ld roghainn
two
- %ld options
+ %ld roghainn
few
- %ld options
+ %ld roghainnean
other
%ld roghainn
@@ -33,11 +33,11 @@
NSStringFormatValueTypeKey
%ld
one
- 1 option
+ %ld roghainn
two
- %ld options
+ %ld roghainn
few
- %ld options
+ %ld roghainnean
other
%ld roghainn
diff --git a/Localization/StringsConvertor/Intents/input/kmr_TR/Intents.strings b/Localization/StringsConvertor/Intents/input/kmr_TR/Intents.strings
new file mode 100644
index 000000000..13a86e0c0
--- /dev/null
+++ b/Localization/StringsConvertor/Intents/input/kmr_TR/Intents.strings
@@ -0,0 +1,51 @@
+"16wxgf" = "Di Mastodon de biweşîne";
+
+"751xkl" = "Naveroka nivîsê";
+
+"CsR7G2" = "Di Mastodon de biweşîne";
+
+"HZSGTr" = "Kîjan naverok bila bê şandin?";
+
+"HdGikU" = "Şandin têkçû";
+
+"KDNTJ4" = "Sedema têkçûnê";
+
+"RHxKOw" = "Bi naveroka nivîsî şandiyan bişîne";
+
+"RxSqsb" = "Şandî";
+
+"WCIR3D" = "${content} biweşîne di Mastodon de";
+
+"ZKJSNu" = "Şandî";
+
+"ZS1XaK" = "${content}";
+
+"ZbSjzC" = "Xuyanî";
+
+"Zo4jgJ" = "Xuyaniya şandiyê";
+
+"apSxMG-dYQ5NN" = "Vebijarkên ${count} hene ku li gorî 'Gelemperî' ne.";
+
+"apSxMG-ehFLjY" = "Vebijarkên ${count} hene ku li gorî 'Tenê Şopaneran' hene.";
+
+"ayoYEb-dYQ5NN" = "${content}, Gelemperî";
+
+"ayoYEb-ehFLjY" = "${content}, Tenê şopînêr";
+
+"dUyuGg" = "Di Mastodon de biweşîne";
+
+"dYQ5NN" = "Gelemperî";
+
+"ehFLjY" = "Tenê şopîneran";
+
+"gfePDu" = "Weşandin bi ser neket. ${failureReason}";
+
+"k7dbKQ" = "Şandî bi serkeftî hate şandin.";
+
+"oGiqmY-dYQ5NN" = "Tenê ji bo pejirandinê, te 'Gelemperî' dixwest?";
+
+"oGiqmY-ehFLjY" = "Tenê ji bo pejirandinê, te 'Tenê Şopîner' dixwest?";
+
+"rM6dvp" = "Girêdan";
+
+"ryJLwG" = "Şandî bi serkeftî hate şandin. ";
diff --git a/Localization/StringsConvertor/Intents/input/kmr_TR/Intents.stringsdict b/Localization/StringsConvertor/Intents/input/kmr_TR/Intents.stringsdict
new file mode 100644
index 000000000..2f001aaa9
--- /dev/null
+++ b/Localization/StringsConvertor/Intents/input/kmr_TR/Intents.stringsdict
@@ -0,0 +1,38 @@
+
+
+
+
+ There are ${count} options matching ‘${content}’. - 2
+
+ NSStringLocalizedFormatKey
+ %#@count_option@ heye ku bi ‘${content}’ re têkildar e.
+ count_option
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ %ld
+ one
+ 1 vebijêrk
+ other
+ %ld vebijêrk
+
+
+ There are ${count} options matching ‘${visibility}’.
+
+ NSStringLocalizedFormatKey
+ %#@count_option@ heye ku bi ‘${visibility}’ re têkildar e.
+ count_option
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ %ld
+ one
+ 1 vebijêrk
+ other
+ %ld vebijêrk
+
+
+
+
diff --git a/Localization/StringsConvertor/Intents/input/nl_NL/Intents.stringsdict b/Localization/StringsConvertor/Intents/input/nl_NL/Intents.stringsdict
index 18422c772..9043720db 100644
--- a/Localization/StringsConvertor/Intents/input/nl_NL/Intents.stringsdict
+++ b/Localization/StringsConvertor/Intents/input/nl_NL/Intents.stringsdict
@@ -5,7 +5,7 @@
There are ${count} options matching ‘${content}’. - 2
NSStringLocalizedFormatKey
- There are %#@count_option@ matching ‘${content}’.
+ Er zijn %#@count_option@ die overeenkomen met ‘${content}’.
count_option
NSStringFormatSpecTypeKey
@@ -13,7 +13,7 @@
NSStringFormatValueTypeKey
%ld
one
- 1 option
+ 1 optie
other
%ld options
@@ -21,7 +21,7 @@
There are ${count} options matching ‘${visibility}’.
NSStringLocalizedFormatKey
- There are %#@count_option@ matching ‘${visibility}’.
+ Er zijn %#@count_option@ die overeenkomen met ‘${visibility}’.
count_option
NSStringFormatSpecTypeKey
@@ -29,7 +29,7 @@
NSStringFormatValueTypeKey
%ld
one
- 1 option
+ 1 optie
other
%ld options
diff --git a/Localization/StringsConvertor/Sources/StringsConvertor/main.swift b/Localization/StringsConvertor/Sources/StringsConvertor/main.swift
index 124612e5c..6507986be 100644
--- a/Localization/StringsConvertor/Sources/StringsConvertor/main.swift
+++ b/Localization/StringsConvertor/Sources/StringsConvertor/main.swift
@@ -51,6 +51,7 @@ private func map(language: String) -> String? {
case "fr_FR": return "fr" // French
case "de_DE": return "de" // German
case "ja_JP": return "ja" // Japanese
+ case "kmr_TR": return "ku-TR" // Kurmanji (Kurdish)
case "ru_RU": return "ru" // Russian
case "gd_GB": return "gd-GB" // Scottish Gaelic
case "es_ES": return "es" // Spanish
diff --git a/Localization/StringsConvertor/input/ar_SA/Localizable.stringsdict b/Localization/StringsConvertor/input/ar_SA/Localizable.stringsdict
index 537064efb..0b28c577a 100644
--- a/Localization/StringsConvertor/input/ar_SA/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/ar_SA/Localizable.stringsdict
@@ -2,10 +2,34 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ zero
+ لا إشعار غير مقروء
+ one
+ إشعار واحِد غير مقروء
+ two
+ إشعاران غير مقروءان
+ few
+ %ld إشعارات غير مقروءة
+ many
+ %ld إشعارًا غيرَ مقروء
+ other
+ %ld إشعار غير مقروء
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
- Input limit exceeds %#@character_count@
+ تمَّ تجاوز حدّ الإدخال %#@character_count@
character_count
NSStringFormatSpecTypeKey
@@ -13,23 +37,23 @@
NSStringFormatValueTypeKey
ld
zero
- %ld characters
+ لا حرف
one
- 1 character
+ حرفٌ واحِد
two
- %ld characters
+ حرفان اثنان
few
- %ld characters
+ %ld حُرُوف
many
- %ld characters
+ %ld حرفًا
other
- %ld characters
+ %ld حَرف
a11y.plural.count.input_limit_remains
NSStringLocalizedFormatKey
- Input limit remains %#@character_count@
+ يتبقَّى على حدّ الإدخال %#@character_count@
character_count
NSStringFormatSpecTypeKey
@@ -37,17 +61,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld characters
+ لا حرف
one
- 1 character
+ حرفٌ واحِد
two
- %ld characters
+ حرفان اثنان
few
- %ld characters
+ %ld حُرُوف
many
- %ld characters
+ %ld حرفًا
other
- %ld characters
+ %ld حَرف
plural.count.metric_formatted.post
@@ -61,17 +85,17 @@
NSStringFormatValueTypeKey
ld
zero
- posts
+ لا منشور
one
- post
+ منشور
two
- posts
+ منشوران
few
- posts
+ منشورات
many
- posts
+ منشورًا
other
- posts
+ منشور
plural.count.post
@@ -85,17 +109,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld posts
+ لا منشور
one
- 1 post
+ منشورٌ واحِد
two
- %ld posts
+ منشورانِ اثنان
few
- %ld posts
+ %ld منشورات
many
- %ld posts
+ %ld منشورًا
other
- %ld posts
+ %ld منشور
plural.count.favorite
@@ -109,17 +133,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld favorites
+ لا إعجاب
one
- 1 favorite
+ إعجابٌ واحِد
two
- %ld favorites
+ إعجابانِ اثنان
few
- %ld favorites
+ %ld إعجابات
many
- %ld favorites
+ %ld إعجابًا
other
- %ld favorites
+ %ld إعجاب
plural.count.reblog
@@ -133,17 +157,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld reblogs
+ لا إعاد تدوين
one
- 1 reblog
+ إعادةُ تدوينٍ واحِدة
two
- %ld reblogs
+ إعادتا تدوين
few
- %ld reblogs
+ %ld إعاداتِ تدوين
many
- %ld reblogs
+ %ld إعادةٍ للتدوين
other
- %ld reblogs
+ %ld إعادة تدوين
plural.count.vote
@@ -157,17 +181,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld votes
+ لا صوت
one
- 1 vote
+ صوتٌ واحِد
two
- %ld votes
+ صوتانِ اثنان
few
- %ld votes
+ %ld أصوات
many
- %ld votes
+ %ld صوتًا
other
- %ld votes
+ %ld صوت
plural.count.voter
@@ -181,17 +205,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld voters
+ لا مُصوِّتون
one
- 1 voter
+ مُصوِّتٌ واحِد
two
- %ld voters
+ مُصوِّتانِ اثنان
few
- %ld voters
+ %ld مُصوِّتين
many
- %ld voters
+ %ld مُصوِّتًا
other
- %ld voters
+ %ld مُصوِّت
plural.people_talking
@@ -205,17 +229,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld people talking
+ لا أحَدَ يتحدَّث
one
- 1 people talking
+ شخصٌ واحدٌ يتحدَّث
two
- %ld people talking
+ شخصانِ اثنان يتحدَّثا
few
- %ld people talking
+ %ld أشخاصٍ يتحدَّثون
many
- %ld people talking
+ %ld شخصًا يتحدَّثون
other
- %ld people talking
+ %ld شخصٍ يتحدَّثون
plural.count.following
@@ -229,17 +253,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld following
+ لا مُتابَع
one
- 1 following
+ مُتابَعٌ واحد
two
- %ld following
+ مُتابَعانِ
few
- %ld following
+ %ld مُتابَعين
many
- %ld following
+ %ld مُتابَعًا
other
- %ld following
+ %ld مُتابَع
plural.count.follower
@@ -253,17 +277,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld followers
+ لا مُتابِع
one
- 1 follower
+ مُتابِعٌ واحد
two
- %ld followers
+ مُتابِعانِ اثنان
few
- %ld followers
+ %ld مُتابِعين
many
- %ld followers
+ %ld مُتابِعًا
other
- %ld followers
+ %ld مُتابِع
date.year.left
@@ -277,17 +301,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld years left
+ تتبقى لَحظة
one
- 1 year left
+ تتبقى سنة
two
- %ld years left
+ تتبقى سنتين
few
- %ld years left
+ تتبقى %ld سنوات
many
- %ld years left
+ تتبقى %ld سنةً
other
- %ld years left
+ تتبقى %ld سنة
date.month.left
@@ -301,17 +325,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld months left
+ تتبقى لَحظة
one
- 1 months left
+ يتبقى شهر
two
- %ld months left
+ يتبقى شهرين
few
- %ld months left
+ يتبقى %ld أشهر
many
- %ld months left
+ يتبقى %ld شهرًا
other
- %ld months left
+ يتبقى %ld شهر
date.day.left
@@ -325,17 +349,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld days left
+ تتبقى لحظة
one
- 1 day left
+ يتبقى يوم
two
- %ld days left
+ يتبقى يومين
few
- %ld days left
+ يتبقى %ld أيام
many
- %ld days left
+ يتبقى %ld يومًا
other
- %ld days left
+ يتبقى %ld يوم
date.hour.left
@@ -349,17 +373,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld hours left
+ تتبقى لَحظة
one
- 1 hour left
+ تتبقى ساعة
two
- %ld hours left
+ تتبقى ساعتين
few
- %ld hours left
+ تتبقى %ld ساعات
many
- %ld hours left
+ تتبقى %ld ساعةً
other
- %ld hours left
+ تتبقى %ld ساعة
date.minute.left
@@ -373,17 +397,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld minutes left
+ تتبقى لَحظة
one
- 1 minute left
+ تتبقى دقيقة
two
- %ld minutes left
+ تتبقى دقيقتين
few
- %ld minutes left
+ تتبقى %ld دقائق
many
- %ld minutes left
+ تتبقى %ld دقيقةً
other
- %ld minutes left
+ تتبقى %ld دقيقة
date.second.left
@@ -397,17 +421,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ld seconds left
+ تتبقى لَحظة
one
- 1 second left
+ تتبقى ثانية
two
- %ld seconds left
+ تتبقى ثانيتين
few
- %ld seconds left
+ تتبقى %ld ثوان
many
- %ld seconds left
+ تتبقى %ld ثانيةً
other
- %ld seconds left
+ تتبقى %ld ثانية
date.year.ago.abbr
@@ -421,17 +445,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ldy ago
+ مُنذُ لَحظة
one
- 1y ago
+ مُنذُ سنة
two
- %ldy ago
+ مُنذُ سنتين
few
- %ldy ago
+ مُنذُ %ld سنين
many
- %ldy ago
+ مُنذُ %ld سنةً
other
- %ldy ago
+ مُنذُ %ld سنة
date.month.ago.abbr
@@ -445,17 +469,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ldM ago
+ مُنذُ لَحظة
one
- 1M ago
+ مُنذُ شهر
two
- %ldM ago
+ مُنذُ شهرين
few
- %ldM ago
+ مُنذُ %ld أشهُر
many
- %ldM ago
+ مُنذُ %ld شهرًا
other
- %ldM ago
+ مُنذُ %ld شهر
date.day.ago.abbr
@@ -469,17 +493,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ldd ago
+ مُنذُ لَحظة
one
- 1d ago
+ مُنذُ يوم
two
- %ldd ago
+ مُنذُ يومين
few
- %ldd ago
+ مُنذُ %ld أيام
many
- %ldd ago
+ مُنذُ %ld يومًا
other
- %ldd ago
+ مُنذُ %ld يوم
date.hour.ago.abbr
@@ -493,17 +517,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ldh ago
+ مُنذُ لَحظة
one
- 1h ago
+ مُنذُ ساعة
two
- %ldh ago
+ مُنذُ ساعتين
few
- %ldh ago
+ مُنذُ %ld ساعات
many
- %ldh ago
+ مُنذُ %ld ساعةًَ
other
- %ldh ago
+ مُنذُ %ld ساعة
date.minute.ago.abbr
@@ -517,17 +541,17 @@
NSStringFormatValueTypeKey
ld
zero
- %ldm ago
+ مُنذُ لَحظة
one
- 1m ago
+ مُنذُ دقيقة
two
- %ldm ago
+ مُنذُ دقيقتان
few
- %ldm ago
+ مُنذُ %ld دقائق
many
- %ldm ago
+ مُنذُ %ld دقيقةً
other
- %ldm ago
+ مُنذُ %ld دقيقة
date.second.ago.abbr
@@ -541,17 +565,17 @@
NSStringFormatValueTypeKey
ld
zero
- %lds ago
+ مُنذُ لَحظة
one
- 1s ago
+ مُنذُ ثانية
two
- %lds ago
+ مُنذُ ثانيتين
few
- %lds ago
+ مُنذُ %ld ثوان
many
- %lds ago
+ مُنذُ %ld ثانية
other
- %lds ago
+ مُنذُ %ld ثانية
diff --git a/Localization/StringsConvertor/input/ar_SA/app.json b/Localization/StringsConvertor/input/ar_SA/app.json
index ba15760fb..71e0f538f 100644
--- a/Localization/StringsConvertor/input/ar_SA/app.json
+++ b/Localization/StringsConvertor/input/ar_SA/app.json
@@ -2,55 +2,55 @@
"common": {
"alerts": {
"common": {
- "please_try_again": "الرجاء المحاولة مرة أخرى.",
- "please_try_again_later": "الرجاء المحاولة مرة أخرى لاحقاً."
+ "please_try_again": "يُرجى المحاولة مرة أُخرى.",
+ "please_try_again_later": "يُرجى المحاولة مرة أُخرى لاحقاً."
},
"sign_up_failure": {
- "title": "فشل التسجيل"
+ "title": "إخفاق في التسجيل"
},
"server_error": {
"title": "خطأ في الخادم"
},
"vote_failure": {
- "title": "فشل التصويت",
- "poll_ended": "The poll has ended"
+ "title": "إخفاق في التصويت",
+ "poll_ended": "انتهى استطلاع الرأي"
},
"discard_post_content": {
- "title": "تجاهل المسودة",
- "message": "Confirm to discard composed post content."
+ "title": "التخلص من المسودة",
+ "message": "أكِّد للتخلص مِن مُحتوى مَنشور مؤلَّف."
},
"publish_post_failure": {
- "title": "أخفقت عملية النشر",
- "message": "Failed to publish the post.\nPlease check your internet connection.",
+ "title": "إخفاق في عمليَّة النشر",
+ "message": "فَشَلَ نَشر المَنشور.\nيُرجى التحقق من اتصالك بالإنترنت.",
"attachments_message": {
- "video_attach_with_photo": "Cannot attach a video to a post that already contains images.",
- "more_than_one_video": "Cannot attach more than one video."
+ "video_attach_with_photo": "لا يُمكن إرفاق مقطع مرئي إلى مَنشور يحتوي بالفعل على صُوَر.",
+ "more_than_one_video": "لا يُمكِنُ إرفاق أكثر مِن مَقطع مرئي واحِد."
}
},
"edit_profile_failure": {
- "title": "Edit Profile Error",
- "message": "Cannot edit profile. Please try again."
+ "title": "خطأ في تَحرير الملف الشخصي",
+ "message": "لا يمكن تعديل الملف الشخصي. يُرجى المحاولة مرة أُخرى."
},
"sign_out": {
"title": "تسجيل الخروج",
- "message": "هل أنت متأكد من أنك تريد تسجيل الخروج؟",
+ "message": "هل أنت متأكد من رغبتك في تسجيل الخروج؟",
"confirm": "تسجيل الخروج"
},
"block_domain": {
- "title": "Are you really, really sure you want to block the entire %s? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain and any of your followers from that domain will be removed.",
- "block_entire_domain": "حظر النطاق"
+ "title": "هل أنتَ مُتأكِّدٌ حقًا مِن رغبتك في حظر %s بالكامل؟ في معظم الحالات، يكون مِنَ الكافي والمُفَضَّل استهداف عدد محدود للحظر أو الكتم. لن ترى محتوى من هذا النطاق وسوف يتم إزالة جميع متابعيك المتواجدين فيه.",
+ "block_entire_domain": "حظر النِطاق"
},
"save_photo_failure": {
- "title": "فشل حفظ الصورة",
- "message": "Please enable the photo library access permission to save the photo."
+ "title": "إخفاق في حفظ الصورة",
+ "message": "يُرجى إتاحة إذن الوصول إلى مكتبة الصور لحفظ الصورة."
},
"delete_post": {
- "title": "هل أنت متأكد من أنك تريد حذف هذا المنشور؟",
+ "title": "هل أنت متأكد من رغبتك في حذف هذا المنشور؟",
"delete": "احذف"
},
"clean_cache": {
- "title": "تنظيف ذاكرة التخزين المؤقت",
- "message": "تم تنظيف ذاكرة التخزين المؤقت %s بنجاح."
+ "title": "مَحو ذاكرة التخزين المؤقت",
+ "message": "تمَّ مَحو ذاكرة التخزين المؤقت %s بنجاح."
}
},
"controls": {
@@ -61,30 +61,31 @@
"open": "افتح",
"add": "إضافة",
"remove": "احذف",
- "edit": "تعديل",
+ "edit": "تحرير",
"save": "حفظ",
"ok": "حسنًا",
- "done": "تم",
+ "done": "تمّ",
"confirm": "تأكيد",
"continue": "واصل",
+ "compose": "تأليف",
"cancel": "إلغاء",
"discard": "تجاهل",
- "try_again": "حاول مرة أخرى",
- "take_photo": "التقط صورة",
+ "try_again": "المُحاولة مرة أُخرى",
+ "take_photo": "التقاط صورة",
"save_photo": "حفظ الصورة",
"copy_photo": "نسخ الصورة",
- "sign_in": "لِج",
- "sign_up": "انشئ حسابًا",
+ "sign_in": "تسجيل الدخول",
+ "sign_up": "إنشاء حِساب",
"see_more": "عرض المزيد",
- "preview": "معاينة",
- "share": "شارك",
- "share_user": "شارك %s",
- "share_post": "شارك المنشور",
- "open_in_safari": "افتحه في سفاري",
+ "preview": "مُعاينة",
+ "share": "المُشارك",
+ "share_user": "مُشاركة %s",
+ "share_post": "مشارك المنشور",
+ "open_in_safari": "الفتح في Safari",
"find_people": "ابحث عن أشخاص لمتابعتهم",
"manually_search": "البحث يدوياً بدلاً من ذلك",
"skip": "تخطي",
- "reply": "رد",
+ "reply": "الرَد",
"report_user": "ابلغ عن %s",
"block_domain": "حظر %s",
"unblock_domain": "إلغاء حظر %s",
@@ -100,7 +101,7 @@
"keyboard": {
"common": {
"switch_to_tab": "التبديل إلى %s",
- "compose_new_post": "إنشاء منشور جديد",
+ "compose_new_post": "تأليف منشور جديد",
"show_favorites": "إظهار المفضلة",
"open_settings": "أفتح الإعدادات"
},
@@ -111,9 +112,9 @@
"open_author_profile": "افتح الملف التعريفي للمؤلف",
"open_reblogger_profile": "افتح الملف التعريفي لمشارِك المنشور",
"reply_status": "رد على المنشور",
- "toggle_reblog": "Toggle Reblog on Post",
- "toggle_favorite": "Toggle Favorite on Post",
- "toggle_content_warning": "Toggle Content Warning",
+ "toggle_reblog": "تبديل إعادة تدوين منشور",
+ "toggle_favorite": "تبديل المفضلة لِمنشور",
+ "toggle_content_warning": "تبديل تحذير المُحتَوى",
"preview_image": "معاينة الصورة"
},
"segmented_control": {
@@ -122,44 +123,44 @@
}
},
"status": {
- "user_reblogged": "%s reblogged",
- "user_replied_to": "Replied to %s",
- "show_post": "Show Post",
- "show_user_profile": "Show user profile",
- "content_warning": "Content Warning",
- "media_content_warning": "Tap anywhere to reveal",
+ "user_reblogged": "أعادَ %s تدوينها",
+ "user_replied_to": "رد على %s",
+ "show_post": "اظهر المنشور",
+ "show_user_profile": "اظهر الملف التعريفي للمستخدم",
+ "content_warning": "تحذير عن المحتوى",
+ "media_content_warning": "انقر على أي مكان للكشف",
"poll": {
- "vote": "Vote",
- "closed": "Closed"
+ "vote": "صَوِّت",
+ "closed": "انتهى"
},
"actions": {
- "reply": "Reply",
- "reblog": "Reblog",
- "unreblog": "Undo reblog",
- "favorite": "Favorite",
- "unfavorite": "Unfavorite",
- "menu": "Menu"
+ "reply": "رد",
+ "reblog": "إعادة النشر",
+ "unreblog": "تراجع عن إعادة النشر",
+ "favorite": "إضافة إلى المفضلة",
+ "unfavorite": "إزالة من المفضلة",
+ "menu": "القائمة"
},
"tag": {
- "url": "URL",
- "mention": "Mention",
- "link": "Link",
- "hashtag": "Hashtag",
+ "url": "عنوان URL",
+ "mention": "أشر إلى",
+ "link": "الرابط",
+ "hashtag": "الوسم",
"email": "البريد الإلكتروني",
- "emoji": "Emoji"
+ "emoji": "إيموجي"
}
},
"friendship": {
- "follow": "Follow",
- "following": "Following",
- "request": "Request",
- "pending": "Pending",
- "block": "Block",
- "block_user": "Block %s",
- "block_domain": "Block %s",
- "unblock": "Unblock",
- "unblock_user": "Unblock %s",
- "blocked": "Blocked",
+ "follow": "اتبع",
+ "following": "مُتابَع",
+ "request": "إرسال طَلَب",
+ "pending": "قيد المُراجعة",
+ "block": "حظر",
+ "block_user": "حظر %s",
+ "block_domain": "حظر %s",
+ "unblock": "إلغاء الحَظر",
+ "unblock_user": "إلغاء حظر %s",
+ "blocked": "محظور",
"mute": "أكتم",
"mute_user": "أكتم %s",
"unmute": "إلغاء الكتم",
@@ -168,45 +169,45 @@
"edit_info": "تعديل المعلومات"
},
"timeline": {
- "filtered": "Filtered",
+ "filtered": "مُصفَّى",
"timestamp": {
"now": "الأن"
},
"loader": {
- "load_missing_posts": "Load missing posts",
+ "load_missing_posts": "تحميل المنشورات المَفقودة",
"loading_missing_posts": "تحميل المزيد من المنشورات...",
"show_more_replies": "إظهار المزيد من الردود"
},
"header": {
"no_status_found": "لا توجد هناك منشورات",
- "blocking_warning": "You can’t view this user's profile\nuntil you unblock them.\nYour profile looks like this to them.",
- "user_blocking_warning": "You can’t view %s’s profile\nuntil you unblock them.\nYour profile looks like this to them.",
- "blocked_warning": "You can’t view this user’s profile\nuntil they unblock you.",
- "user_blocked_warning": "You can’t view %s’s profile\nuntil they unblock you.",
- "suspended_warning": "This user has been suspended.",
- "user_suspended_warning": "%s’s account has been suspended."
+ "blocking_warning": "لا يُمكنك الاطلاع على الملف الشخصي لهذا المُستخدِم\nحتَّى تَرفعَ الحَظر عنه.\nملفًّكَ الشخصي يَظهَرُ بِمثل هذِهِ الحالة بالنسبةِ لَهُ أيضًا.",
+ "user_blocking_warning": "لا يُمكنك الاطلاع على ملف %s الشخصي\nحتَّى تَرفعَ الحَظر عنه.\nملفًّكَ الشخصي يَظهَرُ بِمثل هذِهِ الحالة بالنسبةِ لَهُ أيضًا.",
+ "blocked_warning": "لا يُمكِنُكَ عَرض الملف الشخصي لهذا المُستخدِم\nحتَّى يَرفَعَ الحَظر عَنك.",
+ "user_blocked_warning": "لا يُمكِنُكَ عَرض ملف %s الشخصي\nحتَّى يَرفَعَ الحَظر عَنك.",
+ "suspended_warning": "تمَّ إيقاف هذا المُستخدِم.",
+ "user_suspended_warning": "لقد أوقِفَ حِساب %s."
}
}
}
},
"scene": {
"welcome": {
- "slogan": "Social networking\nback in your hands."
+ "slogan": "شبكات التواصل الاجتماعي\nمرة أُخرى بين يديك."
},
"server_picker": {
- "title": "Pick a server,\nany server.",
+ "title": "اِختر خادِم،\nأي خادِم.",
"button": {
"category": {
"all": "الكل",
"all_accessiblity_description": "الفئة: الكل",
- "academia": "academia",
+ "academia": "أكاديمي",
"activism": "للنشطاء",
"food": "الطعام",
"furry": "فروي",
"games": "ألعاب",
"general": "عام",
"journalism": "صحافة",
- "lgbt": "lgbt",
+ "lgbt": "مجتمع الشواذ",
"regional": "اقليمي",
"art": "فن",
"music": "موسيقى",
@@ -225,7 +226,7 @@
},
"empty_state": {
"finding_servers": "البحث عن خوادم متوفرة...",
- "bad_network": "Something went wrong while loading the data. Check your internet connection.",
+ "bad_network": "حدث خطأٌ ما أثناء تحميل البيانات. تحقَّق من اتصالك بالإنترنت.",
"no_results": "لا توجد نتائج"
}
},
@@ -263,29 +264,29 @@
"reason": "السبب"
},
"reason": {
- "blocked": "%s contains a disallowed email provider",
- "unreachable": "%s does not seem to exist",
- "taken": "%s is already in use",
- "reserved": "%s is a reserved keyword",
- "accepted": "%s must be accepted",
- "blank": "%s is required",
- "invalid": "%s is invalid",
- "too_long": "%s is too long",
- "too_short": "%s is too short",
- "inclusion": "%s is not a supported value"
+ "blocked": "يحتوي %s على موفِّر خدمة بريد إلكتروني غير مسموح به",
+ "unreachable": "يبدوا أنَّ %s غير موجود",
+ "taken": "إنَّ %s مُستخدَمٌ بالفعل",
+ "reserved": "إنَّ %s عبارة عن كلمة مفتاحيَّة محجوزة",
+ "accepted": "يجب أن يُقبل %s",
+ "blank": "%s مطلوب",
+ "invalid": "%s غير صالح",
+ "too_long": "%s طويل جداً",
+ "too_short": "%s قصير جدا",
+ "inclusion": "إنَّ %s قيمة غير مدعومة"
},
"special": {
- "username_invalid": "Username must only contain alphanumeric characters and underscores",
- "username_too_long": "Username is too long (can’t be longer than 30 characters)",
- "email_invalid": "This is not a valid email address",
- "password_too_short": "Password is too short (must be at least 8 characters)"
+ "username_invalid": "يُمكِن أن يحتوي اسم المستخدم على أحرف أبجدية، أرقام وشرطات سفلية فقط",
+ "username_too_long": "اسم المستخدم طويل جداً (يجب ألّا يكون أطول من 30 رمز)",
+ "email_invalid": "هذا عنوان بريد إلكتروني غير صالح",
+ "password_too_short": "كلمة المرور قصيرة جداً (يجب أن تكون 8 أحرف على الأقل)"
}
}
},
"server_rules": {
- "title": "Some ground rules.",
- "subtitle": "These rules are set by the admins of %s.",
- "prompt": "By continuing, you’re subject to the terms of service and privacy policy for %s.",
+ "title": "بعض القواعد الأساسية.",
+ "subtitle": "تم سنّ هذه القواعد من قبل مشرفي %s.",
+ "prompt": "إن اخترت المواصلة، فإنك تخضع لشروط الخدمة وسياسة الخصوصية لـ %s.",
"terms_of_service": "شروط الخدمة",
"privacy_policy": "سياسة الخصوصية",
"button": {
@@ -294,35 +295,35 @@
},
"confirm_email": {
"title": "شيء واحد أخير.",
- "subtitle": "We just sent an email to %s,\ntap the link to confirm your account.",
+ "subtitle": "لقد أرسلنا للتو رسالة بريد إلكتروني إلى %s،\nاضغط على الرابط لتأكيد حسابك.",
"button": {
- "open_email_app": "Open Email App",
- "dont_receive_email": "I never got an email"
+ "open_email_app": "افتح تطبيق البريد الإلكتروني",
+ "dont_receive_email": "لم أستلم أبدًا بريدا إلكترونيا"
},
"dont_receive_email": {
- "title": "Check your email",
- "description": "Check if your email address is correct as well as your junk folder if you haven’t.",
- "resend_email": "Resend Email"
+ "title": "تحقق من بريدك الإلكتروني",
+ "description": "تحقق ممَّ إذا كان عنوان بريدك الإلكتروني صحيحًا وكذلك تأكد مِن مجلد البريد غير الهام إذا لم تكن قد فعلت ذلك.",
+ "resend_email": "إعادة إرسال البريد الإلكتروني"
},
"open_email_app": {
- "title": "Check your inbox.",
- "description": "We just sent you an email. Check your junk folder if you haven’t.",
+ "title": "تحقَّق من بريدك الوارِد.",
+ "description": "لقد أرسلنا لك بريدًا إلكترونيًا للتو. تحقق من مجلد البريد غير الهام الخاص بك إذا لم تكن قد فعلت ذلك.",
"mail": "البريد",
- "open_email_client": "Open Email Client"
+ "open_email_client": "فتح عميل البريد الإلكتروني"
}
},
"home_timeline": {
"title": "الخيط الرئيسي",
"navigation_bar_state": {
"offline": "غير متصل",
- "new_posts": "See new posts",
- "published": "Published!",
- "Publishing": "Publishing post..."
+ "new_posts": "إظهار منشورات جديدة",
+ "published": "تم نشره!",
+ "Publishing": "جارٍ نشر المشاركة…"
}
},
"suggestion_account": {
- "title": "Find People to Follow",
- "follow_explain": "When you follow someone, you’ll see their posts in your home feed."
+ "title": "ابحث عن أشخاص لمتابعتهم",
+ "follow_explain": "عِندَ مُتابَعَتِكَ لأحدِهِم، سَوف تَرى مَنشوراته في تغذيَتِكَ الرئيسة."
},
"compose": {
"title": {
@@ -334,54 +335,54 @@
"photo_library": "مكتبة الصور",
"browse": "تصفح"
},
- "content_input_placeholder": "ما الذي يجول ببالك",
+ "content_input_placeholder": "أخبِرنا بِما يَجُولُ فِي ذِهنَك",
"compose_action": "انشر",
"replying_to_user": "رد على %s",
"attachment": {
"photo": "صورة",
"video": "فيديو",
- "attachment_broken": "This %s is broken and can’t be\nuploaded to Mastodon.",
- "description_photo": "Describe the photo for the visually-impaired...",
- "description_video": "Describe the video for the visually-impaired..."
+ "attachment_broken": "هذا ال%s مُعطَّل ويتعذَّر رفعه إلى ماستودون.",
+ "description_photo": "صِف الصورة للمكفوفين...",
+ "description_video": "صِف المقطع المرئي للمكفوفين..."
},
"poll": {
- "duration_time": "Duration: %s",
+ "duration_time": "المدة: %s",
"thirty_minutes": "30 دقيقة",
"one_hour": "ساعة واحدة",
"six_hours": "6 ساعات",
"one_day": "يوم واحد",
"three_days": "3 أيام",
"seven_days": "7 أيام",
- "option_number": "Option %ld"
+ "option_number": "الخيار %ld"
},
"content_warning": {
- "placeholder": "Write an accurate warning here..."
+ "placeholder": "اكتب تَحذيرًا دَقيقًا هُنا..."
},
"visibility": {
- "public": "Public",
- "unlisted": "Unlisted",
- "private": "Followers only",
- "direct": "Only people I mention"
+ "public": "للعامة",
+ "unlisted": "غير مُدرَج",
+ "private": "لمتابعيك فقط",
+ "direct": "ففط للأشخاص المشار إليهم"
},
"auto_complete": {
- "space_to_add": "Space to add"
+ "space_to_add": "انقر مساحة لإضافتِها"
},
"accessibility": {
- "append_attachment": "Add Attachment",
+ "append_attachment": "إضافة مُرفَق",
"append_poll": "اضافة استطلاع رأي",
"remove_poll": "إزالة الاستطلاع",
"custom_emoji_picker": "منتقي مخصص للإيموجي",
"enable_content_warning": "تنشيط تحذير المحتوى",
"disable_content_warning": "تعطيل تحذير الحتوى",
- "post_visibility_menu": "Post Visibility Menu"
+ "post_visibility_menu": "قائمة ظهور المنشور"
},
"keyboard": {
- "discard_post": "Discard Post",
- "publish_post": "Publish Post",
- "toggle_poll": "Toggle Poll",
- "toggle_content_warning": "Toggle Content Warning",
- "append_attachment_entry": "Add Attachment - %s",
- "select_visibility_entry": "Select Visibility - %s"
+ "discard_post": "تجاهُل المنشور",
+ "publish_post": "نَشر المَنشُور",
+ "toggle_poll": "تبديل الاستطلاع",
+ "toggle_content_warning": "تبديل تحذير المُحتوى",
+ "append_attachment_entry": "إضافة مُرفَق - %s",
+ "select_visibility_entry": "اختر مدى الظهور - %s"
}
},
"profile": {
@@ -393,7 +394,7 @@
"fields": {
"add_row": "إضافة صف",
"placeholder": {
- "label": "Label",
+ "label": "التسمية",
"content": "المحتوى"
}
},
@@ -405,14 +406,20 @@
"relationship_action_alert": {
"confirm_unmute_user": {
"title": "إلغاء كتم الحساب",
- "message": "Confirm to unmute %s"
+ "message": "أكِّد لرفع كتمْ %s"
},
"confirm_unblock_usre": {
"title": "إلغاء حظر الحساب",
- "message": "Confirm to unblock %s"
+ "message": "أكِّد لرفع حظر %s"
}
}
},
+ "follower": {
+ "footer": "لا يُمكِن عَرض المُتابِعين مِنَ الخوادم الأُخرى."
+ },
+ "following": {
+ "footer": "لا يُمكِن عَرض المُتابَعات مِنَ الخوادم الأُخرى."
+ },
"search": {
"title": "بحث",
"search_bar": {
@@ -423,12 +430,12 @@
"button_text": "طالع الكل",
"hash_tag": {
"title": "ذات شعبية على ماستدون",
- "description": "Hashtags that are getting quite a bit of attention",
- "people_talking": "%s people are talking"
+ "description": "الوسوم التي تحظى بقدر كبير من الاهتمام",
+ "people_talking": "%s أشخاص يتحدَّثوا"
},
"accounts": {
- "title": "Accounts you might like",
- "description": "You may like to follow these accounts",
+ "title": "حسابات قد تعجبك",
+ "description": "قد ترغب في متابعة هذه الحسابات",
"follow": "تابع"
}
},
@@ -440,34 +447,34 @@
"posts": "المنشورات"
},
"empty_state": {
- "no_results": "No results"
+ "no_results": "ليس هناك أية نتيجة"
},
- "recent_search": "Recent searches",
- "clear": "Clear"
+ "recent_search": "عمليات البحث الأخيرة",
+ "clear": "مَحو"
}
},
"favorite": {
- "title": "Your Favorites"
+ "title": "مفضلتك"
},
"notification": {
"title": {
- "Everything": "Everything",
- "Mentions": "Mentions"
+ "Everything": "الكل",
+ "Mentions": "الإشارات"
},
- "user_followed_you": "%s followed you",
- "user_favorited your post": "%s favorited your post",
- "user_reblogged_your_post": "%s reblogged your post",
- "user_mentioned_you": "%s mentioned you",
- "user_requested_to_follow_you": "%s requested to follow you",
- "user_your_poll_has_ended": "%s Your poll has ended",
+ "user_followed_you": "يتابعك %s",
+ "user_favorited your post": "أضاف %s منشورك إلى مفضلته",
+ "user_reblogged_your_post": "أعاد %s تدوين مشاركتك",
+ "user_mentioned_you": "أشار إليك %s",
+ "user_requested_to_follow_you": "طلب %s متابعتك",
+ "user_your_poll_has_ended": "%s اِنتهى استطلاعُكَ للرأي",
"keyobard": {
- "show_everything": "Show Everything",
- "show_mentions": "Show Mentions"
+ "show_everything": "إظهار كل شيء",
+ "show_mentions": "إظهار الإشارات"
}
},
"thread": {
- "back_title": "Post",
- "title": "Post from %s"
+ "back_title": "منشور",
+ "title": "مَنشور مِن %s"
},
"settings": {
"title": "الإعدادات",
@@ -475,44 +482,44 @@
"appearance": {
"title": "المظهر",
"automatic": "تلقائي",
- "light": "Always Light",
- "dark": "Always Dark"
+ "light": "مضيءٌ دائمًا",
+ "dark": "مظلمٌ دائِمًا"
},
"notifications": {
"title": "الإشعارات",
- "favorites": "Favorites my post",
- "follows": "Follows me",
- "boosts": "Reblogs my post",
- "mentions": "Mentions me",
+ "favorites": "الإعجاب بِمنشوراتي",
+ "follows": "يتابعني",
+ "boosts": "إعادة تدوين منشوراتي",
+ "mentions": "الإشارة لي",
"trigger": {
- "anyone": "anyone",
- "follower": "a follower",
- "follow": "anyone I follow",
- "noone": "no one",
- "title": "Notify me when"
+ "anyone": "أي شخص",
+ "follower": "مشترِك",
+ "follow": "أي شخص أُتابِعُه",
+ "noone": "لا أحد",
+ "title": "إشعاري عِندَ"
}
},
"preference": {
"title": "التفضيلات",
- "true_black_dark_mode": "True black dark mode",
- "disable_avatar_animation": "Disable animated avatars",
- "disable_emoji_animation": "Disable animated emojis",
- "using_default_browser": "Use default browser to open links"
+ "true_black_dark_mode": "النمط الأسود الداكِن الحقيقي",
+ "disable_avatar_animation": "تعطيل الصور الرمزية المتحرِّكة",
+ "disable_emoji_animation": "تعطيل الرموز التعبيرية المتحرِّكَة",
+ "using_default_browser": "اِستخدام المتصفح الافتراضي لفتح الروابط"
},
"boring_zone": {
- "title": "The Boring Zone",
+ "title": "المنطقة المملة",
"account_settings": "إعدادات الحساب",
"terms": "شروط الخدمة",
"privacy": "سياسة الخصوصية"
},
"spicy_zone": {
- "title": "The Spicy Zone",
- "clear": "Clear Media Cache",
+ "title": "المنطقة الحارة",
+ "clear": "مسح ذاكرة التخزين المؤقت للوسائط",
"signout": "تسجيل الخروج"
}
},
"footer": {
- "mastodon_description": "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء، على غيت هب %s (%s)"
+ "mastodon_description": "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء على GitHub في %s (%s)"
},
"keyboard": {
"close_settings_window": "إغلاق نافذة الإعدادات"
@@ -522,18 +529,28 @@
"title": "ابلغ عن %s",
"step1": "الخطوة 1 من 2",
"step2": "الخطوة 2 من 2",
- "content1": "Are there any other posts you’d like to add to the report?",
- "content2": "Is there anything the moderators should know about this report?",
- "send": "Send Report",
- "skip_to_send": "Send without comment",
- "text_placeholder": "Type or paste additional comments"
+ "content1": "هل ترغب في إضافة أي مشاركات أُخرى إلى الشكوى؟",
+ "content2": "هل هناك أي شيء يجب أن يعرفه المُراقبين حول هذه الشكوى؟",
+ "send": "إرسال الشكوى",
+ "skip_to_send": "إرسال بدون تعليق",
+ "text_placeholder": "اكتب أو الصق تعليقات إضافيَّة"
},
"preview": {
"keyboard": {
- "close_preview": "إغلاق المعاينة",
+ "close_preview": "إغلاق المُعايَنَة",
"show_next": "إظهار التالي",
"show_previous": "إظهار السابق"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "المِلف المُحدَّد حاليًا: %s. انقر نقرًا مزدوجًا ثم اضغط مع الاستمرار لإظهار مُبدِّل الحِساب",
+ "dismiss_account_switcher": "تجاهُل مبدِّل الحساب",
+ "add_account": "إضافة حساب"
+ },
+ "wizard": {
+ "new_in_mastodon": "جديد في ماستودون",
+ "multiple_account_switch_intro_description": "بدِّل بين حسابات متعددة عبر الاستمرار بالضغط على زر الملف الشخصي.",
+ "accessibility_hint": "انقر نقرًا مزدوجًا لتجاهل النافذة المنبثقة"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/ar_SA/ios-infoPlist.json b/Localization/StringsConvertor/input/ar_SA/ios-infoPlist.json
index 932ac804a..22fb2868e 100644
--- a/Localization/StringsConvertor/input/ar_SA/ios-infoPlist.json
+++ b/Localization/StringsConvertor/input/ar_SA/ios-infoPlist.json
@@ -1,6 +1,6 @@
{
- "NSCameraUsageDescription": "Used to take photo for post status",
- "NSPhotoLibraryAddUsageDescription": "Used to save photo into the Photo Library",
- "NewPostShortcutItemTitle": "New Post",
+ "NSCameraUsageDescription": "يُستخدم لالتقاط الصورة عِندَ نشر الحالات",
+ "NSPhotoLibraryAddUsageDescription": "يُستخدم لحِفظ الصورة في مكتبة الصور",
+ "NewPostShortcutItemTitle": "منشور جديد",
"SearchShortcutItemTitle": "البحث"
}
diff --git a/Localization/StringsConvertor/input/ca_ES/Localizable.stringsdict b/Localization/StringsConvertor/input/ca_ES/Localizable.stringsdict
index b76b0a921..140185bad 100644
--- a/Localization/StringsConvertor/input/ca_ES/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/ca_ES/Localizable.stringsdict
@@ -2,10 +2,26 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 notificació per llegir
+ other
+ %ld notificacions per llegir
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
- El límit d’entrada supera a %#@character_count@
+ El límit de la entrada supera a %#@character_count@
character_count
NSStringFormatSpecTypeKey
@@ -21,7 +37,7 @@
a11y.plural.count.input_limit_remains
NSStringLocalizedFormatKey
- El límit d’entrada continua sent %#@character_count@
+ El límit de la entrada continua sent %#@character_count@
character_count
NSStringFormatSpecTypeKey
@@ -95,7 +111,7 @@
one
1 impuls
other
- %ld impuls
+ %ld impulsos
plural.count.vote
@@ -285,9 +301,9 @@
NSStringFormatValueTypeKey
ld
one
- fa 1a
+ fa 1 any
other
- fa %ldy anys
+ fa %ld anys
date.month.ago.abbr
@@ -301,9 +317,9 @@
NSStringFormatValueTypeKey
ld
one
- fa 1M
+ fa 1 mes
other
- fa %ldM mesos
+ fa %ld mesos
date.day.ago.abbr
@@ -317,9 +333,9 @@
NSStringFormatValueTypeKey
ld
one
- fa 1d
+ fa 1 día
other
- fa %ldd dies
+ fa %ld dies
date.hour.ago.abbr
@@ -335,7 +351,7 @@
one
fa 1h
other
- fa %ldh hores
+ fa %ld hores
date.minute.ago.abbr
@@ -349,9 +365,9 @@
NSStringFormatValueTypeKey
ld
one
- fa 1m
+ fa 1 minut
other
- fa %ldm minuts
+ fa %ld minuts
date.second.ago.abbr
@@ -365,9 +381,9 @@
NSStringFormatValueTypeKey
ld
one
- fa 1s
+ fa 1 segon
other
- fa %lds seg
+ fa %ld segons
diff --git a/Localization/StringsConvertor/input/ca_ES/app.json b/Localization/StringsConvertor/input/ca_ES/app.json
index 19ff88b46..2ecd587c6 100644
--- a/Localization/StringsConvertor/input/ca_ES/app.json
+++ b/Localization/StringsConvertor/input/ca_ES/app.json
@@ -67,6 +67,7 @@
"done": "Fet",
"confirm": "Confirma",
"continue": "Continua",
+ "compose": "Composa",
"cancel": "Cancel·la",
"discard": "Descarta",
"try_again": "Torna a provar",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Els seguidors d'altres servidors no son mostrats."
+ },
+ "following": {
+ "footer": "Els seguits d'altres servidors no son mostrats."
+ },
"search": {
"title": "Cerca",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Mostrar Següent",
"show_previous": "Mostrar Anterior"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Perfil actual seleccionat: %s. Toca dues vegades i manté el dit per a mostrar el commutador de comptes",
+ "dismiss_account_switcher": "Descartar el commutador de comptes",
+ "add_account": "Afegir compte"
+ },
+ "wizard": {
+ "new_in_mastodon": "Nou a Mastodon",
+ "multiple_account_switch_intro_description": "Commuta entre diversos comptes mantenint premut el botó del perfil.",
+ "accessibility_hint": "Toca dues vegades per descartar l'assistent"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/cy_GB/Localizable.stringsdict b/Localization/StringsConvertor/input/cy_GB/Localizable.stringsdict
index 537064efb..e6b0d5f95 100644
--- a/Localization/StringsConvertor/input/cy_GB/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/cy_GB/Localizable.stringsdict
@@ -2,6 +2,30 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ zero
+ %ld unread notification
+ one
+ 1 unread notification
+ two
+ %ld unread notification
+ few
+ %ld unread notification
+ many
+ %ld unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/cy_GB/app.json b/Localization/StringsConvertor/input/cy_GB/app.json
index b60ade9c1..5c01ae7e0 100644
--- a/Localization/StringsConvertor/input/cy_GB/app.json
+++ b/Localization/StringsConvertor/input/cy_GB/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/da_DK/Localizable.stringsdict b/Localization/StringsConvertor/input/da_DK/Localizable.stringsdict
index c7c84d074..730e2902a 100644
--- a/Localization/StringsConvertor/input/da_DK/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/da_DK/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/da_DK/app.json b/Localization/StringsConvertor/input/da_DK/app.json
index b60ade9c1..5c01ae7e0 100644
--- a/Localization/StringsConvertor/input/da_DK/app.json
+++ b/Localization/StringsConvertor/input/da_DK/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/de_DE/Localizable.stringsdict b/Localization/StringsConvertor/input/de_DE/Localizable.stringsdict
index e89bdb074..66b7f2a2d 100644
--- a/Localization/StringsConvertor/input/de_DE/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/de_DE/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 ungelesene Benachrichtigung
+ other
+ %ld ungelesene Benachrichtigungen
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/de_DE/app.json b/Localization/StringsConvertor/input/de_DE/app.json
index ecfe841eb..dc8cdf8c0 100644
--- a/Localization/StringsConvertor/input/de_DE/app.json
+++ b/Localization/StringsConvertor/input/de_DE/app.json
@@ -67,6 +67,7 @@
"done": "Fertig",
"confirm": "Bestätigen",
"continue": "Fortfahren",
+ "compose": "Compose",
"cancel": "Abbrechen",
"discard": "Verwerfen",
"try_again": "Nochmals versuchen",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Suche",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Nächstes anzeigen",
"show_previous": "Vorheriges anzeigen"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Aktuell ausgewähltes Profil: %s. Doppeltippen dann gedrückt halten, um den Kontoschalter anzuzeigen",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Konto hinzufügen"
+ },
+ "wizard": {
+ "new_in_mastodon": "Neu in Mastodon",
+ "multiple_account_switch_intro_description": "Wechsel zwischen mehreren Konten durch drücken der Profil-Schaltfläche.",
+ "accessibility_hint": "Doppeltippen, um diesen Assistenten zu schließen"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/en_US/Localizable.stringsdict b/Localization/StringsConvertor/input/en_US/Localizable.stringsdict
index c7c84d074..730e2902a 100644
--- a/Localization/StringsConvertor/input/en_US/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/en_US/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/en_US/app.json b/Localization/StringsConvertor/input/en_US/app.json
index b60ade9c1..5c01ae7e0 100644
--- a/Localization/StringsConvertor/input/en_US/app.json
+++ b/Localization/StringsConvertor/input/en_US/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/es_AR/Localizable.stringsdict b/Localization/StringsConvertor/input/es_AR/Localizable.stringsdict
index f98962ccb..f4f0097eb 100644
--- a/Localization/StringsConvertor/input/es_AR/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/es_AR/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 notificación sin leer
+ other
+ %ld notificaciones sin leer
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/es_AR/app.json b/Localization/StringsConvertor/input/es_AR/app.json
index 301cec40e..ed909ecf1 100644
--- a/Localization/StringsConvertor/input/es_AR/app.json
+++ b/Localization/StringsConvertor/input/es_AR/app.json
@@ -67,6 +67,7 @@
"done": "Listo",
"confirm": "Confirmar",
"continue": "Continuar",
+ "compose": "Redactar",
"cancel": "Cancelar",
"discard": "Descartar",
"try_again": "Intentá de nuevo",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "No se muestran los seguidores de otros servidores."
+ },
+ "following": {
+ "footer": "No se muestran las cuentas de otros servidores que seguís."
+ },
"search": {
"title": "Buscar",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Mostrar siguiente",
"show_previous": "Mostrar anterior"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Perfil seleccionado actualmente: %s. Tocá dos veces y mantenelo presionado para cambiar de cuenta",
+ "dismiss_account_switcher": "Descartar cambio de cuenta",
+ "add_account": "Agregar cuenta"
+ },
+ "wizard": {
+ "new_in_mastodon": "Novedad en Mastodon",
+ "multiple_account_switch_intro_description": "Cambiá entre varias cuentas manteniendo presionado el botón del perfil.",
+ "accessibility_hint": "Tocá dos veces para descartar este asistente"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/es_ES/Localizable.stringsdict b/Localization/StringsConvertor/input/es_ES/Localizable.stringsdict
index bf493c1e8..d31d8825b 100644
--- a/Localization/StringsConvertor/input/es_ES/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/es_ES/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/es_ES/app.json b/Localization/StringsConvertor/input/es_ES/app.json
index 5151137d7..72967c40f 100644
--- a/Localization/StringsConvertor/input/es_ES/app.json
+++ b/Localization/StringsConvertor/input/es_ES/app.json
@@ -67,6 +67,7 @@
"done": "Hecho",
"confirm": "Confirmar",
"continue": "Continuar",
+ "compose": "Redactar",
"cancel": "Cancelar",
"discard": "Descartar",
"try_again": "Inténtalo de nuevo",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "No se muestran los seguidores de otros servidores."
+ },
+ "following": {
+ "footer": "No se muestran los seguidos de otros servidores."
+ },
"search": {
"title": "Buscar",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Mostrar Siguiente",
"show_previous": "Mostrar Anterior"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/fr_FR/Localizable.stringsdict b/Localization/StringsConvertor/input/fr_FR/Localizable.stringsdict
index d6fb911f3..4a912e4b3 100644
--- a/Localization/StringsConvertor/input/fr_FR/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/fr_FR/Localizable.stringsdict
@@ -2,10 +2,26 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 notification non lue
+ other
+ %ld notifications non lues
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
- Input limit exceeds %#@character_count@
+ La limite d’entrée dépasse %#@character_count@
character_count
NSStringFormatSpecTypeKey
@@ -13,9 +29,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 character
+ 1 caractère
other
- %ld characters
+ %ld caractères
a11y.plural.count.input_limit_remains
@@ -29,9 +45,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 character
+ 1 caractère
other
- %ld characters
+ %ld caractères
plural.count.metric_formatted.post
@@ -61,9 +77,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 post
+ 1 publication
other
- %ld posts
+ %ld publications
plural.count.favorite
@@ -157,9 +173,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 following
+ 1 abonnement
other
- %ld following
+ %ld abonnements
plural.count.follower
@@ -173,9 +189,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 follower
+ 1 abonné·e
other
- %ld followers
+ %ld abonné·e·s
date.year.left
@@ -189,9 +205,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 year left
+ Il reste 1 an
other
- %ld years left
+ %ld ans restants
date.month.left
@@ -205,9 +221,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 months left
+ 1 mois restant
other
- %ld months left
+ %ld mois restants
date.day.left
@@ -221,9 +237,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 day left
+ Il reste 1 jour
other
- %ld days left
+ il reste %ld jours
date.hour.left
@@ -237,9 +253,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 hour left
+ 1 heure restante
other
- %ld hours left
+ %ld heures restantes
date.minute.left
@@ -253,9 +269,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 minute left
+ 1 minute restante
other
- %ld minutes left
+ %ld minutes restantes
date.second.left
@@ -269,9 +285,9 @@
NSStringFormatValueTypeKey
ld
one
- 1 second left
+ Il reste 1 seconde
other
- %ld seconds left
+ %ld secondes restantes
date.year.ago.abbr
@@ -285,9 +301,9 @@
NSStringFormatValueTypeKey
ld
one
- 1y ago
+ il y a 1 année
other
- %ldy ago
+ il y a %ld ans
date.month.ago.abbr
@@ -301,9 +317,9 @@
NSStringFormatValueTypeKey
ld
one
- 1M ago
+ il y a 1 mois
other
- %ldM ago
+ il y a %ld mois
date.day.ago.abbr
@@ -317,9 +333,9 @@
NSStringFormatValueTypeKey
ld
one
- 1d ago
+ il y a 1j
other
- %ldd ago
+ il y a %ldj
date.hour.ago.abbr
@@ -333,9 +349,9 @@
NSStringFormatValueTypeKey
ld
one
- 1h ago
+ il y a 1h
other
- %ldh ago
+ il y a %ldh
date.minute.ago.abbr
@@ -349,9 +365,9 @@
NSStringFormatValueTypeKey
ld
one
- 1m ago
+ Il y a 1 m
other
- %ldm ago
+ il y a %ld m
date.second.ago.abbr
@@ -365,9 +381,9 @@
NSStringFormatValueTypeKey
ld
one
- 1s ago
+ Il y a 1 s
other
- %lds ago
+ il y a %ld s
diff --git a/Localization/StringsConvertor/input/fr_FR/app.json b/Localization/StringsConvertor/input/fr_FR/app.json
index 1a73b068e..dd834928a 100644
--- a/Localization/StringsConvertor/input/fr_FR/app.json
+++ b/Localization/StringsConvertor/input/fr_FR/app.json
@@ -67,6 +67,7 @@
"done": "Terminé",
"confirm": "Confirmer",
"continue": "Continuer",
+ "compose": "Compose",
"cancel": "Annuler",
"discard": "Abandonner",
"try_again": "Réessayer",
@@ -105,10 +106,10 @@
"open_settings": "Ouvrir les paramètres"
},
"timeline": {
- "previous_status": "Article précédent",
- "next_status": "Article suivant",
+ "previous_status": "Publication précédente",
+ "next_status": "Publication suivante",
"open_status": "Ouvrir la publication",
- "open_author_profile": "Ouvrir le profil de l'auteur",
+ "open_author_profile": "Ouvrir le profil de l’auteur·rice",
"open_reblogger_profile": "Ouvrir le profil du rebloggeur",
"reply_status": "Répondre à la publication",
"toggle_reblog": "Basculer le reblogue lors de la publication",
@@ -122,10 +123,10 @@
}
},
"status": {
- "user_reblogged": "%s à reblogué",
+ "user_reblogged": "%s a reblogué",
"user_replied_to": "À répondu à %s",
"show_post": "Montrer la publication",
- "show_user_profile": "Montrer le profil de l’utilisateur",
+ "show_user_profile": "Montrer le profil de l’utilisateur·rice",
"content_warning": "Avertissement de contenu",
"media_content_warning": "Tapotez n’importe où pour révéler la publication",
"poll": {
@@ -180,9 +181,9 @@
"header": {
"no_status_found": "Aucune publication trouvée",
"blocking_warning": "Vous ne pouvez pas voir le profil de cet utilisateur\n tant que vous ne l’avez pas débloqué\nVotre profil ressemble à ça pour lui.",
- "user_blocking_warning": "Vous ne pouvez pas voir le profil de %s tant que vous ne l’avez pas débloqué\nVotre profil ressemble à ça pour lui.",
+ "user_blocking_warning": "Vous ne pouvez pas voir le profil de %s\ntant que vous ne l’avez pas débloqué\nVotre profil ressemble à ça pour lui.",
"blocked_warning": "Vous ne pouvez pas voir le profil de cet utilisateur\n tant qu'il ne vous aura pas débloqué.",
- "user_blocked_warning": "Vous ne pouvez pas voir le profil de %s\n tant qu'il ne vous aura pas débloqué.",
+ "user_blocked_warning": "Vous ne pouvez pas voir le profil de %s\ntant qu’il ne vous aura pas débloqué.",
"suspended_warning": "Cet utilisateur a été suspendu.",
"user_suspended_warning": "Le compte de %s à été suspendu."
}
@@ -217,7 +218,7 @@
},
"label": {
"language": "LANGUE",
- "users": "UTILISATEURS",
+ "users": "UTILISATEUR·RICE·S",
"category": "CATÉGORIE"
},
"input": {
@@ -255,7 +256,7 @@
},
"error": {
"item": {
- "username": "Nom d'utilisateur",
+ "username": "Nom d’utilisateur",
"email": "Courriel",
"password": "Mot de passe",
"agreement": "Accord",
@@ -370,7 +371,7 @@
"append_attachment": "Joindre un document",
"append_poll": "Ajouter un Sondage",
"remove_poll": "Retirer le sondage",
- "custom_emoji_picker": "Sélecteur d’émojis personnalisé",
+ "custom_emoji_picker": "Sélecteur d’émojis personnalisés",
"enable_content_warning": "Basculer l’avertissement de contenu",
"disable_content_warning": "Désactiver l'avertissement de contenu",
"post_visibility_menu": "Menu de Visibilité de la publication"
@@ -405,7 +406,7 @@
"relationship_action_alert": {
"confirm_unmute_user": {
"title": "Ne plus mettre en sourdine ce compte",
- "message": "Êtes-vous sûr de vouloir mettre en sourdine %s"
+ "message": "Êtes-vous sûr de vouloir désactiver la sourdine de %s"
},
"confirm_unblock_usre": {
"title": "Débloquer le compte",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Les abonné·e·s issus des autres serveurs ne sont pas affiché·e·s."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Rechercher",
"search_bar": {
@@ -454,12 +461,12 @@
"Everything": "Tout",
"Mentions": "Mentions"
},
- "user_followed_you": "%s followed you",
- "user_favorited your post": "%s favorited your post",
- "user_reblogged_your_post": "%s reblogged your post",
- "user_mentioned_you": "%s mentioned you",
- "user_requested_to_follow_you": "%s requested to follow you",
- "user_your_poll_has_ended": "%s Your poll has ended",
+ "user_followed_you": "%s s’est abonné à vous",
+ "user_favorited your post": "%s a mis votre pouet en favori",
+ "user_reblogged_your_post": "%s a partagé votre publication",
+ "user_mentioned_you": "%s vous a mentionné",
+ "user_requested_to_follow_you": "%s a demandé à vous suivre",
+ "user_your_poll_has_ended": "%s votre sondage est terminé",
"keyobard": {
"show_everything": "Tout Afficher",
"show_mentions": "Afficher les mentions"
@@ -496,7 +503,7 @@
"title": "Préférences",
"true_black_dark_mode": "Vrai mode sombre",
"disable_avatar_animation": "Désactiver les avatars animés",
- "disable_emoji_animation": "Désactiver les émoticônes animées",
+ "disable_emoji_animation": "Désactiver les émojis animées",
"using_default_browser": "Utiliser le navigateur par défaut pour ouvrir les liens"
},
"boring_zone": {
@@ -534,6 +541,16 @@
"show_next": "Afficher le suivant",
"show_previous": "Afficher le précédent"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Ajouter un compte"
+ },
+ "wizard": {
+ "new_in_mastodon": "Nouveau dans Mastodon",
+ "multiple_account_switch_intro_description": "Basculez entre plusieurs comptes en appuyant de maniere prolongée sur le bouton profil.",
+ "accessibility_hint": "Tapotez deux fois pour fermer cet assistant"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/gd_GB/Localizable.stringsdict b/Localization/StringsConvertor/input/gd_GB/Localizable.stringsdict
index 63a998c6e..7a54f553e 100644
--- a/Localization/StringsConvertor/input/gd_GB/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/gd_GB/Localizable.stringsdict
@@ -2,6 +2,26 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ %ld bhrath nach deach a leughadh
+ two
+ %ld bhrath nach deach a leughadh
+ few
+ %ld brathan nach deach a leughadh
+ other
+ %ld brath nach deach a leughadh
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/gd_GB/app.json b/Localization/StringsConvertor/input/gd_GB/app.json
index 89ca12e3a..b5c66f8f6 100644
--- a/Localization/StringsConvertor/input/gd_GB/app.json
+++ b/Localization/StringsConvertor/input/gd_GB/app.json
@@ -67,6 +67,7 @@
"done": "Deiseil",
"confirm": "Dearbh",
"continue": "Lean air adhart",
+ "compose": "Sgrìobh",
"cancel": "Sguir dheth",
"discard": "Tilg air falbh",
"try_again": "Feuch ris a-rithist",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Cha dèid luchd-leantainn o fhrithealaichean eile a shealltainn."
+ },
+ "following": {
+ "footer": "Cha dèid cò air a leanas tu air frithealaichean eile a shealltainn."
+ },
"search": {
"title": "Lorg",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Air adhart",
"show_previous": "Air ais"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "A’ phròifil air a taghadh: %s. Thoir gnogag dhùbailte is cùm sìos a ghearradh leum gu cunntas eile",
+ "dismiss_account_switcher": "Leig seachad taghadh a’ chunntais",
+ "add_account": "Cuir cunntas ris"
+ },
+ "wizard": {
+ "new_in_mastodon": "Na tha ùr ann am Mastodon",
+ "multiple_account_switch_intro_description": "Geàrr leum eadar iomadh cunntas le cumail sìos putan na pròifil.",
+ "accessibility_hint": "Thoir gnogag dhùbailte a’ leigeil seachad an draoidh seo"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/hi_IN/Localizable.stringsdict b/Localization/StringsConvertor/input/hi_IN/Localizable.stringsdict
index c7c84d074..730e2902a 100644
--- a/Localization/StringsConvertor/input/hi_IN/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/hi_IN/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/hi_IN/app.json b/Localization/StringsConvertor/input/hi_IN/app.json
index b60ade9c1..5c01ae7e0 100644
--- a/Localization/StringsConvertor/input/hi_IN/app.json
+++ b/Localization/StringsConvertor/input/hi_IN/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/id_ID/Localizable.stringsdict b/Localization/StringsConvertor/input/id_ID/Localizable.stringsdict
index 718723849..88c0fac97 100644
--- a/Localization/StringsConvertor/input/id_ID/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/id_ID/Localizable.stringsdict
@@ -2,6 +2,20 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
@@ -69,7 +83,7 @@
NSStringFormatValueTypeKey
ld
other
- %ld favorites
+ %ld favorit
plural.count.reblog
@@ -97,7 +111,7 @@
NSStringFormatValueTypeKey
ld
other
- %ld votes
+ %ld suara
plural.count.voter
@@ -111,7 +125,7 @@
NSStringFormatValueTypeKey
ld
other
- %ld voters
+ %ld pemilih
plural.people_talking
diff --git a/Localization/StringsConvertor/input/id_ID/app.json b/Localization/StringsConvertor/input/id_ID/app.json
index cf4beced4..6f3171254 100644
--- a/Localization/StringsConvertor/input/id_ID/app.json
+++ b/Localization/StringsConvertor/input/id_ID/app.json
@@ -67,6 +67,7 @@
"done": "Selesai",
"confirm": "Konfirmasi",
"continue": "Lanjut",
+ "compose": "Compose",
"cancel": "Batal",
"discard": "Discard",
"try_again": "Coba Lagi",
@@ -267,7 +268,7 @@
"unreachable": "%s sepertinya tidak ada",
"taken": "%s sudah digunakan",
"reserved": "%s is a reserved keyword",
- "accepted": "%s must be accepted",
+ "accepted": "%s harus diterima",
"blank": "%s diperlukan",
"invalid": "%s tidak valid",
"too_long": "%s terlalu panjang",
@@ -355,7 +356,7 @@
"option_number": "Option %ld"
},
"content_warning": {
- "placeholder": "Write an accurate warning here..."
+ "placeholder": "Tulis peringatan yang akurat di sini..."
},
"visibility": {
"public": "Publik",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Cari",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/ja_JP/Localizable.stringsdict b/Localization/StringsConvertor/input/ja_JP/Localizable.stringsdict
index ac37d9a39..c51a9a29d 100644
--- a/Localization/StringsConvertor/input/ja_JP/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/ja_JP/Localizable.stringsdict
@@ -2,6 +2,20 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ other
+ %ld 件の未読通知
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
@@ -13,7 +27,7 @@
NSStringFormatValueTypeKey
ld
other
- %ld characters
+ %ld 文字
a11y.plural.count.input_limit_remains
@@ -27,7 +41,7 @@
NSStringFormatValueTypeKey
ld
other
- %ld characters
+ %ld 文字
plural.count.metric_formatted.post
@@ -97,7 +111,7 @@
NSStringFormatValueTypeKey
ld
other
- %ld votes
+ %ld票
plural.count.voter
@@ -181,7 +195,7 @@
NSStringFormatValueTypeKey
ld
other
- %ld months left
+ %ldか月前
date.day.left
@@ -265,7 +279,7 @@
NSStringFormatValueTypeKey
ld
other
- %ldM ago
+ %ld分前
date.day.ago.abbr
diff --git a/Localization/StringsConvertor/input/ja_JP/app.json b/Localization/StringsConvertor/input/ja_JP/app.json
index 3d05e62dc..417ca3e3a 100644
--- a/Localization/StringsConvertor/input/ja_JP/app.json
+++ b/Localization/StringsConvertor/input/ja_JP/app.json
@@ -67,6 +67,7 @@
"done": "完了",
"confirm": "確認",
"continue": "続ける",
+ "compose": "Compose",
"cancel": "キャンセル",
"discard": "破棄",
"try_again": "再実行",
@@ -191,7 +192,7 @@
},
"scene": {
"welcome": {
- "slogan": "Social networking\nback in your hands."
+ "slogan": "ソーシャルネットワーキングを、あなたの手の中に."
},
"server_picker": {
"title": "サーバーを選択",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "検索",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "次を見る",
"show_previous": "前を見る"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "アカウントを追加"
+ },
+ "wizard": {
+ "new_in_mastodon": "Mastodon の新機能",
+ "multiple_account_switch_intro_description": "プロフィールボタンを押して複数のアカウントを切り替えます。",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/kmr_TR/Localizable.stringsdict b/Localization/StringsConvertor/input/kmr_TR/Localizable.stringsdict
new file mode 100644
index 000000000..8ae1b812a
--- /dev/null
+++ b/Localization/StringsConvertor/input/kmr_TR/Localizable.stringsdict
@@ -0,0 +1,390 @@
+
+
+
+
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 agahdariya nexwendî
+ other
+ %ld agahdariyên nexwendî
+
+
+ a11y.plural.count.input_limit_exceeds
+
+ NSStringLocalizedFormatKey
+ Sînorê têketinê derbas kir %#@character_count@
+ character_count
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 tîp
+ other
+ %ld tîp
+
+
+ a11y.plural.count.input_limit_remains
+
+ NSStringLocalizedFormatKey
+ Sînorê têketinê %#@character_count@ maye
+ character_count
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 tîp
+ other
+ %ld tîp
+
+
+ plural.count.metric_formatted.post
+
+ NSStringLocalizedFormatKey
+ %@ %#@post_count@
+ post_count
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ şandî
+ other
+ şandî
+
+
+ plural.count.post
+
+ NSStringLocalizedFormatKey
+ %#@post_count@
+ post_count
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 şandî
+ other
+ %ld şandî
+
+
+ plural.count.favorite
+
+ NSStringLocalizedFormatKey
+ %#@favorite_count@
+ favorite_count
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 hezkirin
+ other
+ %ld hezkirin
+
+
+ plural.count.reblog
+
+ NSStringLocalizedFormatKey
+ %#@reblog_count@
+ reblog_count
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 ji nû ve nivîsandin
+ other
+ %ld ji nû ve nivîsandin
+
+
+ plural.count.vote
+
+ NSStringLocalizedFormatKey
+ %#@vote_count@
+ vote_count
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 deng
+ other
+ %ld deng
+
+
+ plural.count.voter
+
+ NSStringLocalizedFormatKey
+ %#@voter_count@
+ voter_count
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 hilbijêr
+ other
+ %ld hilbijêr
+
+
+ plural.people_talking
+
+ NSStringLocalizedFormatKey
+ %#@count_people_talking@
+ count_people_talking
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 mirov diaxive
+ other
+ %ld mirov diaxive
+
+
+ plural.count.following
+
+ NSStringLocalizedFormatKey
+ %#@count_following@
+ count_following
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 dişopîne
+ other
+ %ld dişopîne
+
+
+ plural.count.follower
+
+ NSStringLocalizedFormatKey
+ %#@count_follower@
+ count_follower
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 şopîner
+ other
+ %ld şopîner
+
+
+ date.year.left
+
+ NSStringLocalizedFormatKey
+ %#@count_year_left@
+ count_year_left
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 sal berê
+ other
+ %ld sal berê
+
+
+ date.month.left
+
+ NSStringLocalizedFormatKey
+ %#@count_month_left@
+ count_month_left
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 meh berê
+ other
+ %ld meh berê
+
+
+ date.day.left
+
+ NSStringLocalizedFormatKey
+ %#@count_day_left@
+ count_day_left
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 roj berê
+ other
+ %ld roj berê
+
+
+ date.hour.left
+
+ NSStringLocalizedFormatKey
+ %#@count_hour_left@
+ count_hour_left
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 demjimêr berê
+ other
+ %ld demjimêr berê
+
+
+ date.minute.left
+
+ NSStringLocalizedFormatKey
+ %#@count_minute_left@
+ count_minute_left
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 xulek berê
+ other
+ %ld xulek berê
+
+
+ date.second.left
+
+ NSStringLocalizedFormatKey
+ %#@count_second_left@
+ count_second_left
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 çirke berê
+ other
+ %ld çirke berê
+
+
+ date.year.ago.abbr
+
+ NSStringLocalizedFormatKey
+ %#@count_year_ago_abbr@
+ count_year_ago_abbr
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 sal berê
+ other
+ %ld sal berê
+
+
+ date.month.ago.abbr
+
+ NSStringLocalizedFormatKey
+ %#@count_month_ago_abbr@
+ count_month_ago_abbr
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 xulek berê
+ other
+ %ld xulek berê
+
+
+ date.day.ago.abbr
+
+ NSStringLocalizedFormatKey
+ %#@count_day_ago_abbr@
+ count_day_ago_abbr
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 roj berê
+ other
+ %ld roj berê
+
+
+ date.hour.ago.abbr
+
+ NSStringLocalizedFormatKey
+ %#@count_hour_ago_abbr@
+ count_hour_ago_abbr
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 demjimêr berê
+ other
+ %ld demjimêr berê
+
+
+ date.minute.ago.abbr
+
+ NSStringLocalizedFormatKey
+ %#@count_minute_ago_abbr@
+ count_minute_ago_abbr
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 xulek berê
+ other
+ %ld xulek berê
+
+
+ date.second.ago.abbr
+
+ NSStringLocalizedFormatKey
+ %#@count_second_ago_abbr@
+ count_second_ago_abbr
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 çirke berê
+ other
+ %ld çirke berê
+
+
+
+
diff --git a/Localization/StringsConvertor/input/kmr_TR/app.json b/Localization/StringsConvertor/input/kmr_TR/app.json
new file mode 100644
index 000000000..c360eb430
--- /dev/null
+++ b/Localization/StringsConvertor/input/kmr_TR/app.json
@@ -0,0 +1,556 @@
+{
+ "common": {
+ "alerts": {
+ "common": {
+ "please_try_again": "Ji kerema xwe dîsa biceribîne.",
+ "please_try_again_later": "Ji kerema xwe paşê dîsa biceribîne."
+ },
+ "sign_up_failure": {
+ "title": "Tomarkirin têkçû"
+ },
+ "server_error": {
+ "title": "Çewtiya rajekar"
+ },
+ "vote_failure": {
+ "title": "Dengdayîn têkçû",
+ "poll_ended": "Rapirsîya qediya"
+ },
+ "discard_post_content": {
+ "title": "Reşnivîsê paşguh bike",
+ "message": "Bipejrîne ku naveroka şandiyê ya hatiye nivîsandin paşguh bikî."
+ },
+ "publish_post_failure": {
+ "title": "Weşandin têkçû",
+ "message": "Weşandina şandiyê têkçû.\nJkx girêdana înternetê xwe kontrol bike.",
+ "attachments_message": {
+ "video_attach_with_photo": "Nikare vîdyoyekê tevlî şandiyê ku berê wêne tê de heye bike.",
+ "more_than_one_video": "Nikare ji bêtirî yek vîdyoyekê tevlî şandiyê bike."
+ }
+ },
+ "edit_profile_failure": {
+ "title": "Di serrastkirina profîlê çewtî",
+ "message": "Nikare profîlê serrast bike. Jkx dîsa biceribîne."
+ },
+ "sign_out": {
+ "title": "Derkeve",
+ "message": "Ma tu dixwazî ku derkevî?",
+ "confirm": "Derkeve"
+ },
+ "block_domain": {
+ "title": "Tu ji xwe bawerî, bi rastî tu dixwazî hemû %s asteng bikî? Di gelek rewşan de asteng kirin an jî bêdeng kirin têrê dike û tê tercîh kirin. Tu nikarî naveroka vê navperê di demnameyê an jî agahdariyên xwe de bibînî. Şopînerên te yê di vê navperê were jêbirin.",
+ "block_entire_domain": "Navperê asteng bike"
+ },
+ "save_photo_failure": {
+ "title": "Tomarkirina wêneyê têkçû",
+ "message": "Ji kerema xwe mafê bide gihîştina wênegehê çalak bike da ku wêne werin tomarkirin."
+ },
+ "delete_post": {
+ "title": "Ma tu dixwazî vê şandiyê jê bibî?",
+ "delete": "Jê bibe"
+ },
+ "clean_cache": {
+ "title": "Pêşbîrê pak bike",
+ "message": "Pêşbîra %s biserketî hate pakkirin."
+ }
+ },
+ "controls": {
+ "actions": {
+ "back": "Vegere",
+ "next": "Pêş",
+ "previous": "Paş",
+ "open": "Veke",
+ "add": "Tevlî bike",
+ "remove": "Rake",
+ "edit": "Serrast bike",
+ "save": "Tomar bike",
+ "ok": "BAŞ E",
+ "done": "Qediya",
+ "confirm": "Bipejirîne",
+ "continue": "Bidomîne",
+ "compose": "Binivîsîne",
+ "cancel": "Dev jê berde",
+ "discard": "Biavêje",
+ "try_again": "Dîsa biceribîne",
+ "take_photo": "Wêne bikişîne",
+ "save_photo": "Wêneyê tomar bike",
+ "copy_photo": "Wêneyê jê bigire",
+ "sign_in": "Têkeve",
+ "sign_up": "Tomar bibe",
+ "see_more": "Bêtir bibîne",
+ "preview": "Pêşdîtin",
+ "share": "Parve bike",
+ "share_user": "%s parve bike",
+ "share_post": "Şandiyê parve bike",
+ "open_in_safari": "Di Safariyê de veke",
+ "find_people": "Mirovan bo şopandinê bibîne",
+ "manually_search": "Ji devlê bi destan lêgerînê bike",
+ "skip": "Derbas bike",
+ "reply": "Bersivê bide",
+ "report_user": "%s ragihîne",
+ "block_domain": "%s asteng bike",
+ "unblock_domain": "%s asteng neke",
+ "settings": "Sazkarî",
+ "delete": "Jê bibe"
+ },
+ "tabs": {
+ "home": "Serrûpel",
+ "search": "Bigere",
+ "notification": "Agahdarî",
+ "profile": "Profîl"
+ },
+ "keyboard": {
+ "common": {
+ "switch_to_tab": "Biguherîne bo %s",
+ "compose_new_post": "Şandiyeke nû binivsîne",
+ "show_favorites": "Bijarteyan nîşan bide",
+ "open_settings": "Sazkariyan Veke"
+ },
+ "timeline": {
+ "previous_status": "Şandeya paş",
+ "next_status": "Şandiya pêş",
+ "open_status": "Şandiyê veke",
+ "open_author_profile": "Profîla nivîskaran veke",
+ "open_reblogger_profile": "Profîla nivîskaran veke",
+ "reply_status": "Bersivê bide şandiyê",
+ "toggle_reblog": "Ji vû nivîsandin di şandiyê de biguherîne",
+ "toggle_favorite": "Li ser şandiyê bijarte biguherîne",
+ "toggle_content_warning": "Hişyariya naverokê biguherîne",
+ "preview_image": "Pêşdîtina wêneyê"
+ },
+ "segmented_control": {
+ "previous_section": "Beşa paş",
+ "next_section": "Beşa pêş"
+ }
+ },
+ "status": {
+ "user_reblogged": "%s ji nû ve hate nivîsandin",
+ "user_replied_to": "Bersiv da %s",
+ "show_post": "Şandiyê nîşan bide",
+ "show_user_profile": "Profîla bikarhêner nîşan bide",
+ "content_warning": "Hişyariya naverokê",
+ "media_content_warning": "Ji bo eşkerekirinê li derekî bitikîne",
+ "poll": {
+ "vote": "Deng bide",
+ "closed": "Girtî"
+ },
+ "actions": {
+ "reply": "Bersivê bide",
+ "reblog": "Ji nû ve nivîsandin",
+ "unreblog": "Ji nû ve nivîsandinê vegere",
+ "favorite": "Bijarte",
+ "unfavorite": "Nebijarte",
+ "menu": "Kulîn"
+ },
+ "tag": {
+ "url": "URL",
+ "mention": "Qalkirin",
+ "link": "Girêdan",
+ "hashtag": "Hashtag",
+ "email": "E-name",
+ "emoji": "Emojî"
+ }
+ },
+ "friendship": {
+ "follow": "Bişopîne",
+ "following": "Dişopîne",
+ "request": "Daxwaz bike",
+ "pending": "Tê nirxandin",
+ "block": "Asteng bike",
+ "block_user": "%s asteng bike",
+ "block_domain": "%s asteng bike",
+ "unblock": "Astengiyê rake",
+ "unblock_user": "%s asteng neke",
+ "blocked": "Astengkirî",
+ "mute": "Bêdeng bike",
+ "mute_user": "%s bêdeng bike",
+ "unmute": "Bêdeng neke",
+ "unmute_user": "%s bêdeng neke",
+ "muted": "Bêdengkirî",
+ "edit_info": "Zanyariyan serrast bike"
+ },
+ "timeline": {
+ "filtered": "Parzûnkirî",
+ "timestamp": {
+ "now": "Niha"
+ },
+ "loader": {
+ "load_missing_posts": "Şandiyên wendayî bar bike",
+ "loading_missing_posts": "Şandiyên wendayî tên barkirin...",
+ "show_more_replies": "Bêtir bersivan nîşan bide"
+ },
+ "header": {
+ "no_status_found": "Tu şandî nehate dîtin",
+ "blocking_warning": "Tu nikarî profîla vî/ê bikarhênerî bibînî\nHeya ku tu astengiyê li ser wî/ê ranekî.\nProfîla te ji wan ra wiha xuya dike.",
+ "user_blocking_warning": "Tu nikarî profîla %s bibînî\nHeya ku tu astengiyê li ser wî/ê ranekî.\nProfîla te ji wan ra wiha xuya dike.",
+ "blocked_warning": "Tu nikarî profîla vî/ê bikarhênerî bibînî\nheya ku ew astengiyê li ser te rakin.",
+ "user_blocked_warning": "Tu nikarî profîla %s bibînî\nHeta ku astengîya te rakin.",
+ "suspended_warning": "Ev bikarhêner hatiye rawestandin.",
+ "user_suspended_warning": "Ajimêra %s hatiye rawestandin."
+ }
+ }
+ }
+ },
+ "scene": {
+ "welcome": {
+ "slogan": "Torên civakî\ndi destên te de."
+ },
+ "server_picker": {
+ "title": "Rajekarekê hilbijêre,\nHer kîjan rajekar be.",
+ "button": {
+ "category": {
+ "all": "Hemû",
+ "all_accessiblity_description": "Beş: Hemû",
+ "academia": "akademî",
+ "activism": "çalakî",
+ "food": "xwarin",
+ "furry": "furry",
+ "games": "lîsk",
+ "general": "giştî",
+ "journalism": "rojnamevanî",
+ "lgbt": "lgbt",
+ "regional": "herêmî",
+ "art": "huner",
+ "music": "muzîk",
+ "tech": "teknolojî"
+ },
+ "see_less": "Kêmtir bibîne",
+ "see_more": "Bêtir bibîne"
+ },
+ "label": {
+ "language": "ZIMAN",
+ "users": "BIKARHÊNER",
+ "category": "BEŞ"
+ },
+ "input": {
+ "placeholder": "Rajekarekî bibîne an jî beşdarî ya xwe bibe..."
+ },
+ "empty_state": {
+ "finding_servers": "Peydakirina rajekarên berdest...",
+ "bad_network": "Di dema barkirina daneyan da çewtî derket. Girêdana xwe ya înternetê kontrol bike.",
+ "no_results": "Encam tune"
+ }
+ },
+ "register": {
+ "title": "Ji me re hinekî qala xwe bike.",
+ "input": {
+ "avatar": {
+ "delete": "Jê bibe"
+ },
+ "username": {
+ "placeholder": "navê bikarhêner",
+ "duplicate_prompt": "Navê vê bikarhêner tê girtin."
+ },
+ "display_name": {
+ "placeholder": "navê nîşanê"
+ },
+ "email": {
+ "placeholder": "e-name"
+ },
+ "password": {
+ "placeholder": "pêborîn",
+ "hint": "Pêborîna te herî kêm divê ji 8 tîpan pêk bê"
+ },
+ "invite": {
+ "registration_user_invite_request": "Tu çima dixwazî beşdar bibî?"
+ }
+ },
+ "error": {
+ "item": {
+ "username": "Navê bikarhêner",
+ "email": "E-name",
+ "password": "Pêborîn",
+ "agreement": "Peyman",
+ "locale": "Zimanê navrûyê",
+ "reason": "Sedem"
+ },
+ "reason": {
+ "blocked": "%s peydekerê e-peyamê yê qedexekirî dihewîne",
+ "unreachable": "%s xuya ye ku tune ye",
+ "taken": "%s jixwe tê bikaranîn",
+ "reserved": "%s peyveke parastî ye",
+ "accepted": "%s divê were pejirandin",
+ "blank": "%s pêwist e",
+ "invalid": "%s ne derbasdar e",
+ "too_long": "%s pir dirêj e",
+ "too_short": "%s pir kurt e",
+ "inclusion": "%s ne nirxek piştgirî ye"
+ },
+ "special": {
+ "username_invalid": "Navê bikarhêner divê tenê ji tîpên alfajimarî û binxêz pêk be",
+ "username_too_long": "Navê bikarhêner pir dirêj e (ji 30 tîpan dirêjtir nabe)",
+ "email_invalid": "Ev navnîşaneke e-nameyê ne derbasdar e",
+ "password_too_short": "Pêborîn pir kurt e (divê herî kêm 8 tîp be)"
+ }
+ }
+ },
+ "server_rules": {
+ "title": "Hinek rêzikên bingehîn.",
+ "subtitle": "Ev rêzik ji aliyê rêvebirên %s ve tên sazkirin.",
+ "prompt": "Bi domandinê, tu ji bo %s di bin mercên bikaranînê û polîtîkaya nepenîtiyê dipejirînî.",
+ "terms_of_service": "mercên bikaranînê",
+ "privacy_policy": "polîtikaya nihêniyê",
+ "button": {
+ "confirm": "Ez dipejirînim"
+ }
+ },
+ "confirm_email": {
+ "title": "Tiştekî dawî.",
+ "subtitle": "Me tenê e-nameyek ji %s re şand,\ngirêdanê bitikne da ku ajimêra xwe bidî piştrastkirin.",
+ "button": {
+ "open_email_app": "Sepana e-nameyê veke",
+ "dont_receive_email": "Min hîç e-nameyeke nesitand"
+ },
+ "dont_receive_email": {
+ "title": "E-nameyê xwe kontrol bike",
+ "description": "Kontrol bike ka navnîşana e-nameya te rast e û her wiha peldanka xwe ya spam.",
+ "resend_email": "E-namyê yê dîsa bişîne"
+ },
+ "open_email_app": {
+ "title": "Nameyên xwe yên wergirtî kontrol bike.",
+ "description": "Me tenê ji te re e-nameyek şand. Heke nehatiye peldanka xwe ya spamê kontrol bike.",
+ "mail": "E-name",
+ "open_email_client": "Rajegirê e-nameyê veke"
+ }
+ },
+ "home_timeline": {
+ "title": "Serrûpel",
+ "navigation_bar_state": {
+ "offline": "Derhêl",
+ "new_posts": "Şandiyên nû bibîne",
+ "published": "Hate weşandin!",
+ "Publishing": "Şandî tê weşandin..."
+ }
+ },
+ "suggestion_account": {
+ "title": "Kesên bo ku bişopînî bibîne",
+ "follow_explain": "Gava tu kesekî dişopînî, tu yê şandiyê wan di serrûpelê de bibîne."
+ },
+ "compose": {
+ "title": {
+ "new_post": "Şandiya nû",
+ "new_reply": "Bersiva nû"
+ },
+ "media_selection": {
+ "camera": "Wêne bikişîne",
+ "photo_library": "Wênegeh",
+ "browse": "Bigere"
+ },
+ "content_input_placeholder": "Tiştê ku di hişê te de ye binivîsin an jî pêve bike",
+ "compose_action": "Biweşîne",
+ "replying_to_user": "bersiv bide %s",
+ "attachment": {
+ "photo": "wêne",
+ "video": "vîdyo",
+ "attachment_broken": "Ev %s naxebite û nayê barkirin\n li ser Mastodon.",
+ "description_photo": "Wêneyê ji bo kêmbînên dîtbar bide nasîn...",
+ "description_video": "Vîdyoyê ji bo kêmbînên dîtbar bide nasîn..."
+ },
+ "poll": {
+ "duration_time": "Dirêjî: %s",
+ "thirty_minutes": "30 xulek",
+ "one_hour": "1 Demjimêr",
+ "six_hours": "6 Demjimêr",
+ "one_day": "1 Roj",
+ "three_days": "3 Roj",
+ "seven_days": "7 Roj",
+ "option_number": "Vebijêrk %ld"
+ },
+ "content_warning": {
+ "placeholder": "Li vir hişyariyek hûrgilî binivîsine..."
+ },
+ "visibility": {
+ "public": "Gelemperî",
+ "unlisted": "Nerêzokkirî",
+ "private": "Tenê şopîneran",
+ "direct": "Tenê mirovên ku min qalkirî"
+ },
+ "auto_complete": {
+ "space_to_add": "Bicîhkirinê tevlî bike"
+ },
+ "accessibility": {
+ "append_attachment": "Pêvek tevlî bike",
+ "append_poll": "Rapirsî tevlî bike",
+ "remove_poll": "Rapirsî rake",
+ "custom_emoji_picker": "Hilbijêrê emojî yên kesanekirî",
+ "enable_content_warning": "Hişyariya naverokê çalak bike",
+ "disable_content_warning": "Hişyariya naverokê neçalak bike",
+ "post_visibility_menu": "Kulîna xuyabûna şandiyê"
+ },
+ "keyboard": {
+ "discard_post": "Şandî paşguh bike",
+ "publish_post": "Şandiyê biweşîne",
+ "toggle_poll": "Rapirsiyê biguherîne",
+ "toggle_content_warning": "Hişyariya naverokê biguherîne",
+ "append_attachment_entry": "Pêvek tevlî bike - %s",
+ "select_visibility_entry": "Xuyabûnê hilbijêre - %s"
+ }
+ },
+ "profile": {
+ "dashboard": {
+ "posts": "şandî",
+ "following": "dişopîne",
+ "followers": "şopîner"
+ },
+ "fields": {
+ "add_row": "Rêzê tevlî bike",
+ "placeholder": {
+ "label": "Nîşan",
+ "content": "Naverok"
+ }
+ },
+ "segmented_control": {
+ "posts": "Şandî",
+ "replies": "Bersiv",
+ "media": "Medya"
+ },
+ "relationship_action_alert": {
+ "confirm_unmute_user": {
+ "title": "Ajimêrê bêdeng neke",
+ "message": "Ji bo vekirina bêdengkirinê bipejirîne %s"
+ },
+ "confirm_unblock_usre": {
+ "title": "Astengiyê li ser ajimêr rake",
+ "message": "Ji bo rakirina astengkirinê bipejirîne %s"
+ }
+ }
+ },
+ "follower": {
+ "footer": "Şopîner ji rajekerên din nayê dîtin."
+ },
+ "following": {
+ "footer": "Şopandin ji rajekerên din nayê dîtin."
+ },
+ "search": {
+ "title": "Bigere",
+ "search_bar": {
+ "placeholder": "Li hashtag û bikarhêneran bigere",
+ "cancel": "Dev jê berde"
+ },
+ "recommend": {
+ "button_text": "Hemûyan bibîne",
+ "hash_tag": {
+ "title": "Rojev li ser Mastodon",
+ "description": "Hashtag ên ku pir balê dikişînin",
+ "people_talking": "%s kes diaxivin"
+ },
+ "accounts": {
+ "title": "Ajimêrên ku belkî tu jê hez bikî",
+ "description": "Dibe ku tu bixwazî van ajimêran bişopînî",
+ "follow": "Bişopîne"
+ }
+ },
+ "searching": {
+ "segment": {
+ "all": "Hemû",
+ "people": "Mirov",
+ "hashtags": "Hashtag",
+ "posts": "Şandî"
+ },
+ "empty_state": {
+ "no_results": "Encam tune"
+ },
+ "recent_search": "Lêgerînên dawî",
+ "clear": "Pak bike"
+ }
+ },
+ "favorite": {
+ "title": "Bijarteyên te"
+ },
+ "notification": {
+ "title": {
+ "Everything": "Her tişt",
+ "Mentions": "Qalkirin"
+ },
+ "user_followed_you": "%s te şopand",
+ "user_favorited your post": "%s şandiya te hez kir",
+ "user_reblogged_your_post": "%s posta we ji nû ve tomar kir",
+ "user_mentioned_you": "%s qale te kir",
+ "user_requested_to_follow_you": "%s dixwazê te bişopîne",
+ "user_your_poll_has_ended": "Rapirsîya te qediya",
+ "keyobard": {
+ "show_everything": "Her tiştî nîşan bide",
+ "show_mentions": "Qalkirinan nîşan bike"
+ }
+ },
+ "thread": {
+ "back_title": "Şandî",
+ "title": "Şandî ji %s"
+ },
+ "settings": {
+ "title": "Sazkarî",
+ "section": {
+ "appearance": {
+ "title": "Xuyang",
+ "automatic": "Xweber",
+ "light": "Her dem ronî",
+ "dark": "Her dem tarî"
+ },
+ "notifications": {
+ "title": "Agahdarî",
+ "favorites": "Şandiyên min hez kir",
+ "follows": "Min dişopîne",
+ "boosts": "Şandiya min ji nû ve nivîsand",
+ "mentions": "Qale min kir",
+ "trigger": {
+ "anyone": "her kes",
+ "follower": "şopînerek",
+ "follow": "her kesê ku dişopînim",
+ "noone": "ne yek",
+ "title": "Min agahdar bike gava"
+ }
+ },
+ "preference": {
+ "title": "Hilbijarte",
+ "true_black_dark_mode": "Moda tarî ya reş a rastîn",
+ "disable_avatar_animation": "Avatarên anîmasyonî neçalak bike",
+ "disable_emoji_animation": "Emojiyên anîmasyonî neçalak bike",
+ "using_default_browser": "Ji bo vekirina girêdanan geroka berdest bi kar bîne"
+ },
+ "boring_zone": {
+ "title": "Devera acizker",
+ "account_settings": "Sazkariyên ajimêr",
+ "terms": "Mercên bikaranînê",
+ "privacy": "Polîtikaya nihêniyê"
+ },
+ "spicy_zone": {
+ "title": "Devera germ",
+ "clear": "Pêşbîra medyayê pak bike",
+ "signout": "Derkeve"
+ }
+ },
+ "footer": {
+ "mastodon_description": "Mastodon nermalava çavkaniya vekirî ye. Tu dikarî pirsgirêkan li ser GitHub-ê ragihînî di %s (%s) de"
+ },
+ "keyboard": {
+ "close_settings_window": "Sazkariyên çarçoveyê bigire"
+ }
+ },
+ "report": {
+ "title": "%s ragihîne",
+ "step1": "Gav 1 ji 2",
+ "step2": "Gav 2 ji 2",
+ "content1": "Şandiyên din hene ku tu dixwazî tevlî ragihandinê bikî?",
+ "content2": "Derbarê vê ragihandinê de tiştek heye ku divê çavdêr bizanin?",
+ "send": "Ragihandinê bişîne",
+ "skip_to_send": "Bêyî şirove bişîne",
+ "text_placeholder": "Şiroveyên daxwazkirê binivîsine an jî pê ve bike"
+ },
+ "preview": {
+ "keyboard": {
+ "close_preview": "Pêşdîtin bigire",
+ "show_next": "A pêş nîşan bide",
+ "show_previous": "A paş nîşan bide"
+ }
+ },
+ "account_list": {
+ "tab_bar_hint": "Profîla hilbijartî ya niha: %s. Du caran bitikîne û paşê dest bide ser da ku guhêrbara ajimêr were nîşandan",
+ "dismiss_account_switcher": "Guherkera ajimêrê paş guh bike",
+ "add_account": "Ajimêr tevlî bike"
+ },
+ "wizard": {
+ "new_in_mastodon": "Nû di Mastodon de",
+ "multiple_account_switch_intro_description": "Dest bide ser bişkoja profîlê da ku di navbera gelek ajimêrann de biguherînî.",
+ "accessibility_hint": "Du caran bitikîne da ku çarçoveyahilpekok ji holê rakî"
+ }
+ }
+}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/kmr_TR/ios-infoPlist.json b/Localization/StringsConvertor/input/kmr_TR/ios-infoPlist.json
new file mode 100644
index 000000000..cdb286c00
--- /dev/null
+++ b/Localization/StringsConvertor/input/kmr_TR/ios-infoPlist.json
@@ -0,0 +1,6 @@
+{
+ "NSCameraUsageDescription": "Bo kişandina wêneyê ji bo rewşa şandiyan tê bikaranîn",
+ "NSPhotoLibraryAddUsageDescription": "Ji bo tomarkirina wêneyê di pirtûkxaneya wêneyan de tê bikaranîn",
+ "NewPostShortcutItemTitle": "Şandiya nû",
+ "SearchShortcutItemTitle": "Bigere"
+}
diff --git a/Localization/StringsConvertor/input/ko_KR/Localizable.stringsdict b/Localization/StringsConvertor/input/ko_KR/Localizable.stringsdict
index 4b19bab17..7c990671b 100644
--- a/Localization/StringsConvertor/input/ko_KR/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/ko_KR/Localizable.stringsdict
@@ -2,6 +2,20 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/ko_KR/app.json b/Localization/StringsConvertor/input/ko_KR/app.json
index 4cc299238..571b14659 100644
--- a/Localization/StringsConvertor/input/ko_KR/app.json
+++ b/Localization/StringsConvertor/input/ko_KR/app.json
@@ -67,6 +67,7 @@
"done": "완료",
"confirm": "확인",
"continue": "계속",
+ "compose": "Compose",
"cancel": "취소",
"discard": "버리기",
"try_again": "다시 시도",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "검색",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "다음 보기",
"show_previous": "이전 보기"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/nl_NL/Localizable.stringsdict b/Localization/StringsConvertor/input/nl_NL/Localizable.stringsdict
index 1726606b4..8b6ab05ca 100644
--- a/Localization/StringsConvertor/input/nl_NL/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/nl_NL/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/nl_NL/app.json b/Localization/StringsConvertor/input/nl_NL/app.json
index df20cab67..d8ee1e574 100644
--- a/Localization/StringsConvertor/input/nl_NL/app.json
+++ b/Localization/StringsConvertor/input/nl_NL/app.json
@@ -67,6 +67,7 @@
"done": "Klaar",
"confirm": "Bevestigen",
"continue": "Doorgaan",
+ "compose": "Compose",
"cancel": "Annuleren",
"discard": "Weggooien",
"try_again": "Probeer Opnieuw",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Zoeken",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Volgende",
"show_previous": "Vorige"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/pt_BR/Localizable.stringsdict b/Localization/StringsConvertor/input/pt_BR/Localizable.stringsdict
index c7c84d074..730e2902a 100644
--- a/Localization/StringsConvertor/input/pt_BR/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/pt_BR/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/pt_BR/app.json b/Localization/StringsConvertor/input/pt_BR/app.json
index b60ade9c1..5c01ae7e0 100644
--- a/Localization/StringsConvertor/input/pt_BR/app.json
+++ b/Localization/StringsConvertor/input/pt_BR/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/pt_PT/Localizable.stringsdict b/Localization/StringsConvertor/input/pt_PT/Localizable.stringsdict
index c7c84d074..730e2902a 100644
--- a/Localization/StringsConvertor/input/pt_PT/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/pt_PT/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/pt_PT/app.json b/Localization/StringsConvertor/input/pt_PT/app.json
index b60ade9c1..5c01ae7e0 100644
--- a/Localization/StringsConvertor/input/pt_PT/app.json
+++ b/Localization/StringsConvertor/input/pt_PT/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/ro_RO/Localizable.stringsdict b/Localization/StringsConvertor/input/ro_RO/Localizable.stringsdict
index f623187e7..8cda4bbd7 100644
--- a/Localization/StringsConvertor/input/ro_RO/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/ro_RO/Localizable.stringsdict
@@ -2,6 +2,24 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ few
+ %ld unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/ro_RO/app.json b/Localization/StringsConvertor/input/ro_RO/app.json
index f4f7a91ec..3927247ee 100644
--- a/Localization/StringsConvertor/input/ro_RO/app.json
+++ b/Localization/StringsConvertor/input/ro_RO/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/ru_RU/Localizable.stringsdict b/Localization/StringsConvertor/input/ru_RU/Localizable.stringsdict
index 1a9a44a0f..96afce4ed 100644
--- a/Localization/StringsConvertor/input/ru_RU/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/ru_RU/Localizable.stringsdict
@@ -2,10 +2,30 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ few
+ %ld unread notification
+ many
+ %ld unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
- Input limit exceeds %#@character_count@
+ Лимит превышен на %#@character_count@
character_count
NSStringFormatSpecTypeKey
@@ -13,19 +33,19 @@
NSStringFormatValueTypeKey
ld
one
- 1 character
+ %ld символ
few
- %ld characters
+ %ld символа
many
- %ld characters
+ %ld символов
other
- %ld characters
+ %ld символа
a11y.plural.count.input_limit_remains
NSStringLocalizedFormatKey
- Input limit remains %#@character_count@
+ %#@character_count@
character_count
NSStringFormatSpecTypeKey
@@ -33,13 +53,13 @@
NSStringFormatValueTypeKey
ld
one
- 1 character
+ %ld символ остался
few
- %ld characters
+ %ld символа осталось
many
- %ld characters
+ %ld символов осталось
other
- %ld characters
+ %ld символа осталось
plural.count.metric_formatted.post
@@ -53,13 +73,13 @@
NSStringFormatValueTypeKey
ld
one
- post
+ пост
few
- posts
+ поста
many
- posts
+ постов
other
- posts
+ поста
plural.count.post
@@ -133,13 +153,13 @@
NSStringFormatValueTypeKey
ld
one
- 1 vote
+ %ld голос
few
- %ld votes
+ %ld голоса
many
- %ld votes
+ %ld голосов
other
- %ld votes
+ %ld голоса
plural.count.voter
diff --git a/Localization/StringsConvertor/input/ru_RU/app.json b/Localization/StringsConvertor/input/ru_RU/app.json
index f357a60b4..c1ad3ee49 100644
--- a/Localization/StringsConvertor/input/ru_RU/app.json
+++ b/Localization/StringsConvertor/input/ru_RU/app.json
@@ -67,6 +67,7 @@
"done": "Готово",
"confirm": "Подтвердить",
"continue": "Продолжить",
+ "compose": "Compose",
"cancel": "Отмена",
"discard": "Отмена",
"try_again": "Попробовать снова",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Поиск",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Следующее изображение",
"show_previous": "Предыдущее изображение"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/ru_RU/ios-infoPlist.json b/Localization/StringsConvertor/input/ru_RU/ios-infoPlist.json
index c6db73de0..3dabe4322 100644
--- a/Localization/StringsConvertor/input/ru_RU/ios-infoPlist.json
+++ b/Localization/StringsConvertor/input/ru_RU/ios-infoPlist.json
@@ -2,5 +2,5 @@
"NSCameraUsageDescription": "Used to take photo for post status",
"NSPhotoLibraryAddUsageDescription": "Used to save photo into the Photo Library",
"NewPostShortcutItemTitle": "New Post",
- "SearchShortcutItemTitle": "Search"
+ "SearchShortcutItemTitle": "Поиск"
}
diff --git a/Localization/StringsConvertor/input/sv_FI/Localizable.stringsdict b/Localization/StringsConvertor/input/sv_FI/Localizable.stringsdict
index 30533a5eb..65316e3d0 100644
--- a/Localization/StringsConvertor/input/sv_FI/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/sv_FI/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/sv_FI/app.json b/Localization/StringsConvertor/input/sv_FI/app.json
index b7eb3b167..7acf48755 100644
--- a/Localization/StringsConvertor/input/sv_FI/app.json
+++ b/Localization/StringsConvertor/input/sv_FI/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Fortsätt",
+ "compose": "Compose",
"cancel": "Avbryt",
"discard": "Discard",
"try_again": "Försök igen",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -454,12 +461,12 @@
"Everything": "Everything",
"Mentions": "Mentions"
},
- "user_followed_you": "%s followed you",
+ "user_followed_you": "%s följde dig",
"user_favorited your post": "%s favorited your post",
"user_reblogged_your_post": "%s reblogged your post",
- "user_mentioned_you": "%s mentioned you",
- "user_requested_to_follow_you": "%s requested to follow you",
- "user_your_poll_has_ended": "%s Your poll has ended",
+ "user_mentioned_you": "%s nämnde dig",
+ "user_requested_to_follow_you": "%s har begärt att följa dig",
+ "user_your_poll_has_ended": "%s Omröstningen har avslutats",
"keyobard": {
"show_everything": "Show Everything",
"show_mentions": "Show Mentions"
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Lägg till konto"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/sv_SE/Localizable.stringsdict b/Localization/StringsConvertor/input/sv_SE/Localizable.stringsdict
index 30533a5eb..65316e3d0 100644
--- a/Localization/StringsConvertor/input/sv_SE/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/sv_SE/Localizable.stringsdict
@@ -2,6 +2,22 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ one
+ 1 unread notification
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/sv_SE/app.json b/Localization/StringsConvertor/input/sv_SE/app.json
index 978d6719c..7acf48755 100644
--- a/Localization/StringsConvertor/input/sv_SE/app.json
+++ b/Localization/StringsConvertor/input/sv_SE/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Fortsätt",
+ "compose": "Compose",
"cancel": "Avbryt",
"discard": "Discard",
"try_again": "Försök igen",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Lägg till konto"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/th_TH/Localizable.stringsdict b/Localization/StringsConvertor/input/th_TH/Localizable.stringsdict
index dc114db41..8971821f6 100644
--- a/Localization/StringsConvertor/input/th_TH/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/th_TH/Localizable.stringsdict
@@ -2,6 +2,20 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ other
+ %ld การแจ้งเตือนที่ยังไม่ได้อ่าน
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/th_TH/app.json b/Localization/StringsConvertor/input/th_TH/app.json
index 318d05391..7852b5d01 100644
--- a/Localization/StringsConvertor/input/th_TH/app.json
+++ b/Localization/StringsConvertor/input/th_TH/app.json
@@ -67,6 +67,7 @@
"done": "เสร็จสิ้น",
"confirm": "ยืนยัน",
"continue": "ดำเนินการต่อ",
+ "compose": "เขียน",
"cancel": "ยกเลิก",
"discard": "ละทิ้ง",
"try_again": "ลองอีกครั้ง",
@@ -179,10 +180,10 @@
},
"header": {
"no_status_found": "ไม่พบโพสต์",
- "blocking_warning": "You can’t view this user's profile\nuntil you unblock them.\nYour profile looks like this to them.",
- "user_blocking_warning": "You can’t view %s’s profile\nuntil you unblock them.\nYour profile looks like this to them.",
- "blocked_warning": "You can’t view this user’s profile\nuntil they unblock you.",
- "user_blocked_warning": "You can’t view %s’s profile\nuntil they unblock you.",
+ "blocking_warning": "คุณไม่สามารถดูโปรไฟล์ของผู้ใช้นี้\nจนกว่าคุณจะเลิกปิดกั้นผู้ใช้นี้\nผู้ใช้นี้เห็นโปรไฟล์ของคุณเหมือนกับที่คุณเห็น",
+ "user_blocking_warning": "คุณไม่สามารถดูโปรไฟล์ของ %s\nจนกว่าคุณจะเลิกปิดกั้นผู้ใช้นี้\nผู้ใช้นี้เห็นโปรไฟล์ของคุณเหมือนกับที่คุณเห็น",
+ "blocked_warning": "คุณไม่สามารถดูโปรไฟล์ของผู้ใช้นี้\nจนกว่าผู้ใช้นี้จะเลิกปิดกั้นคุณ",
+ "user_blocked_warning": "คุณไม่สามารถดูโปรไฟล์ของ %s\nจนกว่าผู้ใช้นี้จะเลิกปิดกั้นคุณ",
"suspended_warning": "ผู้ใช้นี้ถูกระงับการใช้งาน",
"user_suspended_warning": "บัญชีของ %s ถูกระงับการใช้งาน"
}
@@ -210,7 +211,7 @@
"regional": "ภูมิภาค",
"art": "ศิลปะ",
"music": "ดนตรี",
- "tech": "tech"
+ "tech": "เทคโนโลยี"
},
"see_less": "ดูน้อยลง",
"see_more": "ดูเพิ่มเติม"
@@ -285,7 +286,7 @@
"server_rules": {
"title": "กฎพื้นฐานบางประการ",
"subtitle": "กฎเหล่านี้ถูกตั้งโดยผู้ดูแลของ %s",
- "prompt": "By continuing, you’re subject to the terms of service and privacy policy for %s.",
+ "prompt": "เมื่อคุณดำเนินการต่อ คุณอยู่ภายใต้เงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัวสำหรับ %s",
"terms_of_service": "เงื่อนไขการให้บริการ",
"privacy_policy": "นโยบายความเป็นส่วนตัว",
"button": {
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "ไม่ได้แสดงผู้ติดตามจากเซิร์ฟเวอร์อื่น ๆ"
+ },
+ "following": {
+ "footer": "ไม่ได้แสดงการติดตามจากเซิร์ฟเวอร์อื่น ๆ"
+ },
"search": {
"title": "ค้นหา",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "แสดงถัดไป",
"show_previous": "แสดงก่อนหน้า"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "โปรไฟล์ที่เลือกในปัจจุบัน: %s แตะสองครั้งแล้วกดค้างไว้เพื่อแสดงตัวสลับบัญชี",
+ "dismiss_account_switcher": "ปิดตัวสลับบัญชี",
+ "add_account": "เพิ่มบัญชี"
+ },
+ "wizard": {
+ "new_in_mastodon": "มาใหม่ใน Mastodon",
+ "multiple_account_switch_intro_description": "สลับระหว่างหลายบัญชีโดยกดปุ่มโปรไฟล์ค้างไว้",
+ "accessibility_hint": "แตะสองครั้งเพื่อปิดตัวช่วยสร้างนี้"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/zh_CN/Localizable.stringsdict b/Localization/StringsConvertor/input/zh_CN/Localizable.stringsdict
index c28637620..12b8b5f6e 100644
--- a/Localization/StringsConvertor/input/zh_CN/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/zh_CN/Localizable.stringsdict
@@ -2,6 +2,20 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ other
+ %ld 条未读通知
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/zh_CN/app.json b/Localization/StringsConvertor/input/zh_CN/app.json
index 25a8f13a7..905afdd86 100644
--- a/Localization/StringsConvertor/input/zh_CN/app.json
+++ b/Localization/StringsConvertor/input/zh_CN/app.json
@@ -67,6 +67,7 @@
"done": "完成",
"confirm": "确认",
"continue": "继续",
+ "compose": "撰写",
"cancel": "取消",
"discard": "放弃",
"try_again": "再试一次",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "不会显示来自其它服务器的关注者"
+ },
+ "following": {
+ "footer": "不会显示来自其它服务器的关注"
+ },
"search": {
"title": "搜索",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "显示下一个",
"show_previous": "显示前一个"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "当前账户:%s。 双击并按住来打开账户切换页面",
+ "dismiss_account_switcher": "关闭账户切换页面",
+ "add_account": "添加账户"
+ },
+ "wizard": {
+ "new_in_mastodon": "新功能",
+ "multiple_account_switch_intro_description": "按住个人资料标签按钮,即可在多个账户之间进行切换。",
+ "accessibility_hint": "双击关闭此向导"
}
}
}
\ No newline at end of file
diff --git a/Localization/StringsConvertor/input/zh_TW/Localizable.stringsdict b/Localization/StringsConvertor/input/zh_TW/Localizable.stringsdict
index bebde18a5..dafab129d 100644
--- a/Localization/StringsConvertor/input/zh_TW/Localizable.stringsdict
+++ b/Localization/StringsConvertor/input/zh_TW/Localizable.stringsdict
@@ -2,6 +2,20 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+ NSStringFormatSpecTypeKey
+ NSStringPluralRuleType
+ NSStringFormatValueTypeKey
+ ld
+ other
+ %ld unread notification
+
+
a11y.plural.count.input_limit_exceeds
NSStringLocalizedFormatKey
diff --git a/Localization/StringsConvertor/input/zh_TW/app.json b/Localization/StringsConvertor/input/zh_TW/app.json
index b60ade9c1..5c01ae7e0 100644
--- a/Localization/StringsConvertor/input/zh_TW/app.json
+++ b/Localization/StringsConvertor/input/zh_TW/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -413,6 +414,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +541,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Localization/app.json b/Localization/app.json
index b60ade9c1..6d3b2fcc2 100644
--- a/Localization/app.json
+++ b/Localization/app.json
@@ -67,6 +67,7 @@
"done": "Done",
"confirm": "Confirm",
"continue": "Continue",
+ "compose": "Compose",
"cancel": "Cancel",
"discard": "Discard",
"try_again": "Try Again",
@@ -81,6 +82,7 @@
"share_user": "Share %s",
"share_post": "Share Post",
"open_in_safari": "Open in Safari",
+ "open_in_browser": "Open in Browser",
"find_people": "Find people to follow",
"manually_search": "Manually search instead",
"skip": "Skip",
@@ -413,6 +415,12 @@
}
}
},
+ "follower": {
+ "footer": "Followers from other servers are not displayed."
+ },
+ "following": {
+ "footer": "Follows from other servers are not displayed."
+ },
"search": {
"title": "Search",
"search_bar": {
@@ -534,6 +542,16 @@
"show_next": "Show Next",
"show_previous": "Show Previous"
}
+ },
+ "account_list": {
+ "tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
+ "dismiss_account_switcher": "Dismiss Account Switcher",
+ "add_account": "Add Account"
+ },
+ "wizard": {
+ "new_in_mastodon": "New in Mastodon",
+ "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
+ "accessibility_hint": "Double tap to dismiss this wizard"
}
}
}
\ No newline at end of file
diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj
index c935acb21..6b7644e3e 100644
--- a/Mastodon.xcodeproj/project.pbxproj
+++ b/Mastodon.xcodeproj/project.pbxproj
@@ -187,6 +187,8 @@
DB029E95266A20430062874E /* MastodonAuthenticationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB029E94266A20430062874E /* MastodonAuthenticationController.swift */; };
DB02CDAB26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDAA26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift */; };
DB02CDBF2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDBE2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift */; };
+ DB03A793272A7E5700EE37C5 /* SidebarListHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A792272A7E5700EE37C5 /* SidebarListHeaderView.swift */; };
+ DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A794272A981400EE37C5 /* ContentSplitViewController.swift */; };
DB03F7F32689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03F7F22689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift */; };
DB03F7F52689B782007B274C /* ComposeTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03F7F42689B782007B274C /* ComposeTableView.swift */; };
DB040ED126538E3D00BEE9D8 /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB040ED026538E3C00BEE9D8 /* Trie.swift */; };
@@ -199,9 +201,12 @@
DB0C947226A7D2D70088FB11 /* AvatarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0C947126A7D2D70088FB11 /* AvatarButton.swift */; };
DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */; };
DB0E91EA26A9675100BD2ACC /* MetaLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0E91E926A9675100BD2ACC /* MetaLabel.swift */; };
+ DB0EF72B26FDB1D200347686 /* SidebarListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */; };
+ DB0EF72E26FDB24F00347686 /* SidebarListContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0EF72D26FDB24F00347686 /* SidebarListContentView.swift */; };
DB0F8150264D1E2500F2A12B /* PickServerLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0F814F264D1E2500F2A12B /* PickServerLoaderTableViewCell.swift */; };
DB118A8225E4B6E600FAB162 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB118A8125E4B6E600FAB162 /* Preview Assets.xcassets */; };
DB1D186C25EF5BA7003F1F23 /* PollTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1D186B25EF5BA7003F1F23 /* PollTableView.swift */; };
+ DB1D61CF26F1B33600DA8662 /* WelcomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1D61CE26F1B33600DA8662 /* WelcomeViewModel.swift */; };
DB1D842C26551A1C000346B3 /* StatusProvider+StatusTableViewKeyCommandNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1D842B26551A1C000346B3 /* StatusProvider+StatusTableViewKeyCommandNavigateable.swift */; };
DB1D842E26552C4D000346B3 /* StatusTableViewControllerNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1D842D26552C4D000346B3 /* StatusTableViewControllerNavigateable.swift */; };
DB1D843026566512000346B3 /* KeyboardPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1D842F26566512000346B3 /* KeyboardPreference.swift */; };
@@ -262,6 +267,10 @@
DB482A45261335BA008AE74C /* UserTimelineViewController+Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB482A44261335BA008AE74C /* UserTimelineViewController+Provider.swift */; };
DB482A4B261340A7008AE74C /* APIService+UserTimeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB482A4A261340A7008AE74C /* APIService+UserTimeline.swift */; };
DB4924E226312AB200E9DB22 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4924E126312AB200E9DB22 /* NotificationService.swift */; };
+ DB4932B126F1FB5300EF46D4 /* WizardCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4932B026F1FB5300EF46D4 /* WizardCardView.swift */; };
+ DB4932B326F2054200EF46D4 /* CircleAvatarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4932B226F2054200EF46D4 /* CircleAvatarButton.swift */; };
+ DB4932B726F30F0700EF46D4 /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F20223826146553000C64BF /* Array.swift */; };
+ DB4932B926F31AD300EF46D4 /* BadgeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4932B826F31AD300EF46D4 /* BadgeButton.swift */; };
DB49A61425FF2C5600B98345 /* EmojiService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB49A61325FF2C5600B98345 /* EmojiService.swift */; };
DB49A61F25FF32AA00B98345 /* EmojiService+CustomEmojiViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB49A61E25FF32AA00B98345 /* EmojiService+CustomEmojiViewModel.swift */; };
DB49A62525FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB49A62425FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift */; };
@@ -287,6 +296,11 @@
DB59F10425EF5EBC001F1DAB /* TableViewCellHeightCacheableContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB59F10325EF5EBC001F1DAB /* TableViewCellHeightCacheableContainer.swift */; };
DB59F10E25EF724F001F1DAB /* APIService+Poll.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB59F10D25EF724F001F1DAB /* APIService+Poll.swift */; };
DB59F11825EFA35B001F1DAB /* StripProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB59F11725EFA35B001F1DAB /* StripProgressView.swift */; };
+ DB5B7295273112B100081888 /* FollowingListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B7294273112B100081888 /* FollowingListViewController.swift */; };
+ DB5B7298273112C800081888 /* FollowingListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B7297273112C800081888 /* FollowingListViewModel.swift */; };
+ DB5B729A2731137900081888 /* FollowingListViewController+Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B72992731137900081888 /* FollowingListViewController+Provider.swift */; };
+ DB5B729C273113C200081888 /* FollowingListViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B729B273113C200081888 /* FollowingListViewModel+Diffable.swift */; };
+ DB5B729E273113F300081888 /* FollowingListViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B729D273113F300081888 /* FollowingListViewModel+State.swift */; };
DB6180DD263918E30018D199 /* MediaPreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6180DC263918E30018D199 /* MediaPreviewViewController.swift */; };
DB6180E02639194B0018D199 /* MediaPreviewPagingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6180DF2639194B0018D199 /* MediaPreviewPagingViewController.swift */; };
DB6180E326391A4C0018D199 /* ViewControllerAnimatedTransitioning.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6180E226391A4C0018D199 /* ViewControllerAnimatedTransitioning.swift */; };
@@ -301,9 +315,13 @@
DB6180F826391D660018D199 /* MediaPreviewingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6180F726391D660018D199 /* MediaPreviewingViewController.swift */; };
DB6180FA26391F2E0018D199 /* MediaPreviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6180F926391F2E0018D199 /* MediaPreviewViewModel.swift */; };
DB63BE7F268DD1070011D3F9 /* NotificationViewController+StatusProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63BE7E268DD1070011D3F9 /* NotificationViewController+StatusProvider.swift */; };
+ DB647C5926F1EA2700F7F82C /* WizardPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB647C5826F1EA2700F7F82C /* WizardPreference.swift */; };
DB66728C25F9F8DC00D60309 /* ComposeViewModel+DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB66728B25F9F8DC00D60309 /* ComposeViewModel+DataSource.swift */; };
DB66729625F9F91600D60309 /* ComposeStatusSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB66729525F9F91600D60309 /* ComposeStatusSection.swift */; };
DB66729C25F9F91F00D60309 /* ComposeStatusItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB66729B25F9F91F00D60309 /* ComposeStatusItem.swift */; };
+ DB67D08427312970006A36CF /* APIService+Following.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB67D08327312970006A36CF /* APIService+Following.swift */; };
+ DB67D08627312E67006A36CF /* WizardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB67D08527312E67006A36CF /* WizardViewController.swift */; };
+ DB67D089273256D7006A36CF /* StoreReviewPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB67D088273256D7006A36CF /* StoreReviewPreference.swift */; };
DB68045B2636DC6A00430867 /* MastodonNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68045A2636DC6A00430867 /* MastodonNotification.swift */; };
DB6804662636DC9000430867 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D939AB425EDD8A90076FA61 /* String.swift */; };
DB68046C2636DC9E00430867 /* MastodonNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68045A2636DC6A00430867 /* MastodonNotification.swift */; };
@@ -322,6 +340,17 @@
DB68A06325E905E000CFDF14 /* UIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68A06225E905E000CFDF14 /* UIApplication.swift */; };
DB6B35182601FA3400DC1E11 /* MastodonAttachmentService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B35172601FA3400DC1E11 /* MastodonAttachmentService.swift */; };
DB6B351E2601FAEE00DC1E11 /* ComposeStatusAttachmentCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B351D2601FAEE00DC1E11 /* ComposeStatusAttachmentCollectionViewCell.swift */; };
+ DB6B74EF272FB55000C70B6E /* FollowerListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74EE272FB55000C70B6E /* FollowerListViewController.swift */; };
+ DB6B74F2272FB67600C70B6E /* FollowerListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F1272FB67600C70B6E /* FollowerListViewModel.swift */; };
+ DB6B74F4272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F3272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift */; };
+ DB6B74F6272FBCDB00C70B6E /* FollowerListViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F5272FBCDB00C70B6E /* FollowerListViewModel+State.swift */; };
+ DB6B74F8272FBFB100C70B6E /* FollowerListViewController+Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F7272FBFB100C70B6E /* FollowerListViewController+Provider.swift */; };
+ DB6B74FA272FC2B500C70B6E /* APIService+Follower.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F9272FC2B500C70B6E /* APIService+Follower.swift */; };
+ DB6B74FC272FF55800C70B6E /* UserSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74FB272FF55800C70B6E /* UserSection.swift */; };
+ DB6B74FE272FF59000C70B6E /* UserItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74FD272FF59000C70B6E /* UserItem.swift */; };
+ DB6B7500272FF73800C70B6E /* UserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74FF272FF73800C70B6E /* UserTableViewCell.swift */; };
+ DB6B75022730060700C70B6E /* UserProviderFacade+UITableViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B75012730060700C70B6E /* UserProviderFacade+UITableViewDelegate.swift */; };
+ DB6B750427300B4000C70B6E /* TimelineFooterTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B750327300B4000C70B6E /* TimelineFooterTableViewCell.swift */; };
DB6C8C0F25F0A6AE00AAA452 /* Mastodon+Entity+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6C8C0E25F0A6AE00AAA452 /* Mastodon+Entity+Error.swift */; };
DB6D1B3D2636857500ACB481 /* AppearancePreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D1B3C2636857500ACB481 /* AppearancePreference.swift */; };
DB6D1B44263691CF00ACB481 /* Mastodon+API+Subscriptions+Policy.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D1B43263691CF00ACB481 /* Mastodon+API+Subscriptions+Policy.swift */; };
@@ -338,6 +367,8 @@
DB6D9F9726367249008423CD /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F9626367249008423CD /* SettingsViewController.swift */; };
DB6F5E35264E78E7009108F4 /* AutoCompleteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6F5E34264E78E7009108F4 /* AutoCompleteViewController.swift */; };
DB6F5E38264E994A009108F4 /* AutoCompleteTopChevronView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6F5E37264E994A009108F4 /* AutoCompleteTopChevronView.swift */; };
+ DB71C7CB271D5A0300BE3819 /* LineChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB71C7CA271D5A0300BE3819 /* LineChartView.swift */; };
+ DB71C7CD271D7F4300BE3819 /* CurveAlgorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB71C7CC271D7F4300BE3819 /* CurveAlgorithm.swift */; };
DB71FD2C25F86A5100512AE1 /* AvatarStackContainerButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB71FD2B25F86A5100512AE1 /* AvatarStackContainerButton.swift */; };
DB71FD3625F8A16C00512AE1 /* APIService+Persist+PersistMemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB71FD3525F8A16C00512AE1 /* APIService+Persist+PersistMemo.swift */; };
DB71FD3C25F8A1C500512AE1 /* APIService+Persist+PersistCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB71FD3B25F8A1C500512AE1 /* APIService+Persist+PersistCache.swift */; };
@@ -346,12 +377,23 @@
DB71FD5225F8CCAA00512AE1 /* APIService+Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB71FD5125F8CCAA00512AE1 /* APIService+Status.swift */; };
DB72601C25E36A2100235243 /* MastodonServerRulesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB72601B25E36A2100235243 /* MastodonServerRulesViewController.swift */; };
DB72602725E36A6F00235243 /* MastodonServerRulesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB72602625E36A6F00235243 /* MastodonServerRulesViewModel.swift */; };
+ DB7274F4273BB9B200577D95 /* ListBatchFetchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7274F3273BB9B200577D95 /* ListBatchFetchViewModel.swift */; };
DB73B490261F030A002E9E9F /* SafariActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73B48F261F030A002E9E9F /* SafariActivity.swift */; };
+ DB73BF3B2711885500781945 /* UserDefaults+Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF3A2711885500781945 /* UserDefaults+Notification.swift */; };
+ DB73BF4127118B6D00781945 /* Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF4027118B6D00781945 /* Instance.swift */; };
+ DB73BF43271192BB00781945 /* InstanceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF42271192BB00781945 /* InstanceService.swift */; };
+ DB73BF45271195AC00781945 /* APIService+CoreData+Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF44271195AC00781945 /* APIService+CoreData+Instance.swift */; };
+ DB73BF47271199CA00781945 /* Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF46271199CA00781945 /* Instance.swift */; };
+ DB73BF4927140BA300781945 /* UICollectionViewDiffableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF4827140BA300781945 /* UICollectionViewDiffableDataSource.swift */; };
+ DB73BF4B27140C0800781945 /* UITableViewDiffableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF4A27140C0800781945 /* UITableViewDiffableDataSource.swift */; };
DB75BF1E263C1C1B00EDBF1F /* CustomScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB75BF1D263C1C1B00EDBF1F /* CustomScheduler.swift */; };
DB789A0B25F9F2950071ACA0 /* ComposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB789A0A25F9F2950071ACA0 /* ComposeViewController.swift */; };
DB789A1225F9F2CC0071ACA0 /* ComposeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB789A1125F9F2CC0071ACA0 /* ComposeViewModel.swift */; };
DB7F48452620241000796008 /* ProfileHeaderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7F48442620241000796008 /* ProfileHeaderViewModel.swift */; };
DB8190C62601FF0400020C08 /* AttachmentContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8190C52601FF0400020C08 /* AttachmentContainerView.swift */; };
+ DB852D1926FAEB6B00FC9D81 /* SidebarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB852D1826FAEB6B00FC9D81 /* SidebarViewController.swift */; };
+ DB852D1C26FB021500FC9D81 /* RootSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB852D1B26FB021500FC9D81 /* RootSplitViewController.swift */; };
+ DB852D1F26FB037800FC9D81 /* SidebarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB852D1E26FB037800FC9D81 /* SidebarViewModel.swift */; };
DB87D4452609BE0500D12C0D /* ComposeStatusPollOptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB87D4442609BE0500D12C0D /* ComposeStatusPollOptionCollectionViewCell.swift */; };
DB87D44B2609C11900D12C0D /* PollOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB87D44A2609C11900D12C0D /* PollOptionView.swift */; };
DB87D4512609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB87D4502609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift */; };
@@ -415,6 +457,9 @@
DB9D6C3825E508BE0051B173 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9D6C3725E508BE0051B173 /* Attachment.swift */; };
DB9D7C21269824B80054B3DF /* APIService+Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9D7C20269824B80054B3DF /* APIService+Filter.swift */; };
DB9E0D6F25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9E0D6E25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift */; };
+ DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */; };
+ DB9F58EF26EF491E00E7BBE9 /* AccountListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */; };
+ DB9F58F126EF512300E7BBE9 /* AccountListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */; };
DBA088DF26958164003EB4B2 /* UserFetchedResultsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA088DE26958164003EB4B2 /* UserFetchedResultsController.swift */; };
DBA0A11325FB3FC10079C110 /* ComposeToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */; };
DBA1DB80268F84F80052DB59 /* NotificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA1DB7F268F84F80052DB59 /* NotificationType.swift */; };
@@ -422,6 +467,9 @@
DBA465952696E387002B41DB /* AppPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA465942696E387002B41DB /* AppPreference.swift */; };
DBA4B0F626C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; };
DBA4B0F726C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; };
+ DBA5A52F26F07ED800CACBAA /* PanModal in Frameworks */ = {isa = PBXBuildFile; productRef = DBA5A52E26F07ED800CACBAA /* PanModal */; };
+ DBA5A53126F08EF000CACBAA /* DragIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5A53026F08EF000CACBAA /* DragIndicatorView.swift */; };
+ DBA5A53526F0A36A00CACBAA /* AddAccountTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5A53426F0A36A00CACBAA /* AddAccountTableViewCell.swift */; };
DBA5E7A3263AD0A3004598BB /* PhotoLibraryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */; };
DBA5E7A5263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A4263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift */; };
DBA5E7A9263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A8263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift */; };
@@ -436,7 +484,6 @@
DBAC6483267D0B21007FE9FD /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = DBAC6482267D0B21007FE9FD /* DifferenceKit */; };
DBAC6485267D0F9E007FE9FD /* StatusNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAC6484267D0F9E007FE9FD /* StatusNode.swift */; };
DBAC6488267D388B007FE9FD /* ASTableNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAC6487267D388B007FE9FD /* ASTableNode.swift */; };
- DBAC648A267DC355007FE9FD /* NSDiffableDataSourceSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAC6489267DC355007FE9FD /* NSDiffableDataSourceSnapshot.swift */; };
DBAC648F267DC84D007FE9FD /* TableNodeDiffableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAC648E267DC84D007FE9FD /* TableNodeDiffableDataSource.swift */; };
DBAC6497267DECCB007FE9FD /* TimelineMiddleLoaderNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAC6496267DECCB007FE9FD /* TimelineMiddleLoaderNode.swift */; };
DBAC6499267DF2C4007FE9FD /* TimelineBottomLoaderNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAC6498267DF2C4007FE9FD /* TimelineBottomLoaderNode.swift */; };
@@ -554,9 +601,15 @@
DBE3CE13261D7D4200430CC6 /* StatusTableViewControllerAspect.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE3CE12261D7D4200430CC6 /* StatusTableViewControllerAspect.swift */; };
DBE54AC62636C89F004E7C0B /* NotificationPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */; };
DBE54ACC2636C8FD004E7C0B /* NotificationPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */; };
+ DBF156DF2701B17600EC00B7 /* SidebarAddAccountCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF156DE2701B17600EC00B7 /* SidebarAddAccountCollectionViewCell.swift */; };
+ DBF156E22702DA6900EC00B7 /* UIStatusBarManager+HandleTapAction.m in Sources */ = {isa = PBXBuildFile; fileRef = DBF156E12702DA6900EC00B7 /* UIStatusBarManager+HandleTapAction.m */; };
+ DBF156E42702DB3F00EC00B7 /* HandleTapAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF156E32702DB3F00EC00B7 /* HandleTapAction.swift */; };
+ DBF1572F27046F1A00EC00B7 /* SecondaryPlaceholderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF1572E27046F1A00EC00B7 /* SecondaryPlaceholderViewController.swift */; };
DBF1D24E269DAF5D00C1C08A /* SearchDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF1D24D269DAF5D00C1C08A /* SearchDetailViewController.swift */; };
DBF1D251269DB01200C1C08A /* SearchHistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF1D250269DB01200C1C08A /* SearchHistoryViewController.swift */; };
DBF1D257269DBAC600C1C08A /* SearchDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF1D256269DBAC600C1C08A /* SearchDetailViewModel.swift */; };
+ DBF3B73F2733EAED00E21627 /* local-codes.json in Resources */ = {isa = PBXBuildFile; fileRef = DBF3B73E2733EAED00E21627 /* local-codes.json */; };
+ DBF3B7412733EB9400E21627 /* MastodonLocalCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF3B7402733EB9400E21627 /* MastodonLocalCode.swift */; };
DBF7A0FC26830C33004176A2 /* FPSIndicator in Frameworks */ = {isa = PBXBuildFile; productRef = DBF7A0FB26830C33004176A2 /* FPSIndicator */; };
DBF8AE16263293E400C9C23C /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF8AE15263293E400C9C23C /* NotificationService.swift */; };
DBF8AE1A263293E400C9C23C /* NotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = DBF8AE13263293E400C9C23C /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
@@ -928,6 +981,8 @@
DB029E94266A20430062874E /* MastodonAuthenticationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonAuthenticationController.swift; sourceTree = ""; };
DB02CDAA26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadReplyLoaderTableViewCell.swift; sourceTree = ""; };
DB02CDBE2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdaptiveUserInterfaceStyleBarButtonItem.swift; sourceTree = ""; };
+ DB03A792272A7E5700EE37C5 /* SidebarListHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListHeaderView.swift; sourceTree = ""; };
+ DB03A794272A981400EE37C5 /* ContentSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentSplitViewController.swift; sourceTree = ""; };
DB03F7F22689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeRepliedToStatusContentTableViewCell.swift; sourceTree = ""; };
DB03F7F42689B782007B274C /* ComposeTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeTableView.swift; sourceTree = ""; };
DB040ED026538E3C00BEE9D8 /* Trie.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Trie.swift; sourceTree = ""; };
@@ -938,11 +993,14 @@
DB0C947126A7D2D70088FB11 /* AvatarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarButton.swift; sourceTree = ""; };
DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAvatarButton.swift; sourceTree = ""; };
DB0E91E926A9675100BD2ACC /* MetaLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetaLabel.swift; sourceTree = ""; };
+ DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListCollectionViewCell.swift; sourceTree = ""; };
+ DB0EF72D26FDB24F00347686 /* SidebarListContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListContentView.swift; sourceTree = ""; };
DB0F814D264CFFD300F2A12B /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; };
DB0F814E264CFFD300F2A12B /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = ""; };
DB0F814F264D1E2500F2A12B /* PickServerLoaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickServerLoaderTableViewCell.swift; sourceTree = ""; };
DB118A8125E4B6E600FAB162 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
DB1D186B25EF5BA7003F1F23 /* PollTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollTableView.swift; sourceTree = ""; };
+ DB1D61CE26F1B33600DA8662 /* WelcomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewModel.swift; sourceTree = ""; };
DB1D842B26551A1C000346B3 /* StatusProvider+StatusTableViewKeyCommandNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StatusProvider+StatusTableViewKeyCommandNavigateable.swift"; sourceTree = ""; };
DB1D842D26552C4D000346B3 /* StatusTableViewControllerNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusTableViewControllerNavigateable.swift; sourceTree = ""; };
DB1D842F26566512000346B3 /* KeyboardPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardPreference.swift; sourceTree = ""; };
@@ -1010,6 +1068,9 @@
DB482A44261335BA008AE74C /* UserTimelineViewController+Provider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserTimelineViewController+Provider.swift"; sourceTree = ""; };
DB482A4A261340A7008AE74C /* APIService+UserTimeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+UserTimeline.swift"; sourceTree = ""; };
DB4924E126312AB200E9DB22 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; };
+ DB4932B026F1FB5300EF46D4 /* WizardCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WizardCardView.swift; sourceTree = ""; };
+ DB4932B226F2054200EF46D4 /* CircleAvatarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleAvatarButton.swift; sourceTree = ""; };
+ DB4932B826F31AD300EF46D4 /* BadgeButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeButton.swift; sourceTree = ""; };
DB49A61325FF2C5600B98345 /* EmojiService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiService.swift; sourceTree = ""; };
DB49A61E25FF32AA00B98345 /* EmojiService+CustomEmojiViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EmojiService+CustomEmojiViewModel.swift"; sourceTree = ""; };
DB49A62425FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EmojiService+CustomEmojiViewModel+LoadState.swift"; sourceTree = ""; };
@@ -1059,6 +1120,11 @@
DB59F10325EF5EBC001F1DAB /* TableViewCellHeightCacheableContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewCellHeightCacheableContainer.swift; sourceTree = ""; };
DB59F10D25EF724F001F1DAB /* APIService+Poll.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Poll.swift"; sourceTree = ""; };
DB59F11725EFA35B001F1DAB /* StripProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StripProgressView.swift; sourceTree = ""; };
+ DB5B7294273112B100081888 /* FollowingListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingListViewController.swift; sourceTree = ""; };
+ DB5B7297273112C800081888 /* FollowingListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingListViewModel.swift; sourceTree = ""; };
+ DB5B72992731137900081888 /* FollowingListViewController+Provider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FollowingListViewController+Provider.swift"; sourceTree = ""; };
+ DB5B729B273113C200081888 /* FollowingListViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FollowingListViewModel+Diffable.swift"; sourceTree = ""; };
+ DB5B729D273113F300081888 /* FollowingListViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FollowingListViewModel+State.swift"; sourceTree = ""; };
DB6180DC263918E30018D199 /* MediaPreviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPreviewViewController.swift; sourceTree = ""; };
DB6180DF2639194B0018D199 /* MediaPreviewPagingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPreviewPagingViewController.swift; sourceTree = ""; };
DB6180E226391A4C0018D199 /* ViewControllerAnimatedTransitioning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewControllerAnimatedTransitioning.swift; sourceTree = ""; };
@@ -1073,9 +1139,13 @@
DB6180F726391D660018D199 /* MediaPreviewingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPreviewingViewController.swift; sourceTree = ""; };
DB6180F926391F2E0018D199 /* MediaPreviewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPreviewViewModel.swift; sourceTree = ""; };
DB63BE7E268DD1070011D3F9 /* NotificationViewController+StatusProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationViewController+StatusProvider.swift"; sourceTree = ""; };
+ DB647C5826F1EA2700F7F82C /* WizardPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WizardPreference.swift; sourceTree = ""; };
DB66728B25F9F8DC00D60309 /* ComposeViewModel+DataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ComposeViewModel+DataSource.swift"; sourceTree = ""; };
DB66729525F9F91600D60309 /* ComposeStatusSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusSection.swift; sourceTree = ""; };
DB66729B25F9F91F00D60309 /* ComposeStatusItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusItem.swift; sourceTree = ""; };
+ DB67D08327312970006A36CF /* APIService+Following.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Following.swift"; sourceTree = ""; };
+ DB67D08527312E67006A36CF /* WizardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WizardViewController.swift; sourceTree = ""; };
+ DB67D088273256D7006A36CF /* StoreReviewPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreReviewPreference.swift; sourceTree = ""; };
DB68045A2636DC6A00430867 /* MastodonNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonNotification.swift; sourceTree = ""; };
DB68047F2637CD4C00430867 /* AppShared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppShared.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DB6804812637CD4C00430867 /* AppShared.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppShared.h; sourceTree = ""; };
@@ -1090,6 +1160,17 @@
DB68A06225E905E000CFDF14 /* UIApplication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIApplication.swift; sourceTree = ""; };
DB6B35172601FA3400DC1E11 /* MastodonAttachmentService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonAttachmentService.swift; sourceTree = ""; };
DB6B351D2601FAEE00DC1E11 /* ComposeStatusAttachmentCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusAttachmentCollectionViewCell.swift; sourceTree = ""; };
+ DB6B74EE272FB55000C70B6E /* FollowerListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowerListViewController.swift; sourceTree = ""; };
+ DB6B74F1272FB67600C70B6E /* FollowerListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowerListViewModel.swift; sourceTree = ""; };
+ DB6B74F3272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FollowerListViewModel+Diffable.swift"; sourceTree = ""; };
+ DB6B74F5272FBCDB00C70B6E /* FollowerListViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FollowerListViewModel+State.swift"; sourceTree = ""; };
+ DB6B74F7272FBFB100C70B6E /* FollowerListViewController+Provider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FollowerListViewController+Provider.swift"; sourceTree = ""; };
+ DB6B74F9272FC2B500C70B6E /* APIService+Follower.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Follower.swift"; sourceTree = ""; };
+ DB6B74FB272FF55800C70B6E /* UserSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSection.swift; sourceTree = ""; };
+ DB6B74FD272FF59000C70B6E /* UserItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserItem.swift; sourceTree = ""; };
+ DB6B74FF272FF73800C70B6E /* UserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTableViewCell.swift; sourceTree = ""; };
+ DB6B75012730060700C70B6E /* UserProviderFacade+UITableViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserProviderFacade+UITableViewDelegate.swift"; sourceTree = ""; };
+ DB6B750327300B4000C70B6E /* TimelineFooterTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineFooterTableViewCell.swift; sourceTree = ""; };
DB6C8C0E25F0A6AE00AAA452 /* Mastodon+Entity+Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mastodon+Entity+Error.swift"; sourceTree = ""; };
DB6D1B3C2636857500ACB481 /* AppearancePreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearancePreference.swift; sourceTree = ""; };
DB6D1B43263691CF00ACB481 /* Mastodon+API+Subscriptions+Policy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mastodon+API+Subscriptions+Policy.swift"; sourceTree = ""; };
@@ -1105,6 +1186,8 @@
DB6D9F9626367249008423CD /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; };
DB6F5E34264E78E7009108F4 /* AutoCompleteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCompleteViewController.swift; sourceTree = ""; };
DB6F5E37264E994A009108F4 /* AutoCompleteTopChevronView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCompleteTopChevronView.swift; sourceTree = ""; };
+ DB71C7CA271D5A0300BE3819 /* LineChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChartView.swift; sourceTree = ""; };
+ DB71C7CC271D7F4300BE3819 /* CurveAlgorithm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurveAlgorithm.swift; sourceTree = ""; };
DB71FD2B25F86A5100512AE1 /* AvatarStackContainerButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarStackContainerButton.swift; sourceTree = ""; };
DB71FD3525F8A16C00512AE1 /* APIService+Persist+PersistMemo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Persist+PersistMemo.swift"; sourceTree = ""; };
DB71FD3B25F8A1C500512AE1 /* APIService+Persist+PersistCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Persist+PersistCache.swift"; sourceTree = ""; };
@@ -1113,12 +1196,23 @@
DB71FD5125F8CCAA00512AE1 /* APIService+Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Status.swift"; sourceTree = ""; };
DB72601B25E36A2100235243 /* MastodonServerRulesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonServerRulesViewController.swift; sourceTree = ""; };
DB72602625E36A6F00235243 /* MastodonServerRulesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonServerRulesViewModel.swift; sourceTree = ""; };
+ DB7274F3273BB9B200577D95 /* ListBatchFetchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListBatchFetchViewModel.swift; sourceTree = ""; };
DB73B48F261F030A002E9E9F /* SafariActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariActivity.swift; sourceTree = ""; };
+ DB73BF3A2711885500781945 /* UserDefaults+Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Notification.swift"; sourceTree = ""; };
+ DB73BF4027118B6D00781945 /* Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Instance.swift; sourceTree = ""; };
+ DB73BF42271192BB00781945 /* InstanceService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceService.swift; sourceTree = ""; };
+ DB73BF44271195AC00781945 /* APIService+CoreData+Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+CoreData+Instance.swift"; sourceTree = ""; };
+ DB73BF46271199CA00781945 /* Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Instance.swift; sourceTree = ""; };
+ DB73BF4827140BA300781945 /* UICollectionViewDiffableDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UICollectionViewDiffableDataSource.swift; sourceTree = ""; };
+ DB73BF4A27140C0800781945 /* UITableViewDiffableDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewDiffableDataSource.swift; sourceTree = ""; };
DB75BF1D263C1C1B00EDBF1F /* CustomScheduler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomScheduler.swift; sourceTree = ""; };
DB789A0A25F9F2950071ACA0 /* ComposeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeViewController.swift; sourceTree = ""; };
DB789A1125F9F2CC0071ACA0 /* ComposeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeViewModel.swift; sourceTree = ""; };
DB7F48442620241000796008 /* ProfileHeaderViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileHeaderViewModel.swift; sourceTree = ""; };
DB8190C52601FF0400020C08 /* AttachmentContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentContainerView.swift; sourceTree = ""; };
+ DB852D1826FAEB6B00FC9D81 /* SidebarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarViewController.swift; sourceTree = ""; };
+ DB852D1B26FB021500FC9D81 /* RootSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootSplitViewController.swift; sourceTree = ""; };
+ DB852D1E26FB037800FC9D81 /* SidebarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarViewModel.swift; sourceTree = ""; };
DB87D4442609BE0500D12C0D /* ComposeStatusPollOptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusPollOptionCollectionViewCell.swift; sourceTree = ""; };
DB87D44A2609C11900D12C0D /* PollOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollOptionView.swift; sourceTree = ""; };
DB87D4502609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusPollOptionAppendEntryCollectionViewCell.swift; sourceTree = ""; };
@@ -1184,6 +1278,9 @@
DB9D6C3725E508BE0051B173 /* Attachment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Attachment.swift; sourceTree = ""; };
DB9D7C20269824B80054B3DF /* APIService+Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Filter.swift"; sourceTree = ""; };
DB9E0D6E25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIInterpolatingMotionEffect.swift; sourceTree = ""; };
+ DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewController.swift; sourceTree = ""; };
+ DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListViewModel.swift; sourceTree = ""; };
+ DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListTableViewCell.swift; sourceTree = ""; };
DBA088DE26958164003EB4B2 /* UserFetchedResultsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFetchedResultsController.swift; sourceTree = ""; };
DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeToolbarView.swift; sourceTree = ""; };
DBA1DB7F268F84F80052DB59 /* NotificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationType.swift; sourceTree = ""; };
@@ -1219,6 +1316,8 @@
DBA4B0EF26C153B20077136E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; };
DBA4B0F526C2621D0077136E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Intents.strings; sourceTree = ""; };
DBA4B0F826C269880077136E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Intents.stringsdict; sourceTree = ""; };
+ DBA5A53026F08EF000CACBAA /* DragIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DragIndicatorView.swift; sourceTree = ""; };
+ DBA5A53426F0A36A00CACBAA /* AddAccountTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddAccountTableViewCell.swift; sourceTree = ""; };
DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoLibraryService.swift; sourceTree = ""; };
DBA5E7A4263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuImagePreviewViewModel.swift; sourceTree = ""; };
DBA5E7A8263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuImagePreviewViewController.swift; sourceTree = ""; };
@@ -1232,7 +1331,6 @@
DBABE3EB25ECAC4B00879EE5 /* WelcomeIllustrationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeIllustrationView.swift; sourceTree = ""; };
DBAC6484267D0F9E007FE9FD /* StatusNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusNode.swift; sourceTree = ""; };
DBAC6487267D388B007FE9FD /* ASTableNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ASTableNode.swift; sourceTree = ""; };
- DBAC6489267DC355007FE9FD /* NSDiffableDataSourceSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSDiffableDataSourceSnapshot.swift; sourceTree = ""; };
DBAC648E267DC84D007FE9FD /* TableNodeDiffableDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableNodeDiffableDataSource.swift; sourceTree = ""; };
DBAC6496267DECCB007FE9FD /* TimelineMiddleLoaderNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineMiddleLoaderNode.swift; sourceTree = ""; };
DBAC6498267DF2C4007FE9FD /* TimelineBottomLoaderNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineBottomLoaderNode.swift; sourceTree = ""; };
@@ -1307,6 +1405,11 @@
DBD376AB2692ECDB007FEC24 /* ThemePreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePreference.swift; sourceTree = ""; };
DBD376B1269302A4007FEC24 /* UITableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewCell.swift; sourceTree = ""; };
DBD9148F25DF6D8D00903DFD /* APIService+Onboarding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Onboarding.swift"; sourceTree = ""; };
+ DBDC1CF9272C0FD600055C3D /* ku-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ku-TR"; path = "ku-TR.lproj/Intents.strings"; sourceTree = ""; };
+ DBDC1CFA272C0FD600055C3D /* ku-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "ku-TR"; path = "ku-TR.lproj/Localizable.stringsdict"; sourceTree = ""; };
+ DBDC1CFB272C0FD600055C3D /* ku-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ku-TR"; path = "ku-TR.lproj/Localizable.strings"; sourceTree = ""; };
+ DBDC1CFC272C0FD600055C3D /* ku-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ku-TR"; path = "ku-TR.lproj/InfoPlist.strings"; sourceTree = ""; };
+ DBDC1CFD272C0FD600055C3D /* ku-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "ku-TR"; path = "ku-TR.lproj/Intents.stringsdict"; sourceTree = ""; };
DBE0821425CD382600FD6BBD /* MastodonRegisterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonRegisterViewController.swift; sourceTree = ""; };
DBE0822325CD3F1E00FD6BBD /* MastodonRegisterViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonRegisterViewModel.swift; sourceTree = ""; };
DBE3CDBA261C427900430CC6 /* TimelineHeaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineHeaderTableViewCell.swift; sourceTree = ""; };
@@ -1318,9 +1421,17 @@
DBE3CE0C261D767100430CC6 /* FavoriteViewController+Provider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FavoriteViewController+Provider.swift"; sourceTree = ""; };
DBE3CE12261D7D4200430CC6 /* StatusTableViewControllerAspect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusTableViewControllerAspect.swift; sourceTree = ""; };
DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPreference.swift; sourceTree = ""; };
+ DBF156DD27006F5D00EC00B7 /* CoreData 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "CoreData 2.xcdatamodel"; sourceTree = ""; };
+ DBF156DE2701B17600EC00B7 /* SidebarAddAccountCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarAddAccountCollectionViewCell.swift; sourceTree = ""; };
+ DBF156E02702DA6800EC00B7 /* Mastodon-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Mastodon-Bridging-Header.h"; sourceTree = ""; };
+ DBF156E12702DA6900EC00B7 /* UIStatusBarManager+HandleTapAction.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIStatusBarManager+HandleTapAction.m"; sourceTree = ""; };
+ DBF156E32702DB3F00EC00B7 /* HandleTapAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleTapAction.swift; sourceTree = ""; };
+ DBF1572E27046F1A00EC00B7 /* SecondaryPlaceholderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondaryPlaceholderViewController.swift; sourceTree = ""; };
DBF1D24D269DAF5D00C1C08A /* SearchDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchDetailViewController.swift; sourceTree = ""; };
DBF1D250269DB01200C1C08A /* SearchHistoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistoryViewController.swift; sourceTree = ""; };
DBF1D256269DBAC600C1C08A /* SearchDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchDetailViewModel.swift; sourceTree = ""; };
+ DBF3B73E2733EAED00E21627 /* local-codes.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "local-codes.json"; sourceTree = ""; };
+ DBF3B7402733EB9400E21627 /* MastodonLocalCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLocalCode.swift; sourceTree = ""; };
DBF53F5F25C14E88008AAC7B /* Mastodon.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = Mastodon.xctestplan; path = Mastodon/Mastodon.xctestplan; sourceTree = ""; };
DBF53F6025C14E9D008AAC7B /* MastodonSDK.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = MastodonSDK.xctestplan; sourceTree = ""; };
DBF8AE13263293E400C9C23C /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1381,6 +1492,7 @@
87FFDA5D898A5C42ADCB35E7 /* Pods_Mastodon.framework in Frameworks */,
DBF7A0FC26830C33004176A2 /* FPSIndicator in Frameworks */,
DB01E23526A98F0900C3965B /* MetaTextKit in Frameworks */,
+ DBA5A52F26F07ED800CACBAA /* PanModal in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1487,6 +1599,7 @@
children = (
DBABE3F125ECAC4E00879EE5 /* View */,
0FAA0FDE25E0B57E0017CCDE /* WelcomeViewController.swift */,
+ DB1D61CE26F1B33600DA8662 /* WelcomeViewModel.swift */,
);
path = Welcome;
sourceTree = "";
@@ -1664,6 +1777,7 @@
isa = PBXGroup;
children = (
DB0C947126A7D2D70088FB11 /* AvatarButton.swift */,
+ DB4932B226F2054200EF46D4 /* CircleAvatarButton.swift */,
DB71FD2B25F86A5100512AE1 /* AvatarStackContainerButton.swift */,
2D42FF8425C8224F004A627A /* HitTestExpandedButton.swift */,
0FAA101125E105390017CCDE /* PrimaryActionButton.swift */,
@@ -1691,12 +1805,16 @@
2D5A3D0125CF8640002347D6 /* Vender */ = {
isa = PBXGroup;
children = (
+ DB71C7CC271D7F4300BE3819 /* CurveAlgorithm.swift */,
2D5A3D0225CF8742002347D6 /* ControlContainableScrollViews.swift */,
DB51D170262832380062B7A1 /* BlurHashDecode.swift */,
DB51D171262832380062B7A1 /* BlurHashEncode.swift */,
DB6180EC26391C6C0018D199 /* TransitioningMath.swift */,
DB75BF1D263C1C1B00EDBF1F /* CustomScheduler.swift */,
DBAC649A267DF8C8007FE9FD /* ActivityIndicatorNode.swift */,
+ DBF156E32702DB3F00EC00B7 /* HandleTapAction.swift */,
+ DBF156E12702DA6900EC00B7 /* UIStatusBarManager+HandleTapAction.m */,
+ DBF156E02702DA6800EC00B7 /* Mastodon-Bridging-Header.h */,
);
path = Vender;
sourceTree = "";
@@ -1721,6 +1839,7 @@
DB297B1A2679FAE200704C90 /* PlaceholderImageCacheService.swift */,
DBAEDE5B267A058D00D25FF5 /* BlurhashImageCacheService.swift */,
DB564BD2269F3B35001E39A7 /* StatusFilterService.swift */,
+ DB73BF42271192BB00781945 /* InstanceService.swift */,
);
path = Service;
sourceTree = "";
@@ -1789,6 +1908,7 @@
2D4AD8A126316CD200613EFC /* SelectedAccountSection.swift */,
DB6D9F7C26358ED4008423CD /* SettingsSection.swift */,
DBA94433265CBB5300C537E1 /* ProfileFieldSection.swift */,
+ DB6B74FB272FF55800C70B6E /* UserSection.swift */,
);
path = Section;
sourceTree = "";
@@ -1832,8 +1952,10 @@
2DA7D04925CA52CB00804E11 /* TimelineBottomLoaderTableViewCell.swift */,
2D32EAAB25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift */,
DBE3CDBA261C427900430CC6 /* TimelineHeaderTableViewCell.swift */,
+ DB6B750327300B4000C70B6E /* TimelineFooterTableViewCell.swift */,
DB02CDAA26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift */,
DB92CF7125E7BB98002C1017 /* PollOptionTableViewCell.swift */,
+ DB6B74FF272FF73800C70B6E /* UserTableViewCell.swift */,
);
path = TableviewCell;
sourceTree = "";
@@ -1842,6 +1964,7 @@
isa = PBXGroup;
children = (
2D7631B225C159F700929FB9 /* Item.swift */,
+ DB6B74FD272FF59000C70B6E /* UserItem.swift */,
2D198642261BF09500F0B013 /* SearchResultItem.swift */,
DB4F097C26A03A5B00D62E92 /* SearchHistoryItem.swift */,
2D4AD8A726316D3500613EFC /* SelectedAccountItem.swift */,
@@ -1891,6 +2014,7 @@
isa = PBXGroup;
children = (
2DCB73FC2615C13900EC03D4 /* SearchRecommendCollectionHeader.swift */,
+ DB71C7CA271D5A0300BE3819 /* LineChartView.swift */,
);
path = View;
sourceTree = "";
@@ -2029,6 +2153,7 @@
DBAFB7342645463500371D5F /* Emojis.swift */,
DBA94439265CC0FC00C537E1 /* Fields.swift */,
DBA1DB7F268F84F80052DB59 /* NotificationType.swift */,
+ DB73BF46271199CA00781945 /* Instance.swift */,
);
path = CoreDataStack;
sourceTree = "";
@@ -2049,6 +2174,17 @@
path = Button;
sourceTree = "";
};
+ DB0EF72C26FDB1D600347686 /* View */ = {
+ isa = PBXGroup;
+ children = (
+ DBF156DE2701B17600EC00B7 /* SidebarAddAccountCollectionViewCell.swift */,
+ DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */,
+ DB0EF72D26FDB24F00347686 /* SidebarListContentView.swift */,
+ DB03A792272A7E5700EE37C5 /* SidebarListHeaderView.swift */,
+ );
+ path = View;
+ sourceTree = "";
+ };
DB1D187125EF5BBD003F1F23 /* TableView */ = {
isa = PBXGroup;
children = (
@@ -2082,6 +2218,7 @@
isa = PBXGroup;
children = (
164F0EBB267D4FE400249499 /* BoopSound.caf */,
+ DBF3B73E2733EAED00E21627 /* local-codes.json */,
DB427DDE25BAA00100D1B89D /* Assets.xcassets */,
DB118A8125E4B6E600FAB162 /* Preview Assets.xcassets */,
DB564BCE269F2F83001E39A7 /* Localizable.stringsdict */,
@@ -2199,6 +2336,8 @@
2D34D9D026148D9E0081BFC0 /* APIService+Recommend.swift */,
2D34D9DA261494120081BFC0 /* APIService+Search.swift */,
0F202212261351F5000C64BF /* APIService+HashtagTimeline.swift */,
+ DB6B74F9272FC2B500C70B6E /* APIService+Follower.swift */,
+ DB67D08327312970006A36CF /* APIService+Following.swift */,
DBCC3B9426157E6E0045B23D /* APIService+Relationship.swift */,
5B24BBE1262DB19100A9381B /* APIService+Report.swift */,
DBAE3F932616E28B004B8251 /* APIService+Follow.swift */,
@@ -2220,6 +2359,7 @@
2D79E700261EA5550011E398 /* APIService+CoreData+Tag.swift */,
DB6D9F56263577D2008423CD /* APIService+CoreData+Setting.swift */,
5B90C48A26259C120002E742 /* APIService+CoreData+Subscriptions.swift */,
+ DB73BF44271195AC00781945 /* APIService+CoreData+Instance.swift */,
);
path = CoreData;
sourceTree = "";
@@ -2310,11 +2450,13 @@
isa = PBXGroup;
children = (
DBA465942696E387002B41DB /* AppPreference.swift */,
+ DB647C5826F1EA2700F7F82C /* WizardPreference.swift */,
DB6D1B3C2636857500ACB481 /* AppearancePreference.swift */,
DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */,
DB1D842F26566512000346B3 /* KeyboardPreference.swift */,
DBCBCC0C2680B908000F5B51 /* HomeTimelinePreference.swift */,
DBD376AB2692ECDB007FEC24 /* ThemePreference.swift */,
+ DB67D088273256D7006A36CF /* StoreReviewPreference.swift */,
);
path = Preference;
sourceTree = "";
@@ -2334,6 +2476,18 @@
path = View;
sourceTree = "";
};
+ DB5B7296273112B400081888 /* Following */ = {
+ isa = PBXGroup;
+ children = (
+ DB5B7294273112B100081888 /* FollowingListViewController.swift */,
+ DB5B72992731137900081888 /* FollowingListViewController+Provider.swift */,
+ DB5B7297273112C800081888 /* FollowingListViewModel.swift */,
+ DB5B729B273113C200081888 /* FollowingListViewModel+Diffable.swift */,
+ DB5B729D273113F300081888 /* FollowingListViewModel+State.swift */,
+ );
+ path = Following;
+ sourceTree = "";
+ };
DB6180DE263919350018D199 /* MediaPreview */ = {
isa = PBXGroup;
children = (
@@ -2385,6 +2539,14 @@
path = Image;
sourceTree = "";
};
+ DB67D08727312E6A006A36CF /* Wizard */ = {
+ isa = PBXGroup;
+ children = (
+ DB67D08527312E67006A36CF /* WizardViewController.swift */,
+ );
+ path = Wizard;
+ sourceTree = "";
+ };
DB6804802637CD4C00430867 /* AppShared */ = {
isa = PBXGroup;
children = (
@@ -2393,6 +2555,7 @@
DB6804912637CD8700430867 /* AppName.swift */,
DB6804FC2637CFEC00430867 /* AppSecret.swift */,
DB6804D02637CE4700430867 /* UserDefaults.swift */,
+ DB73BF3A2711885500781945 /* UserDefaults+Notification.swift */,
);
path = AppShared;
sourceTree = "";
@@ -2415,6 +2578,18 @@
path = NavigationController;
sourceTree = "";
};
+ DB6B74F0272FB55400C70B6E /* Follower */ = {
+ isa = PBXGroup;
+ children = (
+ DB6B74EE272FB55000C70B6E /* FollowerListViewController.swift */,
+ DB6B74F7272FBFB100C70B6E /* FollowerListViewController+Provider.swift */,
+ DB6B74F1272FB67600C70B6E /* FollowerListViewModel.swift */,
+ DB6B74F3272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift */,
+ DB6B74F5272FBCDB00C70B6E /* FollowerListViewModel+State.swift */,
+ );
+ path = Follower;
+ sourceTree = "";
+ };
DB6C8C0525F0921200AAA452 /* MastodonSDK */ = {
isa = PBXGroup;
children = (
@@ -2489,6 +2664,28 @@
path = CollectionViewCell;
sourceTree = "";
};
+ DB852D1A26FAED0100FC9D81 /* Sidebar */ = {
+ isa = PBXGroup;
+ children = (
+ DB0EF72C26FDB1D600347686 /* View */,
+ DB852D1826FAEB6B00FC9D81 /* SidebarViewController.swift */,
+ DB852D1E26FB037800FC9D81 /* SidebarViewModel.swift */,
+ DBF1572E27046F1A00EC00B7 /* SecondaryPlaceholderViewController.swift */,
+ );
+ path = Sidebar;
+ sourceTree = "";
+ };
+ DB852D1D26FB021900FC9D81 /* Root */ = {
+ isa = PBXGroup;
+ children = (
+ DB852D1B26FB021500FC9D81 /* RootSplitViewController.swift */,
+ DB03A794272A981400EE37C5 /* ContentSplitViewController.swift */,
+ DB852D1A26FAED0100FC9D81 /* Sidebar */,
+ DB8AF54E25C13703002E6C99 /* MainTab */,
+ );
+ path = Root;
+ sourceTree = "";
+ };
DB87D45C2609DE6600D12C0D /* TextField */ = {
isa = PBXGroup;
children = (
@@ -2554,6 +2751,7 @@
5B90C46D26259B2C0002E742 /* Setting.swift */,
5B90C46C26259B2C0002E742 /* Subscription.swift */,
5B90C47E26259BA90002E742 /* SubscriptionAlerts.swift */,
+ DB73BF4027118B6D00781945 /* Instance.swift */,
);
path = Entity;
sourceTree = "";
@@ -2599,8 +2797,10 @@
children = (
2D7631A425C1532200929FB9 /* Share */,
DB6180E426391A500018D199 /* Transition */,
- DB8AF54E25C13703002E6C99 /* MainTab */,
+ DB852D1D26FB021900FC9D81 /* Root */,
DB01409B25C40BB600F9F3CF /* Onboarding */,
+ DB67D08727312E6A006A36CF /* Wizard */,
+ DB9F58ED26EF435800E7BBE9 /* Account */,
2D38F1D325CD463600561493 /* HomeTimeline */,
2D76316325C14BAC00929FB9 /* PublicTimeline */,
5B24BBD6262DB14800A9381B /* Report */,
@@ -2632,7 +2832,6 @@
DB0E91E926A9675100BD2ACC /* MetaLabel.swift */,
DB68586325E619B700F0A850 /* NSKeyValueObservation.swift */,
DB47229625F9EFAD00DA7F53 /* NSManagedObjectContext.swift */,
- DBAC6489267DC355007FE9FD /* NSDiffableDataSourceSnapshot.swift */,
DB0140CE25C42AEE00F9F3CF /* OSLog.swift */,
2D939AB425EDD8A90076FA61 /* String.swift */,
DB68A06225E905E000CFDF14 /* UIApplication.swift */,
@@ -2652,6 +2851,8 @@
DB9E0D6E25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift */,
DBCC3B2F261440A50045B23D /* UITabBarController.swift */,
DBCC3B35261440BA0045B23D /* UINavigationController.swift */,
+ DB73BF4827140BA300781945 /* UICollectionViewDiffableDataSource.swift */,
+ DB73BF4A27140C0800781945 /* UITableViewDiffableDataSource.swift */,
);
path = Extension;
sourceTree = "";
@@ -2743,6 +2944,8 @@
DBB525462611ED57002F1F29 /* Header */,
DBB5253B2611ECF5002F1F29 /* Timeline */,
DBE3CDF1261C6B3100430CC6 /* Favorite */,
+ DB6B74F0272FB55400C70B6E /* Follower */,
+ DB5B7296273112B400081888 /* Following */,
DB9D6BFE25E4F5940051B173 /* ProfileViewController.swift */,
DBAE3F812615DDA3004B8251 /* ProfileViewController+UserProvider.swift */,
DBB5255D2611F07A002F1F29 /* ProfileViewModel.swift */,
@@ -2771,10 +2974,40 @@
DB9D6C2225E502C60051B173 /* MosaicImageViewModel.swift */,
2DA6055025F74407006356F9 /* AudioContainerViewModel.swift */,
5DF1054625F8870E00D6C0D4 /* VideoPlayerViewModel.swift */,
+ DB7274F3273BB9B200577D95 /* ListBatchFetchViewModel.swift */,
);
path = ViewModel;
sourceTree = "";
};
+ DB9F58ED26EF435800E7BBE9 /* Account */ = {
+ isa = PBXGroup;
+ children = (
+ DBA5A53226F08EF300CACBAA /* View */,
+ DBA5A53326F0932E00CACBAA /* Cell */,
+ DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */,
+ DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */,
+ );
+ path = Account;
+ sourceTree = "";
+ };
+ DBA5A53226F08EF300CACBAA /* View */ = {
+ isa = PBXGroup;
+ children = (
+ DBA5A53026F08EF000CACBAA /* DragIndicatorView.swift */,
+ DB4932B826F31AD300EF46D4 /* BadgeButton.swift */,
+ );
+ path = View;
+ sourceTree = "";
+ };
+ DBA5A53326F0932E00CACBAA /* Cell */ = {
+ isa = PBXGroup;
+ children = (
+ DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */,
+ DBA5A53426F0A36A00CACBAA /* AddAccountTableViewCell.swift */,
+ );
+ path = Cell;
+ sourceTree = "";
+ };
DBA5E7A6263BD298004598BB /* ContextMenu */ = {
isa = PBXGroup;
children = (
@@ -2806,6 +3039,7 @@
isa = PBXGroup;
children = (
DBABE3EB25ECAC4B00879EE5 /* WelcomeIllustrationView.swift */,
+ DB4932B026F1FB5300EF46D4 /* WizardCardView.swift */,
);
path = View;
sourceTree = "";
@@ -2833,6 +3067,7 @@
children = (
DBAE3F672615DD60004B8251 /* UserProvider.swift */,
DBAE3F872615DDF4004B8251 /* UserProviderFacade.swift */,
+ DB6B75012730060700C70B6E /* UserProviderFacade+UITableViewDelegate.swift */,
);
path = UserProvider;
sourceTree = "";
@@ -2919,6 +3154,7 @@
DBBC24D626A54BCB00398BB9 /* MastodonRegex.swift */,
DBBC24D826A54BCB00398BB9 /* MastodonMetricFormatter.swift */,
DBFEF07626A691FB006D7ED1 /* MastodonAuthenticationBox.swift */,
+ DBF3B7402733EB9400E21627 /* MastodonLocalCode.swift */,
);
path = Helper;
sourceTree = "";
@@ -3144,6 +3380,7 @@
DB01E23226A98F0900C3965B /* MastodonMeta */,
DB01E23426A98F0900C3965B /* MetaTextKit */,
DB552D4E26BBD10C00E481F6 /* OrderedCollections */,
+ DBA5A52E26F07ED800CACBAA /* PanModal */,
);
productName = Mastodon;
productReference = DB427DD225BAA00100D1B89D /* Mastodon.app */;
@@ -3333,7 +3570,7 @@
TargetAttributes = {
DB427DD125BAA00100D1B89D = {
CreatedOnToolsVersion = 12.4;
- LastSwiftMigration = 1220;
+ LastSwiftMigration = 1300;
};
DB427DE725BAA00100D1B89D = {
CreatedOnToolsVersion = 12.4;
@@ -3385,6 +3622,7 @@
ru,
"gd-GB",
th,
+ "ku-TR",
);
mainGroup = DB427DC925BAA00100D1B89D;
packageReferences = (
@@ -3403,6 +3641,7 @@
DB0E2D2C26833FF600865C3C /* XCRemoteSwiftPackageReference "Nuke-FLAnimatedImage-Plugin" */,
DB01E23126A98F0900C3965B /* XCRemoteSwiftPackageReference "MetaTextKit" */,
DB552D4D26BBD10C00E481F6 /* XCRemoteSwiftPackageReference "swift-collections" */,
+ DBA5A52D26F07ED800CACBAA /* XCRemoteSwiftPackageReference "PanModal" */,
);
productRefGroup = DB427DD325BAA00100D1B89D /* Products */;
projectDirPath = "";
@@ -3433,6 +3672,7 @@
DB427DDF25BAA00100D1B89D /* Assets.xcassets in Resources */,
DB427DDD25BAA00100D1B89D /* Main.storyboard in Resources */,
DBA4B0F626C269880077136E /* Intents.stringsdict in Resources */,
+ DBF3B73F2733EAED00E21627 /* local-codes.json in Resources */,
DB118A8225E4B6E600FAB162 /* Preview Assets.xcassets in Resources */,
DB2B3ABC25E37E15007045F9 /* InfoPlist.strings in Resources */,
DB68A05D25E9055900CFDF14 /* Settings.bundle in Resources */,
@@ -3725,6 +3965,7 @@
DBAE3F8E2616E0B1004B8251 /* APIService+Block.swift in Sources */,
5DF1057F25F88A4100D6C0D4 /* TouchBlockingView.swift in Sources */,
DB1D843426579931000346B3 /* TableViewControllerNavigateable.swift in Sources */,
+ DB5B729A2731137900081888 /* FollowingListViewController+Provider.swift in Sources */,
0FAA0FDF25E0B57E0017CCDE /* WelcomeViewController.swift in Sources */,
2D206B8C25F6015000143C56 /* AudioPlaybackService.swift in Sources */,
2D59819B25E4A581000FB903 /* MastodonConfirmEmailViewController.swift in Sources */,
@@ -3733,8 +3974,10 @@
DBA94440265D137600C537E1 /* Mastodon+Entity+Field.swift in Sources */,
DB49A61425FF2C5600B98345 /* EmojiService.swift in Sources */,
DBBF1DC7265251D400E5B703 /* AutoCompleteViewModel+State.swift in Sources */,
+ DB03A793272A7E5700EE37C5 /* SidebarListHeaderView.swift in Sources */,
DB4FFC2B269EC39600D62E92 /* SearchToSearchDetailViewControllerAnimatedTransitioning.swift in Sources */,
DBCC3B9526157E6E0045B23D /* APIService+Relationship.swift in Sources */,
+ DB5B7298273112C800081888 /* FollowingListViewModel.swift in Sources */,
2D7631B325C159F700929FB9 /* Item.swift in Sources */,
5DF1054125F886D400D6C0D4 /* VideoPlaybackService.swift in Sources */,
DB6B35182601FA3400DC1E11 /* MastodonAttachmentService.swift in Sources */,
@@ -3756,6 +3999,7 @@
2D5A3D3825CF8D9F002347D6 /* ScrollViewContainer.swift in Sources */,
DB6180EF26391CA50018D199 /* MediaPreviewImageViewController.swift in Sources */,
DB1E347825F519300079D7DF /* PickServerItem.swift in Sources */,
+ DBA5A53126F08EF000CACBAA /* DragIndicatorView.swift in Sources */,
DB1FD45A25F27898004CFCFC /* CategoryPickerItem.swift in Sources */,
DB6180F626391D580018D199 /* MediaPreviewableViewController.swift in Sources */,
2D571B2F26004EC000540450 /* NavigationBarProgressView.swift in Sources */,
@@ -3794,6 +4038,7 @@
DB71FD4625F8C6D200512AE1 /* StatusProvider+UITableViewDataSourcePrefetching.swift in Sources */,
DB297B1B2679FAE200704C90 /* PlaceholderImageCacheService.swift in Sources */,
2D8FCA082637EABB00137F46 /* APIService+FollowRequest.swift in Sources */,
+ DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */,
2D152A8C25C295CC009AA50C /* StatusView.swift in Sources */,
DBBC24DE26A54BCB00398BB9 /* MastodonMetricFormatter.swift in Sources */,
DBB3BA2A26A81C020004F2D4 /* FLAnimatedImageView.swift in Sources */,
@@ -3803,12 +4048,14 @@
DB72601C25E36A2100235243 /* MastodonServerRulesViewController.swift in Sources */,
DBB5250E2611EBAF002F1F29 /* ProfileSegmentedViewController.swift in Sources */,
2D42FF8F25C8228A004A627A /* UIButton.swift in Sources */,
+ DBF156DF2701B17600EC00B7 /* SidebarAddAccountCollectionViewCell.swift in Sources */,
DB789A0B25F9F2950071ACA0 /* ComposeViewController.swift in Sources */,
DB938F0926240F3C00E5B6C1 /* RemoteThreadViewModel.swift in Sources */,
DBBC24AE26A53DC100398BB9 /* ReplicaStatusView.swift in Sources */,
DB75BF1E263C1C1B00EDBF1F /* CustomScheduler.swift in Sources */,
0FAA102725E1126A0017CCDE /* MastodonPickServerViewController.swift in Sources */,
DB59F0FE25EF5D96001F1DAB /* StatusProvider+UITableViewDelegate.swift in Sources */,
+ DB6B74FE272FF59000C70B6E /* UserItem.swift in Sources */,
DB68586425E619B700F0A850 /* NSKeyValueObservation.swift in Sources */,
DBE3CE07261D6A0E00430CC6 /* FavoriteViewModel+Diffable.swift in Sources */,
2D61335825C188A000CAE157 /* APIService+Persist+Status.swift in Sources */,
@@ -3825,7 +4072,6 @@
DBBC24DC26A54BCB00398BB9 /* MastodonRegex.swift in Sources */,
2D69D00A25CAA00300C3A1B2 /* APIService+CoreData+Status.swift in Sources */,
DB4481C625EE2ADA00BEFB67 /* PollSection.swift in Sources */,
- DBAC648A267DC355007FE9FD /* NSDiffableDataSourceSnapshot.swift in Sources */,
DBCBED1726132DB500B49291 /* UserTimelineViewModel+Diffable.swift in Sources */,
DB71FD4C25F8C80E00512AE1 /* StatusPrefetchingService.swift in Sources */,
2DE0FACE2615F7AD00CDF649 /* RecommendAccountSection.swift in Sources */,
@@ -3857,6 +4103,7 @@
DB36679F268ABAF20027D07F /* ComposeStatusAttachmentSection.swift in Sources */,
2DA7D04425CA52B200804E11 /* TimelineLoaderTableViewCell.swift in Sources */,
DB87D44B2609C11900D12C0D /* PollOptionView.swift in Sources */,
+ DBF1572F27046F1A00EC00B7 /* SecondaryPlaceholderViewController.swift in Sources */,
DB03F7F32689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift in Sources */,
2D4AD8A826316D3500613EFC /* SelectedAccountItem.swift in Sources */,
DBE3CDFB261C6CA500430CC6 /* FavoriteViewModel.swift in Sources */,
@@ -3867,6 +4114,8 @@
DBE3CE01261D623D00430CC6 /* FavoriteViewModel+State.swift in Sources */,
2D82BA0525E7897700E36F0F /* MastodonResendEmailViewModelNavigationDelegateShim.swift in Sources */,
2D38F1EB25CD477000561493 /* HomeTimelineViewModel+LoadLatestState.swift in Sources */,
+ DB67D089273256D7006A36CF /* StoreReviewPreference.swift in Sources */,
+ DB5B7295273112B100081888 /* FollowingListViewController.swift in Sources */,
0F202201261326E6000C64BF /* HashtagTimelineViewModel.swift in Sources */,
DB6D9F9726367249008423CD /* SettingsViewController.swift in Sources */,
DB4F097F26A03DA600D62E92 /* SearchHistoryFetchedResultController.swift in Sources */,
@@ -3874,15 +4123,19 @@
DBAE3FAF26172FC0004B8251 /* RemoteProfileViewModel.swift in Sources */,
DBE3CE0D261D767100430CC6 /* FavoriteViewController+Provider.swift in Sources */,
2D084B9326259545003AA3AF /* NotificationViewModel+LoadLatestState.swift in Sources */,
+ DB73BF47271199CA00781945 /* Instance.swift in Sources */,
DB0F8150264D1E2500F2A12B /* PickServerLoaderTableViewCell.swift in Sources */,
DB98337F25C9452D00AD9700 /* APIService+APIError.swift in Sources */,
+ DB5B729C273113C200081888 /* FollowingListViewModel+Diffable.swift in Sources */,
DB9E0D6F25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift in Sources */,
DBB9759C262462E1004620BD /* ThreadMetaView.swift in Sources */,
+ DB5B729E273113F300081888 /* FollowingListViewModel+State.swift in Sources */,
2DF123A725C3B0210020F248 /* ActiveLabel.swift in Sources */,
5DDDF1A92617489F00311060 /* Mastodon+Entity+History.swift in Sources */,
DB59F11825EFA35B001F1DAB /* StripProgressView.swift in Sources */,
DB59F10425EF5EBC001F1DAB /* TableViewCellHeightCacheableContainer.swift in Sources */,
DBF9814C265E339500E4BA07 /* ProfileFieldAddEntryCollectionViewCell.swift in Sources */,
+ DB73BF4927140BA300781945 /* UICollectionViewDiffableDataSource.swift in Sources */,
DBA5E7AB263BD3F5004598BB /* TimelineTableViewCellContextMenuConfiguration.swift in Sources */,
DB73B490261F030A002E9E9F /* SafariActivity.swift in Sources */,
DB6D1B44263691CF00ACB481 /* Mastodon+API+Subscriptions+Policy.swift in Sources */,
@@ -3896,6 +4149,8 @@
5B90C45E262599800002E742 /* SettingsViewModel.swift in Sources */,
2D82B9FF25E7863200E36F0F /* OnboardingViewControllerAppearance.swift in Sources */,
5DF1054725F8870E00D6C0D4 /* VideoPlayerViewModel.swift in Sources */,
+ DB73BF43271192BB00781945 /* InstanceService.swift in Sources */,
+ DB67D08427312970006A36CF /* APIService+Following.swift in Sources */,
DBA9443A265CC0FC00C537E1 /* Fields.swift in Sources */,
2DE0FAC12615F04D00CDF649 /* RecommendHashTagSection.swift in Sources */,
DBA5E7A5263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift in Sources */,
@@ -3916,22 +4171,28 @@
DBAEDE5C267A058D00D25FF5 /* BlurhashImageCacheService.swift in Sources */,
2D38F1DF25CD46A400561493 /* HomeTimelineViewController+Provider.swift in Sources */,
DB1D843026566512000346B3 /* KeyboardPreference.swift in Sources */,
+ DB852D1926FAEB6B00FC9D81 /* SidebarViewController.swift in Sources */,
2D206B9225F60EA700143C56 /* UIControl.swift in Sources */,
2D9DB96B263A91D1007C1D71 /* APIService+DomainBlock.swift in Sources */,
DBBF1DC92652538500E5B703 /* AutoCompleteSection.swift in Sources */,
2D45E5BF25C9549700A6D639 /* PublicTimelineViewModel+State.swift in Sources */,
DB8AF55D25C138B7002E6C99 /* UIViewController.swift in Sources */,
DB7F48452620241000796008 /* ProfileHeaderViewModel.swift in Sources */,
+ DB647C5926F1EA2700F7F82C /* WizardPreference.swift in Sources */,
2D3F9E0425DFA133004262D9 /* UITapGestureRecognizer.swift in Sources */,
5DDDF1992617447F00311060 /* Mastodon+Entity+Tag.swift in Sources */,
5B90C45F262599800002E742 /* SettingsToggleTableViewCell.swift in Sources */,
2D694A7425F9EB4E0038ADDC /* ContentWarningOverlayView.swift in Sources */,
+ DB4932B126F1FB5300EF46D4 /* WizardCardView.swift in Sources */,
DBAE3F682615DD60004B8251 /* UserProvider.swift in Sources */,
DBAC6488267D388B007FE9FD /* ASTableNode.swift in Sources */,
DB6D9F76263587C7008423CD /* SettingFetchedResultController.swift in Sources */,
DB9A486C26032AC1008B817C /* AttachmentContainerView+EmptyStateView.swift in Sources */,
5D0393902612D259007FE196 /* WebViewController.swift in Sources */,
DB4481CC25EE2AFE00BEFB67 /* PollItem.swift in Sources */,
+ DB6B74FA272FC2B500C70B6E /* APIService+Follower.swift in Sources */,
+ DB6B74F4272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift in Sources */,
+ DB6B74F2272FB67600C70B6E /* FollowerListViewModel.swift in Sources */,
DB44767B260B3B8C00B66B82 /* CustomEmojiPickerInputView.swift in Sources */,
0F20222D261457EE000C64BF /* HashtagTimelineViewModel+LoadOldestState.swift in Sources */,
DB0009A626AEE5DC009B9D2D /* Intents.intentdefinition in Sources */,
@@ -3944,7 +4205,9 @@
DB35FC1F2612F1D9006193C9 /* ProfileRelationshipActionButton.swift in Sources */,
DBC7A672260C897100E57475 /* StatusContentWarningEditorView.swift in Sources */,
DB3667A6268AE2620027D07F /* ComposeStatusPollSection.swift in Sources */,
+ DB6B750427300B4000C70B6E /* TimelineFooterTableViewCell.swift in Sources */,
DB59F10E25EF724F001F1DAB /* APIService+Poll.swift in Sources */,
+ DB852D1F26FB037800FC9D81 /* SidebarViewModel.swift in Sources */,
DB47229725F9EFAD00DA7F53 /* NSManagedObjectContext.swift in Sources */,
2D34D9D126148D9E0081BFC0 /* APIService+Recommend.swift in Sources */,
DBB525562611EDCA002F1F29 /* UserTimelineViewModel.swift in Sources */,
@@ -3956,10 +4219,13 @@
DB3667A1268ABB2E0027D07F /* ComposeStatusAttachmentItem.swift in Sources */,
DB1D186C25EF5BA7003F1F23 /* PollTableView.swift in Sources */,
DBA94434265CBB5300C537E1 /* ProfileFieldSection.swift in Sources */,
+ DBF156E42702DB3F00EC00B7 /* HandleTapAction.swift in Sources */,
DB023295267F0AB800031745 /* ASMetaEditableTextNode.swift in Sources */,
2D5981A125E4A593000FB903 /* MastodonConfirmEmailViewModel.swift in Sources */,
+ DB6B74F6272FBCDB00C70B6E /* FollowerListViewModel+State.swift in Sources */,
DB4F096C269EFA2000D62E92 /* SearchResultViewController+StatusProvider.swift in Sources */,
DB87D4452609BE0500D12C0D /* ComposeStatusPollOptionCollectionViewCell.swift in Sources */,
+ DB9F58EF26EF491E00E7BBE9 /* AccountListViewModel.swift in Sources */,
DB6D9F7D26358ED4008423CD /* SettingsSection.swift in Sources */,
DB0E91EA26A9675100BD2ACC /* MetaLabel.swift in Sources */,
DB8AF55025C13703002E6C99 /* MainTabBarController.swift in Sources */,
@@ -3970,9 +4236,12 @@
2D24E11D2626D8B100A59D4F /* NotificationStatusTableViewCell.swift in Sources */,
DB6C8C0F25F0A6AE00AAA452 /* Mastodon+Entity+Error.swift in Sources */,
DB1E346825F518E20079D7DF /* CategoryPickerSection.swift in Sources */,
+ DB7274F4273BB9B200577D95 /* ListBatchFetchViewModel.swift in Sources */,
2D61254D262547C200299647 /* APIService+Notification.swift in Sources */,
DB040ED126538E3D00BEE9D8 /* Trie.swift in Sources */,
+ DB73BF4B27140C0800781945 /* UITableViewDiffableDataSource.swift in Sources */,
DBB525642612C988002F1F29 /* MeProfileViewModel.swift in Sources */,
+ DB6B74EF272FB55000C70B6E /* FollowerListViewController.swift in Sources */,
5BB04FE9262EFC300043BFF6 /* ReportedStatusTableviewCell.swift in Sources */,
DBAE3F822615DDA3004B8251 /* ProfileViewController+UserProvider.swift in Sources */,
DBBC24C426A544B900398BB9 /* Theme.swift in Sources */,
@@ -3981,6 +4250,7 @@
DBC7A67C260DFADE00E57475 /* StatusPublishService.swift in Sources */,
DBCBCC092680B01B000F5B51 /* AsyncHomeTimelineViewModel+LoadMiddleState.swift in Sources */,
2DCB73FD2615C13900EC03D4 /* SearchRecommendCollectionHeader.swift in Sources */,
+ DB852D1C26FB021500FC9D81 /* RootSplitViewController.swift in Sources */,
DB02CDBF2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift in Sources */,
DB1FD44425F26CCC004CFCFC /* PickServerSection.swift in Sources */,
0FB3D30F25E525CD00AAD544 /* PickServerCategoryView.swift in Sources */,
@@ -4001,6 +4271,7 @@
2DAC9E46262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift in Sources */,
DB4FFC2C269EC39600D62E92 /* SearchTransitionController.swift in Sources */,
DBA5E7A9263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift in Sources */,
+ DBF156E22702DA6900EC00B7 /* UIStatusBarManager+HandleTapAction.m in Sources */,
DB45FADD25CA6F6B005A8AC7 /* APIService+CoreData+MastodonUser.swift in Sources */,
2D32EABA25CB9B0500C9ED86 /* UIView.swift in Sources */,
2D38F20825CD491300561493 /* DisposeBagCollectable.swift in Sources */,
@@ -4012,17 +4283,21 @@
DB49A63D25FF609300B98345 /* PlayerContainerView+MediaTypeIndicotorView.swift in Sources */,
DB6180F826391D660018D199 /* MediaPreviewingViewController.swift in Sources */,
DB0140CF25C42AEE00F9F3CF /* OSLog.swift in Sources */,
+ DB6B75022730060700C70B6E /* UserProviderFacade+UITableViewDelegate.swift in Sources */,
DB44384F25E8C1FA008912A2 /* CALayer.swift in Sources */,
2D34D9CB261489930081BFC0 /* SearchViewController+Recommend.swift in Sources */,
+ DB71C7CB271D5A0300BE3819 /* LineChartView.swift in Sources */,
DB938F1526241FDF00E5B6C1 /* APIService+Thread.swift in Sources */,
DB482A45261335BA008AE74C /* UserTimelineViewController+Provider.swift in Sources */,
2D206B8625F5FB0900143C56 /* Double.swift in Sources */,
+ DB9F58F126EF512300E7BBE9 /* AccountListTableViewCell.swift in Sources */,
2D76319F25C1521200929FB9 /* StatusSection.swift in Sources */,
DB35FC252612FD7A006193C9 /* ProfileFieldView.swift in Sources */,
DB938F0326240EA300E5B6C1 /* CachedThreadViewModel.swift in Sources */,
DB6D9F6326357848008423CD /* SettingService.swift in Sources */,
2D650FAB25ECDC9300851B58 /* Mastodon+Entity+Error+Detail.swift in Sources */,
2D24E12D2626FD2E00A59D4F /* NotificationViewModel+LoadOldestState.swift in Sources */,
+ DBA5A53526F0A36A00CACBAA /* AddAccountTableViewCell.swift in Sources */,
2DB72C8C262D764300CE6173 /* Mastodon+Entity+Notification+Type.swift in Sources */,
2D35237A26256D920031AF25 /* NotificationSection.swift in Sources */,
DB084B5725CBC56C00F898ED /* Status.swift in Sources */,
@@ -4040,6 +4315,7 @@
DB9D6C0E25E4F9780051B173 /* MosaicImageViewContainer.swift in Sources */,
DBCBCC0D2680B908000F5B51 /* HomeTimelinePreference.swift in Sources */,
DB71FD3625F8A16C00512AE1 /* APIService+Persist+PersistMemo.swift in Sources */,
+ DB0EF72E26FDB24F00347686 /* SidebarListContentView.swift in Sources */,
DBBE1B4525F3474B0081417A /* MastodonPickServerAppearance.swift in Sources */,
DB98338725C945ED00AD9700 /* Strings.swift in Sources */,
2D7867192625B77500211898 /* NotificationItem.swift in Sources */,
@@ -4055,10 +4331,12 @@
2D32EADA25CBCC3300C9ED86 /* PublicTimelineViewModel+LoadMiddleState.swift in Sources */,
5B90C48526259BF10002E742 /* APIService+Subscriptions.swift in Sources */,
0F20223926146553000C64BF /* Array.swift in Sources */,
+ DB0EF72B26FDB1D200347686 /* SidebarListCollectionViewCell.swift in Sources */,
5B90C460262599800002E742 /* SettingsAppearanceTableViewCell.swift in Sources */,
DB0C946B26A700AB0088FB11 /* MastodonUser+Property.swift in Sources */,
DB8AF54425C13647002E6C99 /* SceneCoordinator.swift in Sources */,
5DF1058525F88AE500D6C0D4 /* NeedsDependency+AVPlayerViewControllerDelegate.swift in Sources */,
+ DB73BF45271195AC00781945 /* APIService+CoreData+Instance.swift in Sources */,
DB1D84382657B275000346B3 /* SegmentedControlNavigateable.swift in Sources */,
DB447697260B439000B66B82 /* CustomEmojiPickerHeaderCollectionReusableView.swift in Sources */,
DB45FAF925CA80A2005A8AC7 /* APIService+CoreData+MastodonAuthentication.swift in Sources */,
@@ -4071,11 +4349,14 @@
DBE54AC62636C89F004E7C0B /* NotificationPreference.swift in Sources */,
2D5A3D2825CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift in Sources */,
DB98339C25C96DE600AD9700 /* APIService+Account.swift in Sources */,
+ DB6B74FC272FF55800C70B6E /* UserSection.swift in Sources */,
2DF75BA725D10E1000694EC8 /* APIService+Favorite.swift in Sources */,
DB9D6C3825E508BE0051B173 /* Attachment.swift in Sources */,
5DFC35DF262068D20045711D /* SearchViewController+Follow.swift in Sources */,
DB8AF52E25C13561002E6C99 /* ViewStateStore.swift in Sources */,
+ DB1D61CF26F1B33600DA8662 /* WelcomeViewModel.swift in Sources */,
2DA7D04A25CA52CB00804E11 /* TimelineBottomLoaderTableViewCell.swift in Sources */,
+ DB71C7CD271D7F4300BE3819 /* CurveAlgorithm.swift in Sources */,
DBD376B2269302A4007FEC24 /* UITableViewCell.swift in Sources */,
DB4F0966269ED52200D62E92 /* SearchResultViewModel.swift in Sources */,
DBAC6499267DF2C4007FE9FD /* TimelineBottomLoaderNode.swift in Sources */,
@@ -4085,11 +4366,13 @@
0F202227261411BB000C64BF /* HashtagTimelineViewController+Provider.swift in Sources */,
2D7631A825C1535600929FB9 /* StatusTableViewCell.swift in Sources */,
2D76316525C14BD100929FB9 /* PublicTimelineViewController.swift in Sources */,
+ DB6B7500272FF73800C70B6E /* UserTableViewCell.swift in Sources */,
DB1D842E26552C4D000346B3 /* StatusTableViewControllerNavigateable.swift in Sources */,
DB938F1F2624382F00E5B6C1 /* ThreadViewModel+Diffable.swift in Sources */,
2D69CFF425CA9E2200C3A1B2 /* LoadMoreConfigurableTableViewContainer.swift in Sources */,
DB482A4B261340A7008AE74C /* APIService+UserTimeline.swift in Sources */,
DB427DD825BAA00100D1B89D /* SceneDelegate.swift in Sources */,
+ DB4932B926F31AD300EF46D4 /* BadgeButton.swift in Sources */,
0F2021FB2613262F000C64BF /* HashtagTimelineViewController.swift in Sources */,
DBCC3B30261440A50045B23D /* UITabBarController.swift in Sources */,
DB8190C62601FF0400020C08 /* AttachmentContainerView.swift in Sources */,
@@ -4098,6 +4381,7 @@
DB71FD2C25F86A5100512AE1 /* AvatarStackContainerButton.swift in Sources */,
DB87D4512609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift in Sources */,
DBBC24C026A5443100398BB9 /* MastodonTheme.swift in Sources */,
+ DB67D08627312E67006A36CF /* WizardViewController.swift in Sources */,
DBBC24B526A540AE00398BB9 /* AvatarConfigurableView.swift in Sources */,
DB9A489026035963008B817C /* APIService+Media.swift in Sources */,
DBFEF07726A691FB006D7ED1 /* MastodonAuthenticationBox.swift in Sources */,
@@ -4105,6 +4389,7 @@
2D198649261C0B8500F0B013 /* SearchResultSection.swift in Sources */,
DB4F097B26A039FF00D62E92 /* SearchHistorySection.swift in Sources */,
DBB525302611EBF3002F1F29 /* ProfilePagingViewModel.swift in Sources */,
+ DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */,
DBCBCC0B2680B03F000F5B51 /* AsyncHomeTimelineViewModel+LoadOldestState.swift in Sources */,
2D5A3D6225CFD9CB002347D6 /* HomeTimelineViewController+DebugAction.swift in Sources */,
DB49A62525FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift in Sources */,
@@ -4112,7 +4397,9 @@
DB6D9F6F2635807F008423CD /* Setting.swift in Sources */,
DB6F5E38264E994A009108F4 /* AutoCompleteTopChevronView.swift in Sources */,
DBB525412611ED54002F1F29 /* ProfileHeaderViewController.swift in Sources */,
+ DB6B74F8272FBFB100C70B6E /* FollowerListViewController+Provider.swift in Sources */,
DB9D6BFF25E4F5940051B173 /* ProfileViewController.swift in Sources */,
+ DB4932B326F2054200EF46D4 /* CircleAvatarButton.swift in Sources */,
0FB3D30825E524C600AAD544 /* PickServerCategoriesCell.swift in Sources */,
2D4AD8A226316CD200613EFC /* SelectedAccountSection.swift in Sources */,
DB789A1225F9F2CC0071ACA0 /* ComposeViewModel.swift in Sources */,
@@ -4124,6 +4411,7 @@
2D38F1FE25CD481700561493 /* StatusProvider.swift in Sources */,
DB1EE7B2267F9525000CC337 /* StatusProvider+StatusNodeDelegate.swift in Sources */,
5B24BBE2262DB19100A9381B /* APIService+Report.swift in Sources */,
+ DBF3B7412733EB9400E21627 /* MastodonLocalCode.swift in Sources */,
DB4F096A269EDAD200D62E92 /* SearchResultViewModel+State.swift in Sources */,
5BB04FF5262F0E6D0043BFF6 /* ReportSection.swift in Sources */,
DBA94436265CBB7400C537E1 /* ProfileFieldItem.swift in Sources */,
@@ -4168,6 +4456,8 @@
buildActionMask = 2147483647;
files = (
DB6804D12637CE4700430867 /* UserDefaults.swift in Sources */,
+ DB73BF3B2711885500781945 /* UserDefaults+Notification.swift in Sources */,
+ DB4932B726F30F0700EF46D4 /* Array.swift in Sources */,
DB6804922637CD8700430867 /* AppName.swift in Sources */,
DB6804FD2637CFEC00430867 /* AppSecret.swift in Sources */,
);
@@ -4187,6 +4477,7 @@
2D927F0E25C7E9C9004F19B8 /* History.swift in Sources */,
DBCC3B9B261584A00045B23D /* PrivateNote.swift in Sources */,
DB89BA3725C1145C008580ED /* CoreData.xcdatamodeld in Sources */,
+ DB73BF4127118B6D00781945 /* Instance.swift in Sources */,
DB8AF52525C131D1002E6C99 /* MastodonUser.swift in Sources */,
DB89BA1B25C1107F008580ED /* Collection.swift in Sources */,
DB4481AD25EE155900BEFB67 /* Poll.swift in Sources */,
@@ -4383,6 +4674,7 @@
DB4B777F26CA4EFA00B087B3 /* ru */,
DB4B778426CA500E00B087B3 /* gd-GB */,
DB4B779226CA50BA00B087B3 /* th */,
+ DBDC1CF9272C0FD600055C3D /* ku-TR */,
);
name = Intents.intentdefinition;
sourceTree = "";
@@ -4403,6 +4695,7 @@
DB4B778226CA4EFA00B087B3 /* ru */,
DB4B778726CA500E00B087B3 /* gd-GB */,
DB4B779526CA50BA00B087B3 /* th */,
+ DBDC1CFC272C0FD600055C3D /* ku-TR */,
);
name = InfoPlist.strings;
sourceTree = "";
@@ -4423,6 +4716,7 @@
DB4B778126CA4EFA00B087B3 /* ru */,
DB4B778626CA500E00B087B3 /* gd-GB */,
DB4B779426CA50BA00B087B3 /* th */,
+ DBDC1CFB272C0FD600055C3D /* ku-TR */,
);
name = Localizable.strings;
sourceTree = "";
@@ -4459,6 +4753,7 @@
DB4B778026CA4EFA00B087B3 /* ru */,
DB4B778526CA500E00B087B3 /* gd-GB */,
DB4B779326CA50BA00B087B3 /* th */,
+ DBDC1CFA272C0FD600055C3D /* ku-TR */,
);
name = Localizable.stringsdict;
sourceTree = "";
@@ -4479,6 +4774,7 @@
DB4B779026CA504900B087B3 /* fr */,
DB4B779126CA504A00B087B3 /* ja */,
DB4B779626CA50BA00B087B3 /* th */,
+ DBDC1CFD272C0FD600055C3D /* ku-TR */,
);
name = Intents.stringsdict;
sourceTree = "";
@@ -4623,7 +4919,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
@@ -4635,6 +4931,7 @@
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OBJC_BRIDGING_HEADER = "Mastodon/Vender/Mastodon-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
@@ -4651,7 +4948,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
@@ -4663,6 +4960,7 @@
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OBJC_BRIDGING_HEADER = "Mastodon/Vender/Mastodon-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
@@ -4758,11 +5056,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 60;
+ DYLIB_CURRENT_VERSION = 88;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -4789,11 +5087,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 60;
+ DYLIB_CURRENT_VERSION = 88;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -4818,11 +5116,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 60;
+ DYLIB_CURRENT_VERSION = 88;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = CoreDataStack/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -4848,11 +5146,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 60;
+ DYLIB_CURRENT_VERSION = 88;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = CoreDataStack/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -4915,7 +5213,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4940,7 +5238,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4965,7 +5263,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4990,7 +5288,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5015,7 +5313,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5040,7 +5338,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5065,7 +5363,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5090,7 +5388,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5181,7 +5479,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
@@ -5193,6 +5491,7 @@
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OBJC_BRIDGING_HEADER = "Mastodon/Vender/Mastodon-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
@@ -5247,11 +5546,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 60;
+ DYLIB_CURRENT_VERSION = 88;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = CoreDataStack/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -5296,7 +5595,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5321,11 +5620,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 60;
+ DYLIB_CURRENT_VERSION = 88;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -5417,7 +5716,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
@@ -5429,6 +5728,7 @@
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OBJC_BRIDGING_HEADER = "Mastodon/Vender/Mastodon-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
@@ -5483,11 +5783,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 60;
+ DYLIB_CURRENT_VERSION = 88;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = CoreDataStack/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -5532,7 +5832,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5557,11 +5857,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 60;
+ DYLIB_CURRENT_VERSION = 88;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -5587,7 +5887,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5611,7 +5911,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 60;
+ CURRENT_PROJECT_VERSION = 88;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -5782,7 +6082,7 @@
repositoryURL = "https://github.com/TwidereProject/MetaTextKit.git";
requirement = {
kind = exactVersion;
- version = 2.1.1;
+ version = 2.1.2;
};
};
DB0E2D2C26833FF600865C3C /* XCRemoteSwiftPackageReference "Nuke-FLAnimatedImage-Plugin" */ = {
@@ -5825,6 +6125,14 @@
minimumVersion = 1.4.1;
};
};
+ DBA5A52D26F07ED800CACBAA /* XCRemoteSwiftPackageReference "PanModal" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/slackhq/PanModal.git";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 1.2.7;
+ };
+ };
DBAC6481267D0B21007FE9FD /* XCRemoteSwiftPackageReference "DifferenceKit" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/ra1028/DifferenceKit.git";
@@ -5937,6 +6245,11 @@
package = DB9A487C2603456B008B817C /* XCRemoteSwiftPackageReference "UITextView-Placeholder" */;
productName = "UITextView+Placeholder";
};
+ DBA5A52E26F07ED800CACBAA /* PanModal */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = DBA5A52D26F07ED800CACBAA /* XCRemoteSwiftPackageReference "PanModal" */;
+ productName = PanModal;
+ };
DBAC6482267D0B21007FE9FD /* DifferenceKit */ = {
isa = XCSwiftPackageProductDependency;
package = DBAC6481267D0B21007FE9FD /* XCRemoteSwiftPackageReference "DifferenceKit" */;
@@ -5998,9 +6311,10 @@
DB89BA3525C1145C008580ED /* CoreData.xcdatamodeld */ = {
isa = XCVersionGroup;
children = (
+ DBF156DD27006F5D00EC00B7 /* CoreData 2.xcdatamodel */,
DB89BA3625C1145C008580ED /* CoreData.xcdatamodel */,
);
- currentVersion = DB89BA3625C1145C008580ED /* CoreData.xcdatamodel */;
+ currentVersion = DBF156DD27006F5D00EC00B7 /* CoreData 2.xcdatamodel */;
path = CoreData.xcdatamodeld;
sourceTree = "";
versionGroupType = wrapper.xcdatamodel;
diff --git a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist
index 9d41c6857..5c99e944b 100644
--- a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,87 +7,92 @@
AppShared.xcscheme_^#shared#^_
orderHint
- 60
+ 44
CoreDataStack.xcscheme_^#shared#^_
orderHint
- 62
+ 45
Mastodon - ASDK.xcscheme_^#shared#^_
orderHint
- 11
+ 4
Mastodon - RTL.xcscheme_^#shared#^_
orderHint
- 12
+ 17
Mastodon - Release.xcscheme_^#shared#^_
orderHint
- 10
+ 3
Mastodon - ar.xcscheme_^#shared#^_
orderHint
- 7
+ 11
Mastodon - ca.xcscheme_^#shared#^_
orderHint
- 32
+ 23
Mastodon - de.xcscheme_^#shared#^_
orderHint
- 8
+ 13
- Mastodon - en.xcscheme_^#shared#^_
+ Mastodon - double length.xcscheme_^#shared#^_
orderHint
1
- Mastodon - es-419.xcscheme_^#shared#^_
-
- orderHint
- 5
-
- Mastodon - es.xcscheme_^#shared#^_
-
- orderHint
- 4
-
- Mastodon - fr.xcscheme_^#shared#^_
-
- orderHint
- 6
-
- Mastodon - jp.xcscheme_^#shared#^_
-
- orderHint
- 27
-
- Mastodon - nl.xcscheme_^#shared#^_
-
- orderHint
- 9
-
- Mastodon - ru.xcscheme_^#shared#^_
+ Mastodon - en.xcscheme_^#shared#^_
orderHint
2
+ Mastodon - es-419.xcscheme_^#shared#^_
+
+ orderHint
+ 9
+
+ Mastodon - es.xcscheme_^#shared#^_
+
+ orderHint
+ 8
+
+ Mastodon - fr.xcscheme_^#shared#^_
+
+ orderHint
+ 10
+
+ Mastodon - jp.xcscheme_^#shared#^_
+
+ orderHint
+ 19
+
+ Mastodon - nl.xcscheme_^#shared#^_
+
+ orderHint
+ 15
+
+ Mastodon - ru.xcscheme_^#shared#^_
+
+ orderHint
+ 5
+
Mastodon - th.xcscheme_^#shared#^_
orderHint
- 3
+ 6
Mastodon - zh_Hans.xcscheme_^#shared#^_
orderHint
- 30
+ 21
Mastodon.xcscheme_^#shared#^_
@@ -97,7 +102,7 @@
MastodonIntent.xcscheme_^#shared#^_
orderHint
- 56
+ 43
MastodonIntents.xcscheme_^#shared#^_
@@ -112,12 +117,12 @@
NotificationService.xcscheme_^#shared#^_
orderHint
- 13
+ 7
ShareActionExtension.xcscheme_^#shared#^_
orderHint
- 58
+ 42
SuppressBuildableAutocreation
diff --git a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 0dc724ded..11dde7269 100644
--- a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -6,8 +6,8 @@
"repositoryURL": "https://github.com/Alamofire/Alamofire.git",
"state": {
"branch": null,
- "revision": "f96b619bcb2383b43d898402283924b80e2c4bae",
- "version": "5.4.3"
+ "revision": "d120af1e8638c7da36c8481fd61a66c0c08dc4fc",
+ "version": "5.4.4"
}
},
{
@@ -69,8 +69,8 @@
"repositoryURL": "https://github.com/MainasuK/FPSIndicator.git",
"state": {
"branch": null,
- "revision": "b2a002d689c400485f2ba41f9e71e15f7b99764a",
- "version": "1.0.1"
+ "revision": "e4a5067ccd5293b024c767f09e51056afd4a4796",
+ "version": "1.1.0"
}
},
{
@@ -96,8 +96,8 @@
"repositoryURL": "https://github.com/TwidereProject/MetaTextKit.git",
"state": {
"branch": null,
- "revision": "a5f412b72fc08cd1348e2388fc7ec326365e1823",
- "version": "2.1.1"
+ "revision": "7af4182f64329440a4656f2cba307cb5848e496a",
+ "version": "2.1.2"
}
},
{
@@ -105,8 +105,8 @@
"repositoryURL": "https://github.com/kean/Nuke.git",
"state": {
"branch": null,
- "revision": "3bd3a1765bdf62d561d4c2e10e1c4fc7a010f44e",
- "version": "10.3.2"
+ "revision": "0db18dd34998cca18e9a28bcee136f84518007a0",
+ "version": "10.4.1"
}
},
{
@@ -127,13 +127,22 @@
"version": "3.6.2"
}
},
+ {
+ "package": "PanModal",
+ "repositoryURL": "https://github.com/slackhq/PanModal.git",
+ "state": {
+ "branch": null,
+ "revision": "b012aecb6b67a8e46369227f893c12544846613f",
+ "version": "1.2.7"
+ }
+ },
{
"package": "SDWebImage",
"repositoryURL": "https://github.com/SDWebImage/SDWebImage.git",
"state": {
"branch": null,
- "revision": "76dd4b49110b8624317fc128e7fa0d8a252018bc",
- "version": "5.11.1"
+ "revision": "a72df4849408da7e5d3c1b586797b7c601c41d1b",
+ "version": "5.12.1"
}
},
{
@@ -141,8 +150,8 @@
"repositoryURL": "https://github.com/apple/swift-collections.git",
"state": {
"branch": null,
- "revision": "0959ba76a1d4a98fd11163aa83fd49c25b93bfae",
- "version": "0.0.5"
+ "revision": "9d8719c8bebdc79740b6969c912ac706eb721d7a",
+ "version": "0.0.7"
}
},
{
@@ -150,8 +159,8 @@
"repositoryURL": "https://github.com/apple/swift-nio.git",
"state": {
"branch": null,
- "revision": "8da5c5a4e6c5084c296b9f39dc54f00be146e0fa",
- "version": "1.14.2"
+ "revision": "546610d52b19be3e19935e0880bb06b9c03f5cef",
+ "version": "1.14.4"
}
},
{
@@ -207,15 +216,6 @@
"revision": "dad97167bf1be16aeecd109130900995dd01c515",
"version": "2.6.0"
}
- },
- {
- "package": "UITextView+Placeholder",
- "repositoryURL": "https://github.com/MainasuK/UITextView-Placeholder",
- "state": {
- "branch": null,
- "revision": "20f513ded04a040cdf5467f0891849b1763ede3b",
- "version": "1.4.1"
- }
}
]
},
diff --git a/Mastodon/Coordinator/SceneCoordinator.swift b/Mastodon/Coordinator/SceneCoordinator.swift
index 04804dde3..9fbb2b774 100644
--- a/Mastodon/Coordinator/SceneCoordinator.swift
+++ b/Mastodon/Coordinator/SceneCoordinator.swift
@@ -5,24 +5,132 @@
// Created by Cirno MainasuK on 2021-1-27.
import UIKit
+import Combine
import SafariServices
import CoreDataStack
+import MastodonSDK
+import PanModal
final public class SceneCoordinator {
+ private var disposeBag = Set()
+
private weak var scene: UIScene!
private weak var sceneDelegate: SceneDelegate!
private weak var appContext: AppContext!
- private(set) weak var tabBarController: MainTabBarController!
let id = UUID().uuidString
+ private(set) weak var tabBarController: MainTabBarController!
+ private(set) weak var splitViewController: RootSplitViewController?
+ private(set) var wizardViewController: WizardViewController?
+
+ private(set) var secondaryStackHashValues = Set()
+
init(scene: UIScene, sceneDelegate: SceneDelegate, appContext: AppContext) {
self.scene = scene
self.sceneDelegate = sceneDelegate
self.appContext = appContext
scene.session.sceneCoordinator = self
+
+ appContext.notificationService.requestRevealNotificationPublisher
+ .receive(on: DispatchQueue.main)
+ .compactMap { [weak self] pushNotification -> AnyPublisher in
+ guard let self = self else { return Just(nil).eraseToAnyPublisher() }
+ // skip if no available account
+ guard let currentActiveAuthenticationBox = appContext.authenticationService.activeMastodonAuthenticationBox.value else {
+ return Just(nil).eraseToAnyPublisher()
+ }
+
+ let accessToken = pushNotification._accessToken // use raw accessToken value without normalize
+ if currentActiveAuthenticationBox.userAuthorization.accessToken == accessToken {
+ // do nothing if notification for current account
+ return Just(pushNotification).eraseToAnyPublisher()
+ } else {
+ // switch to notification's account
+ let request = MastodonAuthentication.sortedFetchRequest
+ request.predicate = MastodonAuthentication.predicate(userAccessToken: accessToken)
+ request.returnsObjectsAsFaults = false
+ request.fetchLimit = 1
+ do {
+ guard let authentication = try appContext.managedObjectContext.fetch(request).first else {
+ return Just(nil).eraseToAnyPublisher()
+ }
+ let domain = authentication.domain
+ let userID = authentication.userID
+ return appContext.authenticationService.activeMastodonUser(domain: domain, userID: userID)
+ .receive(on: DispatchQueue.main)
+ .map { [weak self] result -> MastodonPushNotification? in
+ guard let self = self else { return nil }
+ switch result {
+ case .success:
+ // reset view hierarchy
+ self.setup()
+ return pushNotification
+ case .failure:
+ return nil
+ }
+ }
+ .delay(for: 1, scheduler: DispatchQueue.main) // set delay to slow transition (not must)
+ .eraseToAnyPublisher()
+ } catch {
+ assertionFailure(error.localizedDescription)
+ return Just(nil).eraseToAnyPublisher()
+ }
+ }
+ }
+ .switchToLatest()
+ .receive(on: DispatchQueue.main)
+ .sink { [weak self] pushNotification in
+ guard let self = self else { return }
+ guard let pushNotification = pushNotification else { return }
+
+ // redirect to notification tab
+ self.switchToTabBar(tab: .notification)
+
+
+ // Delay in next run loop
+ DispatchQueue.main.async { [weak self] in
+ guard let self = self else { return }
+
+ // Note:
+ // show (push) on phone and pad
+ let from: UIViewController? = {
+ if let splitViewController = self.splitViewController {
+ if splitViewController.compactMainTabBarViewController.topMost?.view.window != nil {
+ // compact
+ return splitViewController.compactMainTabBarViewController.topMost
+ } else {
+ // expand
+ return splitViewController.contentSplitViewController.mainTabBarController.topMost
+ }
+ } else {
+ return self.tabBarController.topMost
+ }
+ }()
+
+ // show notification related content
+ guard let type = Mastodon.Entity.Notification.NotificationType(rawValue: pushNotification.notificationType) else { return }
+ let notificationID = String(pushNotification.notificationID)
+
+ switch type {
+ case .follow:
+ let profileViewModel = RemoteProfileViewModel(context: appContext, notificationID: notificationID)
+ self.present(scene: .profile(viewModel: profileViewModel), from: from, transition: .show)
+ case .followRequest:
+ // do nothing
+ break
+ case .mention, .reblog, .favourite, .poll, .status:
+ let threadViewModel = RemoteThreadViewModel(context: appContext, notificationID: notificationID)
+ self.present(scene: .thread(viewModel: threadViewModel), from: from, transition: .show)
+ case ._other:
+ assertionFailure()
+ break
+ }
+ } // end DispatchQueue.main.async
+ }
+ .store(in: &disposeBag)
}
}
@@ -31,6 +139,8 @@ extension SceneCoordinator {
case show // push
case showDetail // replace
case modal(animated: Bool, completion: (() -> Void)? = nil)
+ case popover(sourceView: UIView)
+ case panModal
case custom(transitioningDelegate: UIViewControllerTransitioningDelegate)
case customPush
case safariPresent(animated: Bool, completion: (() -> Void)? = nil)
@@ -66,9 +176,12 @@ extension SceneCoordinator {
case hashtagTimeline(viewModel: HashtagTimelineViewModel)
// profile
+ case accountList
case profile(viewModel: ProfileViewModel)
case favorite(viewModel: FavoriteViewModel)
-
+ case follower(viewModel: FollowerListViewModel)
+ case following(viewModel: FollowingListViewModel)
+
// setting
case settings(viewModel: SettingsViewModel)
@@ -109,9 +222,34 @@ extension SceneCoordinator {
extension SceneCoordinator {
func setup() {
- let viewController = MainTabBarController(context: appContext, coordinator: self)
- sceneDelegate.window?.rootViewController = viewController
- tabBarController = viewController
+ let rootViewController: UIViewController
+ switch UIDevice.current.userInterfaceIdiom {
+ case .phone:
+ let viewController = MainTabBarController(context: appContext, coordinator: self)
+ self.splitViewController = nil
+ self.tabBarController = viewController
+ rootViewController = viewController
+ default:
+ let splitViewController = RootSplitViewController(context: appContext, coordinator: self)
+ self.splitViewController = splitViewController
+ self.tabBarController = splitViewController.contentSplitViewController.mainTabBarController
+ rootViewController = splitViewController
+ }
+
+ let wizardViewController = WizardViewController()
+ if !wizardViewController.items.isEmpty,
+ let delegate = rootViewController as? WizardViewControllerDelegate
+ {
+ // do not add as child view controller.
+ // otherwise, the tab bar controller will add as a new tab
+ wizardViewController.delegate = delegate
+ wizardViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
+ wizardViewController.view.frame = rootViewController.view.bounds
+ rootViewController.view.addSubview(wizardViewController.view)
+ self.wizardViewController = wizardViewController
+ }
+
+ sceneDelegate.window?.rootViewController = rootViewController
}
func setupOnboardingIfNeeds(animated: Bool) {
@@ -165,8 +303,8 @@ extension SceneCoordinator {
switch transition {
case .show:
presentingViewController.show(viewController, sender: sender)
-
case .showDetail:
+ secondaryStackHashValues.insert(viewController.hashValue)
let navigationController = AdaptiveStatusBarStyleNavigationController(rootViewController: viewController)
presentingViewController.showDetailViewController(navigationController, sender: sender)
@@ -183,11 +321,27 @@ extension SceneCoordinator {
modalNavigationController.presentationController?.delegate = adaptivePresentationControllerDelegate
}
presentingViewController.present(modalNavigationController, animated: animated, completion: completion)
+
+ case .panModal:
+ guard let panModalPresentable = viewController as? PanModalPresentable & UIViewController else {
+ assertionFailure()
+ return nil
+ }
+ // https://github.com/slackhq/PanModal/issues/74#issuecomment-572426441
+ panModalPresentable.modalPresentationStyle = .custom
+ panModalPresentable.modalPresentationCapturesStatusBarAppearance = true
+ panModalPresentable.transitioningDelegate = PanModalPresentationDelegate.default
+ presentingViewController.present(panModalPresentable, animated: true, completion: nil)
+ //presentingViewController.presentPanModal(panModalPresentable)
+ case .popover(let sourceView):
+ viewController.modalPresentationStyle = .popover
+ viewController.popoverPresentationController?.sourceView = sourceView
+ (splitViewController ?? presentingViewController)?.present(viewController, animated: true, completion: nil)
case .custom(let transitioningDelegate):
viewController.modalPresentationStyle = .custom
viewController.transitioningDelegate = transitioningDelegate
- sender?.present(viewController, animated: true, completion: nil)
+ (splitViewController ?? presentingViewController)?.present(viewController, animated: true, completion: nil)
case .customPush:
// set delegate in view controller
@@ -215,7 +369,13 @@ extension SceneCoordinator {
}
func switchToTabBar(tab: MainTabBarController.Tab) {
+ splitViewController?.contentSplitViewController.currentSupplementaryTab = tab
+
+ splitViewController?.compactMainTabBarViewController.selectedIndex = tab.rawValue
+ splitViewController?.compactMainTabBarViewController.currentTab.value = tab
+
tabBarController.selectedIndex = tab.rawValue
+ tabBarController.currentTab.value = tab
}
}
@@ -273,6 +433,9 @@ private extension SceneCoordinator {
let _viewController = HashtagTimelineViewController()
_viewController.viewModel = viewModel
viewController = _viewController
+ case .accountList:
+ let _viewController = AccountListViewController()
+ viewController = _viewController
case .profile(let viewModel):
let _viewController = ProfileViewController()
_viewController.viewModel = viewModel
@@ -281,6 +444,14 @@ private extension SceneCoordinator {
let _viewController = FavoriteViewController()
_viewController.viewModel = viewModel
viewController = _viewController
+ case .follower(let viewModel):
+ let _viewController = FollowerListViewController()
+ _viewController.viewModel = viewModel
+ viewController = _viewController
+ case .following(let viewModel):
+ let _viewController = FollowingListViewController()
+ _viewController.viewModel = viewModel
+ viewController = _viewController
case .suggestionAccount(let viewModel):
let _viewController = SuggestionAccountViewController()
_viewController.viewModel = viewModel
diff --git a/Mastodon/Diffiable/DataSource/TableNodeDiffableDataSource.swift b/Mastodon/Diffiable/DataSource/TableNodeDiffableDataSource.swift
index 155c8d8af..54ab22a4c 100644
--- a/Mastodon/Diffiable/DataSource/TableNodeDiffableDataSource.swift
+++ b/Mastodon/Diffiable/DataSource/TableNodeDiffableDataSource.swift
@@ -32,7 +32,7 @@ open class TableNodeDiffableDataSource UITableViewDiffableDataSource {
UITableViewDiffableDataSource(tableView: tableView) {
[weak delegate, weak dependency]
@@ -32,137 +33,47 @@ extension NotificationSection {
switch notificationItem {
case .notification(let objectID, let attribute):
guard let notification = try? managedObjectContext.existingObject(with: objectID) as? MastodonNotification,
- !notification.isDeleted else {
- return UITableViewCell()
- }
+ !notification.isDeleted
+ else { return UITableViewCell() }
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: NotificationStatusTableViewCell.self), for: indexPath) as! NotificationStatusTableViewCell
- cell.delegate = delegate
-
- // configure author
- cell.configure(
- with: AvatarConfigurableViewConfiguration(
- avatarImageURL: notification.account.avatarImageURL()
- )
+ configure(
+ tableView: tableView,
+ cell: cell,
+ notification: notification,
+ dependency: dependency,
+ attribute: attribute
)
+ cell.delegate = delegate
+ cell.isAccessibilityElement = true
+ NotificationSection.configureStatusAccessibilityLabel(cell: cell)
+ return cell
- func createActionImage() -> UIImage? {
- return UIImage(
- systemName: notification.notificationType.actionImageName,
- withConfiguration: UIImage.SymbolConfiguration(
- pointSize: 12, weight: .semibold
- )
- )?
- .withTintColor(.systemBackground)
- .af.imageAspectScaled(toFit: CGSize(width: 14, height: 14))
- }
+ case .notificationStatus(objectID: let objectID, attribute: let attribute):
+ guard let notification = try? managedObjectContext.existingObject(with: objectID) as? MastodonNotification,
+ !notification.isDeleted,
+ let status = notification.status,
+ let requestUserID = dependency.context.authenticationService.activeMastodonAuthenticationBox.value?.userID
+ else { return UITableViewCell() }
+ let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: StatusTableViewCell.self), for: indexPath) as! StatusTableViewCell
- cell.avatarButton.badgeImageView.backgroundColor = notification.notificationType.color
- cell.avatarButton.badgeImageView.image = createActionImage()
- cell.traitCollectionDidChange
- .receive(on: DispatchQueue.main)
- .sink { [weak cell] in
- guard let cell = cell else { return }
- cell.avatarButton.badgeImageView.image = createActionImage()
- }
- .store(in: &cell.disposeBag)
-
- // configure author name, notification description, timestamp
- let nameText = notification.account.displayNameWithFallback
- let titleLabelText: String = {
- switch notification.notificationType {
- case .favourite: return L10n.Scene.Notification.userFavoritedYourPost(nameText)
- case .follow: return L10n.Scene.Notification.userFollowedYou(nameText)
- case .followRequest: return L10n.Scene.Notification.userRequestedToFollowYou(nameText)
- case .mention: return L10n.Scene.Notification.userMentionedYou(nameText)
- case .poll: return L10n.Scene.Notification.userYourPollHasEnded(nameText)
- case .reblog: return L10n.Scene.Notification.userRebloggedYourPost(nameText)
- default: return ""
- }
- }()
-
- do {
- let nameContent = MastodonContent(content: nameText, emojis: notification.account.emojiMeta)
- let nameMetaContent = try MastodonMetaContent.convert(document: nameContent)
-
- let mastodonContent = MastodonContent(content: titleLabelText, emojis: notification.account.emojiMeta)
- let metaContent = try MastodonMetaContent.convert(document: mastodonContent)
-
- cell.titleLabel.configure(content: metaContent)
-
- if let nameRange = metaContent.string.range(of: nameMetaContent.string) {
- let nsRange = NSRange(nameRange, in: metaContent.string)
- cell.titleLabel.textStorage.addAttributes([
- .font: UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 15, weight: .semibold), maximumPointSize: 20),
- .foregroundColor: Asset.Colors.brandBlue.color,
- ], range: nsRange)
- }
-
- } catch {
- let metaContent = PlaintextMetaContent(string: titleLabelText)
- cell.titleLabel.configure(content: metaContent)
- }
-
- let createAt = notification.createAt
- cell.timestampLabel.text = createAt.localizedSlowedTimeAgoSinceNow
- AppContext.shared.timestampUpdatePublisher
- .receive(on: DispatchQueue.main)
- .sink { [weak cell] _ in
- guard let cell = cell else { return }
- cell.timestampLabel.text = createAt.localizedSlowedTimeAgoSinceNow
- }
- .store(in: &cell.disposeBag)
-
- // configure follow request (if exist)
- if case .followRequest = notification.notificationType {
- cell.acceptButton.publisher(for: .touchUpInside)
- .sink { [weak cell] _ in
- guard let cell = cell else { return }
- cell.delegate?.notificationTableViewCell(cell, notification: notification, acceptButtonDidPressed: cell.acceptButton)
- }
- .store(in: &cell.disposeBag)
- cell.rejectButton.publisher(for: .touchUpInside)
- .sink { [weak cell] _ in
- guard let cell = cell else { return }
- cell.delegate?.notificationTableViewCell(cell, notification: notification, rejectButtonDidPressed: cell.rejectButton)
- }
- .store(in: &cell.disposeBag)
- cell.buttonStackView.isHidden = false
- } else {
- cell.buttonStackView.isHidden = true
- }
-
- // configure status (if exist)
- if let status = notification.status {
- let frame = CGRect(
- x: 0,
- y: 0,
- width: tableView.readableContentGuide.layoutFrame.width - NotificationStatusTableViewCell.statusPadding.left - NotificationStatusTableViewCell.statusPadding.right,
- height: tableView.readableContentGuide.layoutFrame.height
- )
- StatusSection.configure(
- cell: cell,
- tableView: tableView,
- timelineContext: .notifications,
- dependency: dependency,
- readableLayoutFrame: frame,
- status: status,
- requestUserID: notification.userID,
- statusItemAttribute: attribute
- )
- cell.statusContainerView.isHidden = false
- cell.containerStackView.alignment = .top
- cell.containerStackViewBottomLayoutConstraint.constant = 0
- } else {
- if case .followRequest = notification.notificationType {
- cell.containerStackView.alignment = .top
- } else {
- cell.containerStackView.alignment = .center
- }
- cell.statusContainerView.isHidden = true
- cell.containerStackViewBottomLayoutConstraint.constant = 5 // 5pt margin when no status view
- }
-
+ // configure cell
+ StatusSection.configureStatusTableViewCell(
+ cell: cell,
+ tableView: tableView,
+ timelineContext: .notifications,
+ dependency: dependency,
+ readableLayoutFrame: tableView.readableContentGuide.layoutFrame,
+ status: status,
+ requestUserID: requestUserID,
+ statusItemAttribute: attribute
+ )
+ cell.statusView.headerContainerView.isHidden = true // set header hide
+ cell.statusView.actionToolbarContainer.isHidden = true // set toolbar hide
+ cell.statusView.actionToolbarPlaceholderPaddingView.isHidden = false
+ cell.delegate = statusTableViewCellDelegate
+ cell.isAccessibilityElement = true
+ StatusSection.configureStatusAccessibilityLabel(cell: cell)
return cell
case .bottomLoader:
@@ -174,3 +85,162 @@ extension NotificationSection {
}
}
+extension NotificationSection {
+ static func configure(
+ tableView: UITableView,
+ cell: NotificationStatusTableViewCell,
+ notification: MastodonNotification,
+ dependency: NeedsDependency,
+ attribute: Item.StatusAttribute
+ ) {
+ // configure author
+ cell.configure(
+ with: AvatarConfigurableViewConfiguration(
+ avatarImageURL: notification.account.avatarImageURL()
+ )
+ )
+
+ func createActionImage() -> UIImage? {
+ return UIImage(
+ systemName: notification.notificationType.actionImageName,
+ withConfiguration: UIImage.SymbolConfiguration(
+ pointSize: 12, weight: .semibold
+ )
+ )?
+ .withTintColor(.systemBackground)
+ .af.imageAspectScaled(toFit: CGSize(width: 14, height: 14))
+ }
+
+ cell.avatarButton.badgeImageView.backgroundColor = notification.notificationType.color
+ cell.avatarButton.badgeImageView.image = createActionImage()
+ cell.traitCollectionDidChange
+ .receive(on: DispatchQueue.main)
+ .sink { [weak cell] in
+ guard let cell = cell else { return }
+ cell.avatarButton.badgeImageView.image = createActionImage()
+ }
+ .store(in: &cell.disposeBag)
+
+ // configure author name, notification description, timestamp
+ let nameText = notification.account.displayNameWithFallback
+ let titleLabelText: String = {
+ switch notification.notificationType {
+ case .favourite: return L10n.Scene.Notification.userFavoritedYourPost(nameText)
+ case .follow: return L10n.Scene.Notification.userFollowedYou(nameText)
+ case .followRequest: return L10n.Scene.Notification.userRequestedToFollowYou(nameText)
+ case .mention: return L10n.Scene.Notification.userMentionedYou(nameText)
+ case .poll: return L10n.Scene.Notification.userYourPollHasEnded(nameText)
+ case .reblog: return L10n.Scene.Notification.userRebloggedYourPost(nameText)
+ default: return ""
+ }
+ }()
+
+ do {
+ let nameContent = MastodonContent(content: nameText, emojis: notification.account.emojiMeta)
+ let nameMetaContent = try MastodonMetaContent.convert(document: nameContent)
+
+ let mastodonContent = MastodonContent(content: titleLabelText, emojis: notification.account.emojiMeta)
+ let metaContent = try MastodonMetaContent.convert(document: mastodonContent)
+
+ cell.titleLabel.configure(content: metaContent)
+
+ if let nameRange = metaContent.string.range(of: nameMetaContent.string) {
+ let nsRange = NSRange(nameRange, in: metaContent.string)
+ cell.titleLabel.textStorage.addAttributes([
+ .font: UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 15, weight: .semibold), maximumPointSize: 20),
+ .foregroundColor: Asset.Colors.brandBlue.color,
+ ], range: nsRange)
+ }
+
+ } catch {
+ let metaContent = PlaintextMetaContent(string: titleLabelText)
+ cell.titleLabel.configure(content: metaContent)
+ }
+
+ let createAt = notification.createAt
+ cell.timestampLabel.text = createAt.localizedSlowedTimeAgoSinceNow
+ AppContext.shared.timestampUpdatePublisher
+ .receive(on: DispatchQueue.main)
+ .sink { [weak cell] _ in
+ guard let cell = cell else { return }
+ cell.timestampLabel.text = createAt.localizedSlowedTimeAgoSinceNow
+ }
+ .store(in: &cell.disposeBag)
+
+ // configure follow request (if exist)
+ if case .followRequest = notification.notificationType {
+ cell.acceptButton.publisher(for: .touchUpInside)
+ .sink { [weak cell] _ in
+ guard let cell = cell else { return }
+ cell.delegate?.notificationTableViewCell(cell, notification: notification, acceptButtonDidPressed: cell.acceptButton)
+ }
+ .store(in: &cell.disposeBag)
+ cell.rejectButton.publisher(for: .touchUpInside)
+ .sink { [weak cell] _ in
+ guard let cell = cell else { return }
+ cell.delegate?.notificationTableViewCell(cell, notification: notification, rejectButtonDidPressed: cell.rejectButton)
+ }
+ .store(in: &cell.disposeBag)
+ cell.buttonStackView.isHidden = false
+ } else {
+ cell.buttonStackView.isHidden = true
+ }
+
+ // configure status (if exist)
+ if let status = notification.status {
+ let frame = CGRect(
+ x: 0,
+ y: 0,
+ width: tableView.readableContentGuide.layoutFrame.width - NotificationStatusTableViewCell.statusPadding.left - NotificationStatusTableViewCell.statusPadding.right,
+ height: tableView.readableContentGuide.layoutFrame.height
+ )
+ StatusSection.configure(
+ cell: cell,
+ tableView: tableView,
+ timelineContext: .notifications,
+ dependency: dependency,
+ readableLayoutFrame: frame,
+ status: status,
+ requestUserID: notification.userID,
+ statusItemAttribute: attribute
+ )
+ cell.statusContainerView.isHidden = false
+ cell.containerStackView.alignment = .top
+ cell.containerStackViewBottomLayoutConstraint.constant = 0
+ } else {
+ if case .followRequest = notification.notificationType {
+ cell.containerStackView.alignment = .top
+ } else {
+ cell.containerStackView.alignment = .center
+ }
+ cell.statusContainerView.isHidden = true
+ cell.containerStackViewBottomLayoutConstraint.constant = 5 // 5pt margin when no status view
+ }
+ }
+
+ static func configureStatusAccessibilityLabel(cell: NotificationStatusTableViewCell) {
+ // FIXME:
+ cell.accessibilityLabel = {
+ var accessibilityViews: [UIView?] = []
+ accessibilityViews.append(contentsOf: [
+ cell.titleLabel,
+ cell.timestampLabel,
+ cell.statusView
+ ])
+ if !cell.statusContainerView.isHidden {
+ if !cell.statusView.headerContainerView.isHidden {
+ accessibilityViews.append(cell.statusView.headerInfoLabel)
+ }
+ accessibilityViews.append(contentsOf: [
+ cell.statusView.nameMetaLabel,
+ cell.statusView.dateLabel,
+ cell.statusView.contentMetaText.textView,
+ ])
+ }
+ return accessibilityViews
+ .compactMap { $0?.accessibilityLabel }
+ .joined(separator: " ")
+ }()
+ }
+}
+
diff --git a/Mastodon/Diffiable/Section/Status/PollSection.swift b/Mastodon/Diffiable/Section/Status/PollSection.swift
index add2a79b2..682a2abc0 100644
--- a/Mastodon/Diffiable/Section/Status/PollSection.swift
+++ b/Mastodon/Diffiable/Section/Status/PollSection.swift
@@ -37,6 +37,15 @@ extension PollSection {
managedObjectContext.performAndWait {
let option = managedObjectContext.object(with: objectID) as! PollOption
PollSection.configure(cell: cell, pollOption: option, pollItemAttribute: attribute)
+
+ cell.isAccessibilityElement = true
+ cell.accessibilityLabel = {
+ var labels: [String] = [option.title]
+ if let percentage = cell.pollOptionView.optionPercentageLabel.text {
+ labels.append(percentage)
+ }
+ return labels.joined(separator: ",")
+ }()
}
return cell
}
diff --git a/Mastodon/Diffiable/Section/Status/StatusSection.swift b/Mastodon/Diffiable/Section/Status/StatusSection.swift
index f16311b6a..61217c790 100644
--- a/Mastodon/Diffiable/Section/Status/StatusSection.swift
+++ b/Mastodon/Diffiable/Section/Status/StatusSection.swift
@@ -67,7 +67,6 @@ extension StatusSection {
timelineContext: TimelineContext,
dependency: NeedsDependency,
managedObjectContext: NSManagedObjectContext,
- timestampUpdatePublisher: AnyPublisher,
statusTableViewCellDelegate: StatusTableViewCellDelegate,
timelineMiddleLoaderTableViewCellDelegate: TimelineMiddleLoaderTableViewCellDelegate?,
threadReplyLoaderTableViewCellDelegate: ThreadReplyLoaderTableViewCellDelegate?
@@ -159,6 +158,11 @@ extension StatusSection {
accessibilityElements.append(cell.statusView.avatarView)
accessibilityElements.append(cell.statusView.nameMetaLabel)
accessibilityElements.append(cell.statusView.dateLabel)
+ // poll
+ accessibilityElements.append(cell.statusView.pollTableView)
+ accessibilityElements.append(cell.statusView.pollVoteCountLabel)
+ accessibilityElements.append(cell.statusView.pollCountdownLabel)
+ accessibilityElements.append(cell.statusView.pollVoteButton)
// TODO: a11y
accessibilityElements.append(cell.statusView.contentMetaText.textView)
accessibilityElements.append(contentsOf: cell.statusView.statusMosaicImageViewContainer.imageViews)
@@ -363,7 +367,6 @@ extension StatusSection {
}
}()
-
if status.author.id == requestUserID || status.reblog?.author.id == requestUserID {
// do not filter myself
} else {
@@ -391,7 +394,7 @@ extension StatusSection {
// set timestamp
let createdAt = (status.reblog ?? status).createdAt
cell.statusView.dateLabel.text = createdAt.localizedSlowedTimeAgoSinceNow
- cell.statusView.dateLabel.accessibilityValue = createdAt.timeAgoSinceNow
+ cell.statusView.dateLabel.accessibilityLabel = createdAt.timeAgoSinceNow
AppContext.shared.timestampUpdatePublisher
.receive(on: RunLoop.main) // will be paused when scrolling (on purpose)
.sink { [weak cell] _ in
@@ -473,9 +476,10 @@ extension StatusSection {
.receive(on: RunLoop.main)
.sink { _ in
// do nothing
- } receiveValue: { [weak cell, weak tableView] change in
+ } receiveValue: { [weak cell, weak tableView, weak dependency] change in
guard let cell = cell else { return }
guard let tableView = tableView else { return }
+ guard let dependency = dependency else { return }
guard case .update(let object) = change.changeType,
let status = object as? Status, !status.isDeleted else {
return
@@ -640,7 +644,7 @@ extension StatusSection {
) {
if status.reblog != nil {
cell.statusView.headerContainerView.isHidden = false
- cell.statusView.headerIconLabel.attributedText = StatusView.iconAttributedString(image: StatusView.reblogIconImage)
+ cell.statusView.headerIconLabel.configure(attributedString: StatusView.iconAttributedString(image: StatusView.reblogIconImage))
let headerText: String = {
let author = status.author
let name = author.displayName.isEmpty ? author.username : author.displayName
@@ -658,7 +662,7 @@ extension StatusSection {
cell.statusView.headerInfoLabel.isAccessibilityElement = true
} else if status.inReplyToID != nil {
cell.statusView.headerContainerView.isHidden = false
- cell.statusView.headerIconLabel.attributedText = StatusView.iconAttributedString(image: StatusView.replyIconImage)
+ cell.statusView.headerIconLabel.configure(attributedString: StatusView.iconAttributedString(image: StatusView.replyIconImage))
let headerText: String = {
guard let replyTo = status.replyTo else {
return L10n.Common.Controls.Status.userRepliedTo("-")
@@ -721,6 +725,15 @@ extension StatusSection {
statusItemAttribute: Item.StatusAttribute
) {
// set content
+ let paragraphStyle = cell.statusView.contentMetaText.paragraphStyle
+ if let language = (status.reblog ?? status).language {
+ let direction = Locale.characterDirection(forLanguage: language)
+ paragraphStyle.alignment = direction == .rightToLeft ? .right : .left
+ } else {
+ paragraphStyle.alignment = .natural
+ }
+ cell.statusView.contentMetaText.paragraphStyle = paragraphStyle
+
if let content = content {
cell.statusView.contentMetaText.configure(content: content)
cell.statusView.contentMetaText.textView.accessibilityLabel = content.trimmed
@@ -970,6 +983,7 @@ extension StatusSection {
cell.statusView.pollCountdownLabel.text = "-"
}
+ cell.statusView.isUserInteractionEnabled = !poll.expired // make voice over touch passthroughable
cell.statusView.pollTableView.allowsSelection = !poll.expired
let votedOptions = poll.options.filter { option in
@@ -1072,7 +1086,7 @@ extension StatusSection {
cell.statusView.actionToolbarContainer.reblogButton.isEnabled = false
}
}
-
+
// set like
let isLike = status.favouritedBy.flatMap { $0.contains(where: { $0.id == requestUserID }) } ?? false
let favoriteCountTitle: String = {
@@ -1107,7 +1121,7 @@ extension StatusSection {
StatusSection.setupStatusMoreButtonMenu(cell: cell, dependency: dependency, status: status)
})
.store(in: &cell.disposeBag)
- self.setupStatusMoreButtonMenu(cell: cell, dependency: dependency, status: status)
+ setupStatusMoreButtonMenu(cell: cell, dependency: dependency, status: status)
}
static func configureStatusAccessibilityLabel(cell: StatusTableViewCell) {
diff --git a/Mastodon/Diffiable/Section/UserSection.swift b/Mastodon/Diffiable/Section/UserSection.swift
new file mode 100644
index 000000000..9c7e2f212
--- /dev/null
+++ b/Mastodon/Diffiable/Section/UserSection.swift
@@ -0,0 +1,64 @@
+//
+// UserSection.swift
+// Mastodon
+//
+// Created by Cirno MainasuK on 2021-11-1.
+//
+
+import os.log
+import UIKit
+import CoreData
+import CoreDataStack
+import MetaTextKit
+import MastodonMeta
+
+enum UserSection: Hashable {
+ case main
+}
+
+extension UserSection {
+
+ static let logger = Logger(subsystem: "StatusSection", category: "logic")
+
+ static func tableViewDiffableDataSource(
+ for tableView: UITableView,
+ dependency: NeedsDependency,
+ managedObjectContext: NSManagedObjectContext
+ ) -> UITableViewDiffableDataSource {
+ UITableViewDiffableDataSource(tableView: tableView) { [
+ weak dependency
+ ] tableView, indexPath, item -> UITableViewCell? in
+ guard let dependency = dependency else { return UITableViewCell() }
+ switch item {
+ case .follower(let objectID),
+ .following(let objectID):
+ let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: UserTableViewCell.self), for: indexPath) as! UserTableViewCell
+ managedObjectContext.performAndWait {
+ let user = managedObjectContext.object(with: objectID) as! MastodonUser
+ configure(cell: cell, user: user)
+ }
+ return cell
+ case .bottomLoader:
+ let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell
+ cell.startAnimating()
+ return cell
+ case .bottomHeader(let text):
+ let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineFooterTableViewCell.self), for: indexPath) as! TimelineFooterTableViewCell
+ cell.messageLabel.text = text
+ return cell
+ } // end switch
+ } // end UITableViewDiffableDataSource
+ } // end static func tableViewDiffableDataSource { … }
+
+}
+
+extension UserSection {
+
+ static func configure(
+ cell: UserTableViewCell,
+ user: MastodonUser
+ ) {
+ cell.configure(user: user)
+ }
+
+}
diff --git a/Mastodon/Extension/CoreDataStack/Instance.swift b/Mastodon/Extension/CoreDataStack/Instance.swift
new file mode 100644
index 000000000..6cacd9db9
--- /dev/null
+++ b/Mastodon/Extension/CoreDataStack/Instance.swift
@@ -0,0 +1,25 @@
+//
+// Instance.swift
+// Mastodon
+//
+// Created by Cirno MainasuK on 2021-10-9.
+//
+
+import UIKit
+import CoreDataStack
+import MastodonSDK
+
+extension Instance {
+ var configuration: Mastodon.Entity.Instance.Configuration? {
+ guard let configurationRaw = configurationRaw else { return nil }
+ guard let configuration = try? JSONDecoder().decode(Mastodon.Entity.Instance.Configuration.self, from: configurationRaw) else {
+ return nil
+ }
+
+ return configuration
+ }
+
+ static func encode(configuration: Mastodon.Entity.Instance.Configuration) -> Data? {
+ return try? JSONEncoder().encode(configuration)
+ }
+}
diff --git a/Mastodon/Extension/CoreDataStack/Setting.swift b/Mastodon/Extension/CoreDataStack/Setting.swift
index b995b80e3..4d1fc0ca5 100644
--- a/Mastodon/Extension/CoreDataStack/Setting.swift
+++ b/Mastodon/Extension/CoreDataStack/Setting.swift
@@ -11,9 +11,9 @@ import MastodonSDK
extension Setting {
- var appearance: SettingsItem.AppearanceMode {
- return SettingsItem.AppearanceMode(rawValue: appearanceRaw) ?? .automatic
- }
+// var appearance: SettingsItem.AppearanceMode {
+// return SettingsItem.AppearanceMode(rawValue: appearanceRaw) ?? .automatic
+// }
var activeSubscription: Subscription? {
return (subscriptions ?? Set())
diff --git a/Mastodon/Extension/MetaLabel.swift b/Mastodon/Extension/MetaLabel.swift
index 9e7920a8e..cf7d27cc0 100644
--- a/Mastodon/Extension/MetaLabel.swift
+++ b/Mastodon/Extension/MetaLabel.swift
@@ -20,6 +20,10 @@ extension MetaLabel {
case titleView
case settingTableFooter
case autoCompletion
+ case accountListName
+ case accountListUsername
+ case sidebarHeadline(isSelected: Bool)
+ case sidebarSubheadline(isSelected: Bool)
}
convenience init(style: Style) {
@@ -30,41 +34,45 @@ extension MetaLabel {
textContainer.lineBreakMode = .byTruncatingTail
textContainer.lineFragmentPadding = 0
+ setup(style: style)
+ }
+
+ func setup(style: Style) {
let font: UIFont
let textColor: UIColor
-
+
switch style {
case .statusHeader:
font = UIFontMetrics(forTextStyle: .footnote).scaledFont(for: .systemFont(ofSize: 13, weight: .medium), maximumPointSize: 17)
textColor = Asset.Colors.Label.secondary.color
-
+
case .statusName:
font = .systemFont(ofSize: 17, weight: .semibold)
textColor = Asset.Colors.Label.primary.color
-
+
case .notificationTitle:
font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 15, weight: .regular), maximumPointSize: 20)
textColor = Asset.Colors.Label.secondary.color
-
+
case .profileFieldName:
font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold), maximumPointSize: 20)
textColor = Asset.Colors.Label.primary.color
-
+
case .profileFieldValue:
font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .regular), maximumPointSize: 20)
textColor = Asset.Colors.Label.primary.color
textAlignment = .right
-
+
case .titleView:
font = .systemFont(ofSize: 17, weight: .semibold)
textColor = Asset.Colors.Label.primary.color
textAlignment = .center
paragraphStyle.alignment = .center
-
+
case .recommendAccountName:
font = .systemFont(ofSize: 18, weight: .semibold)
textColor = .white
-
+
case .settingTableFooter:
font = .preferredFont(forTextStyle: .footnote)
textColor = Asset.Colors.Label.secondary.color
@@ -74,8 +82,20 @@ extension MetaLabel {
case .autoCompletion:
font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold), maximumPointSize: 22)
textColor = Asset.Colors.brandBlue.color
+ case .accountListName:
+ font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .regular), maximumPointSize: 22)
+ textColor = Asset.Colors.Label.primary.color
+ case .accountListUsername:
+ font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 15, weight: .regular), maximumPointSize: 20)
+ textColor = Asset.Colors.Label.secondary.color
+ case .sidebarHeadline(let isSelected):
+ font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 22, weight: .regular), maximumPointSize: 20)
+ textColor = isSelected ? .white : Asset.Colors.Label.primary.color
+ case .sidebarSubheadline(let isSelected):
+ font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 13, weight: .regular), maximumPointSize: 18)
+ textColor = isSelected ? .white : Asset.Colors.Label.secondary.color
}
-
+
self.font = font
self.textColor = textColor
@@ -91,6 +111,24 @@ extension MetaLabel {
}
+extension MetaLabel {
+ func configure(attributedString: NSAttributedString) {
+ let attributedString = NSMutableAttributedString(attributedString: attributedString)
+
+ MetaText.setAttributes(
+ for: attributedString,
+ textAttributes: textAttributes,
+ linkAttributes: linkAttributes,
+ paragraphStyle: paragraphStyle,
+ content: PlaintextMetaContent(string: "")
+ )
+
+ textStorage.setAttributedString(attributedString)
+ self.attributedText = attributedString
+ setNeedsDisplay()
+ }
+}
+
struct PlaintextMetaContent: MetaContent {
let string: String
let entities: [Meta.Entity] = []
diff --git a/Mastodon/Extension/NSDiffableDataSourceSnapshot.swift b/Mastodon/Extension/NSDiffableDataSourceSnapshot.swift
deleted file mode 100644
index c2ff341d9..000000000
--- a/Mastodon/Extension/NSDiffableDataSourceSnapshot.swift
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// NSDiffableDataSourceSnapshot.swift
-// Mastodon
-//
-// Created by Cirno MainasuK on 2021-6-19.
-//
-
-import UIKit
-
-//extension NSDiffableDataSourceSnapshot {
-// func itemIdentifier(for indexPath: IndexPath) -> ItemIdentifierType? {
-// guard 0..,
+ completion: (() -> Void)? = nil
+ ) {
+ if #available(iOS 15.0, *) {
+ self.applySnapshotUsingReloadData(snapshot, completion: completion)
+ } else {
+ self.apply(snapshot, animatingDifferences: false, completion: completion)
+ }
+ }
+
+ func applySnapshot(
+ _ snapshot: NSDiffableDataSourceSnapshot,
+ animated: Bool,
+ completion: (() -> Void)? = nil) {
+
+ if #available(iOS 15.0, *) {
+ self.apply(snapshot, animatingDifferences: animated, completion: completion)
+ } else {
+ if animated {
+ self.apply(snapshot, animatingDifferences: true, completion: completion)
+ } else {
+ UIView.performWithoutAnimation {
+ self.apply(snapshot, animatingDifferences: true, completion: completion)
+ }
+ }
+ }
+ }
+}
diff --git a/Mastodon/Extension/UITableViewDiffableDataSource.swift b/Mastodon/Extension/UITableViewDiffableDataSource.swift
new file mode 100644
index 000000000..5006417a4
--- /dev/null
+++ b/Mastodon/Extension/UITableViewDiffableDataSource.swift
@@ -0,0 +1,40 @@
+//
+// UITableViewDiffableDataSource.swift
+// Mastodon
+//
+// Created by Cirno MainasuK on 2021-10-11.
+//
+
+import UIKit
+
+// ref: https://www.jessesquires.com/blog/2021/07/08/diffable-data-source-behavior-changes-and-reconfiguring-cells-in-ios-15/
+extension UITableViewDiffableDataSource {
+ func reloadData(
+ snapshot: NSDiffableDataSourceSnapshot,
+ completion: (() -> Void)? = nil
+ ) {
+ if #available(iOS 15.0, *) {
+ self.applySnapshotUsingReloadData(snapshot, completion: completion)
+ } else {
+ self.apply(snapshot, animatingDifferences: false, completion: completion)
+ }
+ }
+
+ func applySnapshot(
+ _ snapshot: NSDiffableDataSourceSnapshot,
+ animated: Bool,
+ completion: (() -> Void)? = nil) {
+
+ if #available(iOS 15.0, *) {
+ self.apply(snapshot, animatingDifferences: animated, completion: completion)
+ } else {
+ if animated {
+ self.apply(snapshot, animatingDifferences: true, completion: completion)
+ } else {
+ UIView.performWithoutAnimation {
+ self.apply(snapshot, animatingDifferences: true, completion: completion)
+ }
+ }
+ }
+ }
+}
diff --git a/Mastodon/Generated/Assets.swift b/Mastodon/Generated/Assets.swift
index f3ef1088e..906dd74e2 100644
--- a/Mastodon/Generated/Assets.swift
+++ b/Mastodon/Generated/Assets.swift
@@ -70,6 +70,7 @@ internal enum Asset {
internal static let valid = ColorAsset(name: "Colors/TextField/valid")
}
internal static let alertYellow = ColorAsset(name: "Colors/alert.yellow")
+ internal static let badgeBackground = ColorAsset(name: "Colors/badge.background")
internal static let battleshipGrey = ColorAsset(name: "Colors/battleshipGrey")
internal static let brandBlue = ColorAsset(name: "Colors/brand.blue")
internal static let brandBlueDarken20 = ColorAsset(name: "Colors/brand.blue.darken.20")
@@ -95,6 +96,9 @@ internal enum Asset {
internal static let usernameGray = ColorAsset(name: "Scene/Profile/Banner/username.gray")
}
}
+ internal enum Sidebar {
+ internal static let logo = ImageAsset(name: "Scene/Sidebar/logo")
+ }
internal enum Welcome {
internal enum Illustration {
internal static let backgroundCyan = ColorAsset(name: "Scene/Welcome/illustration/background.cyan")
@@ -125,6 +129,7 @@ internal enum Asset {
internal static let profileFieldCollectionViewBackground = ColorAsset(name: "Theme/Mastodon/profile.field.collection.view.background")
internal static let secondaryGroupedSystemBackground = ColorAsset(name: "Theme/Mastodon/secondary.grouped.system.background")
internal static let secondarySystemBackground = ColorAsset(name: "Theme/Mastodon/secondary.system.background")
+ internal static let sidebarBackground = ColorAsset(name: "Theme/Mastodon/sidebar.background")
internal static let systemBackground = ColorAsset(name: "Theme/Mastodon/system.background")
internal static let systemElevatedBackground = ColorAsset(name: "Theme/Mastodon/system.elevated.background")
internal static let systemGroupedBackground = ColorAsset(name: "Theme/Mastodon/system.grouped.background")
@@ -144,6 +149,7 @@ internal enum Asset {
internal static let profileFieldCollectionViewBackground = ColorAsset(name: "Theme/system/profile.field.collection.view.background")
internal static let secondaryGroupedSystemBackground = ColorAsset(name: "Theme/system/secondary.grouped.system.background")
internal static let secondarySystemBackground = ColorAsset(name: "Theme/system/secondary.system.background")
+ internal static let sidebarBackground = ColorAsset(name: "Theme/system/sidebar.background")
internal static let systemBackground = ColorAsset(name: "Theme/system/system.background")
internal static let systemElevatedBackground = ColorAsset(name: "Theme/system/system.elevated.background")
internal static let systemGroupedBackground = ColorAsset(name: "Theme/system/system.grouped.background")
@@ -157,23 +163,6 @@ internal enum Asset {
internal static let tabBarItemInactiveIconColor = ColorAsset(name: "Theme/system/tab.bar.item.inactive.icon.color")
}
}
- internal enum Deprecated {
- internal enum Background {
- internal static let danger = ColorAsset(name: "_Deprecated/Background/danger")
- internal static let onboardingBackground = ColorAsset(name: "_Deprecated/Background/onboarding.background")
- internal static let secondaryGroupedSystemBackground = ColorAsset(name: "_Deprecated/Background/secondary.grouped.system.background")
- internal static let secondarySystemBackground = ColorAsset(name: "_Deprecated/Background/secondary.system.background")
- internal static let systemBackground = ColorAsset(name: "_Deprecated/Background/system.background")
- internal static let systemElevatedBackground = ColorAsset(name: "_Deprecated/Background/system.elevated.background")
- internal static let systemGroupedBackground = ColorAsset(name: "_Deprecated/Background/system.grouped.background")
- internal static let tertiarySystemBackground = ColorAsset(name: "_Deprecated/Background/tertiary.system.background")
- internal static let tertiarySystemGroupedBackground = ColorAsset(name: "_Deprecated/Background/tertiary.system.grouped.background")
- }
- internal enum Compose {
- internal static let background = ColorAsset(name: "_Deprecated/Compose/background")
- internal static let toolbarBackground = ColorAsset(name: "_Deprecated/Compose/toolbar.background")
- }
- }
}
// swiftlint:enable identifier_name line_length nesting type_body_length type_name
diff --git a/Mastodon/Generated/Strings.swift b/Mastodon/Generated/Strings.swift
index 86dc89025..ebf9869c4 100644
--- a/Mastodon/Generated/Strings.swift
+++ b/Mastodon/Generated/Strings.swift
@@ -106,6 +106,8 @@ internal enum L10n {
}
/// Cancel
internal static let cancel = L10n.tr("Localizable", "Common.Controls.Actions.Cancel")
+ /// Compose
+ internal static let compose = L10n.tr("Localizable", "Common.Controls.Actions.Compose")
/// Confirm
internal static let confirm = L10n.tr("Localizable", "Common.Controls.Actions.Confirm")
/// Continue
@@ -365,6 +367,16 @@ internal enum L10n {
}
internal enum Scene {
+ internal enum AccountList {
+ /// Add Account
+ internal static let addAccount = L10n.tr("Localizable", "Scene.AccountList.AddAccount")
+ /// Dismiss Account Switcher
+ internal static let dismissAccountSwitcher = L10n.tr("Localizable", "Scene.AccountList.DismissAccountSwitcher")
+ /// Current selected profile: %@. Double tap then hold to show account switcher
+ internal static func tabBarHint(_ p1: Any) -> String {
+ return L10n.tr("Localizable", "Scene.AccountList.TabBarHint", String(describing: p1))
+ }
+ }
internal enum Compose {
/// Publish
internal static let composeAction = L10n.tr("Localizable", "Scene.Compose.ComposeAction")
@@ -513,6 +525,14 @@ internal enum L10n {
/// Your Favorites
internal static let title = L10n.tr("Localizable", "Scene.Favorite.Title")
}
+ internal enum Follower {
+ /// Followers from other servers are not displayed.
+ internal static let footer = L10n.tr("Localizable", "Scene.Follower.Footer")
+ }
+ internal enum Following {
+ /// Follows from other servers are not displayed.
+ internal static let footer = L10n.tr("Localizable", "Scene.Following.Footer")
+ }
internal enum HomeTimeline {
/// Home
internal static let title = L10n.tr("Localizable", "Scene.HomeTimeline.Title")
@@ -973,6 +993,14 @@ internal enum L10n {
/// Social networking\nback in your hands.
internal static let slogan = L10n.tr("Localizable", "Scene.Welcome.Slogan")
}
+ internal enum Wizard {
+ /// Double tap to dismiss this wizard
+ internal static let accessibilityHint = L10n.tr("Localizable", "Scene.Wizard.AccessibilityHint")
+ /// Switch between multiple accounts by holding the profile button.
+ internal static let multipleAccountSwitchIntroDescription = L10n.tr("Localizable", "Scene.Wizard.MultipleAccountSwitchIntroDescription")
+ /// New in Mastodon
+ internal static let newInMastodon = L10n.tr("Localizable", "Scene.Wizard.NewInMastodon")
+ }
}
internal enum A11y {
@@ -986,6 +1014,12 @@ internal enum L10n {
internal static func inputLimitRemains(_ p1: Int) -> String {
return L10n.tr("Localizable", "a11y.plural.count.input_limit_remains", p1)
}
+ internal enum Unread {
+ /// Plural format key: "%#@notification_count_unread_notification@"
+ internal static func notification(_ p1: Int) -> String {
+ return L10n.tr("Localizable", "a11y.plural.count.unread.notification", p1)
+ }
+ }
}
}
}
diff --git a/Mastodon/Helper/MastodonLocalCode.swift b/Mastodon/Helper/MastodonLocalCode.swift
new file mode 100644
index 000000000..65d71895e
--- /dev/null
+++ b/Mastodon/Helper/MastodonLocalCode.swift
@@ -0,0 +1,12 @@
+//
+// MastodonLocalCode.swift
+// Mastodon
+//
+// Created by Cirno MainasuK on 2021-11-4.
+//
+
+import Foundation
+
+// https://github.com/gunchleoc/mastodon/blob/ed6153b8f24d3a8f5a124cc95683bd1f20aec882/app/helpers/settings_helper.rb
+// last update 2021/11/4
+typealias MastodonLocalCode = [String: String]
diff --git a/Mastodon/Info.plist b/Mastodon/Info.plist
index 8190cdbbe..affa5b059 100644
--- a/Mastodon/Info.plist
+++ b/Mastodon/Info.plist
@@ -2,6 +2,8 @@
+ CADisableMinimumFrameDurationOnPhone
+
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleExecutable
@@ -15,7 +17,7 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 1.0.8
+ 1.2.0
CFBundleURLTypes
@@ -28,7 +30,7 @@
CFBundleVersion
- 60
+ 88
ITSAppUsesNonExemptEncryption
LSApplicationQueriesSchemes
@@ -109,5 +111,7 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
+ UIViewControllerBasedStatusBarAppearance
+
diff --git a/Mastodon/Preference/StoreReviewPreference.swift b/Mastodon/Preference/StoreReviewPreference.swift
new file mode 100644
index 000000000..e3a403f6d
--- /dev/null
+++ b/Mastodon/Preference/StoreReviewPreference.swift
@@ -0,0 +1,26 @@
+//
+// StoreReviewPreference.swift
+// Mastodon
+//
+// Created by Cirno MainasuK on 2021-11-3.
+//
+
+import Foundation
+
+extension UserDefaults {
+
+ @objc dynamic var processCompletedCount: Int {
+ get {
+ return integer(forKey: #function)
+ }
+ set { self[#function] = newValue }
+ }
+
+ @objc dynamic var lastVersionPromptedForReview: String? {
+ get {
+ return string(forKey: #function)
+ }
+ set { self[#function] = newValue }
+ }
+
+}
diff --git a/Mastodon/Preference/WizardPreference.swift b/Mastodon/Preference/WizardPreference.swift
new file mode 100644
index 000000000..c34e34a8a
--- /dev/null
+++ b/Mastodon/Preference/WizardPreference.swift
@@ -0,0 +1,15 @@
+//
+// WizardPreference.swift
+// Mastodon
+//
+// Created by Cirno MainasuK on 2021-9-15.
+//
+
+import UIKit
+
+extension UserDefaults {
+ @objc dynamic var didShowMultipleAccountSwitchWizard: Bool {
+ get { return bool(forKey: #function) }
+ set { self[#function] = newValue }
+ }
+}
diff --git a/Mastodon/Protocol/StatusProvider/StatusProviderFacade.swift b/Mastodon/Protocol/StatusProvider/StatusProviderFacade.swift
index 4c34c6749..d11870ed2 100644
--- a/Mastodon/Protocol/StatusProvider/StatusProviderFacade.swift
+++ b/Mastodon/Protocol/StatusProvider/StatusProviderFacade.swift
@@ -259,8 +259,8 @@ extension StatusProviderFacade {
guard let context = provider.context else { return }
// haptic feedback generator
- let generator = UIImpactFeedbackGenerator(style: .light)
- let responseFeedbackGenerator = UINotificationFeedbackGenerator()
+ let generator = UISelectionFeedbackGenerator()
+ // let responseFeedbackGenerator = UINotificationFeedbackGenerator()
status
.compactMap { status -> (NSManagedObjectID, Mastodon.API.Favorites.FavoriteKind)? in
@@ -287,10 +287,10 @@ extension StatusProviderFacade {
.handleEvents(receiveSubscription: { _ in
generator.prepare()
}, receiveOutput: { _, favoriteKind in
- generator.impactOccurred()
+ generator.selectionChanged()
os_log("%{public}s[%{public}ld], %{public}s: [Like] update local status like status to: %s", ((#file as NSString).lastPathComponent), #line, #function, favoriteKind == .create ? "like" : "unlike")
}, receiveCompletion: { completion in
- responseFeedbackGenerator.prepare()
+ // responseFeedbackGenerator.prepare()
switch completion {
case .failure:
// TODO: handle error
@@ -312,10 +312,10 @@ extension StatusProviderFacade {
guard let _ = provider else { return }
switch completion {
case .failure(let error):
- responseFeedbackGenerator.notificationOccurred(.error)
+ // responseFeedbackGenerator.notificationOccurred(.error)
os_log("%{public}s[%{public}ld], %{public}s: [Like] remote like request fail: %{public}s", ((#file as NSString).lastPathComponent), #line, #function, error.localizedDescription)
case .finished:
- responseFeedbackGenerator.notificationOccurred(.success)
+ // responseFeedbackGenerator.notificationOccurred(.success)
os_log("%{public}s[%{public}ld], %{public}s: [Like] remote like request success", ((#file as NSString).lastPathComponent), #line, #function)
}
} receiveValue: { response in
@@ -368,8 +368,8 @@ extension StatusProviderFacade {
guard let context = provider.context else { return }
// haptic feedback generator
- let generator = UIImpactFeedbackGenerator(style: .light)
- let responseFeedbackGenerator = UINotificationFeedbackGenerator()
+ let generator = UISelectionFeedbackGenerator()
+ // let responseFeedbackGenerator = UINotificationFeedbackGenerator()
status
.compactMap { status -> (NSManagedObjectID, Mastodon.API.Reblog.ReblogKind)? in
@@ -396,7 +396,7 @@ extension StatusProviderFacade {
.handleEvents(receiveSubscription: { _ in
generator.prepare()
}, receiveOutput: { _, reblogKind in
- generator.impactOccurred()
+ generator.selectionChanged()
switch reblogKind {
case .reblog:
os_log("%{public}s[%{public}ld], %{public}s: [Reblog] update local status reblog status to: %s", ((#file as NSString).lastPathComponent), #line, #function, "reblog")
@@ -404,7 +404,7 @@ extension StatusProviderFacade {
os_log("%{public}s[%{public}ld], %{public}s: [Reblog] update local status reblog status to: %s", ((#file as NSString).lastPathComponent), #line, #function, "unreblog")
}
}, receiveCompletion: { completion in
- responseFeedbackGenerator.prepare()
+ // responseFeedbackGenerator.prepare()
switch completion {
case .failure:
// TODO: handle error
@@ -426,10 +426,10 @@ extension StatusProviderFacade {
guard let _ = provider else { return }
switch completion {
case .failure(let error):
- responseFeedbackGenerator.notificationOccurred(.error)
+ // responseFeedbackGenerator.notificationOccurred(.error)
os_log("%{public}s[%{public}ld], %{public}s: [Reblog] remote reblog request fail: %{public}s", ((#file as NSString).lastPathComponent), #line, #function, error.localizedDescription)
case .finished:
- responseFeedbackGenerator.notificationOccurred(.success)
+ // responseFeedbackGenerator.notificationOccurred(.success)
os_log("%{public}s[%{public}ld], %{public}s: [Reblog] remote reblog request success", ((#file as NSString).lastPathComponent), #line, #function)
}
} receiveValue: { response in
@@ -469,8 +469,8 @@ extension StatusProviderFacade {
guard let provider = provider else { return }
guard let status = status?.reblog ?? status else { return }
- let generator = UIImpactFeedbackGenerator(style: .light)
- generator.impactOccurred()
+ let generator = UISelectionFeedbackGenerator()
+ generator.selectionChanged()
let composeViewModel = ComposeViewModel(context: provider.context, composeKind: .reply(repliedToStatusObjectID: status.objectID))
provider.coordinator.present(scene: .compose(viewModel: composeViewModel), from: provider, transition: .modal(animated: true, completion: nil))
diff --git a/Mastodon/Protocol/UserProvider/UserProviderFacade+UITableViewDelegate.swift b/Mastodon/Protocol/UserProvider/UserProviderFacade+UITableViewDelegate.swift
new file mode 100644
index 000000000..a6e3cf215
--- /dev/null
+++ b/Mastodon/Protocol/UserProvider/UserProviderFacade+UITableViewDelegate.swift
@@ -0,0 +1,22 @@
+//
+// UserProviderFacade+UITableViewDelegate.swift
+// Mastodon
+//
+// Created by Cirno MainasuK on 2021-11-1.
+//
+
+import Combine
+import CoreDataStack
+import MastodonSDK
+import os.log
+import UIKit
+
+extension UserTableViewCellDelegate where Self: UserProvider {
+
+ func handleTableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+ guard let cell = tableView.cellForRow(at: indexPath) else { return }
+ let user = self.mastodonUser(for: cell)
+ UserProviderFacade.coordinatorToUserProfileScene(provider: self, user: user)
+ }
+
+}
diff --git a/Mastodon/Protocol/UserProvider/UserProviderFacade.swift b/Mastodon/Protocol/UserProvider/UserProviderFacade.swift
index bf634b07b..edbe311c7 100644
--- a/Mastodon/Protocol/UserProvider/UserProviderFacade.swift
+++ b/Mastodon/Protocol/UserProvider/UserProviderFacade.swift
@@ -212,7 +212,14 @@ extension UserProviderFacade {
let name = mastodonUser.displayNameWithFallback
if let shareUser = shareUser {
- let shareAction = UIAction(title: L10n.Common.Controls.Actions.shareUser(name), image: UIImage(systemName: "square.and.arrow.up"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak provider] _ in
+ let shareAction = UIAction(
+ title: L10n.Common.Controls.Actions.shareUser(name),
+ image: UIImage(systemName: "square.and.arrow.up"),
+ identifier: nil,
+ discoverabilityTitle: nil,
+ attributes: [],
+ state: .off
+ ) { [weak provider, weak sourceView, weak barButtonItem] _ in
guard let provider = provider else { return }
let activityViewController = createActivityViewControllerForMastodonUser(mastodonUser: shareUser, dependency: provider)
provider.coordinator.present(
@@ -229,7 +236,14 @@ extension UserProviderFacade {
}
if let shareStatus = shareStatus {
- let shareAction = UIAction(title: L10n.Common.Controls.Actions.sharePost, image: UIImage(systemName: "square.and.arrow.up"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak provider] _ in
+ let shareAction = UIAction(
+ title: L10n.Common.Controls.Actions.sharePost,
+ image: UIImage(systemName: "square.and.arrow.up"),
+ identifier: nil,
+ discoverabilityTitle: nil,
+ attributes: [],
+ state: .off
+ ) { [weak provider, weak sourceView, weak barButtonItem] _ in
guard let provider = provider else { return }
let activityViewController = createActivityViewControllerForMastodonUser(status: shareStatus, dependency: provider)
provider.coordinator.present(
@@ -253,7 +267,7 @@ extension UserProviderFacade {
discoverabilityTitle: isMuting ? nil : L10n.Common.Controls.Friendship.muteUser(name),
attributes: isMuting ? [] : .destructive,
state: .off
- ) { [weak provider] _ in
+ ) { [weak provider, weak cell] _ in
guard let provider = provider else { return }
UserProviderFacade.toggleUserMuteRelationship(
@@ -283,7 +297,7 @@ extension UserProviderFacade {
discoverabilityTitle: isBlocking ? nil : L10n.Common.Controls.Friendship.blockUser(name),
attributes: isBlocking ? [] : .destructive,
state: .off
- ) { [weak provider] _ in
+ ) { [weak provider, weak cell] _ in
guard let provider = provider else { return }
UserProviderFacade.toggleUserBlockRelationship(
@@ -306,7 +320,14 @@ extension UserProviderFacade {
}
if !isMyself {
- let reportAction = UIAction(title: L10n.Common.Controls.Actions.reportUser(name), image: UIImage(systemName: "flag"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak provider] _ in
+ let reportAction = UIAction(
+ title: L10n.Common.Controls.Actions.reportUser(name),
+ image: UIImage(systemName: "flag"),
+ identifier: nil,
+ discoverabilityTitle: nil,
+ attributes: [],
+ state: .off
+ ) { [weak provider] _ in
guard let provider = provider else { return }
guard let authenticationBox = provider.context.authenticationService.activeMastodonAuthenticationBox.value else {
return
@@ -328,19 +349,34 @@ extension UserProviderFacade {
if !isInSameDomain {
if isDomainBlocking {
- let unblockDomainAction = UIAction(title: L10n.Common.Controls.Actions.unblockDomain(mastodonUser.domainFromAcct), image: UIImage(systemName: "nosign"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak provider] _ in
+ let unblockDomainAction = UIAction(
+ title: L10n.Common.Controls.Actions.unblockDomain(mastodonUser.domainFromAcct),
+ image: UIImage(systemName: "nosign"),
+ identifier: nil,
+ discoverabilityTitle: nil,
+ attributes: [],
+ state: .off
+ ) { [weak provider, weak cell] _ in
guard let provider = provider else { return }
provider.context.blockDomainService.unblockDomain(userProvider: provider, cell: cell)
}
children.append(unblockDomainAction)
} else {
- let blockDomainAction = UIAction(title: L10n.Common.Controls.Actions.blockDomain(mastodonUser.domainFromAcct), image: UIImage(systemName: "nosign"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak provider] _ in
+ let blockDomainAction = UIAction(
+ title: L10n.Common.Controls.Actions.blockDomain(mastodonUser.domainFromAcct),
+ image: UIImage(systemName: "nosign"),
+ identifier: nil,
+ discoverabilityTitle: nil,
+ attributes: [],
+ state: .off
+ ) { [weak provider, weak cell] _ in
guard let provider = provider else { return }
+
let alertController = UIAlertController(title: L10n.Common.Alerts.BlockDomain.title(mastodonUser.domainFromAcct), message: nil, preferredStyle: .alert)
- let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .default) { _ in
- }
+ let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .default) { _ in }
alertController.addAction(cancelAction)
- let blockDomainAction = UIAlertAction(title: L10n.Common.Alerts.BlockDomain.blockEntireDomain, style: .destructive) { _ in
+ let blockDomainAction = UIAlertAction(title: L10n.Common.Alerts.BlockDomain.blockEntireDomain, style: .destructive) { [weak provider, weak cell] _ in
+ guard let provider = provider else { return }
provider.context.blockDomainService.blockDomain(userProvider: provider, cell: cell)
}
alertController.addAction(blockDomainAction)
@@ -351,19 +387,26 @@ extension UserProviderFacade {
}
if let status = shareStatus, isMyself {
- let deleteAction = UIAction(title: L10n.Common.Controls.Actions.delete, image: UIImage(systemName: "delete.left"), identifier: nil, discoverabilityTitle: nil, attributes: [.destructive], state: .off) {
- [weak provider] _ in
+ let deleteAction = UIAction(
+ title: L10n.Common.Controls.Actions.delete,
+ image: UIImage(systemName: "delete.left"),
+ identifier: nil,
+ discoverabilityTitle: nil,
+ attributes: [.destructive],
+ state: .off
+ ) { [weak provider] _ in
guard let provider = provider else { return }
-
+
let alertController = UIAlertController(title: L10n.Common.Alerts.DeletePost.title, message: nil, preferredStyle: .alert)
- let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .default) { _ in
- }
+ let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .default) { _ in }
alertController.addAction(cancelAction)
- let deleteAction = UIAlertAction(title: L10n.Common.Alerts.DeletePost.delete, style: .destructive) { _ in
+ let deleteAction = UIAlertAction(title: L10n.Common.Alerts.DeletePost.delete, style: .destructive) { [weak provider] _ in
+ guard let provider = provider else { return }
guard let activeMastodonAuthenticationBox = provider.context.authenticationService.activeMastodonAuthenticationBox.value else { return }
- provider.context.apiService.deleteStatus(domain: activeMastodonAuthenticationBox.domain,
- statusID: status.id,
- authorizationBox: activeMastodonAuthenticationBox
+ provider.context.apiService.deleteStatus(
+ domain: activeMastodonAuthenticationBox.domain,
+ statusID: status.id,
+ authorizationBox: activeMastodonAuthenticationBox
)
.sink { _ in
// do nothing
@@ -374,7 +417,6 @@ extension UserProviderFacade {
}
alertController.addAction(deleteAction)
provider.present(alertController, animated: true, completion: nil)
-
}
children.append(deleteAction)
}
@@ -398,3 +440,25 @@ extension UserProviderFacade {
return activityViewController
}
}
+
+extension UserProviderFacade {
+ static func coordinatorToUserProfileScene(provider: UserProvider, user: Future) {
+ user
+ .sink { [weak provider] mastodonUser in
+ guard let provider = provider else { return }
+ guard let mastodonUser = mastodonUser else { return }
+ let profileViewModel = CachedProfileViewModel(context: provider.context, mastodonUser: mastodonUser)
+ DispatchQueue.main.async {
+ if provider.navigationController == nil {
+ let from = provider.presentingViewController ?? provider
+ provider.dismiss(animated: true) {
+ provider.coordinator.present(scene: .profile(viewModel: profileViewModel), from: from, transition: .show)
+ }
+ } else {
+ provider.coordinator.present(scene: .profile(viewModel: profileViewModel), from: provider, transition: .show)
+ }
+ }
+ }
+ .store(in: &provider.disposeBag)
+ }
+}
diff --git a/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/Contents.json b/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/Contents.json
index ba3df05b6..bcc8dce80 100644
--- a/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/Contents.json
+++ b/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/Contents.json
@@ -1,7 +1,7 @@
{
"images" : [
{
- "filename" : "c1 1.svg",
+ "filename" : "c1 1~universal.pdf",
"idiom" : "universal"
}
],
diff --git a/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/c1 1.svg b/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/c1 1.svg
deleted file mode 100644
index d3869cda5..000000000
--- a/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/c1 1.svg
+++ /dev/null
@@ -1,73 +0,0 @@
-
diff --git a/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/c1 1~universal.pdf b/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/c1 1~universal.pdf
new file mode 100644
index 000000000..93c448982
Binary files /dev/null and b/Mastodon/Resources/Assets.xcassets/Asset/email.imageset/c1 1~universal.pdf differ
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/danger.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Colors/badge.background.colorset/Contents.json
similarity index 74%
rename from Mastodon/Resources/Assets.xcassets/_Deprecated/Background/danger.colorset/Contents.json
rename to Mastodon/Resources/Assets.xcassets/Colors/badge.background.colorset/Contents.json
index dabccc33e..f58a604a1 100644
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/danger.colorset/Contents.json
+++ b/Mastodon/Resources/Assets.xcassets/Colors/badge.background.colorset/Contents.json
@@ -5,9 +5,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "0.353",
- "green" : "0.251",
- "red" : "0.875"
+ "blue" : "48",
+ "green" : "59",
+ "red" : "255"
}
},
"idiom" : "universal"
diff --git a/Mastodon/Resources/Assets.xcassets/Colors/danger.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Colors/danger.colorset/Contents.json
index 8ea3105e6..b77cb3c75 100644
--- a/Mastodon/Resources/Assets.xcassets/Colors/danger.colorset/Contents.json
+++ b/Mastodon/Resources/Assets.xcassets/Colors/danger.colorset/Contents.json
@@ -1,20 +1,20 @@
{
- "info" : {
- "version" : 1,
- "author" : "xcode"
- },
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "red" : "0.875",
- "blue" : "0.353",
- "green" : "0.251"
+ "blue" : "90",
+ "green" : "64",
+ "red" : "223"
}
},
"idiom" : "universal"
}
- ]
-}
\ No newline at end of file
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/Contents.json b/Mastodon/Resources/Assets.xcassets/Scene/Sidebar/Contents.json
similarity index 100%
rename from Mastodon/Resources/Assets.xcassets/_Deprecated/Background/Contents.json
rename to Mastodon/Resources/Assets.xcassets/Scene/Sidebar/Contents.json
diff --git a/Mastodon/Resources/Assets.xcassets/Scene/Sidebar/logo.imageset/Contents.json b/Mastodon/Resources/Assets.xcassets/Scene/Sidebar/logo.imageset/Contents.json
new file mode 100644
index 000000000..4f547d09b
--- /dev/null
+++ b/Mastodon/Resources/Assets.xcassets/Scene/Sidebar/logo.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "logo.pdf",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "preserves-vector-representation" : true
+ }
+}
diff --git a/Mastodon/Resources/Assets.xcassets/Scene/Sidebar/logo.imageset/logo.pdf b/Mastodon/Resources/Assets.xcassets/Scene/Sidebar/logo.imageset/logo.pdf
new file mode 100644
index 000000000..908727a57
--- /dev/null
+++ b/Mastodon/Resources/Assets.xcassets/Scene/Sidebar/logo.imageset/logo.pdf
@@ -0,0 +1,108 @@
+%PDF-1.7
+
+1 0 obj
+ << >>
+endobj
+
+2 0 obj
+ << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 0.000000 -0.103455 cm
+0.168627 0.564706 0.850980 scn
+27.796436 10.091343 m
+33.035133 10.719734 37.596470 13.962151 38.169762 16.924883 c
+39.073063 21.591980 38.998501 28.314186 38.998501 28.314186 c
+38.998501 37.425270 33.056084 40.095867 33.056084 40.095867 c
+30.059872 41.478233 24.914881 42.059555 19.569633 42.103455 c
+19.438305 42.103455 l
+14.093056 42.059555 8.951445 41.478233 5.955006 40.095867 c
+5.955006 40.095867 0.012361 37.425270 0.012361 28.314186 c
+0.012361 27.761837 0.009520 27.180878 0.006561 26.576080 c
+-0.001656 24.896429 -0.010772 23.032921 0.037591 21.087820 c
+0.253392 12.177679 1.663759 3.396290 9.864657 1.215820 c
+13.645910 0.210445 16.892391 0.000000 19.507011 0.144371 c
+24.248556 0.408443 26.910255 1.844212 26.910255 1.844212 c
+26.753922 5.300014 l
+26.753922 5.300014 23.365528 4.226753 19.560173 4.357544 c
+15.789957 4.487431 11.809797 4.765984 11.200012 9.415886 c
+11.143697 9.824329 11.115539 10.261055 11.115539 10.719732 c
+11.115539 10.719732 14.816599 9.810978 19.507011 9.595104 c
+22.375050 9.462955 25.064680 9.763912 27.796436 10.091343 c
+h
+31.989010 16.575367 m
+31.989010 27.607372 l
+31.989010 29.862061 31.417519 31.653776 30.269808 32.979347 c
+29.085829 34.304916 27.535576 34.984444 25.611385 34.984444 c
+23.384670 34.984444 21.698582 34.124794 20.583984 32.405266 c
+19.500023 30.580288 l
+18.416286 32.405266 l
+17.301464 34.124794 15.615376 34.984444 13.388884 34.984444 c
+11.464469 34.984444 9.914215 34.304916 8.730462 32.979347 c
+7.582527 31.653776 7.011036 29.862061 7.011036 27.607372 c
+7.011036 16.575367 l
+11.361976 16.575367 l
+11.361976 27.283108 l
+11.361976 29.540287 12.307401 30.685961 14.198477 30.685961 c
+16.289360 30.685961 17.337505 29.326900 17.337505 26.639557 c
+17.337505 20.778585 l
+21.662764 20.778585 l
+21.662764 26.639557 l
+21.662764 29.326900 22.710684 30.685961 24.801567 30.685961 c
+26.692642 30.685961 27.638069 29.540287 27.638069 27.283108 c
+27.638069 16.575367 l
+31.989010 16.575367 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+ 2035
+endobj
+
+4 0 obj
+ << /Annots []
+ /Type /Page
+ /MediaBox [ 0.000000 0.000000 39.000000 42.000000 ]
+ /Resources 1 0 R
+ /Contents 2 0 R
+ /Parent 5 0 R
+ >>
+endobj
+
+5 0 obj
+ << /Kids [ 4 0 R ]
+ /Count 1
+ /Type /Pages
+ >>
+endobj
+
+6 0 obj
+ << /Type /Catalog
+ /Pages 5 0 R
+ >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000002125 00000 n
+0000002148 00000 n
+0000002321 00000 n
+0000002395 00000 n
+trailer
+<< /ID [ (some) (id) ]
+ /Root 6 0 R
+ /Size 7
+>>
+startxref
+2454
+%%EOF
\ No newline at end of file
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/secondary.grouped.system.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Theme/Mastodon/Background/sidebar.background.colorset/Contents.json
similarity index 88%
rename from Mastodon/Resources/Assets.xcassets/_Deprecated/Background/secondary.grouped.system.background.colorset/Contents.json
rename to Mastodon/Resources/Assets.xcassets/Theme/Mastodon/Background/sidebar.background.colorset/Contents.json
index ef6c7f7b1..c24074078 100644
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/secondary.grouped.system.background.colorset/Contents.json
+++ b/Mastodon/Resources/Assets.xcassets/Theme/Mastodon/Background/sidebar.background.colorset/Contents.json
@@ -5,9 +5,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "0.996",
- "green" : "1.000",
- "red" : "0.996"
+ "blue" : "0xF1",
+ "green" : "0xF1",
+ "red" : "0xF1"
}
},
"idiom" : "universal"
diff --git a/Mastodon/Resources/Assets.xcassets/Theme/Mastodon/tab.bar.item.inactive.icon.color.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Theme/Mastodon/tab.bar.item.inactive.icon.color.colorset/Contents.json
index 1accfacdf..bfc2a11b2 100644
--- a/Mastodon/Resources/Assets.xcassets/Theme/Mastodon/tab.bar.item.inactive.icon.color.colorset/Contents.json
+++ b/Mastodon/Resources/Assets.xcassets/Theme/Mastodon/tab.bar.item.inactive.icon.color.colorset/Contents.json
@@ -5,9 +5,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "0.549",
- "green" : "0.510",
- "red" : "0.431"
+ "blue" : "0x99",
+ "green" : "0x99",
+ "red" : "0x99"
}
},
"idiom" : "universal"
@@ -23,9 +23,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "200",
- "green" : "174",
- "red" : "155"
+ "blue" : "0x99",
+ "green" : "0x99",
+ "red" : "0x99"
}
},
"idiom" : "universal"
diff --git a/Mastodon/Resources/Assets.xcassets/Theme/system/Background/secondary.system.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Theme/system/Background/secondary.system.background.colorset/Contents.json
index b9a69ec7d..77d24b11d 100644
--- a/Mastodon/Resources/Assets.xcassets/Theme/system/Background/secondary.system.background.colorset/Contents.json
+++ b/Mastodon/Resources/Assets.xcassets/Theme/system/Background/secondary.system.background.colorset/Contents.json
@@ -23,9 +23,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "46",
- "green" : "44",
- "red" : "44"
+ "blue" : "0x2E",
+ "green" : "0x2C",
+ "red" : "0x2C"
}
},
"idiom" : "universal"
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/secondary.system.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Theme/system/Background/sidebar.background.colorset/Contents.json
similarity index 76%
rename from Mastodon/Resources/Assets.xcassets/_Deprecated/Background/secondary.system.background.colorset/Contents.json
rename to Mastodon/Resources/Assets.xcassets/Theme/system/Background/sidebar.background.colorset/Contents.json
index c915c8911..ee5b1c373 100644
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/secondary.system.background.colorset/Contents.json
+++ b/Mastodon/Resources/Assets.xcassets/Theme/system/Background/sidebar.background.colorset/Contents.json
@@ -5,9 +5,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "0.910",
- "green" : "0.882",
- "red" : "0.851"
+ "blue" : "0.945",
+ "green" : "0.945",
+ "red" : "0.945"
}
},
"idiom" : "universal"
@@ -23,9 +23,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "0.133",
- "green" : "0.106",
- "red" : "0.098"
+ "blue" : "0x2E",
+ "green" : "0x2C",
+ "red" : "0x2C"
}
},
"idiom" : "universal"
diff --git a/Mastodon/Resources/Assets.xcassets/Theme/system/tab.bar.item.inactive.icon.color.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Theme/system/tab.bar.item.inactive.icon.color.colorset/Contents.json
index ece9000aa..bfc2a11b2 100644
--- a/Mastodon/Resources/Assets.xcassets/Theme/system/tab.bar.item.inactive.icon.color.colorset/Contents.json
+++ b/Mastodon/Resources/Assets.xcassets/Theme/system/tab.bar.item.inactive.icon.color.colorset/Contents.json
@@ -5,9 +5,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "0.549",
- "green" : "0.510",
- "red" : "0.431"
+ "blue" : "0x99",
+ "green" : "0x99",
+ "red" : "0x99"
}
},
"idiom" : "universal"
@@ -23,9 +23,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "140",
- "green" : "130",
- "red" : "110"
+ "blue" : "0x99",
+ "green" : "0x99",
+ "red" : "0x99"
}
},
"idiom" : "universal"
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/onboarding.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/onboarding.background.colorset/Contents.json
deleted file mode 100644
index 0e4687fb4..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/onboarding.background.colorset/Contents.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.910",
- "green" : "0.882",
- "red" : "0.851"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.background.colorset/Contents.json
deleted file mode 100644
index 4572c2409..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.background.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.996",
- "green" : "1.000",
- "red" : "0.996"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.216",
- "green" : "0.173",
- "red" : "0.157"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.elevated.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.elevated.background.colorset/Contents.json
deleted file mode 100644
index 33b71ef90..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.elevated.background.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "1.000",
- "green" : "1.000",
- "red" : "1.000"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.216",
- "green" : "0.173",
- "red" : "0.157"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.grouped.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.grouped.background.colorset/Contents.json
deleted file mode 100644
index c915c8911..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/system.grouped.background.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.910",
- "green" : "0.882",
- "red" : "0.851"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.133",
- "green" : "0.106",
- "red" : "0.098"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/tertiary.system.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/tertiary.system.background.colorset/Contents.json
deleted file mode 100644
index 4572c2409..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/tertiary.system.background.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.996",
- "green" : "1.000",
- "red" : "0.996"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.216",
- "green" : "0.173",
- "red" : "0.157"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/tertiary.system.grouped.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/tertiary.system.grouped.background.colorset/Contents.json
deleted file mode 100644
index 98dd7bbde..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Background/tertiary.system.grouped.background.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.910",
- "green" : "0.882",
- "red" : "0.851"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.263",
- "green" : "0.208",
- "red" : "0.192"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/Contents.json
deleted file mode 100644
index 6e965652d..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/Contents.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- },
- "properties" : {
- "provides-namespace" : true
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/background.colorset/Contents.json
deleted file mode 100644
index 33b71ef90..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/background.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "1.000",
- "green" : "1.000",
- "red" : "1.000"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.216",
- "green" : "0.173",
- "red" : "0.157"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/toolbar.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/toolbar.background.colorset/Contents.json
deleted file mode 100644
index da7b76069..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Compose/toolbar.background.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.871",
- "green" : "0.847",
- "red" : "0.839"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "0.920",
- "blue" : "0.125",
- "green" : "0.125",
- "red" : "0.125"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Mastodon/Resources/Assets.xcassets/_Deprecated/Contents.json b/Mastodon/Resources/Assets.xcassets/_Deprecated/Contents.json
deleted file mode 100644
index 6e965652d..000000000
--- a/Mastodon/Resources/Assets.xcassets/_Deprecated/Contents.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- },
- "properties" : {
- "provides-namespace" : true
- }
-}
diff --git a/Mastodon/Resources/ar.lproj/InfoPlist.strings b/Mastodon/Resources/ar.lproj/InfoPlist.strings
index 2531bd454..c3b26f14a 100644
--- a/Mastodon/Resources/ar.lproj/InfoPlist.strings
+++ b/Mastodon/Resources/ar.lproj/InfoPlist.strings
@@ -1,4 +1,4 @@
-"NSCameraUsageDescription" = "Used to take photo for post status";
-"NSPhotoLibraryAddUsageDescription" = "Used to save photo into the Photo Library";
-"NewPostShortcutItemTitle" = "New Post";
+"NSCameraUsageDescription" = "يُستخدم لالتقاط الصورة عِندَ نشر الحالات";
+"NSPhotoLibraryAddUsageDescription" = "يُستخدم لحِفظ الصورة في مكتبة الصور";
+"NewPostShortcutItemTitle" = "منشور جديد";
"SearchShortcutItemTitle" = "البحث";
\ No newline at end of file
diff --git a/Mastodon/Resources/ar.lproj/Localizable.strings b/Mastodon/Resources/ar.lproj/Localizable.strings
index 475d27886..b878e0342 100644
--- a/Mastodon/Resources/ar.lproj/Localizable.strings
+++ b/Mastodon/Resources/ar.lproj/Localizable.strings
@@ -1,81 +1,82 @@
-"Common.Alerts.BlockDomain.BlockEntireDomain" = "حظر النطاق";
-"Common.Alerts.BlockDomain.Title" = "Are you really, really sure you want to block the entire %@? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain and any of your followers from that domain will be removed.";
-"Common.Alerts.CleanCache.Message" = "تم تنظيف ذاكرة التخزين المؤقت %@ بنجاح.";
-"Common.Alerts.CleanCache.Title" = "تنظيف ذاكرة التخزين المؤقت";
-"Common.Alerts.Common.PleaseTryAgain" = "الرجاء المحاولة مرة أخرى.";
-"Common.Alerts.Common.PleaseTryAgainLater" = "الرجاء المحاولة مرة أخرى لاحقاً.";
+"Common.Alerts.BlockDomain.BlockEntireDomain" = "حظر النِطاق";
+"Common.Alerts.BlockDomain.Title" = "هل أنتَ مُتأكِّدٌ حقًا مِن رغبتك في حظر %@ بالكامل؟ في معظم الحالات، يكون مِنَ الكافي والمُفَضَّل استهداف عدد محدود للحظر أو الكتم. لن ترى محتوى من هذا النطاق وسوف يتم إزالة جميع متابعيك المتواجدين فيه.";
+"Common.Alerts.CleanCache.Message" = "تمَّ مَحو ذاكرة التخزين المؤقت %@ بنجاح.";
+"Common.Alerts.CleanCache.Title" = "مَحو ذاكرة التخزين المؤقت";
+"Common.Alerts.Common.PleaseTryAgain" = "يُرجى المحاولة مرة أُخرى.";
+"Common.Alerts.Common.PleaseTryAgainLater" = "يُرجى المحاولة مرة أُخرى لاحقاً.";
"Common.Alerts.DeletePost.Delete" = "احذف";
-"Common.Alerts.DeletePost.Title" = "هل أنت متأكد من أنك تريد حذف هذا المنشور؟";
-"Common.Alerts.DiscardPostContent.Message" = "Confirm to discard composed post content.";
-"Common.Alerts.DiscardPostContent.Title" = "تجاهل المسودة";
-"Common.Alerts.EditProfileFailure.Message" = "Cannot edit profile. Please try again.";
-"Common.Alerts.EditProfileFailure.Title" = "Edit Profile Error";
-"Common.Alerts.PublishPostFailure.AttachmentsMessage.MoreThanOneVideo" = "Cannot attach more than one video.";
-"Common.Alerts.PublishPostFailure.AttachmentsMessage.VideoAttachWithPhoto" = "Cannot attach a video to a post that already contains images.";
-"Common.Alerts.PublishPostFailure.Message" = "Failed to publish the post.
-Please check your internet connection.";
-"Common.Alerts.PublishPostFailure.Title" = "أخفقت عملية النشر";
-"Common.Alerts.SavePhotoFailure.Message" = "Please enable the photo library access permission to save the photo.";
-"Common.Alerts.SavePhotoFailure.Title" = "فشل حفظ الصورة";
+"Common.Alerts.DeletePost.Title" = "هل أنت متأكد من رغبتك في حذف هذا المنشور؟";
+"Common.Alerts.DiscardPostContent.Message" = "أكِّد للتخلص مِن مُحتوى مَنشور مؤلَّف.";
+"Common.Alerts.DiscardPostContent.Title" = "التخلص من المسودة";
+"Common.Alerts.EditProfileFailure.Message" = "لا يمكن تعديل الملف الشخصي. يُرجى المحاولة مرة أُخرى.";
+"Common.Alerts.EditProfileFailure.Title" = "خطأ في تَحرير الملف الشخصي";
+"Common.Alerts.PublishPostFailure.AttachmentsMessage.MoreThanOneVideo" = "لا يُمكِنُ إرفاق أكثر مِن مَقطع مرئي واحِد.";
+"Common.Alerts.PublishPostFailure.AttachmentsMessage.VideoAttachWithPhoto" = "لا يُمكن إرفاق مقطع مرئي إلى مَنشور يحتوي بالفعل على صُوَر.";
+"Common.Alerts.PublishPostFailure.Message" = "فَشَلَ نَشر المَنشور.
+يُرجى التحقق من اتصالك بالإنترنت.";
+"Common.Alerts.PublishPostFailure.Title" = "إخفاق في عمليَّة النشر";
+"Common.Alerts.SavePhotoFailure.Message" = "يُرجى إتاحة إذن الوصول إلى مكتبة الصور لحفظ الصورة.";
+"Common.Alerts.SavePhotoFailure.Title" = "إخفاق في حفظ الصورة";
"Common.Alerts.ServerError.Title" = "خطأ في الخادم";
"Common.Alerts.SignOut.Confirm" = "تسجيل الخروج";
-"Common.Alerts.SignOut.Message" = "هل أنت متأكد من أنك تريد تسجيل الخروج؟";
+"Common.Alerts.SignOut.Message" = "هل أنت متأكد من رغبتك في تسجيل الخروج؟";
"Common.Alerts.SignOut.Title" = "تسجيل الخروج";
-"Common.Alerts.SignUpFailure.Title" = "فشل التسجيل";
-"Common.Alerts.VoteFailure.PollEnded" = "The poll has ended";
-"Common.Alerts.VoteFailure.Title" = "فشل التصويت";
+"Common.Alerts.SignUpFailure.Title" = "إخفاق في التسجيل";
+"Common.Alerts.VoteFailure.PollEnded" = "انتهى استطلاع الرأي";
+"Common.Alerts.VoteFailure.Title" = "إخفاق في التصويت";
"Common.Controls.Actions.Add" = "إضافة";
"Common.Controls.Actions.Back" = "العودة";
"Common.Controls.Actions.BlockDomain" = "حظر %@";
"Common.Controls.Actions.Cancel" = "إلغاء";
+"Common.Controls.Actions.Compose" = "تأليف";
"Common.Controls.Actions.Confirm" = "تأكيد";
"Common.Controls.Actions.Continue" = "واصل";
"Common.Controls.Actions.CopyPhoto" = "نسخ الصورة";
"Common.Controls.Actions.Delete" = "احذف";
"Common.Controls.Actions.Discard" = "تجاهل";
-"Common.Controls.Actions.Done" = "تم";
-"Common.Controls.Actions.Edit" = "تعديل";
+"Common.Controls.Actions.Done" = "تمّ";
+"Common.Controls.Actions.Edit" = "تحرير";
"Common.Controls.Actions.FindPeople" = "ابحث عن أشخاص لمتابعتهم";
"Common.Controls.Actions.ManuallySearch" = "البحث يدوياً بدلاً من ذلك";
"Common.Controls.Actions.Next" = "التالي";
"Common.Controls.Actions.Ok" = "حسنًا";
"Common.Controls.Actions.Open" = "افتح";
-"Common.Controls.Actions.OpenInSafari" = "افتحه في سفاري";
-"Common.Controls.Actions.Preview" = "معاينة";
+"Common.Controls.Actions.OpenInSafari" = "الفتح في Safari";
+"Common.Controls.Actions.Preview" = "مُعاينة";
"Common.Controls.Actions.Previous" = "السابق";
"Common.Controls.Actions.Remove" = "احذف";
-"Common.Controls.Actions.Reply" = "رد";
+"Common.Controls.Actions.Reply" = "الرَد";
"Common.Controls.Actions.ReportUser" = "ابلغ عن %@";
"Common.Controls.Actions.Save" = "حفظ";
"Common.Controls.Actions.SavePhoto" = "حفظ الصورة";
"Common.Controls.Actions.SeeMore" = "عرض المزيد";
"Common.Controls.Actions.Settings" = "الإعدادات";
-"Common.Controls.Actions.Share" = "شارك";
-"Common.Controls.Actions.SharePost" = "شارك المنشور";
-"Common.Controls.Actions.ShareUser" = "شارك %@";
-"Common.Controls.Actions.SignIn" = "لِج";
-"Common.Controls.Actions.SignUp" = "انشئ حسابًا";
+"Common.Controls.Actions.Share" = "المُشارك";
+"Common.Controls.Actions.SharePost" = "مشارك المنشور";
+"Common.Controls.Actions.ShareUser" = "مُشاركة %@";
+"Common.Controls.Actions.SignIn" = "تسجيل الدخول";
+"Common.Controls.Actions.SignUp" = "إنشاء حِساب";
"Common.Controls.Actions.Skip" = "تخطي";
-"Common.Controls.Actions.TakePhoto" = "التقط صورة";
-"Common.Controls.Actions.TryAgain" = "حاول مرة أخرى";
+"Common.Controls.Actions.TakePhoto" = "التقاط صورة";
+"Common.Controls.Actions.TryAgain" = "المُحاولة مرة أُخرى";
"Common.Controls.Actions.UnblockDomain" = "إلغاء حظر %@";
-"Common.Controls.Friendship.Block" = "Block";
-"Common.Controls.Friendship.BlockDomain" = "Block %@";
-"Common.Controls.Friendship.BlockUser" = "Block %@";
-"Common.Controls.Friendship.Blocked" = "Blocked";
+"Common.Controls.Friendship.Block" = "حظر";
+"Common.Controls.Friendship.BlockDomain" = "حظر %@";
+"Common.Controls.Friendship.BlockUser" = "حظر %@";
+"Common.Controls.Friendship.Blocked" = "محظور";
"Common.Controls.Friendship.EditInfo" = "تعديل المعلومات";
-"Common.Controls.Friendship.Follow" = "Follow";
-"Common.Controls.Friendship.Following" = "Following";
+"Common.Controls.Friendship.Follow" = "اتبع";
+"Common.Controls.Friendship.Following" = "مُتابَع";
"Common.Controls.Friendship.Mute" = "أكتم";
"Common.Controls.Friendship.MuteUser" = "أكتم %@";
"Common.Controls.Friendship.Muted" = "مكتوم";
-"Common.Controls.Friendship.Pending" = "Pending";
-"Common.Controls.Friendship.Request" = "Request";
-"Common.Controls.Friendship.Unblock" = "Unblock";
-"Common.Controls.Friendship.UnblockUser" = "Unblock %@";
+"Common.Controls.Friendship.Pending" = "قيد المُراجعة";
+"Common.Controls.Friendship.Request" = "إرسال طَلَب";
+"Common.Controls.Friendship.Unblock" = "إلغاء الحَظر";
+"Common.Controls.Friendship.UnblockUser" = "إلغاء حظر %@";
"Common.Controls.Friendship.Unmute" = "إلغاء الكتم";
"Common.Controls.Friendship.UnmuteUser" = "إلغاء كتم %@";
-"Common.Controls.Keyboard.Common.ComposeNewPost" = "إنشاء منشور جديد";
+"Common.Controls.Keyboard.Common.ComposeNewPost" = "تأليف منشور جديد";
"Common.Controls.Keyboard.Common.OpenSettings" = "أفتح الإعدادات";
"Common.Controls.Keyboard.Common.ShowFavorites" = "إظهار المفضلة";
"Common.Controls.Keyboard.Common.SwitchToTab" = "التبديل إلى %@";
@@ -88,81 +89,83 @@ Please check your internet connection.";
"Common.Controls.Keyboard.Timeline.PreviewImage" = "معاينة الصورة";
"Common.Controls.Keyboard.Timeline.PreviousStatus" = "المنشور السابق";
"Common.Controls.Keyboard.Timeline.ReplyStatus" = "رد على المنشور";
-"Common.Controls.Keyboard.Timeline.ToggleContentWarning" = "Toggle Content Warning";
-"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Toggle Favorite on Post";
-"Common.Controls.Keyboard.Timeline.ToggleReblog" = "Toggle Reblog on Post";
-"Common.Controls.Status.Actions.Favorite" = "Favorite";
-"Common.Controls.Status.Actions.Menu" = "Menu";
-"Common.Controls.Status.Actions.Reblog" = "Reblog";
-"Common.Controls.Status.Actions.Reply" = "Reply";
-"Common.Controls.Status.Actions.Unfavorite" = "Unfavorite";
-"Common.Controls.Status.Actions.Unreblog" = "Undo reblog";
-"Common.Controls.Status.ContentWarning" = "Content Warning";
-"Common.Controls.Status.MediaContentWarning" = "Tap anywhere to reveal";
-"Common.Controls.Status.Poll.Closed" = "Closed";
-"Common.Controls.Status.Poll.Vote" = "Vote";
-"Common.Controls.Status.ShowPost" = "Show Post";
-"Common.Controls.Status.ShowUserProfile" = "Show user profile";
+"Common.Controls.Keyboard.Timeline.ToggleContentWarning" = "تبديل تحذير المُحتَوى";
+"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "تبديل المفضلة لِمنشور";
+"Common.Controls.Keyboard.Timeline.ToggleReblog" = "تبديل إعادة تدوين منشور";
+"Common.Controls.Status.Actions.Favorite" = "إضافة إلى المفضلة";
+"Common.Controls.Status.Actions.Menu" = "القائمة";
+"Common.Controls.Status.Actions.Reblog" = "إعادة النشر";
+"Common.Controls.Status.Actions.Reply" = "رد";
+"Common.Controls.Status.Actions.Unfavorite" = "إزالة من المفضلة";
+"Common.Controls.Status.Actions.Unreblog" = "تراجع عن إعادة النشر";
+"Common.Controls.Status.ContentWarning" = "تحذير عن المحتوى";
+"Common.Controls.Status.MediaContentWarning" = "انقر على أي مكان للكشف";
+"Common.Controls.Status.Poll.Closed" = "انتهى";
+"Common.Controls.Status.Poll.Vote" = "صَوِّت";
+"Common.Controls.Status.ShowPost" = "اظهر المنشور";
+"Common.Controls.Status.ShowUserProfile" = "اظهر الملف التعريفي للمستخدم";
"Common.Controls.Status.Tag.Email" = "البريد الإلكتروني";
-"Common.Controls.Status.Tag.Emoji" = "Emoji";
-"Common.Controls.Status.Tag.Hashtag" = "Hashtag";
-"Common.Controls.Status.Tag.Link" = "Link";
-"Common.Controls.Status.Tag.Mention" = "Mention";
-"Common.Controls.Status.Tag.Url" = "URL";
-"Common.Controls.Status.UserReblogged" = "%@ reblogged";
-"Common.Controls.Status.UserRepliedTo" = "Replied to %@";
+"Common.Controls.Status.Tag.Emoji" = "إيموجي";
+"Common.Controls.Status.Tag.Hashtag" = "الوسم";
+"Common.Controls.Status.Tag.Link" = "الرابط";
+"Common.Controls.Status.Tag.Mention" = "أشر إلى";
+"Common.Controls.Status.Tag.Url" = "عنوان URL";
+"Common.Controls.Status.UserReblogged" = "أعادَ %@ تدوينها";
+"Common.Controls.Status.UserRepliedTo" = "رد على %@";
"Common.Controls.Tabs.Home" = "الخيط الرئيسي";
"Common.Controls.Tabs.Notification" = "الإشعارات";
"Common.Controls.Tabs.Profile" = "الملف التعريفي";
"Common.Controls.Tabs.Search" = "بحث";
-"Common.Controls.Timeline.Filtered" = "Filtered";
-"Common.Controls.Timeline.Header.BlockedWarning" = "You can’t view this user’s profile
-until they unblock you.";
-"Common.Controls.Timeline.Header.BlockingWarning" = "You can’t view this user's profile
-until you unblock them.
-Your profile looks like this to them.";
+"Common.Controls.Timeline.Filtered" = "مُصفَّى";
+"Common.Controls.Timeline.Header.BlockedWarning" = "لا يُمكِنُكَ عَرض الملف الشخصي لهذا المُستخدِم
+حتَّى يَرفَعَ الحَظر عَنك.";
+"Common.Controls.Timeline.Header.BlockingWarning" = "لا يُمكنك الاطلاع على الملف الشخصي لهذا المُستخدِم
+حتَّى تَرفعَ الحَظر عنه.
+ملفًّكَ الشخصي يَظهَرُ بِمثل هذِهِ الحالة بالنسبةِ لَهُ أيضًا.";
"Common.Controls.Timeline.Header.NoStatusFound" = "لا توجد هناك منشورات";
-"Common.Controls.Timeline.Header.SuspendedWarning" = "This user has been suspended.";
-"Common.Controls.Timeline.Header.UserBlockedWarning" = "You can’t view %@’s profile
-until they unblock you.";
-"Common.Controls.Timeline.Header.UserBlockingWarning" = "You can’t view %@’s profile
-until you unblock them.
-Your profile looks like this to them.";
-"Common.Controls.Timeline.Header.UserSuspendedWarning" = "%@’s account has been suspended.";
-"Common.Controls.Timeline.Loader.LoadMissingPosts" = "Load missing posts";
+"Common.Controls.Timeline.Header.SuspendedWarning" = "تمَّ إيقاف هذا المُستخدِم.";
+"Common.Controls.Timeline.Header.UserBlockedWarning" = "لا يُمكِنُكَ عَرض ملف %@ الشخصي
+حتَّى يَرفَعَ الحَظر عَنك.";
+"Common.Controls.Timeline.Header.UserBlockingWarning" = "لا يُمكنك الاطلاع على ملف %@ الشخصي
+حتَّى تَرفعَ الحَظر عنه.
+ملفًّكَ الشخصي يَظهَرُ بِمثل هذِهِ الحالة بالنسبةِ لَهُ أيضًا.";
+"Common.Controls.Timeline.Header.UserSuspendedWarning" = "لقد أوقِفَ حِساب %@.";
+"Common.Controls.Timeline.Loader.LoadMissingPosts" = "تحميل المنشورات المَفقودة";
"Common.Controls.Timeline.Loader.LoadingMissingPosts" = "تحميل المزيد من المنشورات...";
"Common.Controls.Timeline.Loader.ShowMoreReplies" = "إظهار المزيد من الردود";
"Common.Controls.Timeline.Timestamp.Now" = "الأن";
-"Scene.Compose.Accessibility.AppendAttachment" = "Add Attachment";
+"Scene.AccountList.AddAccount" = "إضافة حساب";
+"Scene.AccountList.DismissAccountSwitcher" = "تجاهُل مبدِّل الحساب";
+"Scene.AccountList.TabBarHint" = "المِلف المُحدَّد حاليًا: %@. انقر نقرًا مزدوجًا ثم اضغط مع الاستمرار لإظهار مُبدِّل الحِساب";
+"Scene.Compose.Accessibility.AppendAttachment" = "إضافة مُرفَق";
"Scene.Compose.Accessibility.AppendPoll" = "اضافة استطلاع رأي";
"Scene.Compose.Accessibility.CustomEmojiPicker" = "منتقي مخصص للإيموجي";
"Scene.Compose.Accessibility.DisableContentWarning" = "تعطيل تحذير الحتوى";
"Scene.Compose.Accessibility.EnableContentWarning" = "تنشيط تحذير المحتوى";
-"Scene.Compose.Accessibility.PostVisibilityMenu" = "Post Visibility Menu";
+"Scene.Compose.Accessibility.PostVisibilityMenu" = "قائمة ظهور المنشور";
"Scene.Compose.Accessibility.RemovePoll" = "إزالة الاستطلاع";
-"Scene.Compose.Attachment.AttachmentBroken" = "This %@ is broken and can’t be
-uploaded to Mastodon.";
-"Scene.Compose.Attachment.DescriptionPhoto" = "Describe the photo for the visually-impaired...";
-"Scene.Compose.Attachment.DescriptionVideo" = "Describe the video for the visually-impaired...";
+"Scene.Compose.Attachment.AttachmentBroken" = "هذا ال%@ مُعطَّل ويتعذَّر رفعه إلى ماستودون.";
+"Scene.Compose.Attachment.DescriptionPhoto" = "صِف الصورة للمكفوفين...";
+"Scene.Compose.Attachment.DescriptionVideo" = "صِف المقطع المرئي للمكفوفين...";
"Scene.Compose.Attachment.Photo" = "صورة";
"Scene.Compose.Attachment.Video" = "فيديو";
-"Scene.Compose.AutoComplete.SpaceToAdd" = "Space to add";
+"Scene.Compose.AutoComplete.SpaceToAdd" = "انقر مساحة لإضافتِها";
"Scene.Compose.ComposeAction" = "انشر";
-"Scene.Compose.ContentInputPlaceholder" = "ما الذي يجول ببالك";
-"Scene.Compose.ContentWarning.Placeholder" = "Write an accurate warning here...";
-"Scene.Compose.Keyboard.AppendAttachmentEntry" = "Add Attachment - %@";
-"Scene.Compose.Keyboard.DiscardPost" = "Discard Post";
-"Scene.Compose.Keyboard.PublishPost" = "Publish Post";
-"Scene.Compose.Keyboard.SelectVisibilityEntry" = "Select Visibility - %@";
-"Scene.Compose.Keyboard.ToggleContentWarning" = "Toggle Content Warning";
-"Scene.Compose.Keyboard.TogglePoll" = "Toggle Poll";
+"Scene.Compose.ContentInputPlaceholder" = "أخبِرنا بِما يَجُولُ فِي ذِهنَك";
+"Scene.Compose.ContentWarning.Placeholder" = "اكتب تَحذيرًا دَقيقًا هُنا...";
+"Scene.Compose.Keyboard.AppendAttachmentEntry" = "إضافة مُرفَق - %@";
+"Scene.Compose.Keyboard.DiscardPost" = "تجاهُل المنشور";
+"Scene.Compose.Keyboard.PublishPost" = "نَشر المَنشُور";
+"Scene.Compose.Keyboard.SelectVisibilityEntry" = "اختر مدى الظهور - %@";
+"Scene.Compose.Keyboard.ToggleContentWarning" = "تبديل تحذير المُحتوى";
+"Scene.Compose.Keyboard.TogglePoll" = "تبديل الاستطلاع";
"Scene.Compose.MediaSelection.Browse" = "تصفح";
"Scene.Compose.MediaSelection.Camera" = "التقط صورة";
"Scene.Compose.MediaSelection.PhotoLibrary" = "مكتبة الصور";
-"Scene.Compose.Poll.DurationTime" = "Duration: %@";
+"Scene.Compose.Poll.DurationTime" = "المدة: %@";
"Scene.Compose.Poll.OneDay" = "يوم واحد";
"Scene.Compose.Poll.OneHour" = "ساعة واحدة";
-"Scene.Compose.Poll.OptionNumber" = "Option %ld";
+"Scene.Compose.Poll.OptionNumber" = "الخيار %ld";
"Scene.Compose.Poll.SevenDays" = "7 أيام";
"Scene.Compose.Poll.SixHours" = "6 ساعات";
"Scene.Compose.Poll.ThirtyMinutes" = "30 دقيقة";
@@ -170,39 +173,41 @@ uploaded to Mastodon.";
"Scene.Compose.ReplyingToUser" = "رد على %@";
"Scene.Compose.Title.NewPost" = "منشور جديد";
"Scene.Compose.Title.NewReply" = "رد جديد";
-"Scene.Compose.Visibility.Direct" = "Only people I mention";
-"Scene.Compose.Visibility.Private" = "Followers only";
-"Scene.Compose.Visibility.Public" = "Public";
-"Scene.Compose.Visibility.Unlisted" = "Unlisted";
-"Scene.ConfirmEmail.Button.DontReceiveEmail" = "I never got an email";
-"Scene.ConfirmEmail.Button.OpenEmailApp" = "Open Email App";
-"Scene.ConfirmEmail.DontReceiveEmail.Description" = "Check if your email address is correct as well as your junk folder if you haven’t.";
-"Scene.ConfirmEmail.DontReceiveEmail.ResendEmail" = "Resend Email";
-"Scene.ConfirmEmail.DontReceiveEmail.Title" = "Check your email";
-"Scene.ConfirmEmail.OpenEmailApp.Description" = "We just sent you an email. Check your junk folder if you haven’t.";
+"Scene.Compose.Visibility.Direct" = "ففط للأشخاص المشار إليهم";
+"Scene.Compose.Visibility.Private" = "لمتابعيك فقط";
+"Scene.Compose.Visibility.Public" = "للعامة";
+"Scene.Compose.Visibility.Unlisted" = "غير مُدرَج";
+"Scene.ConfirmEmail.Button.DontReceiveEmail" = "لم أستلم أبدًا بريدا إلكترونيا";
+"Scene.ConfirmEmail.Button.OpenEmailApp" = "افتح تطبيق البريد الإلكتروني";
+"Scene.ConfirmEmail.DontReceiveEmail.Description" = "تحقق ممَّ إذا كان عنوان بريدك الإلكتروني صحيحًا وكذلك تأكد مِن مجلد البريد غير الهام إذا لم تكن قد فعلت ذلك.";
+"Scene.ConfirmEmail.DontReceiveEmail.ResendEmail" = "إعادة إرسال البريد الإلكتروني";
+"Scene.ConfirmEmail.DontReceiveEmail.Title" = "تحقق من بريدك الإلكتروني";
+"Scene.ConfirmEmail.OpenEmailApp.Description" = "لقد أرسلنا لك بريدًا إلكترونيًا للتو. تحقق من مجلد البريد غير الهام الخاص بك إذا لم تكن قد فعلت ذلك.";
"Scene.ConfirmEmail.OpenEmailApp.Mail" = "البريد";
-"Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Open Email Client";
-"Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox.";
-"Scene.ConfirmEmail.Subtitle" = "We just sent an email to %@,
-tap the link to confirm your account.";
+"Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "فتح عميل البريد الإلكتروني";
+"Scene.ConfirmEmail.OpenEmailApp.Title" = "تحقَّق من بريدك الوارِد.";
+"Scene.ConfirmEmail.Subtitle" = "لقد أرسلنا للتو رسالة بريد إلكتروني إلى %@،
+اضغط على الرابط لتأكيد حسابك.";
"Scene.ConfirmEmail.Title" = "شيء واحد أخير.";
-"Scene.Favorite.Title" = "Your Favorites";
-"Scene.HomeTimeline.NavigationBarState.NewPosts" = "See new posts";
+"Scene.Favorite.Title" = "مفضلتك";
+"Scene.Follower.Footer" = "لا يُمكِن عَرض المُتابِعين مِنَ الخوادم الأُخرى.";
+"Scene.Following.Footer" = "لا يُمكِن عَرض المُتابَعات مِنَ الخوادم الأُخرى.";
+"Scene.HomeTimeline.NavigationBarState.NewPosts" = "إظهار منشورات جديدة";
"Scene.HomeTimeline.NavigationBarState.Offline" = "غير متصل";
-"Scene.HomeTimeline.NavigationBarState.Published" = "Published!";
-"Scene.HomeTimeline.NavigationBarState.Publishing" = "Publishing post...";
+"Scene.HomeTimeline.NavigationBarState.Published" = "تم نشره!";
+"Scene.HomeTimeline.NavigationBarState.Publishing" = "جارٍ نشر المشاركة…";
"Scene.HomeTimeline.Title" = "الخيط الرئيسي";
-"Scene.Notification.Keyobard.ShowEverything" = "Show Everything";
-"Scene.Notification.Keyobard.ShowMentions" = "Show Mentions";
-"Scene.Notification.Title.Everything" = "Everything";
-"Scene.Notification.Title.Mentions" = "Mentions";
-"Scene.Notification.UserFavorited Your Post" = "%@ favorited your post";
-"Scene.Notification.UserFollowedYou" = "%@ followed you";
-"Scene.Notification.UserMentionedYou" = "%@ mentioned you";
-"Scene.Notification.UserRebloggedYourPost" = "%@ reblogged your post";
-"Scene.Notification.UserRequestedToFollowYou" = "%@ requested to follow you";
-"Scene.Notification.UserYourPollHasEnded" = "%@ Your poll has ended";
-"Scene.Preview.Keyboard.ClosePreview" = "إغلاق المعاينة";
+"Scene.Notification.Keyobard.ShowEverything" = "إظهار كل شيء";
+"Scene.Notification.Keyobard.ShowMentions" = "إظهار الإشارات";
+"Scene.Notification.Title.Everything" = "الكل";
+"Scene.Notification.Title.Mentions" = "الإشارات";
+"Scene.Notification.UserFavorited Your Post" = "أضاف %@ منشورك إلى مفضلته";
+"Scene.Notification.UserFollowedYou" = "يتابعك %@";
+"Scene.Notification.UserMentionedYou" = "أشار إليك %@";
+"Scene.Notification.UserRebloggedYourPost" = "أعاد %@ تدوين مشاركتك";
+"Scene.Notification.UserRequestedToFollowYou" = "طلب %@ متابعتك";
+"Scene.Notification.UserYourPollHasEnded" = "%@ اِنتهى استطلاعُكَ للرأي";
+"Scene.Preview.Keyboard.ClosePreview" = "إغلاق المُعايَنَة";
"Scene.Preview.Keyboard.ShowNext" = "إظهار التالي";
"Scene.Preview.Keyboard.ShowPrevious" = "إظهار السابق";
"Scene.Profile.Dashboard.Followers" = "متابِع";
@@ -210,10 +215,10 @@ tap the link to confirm your account.";
"Scene.Profile.Dashboard.Posts" = "منشورات";
"Scene.Profile.Fields.AddRow" = "إضافة صف";
"Scene.Profile.Fields.Placeholder.Content" = "المحتوى";
-"Scene.Profile.Fields.Placeholder.Label" = "Label";
-"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUsre.Message" = "Confirm to unblock %@";
+"Scene.Profile.Fields.Placeholder.Label" = "التسمية";
+"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUsre.Message" = "أكِّد لرفع حظر %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUsre.Title" = "إلغاء حظر الحساب";
-"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "Confirm to unmute %@";
+"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "أكِّد لرفع كتمْ %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Title" = "إلغاء كتم الحساب";
"Scene.Profile.SegmentedControl.Media" = "وسائط";
"Scene.Profile.SegmentedControl.Posts" = "منشورات";
@@ -224,20 +229,20 @@ tap the link to confirm your account.";
"Scene.Register.Error.Item.Password" = "الكلمة السرية";
"Scene.Register.Error.Item.Reason" = "السبب";
"Scene.Register.Error.Item.Username" = "اسم المستخدم";
-"Scene.Register.Error.Reason.Accepted" = "%@ must be accepted";
-"Scene.Register.Error.Reason.Blank" = "%@ is required";
-"Scene.Register.Error.Reason.Blocked" = "%@ contains a disallowed email provider";
-"Scene.Register.Error.Reason.Inclusion" = "%@ is not a supported value";
-"Scene.Register.Error.Reason.Invalid" = "%@ is invalid";
-"Scene.Register.Error.Reason.Reserved" = "%@ is a reserved keyword";
-"Scene.Register.Error.Reason.Taken" = "%@ is already in use";
-"Scene.Register.Error.Reason.TooLong" = "%@ is too long";
-"Scene.Register.Error.Reason.TooShort" = "%@ is too short";
-"Scene.Register.Error.Reason.Unreachable" = "%@ does not seem to exist";
-"Scene.Register.Error.Special.EmailInvalid" = "This is not a valid email address";
-"Scene.Register.Error.Special.PasswordTooShort" = "Password is too short (must be at least 8 characters)";
-"Scene.Register.Error.Special.UsernameInvalid" = "Username must only contain alphanumeric characters and underscores";
-"Scene.Register.Error.Special.UsernameTooLong" = "Username is too long (can’t be longer than 30 characters)";
+"Scene.Register.Error.Reason.Accepted" = "يجب أن يُقبل %@";
+"Scene.Register.Error.Reason.Blank" = "%@ مطلوب";
+"Scene.Register.Error.Reason.Blocked" = "يحتوي %@ على موفِّر خدمة بريد إلكتروني غير مسموح به";
+"Scene.Register.Error.Reason.Inclusion" = "إنَّ %@ قيمة غير مدعومة";
+"Scene.Register.Error.Reason.Invalid" = "%@ غير صالح";
+"Scene.Register.Error.Reason.Reserved" = "إنَّ %@ عبارة عن كلمة مفتاحيَّة محجوزة";
+"Scene.Register.Error.Reason.Taken" = "إنَّ %@ مُستخدَمٌ بالفعل";
+"Scene.Register.Error.Reason.TooLong" = "%@ طويل جداً";
+"Scene.Register.Error.Reason.TooShort" = "%@ قصير جدا";
+"Scene.Register.Error.Reason.Unreachable" = "يبدوا أنَّ %@ غير موجود";
+"Scene.Register.Error.Special.EmailInvalid" = "هذا عنوان بريد إلكتروني غير صالح";
+"Scene.Register.Error.Special.PasswordTooShort" = "كلمة المرور قصيرة جداً (يجب أن تكون 8 أحرف على الأقل)";
+"Scene.Register.Error.Special.UsernameInvalid" = "يُمكِن أن يحتوي اسم المستخدم على أحرف أبجدية، أرقام وشرطات سفلية فقط";
+"Scene.Register.Error.Special.UsernameTooLong" = "اسم المستخدم طويل جداً (يجب ألّا يكون أطول من 30 رمز)";
"Scene.Register.Input.Avatar.Delete" = "احذف";
"Scene.Register.Input.DisplayName.Placeholder" = "الاسم المعروض";
"Scene.Register.Input.Email.Placeholder" = "البريد الإلكتروني";
@@ -247,32 +252,32 @@ tap the link to confirm your account.";
"Scene.Register.Input.Username.DuplicatePrompt" = "اسم المستخدم هذا غير متوفر.";
"Scene.Register.Input.Username.Placeholder" = "اسم المستخدم";
"Scene.Register.Title" = "أخبرنا عنك.";
-"Scene.Report.Content1" = "Are there any other posts you’d like to add to the report?";
-"Scene.Report.Content2" = "Is there anything the moderators should know about this report?";
-"Scene.Report.Send" = "Send Report";
-"Scene.Report.SkipToSend" = "Send without comment";
+"Scene.Report.Content1" = "هل ترغب في إضافة أي مشاركات أُخرى إلى الشكوى؟";
+"Scene.Report.Content2" = "هل هناك أي شيء يجب أن يعرفه المُراقبين حول هذه الشكوى؟";
+"Scene.Report.Send" = "إرسال الشكوى";
+"Scene.Report.SkipToSend" = "إرسال بدون تعليق";
"Scene.Report.Step1" = "الخطوة 1 من 2";
"Scene.Report.Step2" = "الخطوة 2 من 2";
-"Scene.Report.TextPlaceholder" = "Type or paste additional comments";
+"Scene.Report.TextPlaceholder" = "اكتب أو الصق تعليقات إضافيَّة";
"Scene.Report.Title" = "ابلغ عن %@";
-"Scene.Search.Recommend.Accounts.Description" = "You may like to follow these accounts";
+"Scene.Search.Recommend.Accounts.Description" = "قد ترغب في متابعة هذه الحسابات";
"Scene.Search.Recommend.Accounts.Follow" = "تابع";
-"Scene.Search.Recommend.Accounts.Title" = "Accounts you might like";
+"Scene.Search.Recommend.Accounts.Title" = "حسابات قد تعجبك";
"Scene.Search.Recommend.ButtonText" = "طالع الكل";
-"Scene.Search.Recommend.HashTag.Description" = "Hashtags that are getting quite a bit of attention";
-"Scene.Search.Recommend.HashTag.PeopleTalking" = "%@ people are talking";
+"Scene.Search.Recommend.HashTag.Description" = "الوسوم التي تحظى بقدر كبير من الاهتمام";
+"Scene.Search.Recommend.HashTag.PeopleTalking" = "%@ أشخاص يتحدَّثوا";
"Scene.Search.Recommend.HashTag.Title" = "ذات شعبية على ماستدون";
"Scene.Search.SearchBar.Cancel" = "إلغاء";
"Scene.Search.SearchBar.Placeholder" = "البحث عن وسوم أو مستخدمين·ات";
-"Scene.Search.Searching.Clear" = "Clear";
-"Scene.Search.Searching.EmptyState.NoResults" = "No results";
-"Scene.Search.Searching.RecentSearch" = "Recent searches";
+"Scene.Search.Searching.Clear" = "مَحو";
+"Scene.Search.Searching.EmptyState.NoResults" = "ليس هناك أية نتيجة";
+"Scene.Search.Searching.RecentSearch" = "عمليات البحث الأخيرة";
"Scene.Search.Searching.Segment.All" = "الكل";
"Scene.Search.Searching.Segment.Hashtags" = "الوسوم";
"Scene.Search.Searching.Segment.People" = "الأشخاص";
"Scene.Search.Searching.Segment.Posts" = "المنشورات";
"Scene.Search.Title" = "بحث";
-"Scene.ServerPicker.Button.Category.Academia" = "academia";
+"Scene.ServerPicker.Button.Category.Academia" = "أكاديمي";
"Scene.ServerPicker.Button.Category.Activism" = "للنشطاء";
"Scene.ServerPicker.Button.Category.All" = "الكل";
"Scene.ServerPicker.Button.Category.AllAccessiblityDescription" = "الفئة: الكل";
@@ -282,59 +287,62 @@ tap the link to confirm your account.";
"Scene.ServerPicker.Button.Category.Games" = "ألعاب";
"Scene.ServerPicker.Button.Category.General" = "عام";
"Scene.ServerPicker.Button.Category.Journalism" = "صحافة";
-"Scene.ServerPicker.Button.Category.Lgbt" = "lgbt";
+"Scene.ServerPicker.Button.Category.Lgbt" = "مجتمع الشواذ";
"Scene.ServerPicker.Button.Category.Music" = "موسيقى";
"Scene.ServerPicker.Button.Category.Regional" = "اقليمي";
"Scene.ServerPicker.Button.Category.Tech" = "تكنولوجيا";
"Scene.ServerPicker.Button.SeeLess" = "اعرض أقل";
"Scene.ServerPicker.Button.SeeMore" = "اعرض المزيد";
-"Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection.";
+"Scene.ServerPicker.EmptyState.BadNetwork" = "حدث خطأٌ ما أثناء تحميل البيانات. تحقَّق من اتصالك بالإنترنت.";
"Scene.ServerPicker.EmptyState.FindingServers" = "البحث عن خوادم متوفرة...";
"Scene.ServerPicker.EmptyState.NoResults" = "لا توجد نتائج";
"Scene.ServerPicker.Input.Placeholder" = "ابحث عن خادم أو انضم إلى سيرفر خاص بك...";
"Scene.ServerPicker.Label.Category" = "الفئة";
"Scene.ServerPicker.Label.Language" = "اللغة";
"Scene.ServerPicker.Label.Users" = "مستخدمون·ات";
-"Scene.ServerPicker.Title" = "Pick a server,
-any server.";
+"Scene.ServerPicker.Title" = "اِختر خادِم،
+أي خادِم.";
"Scene.ServerRules.Button.Confirm" = "انا أوافق";
"Scene.ServerRules.PrivacyPolicy" = "سياسة الخصوصية";
-"Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@.";
-"Scene.ServerRules.Subtitle" = "These rules are set by the admins of %@.";
+"Scene.ServerRules.Prompt" = "إن اخترت المواصلة، فإنك تخضع لشروط الخدمة وسياسة الخصوصية لـ %@.";
+"Scene.ServerRules.Subtitle" = "تم سنّ هذه القواعد من قبل مشرفي %@.";
"Scene.ServerRules.TermsOfService" = "شروط الخدمة";
-"Scene.ServerRules.Title" = "Some ground rules.";
-"Scene.Settings.Footer.MastodonDescription" = "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء، على غيت هب %@ (%@)";
+"Scene.ServerRules.Title" = "بعض القواعد الأساسية.";
+"Scene.Settings.Footer.MastodonDescription" = "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء على GitHub في %@ (%@)";
"Scene.Settings.Keyboard.CloseSettingsWindow" = "إغلاق نافذة الإعدادات";
"Scene.Settings.Section.Appearance.Automatic" = "تلقائي";
-"Scene.Settings.Section.Appearance.Dark" = "Always Dark";
-"Scene.Settings.Section.Appearance.Light" = "Always Light";
+"Scene.Settings.Section.Appearance.Dark" = "مظلمٌ دائِمًا";
+"Scene.Settings.Section.Appearance.Light" = "مضيءٌ دائمًا";
"Scene.Settings.Section.Appearance.Title" = "المظهر";
"Scene.Settings.Section.BoringZone.AccountSettings" = "إعدادات الحساب";
"Scene.Settings.Section.BoringZone.Privacy" = "سياسة الخصوصية";
"Scene.Settings.Section.BoringZone.Terms" = "شروط الخدمة";
-"Scene.Settings.Section.BoringZone.Title" = "The Boring Zone";
-"Scene.Settings.Section.Notifications.Boosts" = "Reblogs my post";
-"Scene.Settings.Section.Notifications.Favorites" = "Favorites my post";
-"Scene.Settings.Section.Notifications.Follows" = "Follows me";
-"Scene.Settings.Section.Notifications.Mentions" = "Mentions me";
+"Scene.Settings.Section.BoringZone.Title" = "المنطقة المملة";
+"Scene.Settings.Section.Notifications.Boosts" = "إعادة تدوين منشوراتي";
+"Scene.Settings.Section.Notifications.Favorites" = "الإعجاب بِمنشوراتي";
+"Scene.Settings.Section.Notifications.Follows" = "يتابعني";
+"Scene.Settings.Section.Notifications.Mentions" = "الإشارة لي";
"Scene.Settings.Section.Notifications.Title" = "الإشعارات";
-"Scene.Settings.Section.Notifications.Trigger.Anyone" = "anyone";
-"Scene.Settings.Section.Notifications.Trigger.Follow" = "anyone I follow";
-"Scene.Settings.Section.Notifications.Trigger.Follower" = "a follower";
-"Scene.Settings.Section.Notifications.Trigger.Noone" = "no one";
-"Scene.Settings.Section.Notifications.Trigger.Title" = "Notify me when";
-"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Disable animated avatars";
-"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Disable animated emojis";
+"Scene.Settings.Section.Notifications.Trigger.Anyone" = "أي شخص";
+"Scene.Settings.Section.Notifications.Trigger.Follow" = "أي شخص أُتابِعُه";
+"Scene.Settings.Section.Notifications.Trigger.Follower" = "مشترِك";
+"Scene.Settings.Section.Notifications.Trigger.Noone" = "لا أحد";
+"Scene.Settings.Section.Notifications.Trigger.Title" = "إشعاري عِندَ";
+"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "تعطيل الصور الرمزية المتحرِّكة";
+"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "تعطيل الرموز التعبيرية المتحرِّكَة";
"Scene.Settings.Section.Preference.Title" = "التفضيلات";
-"Scene.Settings.Section.Preference.TrueBlackDarkMode" = "True black dark mode";
-"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Use default browser to open links";
-"Scene.Settings.Section.SpicyZone.Clear" = "Clear Media Cache";
+"Scene.Settings.Section.Preference.TrueBlackDarkMode" = "النمط الأسود الداكِن الحقيقي";
+"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "اِستخدام المتصفح الافتراضي لفتح الروابط";
+"Scene.Settings.Section.SpicyZone.Clear" = "مسح ذاكرة التخزين المؤقت للوسائط";
"Scene.Settings.Section.SpicyZone.Signout" = "تسجيل الخروج";
-"Scene.Settings.Section.SpicyZone.Title" = "The Spicy Zone";
+"Scene.Settings.Section.SpicyZone.Title" = "المنطقة الحارة";
"Scene.Settings.Title" = "الإعدادات";
-"Scene.SuggestionAccount.FollowExplain" = "When you follow someone, you’ll see their posts in your home feed.";
-"Scene.SuggestionAccount.Title" = "Find People to Follow";
-"Scene.Thread.BackTitle" = "Post";
-"Scene.Thread.Title" = "Post from %@";
-"Scene.Welcome.Slogan" = "Social networking
-back in your hands.";
\ No newline at end of file
+"Scene.SuggestionAccount.FollowExplain" = "عِندَ مُتابَعَتِكَ لأحدِهِم، سَوف تَرى مَنشوراته في تغذيَتِكَ الرئيسة.";
+"Scene.SuggestionAccount.Title" = "ابحث عن أشخاص لمتابعتهم";
+"Scene.Thread.BackTitle" = "منشور";
+"Scene.Thread.Title" = "مَنشور مِن %@";
+"Scene.Welcome.Slogan" = "شبكات التواصل الاجتماعي
+مرة أُخرى بين يديك.";
+"Scene.Wizard.AccessibilityHint" = "انقر نقرًا مزدوجًا لتجاهل النافذة المنبثقة";
+"Scene.Wizard.MultipleAccountSwitchIntroDescription" = "بدِّل بين حسابات متعددة عبر الاستمرار بالضغط على زر الملف الشخصي.";
+"Scene.Wizard.NewInMastodon" = "جديد في ماستودون";
\ No newline at end of file
diff --git a/Mastodon/Resources/ar.lproj/Localizable.stringsdict b/Mastodon/Resources/ar.lproj/Localizable.stringsdict
index 537064efb..0b28c577a 100644
--- a/Mastodon/Resources/ar.lproj/Localizable.stringsdict
+++ b/Mastodon/Resources/ar.lproj/Localizable.stringsdict
@@ -2,10 +2,34 @@
+ a11y.plural.count.unread.notification
+
+ NSStringLocalizedFormatKey
+ %#@notification_count_unread_notification@
+ notification_count_unread_notification
+
+