diff --git a/ClientKit/Sources/ClientKit/Client+Timeline.swift b/ClientKit/Sources/ClientKit/Client+Timeline.swift index e70305c..48044ac 100644 --- a/ClientKit/Sources/ClientKit/Client+Timeline.swift +++ b/ClientKit/Sources/ClientKit/Client+Timeline.swift @@ -13,7 +13,7 @@ extension Client { sinceId: String? = nil, minId: String? = nil, limit: Int = 40, - includeReblogs: Bool? = nil) async throws -> [Status] { + includeReblogs: Bool? = nil) async throws -> Linkable<[Status]> { return try await pixelfedClient.getHomeTimeline(maxId: maxId, sinceId: sinceId, minId: minId, limit: limit, includeReblogs: includeReblogs) } @@ -22,7 +22,7 @@ extension Client { maxId: String? = nil, sinceId: String? = nil, minId: String? = nil, - limit: Int = 40) async throws -> [Status] { + limit: Int = 40) async throws -> Linkable<[Status]> { return try await pixelfedClient.getPublicTimeline(local: local, remote: remote, onlyMedia: true, @@ -38,7 +38,7 @@ extension Client { maxId: String? = nil, sinceId: String? = nil, minId: String? = nil, - limit: Int = 40) async throws -> [Status] { + limit: Int = 40) async throws -> Linkable<[Status]> { return try await pixelfedClient.getTagTimeline(tag: tag, local: local, remote: remote, diff --git a/CoreData/AccountDataHandler.swift b/CoreData/AccountDataHandler.swift index b1c382f..c56d229 100644 --- a/CoreData/AccountDataHandler.swift +++ b/CoreData/AccountDataHandler.swift @@ -64,7 +64,7 @@ class AccountDataHandler { } } - func update(lastSeenStatusId: String?, lastLoadedStatusId: String?, statuses: [Status]? = nil, applicationState: ApplicationState, modelContext: ModelContext) throws { + func update(lastSeenStatusId: String?, lastLoadedStatusId: String?, statuses: Linkable<[Status]>? = nil, applicationState: ApplicationState, modelContext: ModelContext) throws { guard let accountId = applicationState.account?.id else { return } diff --git a/CoreData/ViewedStatusHandler.swift b/CoreData/ViewedStatusHandler.swift index e29e11d..9339e1d 100644 --- a/CoreData/ViewedStatusHandler.swift +++ b/CoreData/ViewedStatusHandler.swift @@ -44,13 +44,13 @@ class ViewedStatusHandler { let statusId = status.id var fetchDescriptor = FetchDescriptor( - // Here we are finding status which is other then checked status AND orginal status has been visible OR same reblogged by different user status has been visible. - predicate: #Predicate { $0.pixelfedAccount?.id == accountId && $0.id != statusId && ($0.id == reblogId || $0.reblogId == reblogId) } + // Here we are finding status which is older then checked status AND orginal status has been visible OR same reblogged by different user status has been visible. + predicate: #Predicate { $0.pixelfedAccount?.id == accountId && $0.id < statusId && ($0.id == reblogId || $0.reblogId == reblogId) } ) fetchDescriptor.fetchLimit = 1 fetchDescriptor.includePendingChanges = true - guard let first = try modelContext.fetch(fetchDescriptor).first else { + guard try modelContext.fetch(fetchDescriptor).first != nil else { return false } diff --git a/Localization/Localizable.xcstrings b/Localization/Localizable.xcstrings index a818757..1c8a332 100644 --- a/Localization/Localizable.xcstrings +++ b/Localization/Localizable.xcstrings @@ -3,6 +3,12 @@ "strings" : { "" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -31,6 +37,12 @@ }, "@%@" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "@%@" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -59,6 +71,12 @@ }, "@mczachurski" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "@mczachurski" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -87,6 +105,12 @@ }, "@vernissage" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "@vernissage" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -115,6 +139,12 @@ }, "#%@" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -143,6 +173,12 @@ }, "%@ (%@)" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ (%2$@)" + } + }, "en" : { "stringUnit" : { "state" : "new", @@ -177,6 +213,12 @@ }, "%lld" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -205,6 +247,12 @@ }, "%lld/%lld" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld/%2$lld" + } + }, "en" : { "stringUnit" : { "state" : "new", @@ -237,9 +285,49 @@ } } }, + "+99" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "+99" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "+99" + } + }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "+99" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "+99" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "+99" + } + } + } + }, "accounts.error.loadingAccountsFailed" : { "comment" : "Information message when loading account failed", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laden der Konten fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -275,6 +363,12 @@ "accounts.navigationBar.blocked" : { "comment" : "Blocked", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blockierte Benutzer" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -310,6 +404,12 @@ "accounts.navigationBar.disabledBoosts" : { "comment" : "Disabled boosts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Deaktivierte Boosts" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -322,6 +422,18 @@ "value" : "Potenciadores desactivados" } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ezgaitutako bultzadak" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boosters désactivés" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -333,6 +445,12 @@ "accounts.navigationBar.favouritedBy" : { "comment" : "Favourited by", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorisiert von" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -368,6 +486,12 @@ "accounts.navigationBar.followers" : { "comment" : "Followers", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Follower" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -403,6 +527,12 @@ "accounts.navigationBar.following" : { "comment" : "Following", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "werden gefolgt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -438,6 +568,12 @@ "accounts.navigationBar.mutes" : { "comment" : "Mutes", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stummgeschaltete Benutzer" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -473,6 +609,12 @@ "accounts.navigationBar.reboostedBy" : { "comment" : "Reboosted by", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Geboostet von" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -507,6 +649,12 @@ }, "accounts.title.noAccounts" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hier ist leider niemand." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -541,6 +689,12 @@ }, "compose.error.postingPhotoFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Veröffentlichen des Fotos." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -576,6 +730,12 @@ "compose.navigationBar.title" : { "comment" : " Compose view.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beitrag erstellen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -610,6 +770,12 @@ }, "editProfile.error.loadingAccountFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Laden des Profils vom Server." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -644,6 +810,12 @@ }, "editProfile.error.loadingAvatarFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konnte Avatar nicht laden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -678,6 +850,12 @@ }, "editProfile.error.noProfileData" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profildaten können nicht angezeigt werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -712,6 +890,12 @@ }, "editProfile.error.saveAccountFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konnte Profil nicht speichern." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -747,6 +931,12 @@ "editProfile.navigationBar.title" : { "comment" : "Edit profile.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil bearbeiten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -781,6 +971,12 @@ }, "editProfile.title.accountSaved" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil wurde aktualisiert." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -816,6 +1012,12 @@ "editProfile.title.bio" : { "comment" : "Bio", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Biografie" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -851,6 +1053,12 @@ "editProfile.title.displayName" : { "comment" : "Display name", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anzeigename" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -885,6 +1093,12 @@ }, "editProfile.title.photoInfo" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das geänderte Profilbild wird mit einer kurzen Verzögerung in der App und auf der Webseite sichtbar sein." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -919,6 +1133,12 @@ }, "editProfile.title.privateAccount" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Privater Account" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -954,6 +1174,12 @@ "editProfile.title.privateAccountInfo" : { "comment" : "Private account info", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wenn Dein Account privat ist, können nur Nutzer die Du bestätigst Deine Fotos und Videos auf Pixelfed sehen. Benutzer, die Dir jetzt schon folgen, sind nicht betroffen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -989,6 +1215,12 @@ "editProfile.title.save" : { "comment" : "Save", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Speichern" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1024,6 +1256,12 @@ "editProfile.title.website" : { "comment" : "Website", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Webseite" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1058,6 +1296,12 @@ }, "followingRequests.error.approve" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Bestätigen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1092,6 +1336,12 @@ }, "followingRequests.error.reject" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Ablehnen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1127,6 +1377,12 @@ "followingRequests.navigationBar.title" : { "comment" : "Following requests.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgeanfragen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1161,6 +1417,12 @@ }, "followingRequests.title.approve" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bestätigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1195,6 +1457,12 @@ }, "followingRequests.title.reject" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ablehnen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1230,6 +1498,12 @@ "global.error.accessTokenNotFound" : { "comment" : "Access token is not saved in account model.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zugangstoken nicht gefunden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1250,7 +1524,7 @@ }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Le jeton d'accès n'est pas trouvé." } }, @@ -1264,6 +1538,12 @@ }, "global.error.avatarHasNotBeenDownloaded" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Avatar wurde noch nicht heruntergeladen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1276,6 +1556,18 @@ "value" : "Avatar no se ha descargado." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abatarra ez da deskargatu." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'avatar n'a pas été téléchargé." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1287,6 +1579,12 @@ "global.error.badUrlServer" : { "comment" : "User enter bad URL to server.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ungültige Server-URL." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1321,6 +1619,12 @@ }, "global.error.cannotConfigureTransactionListener" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Der Transaktions-Listener kann nicht konfiguriert werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1333,6 +1637,18 @@ "value" : "No se puede configurar el receptor de transacciones." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ezin da transakzio-entzulea konfiguratu." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Impossible de configurer l'auditeur de transactions." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1343,6 +1659,12 @@ }, "global.error.cannotDownloadInAppProducts" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "In-App-Produkte können nicht heruntergeladen werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1355,6 +1677,18 @@ "value" : "No se pueden descargar productos in-app." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ezin dira aplikazioko produktuak deskargatu." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossible de télécharger des produits in-app." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1365,6 +1699,12 @@ }, "global.error.errorDuringDataLoad" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laden von Daten fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1399,6 +1739,12 @@ }, "global.error.errorDuringDownloadHashtag" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Laden des Hashtags vom Server." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1433,6 +1779,12 @@ }, "global.error.errorDuringDownloadingMetadata" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Herunterladen von Metadaten." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1445,6 +1797,18 @@ "value" : "Error durante la descarga de metadatos." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errorea metadatuak deskargatzean." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Erreur lors du téléchargement des métadonnées." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1455,6 +1819,12 @@ }, "global.error.errorDuringDownloadingNewStatuses" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Fehler beim Herunterladen neuer Status für die Menge der neuen Status." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1467,6 +1837,18 @@ "value" : "Error durante la descarga de nuevos estados para la cantidad de nuevos estados." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errorea egoera berriak deskargatzean, kopurua dela-eta." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Erreur lors du téléchargement des nouveaux statuts pour le nombre de nouveaux statuts." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1478,6 +1860,12 @@ "global.error.errorDuringDownloadStatus" : { "comment" : "Status cannot be downloaded from server.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Laden vom Server." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1512,6 +1900,12 @@ }, "global.error.errorDuringDownloadStatuses" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Laden der Beiträge vom Server." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1547,6 +1941,12 @@ "global.error.errorDuringImageDownload" : { "comment" : "Cannot download image", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bild kann nicht geladen werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1582,6 +1982,12 @@ "global.error.errorDuringPurchaseVerification" : { "comment" : "Something went wrong during purchase verification.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konnte Einkauf nicht verifizieren." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1617,6 +2023,12 @@ "global.error.errorDuringUserRead" : { "comment" : "User acount cannot be downloaded from Core Data.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzer kann nicht geladen werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1651,6 +2063,12 @@ }, "global.error.hashtagNotExists" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hashtag existiert nicht." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1685,6 +2103,12 @@ }, "global.error.purchaseFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Der Kauf ist gescheitert." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1697,6 +2121,18 @@ "value" : "Compra fallida." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erosketak huts egin du." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "L'achat a échoué." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1707,6 +2143,12 @@ }, "global.error.refreshingCredentialsSubtitle" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bitte erneut in Pixelfed einloggen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1741,6 +2183,12 @@ }, "global.error.refreshingCredentialsTitle" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zugangsdaten konnten nicht bestätigt werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1775,6 +2223,12 @@ }, "global.error.refreshTokenFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Aktualisierungs-Token fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1787,6 +2241,18 @@ "value" : "Error en la recarga." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ezin izan da tokena freskatu." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Le jeton de rafraîchissement a échoué." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1798,6 +2264,12 @@ "global.title.close" : { "comment" : "Close", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schließen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1833,6 +2305,12 @@ "global.title.more" : { "comment" : "more...", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "mehr..." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1845,6 +2323,18 @@ "value" : "más..." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "gehiago..." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "plus..." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1855,10 +2345,16 @@ }, "global.title.newAccessTokenRetrieved" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Es wurden neue Zugangstoken abgerufen." + } + }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "New access tokens has been retrieved." + "value" : "New access tokens have been retrieved." } }, "es" : { @@ -1867,6 +2363,18 @@ "value" : "Se han recuperado nuevos tokens de acceso." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sarbide-token berria berreskuratu da." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "De nouveaux jetons d'accès ont été récupérés." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -1878,6 +2386,12 @@ "global.title.ok" : { "comment" : "OK", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1913,6 +2427,12 @@ "global.title.photoSaved" : { "comment" : "Photo has been saved", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Foto wurde gespeichert." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1948,6 +2468,12 @@ "global.title.success" : { "comment" : "Success", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erfolgreich" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1983,6 +2509,12 @@ "home.title.allCaughtUp" : { "comment" : "You're all caught up", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das war’s, alles gesehen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2017,6 +2549,12 @@ }, "instance.error.loadingDataFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Laden der Instanzdaten vom Server." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2051,6 +2589,12 @@ }, "instance.error.noInstanceData" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Instanzdaten können nicht angezeigt werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2086,6 +2630,12 @@ "instance.navigationBar.title" : { "comment" : "Instance information.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Instanz" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2120,6 +2670,12 @@ }, "instance.title.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Addresse" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2154,6 +2710,12 @@ }, "instance.title.approvalRequired" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bestätigung erforderlich" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2188,6 +2750,12 @@ }, "instance.title.contact" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontact" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2222,6 +2790,12 @@ }, "instance.title.domains" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Domains" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2256,6 +2830,12 @@ }, "instance.title.email" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "E-Mail" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2290,6 +2870,12 @@ }, "instance.title.instanceInfo" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Instanzinfo" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2324,6 +2910,12 @@ }, "instance.title.name" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Name" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2359,6 +2951,12 @@ "instance.title.pixelfedAccount" : { "comment" : "Pixelfed account", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pixelfed-Konto" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2393,6 +2991,12 @@ }, "instance.title.posts" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beiträge" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2427,6 +3031,12 @@ }, "instance.title.registrations" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registrierungen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2461,6 +3071,12 @@ }, "instance.title.rules" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Instanzregeln" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2495,6 +3111,12 @@ }, "instance.title.users" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzer" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2529,6 +3151,12 @@ }, "instance.title.version" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2564,6 +3192,12 @@ "mainview.error.switchAccounts" : { "comment" : "Cannot switch accounts.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konnte Benutzer nicht wechseln." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2599,6 +3233,12 @@ "mainview.menu.settings" : { "comment" : "Main view (leading navigation bar).", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einstellungen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2633,6 +3273,12 @@ }, "mainview.tab.federatedTimeline" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Föderiert" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2668,6 +3314,12 @@ "mainview.tab.homeTimeline" : { "comment" : "Main view (main navigation bar).", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zuhause" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2702,6 +3354,12 @@ }, "mainview.tab.localTimeline" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lokal" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2736,6 +3394,12 @@ }, "mainview.tab.notifications" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benachrichtigungen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2770,6 +3434,12 @@ }, "mainview.tab.search" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suche" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2805,6 +3475,12 @@ "mainview.tab.trending" : { "comment" : "Trending menu section", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Im Trend" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2839,6 +3515,12 @@ }, "mainview.tab.trendingAccounts" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzer" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2873,6 +3555,12 @@ }, "mainview.tab.trendingPhotos" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fotos" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2907,6 +3595,12 @@ }, "mainview.tab.trendingTags" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hashtags" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2941,6 +3635,12 @@ }, "mainview.tab.userProfile" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -2975,6 +3675,12 @@ }, "notifications.error.loadingNotificationsFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benachrichtigungen konnten nicht geladen werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3010,6 +3716,12 @@ "notifications.navigationBar.title" : { "comment" : "Notifications view.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benachrichtigungen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3044,6 +3756,12 @@ }, "notifications.title.boosted" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "geboostet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3078,6 +3796,12 @@ }, "notifications.title.favourited" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorisiert" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3112,6 +3836,12 @@ }, "notifications.title.followedYou" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "folgt Dir" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3146,6 +3876,12 @@ }, "notifications.title.followRequest" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgeanfrage" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3180,6 +3916,12 @@ }, "notifications.title.mentionedYou" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "hat Dich erwähnt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3214,6 +3956,12 @@ }, "notifications.title.newReport" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "neue Meldung" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3248,6 +3996,12 @@ }, "notifications.title.noNotifications" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hier ist leider nichts." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3282,6 +4036,12 @@ }, "notifications.title.poll" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Umfrage" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3316,6 +4076,12 @@ }, "notifications.title.postedStatus" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beitrag veröffentlicht" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3350,6 +4116,12 @@ }, "notifications.title.signedUp" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "registriert" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3384,6 +4156,12 @@ }, "notifications.title.updatedStatus" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beitrag bearbeitet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3419,6 +4197,12 @@ "purchase.cake.description" : { "extractionState" : "manual", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lade mich zu Kaffee und Kuchen ein." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3454,6 +4238,12 @@ "purchase.cake.title" : { "extractionState" : "manual", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kaffee und Kuchen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3489,6 +4279,12 @@ "purchase.coffee.description" : { "extractionState" : "manual", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gib mir einen Kaffee." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3524,6 +4320,12 @@ "purchase.coffee.title" : { "extractionState" : "manual", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kaffee" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3559,6 +4361,12 @@ "purchase.donut.description" : { "extractionState" : "manual", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gib mir einen Donut aus." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3595,6 +4403,12 @@ "comment" : "In-app purchases.", "extractionState" : "manual", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Donut" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3629,6 +4443,12 @@ }, "report.error.notReported" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Melden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3664,6 +4484,12 @@ "report.navigationBar.title" : { "comment" : "Report screen.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Melden" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3698,6 +4524,12 @@ }, "report.title.abusive" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hassrede oder Symbole" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3733,6 +4565,12 @@ "report.title.close" : { "comment" : "Close", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schließen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3767,6 +4605,12 @@ }, "report.title.copyright" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Urheberrechtsverletzung" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3801,6 +4645,12 @@ }, "report.title.impersonation" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Identitätsdiebstahl" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3835,6 +4685,12 @@ }, "report.title.postReported" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beitrag wurde gemeldet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3869,6 +4725,12 @@ }, "report.title.reportType" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Art des Missbrauchs" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3903,6 +4765,12 @@ }, "report.title.scam" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beleidigung" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3938,6 +4806,12 @@ "report.title.send" : { "comment" : "Send", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Senden" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -3972,6 +4846,12 @@ }, "report.title.sensitive" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nacktheit oder Sex" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4006,6 +4886,12 @@ }, "report.title.spam" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spam" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4040,6 +4926,12 @@ }, "report.title.terrorism" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terrorismus" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4074,6 +4966,12 @@ }, "report.title.underage" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Minderjähriger Benutzer" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4108,6 +5006,12 @@ }, "report.title.userReported" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzer wurde gemeldet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4142,6 +5046,12 @@ }, "report.title.violence" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gewalt oder gefährliche Organisationen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4177,6 +5087,12 @@ "search.navigationBar.title" : { "comment" : "Search view.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suche" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4212,6 +5128,12 @@ "search.title.goToHashtag" : { "comment" : "Go to hashtag ", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gehe zu Hashtag %@" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4247,6 +5169,12 @@ "search.title.goToUser" : { "comment" : "Go to user ", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gehe zu Nutzer %@" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4282,6 +5210,12 @@ "search.title.hashtagWith" : { "comment" : "Hashtags with ", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hashtags mit %@" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4316,6 +5250,12 @@ }, "search.title.placeholder" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suche..." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4351,6 +5291,12 @@ "search.title.usersWith" : { "comment" : "Users with ", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nutzer mit %@" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4385,12 +5331,36 @@ }, "settings.error.notificationEnableFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler bei der Aktivierung von Benachrichtigungen." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Error during enabling notifications." } }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Error al activar las notificaciones." + } + }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errorea jakinarazpenak gaitzean." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Erreur lors de l'activation des notifications." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -4402,6 +5372,12 @@ "settings.navigationBar.title" : { "comment" : "Settings view.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einstellungen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4436,6 +5412,12 @@ }, "settings.title.accent" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akzent" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4470,6 +5452,12 @@ }, "settings.title.accounts" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4505,6 +5493,12 @@ "settings.title.alwaysShowAltDescription" : { "comment" : "Show alternative text if present on status details screen", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "ALT-Text in der Detailansicht anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4540,6 +5534,12 @@ "settings.title.alwaysShowAltTitle" : { "comment" : "Show alternative text", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "ALT-Text anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4575,6 +5575,12 @@ "settings.title.alwaysShowSensitiveDescription" : { "comment" : "Force show all NFSW (sensitive) media without warnings", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anstößige Inhalte immer ohne Warnung anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4610,6 +5616,12 @@ "settings.title.alwaysShowSensitiveTitle" : { "comment" : "Always show NSFW", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anstößige Inhalte immer zeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4645,6 +5657,12 @@ "settings.title.applicationIcon" : { "comment" : "Application icon", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "App-Icon" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4679,6 +5697,12 @@ }, "settings.title.avatar" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avatar" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4713,6 +5737,12 @@ }, "settings.title.bottomLeftMenu" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unten links" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4747,6 +5777,12 @@ }, "settings.title.bottomRightMenu" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unten rechts" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4782,6 +5818,12 @@ "settings.title.circle" : { "comment" : "Circle", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kreis" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4817,6 +5859,12 @@ "settings.title.close" : { "comment" : "Close", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schließen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4851,6 +5899,12 @@ }, "settings.title.dark" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dunkel" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4886,6 +5940,12 @@ "settings.title.enableReboostOnTimeline" : { "comment" : "Show boosted statuses", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Erhöhte Zustände anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4921,6 +5981,12 @@ "settings.title.enableReboostOnTimelineDescription" : { "comment" : "Boosted statuses will be visible on your home timeline.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Erhöhte Status werden auf Ihrer privaten Zeitleiste angezeigt." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4956,6 +6022,12 @@ "settings.title.follow" : { "comment" : "Follow me", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folge mir" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -4991,6 +6063,12 @@ "settings.title.followVernissage" : { "comment" : "Follow Vernissage", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vernissage folgen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5025,6 +6103,12 @@ }, "settings.title.general" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generell" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5059,6 +6143,12 @@ }, "settings.title.haptics" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haptik" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5093,6 +6183,12 @@ }, "settings.title.hapticsAnimationFinished" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Animation beendet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5127,6 +6223,12 @@ }, "settings.title.hapticsButtonPress" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Knopfdruck" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5161,6 +6263,12 @@ }, "settings.title.hapticsListRefresh" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Liste aktualisieren" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5195,6 +6303,12 @@ }, "settings.title.hapticsTabSelection" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tabauswahl" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5230,6 +6344,12 @@ "settings.title.hideStatusesWithoutAlt" : { "comment" : "Hide statuses without ALT", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Status ohne ALT-Text ausblenden" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5265,6 +6385,12 @@ "settings.title.hideStatusesWithoutAltDescription" : { "comment" : "Statuses without ALT text will not be visible on your home timeline.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Statusmeldungen ohne ALT-Text werden nicht auf der eigenen Zeitleiste angezeigt." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5299,6 +6425,12 @@ }, "settings.title.light" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hell" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5334,6 +6466,12 @@ "settings.title.mastodonAccount" : { "comment" : "Mastodon account", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mastodon" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5368,6 +6506,12 @@ }, "settings.title.mediaSettings" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medieneinstellungen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5403,6 +6547,12 @@ "settings.title.menuPosition" : { "comment" : "Menu position", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Menüposition" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5438,6 +6588,12 @@ "settings.title.newAccount" : { "comment" : "New account", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neues Konto" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5472,18 +6628,36 @@ }, "settings.title.notifications" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Benachrichtigungen" + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Notifications" } }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Notificaciones" + } + }, "eu" : { "stringUnit" : { "state" : "translated", "value" : "Jakinarazpenak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notifications" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -5495,16 +6669,34 @@ "settings.title.notificationsDescription" : { "comment" : "Application badge with amount of new notifications will be visible near the app icon.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Der Anwendungs-Badge mit der Anzahl der neuen Benachrichtigungen wird in der Nähe des Anwendungssymbols angezeigt." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "The application badge with the number of new notifications will be visible near the application icon." } }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "La insignia de la aplicación con el número de nuevas notificaciones será visible cerca del icono de la aplicación." + } + }, "eu" : { "stringUnit" : { "state" : "translated", - "value" : "Ikurrak jakinarazpen-kopurua erakutsiko du aplikazioaren ikonoaren aldamenean." + "value" : "Jakinarazpen berrien kopurua duen ikurra aplikazioaren ikonoaren ondoan egongo da ikusgai." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Le badge de l'application indiquant le nombre de nouvelles notifications sera visible près de l'icône de l'application." } }, "pl" : { @@ -5518,16 +6710,34 @@ "settings.title.notificationsTitle" : { "comment" : "Show application badge", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Anwendungsbadge anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Show application badge" } }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Mostrar distintivo de solicitud" + } + }, "eu" : { "stringUnit" : { "state" : "translated", - "value" : "Erakutsi jakinarazpen-ikurra" + "value" : "Erakutsi ikurra aplikazioan" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Afficher le badge d'application" } }, "pl" : { @@ -5540,6 +6750,12 @@ }, "settings.title.other" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anderes" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5575,6 +6791,12 @@ "settings.title.pixelfedAccount" : { "comment" : "Pixelfed account", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pixelfed" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5609,6 +6831,12 @@ }, "settings.title.privacyPolicy" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Datenschutzrichtlinie" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5643,6 +6871,12 @@ }, "settings.title.rate" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vernissage bewerten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5677,6 +6911,12 @@ }, "settings.title.reportBug" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler melden" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5712,6 +6952,12 @@ "settings.title.rounderRectangle" : { "comment" : "Rounded rectangle", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abgerundetes Rechteck" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5747,6 +6993,12 @@ "settings.title.showAltText" : { "comment" : "Show ALT icon", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "ALT-Icon anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5782,6 +7034,12 @@ "settings.title.showAltTextOnTimeline" : { "comment" : "ALT icon will be displayed on timelines", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "ALT-Icons werden in der Zeitleiste angezeigt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5817,6 +7075,12 @@ "settings.title.showAvatars" : { "comment" : "Show avatars", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avatare anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5852,6 +7116,12 @@ "settings.title.showAvatarsOnTimeline" : { "comment" : "Show avatars on timeline", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avatare werden in Listen angezeigt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5887,6 +7157,12 @@ "settings.title.showFavourite" : { "comment" : "Show favourites", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoriten anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5922,6 +7198,12 @@ "settings.title.showFavouriteOnTimeline" : { "comment" : "Show favourites on timeline", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoriten werden in der Zeitleiste angezeigt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5956,6 +7238,12 @@ }, "settings.title.socials" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Soziale Netzwerke" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -5990,6 +7278,12 @@ }, "settings.title.sourceCode" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quellcode" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6024,6 +7318,12 @@ }, "settings.title.support" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Support" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6058,6 +7358,12 @@ }, "settings.title.system" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "System" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6092,6 +7398,12 @@ }, "settings.title.terms" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nutzungsbedingungen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6127,6 +7439,12 @@ "settings.title.thankYouClose" : { "comment" : "Close", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schließen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6162,6 +7480,12 @@ "settings.title.thankYouMessage" : { "comment" : "Thank you message", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Danke für die Unterstützung! Kleine und große Einkäufe helfen uns, unseren Traum eines hochqualitativen Produkts für unsere Nutzer aufrecht zu erhalten. Wir hoffen, Du liebst Vernissage!" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6197,6 +7521,12 @@ "settings.title.thankYouTitle" : { "comment" : "Thank you 💕", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Danke schön 💕" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6232,6 +7562,12 @@ "settings.title.theme" : { "comment" : "Theme", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Theme" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6266,6 +7602,12 @@ }, "settings.title.thirdParty" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwendete Software" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6300,6 +7642,12 @@ }, "settings.title.topMenu" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navigationsleiste" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6335,6 +7683,12 @@ "settings.title.version" : { "comment" : "Version", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6370,6 +7724,12 @@ "settings.title.warnAboutMissingAltDescription" : { "comment" : "A warning about missing ALT texts will be displayed before publishing new post.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vernissage wird Dich warnen, wenn Du einen Beitrag mit fehlendem ALT-Text veröffentlichen möchtest." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6405,6 +7765,12 @@ "settings.title.warnAboutMissingAltTitle" : { "comment" : "Warn of missing ALT text", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Warne mich bei fehlenden ALT-Texten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6439,6 +7805,12 @@ }, "signin.error.communicationFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kommunikation mit dem Server fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6474,6 +7846,12 @@ "signin.navigationBar.title" : { "comment" : "Signin view.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "In Pixelfed einloggen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6509,6 +7887,12 @@ "signin.title.amountOfUsers" : { "comment" : "users", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d Benutzer" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6544,6 +7928,12 @@ "signin.title.amountOStatuses" : { "comment" : "statuses", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d Beiträge" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6578,6 +7968,12 @@ }, "signin.title.chooseServer" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "oder wähle einen Pixelfed-Server" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6613,6 +8009,12 @@ "signin.title.enterServerAddress" : { "comment" : "Enter server address", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serveradresse eingeben" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6648,6 +8050,12 @@ "signin.title.howToJoinLink" : { "comment" : "How to join Pixelfed", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wie man Pixelfed beitritt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6682,6 +8090,12 @@ }, "signin.title.serverAddress" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serveradresse" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6717,6 +8131,12 @@ "signin.title.signIn" : { "comment" : "Sign in", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einloggen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6751,6 +8171,12 @@ }, "status.error.bookmarkFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lesezeichen setzen fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6785,6 +8211,12 @@ }, "status.error.deleteFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Löschen fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6819,6 +8251,12 @@ }, "status.error.favouriteFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorisieren fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6853,6 +8291,12 @@ }, "status.error.loadingCommentsFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kommentare können nicht geladen werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6887,6 +8331,12 @@ }, "status.error.loadingStatusFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konnte Beitrag nicht laden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6921,6 +8371,12 @@ }, "status.error.notFound" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beitrag existiert nicht mehr." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6955,6 +8411,12 @@ }, "status.error.reboostFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boost fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -6990,6 +8452,12 @@ "status.navigationBar.title" : { "comment" : "Status view.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Details" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7024,6 +8492,12 @@ }, "status.title.bookmark" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lesezeichen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7059,6 +8533,12 @@ "status.title.bookmarked" : { "comment" : "Bookmarked", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lesezeichen gesetzt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7093,6 +8573,12 @@ }, "status.title.delete" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Löschen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7127,6 +8613,12 @@ }, "status.title.favourite" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorisieren" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7162,6 +8654,12 @@ "status.title.favourited" : { "comment" : "Favourited", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorisiert" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7196,6 +8694,12 @@ }, "status.title.favouritedBy" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorisiert von" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7231,6 +8735,12 @@ "status.title.mediaDescription" : { "comment" : "Media description", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medienbeschreibung" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7265,6 +8775,12 @@ }, "status.title.openInBrowser" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Im Browser öffnen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7299,6 +8815,12 @@ }, "status.title.reboost" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boosten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7334,6 +8856,12 @@ "status.title.reboosted" : { "comment" : "Reboosted", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Geboostet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7368,6 +8896,12 @@ }, "status.title.reboostedBy" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Geboostet von" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7403,6 +8937,12 @@ "status.title.report" : { "comment" : "Report", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Melden" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7437,6 +8977,12 @@ }, "status.title.saveImage" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bild speichern" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7471,6 +9017,12 @@ }, "status.title.shareImage" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bild teilen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7505,6 +9057,12 @@ }, "status.title.shareStatus" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beitrag teilen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7539,6 +9097,12 @@ }, "status.title.showMediaDescription" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medienbeschreibung anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7573,6 +9137,12 @@ }, "status.title.statusDeleted" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beitrag gelöscht" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7608,6 +9178,12 @@ "status.title.unbookmarked" : { "comment" : "Unbookmarked", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lesezeichen gelöscht" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7643,6 +9219,12 @@ "status.title.unfavourited" : { "comment" : "Unfavourited", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorisieren rückgängig gemacht" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7678,6 +9260,12 @@ "status.title.unreboosted" : { "comment" : "Unreboosted", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boost rückgängig gemacht" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7693,7 +9281,7 @@ "eu" : { "stringUnit" : { "state" : "translated", - "value" : "Bultzada kendua" + "value" : "Bultzada kenduta" } }, "fr" : { @@ -7713,6 +9301,12 @@ "status.title.uploaded" : { "comment" : "Uploaded", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hochgeladen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7727,7 +9321,7 @@ }, "eu" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : ">" } }, @@ -7748,6 +9342,12 @@ "status.title.via" : { "comment" : "via", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "über %@" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7783,6 +9383,12 @@ "status.title.yourStatus" : { "comment" : "Your post", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dein Beitrag" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7817,6 +9423,12 @@ }, "statuses.error.loadingStatusesFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laden der Beiträge fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7851,6 +9463,12 @@ }, "statuses.error.tagFollowFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das Folgen des Hashtags ist fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7885,6 +9503,12 @@ }, "statuses.error.tagUnfollowFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das nicht mehr Folgen des Hashtags ist fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7919,6 +9543,12 @@ }, "statuses.navigationBar.bookmarks" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lesezeichen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7953,6 +9583,12 @@ }, "statuses.navigationBar.favourites" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoriten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -7987,6 +9623,12 @@ }, "statuses.navigationBar.federatedTimeline" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Föderiert" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8022,6 +9664,12 @@ "statuses.navigationBar.localTimeline" : { "comment" : "Statuses timeline (local/federated/favourite/bookmarks etc.).", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lokal" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8056,6 +9704,12 @@ }, "statuses.title.noPhotos" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hier sind leider keine Bilder." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8090,6 +9744,12 @@ }, "statuses.title.tagFollowed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du folgst dem Hashtag." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8124,6 +9784,12 @@ }, "statuses.title.tagUnfollowed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du folgst dem Hashtag nicht mehr." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8159,6 +9825,12 @@ "statusPlaceholder.title.line1" : { "comment" : "Lorem ispum text something", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lorem ipsum dolor sit amet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8194,6 +9866,12 @@ "statusPlaceholder.title.line2" : { "comment" : "Lorem ispum text something sdf sdfsdf sdfdsfsdfsdf", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam tristique, ipsum nec cursus facilisis." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8228,6 +9906,12 @@ }, "tags.error.loadingTagsFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laden der Hashtags fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8262,6 +9946,12 @@ }, "tags.navigationBar.followedTitle" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hashtags, denen Du folgst" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8296,6 +9986,12 @@ }, "tags.navigationBar.searchTitle" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hashtags" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8331,6 +10027,12 @@ "tags.navigationBar.trendingTitle" : { "comment" : "Trending tags.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hashtags" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8366,6 +10068,12 @@ "tags.title.amountOfPosts" : { "comment" : "Amount of posts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d Beiträge" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8400,6 +10108,12 @@ }, "tags.title.noTags" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hier sind leider keine Hashtags." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8434,6 +10148,12 @@ }, "thirdparty.customemoji.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://github.com/divadretlaw/EmojiText" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8469,24 +10189,36 @@ "thirdparty.customemoji.description" : { "comment" : "Render Custom Emoji in Text. Supports local and remote emojis. Remote emojis are loadad and cached using Nuke.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Benutzerdefinierte Emoji in Text rendern. Unterstützt lokale und entfernte Emojis. Entfernte Emojis werden mit Nuke geladen und zwischengespeichert." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Render Custom Emoji in Text. Supports local and remote emojis. Remote emojis are loadad and cached using Nuke." } }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "Emoji pertsonalizatuak testu bihurtzen ditu. Lokaleko eta urruneko zerbitzarietako emojiekin da bateragarria. Urruneko emojiak Nuke erabiliz kargatzen eta katxean gordetzen dira." - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Renderiza Emoji personalizados en texto. Soporta emojis locales y remotos. Los emojis remotos se cargan y almacenan en caché con Nuke." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errendatu Emoji pertsonalizatua testuan. Zerbitzari propioko eta besteetako emojiak onartzen ditu. Urruneko emojiak kargatu eta katxean gordetzen dira Nuke erabiliz." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Rendu des Emoji personnalisés dans le texte. Supporte les emojis locaux et distants. Les emojis distants sont chargés et mis en cache à l'aide de Nuke." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -8498,6 +10230,12 @@ "thirdparty.customemoji.title" : { "comment" : "Custom emoji section title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "EmojiText" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8532,6 +10270,12 @@ }, "thirdparty.fleur.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://fonts.google.com/specimen/Fleur+De+Leah" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8567,24 +10311,36 @@ "thirdparty.fleur.description" : { "comment" : "Font used in the application in the icons and in the splash screen.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Schriftart, die in der Anwendung in den Symbolen und auf dem Startbildschirm verwendet wird." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Font used in the application in the icons and in the splash screen." } }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aplikazioaren ikonoetan eta harrerako pantailan erabiltzen da letra-tipoa." - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Fuente utilizada en la aplicación en los iconos y en la pantalla de inicio." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aplikazioaren ikonoan eta harrera-pantailan erabiltzen den letra-tipoa." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Police utilisée dans l'application dans les icônes et dans l'écran d'accueil." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -8596,6 +10352,12 @@ "thirdparty.fleur.title" : { "comment" : "Fleur De Leah section title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fleur De Leah" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8630,6 +10392,12 @@ }, "thirdparty.htmlmarkdown.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://gitlab.com/mflint/HTML2Markdown" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8665,24 +10433,36 @@ "thirdparty.htmlmarkdown.description" : { "comment" : "It's a Swift Package which attempts to convert HTML into Markdown.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Es ist ein Swift-Paket, das versucht, HTML in Markdown zu konvertieren." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "It's a Swift Package which attempts to convert HTML into Markdown." } }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "HTML hizkera Markdownera itzultzen saiatzen den Swift paketea da." - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Es un paquete Swift que intenta convertir HTML en Markdown." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "HTML Markdown bihurtzen saiatzen den Swift pakete bat da." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Il s'agit d'un paquet Swift qui tente de convertir HTML en Markdown." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -8694,6 +10474,12 @@ "thirdparty.htmlmarkdown.title" : { "comment" : "Status body section title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "HTML2Markdown" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8728,6 +10514,12 @@ }, "thirdparty.htmlstring.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://github.com/alexisakers/HTMLString" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8763,24 +10555,36 @@ "thirdparty.htmlstring.description" : { "comment" : "HTMLString is a library written in Swift that allows your program to add and remove HTML entities in Strings.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "HTMLString ist eine in Swift geschriebene Bibliothek, die es Ihrem Programm ermöglicht, HTML-Entitäten in Strings hinzuzufügen und zu entfernen." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "HTMLString is a library written in Swift that allows your program to add and remove HTML entities in Strings." } }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "HTMLString Swift lengoaian idatzitako liburutegia da, programak Strings-en HTML entitateak gehitzea eta kentzea ahalbidetzen duena." - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "HTMLString es una librería escrita en Swift que permite a tu programa añadir y eliminar entidades HTML en Strings." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "HTMLString Swift-en idatzitako liburutegi bat da, zure programari Strings-en HTML entitateak gehitzeko eta kentzeko aukera ematen diona." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "HTMLString est une bibliothèque écrite en Swift qui permet à votre programme d'ajouter et de supprimer des entités HTML dans des chaînes de caractères." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -8792,6 +10596,12 @@ "thirdparty.htmlstring.title" : { "comment" : "Section html string title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "HTMLString" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8826,6 +10636,12 @@ }, "thirdparty.lazyimage.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://github.com/kean/Nuke" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8861,24 +10677,36 @@ "thirdparty.lazyimage.description" : { "comment" : "Lazy image section description.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Nuke bietet eine effiziente Möglichkeit zum Herunterladen und Anzeigen von Bildern in Ihrer Anwendung. Es ist einfach zu erlernen und zu verwenden. Seine Architektur ermöglicht viele leistungsstarke Funktionen und bietet praktisch unbegrenzte Möglichkeiten zur Anpassung." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Nuke provides an efficient way to download and display images in your app. It's easy to learn and use. Its architecture enables many powerful features while offering virtually unlimited possibilities for customization." } }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nuke-ek aplikazioan irudiak deskargatu eta erakusteko modu erakingor bat eskaintzen du. Erraza da ikastea eta erabiltzea. Bere arkitekturak ezaugarri ahaltsu asko ematen ditu, eta pertsonalizaziorako ia mugarik gabeko aukerak eskaintzen ditu." - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Nuke proporciona una forma eficaz de descargar y mostrar imágenes en tu aplicación. Es fácil de aprender y utilizar. Su arquitectura permite muchas características de gran alcance al tiempo que ofrece posibilidades prácticamente ilimitadas para la personalización." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuke-k zure aplikazioan irudiak deskargatzeko eta bistaratzeko modu eraginkorra eskaintzen du. Ikasteko eta erabiltzeko erraza da. Bere arkitekturak ezaugarri indartsu asko ahalbidetzen ditu pertsonalizatzeko aukera ia mugagabeak eskaintzen dituen bitartean." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Nuke offre un moyen efficace de télécharger et d'afficher des images dans votre application. Il est facile à apprendre et à utiliser. Son architecture permet de nombreuses fonctionnalités puissantes tout en offrant des possibilités de personnalisation pratiquement illimitées." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -8890,6 +10718,12 @@ "thirdparty.lazyimage.title" : { "comment" : "Lazy image section title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuke" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8925,6 +10759,12 @@ "thirdParty.navigationBar.title" : { "comment" : "Third party view.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwendete Software" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8959,6 +10799,12 @@ }, "thirdparty.notifications.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://github.com/omaralbeik/Drops" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8994,24 +10840,36 @@ "thirdparty.notifications.description" : { "comment" : "A µFramework for showing alerts like the one used when copying from pasteboard or connecting Apple pencil.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ein µFramework zur Anzeige von Warnungen, wie sie beim Kopieren von der Papptafel oder beim Anschluss des Apple Pencil verwendet werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "A µFramework for showing alerts like the one used when copying from pasteboard or connecting Apple pencil." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "µFramework bat, arbeletik kopiatzean edo Appleren arkatza konektatzean erabiltzen den bezalako alertak erakusteko." - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Un µFramework para mostrar alertas como la que se utiliza al copiar desde la mesa de trabajo o al conectar el lápiz de Apple." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pasteboardetik kopiatzerakoan edo Apple pencil konektatzean erabiltzen den bezalako alertak erakusteko µFrameworka." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Un µFramework pour afficher des alertes comme celles utilisées lors de la copie à partir d'un tableau ou de la connexion d'un crayon Apple." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -9023,6 +10881,12 @@ "thirdparty.notifications.title" : { "comment" : "Notifications (drops) section title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Drops" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9057,6 +10921,12 @@ }, "thirdparty.oauth.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://github.com/OAuthSwift/OAuthSwift" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9092,24 +10962,36 @@ "thirdparty.oauth.description" : { "comment" : "Swift based OAuth library for iOS and macOS.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Swift-basierte OAuth-Bibliothek für iOS und macOS." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Swift based OAuth library for iOS and macOS." } }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "Swift-en oinarritutako OAuth liburutegi bat iOS eta macOS-erako." - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Librería OAuth basada en Swift para iOS y macOS." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Swift-en oinarritutako OAuth liburutegia iOS eta macOSentzat." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Bibliothèque OAuth basée sur Swift pour iOS et macOS." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -9121,6 +11003,12 @@ "thirdparty.oauth.title" : { "comment" : "OAuth section title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "OAuthSwift" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9155,6 +11043,12 @@ }, "thirdparty.qrcodes.address" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://github.com/dmrschmidt/QRCode" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9190,24 +11084,36 @@ "thirdparty.qrcodes.description" : { "comment" : "A simple QR code image generator to use in your apps, written in Swift 5.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ein einfacher QR-Code-Generator zur Verwendung in Ihren Anwendungen, geschrieben in Swift 5." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "A simple QR code image generator to use in your apps, written in Swift 5." } }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aplikazioetan erabiltzeko QR kode sorgailu samur bat, Swift 5 erabiliz idatzitakoa." - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Un sencillo generador de imágenes de código QR para usar en tus aplicaciones, escrito en Swift 5." } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zure aplikazioetan erabiltzeko QR kode irudi-sorgailu soil bat, Swift 5-en idatzia." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Un simple générateur d'image de code QR à utiliser dans vos applications, écrit en Swift 5." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -9219,6 +11125,12 @@ "thirdparty.qrcodes.title" : { "comment" : "QR codes section title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "QRCode" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9253,6 +11165,12 @@ }, "trendingAccounts.error.loadingAccountsFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laden der Konten fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9288,6 +11206,12 @@ "trendingAccounts.navigationBar.title" : { "comment" : "Trending accounts.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9322,6 +11246,12 @@ }, "trendingAccounts.title.noAccounts" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hier ist leider niemand." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9356,6 +11286,12 @@ }, "trendingStatuses.error.loadingStatusesFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laden der Beiträge fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9391,6 +11327,12 @@ "trendingStatuses.navigationBar.title" : { "comment" : "Trending statuses.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fotos" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9426,6 +11368,12 @@ "trendingStatuses.title.daily" : { "comment" : "Daily", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Täglich" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9461,6 +11409,12 @@ "trendingStatuses.title.monthly" : { "comment" : "Monthly", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Monatlich" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9495,6 +11449,12 @@ }, "trendingStatuses.title.noPhotos" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hier sind leider keine Bilder." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9530,6 +11490,12 @@ "trendingStatuses.title.yearly" : { "comment" : "Yearly", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jährlich" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9564,6 +11530,12 @@ }, "userProfile.error.block" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "(Nicht mehr) Blockieren fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9598,6 +11570,12 @@ }, "userProfile.error.loadingAccountFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Laden vom Server." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9632,6 +11610,12 @@ }, "userProfile.error.muting" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "(Nicht mehr) Stummschalten fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9666,6 +11650,12 @@ }, "userProfile.error.notExists" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konto existiert nicht." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9700,6 +11690,12 @@ }, "userProfile.error.relationship" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beziehungsaktion fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9735,6 +11731,12 @@ "userProfile.title.block" : { "comment" : "Block", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blockiert" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9769,6 +11771,12 @@ }, "userProfile.title.blocked" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konto blockiert" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9804,6 +11812,12 @@ "userProfile.title.blocks" : { "comment" : "Blocked accounts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blockierte Konten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9839,6 +11853,12 @@ "userProfile.title.bookmarks" : { "comment" : "Bookmarks", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lesezeichen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9873,6 +11893,12 @@ }, "userProfile.title.boostedStatusesMuted" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Boosts gedämpft" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9888,7 +11914,7 @@ "eu" : { "stringUnit" : { "state" : "translated", - "value" : "Bultzadak mututu dira" + "value" : "Bultzadak ezkutatu dira" } }, "fr" : { @@ -9907,6 +11933,12 @@ }, "userProfile.title.cancelRequestFollow" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anfrage abbrechen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9942,6 +11974,12 @@ "userProfile.title.disableBoosts" : { "comment" : "Disable boosts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Boosts deaktivieren" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -9977,24 +12015,36 @@ "userProfile.title.disabledBoosts" : { "comment" : "Disabled boosts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Deaktivierte Boosts" + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Disabled boosts" } }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bultzadak ezkutatuta" - } - }, "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Potenciadores desactivados" } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ezgaitutako bultzadak" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Boosters désactivés" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -10006,6 +12056,12 @@ "userProfile.title.edit" : { "comment" : "Edit profile", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bearbeiten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10041,6 +12097,12 @@ "userProfile.title.enableBoosts" : { "comment" : "Enable boosts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Aktivieren von Boosts" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10076,6 +12138,12 @@ "userProfile.title.favourites" : { "comment" : "Favourites", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoriten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10110,6 +12178,12 @@ }, "userProfile.title.follow" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10145,6 +12219,12 @@ "userProfile.title.followedTags" : { "comment" : "Followed tags", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hashtags, denen Du folgst" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10180,6 +12260,12 @@ "userProfile.title.followers" : { "comment" : "Followers", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Follower" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10215,6 +12301,12 @@ "userProfile.title.following" : { "comment" : "Following", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "werden gefolgt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10250,6 +12342,12 @@ "userProfile.title.followRequests" : { "comment" : "FollowRequests", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anfragen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10284,6 +12382,12 @@ }, "userProfile.title.followsYou" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "folgt Dir" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10319,6 +12423,12 @@ "userProfile.title.instance" : { "comment" : "Instance information", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Instanzinformation" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10354,6 +12464,12 @@ "userProfile.title.joined" : { "comment" : "Joined", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Am %@ beigetreten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10389,6 +12505,12 @@ "userProfile.title.mute" : { "comment" : "Mute", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stummschalten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10423,6 +12545,12 @@ }, "userProfile.title.muted" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konto stummgeschaltet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10458,6 +12586,12 @@ "userProfile.title.mutes" : { "comment" : "Muted accounts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stummgeschaltete Konten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10493,6 +12627,12 @@ "userProfile.title.openInBrowser" : { "comment" : "Open in browser", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Im Browser öffnen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10528,6 +12668,12 @@ "userProfile.title.posts" : { "comment" : "Posts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beiträge" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10563,6 +12709,12 @@ "userProfile.title.privateProfileSubtitle" : { "comment" : "Only approved followers can see photos.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nur Freigeschaltete können Beiträge sehen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10598,6 +12750,12 @@ "userProfile.title.privateProfileTitle" : { "comment" : "This profile is private.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieses Profil ist privat." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10633,6 +12791,12 @@ "userProfile.title.report" : { "comment" : "Report", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Melden" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10667,6 +12831,12 @@ }, "userProfile.title.requestFollow" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgen anfragen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10702,6 +12872,12 @@ "userProfile.title.share" : { "comment" : "Share", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Teilen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10737,6 +12913,12 @@ "userProfile.title.unblock" : { "comment" : "Unblock", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blockierung aufheben" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10771,6 +12953,12 @@ }, "userProfile.title.unblocked" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konto nicht mehr blockiert" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10805,6 +12993,12 @@ }, "userProfile.title.unfollow" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nicht mehr folgen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10840,6 +13034,12 @@ "userProfile.title.unmute" : { "comment" : "Unute", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stummschaltung aufheben" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10874,6 +13074,12 @@ }, "userProfile.title.unmuted" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stummschaltung des Kontos aufgehoben" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10908,6 +13114,12 @@ }, "Vernissage" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vernissage" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -10937,6 +13149,12 @@ "widget.family.notSupported" : { "comment" : "Not supported", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Nicht unterstützt" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10949,6 +13167,18 @@ "value" : "No se admite" } }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ez da bateragarria" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Non pris en charge" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -10960,6 +13190,12 @@ "widget.title.photoDescription" : { "comment" : "Widget view.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Widget mit Fotos aus Pixelfed." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -10994,6 +13230,12 @@ }, "widget.title.qrCodeDescription" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Widget mit QR-Code zu Deinem Pixelfed-Profil." + } + }, "en" : { "stringUnit" : { "state" : "translated", diff --git a/Localization/es_ES.lproj/Localizable.strings b/Localization/es_ES.lproj/Localizable.strings deleted file mode 100644 index e139016..0000000 --- a/Localization/es_ES.lproj/Localizable.strings +++ /dev/null @@ -1,371 +0,0 @@ -// MARK: Common strings. -"global.title.contentWarning" = "Contenido sensible"; -"global.title.seePost" = "Ver publicación"; -"global.title.refresh" = "Actualizar"; -"global.title.momentsAgo" = "hace uno momento"; -"global.title.success" = "Éxito"; -"global.title.photoSaved" = "La foto se ha guardado."; -"global.title.ok" = "Aceptar"; -"global.title.showMore" = "Mostrar más"; -"global.title.showLess" = "Mostrar menos"; -"global.title.close" = "Cerrar"; -"global.error.refreshingCredentialsTitle" = "Error al actualizar las credenciales."; -"global.error.refreshingCredentialsSubtitle" = "Por favor, vuelve a iniciar sesión en Pixelfed."; - -// MARK: Global errors. -"global.error.unexpected" = "Error inesperado."; -"global.error.statusesNotRetrieved" = "No se pudieron obtener los estados."; -"global.error.errorDuringDownloadStatuses" = "Error durante la descarga de estados del servidor."; -"global.error.errorDuringDownloadHashtag" = "Error durante la descarga de etiquetas del servidor."; -"global.error.hashtagNotExists" = "La etiqueta no existe."; -"global.error.errorDuringImageDownload" = "No se puede descargar la imagen."; -"global.error.canceledImageDownload" = "La descarga de la imagen ha sido cancelada."; -"global.error.errorDuringDataLoad" = "Error al cargar los datos."; -"global.error.errorDuringUserRead" = "No se puede recuperar la cuenta de usuario."; -"global.error.badUrlServer" = "URL incorrecta del servidor."; -"global.error.accessTokenNotFound" = "Token de acceso no encontrado."; -"global.error.errorDuringDownloadStatus" = "Error durante la descarga del estado del servidor."; -"global.error.errorDuringPurchaseVerification" = "Fallo en la verificación de la compra."; - -// MARK: Main view (main navigation bar). -"mainview.tab.homeTimeline" = "Inicio"; -"mainview.tab.localTimeline" = "Local"; -"mainview.tab.federatedTimeline" = "Federado"; -"mainview.tab.trendingPhotos" = "Fotos"; -"mainview.tab.trendingTags" = "Etiquetas"; -"mainview.tab.trendingAccounts" = "Cuentas"; -"mainview.tab.userProfile" = "Perfil"; -"mainview.tab.notifications" = "Notificaciones"; -"mainview.tab.search" = "Buscar"; -"mainview.tab.trending" = "Tendencias"; - -// MARK: Main view (leading navigation bar). -"mainview.menu.settings" = "Ajustes"; - -// MARK: Main view (error notifications). -"mainview.error.switchAccounts" = "No se pueden cambiar las cuentas."; - -// MARK: Home timeline. -"home.title.allCaughtUp" = "Estás al día"; -"home.title.noPhotos" = "Desafortunadamente, no hay fotos aquí."; - -// MARK: Statuses timeline (local/federated/favourite/bookmarks etc.). -"statuses.navigationBar.localTimeline" = "Local"; -"statuses.navigationBar.federatedTimeline" = "Federado"; -"statuses.navigationBar.favourites" = "Favoritos"; -"statuses.navigationBar.bookmarks" = "Marcadores"; -"statuses.title.noPhotos" = "Desafortunadamente, no hay fotos aquí."; -"statuses.title.tagFollowed" = "Estás siguiendo la etiqueta."; -"statuses.title.tagUnfollowed" = "Se ha dejado de seguir la etiqueta."; -"statuses.error.loadingStatusesFailed" = "Error al cargar los estados."; -"statuses.error.tagFollowFailed" = "Error al seguir la etiqueta."; -"statuses.error.tagUnfollowFailed" = "Error al dejar de seguir la etiqueta."; - -// Mark: Search view. -"search.navigationBar.title" = "Buscar"; -"search.title.placeholder" = "Buscar..."; -"search.title.usersWith" = "Usuarios con %@"; -"search.title.goToUser" = "Ir al usuario %@"; -"search.title.hashtagWith" = "Etiquetas con %@"; -"search.title.goToHashtag" = "Ir a la etiqueta %@"; - -// Mark: Trending statuses. -"trendingStatuses.navigationBar.title" = "Fotos"; -"trendingStatuses.title.daily" = "Diario"; -"trendingStatuses.title.monthly" = "Mensual"; -"trendingStatuses.title.yearly" = "Anual"; -"trendingStatuses.error.loadingStatusesFailed" = "Error al cargar los estados."; -"trendingStatuses.title.noPhotos" = "Desafortunadamente, no hay fotos aquí."; - -// Mark: Trending tags. -"trendingTags.navigationBar.title" = "Etiquetas"; -"trendingTags.title.noTags" = "Desafortunadamente, no hay etiquetas aquí."; -"trendingTags.title.amountOfPosts" = "%d publicaciones"; -"trendingTags.error.loadingTagsFailed" = "Error al cargar las etiquetas."; - -// Mark: Trending accounts. -"trendingAccounts.navigationBar.title" = "Cuentas"; -"trendingAccounts.title.noAccounts" = "Desafortunadamente, aquí no hay nadie."; -"trendingAccounts.error.loadingAccountsFailed" = "Error al cargar las cuentas."; - -// Mark: User profile view. -"userProfile.title.openInBrowser" = "Abrir en el navegador"; -"userProfile.title.share" = "Compartir"; -"userProfile.title.unmute" = "Quitar silencio"; -"userProfile.title.mute" = "Silenciar"; -"userProfile.title.unblock" = "Desbloquear"; -"userProfile.title.block" = "Bloquear"; -"userProfile.title.favourites" = "Favoritos"; -"userProfile.title.bookmarks" = "Marcadores"; -"userProfile.title.posts" = "Publicaciones"; -"userProfile.title.followers" = "Seguidores"; -"userProfile.title.following" = "Siguiendo"; -"userProfile.title.joined" = "Unido a %@"; -"userProfile.title.unfollow" = "Dejar de seguir"; -"userProfile.title.follow" = "Seguir"; -"userProfile.title.instance" = "Información de la instancia"; -"userProfile.title.blocks" = "Cuentas bloqueadas"; -"userProfile.title.mutes" = "Cuentas silenciadas"; -"userProfile.title.muted" = "Cuenta silenciada"; -"userProfile.title.unmuted" = "Cuenta sin silencio"; -"userProfile.title.blocked" = "Cuenta bloqueada"; -"userProfile.title.unblocked" = "Cuenta desbloqueada"; -"userProfile.title.report" = "Informar"; -"userProfile.title.followsYou" = "Te sigue"; -"userProfile.title.requestFollow" = "Solicitar seguir"; -"userProfile.title.cancelRequestFollow" = "Cancelar solicitud"; -"userProfile.title.followRequests" = "Solicitudes de seguimiento"; -"userProfile.title.privateProfileTitle" = "Este perfil es privado."; -"userProfile.title.privateProfileSubtitle" = "Solo los seguidores aprobados pueden ver las fotos."; -"userProfile.error.notExists" = "La cuenta no existe."; -"userProfile.error.loadingAccountFailed" = "Error al descargar la cuenta del servidor."; -"userProfile.error.muting" = "Error al silenciar/quitar silencio."; -"userProfile.error.block" = "Error al bloquear/desbloquear."; -"userProfile.error.relationship" = "Error en la acción de relación."; -"userProfile.title.edit" = "Editar"; -"userProfile.title.muted" = "Silenciado"; -"userProfile.title.blocked" = "Bloqueado"; - -// Mark: Notifications view. -"notifications.navigationBar.title" = "Notificaciones"; -"notifications.title.noNotifications" = "Desafortunadamente, aquí no hay nada."; -"notifications.title.followedYou" = "te ha seguido"; -"notifications.title.mentionedYou" = "te ha mencionado"; -"notifications.title.boosted" = "ha compartido"; -"notifications.title.favourited" = "le ha gustado"; -"notifications.title.postedStatus" = "ha publicado un estado"; -"notifications.title.followRequest" = "solicitud de seguimiento"; -"notifications.title.poll" = "encuesta"; -"notifications.title.updatedStatus" = "estado actualizado"; -"notifications.title.signedUp" = "se ha registrado"; -"notifications.title.newReport" = "nuevo informe"; -"notifications.error.loadingNotificationsFailed" = "Error al cargar las notificaciones."; - -// Mark: Compose view. -"compose.navigationBar.title" = "Componer"; -"compose.title.everyone" = "Todos"; -"compose.title.unlisted" = "No listado"; -"compose.title.followers" = "Seguidores"; -"compose.title.attachPhotoFull" = "Adjunta una foto y escribe lo que piensas"; -"compose.title.attachPhotoMini" = "Escribe lo que piensas"; -"compose.title.publish" = "Publicar"; -"compose.title.cancel" = "Cancelar"; -"compose.title.writeContentWarning" = "Escribir aviso de contenido"; -"compose.title.commentsWillBeDisabled" = "Los comentarios estarán desactivados"; -"compose.title.statusPublished" = "Estado publicado"; -"compose.title.tryToUpload" = "Intentar subir"; -"compose.title.delete" = "Eliminar"; -"compose.title.edit" = "Editar"; -"compose.title.photos" = "Fototeca"; -"compose.title.camera" = "Hacer una foto"; -"compose.title.files" = "Explorar archivos"; -"compose.title.missingAltTexts" = "Textos ALT faltantes"; -"compose.title.missingAltTextsWarning" = "No todas las imágenes han sido descritas para personas con discapacidad visual. ¿Te gustaría enviar las fotos de todos modos?"; -"compose.error.loadingPhotosFailed" = "No se puede recuperar la imagen de la biblioteca."; -"compose.error.postingPhotoFailed" = "Error al publicar la foto."; -"compose.error.postingStatusFailed" = "Error al publicar el estado."; - -// Mark: Photo editor view. -"photoEdit.navigationBar.title" = "Detalles de la foto"; -"photoEdit.title.photo" = "Foto"; -"photoEdit.title.accessibility" = "Accesibilidad"; -"photoEdit.title.accessibilityDescription" = "Descripción para personas con discapacidad visual"; -"photoEdit.title.save" = "Guardar"; -"photoEdit.title.cancel" = "Cancelar"; -"photoEdit.error.updatePhotoFailed" = "Error al actualizar la foto."; - -// Mark: Place selector view. -"placeSelector.navigationBar.title" = "Lugares"; -"placeSelector.title.search" = "Buscar..."; -"placeSelector.title.buttonSearch" = "Buscar"; -"placeSelector.title.cancel" = "Cancelar"; -"placeSelector.error.loadingPlacesFailed" = "Error al cargar las notificaciones."; - -// Mark: Settings view. -"settings.navigationBar.title" = "Ajustes"; -"settings.title.close" = "Cerrar"; -"settings.title.version" = "Versión"; -"settings.title.accounts" = "Cuentas"; -"settings.title.newAccount" = "Nueva cuenta"; -"settings.title.accent" = "Acento"; -"settings.title.theme" = "Tema"; -"settings.title.system" = "Sistema"; -"settings.title.light" = "Claro"; -"settings.title.dark" = "Oscuro"; -"settings.title.avatar" = "Avatar"; -"settings.title.circle" = "Círculo"; -"settings.title.rounderRectangle" = "Rectángulo redondeado"; -"settings.title.other" = "Otros"; -"settings.title.thirdParty" = "Terceros"; -"settings.title.reportBug" = "Informar de un error"; -"settings.title.githubIssues" = "Problemas en Github"; -"settings.title.follow" = "Sígueme"; -"settings.title.support" = "Soporte"; -"settings.title.thankYouTitle" = "Gracias 💕"; -"settings.title.thankYouMessage" = "Gracias por tu compra. Tanto las compras grandes como las pequeñas nos ayudan a mantener nuestro sueño de proporcionar productos de la mejor calidad a nuestros clientes. Esperamos que estés disfrutando de Vernissage."; -"settings.title.thankYouClose" = "Cerrar"; -"settings.title.haptics" = "Respuesta háptica"; -"settings.title.hapticsTabSelection" = "Selección de pestaña"; -"settings.title.hapticsButtonPress" = "Pulsación de botón"; -"settings.title.hapticsListRefresh" = "Actualizar lista"; -"settings.title.hapticsAnimationFinished" = "Animación finalizada"; -"settings.title.mediaSettings" = "Ajustes multimedia"; -"settings.title.alwaysShowSensitiveTitle" = "Mostrar siempre NSFW"; -"settings.title.alwaysShowSensitiveDescription" = "Mostrar siempre todos los medios NSFW (sensibles) sin advertencias"; -"settings.title.alwaysShowAltTitle" = "Mostrar texto alternativo"; -"settings.title.alwaysShowAltDescription" = "Mostrar el texto alternativo si está presente en la pantalla de detalles del estado"; -"settings.title.general" = "General"; -"settings.title.applicationIcon" = "Icono de la aplicación"; -"settings.title.followVernissage" = "Sígueme en Vernissage"; -"settings.title.mastodonAccount" = "Cuenta de Mastodon"; -"settings.title.pixelfedAccount" = "Cuenta de Pixelfed"; -"settings.title.openPage" = "Abrir"; -"settings.title.privacyPolicy" = "Política de privacidad"; -"settings.title.terms" = "Términos y condiciones"; -"settings.title.sourceCode" = "Código fuente"; -"settings.title.rate" = "Puntúa Vernissage"; -"settings.title.socials" = "Redes sociales"; -"settings.title.menuPosition" = "Posición del menú"; -"settings.title.topMenu" = "Barra de navegación"; -"settings.title.bottomRightMenu" = "Abajo a la derecha"; -"settings.title.bottomLeftMenu" = "Abajo a la izquierda"; -"settings.title.showAvatars" = "Mostrar avatares"; -"settings.title.showAvatarsOnTimeline" = "Los avatares se mostrarán en las cronologías"; -"settings.title.showFavourite" = "Mostrar favoritos"; -"settings.title.showFavouriteOnTimeline" = "Los favoritos se mostrarán en las cronologías"; -"settings.title.showAltText" = "Mostrar icono ALT"; -"settings.title.showAltTextOnTimeline" = "El icono ALT se mostrará en las cronologíasS"; -"settings.title.warnAboutMissingAltTitle" = "Advertir sobre el texto ALT faltante"; -"settings.title.warnAboutMissingAltDescription" = "Se mostrará una advertencia sobre los textos ALT faltantes antes de publicar una nueva entrada."; - -// Mark: Signin view. -"signin.navigationBar.title" = "Iniciar sesión en Pixelfed"; -"signin.title.serverAddress" = "Dirección del servidor"; -"signin.title.signIn" = "Iniciar sesión"; -"signin.title.enterServerAddress" = "Introducir la dirección del servidor"; -"signin.title.howToJoinLink" = "Cómo unirse a Pixelfed"; -"signin.title.chooseServer" = "O elige un servidor Pixelfed"; -"signin.title.amountOfUsers" = "%d usuarios"; -"signin.title.amountOStatuses" = "%d estados"; -"signin.error.communicationFailed" = "Error de comunicación con el servidor."; - -// Mark: Status view. -"status.navigationBar.title" = "Detalles"; -"status.title.uploaded" = "Subido"; -"status.title.via" = "a través de %@"; -"status.title.reboostedBy" = "Compartido por"; -"status.title.favouritedBy" = "Le ha gustado a"; -"status.title.openInBrowser" = "Abrir en el navegador"; -"status.title.shareStatus" = "Compartir estado"; -"status.title.yourStatus" = "Tu estado"; -"status.title.delete" = "Eliminar"; -"status.title.reboosted" = "Compartido"; -"status.title.unreboosted" = "No compartido"; -"status.title.favourited" = "Le ha gustado"; -"status.title.unfavourited" = "No le ha gustado"; -"status.title.bookmarked" = "Marcado"; -"status.title.unbookmarked" = "No marcado"; -"status.title.statusDeleted" = "Estado eliminado"; -"status.title.reboost" = "Compartir"; -"status.title.unreboost" = "No compartir"; -"status.title.favourite" = "Me gusta"; -"status.title.unfavourite" = "No me gusta"; -"status.title.bookmark" = "Marcar"; -"status.title.unbookmark" = "Desmarcar"; -"status.title.comment" = "Comentario"; -"status.title.report" = "Informar"; -"status.title.saveImage" = "Guardar imagen"; -"status.title.showMediaDescription" = "Mostrar descripción de medios"; -"status.title.mediaDescription" = "Descripción de medios"; -"status.title.shareImage" = "Compartir imagen"; -"status.title.altText" = "ALT"; -"status.error.loadingStatusFailed" = "Error al cargar el estado."; -"status.error.notFound" = "El estado ya no existe."; -"status.error.loadingCommentsFailed" = "No se pueden cargar los comentarios."; -"status.error.reboostFailed" = "Error al compartir."; -"status.error.favouriteFailed" = "Error al dar me gusta."; -"status.error.bookmarkFailed" = "Error al marcar."; -"status.error.deleteFailed" = "Error al eliminar."; - -// Mark: Accounts view. -"accounts.navigationBar.followers" = "Seguidores"; -"accounts.navigationBar.following" = "Siguiendo"; -"accounts.navigationBar.favouritedBy" = "Le ha gustado a"; -"accounts.navigationBar.reboostedBy" = "Compartido por"; -"accounts.navigationBar.blocked" = "Cuentas bloqueadas"; -"accounts.navigationBar.mutes" = "Cuentas silenciadas"; -"accounts.title.noAccounts" = "Desafortunadamente, aquí no hay nadie."; -"accounts.error.loadingAccountsFailed" = "Error al cargar las cuentas."; - -// Mark: Third party view. -"thirdParty.navigationBar.title" = "Terceros"; - -// Mark: Widget view. -"widget.title.photoDescription" = "Widget con fotos de Pixelfed."; -"widget.title.qrCodeDescription" = "Widget con el código QR de tu perfil de Pixelfed."; - -// Mark: In-app purchases. -"purchase.donut.title" = "Rosquilla"; -"purchase.donut.description" = "Dame una rosquilla."; -"purchase.coffee.title" = "Café"; -"purchase.coffee.description" = "Dame un café."; -"purchase.cake.title" = "Café y pastel"; -"purchase.cake.description" = "Dame un café y un pastel."; - -// Mark: Edit profile. -"editProfile.navigationBar.title" = "Editar perfil"; -"editProfile.title.displayName" = "Nombre para mostrar"; -"editProfile.title.bio" = "Biografía"; -"editProfile.title.website" = "Sitio web"; -"editProfile.title.save" = "Guardar"; -"editProfile.title.accountSaved" = "Perfil actualizado."; -"editProfile.title.photoInfo" = "La foto cambiada se mostrará en la aplicación y en el sitio web con un pequeño retraso."; -"editProfile.title.privateAccount" = "Cuenta privada"; -"editProfile.title.privateAccountInfo" = "Cuando tu cuenta es privada, sólo las personas a las que apruebas pueden ver tus fotos y vídeos en Pixelfed. Tus seguidores existentes no se verán afectados."; -"editProfile.error.saveAccountFailed" = "Error al guardar el perfil."; -"editProfile.error.loadingAvatarFailed" = "Error al cargar el avatar."; -"editProfile.error.noProfileData" = "No se pueden mostrar los datos del perfil."; -"editProfile.error.loadingAccountFailed" = "Error al cargar los datos de la cuenta desde el servidor."; - -// Mark: Instance information. -"instance.navigationBar.title" = "Instancia"; -"instance.title.instanceInfo" = "Información de la instancia"; -"instance.title.name" = "Nombre"; -"instance.title.address" = "Dirección"; -"instance.title.email" = "Correo electrónico"; -"instance.title.version" = "Versión"; -"instance.title.users" = "Usuarios"; -"instance.title.posts" = "Publicaciones"; -"instance.title.domains" = "Dominios"; -"instance.title.registrations" = "Registros"; -"instance.title.approvalRequired" = "Se requiere aprobación"; -"instance.title.rules" = "Reglas de la instancia"; -"instance.title.contact" = "Contacto"; -"instance.title.pixelfedAccount" = "Cuenta de Pixelfed"; -"instance.error.noInstanceData" = "No se pueden mostrar los datos de la instancia."; -"instance.error.loadingDataFailed" = "Error al cargar los datos de la instancia desde el servidor."; - -// Mark: Report screen. -"report.navigationBar.title" = "Informe"; -"report.title.close" = "Cerrar"; -"report.title.send" = "Enviar"; -"report.title.userReported" = "El usuario ha sido denunciado"; -"report.title.postReported" = "La publicación ha sido denunciada"; -"report.title.reportType" = "Tipo de abuso"; -"report.title.spam" = "No deseado (spam)"; -"report.title.sensitive" = "Desnudos o actividad sexual"; -"report.title.abusive" = "Discurso o símbolos de odio"; -"report.title.underage" = "Cuenta de menor de edad"; -"report.title.violence" = "Violencia u organizaciones peligrosas"; -"report.title.copyright" = "Infracción de derechos de autor"; -"report.title.impersonation" = "Suplantación de identidad"; -"report.title.scam" = "Acoso u hostigamiento"; -"report.title.terrorism" = "Terrorismo"; -"report.error.notReported" = "Error al enviar el informe."; - -// Mark: Following requests. -"followingRequests.navigationBar.title" = "Solicitudes de seguimiento"; -"followingRequests.title.approve" = "Aprobar"; -"followingRequests.title.reject" = "Rechazar"; -"followingRequests.error.approve" = "Error al aprobar la solicitud."; -"followingRequests.error.reject" = "Error al rechazar la solicitud."; diff --git a/PixelfedKit/Sources/PixelfedKit/Entities/Link.swift b/PixelfedKit/Sources/PixelfedKit/Entities/Link.swift index 8a12ae2..f8ea40a 100644 --- a/PixelfedKit/Sources/PixelfedKit/Entities/Link.swift +++ b/PixelfedKit/Sources/PixelfedKit/Entities/Link.swift @@ -8,7 +8,7 @@ import Foundation import RegexBuilder /// Link returned in header for paging feature/ -public struct Link { +public struct Link: Codable { /// Raw value of header link. public let rawLink: String diff --git a/PixelfedKit/Sources/PixelfedKit/Entities/Linkable.swift b/PixelfedKit/Sources/PixelfedKit/Entities/Linkable.swift index 0942e9d..3d37d06 100644 --- a/PixelfedKit/Sources/PixelfedKit/Entities/Linkable.swift +++ b/PixelfedKit/Sources/PixelfedKit/Entities/Linkable.swift @@ -7,7 +7,7 @@ import Foundation /// Some of endpoint returns JSON data and additional information in header, like link for paging functionality. -public struct Linkable where T: Codable { +public struct Linkable : Codable where T: Codable { /// Data retunred in HTTP reponse body (mostly JSON data/entities). public let data: T @@ -20,3 +20,29 @@ public struct Linkable where T: Codable { self.link = link } } + +public extension Linkable<[Status]> { + func getMinId() -> String? { + if let link = self.link { + return link.minId + } + + if let firstItemId = self.data.first?.id { + return firstItemId + } + + return nil + } + + func getMaxId() -> String? { + if let link = self.link { + return link.maxId + } + + if let lastItemId = self.data.last?.id { + return lastItemId + } + + return nil + } +} diff --git a/PixelfedKit/Sources/PixelfedKit/Localizable.xcstrings b/PixelfedKit/Sources/PixelfedKit/Localizable.xcstrings index b5bf826..ceb233d 100644 --- a/PixelfedKit/Sources/PixelfedKit/Localizable.xcstrings +++ b/PixelfedKit/Sources/PixelfedKit/Localizable.xcstrings @@ -4,6 +4,12 @@ "global.error.notSuccessResponse" : { "comment" : "It's error returned from remote server. Request URL: '(response.url?.string ?? \"unknown\")'.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serverantwort: %@." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -39,6 +45,12 @@ "global.error.unknownError" : { "comment" : "Response doesn't contains any information about request status.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unbekannter Fehler." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -74,6 +86,12 @@ "report.error.duplicate" : { "comment" : "The report has already been sent.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Bericht wurde bereits gesendet." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -109,6 +127,12 @@ "report.error.invalidObject" : { "comment" : "Invalid object type.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ungültiges Objekt." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -144,6 +168,12 @@ "report.error.invalidObjectId" : { "comment" : "Incorrect object Id.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehlerhafte ID." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -179,6 +209,12 @@ "report.error.invalidParameters" : { "comment" : "Invalid report parameters.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ungültige Parameter." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -214,6 +250,12 @@ "report.error.invalidType" : { "comment" : "Invalid report type.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ungültiger Berichtstyp." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -249,6 +291,12 @@ "report.error.noSelfReports" : { "comment" : "Self-reporting is not allowed.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du darfst Dich nicht selbst melden." + } + }, "en" : { "stringUnit" : { "state" : "translated", diff --git a/PixelfedKit/Sources/PixelfedKit/PixelfedClient+Timelines.swift b/PixelfedKit/Sources/PixelfedKit/PixelfedClient+Timelines.swift index b435a72..478532d 100644 --- a/PixelfedKit/Sources/PixelfedKit/PixelfedClient+Timelines.swift +++ b/PixelfedKit/Sources/PixelfedKit/PixelfedClient+Timelines.swift @@ -13,7 +13,7 @@ public extension PixelfedClientAuthenticated { minId: EntityId? = nil, limit: Int? = nil, includeReblogs: Bool? = nil, - timeoutInterval: Double? = nil) async throws -> [Status] { + timeoutInterval: Double? = nil) async throws -> Linkable<[Status]> { let request = try Self.request( for: baseURL, @@ -22,7 +22,7 @@ public extension PixelfedClientAuthenticated { timeoutInterval: timeoutInterval ) - return try await downloadJson([Status].self, request: request) + return try await downloadJsonWithLink([Status].self, request: request) } func getPublicTimeline(local: Bool? = nil, @@ -31,7 +31,7 @@ public extension PixelfedClientAuthenticated { maxId: EntityId? = nil, sinceId: EntityId? = nil, minId: EntityId? = nil, - limit: Limit? = nil) async throws -> [Status] { + limit: Limit? = nil) async throws -> Linkable<[Status]> { let request = try Self.request( for: baseURL, @@ -39,7 +39,7 @@ public extension PixelfedClientAuthenticated { withBearerToken: token ) - return try await downloadJson([Status].self, request: request) + return try await downloadJsonWithLink([Status].self, request: request) } func getTagTimeline(tag: String, @@ -49,7 +49,7 @@ public extension PixelfedClientAuthenticated { maxId: EntityId? = nil, sinceId: EntityId? = nil, minId: EntityId? = nil, - limit: Int? = nil) async throws -> [Status] { + limit: Int? = nil) async throws -> Linkable<[Status]> { let request = try Self.request( for: baseURL, @@ -57,7 +57,7 @@ public extension PixelfedClientAuthenticated { withBearerToken: token ) - return try await downloadJson([Status].self, request: request) + return try await downloadJsonWithLink([Status].self, request: request) } func setMarkers(_ markers: [Pixelfed.Markers.Timeline: EntityId]) async throws -> Markers { diff --git a/ServicesKit/Sources/ServicesKit/Localizable.xcstrings b/ServicesKit/Sources/ServicesKit/Localizable.xcstrings index 00a9099..392fb4b 100644 --- a/ServicesKit/Sources/ServicesKit/Localizable.xcstrings +++ b/ServicesKit/Sources/ServicesKit/Localizable.xcstrings @@ -2,10 +2,47 @@ "sourceLanguage" : "en", "strings" : { "" : { - + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "eu" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } }, "global.error.downloadingImageFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Das Herunterladen des Bildes in den Cache ist fehlgeschlagen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -18,6 +55,18 @@ "value" : "Error al descargar la imagen en la caché." } }, + "eu" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ezin izan da irudia cachean deskargatu." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Le téléchargement de l'image dans le cache a échoué." + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -25,41 +74,6 @@ } } } - }, - "global.error.unexpected" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unexpected error." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error inesperado." - } - }, - "eu" : { - "stringUnit" : { - "state" : "translated", - "value" : "Espero ez zen errorea." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erreur inattendue." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wystąpił nieoczekiwany błąd." - } - } - } } }, "version" : "1.0" diff --git a/Vernissage.xcodeproj/project.pbxproj b/Vernissage.xcodeproj/project.pbxproj index 9d62a3a..d72530e 100644 --- a/Vernissage.xcodeproj/project.pbxproj +++ b/Vernissage.xcodeproj/project.pbxproj @@ -957,6 +957,7 @@ eu, fr, es, + de, ); mainGroup = F88C245F295C37B80006098B; packageReferences = ( @@ -1209,7 +1210,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.0.0; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage.widget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1243,7 +1244,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.0.0; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage.widget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1276,7 +1277,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.0.0; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage.share; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1308,7 +1309,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.0.0; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage.share; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1474,7 +1475,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0.0; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1517,7 +1518,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0.0; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; diff --git a/Vernissage.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Vernissage.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 6376e84..eccdc69 100644 --- a/Vernissage.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Vernissage.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/kean/Nuke", "state" : { - "revision" : "3f666f120b63ea7de57d42e9a7c9b47f8e7a290b", - "version" : "12.1.6" + "revision" : "1694798e876113d44f6ec6ead965d7286695981d", + "version" : "12.2.0" } }, { diff --git a/Vernissage/Services/HomeTimelineService.swift b/Vernissage/Services/HomeTimelineService.swift index f323033..effd048 100644 --- a/Vernissage/Services/HomeTimelineService.swift +++ b/Vernissage/Services/HomeTimelineService.swift @@ -20,7 +20,7 @@ public class HomeTimelineService { public static let shared = HomeTimelineService() private init() { } - private let maximumAmountOfDownloadedStatuses = 80 + private let maximumAmountOfDownloadedStatuses = 40 private let imagePrefetcher = ImagePrefetcher(destination: .diskCache) private let semaphore = AsyncSemaphore(value: 1) @@ -43,27 +43,49 @@ public class HomeTimelineService { let client = PixelfedClient(baseURL: accountData.serverUrl).getAuthenticated(token: accessToken) var statuses: [Status] = [] - var newestStatusId = lastSeenStatusId + var latestStatusId: String? = nil + var breakProcesssing = false; - // There can be more then 80 newest statuses, that's why we have to sometimes send more then one request. + // There can be more then 40 newest statuses, that's why we have to sometimes send more then one request. while true { do { - let downloadedStatuses = try await client.getHomeTimeline(minId: newestStatusId, + // Download statuses from the top or the list. + let downloadedStatuses = try await client.getHomeTimeline(maxId: latestStatusId, limit: self.maximumAmountOfDownloadedStatuses, includeReblogs: includeReblogs) - guard let firstStatus = downloadedStatuses.first else { - break + // Iterate througt the list until we go to already visible status by the user. + var temporaryList: [Status] = [] + for downloadedStatus in downloadedStatuses.data { + guard downloadedStatus.id != lastSeenStatusId else { + breakProcesssing = true + break + } + + temporaryList.append(downloadedStatus) } - + + // Remove from the list duplicated statuses. let visibleStatuses = self.getVisibleStatuses(accountId: accountData.id, - statuses: downloadedStatuses, + statuses: temporaryList, hideStatusesWithoutAlt: hideStatusesWithoutAlt, modelContext: modelContext) - + + // Add statuses to the list. statuses.append(contentsOf: visibleStatuses) - newestStatusId = firstStatus.id + // Break when we go to the already visible status. + if breakProcesssing { + break + } + + // When we discovered more then 100 statuses we can break. + if statuses.count > 100 { + break + } + + // Set status Id which should be used to download next portion of the statuses. + latestStatusId = downloadedStatuses.getMaxId() } catch { ErrorService.shared.handle(error, message: "global.error.errorDuringDownloadingNewStatuses") break @@ -80,9 +102,10 @@ public class HomeTimelineService { public func getVisibleStatuses(accountId: String, statuses: [Status], hideStatusesWithoutAlt: Bool, modelContext: ModelContext) -> [Status] { // We have to include in the counter only statuses with images. let statusesWithImagesOnly = statuses.getStatusesWithImagesOnly() + let statusesFromOldestToNewest = statusesWithImagesOnly.reversed() var visibleStatuses: [Status] = [] - for status in statusesWithImagesOnly { + for status in statusesFromOldestToNewest { // We have to hide statuses without ALT text. if hideStatusesWithoutAlt && status.statusContainsAltText() == false { @@ -112,7 +135,8 @@ public class HomeTimelineService { visibleStatuses.append(status) } - return visibleStatuses + // Return statuses from newest to oldest. + return visibleStatuses.reversed() } private func hasBeenAlreadyOnTimeline(accountId: String, status: Status, modelContext: ModelContext) -> Bool { diff --git a/Vernissage/Views/HomeTimelineView.swift b/Vernissage/Views/HomeTimelineView.swift index 775a2d2..3852d4e 100644 --- a/Vernissage/Views/HomeTimelineView.swift +++ b/Vernissage/Views/HomeTimelineView.swift @@ -27,7 +27,7 @@ struct HomeTimelineView: View { @State private var opacity = 0.0 @State private var offset = -50.0 - private let defaultLimit = 80 + private let defaultLimit = 40 private let imagePrefetcher = ImagePrefetcher(destination: .diskCache) private let timelineDoubleTapTip = TimelineDoubleTapTip() @@ -143,8 +143,14 @@ struct HomeTimelineView: View { HStack { Image(systemName: "arrow.up") .fontWeight(.light) - Text("\(self.applicationState.amountOfNewStatuses)") - .fontWeight(.semibold) + + if self.applicationState.amountOfNewStatuses < 100 { + Text("\(self.applicationState.amountOfNewStatuses)") + .fontWeight(.semibold) + } else { + Text("+99") + .fontWeight(.semibold) + } } .padding(.vertical, 12) .padding(.horizontal, 18) @@ -183,28 +189,28 @@ struct HomeTimelineView: View { // Download statuses from API (which are older then last visible status). let statuses = try await self.loadFromCacheOrApi(timelineCache: accountData.timelineCache) - if statuses.isEmpty { + if statuses.data.isEmpty { self.allItemsLoaded = true return } // Remember last status id returned by API. - self.lastStatusId = statuses.last?.id + self.lastStatusId = statuses.getMaxId() // Get only visible statuses. let visibleStatuses = HomeTimelineService.shared.getVisibleStatuses(accountId: accountId, - statuses: statuses, + statuses: statuses.data, hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt, modelContext: modelContext) // Remeber first status returned by API in user context (when it's newer then remembered). try AccountDataHandler.shared.update(lastSeenStatusId: nil, - lastLoadedStatusId: statuses.first?.id, + lastLoadedStatusId: statuses.getMinId(), applicationState: self.applicationState, modelContext: modelContext) // Append statuses to viewed. - try ViewedStatusHandler.shared.append(contentsOf: statuses, accountId: accountId, modelContext: modelContext) + try ViewedStatusHandler.shared.append(contentsOf: statuses.data, accountId: accountId, modelContext: modelContext) // Map to view models. let statusModels = visibleStatuses.map({ StatusModel(status: $0) }) @@ -222,24 +228,24 @@ struct HomeTimelineView: View { // Download statuses from API. let statuses = try await self.loadFromApi(maxId: lastStatusId) - if statuses.isEmpty { + if statuses.data.isEmpty { self.allItemsLoaded = true return } // Now we have new last status. - if let lastStatusId = statuses.last?.id { + if let lastStatusId = statuses.getMaxId() { self.lastStatusId = lastStatusId } // Get only visible statuses. let visibleStatuses = HomeTimelineService.shared.getVisibleStatuses(accountId: accountId, - statuses: statuses, + statuses: statuses.data, hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt, modelContext: modelContext) // Append statuses to viewed. - try ViewedStatusHandler.shared.append(contentsOf: statuses, accountId: accountId, modelContext: modelContext) + try ViewedStatusHandler.shared.append(contentsOf: statuses.data, accountId: accountId, modelContext: modelContext) // Map to view models. let statusModels = visibleStatuses.map({ StatusModel(status: $0) }) @@ -260,29 +266,29 @@ struct HomeTimelineView: View { // Download statuses from API. let statuses = try await self.loadFromApi() - if statuses.isEmpty { + if statuses.data.isEmpty { self.allItemsLoaded = true return } // Remember last status id returned by API. - self.lastStatusId = statuses.last?.id + self.lastStatusId = statuses.getMaxId() // Get only visible statuses. let visibleStatuses = HomeTimelineService.shared.getVisibleStatuses(accountId: accountId, - statuses: statuses, + statuses: statuses.data, hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt, modelContext: modelContext) // Remeber first status returned by API in user context (when it's newer then remembered). try AccountDataHandler.shared.update(lastSeenStatusId: self.statusViewModels.first?.id, - lastLoadedStatusId: statuses.first?.id, + lastLoadedStatusId: statuses.getMinId(), statuses: statuses, applicationState: self.applicationState, modelContext: modelContext) // Append statuses to viewed. - try ViewedStatusHandler.shared.append(contentsOf: statuses, accountId: accountId, modelContext: modelContext) + try ViewedStatusHandler.shared.append(contentsOf: statuses.data, accountId: accountId, modelContext: modelContext) // Map to view models. let statusModels = visibleStatuses.map({ StatusModel(status: $0) }) @@ -297,24 +303,22 @@ struct HomeTimelineView: View { self.applicationState.amountOfNewStatuses = 0 } - private func loadFromCacheOrApi(timelineCache: String?) async throws -> [Status] { - if let timelineCache, let timelineCacheData = timelineCache.data(using: .utf8) { - let statusesFromCache = try? JSONDecoder().decode([Status].self, from: timelineCacheData) - if let statusesFromCache { - return statusesFromCache - } + private func loadFromCacheOrApi(timelineCache: String?) async throws -> Linkable<[Status]> { + if let timelineCache, let timelineCacheData = timelineCache.data(using: .utf8), + let statusesFromCache = try? JSONDecoder().decode(Linkable<[Status]>.self, from: timelineCacheData) { + return statusesFromCache } return try await self.loadFromApi() } - private func loadFromApi(maxId: String? = nil, sinceId: String? = nil, minId: String? = nil) async throws -> [Status] { + private func loadFromApi(maxId: String? = nil, sinceId: String? = nil, minId: String? = nil) async throws -> Linkable<[Status]> { return try await self.client.publicTimeline?.getHomeTimeline( maxId: maxId, sinceId: sinceId, minId: minId, limit: self.defaultLimit, - includeReblogs: self.applicationState.showReboostedStatuses) ?? [] + includeReblogs: self.applicationState.showReboostedStatuses) ?? Linkable(data: []) } private func calculateOffset() { diff --git a/Vernissage/Views/StatusesView.swift b/Vernissage/Views/StatusesView.swift index 6295d69..788392d 100644 --- a/Vernissage/Views/StatusesView.swift +++ b/Vernissage/Views/StatusesView.swift @@ -61,7 +61,7 @@ struct StatusesView: View { @State private var containerWidth: Double = UIDevice.isIPad ? UIScreen.main.bounds.width / 3 : UIScreen.main.bounds.width @State private var containerHeight: Double = UIDevice.isIPad ? UIScreen.main.bounds.height / 3 : UIScreen.main.bounds.height - private let defaultLimit = 80 + private let defaultLimit = 40 private let imagePrefetcher = ImagePrefetcher(destination: .diskCache) var body: some View { @@ -182,29 +182,29 @@ struct StatusesView: View { let statuses = try await self.loadFromApi() - if statuses.isEmpty { + if statuses.data.isEmpty { self.allItemsLoaded = true return } // Remember last status id returned by API. - self.lastStatusId = statuses.last?.id + self.lastStatusId = statuses.getMaxId() // Get only visible statuses. let visibleStatuses = HomeTimelineService.shared.getVisibleStatuses(accountId: accountId, - statuses: statuses, + statuses: statuses.data, hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt, modelContext: modelContext) if self.listType == .home { // Remeber first status returned by API in user context (when it's newer then remembered). try AccountDataHandler.shared.update(lastSeenStatusId: nil, - lastLoadedStatusId: statuses.first?.id, + lastLoadedStatusId: statuses.getMinId(), applicationState: self.applicationState, modelContext: modelContext) // Append statuses to viewed. - try ViewedStatusHandler.shared.append(contentsOf: statuses, accountId: accountId, modelContext: modelContext) + try ViewedStatusHandler.shared.append(contentsOf: statuses.data, accountId: accountId, modelContext: modelContext) } // Map to view models. @@ -221,25 +221,25 @@ struct StatusesView: View { if let lastStatusId = self.lastStatusId, let accountId = self.applicationState.account?.id { let statuses = try await self.loadFromApi(maxId: lastStatusId) - if statuses.isEmpty { + if statuses.data.isEmpty { self.allItemsLoaded = true return } // Now we have new last status. - if let lastStatusId = statuses.last?.id { + if let lastStatusId = statuses.getMaxId() { self.lastStatusId = lastStatusId } // Get only visible statuses. let visibleStatuses = HomeTimelineService.shared.getVisibleStatuses(accountId: accountId, - statuses: statuses, + statuses: statuses.data, hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt, modelContext: modelContext) if self.listType == .home { // Append statuses to viewed. - try ViewedStatusHandler.shared.append(contentsOf: statuses, accountId: accountId, modelContext: modelContext) + try ViewedStatusHandler.shared.append(contentsOf: statuses.data, accountId: accountId, modelContext: modelContext) } // Map to view models. @@ -260,29 +260,29 @@ struct StatusesView: View { let statuses = try await self.loadFromApi() - if statuses.isEmpty { + if statuses.data.isEmpty { self.allItemsLoaded = true return } // Remember last status id returned by API. - self.lastStatusId = statuses.last?.id + self.lastStatusId = statuses.getMaxId() // Get only visible statuses. let visibleStatuses = HomeTimelineService.shared.getVisibleStatuses(accountId: accountId, - statuses: statuses, + statuses: statuses.data, hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt, modelContext: modelContext) if self.listType == .home { // Remeber first status returned by API in user context (when it's newer then remembered). try AccountDataHandler.shared.update(lastSeenStatusId: self.statusViewModels.first?.id, - lastLoadedStatusId: statuses.first?.id, + lastLoadedStatusId: statuses.getMinId(), applicationState: self.applicationState, modelContext: modelContext) // Append statuses to viewed. - try ViewedStatusHandler.shared.append(contentsOf: statuses, accountId: accountId, modelContext: modelContext) + try ViewedStatusHandler.shared.append(contentsOf: statuses.data, accountId: accountId, modelContext: modelContext) } // Map to view models. @@ -296,7 +296,7 @@ struct StatusesView: View { self.statusViewModels = statusModels } - private func loadFromApi(maxId: String? = nil, sinceId: String? = nil, minId: String? = nil) async throws -> [Status] { + private func loadFromApi(maxId: String? = nil, sinceId: String? = nil, minId: String? = nil) async throws -> Linkable<[Status]> { switch self.listType { case .home: return try await self.client.publicTimeline?.getHomeTimeline( @@ -304,40 +304,44 @@ struct StatusesView: View { sinceId: sinceId, minId: minId, limit: self.defaultLimit, - includeReblogs: self.applicationState.showReboostedStatuses) ?? [] + includeReblogs: self.applicationState.showReboostedStatuses) ?? Linkable(data: []) case .local: return try await self.client.publicTimeline?.getStatuses( local: true, maxId: maxId, sinceId: sinceId, minId: minId, - limit: self.defaultLimit) ?? [] + limit: self.defaultLimit) ?? Linkable(data: []) case .federated: return try await self.client.publicTimeline?.getStatuses( remote: true, maxId: maxId, sinceId: sinceId, minId: minId, - limit: self.defaultLimit) ?? [] + limit: self.defaultLimit) ?? Linkable(data: []) case .favourites: - return try await self.client.accounts?.favourites( + let favourites = try await self.client.accounts?.favourites( maxId: maxId, sinceId: sinceId, minId: minId, limit: self.defaultLimit) ?? [] + + return Linkable(data: favourites) case .bookmarks: - return try await self.client.accounts?.bookmarks( + let bookmarks = try await self.client.accounts?.bookmarks( maxId: maxId, sinceId: sinceId, minId: minId, limit: self.defaultLimit) ?? [] + + return Linkable(data: bookmarks) case .hashtag(let tag): let hashtagsFromApi = try await self.client.search?.search(query: tag, resultsType: .hashtags) guard let hashtagsFromApi = hashtagsFromApi, hashtagsFromApi.hashtags.isEmpty == false else { ToastrService.shared.showError(title: LocalizedStringResource("global.error.hashtagNotExists"), imageSystemName: "exclamationmark.octagon") dismiss() - return [] + return Linkable(data: []) } return try await self.client.publicTimeline?.getTagStatuses( @@ -345,7 +349,7 @@ struct StatusesView: View { maxId: maxId, sinceId: sinceId, minId: minId, - limit: self.defaultLimit) ?? [] + limit: self.defaultLimit) ?? Linkable(data: []) } } diff --git a/Vernissage/Widgets/ImagesGrid.swift b/Vernissage/Widgets/ImagesGrid.swift index 74f1bcd..3bac12a 100644 --- a/Vernissage/Widgets/ImagesGrid.swift +++ b/Vernissage/Widgets/ImagesGrid.swift @@ -75,7 +75,7 @@ struct ImagesGrid: View { do { let statusesFromApi = try await self.loadStatuses() - let statusesWithImages = statusesFromApi.getStatusesWithImagesOnly() + let statusesWithImages = statusesFromApi.data.getStatusesWithImagesOnly() let photoUrls = self.getPhotoUrls(statuses: statusesWithImages) self.prefetch(photoUrls: photoUrls) @@ -119,15 +119,21 @@ struct ImagesGrid: View { } } - private func loadStatuses() async throws -> [Status] { + private func loadStatuses() async throws -> Linkable<[Status]> { switch self.gridType { case .hashtag(let name): return try await self.client.publicTimeline?.getTagStatuses( tag: name, local: true, - limit: 10) ?? [] + limit: 10) ?? Linkable(data: []) case .account(let accountId, _, _): - return try await self.client.accounts?.statuses(createdBy: accountId, onlyMedia: true, limit: 10) ?? [] + let accountStatuses = try await self.client.accounts?.statuses( + createdBy: accountId, + onlyMedia: true, + limit: 10 + ) ?? [] + + return Linkable(data: accountStatuses) } } diff --git a/VernissageWidget/PhotoWidget/Service/StatusFetcher.swift b/VernissageWidget/PhotoWidget/Service/StatusFetcher.swift index a786805..01e0483 100644 --- a/VernissageWidget/PhotoWidget/Service/StatusFetcher.swift +++ b/VernissageWidget/PhotoWidget/Service/StatusFetcher.swift @@ -33,7 +33,7 @@ public class StatusFetcher { let client = PixelfedClient(baseURL: account.serverUrl).getAuthenticated(token: accessToken) let statuses = try await client.getHomeTimeline(limit: 20, includeReblogs: defaultSettings.showReboostedStatuses, timeoutInterval: 5.0) - let widgetEntries = await self.prepare(statuses: statuses, length: length) + let widgetEntries = await self.prepare(statuses: statuses.data, length: length) return widgetEntries } @@ -49,11 +49,11 @@ public class StatusFetcher { let accountData = AccountDataHandler.shared.getAccountData(accountId: accountId, modelContext: modelContext) guard let timelineCache = accountData?.timelineCache, let timelineCacheData = timelineCache.data(using: .utf8), - let statusesFromCache = try? JSONDecoder().decode([Status].self, from: timelineCacheData) else { + let statusesFromCache = try? JSONDecoder().decode(Linkable<[Status]>.self, from: timelineCacheData) else { return [self.placeholder()] } - let widgetEntries = await self.prepare(statuses: statusesFromCache, length: length) + let widgetEntries = await self.prepare(statuses: statusesFromCache.data, length: length) return widgetEntries } diff --git a/WidgetsKit/Sources/WidgetsKit/Localizable.xcstrings b/WidgetsKit/Sources/WidgetsKit/Localizable.xcstrings index 6a41a31..a06c6bc 100644 --- a/WidgetsKit/Sources/WidgetsKit/Localizable.xcstrings +++ b/WidgetsKit/Sources/WidgetsKit/Localizable.xcstrings @@ -3,6 +3,12 @@ "strings" : { "" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -31,6 +37,12 @@ }, "@%@" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "@%@" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -59,6 +71,12 @@ }, "#%@" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -87,6 +105,12 @@ }, "%@" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -115,6 +139,12 @@ }, "%@, %@" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@" + } + }, "en" : { "stringUnit" : { "state" : "new", @@ -149,6 +179,12 @@ }, "%lld" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -177,6 +213,12 @@ }, "compose.error.cannotLoadImageFromExternalLibrary" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Bild kann nicht aus externer Bibliothek geladen werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -199,6 +241,12 @@ }, "compose.error.errorDuringComposingAttributeString" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Fehler beim Zusammenstellen der Attributzeichenfolge." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -221,6 +269,12 @@ }, "compose.error.errorDuringDownloadingAutocomplete" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Fehler beim Herunterladen von Autocomplete." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -243,6 +297,12 @@ }, "compose.error.loadingPhotosFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kann das Foto nicht aus der Bibliothek laden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -277,6 +337,12 @@ }, "compose.error.postingStatusFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Veröffentlichen des Beitrags." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -311,6 +377,12 @@ }, "compose.title.attachPhotoFull" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Füge ein Foto hinzu und beschreibe, was Du denkst." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -345,6 +417,12 @@ }, "compose.title.attachPhotoMini" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beschreibe was Du denkst." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -380,6 +458,12 @@ "compose.title.camera" : { "comment" : "Camera", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Foto aufnehmen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -415,6 +499,12 @@ "compose.title.cancel" : { "comment" : "Cancel", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abbrechen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -450,6 +540,12 @@ "compose.title.commentsWillBeDisabled" : { "comment" : "Comments disabled", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kommentare werden nicht möglich sein" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -484,6 +580,12 @@ }, "compose.title.delete" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Löschen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -518,6 +620,12 @@ }, "compose.title.edit" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bearbeiten" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -552,6 +660,12 @@ }, "compose.title.everyone" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öffentlich" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -587,6 +701,12 @@ "compose.title.files" : { "comment" : "Files", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dateien durchsuchen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -621,6 +741,12 @@ }, "compose.title.followers" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "für Follower" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -656,6 +782,12 @@ "compose.title.missingAltTexts" : { "comment" : "Missing ALT texts", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehlende ALT-Texte" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -691,6 +823,12 @@ "compose.title.missingAltTextsWarning" : { "comment" : "Missing ALT texts warning", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Es haben nicht alle Fotos eine Beschreibung für Sehbehinderte. Möchtest Du trotzdem senden?" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -726,6 +864,12 @@ "compose.title.photos" : { "comment" : "Photo", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fotobibliothek" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -761,6 +905,12 @@ "compose.title.publish" : { "comment" : "Publish", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veröffentlichen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -796,6 +946,12 @@ "compose.title.tryToUpload" : { "comment" : "Try to upload", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versuche hochzuladen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -830,6 +986,12 @@ }, "compose.title.unlisted" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "nicht gelistet" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -865,6 +1027,12 @@ "compose.title.writeContentWarning" : { "comment" : "Content warning", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inhaltswarnung hinzufügen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -899,6 +1067,12 @@ }, "global.error.errorDuringDeletingFileFromTmpDirectory" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Fehler beim Löschen einer Datei aus dem tmp-Verzeichnis." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -921,6 +1095,12 @@ }, "global.error.errorDuringGettingTmpDirectoryContents" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Fehler beim Abrufen des Inhalts des tmp-Verzeichnisses." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -943,6 +1123,12 @@ }, "global.error.errorDuringRemovingTransferredImage" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Fehler beim Entfernen des übertragenen Bildes aus dem tmp-Verzeichnis." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -966,6 +1152,12 @@ "global.title.contentWarning" : { "comment" : "Sensitive content", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inhaltswarnung" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1001,6 +1193,12 @@ "global.title.momentsAgo" : { "comment" : "moments ago", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "gerade eben" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1036,6 +1234,12 @@ "global.title.refresh" : { "comment" : "Refresh", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktualisieren" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1071,6 +1275,12 @@ "global.title.seePost" : { "comment" : "See post", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beitrag ansehen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1105,6 +1315,12 @@ }, "global.title.showLess" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weniger anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1139,6 +1355,12 @@ }, "global.title.showMore" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mehr anzeigen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1173,6 +1395,12 @@ }, "photoEdit.error.updatePhotoFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Aktualisieren des Fotos." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1208,6 +1436,12 @@ "photoEdit.navigationBar.title" : { "comment" : "Title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fotodetails" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1243,6 +1477,12 @@ "photoEdit.title.accessibility" : { "comment" : "Accessibility", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Barrierefreiheit" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1278,6 +1518,12 @@ "photoEdit.title.accessibilityDescription" : { "comment" : "Accesibility", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beschreibung für Sehbehinderte" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1313,6 +1559,12 @@ "photoEdit.title.cancel" : { "comment" : "Cancel", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abbrechen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1348,6 +1600,12 @@ "photoEdit.title.photo" : { "comment" : "Photo", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Foto" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1383,6 +1641,12 @@ "photoEdit.title.save" : { "comment" : "Save", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Speichern" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1417,6 +1681,12 @@ }, "placeSelector.error.loadingPlacesFailed" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benachrichtigungen konnten nicht geladen werden." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1452,6 +1722,12 @@ "placeSelector.navigationBar.title" : { "comment" : "Title", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Orte" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1487,6 +1763,12 @@ "placeSelector.title.buttonSearch" : { "comment" : "Search", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suchen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1522,6 +1804,12 @@ "placeSelector.title.cancel" : { "comment" : "Cancel", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abbrechen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1557,6 +1845,12 @@ "placeSelector.title.search" : { "comment" : "Search", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suchen..." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1592,6 +1886,12 @@ "status.title.altText" : { "comment" : "ALT", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "ALT" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1627,6 +1927,12 @@ "tip.mainNavigation.message" : { "comment" : "Main navigation tip message.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Sie können die Position des Hauptnavigationsmenüs in den Einstellungen der App anpassen." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1644,6 +1950,12 @@ "tip.mainNavigation.title" : { "comment" : "Main navigation tip title.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Position im Menü" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1661,6 +1973,12 @@ "tip.menuCustomizable.message" : { "comment" : "Menu customizable tip message.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Sie können die Standardoptionen im Menü ändern, indem Sie lange auf die jeweilige Option drücken." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1678,6 +1996,12 @@ "tip.menuCustomizable.title" : { "comment" : "Menu customizable tip title.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ändern der Standardoptionen" + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1695,6 +2019,12 @@ "tip.timelineDoubleTap.message" : { "comment" : "Timeline double tip message.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ein Doppeltippen auf ein Foto führt dazu, dass es favorisiert wird." + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -1712,6 +2042,12 @@ "tip.timelineDoubleTap.title" : { "comment" : "Timeline double tip title.", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Als Favorit markieren" + } + }, "en" : { "stringUnit" : { "state" : "translated",