Merge pull request #92 from VernissageApp/feature/new-translation-system

Feature/new translation system
This commit is contained in:
Marcin Czachurski 2023-10-18 17:59:11 +02:00 committed by GitHub
commit df3ae90c94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
53 changed files with 13222 additions and 1745 deletions

View File

@ -1,10 +1,11 @@
// swift-tools-version: 5.8
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "ClientKit",
defaultLocalization: "en",
platforms: [
.iOS(.v16),
.macOS(.v12),

View File

@ -0,0 +1,5 @@
{
"sourceLanguage" : "en",
"strings" : {},
"version" : "1.0"
}

View File

@ -1,10 +1,11 @@
// swift-tools-version: 5.8
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "EnvironmentKit",
defaultLocalization: "en",
platforms: [
.iOS(.v16),
.macOS(.v12),

View File

@ -0,0 +1,5 @@
{
"sourceLanguage" : "en",
"strings" : {},
"version" : "1.0"
}

File diff suppressed because it is too large Load Diff

View File

@ -1,381 +0,0 @@
// MARK: Common strings.
"global.title.contentWarning" = "Sensitive content";
"global.title.seePost" = "See post";
"global.title.refresh" = "Refresh";
"global.title.momentsAgo" = "moments ago";
"global.title.success" = "Success";
"global.title.photoSaved" = "Photo has been saved.";
"global.title.ok" = "OK";
"global.title.showMore" = "Show more";
"global.title.showLess" = "Show less";
"global.title.close" = "Close";
"global.error.refreshingCredentialsTitle" = "Refreshing credentials error.";
"global.error.refreshingCredentialsSubtitle" = "Please sign in again to Pixelfed.";
// MARK: Global errors.
"global.error.unexpected" = "Unexpected error.";
"global.error.statusesNotRetrieved" = "Statuses not retrieved.";
"global.error.errorDuringDownloadStatuses" = "Error during download statuses from server.";
"global.error.errorDuringDownloadHashtag" = "Error during download tag from server.";
"global.error.hashtagNotExists" = "Hashtag does not exists.";
"global.error.errorDuringImageDownload" = "Cannot download image.";
"global.error.canceledImageDownload" = "Download image has been canceled.";
"global.error.errorDuringDataLoad" = "Loading data failed.";
"global.error.errorDuringUserRead" = "Cannot retrieve user account.";
"global.error.badUrlServer" = "Bad url to server.";
"global.error.accessTokenNotFound" = "Access token not found.";
"global.error.errorDuringDownloadStatus" = "Error during download status from server.";
"global.error.errorDuringPurchaseVerification" = "Purchase verification failed.";
// MARK: Main view (main navigation bar).
"mainview.tab.homeTimeline" = "Home";
"mainview.tab.localTimeline" = "Local";
"mainview.tab.federatedTimeline" = "Federated";
"mainview.tab.trendingPhotos" = "Photos";
"mainview.tab.trendingTags" = "Tags";
"mainview.tab.trendingAccounts" = "Accounts";
"mainview.tab.userProfile" = "Profile";
"mainview.tab.notifications" = "Notifications";
"mainview.tab.search" = "Search";
"mainview.tab.trending" = "Trending";
// MARK: Main view (leading navigation bar).
"mainview.menu.settings" = "Settings";
// MARK: Main view (error notifications).
"mainview.error.switchAccounts" = "Cannot switch accounts.";
// MARK: Home timeline.
"home.title.allCaughtUp" = "You're all caught up";
"home.title.noPhotos" = "Unfortunately, there are no photos here.";
// MARK: Statuses timeline (local/federated/favourite/bookmarks etc.).
"statuses.navigationBar.localTimeline" = "Local";
"statuses.navigationBar.federatedTimeline" = "Federated";
"statuses.navigationBar.favourites" = "Favourites";
"statuses.navigationBar.bookmarks" = "Bookmarks";
"statuses.title.noPhotos" = "Unfortunately, there are no photos here.";
"statuses.title.tagFollowed" = "You are following the tag.";
"statuses.title.tagUnfollowed" = "Tag has been unfollowed.";
"statuses.error.loadingStatusesFailed" = "Loading statuses failed.";
"statuses.error.tagFollowFailed" = "Follow tag failed.";
"statuses.error.tagUnfollowFailed" = "Unfollow tag failed.";
// Mark: Search view.
"search.navigationBar.title" = "Search";
"search.title.placeholder" = "Search...";
"search.title.usersWith" = "Users with %@";
"search.title.goToUser" = "Go to user %@";
"search.title.hashtagWith" = "Hashtags with %@";
"search.title.goToHashtag" = "Go to hashtag %@";
// Mark: Trending statuses.
"trendingStatuses.navigationBar.title" = "Photos";
"trendingStatuses.title.daily" = "Daily";
"trendingStatuses.title.monthly" = "Monthly";
"trendingStatuses.title.yearly" = "Yearly";
"trendingStatuses.error.loadingStatusesFailed" = "Loading statuses failed.";
"trendingStatuses.title.noPhotos" = "Unfortunately, there are no photos here.";
// Mark: Trending tags.
"tags.navigationBar.trendingTitle" = "Tags";
"tags.navigationBar.searchTitle" = "Tags";
"tags.navigationBar.followedTitle" = "Followed tags";
"tags.title.noTags" = "Unfortunately, there are no tags here.";
"tags.title.amountOfPosts" = "%d posts";
"tags.error.loadingTagsFailed" = "Loading tags failed.";
// Mark: Trending accounts.
"trendingAccounts.navigationBar.title" = "Accounts";
"trendingAccounts.title.noAccounts" = "Unfortunately, there is no one here.";
"trendingAccounts.error.loadingAccountsFailed" = "Loading accounts failed.";
// Mark: User profile view.
"userProfile.title.openInBrowser" = "Open in browser";
"userProfile.title.share" = "Share";
"userProfile.title.unmute" = "Unmute";
"userProfile.title.mute" = "Mute";
"userProfile.title.unblock" = "Unblock";
"userProfile.title.block" = "Block";
"userProfile.title.favourites" = "Favourites";
"userProfile.title.bookmarks" = "Bookmarks";
"userProfile.title.followedTags" = "Followed tags";
"userProfile.title.posts" = "Posts";
"userProfile.title.followers" = "Followers";
"userProfile.title.following" = "Following";
"userProfile.title.joined" = "Joined %@";
"userProfile.title.unfollow" = "Unfollow";
"userProfile.title.follow" = "Follow";
"userProfile.title.instance" = "Instance information";
"userProfile.title.blocks" = "Blocked accounts";
"userProfile.title.mutes" = "Muted accounts";
"userProfile.title.muted" = "Account muted";
"userProfile.title.unmuted" = "Account unmuted";
"userProfile.title.blocked" = "Account blocked";
"userProfile.title.unblocked" = "Account unblocked";
"userProfile.title.report" = "Report";
"userProfile.title.followsYou" = "Follows you";
"userProfile.title.requestFollow" = "Request follow";
"userProfile.title.cancelRequestFollow" = "Cancel request";
"userProfile.title.followRequests" = "Follow requests";
"userProfile.title.privateProfileTitle" = "This profile is private.";
"userProfile.title.privateProfileSubtitle" = "Only approved followers can see photos.";
"userProfile.error.notExists" = "Account does not exists.";
"userProfile.error.loadingAccountFailed" = "Error during download account from server.";
"userProfile.error.muting" = "Muting/unmuting action failed.";
"userProfile.error.block" = "Block/unblock action failed.";
"userProfile.error.relationship" = "Relationship action failed.";
"userProfile.title.edit" = "Edit";
"userProfile.title.muted" = "Muted";
"userProfile.title.blocked" = "Blocked";
"userProfile.title.enableBoosts" = "Enable boosts";
"userProfile.title.disableBoosts" = "Disable boosts";
"userProfile.title.boostedStatusesMuted" = "Boosts muted";
// Mark: Notifications view.
"notifications.navigationBar.title" = "Notifications";
"notifications.title.noNotifications" = "Unfortunately, there is nothing here.";
"notifications.title.followedYou" = "followed you";
"notifications.title.mentionedYou" = "mentioned you";
"notifications.title.boosted" = "boosted";
"notifications.title.favourited" = "favourited";
"notifications.title.postedStatus" = "posted status";
"notifications.title.followRequest" = "follow request";
"notifications.title.poll" = "poll";
"notifications.title.updatedStatus" = "updated status";
"notifications.title.signedUp" = "signed up";
"notifications.title.newReport" = "new report";
"notifications.error.loadingNotificationsFailed" = "Loading notifications failed.";
// Mark: Compose view.
"compose.navigationBar.title" = "Compose";
"compose.title.everyone" = "Everyone";
"compose.title.unlisted" = "Unlisted";
"compose.title.followers" = "Followers";
"compose.title.attachPhotoFull" = "Attach a photo and type what's on your mind";
"compose.title.attachPhotoMini" = "Type what's on your mind";
"compose.title.publish" = "Publish";
"compose.title.cancel" = "Cancel";
"compose.title.writeContentWarning" = "Write content warning";
"compose.title.commentsWillBeDisabled" = "Comments will be disabled";
"compose.title.statusPublished" = "Status published";
"compose.title.tryToUpload" = "Try to upload";
"compose.title.delete" = "Delete";
"compose.title.edit" = "Edit";
"compose.title.photos" = "Photos library";
"compose.title.camera" = "Take photo";
"compose.title.files" = "Browse files";
"compose.title.missingAltTexts" = "Missing ALT texts";
"compose.title.missingAltTextsWarning" = "Not all images have been described for the visually impaired. Would you like to send photos anyway?";
"compose.error.loadingPhotosFailed" = "Cannot retreive image from library.";
"compose.error.postingPhotoFailed" = "Error during posting photo.";
"compose.error.postingStatusFailed" = "Error during posting status.";
// Mark: Photo editor view.
"photoEdit.navigationBar.title" = "Photo details";
"photoEdit.title.photo" = "Photo";
"photoEdit.title.accessibility" = "Accessibility";
"photoEdit.title.accessibilityDescription" = "Description for the visually impaired";
"photoEdit.title.save" = "Save";
"photoEdit.title.cancel" = "Cancel";
"photoEdit.error.updatePhotoFailed" = "Error during updating photo.";
// Mark: Place selector view.
"placeSelector.navigationBar.title" = "Places";
"placeSelector.title.search" = "Search...";
"placeSelector.title.buttonSearch" = "Search";
"placeSelector.title.cancel" = "Cancel";
"placeSelector.error.loadingPlacesFailed" = "Loading notifications failed.";
// Mark: Settings view.
"settings.navigationBar.title" = "Settings";
"settings.title.close" = "Close";
"settings.title.version" = "Version";
"settings.title.accounts" = "Accounts";
"settings.title.newAccount" = "New account";
"settings.title.accent" = "Accent";
"settings.title.theme" = "Theme";
"settings.title.system" = "System";
"settings.title.light" = "Light";
"settings.title.dark" = "Dark";
"settings.title.avatar" = "Avatar";
"settings.title.circle" = "Circle";
"settings.title.rounderRectangle" = "Rounded rectangle";
"settings.title.other" = "Other";
"settings.title.thirdParty" = "Third party";
"settings.title.reportBug" = "Report a bug";
"settings.title.githubIssues" = "Issues on Github";
"settings.title.follow" = "Follow me";
"settings.title.support" = "Support";
"settings.title.thankYouTitle" = "Thank you 💕";
"settings.title.thankYouMessage" = "Thanks for your purchase. Purchases both big and small help us keep our dream of providing the best quality products to our customers. We hope youre loving Vernissage.";
"settings.title.thankYouClose" = "Close";
"settings.title.haptics" = "Haptics";
"settings.title.hapticsTabSelection" = "Tab selection";
"settings.title.hapticsButtonPress" = "Button press";
"settings.title.hapticsListRefresh" = "List refresh";
"settings.title.hapticsAnimationFinished" = "Animation finished";
"settings.title.mediaSettings" = "Media settings";
"settings.title.alwaysShowSensitiveTitle" = "Always show NSFW";
"settings.title.alwaysShowSensitiveDescription" = "Force show all NFSW (sensitive) media without warnings";
"settings.title.alwaysShowAltTitle" = "Show alternative text";
"settings.title.alwaysShowAltDescription" = "Show alternative text if present on status details screen";
"settings.title.general" = "General";
"settings.title.applicationIcon" = "Application icon";
"settings.title.followVernissage" = "Follow Vernissage";
"settings.title.mastodonAccount" = "Mastodon account";
"settings.title.pixelfedAccount" = "Pixelfed account";
"settings.title.openPage" = "Open";
"settings.title.privacyPolicy" = "Privacy policy";
"settings.title.terms" = "Terms & Conditions";
"settings.title.sourceCode" = "Source code";
"settings.title.rate" = "Rate Vernissage";
"settings.title.socials" = "Socials";
"settings.title.menuPosition" = "Menu position";
"settings.title.topMenu" = "Navigation bar";
"settings.title.bottomRightMenu" = "Bottom right";
"settings.title.bottomLeftMenu" = "Bottom left";
"settings.title.showAvatars" = "Show avatars";
"settings.title.showAvatarsOnTimeline" = "Avatars will be displayed on timelines";
"settings.title.showFavourite" = "Show favourites";
"settings.title.showFavouriteOnTimeline" = "Favourites will be displayed on timelines";
"settings.title.showAltText" = "Show ALT icon";
"settings.title.showAltTextOnTimeline" = "ALT icon will be displayed on timelines";
"settings.title.warnAboutMissingAltTitle" = "Warn of missing ALT text";
"settings.title.warnAboutMissingAltDescription" = "A warning about missing ALT texts will be displayed before publishing new post.";
"settings.title.enableReboostOnTimeline" = "Show boosted statuses";
"settings.title.enableReboostOnTimelineDescription" = "Boosted statuses will be visible on your home timeline.";
"settings.title.hideStatusesWithoutAlt" = "Hide statuses without ALT text";
"settings.title.hideStatusesWithoutAltDescription" = "Statuses without ALT text will not be visible on your home timeline.";
// Mark: Signin view.
"signin.navigationBar.title" = "Sign in to Pixelfed";
"signin.title.serverAddress" = "Server address";
"signin.title.signIn" = "Sign in";
"signin.title.enterServerAddress" = "Enter server address";
"signin.title.howToJoinLink" = "How to join Pixelfed";
"signin.title.chooseServer" = "Or choose Pixelfed server";
"signin.title.amountOfUsers" = "%d users";
"signin.title.amountOStatuses" = "%d statuses";
"signin.error.communicationFailed" = "Communication with server failed.";
// Mark: Status view.
"status.navigationBar.title" = "Details";
"status.title.uploaded" = "Uploaded";
"status.title.via" = "via %@";
"status.title.reboostedBy" = "Boosted by";
"status.title.favouritedBy" = "Favourited by";
"status.title.openInBrowser" = "Open in browser";
"status.title.shareStatus" = "Share status";
"status.title.yourStatus" = "Your status";
"status.title.delete" = "Delete";
"status.title.reboosted" = "Boosted";
"status.title.unreboosted" = "Unboosted";
"status.title.favourited" = "Favourited";
"status.title.unfavourited" = "Unfavourited";
"status.title.bookmarked" = "Bookmarked";
"status.title.unbookmarked" = "Unbookmarked";
"status.title.statusDeleted" = "Status deleted";
"status.title.reboost" = "Boost";
"status.title.unreboost" = "Unboost";
"status.title.favourite" = "Favourite";
"status.title.unfavourite" = "Unfavourite";
"status.title.bookmark" = "Bookmark";
"status.title.unbookmark" = "Unbookmark";
"status.title.comment" = "Comment";
"status.title.report" = "Report";
"status.title.saveImage" = "Save image";
"status.title.showMediaDescription" = "Show media description";
"status.title.mediaDescription" = "Media description";
"status.title.shareImage" = "Share image";
"status.title.altText" = "ALT";
"status.error.loadingStatusFailed" = "Loading status failed.";
"status.error.notFound" = "Status not existing anymore.";
"status.error.loadingCommentsFailed" = "Comments cannot be downloaded.";
"status.error.reboostFailed" = "Boost action failed.";
"status.error.favouriteFailed" = "Favourite action failed.";
"status.error.bookmarkFailed" = "Bookmark action failed.";
"status.error.deleteFailed" = "Delete action failed.";
// Mark: Accounts view.
"accounts.navigationBar.followers" = "Followers";
"accounts.navigationBar.following" = "Following";
"accounts.navigationBar.favouritedBy" = "Favourited by";
"accounts.navigationBar.reboostedBy" = "Boosted by";
"accounts.navigationBar.blocked" = "Blocked accounts";
"accounts.navigationBar.mutes" = "Muted accounts";
"accounts.title.noAccounts" = "Unfortunately, there is no one here.";
"accounts.error.loadingAccountsFailed" = "Loading accounts failed.";
// Mark: Third party view.
"thirdParty.navigationBar.title" = "Third party";
// Mark: Widget view.
"widget.title.photoDescription" = "Widget with photos from Pixelfed.";
"widget.title.qrCodeDescription" = "Widget with QR Code to your Pixelfed profile.";
// Mark: In-app purchases.
"purchase.donut.title" = "Donut";
"purchase.donut.description" = "Treat me to a doughnut.";
"purchase.coffee.title" = "Coffee";
"purchase.coffee.description" = "Treat me to a coffee.";
"purchase.cake.title" = "Coffee & cake";
"purchase.cake.description" = "Treat me to a coffee and cake.";
// Mark: Edit profile.
"editProfile.navigationBar.title" = "Edit profile";
"editProfile.title.displayName" = "Display name";
"editProfile.title.bio" = "Bio";
"editProfile.title.website" = "Website";
"editProfile.title.save" = "Save";
"editProfile.title.accountSaved" = "Profile has been updated.";
"editProfile.title.photoInfo" = "The changed photo will be visible in the app and on the website with a small delay.";
"editProfile.title.privateAccount" = "Private account";
"editProfile.title.privateAccountInfo" = "When your account is private, only people you approve can see your photos and videos on Pixelfed. Your existing followers won't be affected.";
"editProfile.error.saveAccountFailed" = "Saving profile failed.";
"editProfile.error.loadingAvatarFailed" = "Loading avatar failed.";
"editProfile.error.noProfileData" = "Profile data cannot be displayed.";
"editProfile.error.loadingAccountFailed" = "Error during download account from server.";
// Mark: Instance information.
"instance.navigationBar.title" = "Instance";
"instance.title.instanceInfo" = "Instance info";
"instance.title.name" = "Name";
"instance.title.address" = "Address";
"instance.title.email" = "Email";
"instance.title.version" = "Version";
"instance.title.users" = "Users";
"instance.title.posts" = "Posts";
"instance.title.domains" = "Domains";
"instance.title.registrations" = "Registrations";
"instance.title.approvalRequired" = "Approval required";
"instance.title.rules" = "Instance rules";
"instance.title.contact" = "Contact";
"instance.title.pixelfedAccount" = "Pixelfed account";
"instance.error.noInstanceData" = "Instance data cannot be displayed.";
"instance.error.loadingDataFailed" = "Error during download instance data from server.";
// Mark: Report screen.
"report.navigationBar.title" = "Report";
"report.title.close" = "Close";
"report.title.send" = "Send";
"report.title.userReported" = "User has been reported";
"report.title.postReported" = "Post has been reported";
"report.title.reportType" = "Type of abuse";
"report.title.spam" = "It's a spam";
"report.title.sensitive" = "Nudity or sexual activity";
"report.title.abusive" = "Hate speech or symbols";
"report.title.underage" = "Underage account";
"report.title.violence" = "Violence or dangerous organisations";
"report.title.copyright" = "Copyright infringement";
"report.title.impersonation" = "Impersonation";
"report.title.scam" = "Bullying or harassment";
"report.title.terrorism" = "Terrorism";
"report.error.notReported" = "Error during sending report.";
// Mark: Following requests.
"followingRequests.navigationBar.title" = "Following requests";
"followingRequests.title.approve" = "Approve";
"followingRequests.title.reject" = "Reject";
"followingRequests.error.approve" = "Error during approving request.";
"followingRequests.error.reject" = "Error during rejecting request.";

View File

@ -1,381 +0,0 @@
// MARK: Common strings.
"global.title.contentWarning" = "Eduki hunkigarria";
"global.title.seePost" = "Ikusi bidalketa";
"global.title.refresh" = "Freskatu";
"global.title.momentsAgo" = "oraintxe bertan";
"global.title.success" = "Primeran";
"global.title.photoSaved" = "Argazkia gorde da.";
"global.title.ok" = "Ados";
"global.title.showMore" = "Erakutsi gehiago";
"global.title.showLess" = "Erakutsi gutxiago";
"global.title.close" = "Itxi";
"global.error.refreshingCredentialsTitle" = "Egiaztagirien freskatzeak huts egin du.";
"global.error.refreshingCredentialsSubtitle" = "Hasi saioa berriro Pixelfeden.";
// MARK: Global errors.
"global.error.unexpected" = "Espero ez zen errorea.";
"global.error.statusesNotRetrieved" = "Ez dira egoerak eskuratu.";
"global.error.errorDuringDownloadStatuses" = "Errorea zerbitzaritik egoerak eskuratzean.";
"global.error.errorDuringDownloadHashtag" = "Errorea zerbitzaritik traolak eskuratzean.";
"global.error.hashtagNotExists" = "Traola ez da lehendik existitzen.";
"global.error.errorDuringImageDownload" = "Ezin da irudia eskuratu.";
"global.error.canceledImageDownload" = "Irudiaren deskarga bertan behera utzi da.";
"global.error.errorDuringDataLoad" = "Datuen kargak huts egin du.";
"global.error.errorDuringUserRead" = "Ezin izan da erabiltzailearen kontua eskuratu.";
"global.error.badUrlServer" = "Zerbitzariaren URL okerra.";
"global.error.accessTokenNotFound" = "Ez da sarbide-tokena aurkitu.";
"global.error.errorDuringDownloadStatus" = "Errorea zerbitzaritik egoera eskuratzean.";
"global.error.errorDuringPurchaseVerification" = "Erosketaren egiaztaketak huts egin du.";
// MARK: Main view (main navigation bar).
"mainview.tab.homeTimeline" = "Hasiera";
"mainview.tab.localTimeline" = "Lokala";
"mainview.tab.federatedTimeline" = "Federatua";
"mainview.tab.trendingPhotos" = "Argazkiak";
"mainview.tab.trendingTags" = "Traolak";
"mainview.tab.trendingAccounts" = "Kontuak";
"mainview.tab.userProfile" = "Profila";
"mainview.tab.notifications" = "Jakinarazpenak";
"mainview.tab.search" = "Bilatu";
"mainview.tab.trending" = "Bogan";
// MARK: Main view (leading navigation bar).
"mainview.menu.settings" = "Ezarpenak";
// MARK: Main view (error notifications).
"mainview.error.switchAccounts" = "Ezin da kontua aldatu.";
// MARK: Home timeline.
"home.title.allCaughtUp" = "Egunean zaude";
"home.title.noPhotos" = "Argazkirik ez.";
// MARK: Statuses timeline (local/federated/favourite/bookmarks etc.).
"statuses.navigationBar.localTimeline" = "Lokala";
"statuses.navigationBar.federatedTimeline" = "Federatua";
"statuses.navigationBar.favourites" = "Gogokoak";
"statuses.navigationBar.bookmarks" = "Laster-markak";
"statuses.title.noPhotos" = "Argazkirik ez.";
"statuses.title.tagFollowed" = "Traolari jarraitzen diozu.";
"statuses.title.tagUnfollowed" = "Traola jarraitzeari utzi diozu.";
"statuses.error.loadingStatusesFailed" = "Egoerak kargatzeak huts egin du.";
"statuses.error.tagFollowFailed" = "Traolari jarraitzeak huts egin du.";
"statuses.error.tagUnfollowFailed" = "Traolari jarraitzeari uzteak huts egin du.";
// Mark: Search view.
"search.navigationBar.title" = "Bilatu";
"search.title.placeholder" = "Bilatu...";
"search.title.usersWith" = "%@ duten erabiltzaileak";
"search.title.goToUser" = "Joan %@ erabiltzailera";
"search.title.hashtagWith" = "%@ duten traolak";
"search.title.goToHashtag" = "Joan %@ traolara";
// Mark: Trending statuses.
"trendingStatuses.navigationBar.title" = "Argazkiak";
"trendingStatuses.title.daily" = "Egunekoak";
"trendingStatuses.title.monthly" = "Hilabetekoak";
"trendingStatuses.title.yearly" = "Urtekoak";
"trendingStatuses.error.loadingStatusesFailed" = "Egoerak kargatzeak huts egin du.";
"trendingStatuses.title.noPhotos" = "Argazkirik ez.";
// Mark: Trending tags.
"tags.navigationBar.trendingTitle" = "Traolak";
"tags.navigationBar.searchTitle" = "Traolak";
"tags.navigationBar.followedTitle" = "Jarraitzen dituzun traolak";
"tags.title.noTags" = "Traolarik ez.";
"tags.title.amountOfPosts" = "%d bidalketa";
"tags.error.loadingTagsFailed" = "Traolak kargatzeak huts egin du.";
// Mark: Trending accounts.
"trendingAccounts.navigationBar.title" = "Kontuak";
"trendingAccounts.title.noAccounts" = "Inor ez.";
"trendingAccounts.error.loadingAccountsFailed" = "Kontuak kargatzeak huts egin du.";
// Mark: User profile view.
"userProfile.title.openInBrowser" = "Ireki nabigatzailean";
"userProfile.title.share" = "Partekatu";
"userProfile.title.unmute" = "Utzi mututzeari";
"userProfile.title.mute" = "Mututu";
"userProfile.title.unblock" = "Utzi blokeatzeari";
"userProfile.title.block" = "Blokeatu";
"userProfile.title.favourites" = "Gogokoak";
"userProfile.title.bookmarks" = "Laster-markak";
"userProfile.title.followedTags" = "Traolak";
"userProfile.title.posts" = "Bidalketa";
"userProfile.title.followers" = "Jarraitzaile";
"userProfile.title.following" = "Jarraitzen";
"userProfile.title.joined" = "%@ egin zuen bat";
"userProfile.title.unfollow" = "Utzi jarraitzeari";
"userProfile.title.follow" = "Jarraitu";
"userProfile.title.instance" = "Instantziari buruzko informazioa";
"userProfile.title.blocks" = "Blokeatutako kontuak";
"userProfile.title.mutes" = "Mutututako kontuak";
"userProfile.title.muted" = "Kontua mututu da";
"userProfile.title.unmuted" = "Kontua mututzeari utzi zaio";
"userProfile.title.blocked" = "Kontua blokeatu da";
"userProfile.title.unblocked" = "Kontua blokeatzeari utzi zaio";
"userProfile.title.report" = "Salatu";
"userProfile.title.followsYou" = "Jarraitzen dizu";
"userProfile.title.requestFollow" = "Egin jarraitzeko eskaera";
"userProfile.title.cancelRequestFollow" = "Utzi bertan behera jarraitzeko eskaera";
"userProfile.title.followRequests" = "Jarraipen-eskaerak";
"userProfile.title.privateProfileTitle" = "Profil hau pribatua da.";
"userProfile.title.privateProfileSubtitle" = "Baimendutako jarraitzaileek soilik ikus ditzakete argazkiak.";
"userProfile.error.notExists" = "Kontua ez da existitzen.";
"userProfile.error.loadingAccountFailed" = "Errorea zerbitzaritik kontua eskuratzean.";
"userProfile.error.muting" = "Mututu/Mututzeari uzteak huts egin du.";
"userProfile.error.block" = "Blokeatu/Blokeatzeari uzteak huts egin du.";
"userProfile.error.relationship" = "Harreman ekintzak huts egin du.";
"userProfile.title.edit" = "Editatu";
"userProfile.title.muted" = "Mutututa";
"userProfile.title.blocked" = "Blokeatuta";
"userProfile.title.enableBoosts" = "Ikusi bultzadak";
"userProfile.title.disableBoosts" = "Ezkutatu bultzadak";
"userProfile.title.boostedStatusesMuted" = "Bultzadak mututu dira";
// Mark: Notifications view.
"notifications.navigationBar.title" = "Jakinarazpenak";
"notifications.title.noNotifications" = "Ez dago jakinarazpenik.";
"notifications.title.followedYou" = "jarraitu dizu";
"notifications.title.mentionedYou" = "aipatu zaitu";
"notifications.title.boosted" = "bultzatu du";
"notifications.title.favourited" = "gogoko du";
"notifications.title.postedStatus" = "argitaratu du";
"notifications.title.followRequest" = "jarraipen-eskaera bidali dizu";
"notifications.title.poll" = "bozketa";
"notifications.title.updatedStatus" = "egoera eguneratu du";
"notifications.title.signedUp" = "izena eman du";
"notifications.title.newReport" = "txosten berria";
"notifications.error.loadingNotificationsFailed" = "Jakinarazpenak kargatzeak huts egin du.";
// Mark: Compose view.
"compose.navigationBar.title" = "Idatzi";
"compose.title.everyone" = "Edonorentzat ikusgai";
"compose.title.unlisted" = "Zerrendatu gabea";
"compose.title.followers" = "Jarraitzaileentzat soilik";
"compose.title.attachPhotoFull" = "Erantsi argazkia eta idatzi buruan duzuna";
"compose.title.attachPhotoMini" = "Idatzi buruan duzuna";
"compose.title.publish" = "Argitaratu";
"compose.title.cancel" = "Utzi";
"compose.title.writeContentWarning" = "Idatzi edukiari buruzko oharra";
"compose.title.commentsWillBeDisabled" = "Iruzkinak ezgaituko dira";
"compose.title.statusPublished" = "Egoera argitaratu da";
"compose.title.tryToUpload" = "Saiatu igotzen";
"compose.title.delete" = "Ezabatu";
"compose.title.edit" = "Editatu";
"compose.title.photos" = "Argazki-liburutegia";
"compose.title.camera" = "Egin argazkia";
"compose.title.files" = "Arakatu fitxategiak";
"compose.title.missingAltTexts" = "ALT testurik ez";
"compose.title.missingAltTextsWarning" = "Irudiren bat ez da ikusmen urritasuna dutenentzat deskribatu. Argazkiok argitaratu nahi dituzu hala ere?";
"compose.error.loadingPhotosFailed" = "Ezin da liburutegiko irudia eskuratu.";
"compose.error.postingPhotoFailed" = "Errorea argazkia argitaratzean.";
"compose.error.postingStatusFailed" = "Errorea egoera argitaratzean.";
// Mark: Photo editor view.
"photoEdit.navigationBar.title" = "Argazkiaren xehetasunak";
"photoEdit.title.photo" = "Argazkia";
"photoEdit.title.accessibility" = "Irisgarritasuna";
"photoEdit.title.accessibilityDescription" = "Ikusmen urritasuna dutenentzat deskribapena";
"photoEdit.title.save" = "Gorde";
"photoEdit.title.cancel" = "Utzi";
"photoEdit.error.updatePhotoFailed" = "Errorea argazkia eguneratzean.";
// Mark: Place selector view.
"placeSelector.navigationBar.title" = "Tokiak";
"placeSelector.title.search" = "Bilatu...";
"placeSelector.title.buttonSearch" = "Bilatu";
"placeSelector.title.cancel" = "Utzi";
"placeSelector.error.loadingPlacesFailed" = "Jakinarazpenak kargatzeak huts egin du.";
// Mark: Settings view.
"settings.navigationBar.title" = "Ezarpenak";
"settings.title.close" = "Itxi";
"settings.title.version" = "Bertsioa";
"settings.title.accounts" = "Kontuak";
"settings.title.newAccount" = "Gehitu kontua";
"settings.title.accent" = "Kolore nagusia";
"settings.title.theme" = "Gaia";
"settings.title.system" = "Sistemak darabilena";
"settings.title.light" = "Argia";
"settings.title.dark" = "Iluna";
"settings.title.avatar" = "Abatarra";
"settings.title.circle" = "Biribila";
"settings.title.rounderRectangle" = "Biribildutako ertzak";
"settings.title.other" = "Beste batzuk";
"settings.title.thirdParty" = "Hirugarrenak";
"settings.title.reportBug" = "Eman errore baten berri";
"settings.title.githubIssues" = "Erroreak Github-en";
"settings.title.follow" = "Jarraitu niri";
"settings.title.support" = "Eman babesa";
"settings.title.thankYouTitle" = "Eskerrik asko 💕";
"settings.title.thankYouMessage" = "Mila esker erosketagatik. Erosketa handi eta txikiek gure bezeroei kalitatezko produkturik onenak eskaintzeko ametsari eusten laguntzen digute. Espero dugu Vernissage gustuko izatea.";
"settings.title.thankYouClose" = "Itxi";
"settings.title.haptics" = "Hobespen haptikoak";
"settings.title.hapticsTabSelection" = "Fitxak hautatzean";
"settings.title.hapticsButtonPress" = "Botoietan tap egitean";
"settings.title.hapticsListRefresh" = "Zerrendak freskatzean";
"settings.title.hapticsAnimationFinished" = "Animazioak amaitzean";
"settings.title.mediaSettings" = "Multimedia hobespenak";
"settings.title.alwaysShowSensitiveTitle" = "Erakutsi beti NSFW edukia";
"settings.title.alwaysShowSensitiveDescription" = "NSFW (Lantokirako egokia ez den edukia) gisa markatutako multimedia edukia ohartarazpenik gabe erakutsiko da";
"settings.title.alwaysShowAltTitle" = "Erakutsi testu alternatiboa";
"settings.title.alwaysShowAltDescription" = "Testu alternatiboa xehetasunen pantailan erakutsiko da, baldin badago";
"settings.title.general" = "Orokorra";
"settings.title.applicationIcon" = "Aplikazioaren ikonoa";
"settings.title.followVernissage" = "Jarraitu Vernissage-ri";
"settings.title.mastodonAccount" = "Mastodon kontua";
"settings.title.pixelfedAccount" = "Pixelfed kontua";
"settings.title.openPage" = "Ireki";
"settings.title.privacyPolicy" = "Pribatutasun politika";
"settings.title.terms" = "Erabilera baldintzak";
"settings.title.sourceCode" = "Iturburu kodea";
"settings.title.rate" = "Baloratu Vernissage";
"settings.title.socials" = "Gizarte-sareak";
"settings.title.menuPosition" = "Menuaren kokapena";
"settings.title.topMenu" = "Nabigazio barra";
"settings.title.bottomRightMenu" = "Behe eskumaldean";
"settings.title.bottomLeftMenu" = "Behe ezkerraldean";
"settings.title.showAvatars" = "Erakutsi abatarrak";
"settings.title.showAvatarsOnTimeline" = "Abatarrak denbora-lerroan erakutsiko dira";
"settings.title.showFavourite" = "Erakutsi gogokoak";
"settings.title.showFavouriteOnTimeline" = "Gogokoak denbora-lerroan erakutsiko dira";
"settings.title.showAltText" = "Erakutsi ALT ikurra";
"settings.title.showAltTextOnTimeline" = "ALT ikurra (deskribapena edo testu alternatiboa dagoenaren seinale) denbora-lerroan erakutsiko da";
"settings.title.warnAboutMissingAltTitle" = "Abisatu ALT ahaztu bazait";
"settings.title.warnAboutMissingAltDescription" = "Irudiren batek deskribapenik ez badu, argitaratu baino lehen abisua erakutsiko da.";
"settings.title.enableReboostOnTimeline" = "Erakutsi bultzatutako egoerak";
"settings.title.enableReboostOnTimelineDescription" = "Besteek bultzatu dituzten egoerak denbora-lerroan erakutsiko dira.";
"settings.title.hideStatusesWithoutAlt" = "Ezkutatu ALT gabeko egoerak";
"settings.title.hideStatusesWithoutAltDescription" = "Deskribapen edo testu alternatiborik ez duten egoerak ez dira denbora-lerroan erakutsiko.";
// Mark: Signin view.
"signin.navigationBar.title" = "Hasi saioa Pixelfed-en";
"signin.title.serverAddress" = "Zerbitzariaren helbidea";
"signin.title.signIn" = "Hasi saioa";
"signin.title.enterServerAddress" = "Sartu zerbitzariaren helbidea";
"signin.title.howToJoinLink" = "Nola batu Pixelfed-era";
"signin.title.chooseServer" = "Edo aukeratu Pixelfed zerbitzaria";
"signin.title.amountOfUsers" = "%d erabiltzaile";
"signin.title.amountOStatuses" = "%d egoera";
"signin.error.communicationFailed" = "Zerbitzariarekin komunikazioak huts egin du.";
// Mark: Status view.
"status.navigationBar.title" = "Xehetasunak";
"status.title.uploaded" = ">";
"status.title.via" = "%@ bidez";
"status.title.reboostedBy" = "Bultzatu dutenak";
"status.title.favouritedBy" = "Gogoko egin dutenak";
"status.title.openInBrowser" = "Ireki nabigatzailean";
"status.title.shareStatus" = "Partekatu egoera";
"status.title.yourStatus" = "Zure egoera";
"status.title.delete" = "Ezabatu";
"status.title.reboosted" = "Bultzatua";
"status.title.unreboosted" = "Bultzada kendua";
"status.title.favourited" = "Gogoko egina";
"status.title.unfavourited" = "Gogoko egiteari utzia";
"status.title.bookmarked" = "Laster-marka jarria";
"status.title.unbookmarked" = "Laster-marka kendua";
"status.title.statusDeleted" = "Egoera ezabatua";
"status.title.reboost" = "Bultzatu";
"status.title.unreboost" = "Kendu bultzada";
"status.title.favourite" = "Egin gogoko";
"status.title.unfavourite" = "Kendu gogokoa";
"status.title.bookmark" = "Jarri laster-marka";
"status.title.unbookmark" = "Kendu laster-marka";
"status.title.comment" = "Egin iruzkina";
"status.title.report" = "Salatu";
"status.title.saveImage" = "Gorde irudia";
"status.title.showMediaDescription" = "Erakutsi multimediaren deskribapena";
"status.title.mediaDescription" = "Multimediaren deskribapena";
"status.title.shareImage" = "Partekatu irudia";
"status.title.altText" = "ALT";
"status.error.loadingStatusFailed" = "Egoera kargatzeak huts egin du.";
"status.error.notFound" = "Egoera ez da dagoeneko existitzen.";
"status.error.loadingCommentsFailed" = "Ezin dira iruzkinak eskuratu.";
"status.error.reboostFailed" = "Bultzadak huts egin du.";
"status.error.favouriteFailed" = "Gogokoak huts egin du.";
"status.error.bookmarkFailed" = "Laster-markak huts egin du.";
"status.error.deleteFailed" = "Ezabatzeak huts egin du.";
// Mark: Accounts view.
"accounts.navigationBar.followers" = "Jarraitzaile";
"accounts.navigationBar.following" = "Jarraitzen";
"accounts.navigationBar.favouritedBy" = "Honek gogoko egina";
"accounts.navigationBar.reboostedBy" = "Honek bultzatua";
"accounts.navigationBar.blocked" = "Blokeatutako kontuak";
"accounts.navigationBar.mutes" = "Mutututako kontuak";
"accounts.title.noAccounts" = "Inor ez.";
"accounts.error.loadingAccountsFailed" = "Kontuak kargatzeak huts egin du.";
// Mark: Third party view.
"thirdParty.navigationBar.title" = "Hirugarrenak";
// Mark: Widget view.
"widget.title.photoDescription" = "Widgeta Pixelfed-eko argazkiekin.";
"widget.title.qrCodeDescription" = "Widgeta zure Pixelfed-eko profilaren QR kodearekin.";
// Mark: In-app purchases.
"purchase.donut.title" = "Opila";
"purchase.donut.description" = "Eros diezadazu opil bat.";
"purchase.coffee.title" = "Kafea";
"purchase.coffee.description" = "Gonbida nazazu kafe bat hartzera.";
"purchase.cake.title" = "Kafea eta tarta";
"purchase.cake.description" = "Kafea eta tarta erosiko?";
// Mark: Edit profile.
"editProfile.navigationBar.title" = "Editatu profila";
"editProfile.title.displayName" = "Pantaila izena";
"editProfile.title.bio" = "Biografia";
"editProfile.title.website" = "Webgunea";
"editProfile.title.save" = "Gorde";
"editProfile.title.accountSaved" = "Profila eguneratu da.";
"editProfile.title.photoInfo" = "Aldatutako argazkia atzerapen txiki batekin ikusiko da aplikazioan eta web gunean.";
"editProfile.title.privateAccount" = "Babestutako kontua";
"editProfile.title.privateAccountInfo" = "Zure kontua babestuta dagoenean baimendutako pertsonek bakarrik ikus ditzakete zure argazkiak eta bideoak Pixelfed-en. Ez du eraginik izango dagoeneko jarraitzen dizutenengan.";
"editProfile.error.saveAccountFailed" = "Profila gordetzeak huts egin du.";
"editProfile.error.loadingAvatarFailed" = "Abatarra kargatzeak huts egin du.";
"editProfile.error.noProfileData" = "Ezin dira profileko datuak erakutsi.";
"editProfile.error.loadingAccountFailed" = "Errorea zerbitzaritik kontua eskuratzean.";
// Mark: Instance information.
"instance.navigationBar.title" = "Instantzia";
"instance.title.instanceInfo" = "Instantziari buruzko informazioa";
"instance.title.name" = "Izena";
"instance.title.address" = "Helbidea";
"instance.title.email" = "ePosta";
"instance.title.version" = "Bertsioa";
"instance.title.users" = "Erabiltzaileak";
"instance.title.posts" = "Bidalketak";
"instance.title.domains" = "Domeinuak";
"instance.title.registrations" = "Izen emateak";
"instance.title.approvalRequired" = "Onespena behar da";
"instance.title.rules" = "Instantziaren arauak";
"instance.title.contact" = "Harremana";
"instance.title.pixelfedAccount" = "Pixelfed kontua";
"instance.error.noInstanceData" = "Ezin dira instantziaren datuak erakutsi.";
"instance.error.loadingDataFailed" = "Errorea zerbitzaritik instantziaren datuak eskuratzean.";
// Mark: Report screen.
"report.navigationBar.title" = "Salatu";
"report.title.close" = "Itxi";
"report.title.send" = "Bidali";
"report.title.userReported" = "Erabiltzailea salatu da";
"report.title.postReported" = "Bidalketa salatu da";
"report.title.reportType" = "Urraketa mota";
"report.title.spam" = "Spama da";
"report.title.sensitive" = "Biluzia edo sexu-ekintza";
"report.title.abusive" = "Gorroto sustatzen duten hitzaldiak edo ikurrak";
"report.title.underage" = "Adingabea";
"report.title.violence" = "Bortizkeria edo erakunde arriskutsua";
"report.title.copyright" = "Egile-eskubideen urraketa";
"report.title.impersonation" = "Imitatzailea";
"report.title.scam" = "Bullyinga edo jazarpena";
"report.title.terrorism" = "Terrorismoa";
"report.error.notReported" = "Errorea salaketa bidaltzerakoan.";
// Mark: Following requests.
"followingRequests.navigationBar.title" = "Jarraipen-eskaerak";
"followingRequests.title.approve" = "Baimendu";
"followingRequests.title.reject" = "Baztertu";
"followingRequests.error.approve" = "Errorea eskaera baimentzean.";
"followingRequests.error.reject" = "Errorea eskaera baztertzean.";

View File

@ -1,381 +0,0 @@
// MARK: Common strings.
"global.title.contentWarning" = "Contenu sensible";
"global.title.seePost" = "Voir le post";
"global.title.refresh" = "Rafraîchir";
"global.title.momentsAgo" = "Il y a quelques instants";
"global.title.success" = "Succès";
"global.title.photoSaved" = "La photo a été sauvegardée.";
"global.title.ok" = "OK";
"global.title.showMore" = "Montrer plus";
"global.title.showLess" = "Montrer moins";
"global.title.close" = "Fermer";
"global.error.refreshingCredentialsTitle" = "Erreur d'actualisation des données d'identification.";
"global.error.refreshingCredentialsSubtitle" = "Veuillez vous connecter à nouveau à Pixelfed.";
// MARK: Global errors.
"global.error.unexpected" = "Erreur inattendue.";
"global.error.statusesNotRetrieved" = "Statuts non récupérés.";
"global.error.errorDuringDownloadStatuses" = "Erreur pendant le téléchargerment des statuts du serveur.";
"global.error.errorDuringDownloadHashtag" = "Erreur pendant le téléchargement des tags depuis le serveur.";
"global.error.hashtagNotExists" = "Le hashtag n'existe pas.";
"global.error.errorDuringImageDownload" = "Impossible de télécharger l'image.";
"global.error.canceledImageDownload" = "Le téléchargement de l'image a été annulé.";
"global.error.errorDuringDataLoad" = "Le chargement des données a échoué.";
"global.error.errorDuringUserRead" = "Impossible de récupérer les données de l'utilisateur.";
"global.error.badUrlServer" = "Mauvaise URL pour le serveur.";
"global.error.accessTokenNotFound" = "Le jeton d'accès n'est pas trouvé.";
"global.error.errorDuringDownloadStatus" = "Erreur durant le téléchargement du statut depuis le serveur.";
"global.error.errorDuringPurchaseVerification" = "Vérification d'achat échoué.";
// MARK: Main view (main navigation bar).
"mainview.tab.homeTimeline" = "Accueil";
"mainview.tab.localTimeline" = "Local";
"mainview.tab.federatedTimeline" = "Fédéré";
"mainview.tab.trendingPhotos" = "Photos";
"mainview.tab.trendingTags" = "Tags";
"mainview.tab.trendingAccounts" = "Utilisateurs";
"mainview.tab.userProfile" = "Profil";
"mainview.tab.notifications" = "Notifications";
"mainview.tab.search" = "Rechercher";
"mainview.tab.trending" = "Tendance";
// MARK: Main view (leading navigation bar).
"mainview.menu.settings" = "Paramètres";
// MARK: Main view (error notifications).
"mainview.error.switchAccounts" = "Impossible de changer de compte.";
// MARK: Home timeline.
"home.title.allCaughtUp" = "Tout est à jour";
"home.title.noPhotos" = "Malheureusement, il n'y a pas de photos ici.";
// MARK: Statuses timeline (local/federated/favourite/bookmarks etc.).
"statuses.navigationBar.localTimeline" = "Local";
"statuses.navigationBar.federatedTimeline" = "Fédéré";
"statuses.navigationBar.favourites" = "Favoris";
"statuses.navigationBar.bookmarks" = "Marque-pages";
"statuses.title.noPhotos" = "Malheureusement, il n'y a pas de photos ici.";
"statuses.title.tagFollowed" = "Vous suivez ce tag.";
"statuses.title.tagUnfollowed" = "Vous ne suivez plus ce tag.";
"statuses.error.loadingStatusesFailed" = "Chargement des statuts impossible.";
"statuses.error.tagFollowFailed" = "Suivi de tag échoué.";
"statuses.error.tagUnfollowFailed" = "Ne plus suivre le tag a échoué.";
// Mark: Search view.
"search.navigationBar.title" = "Rechercher";
"search.title.placeholder" = "Rechercher...";
"search.title.usersWith" = "Utilisateurs avec %@";
"search.title.goToUser" = "Voir l'utilisateur %@";
"search.title.hashtagWith" = "Hashtags avec %@";
"search.title.goToHashtag" = "Voir le hashtag %@";
// Mark: Trending statuses.
"trendingStatuses.navigationBar.title" = "Photos";
"trendingStatuses.title.daily" = "Quotidien";
"trendingStatuses.title.monthly" = "Mensuel";
"trendingStatuses.title.yearly" = "Annuel";
"trendingStatuses.error.loadingStatusesFailed" = "Chargement des statuts échoué.";
"trendingStatuses.title.noPhotos" = "Malheureusement, il n'y a pas de photos ici.";
// Mark: Trending tags.
"tags.navigationBar.trendingTitle" = "Tags";
"tags.navigationBar.searchTitle" = "Tags";
"tags.navigationBar.followedTitle" = "Tags";
"tags.title.noTags" = "Malheureusement, il n'y a pas de tags ici.";
"tags.title.amountOfPosts" = "%d posts";
"tags.error.loadingTagsFailed" = "Chargement des tags échoué.";
// Mark: Trending accounts.
"trendingAccounts.navigationBar.title" = "Utilisateurs";
"trendingAccounts.title.noAccounts" = "Malheureusement, il n'y a personne ici.";
"trendingAccounts.error.loadingAccountsFailed" = "Chargement des comptes échoué.";
// Mark: User profile view.
"userProfile.title.openInBrowser" = "Ouvrir dans un navigateur";
"userProfile.title.share" = "Partager";
"userProfile.title.unmute" = "Désactiver";
"userProfile.title.mute" = "Sourdine";
"userProfile.title.unblock" = "Déblouer";
"userProfile.title.block" = "Bloquer";
"userProfile.title.favourites" = "Favoris";
"userProfile.title.bookmarks" = "Marque-pages";
"userProfile.title.followedTags" = "Tags";
"userProfile.title.posts" = "Posts";
"userProfile.title.followers" = "Abonnés";
"userProfile.title.following" = "Abonnements";
"userProfile.title.joined" = "Joint %@";
"userProfile.title.unfollow" = "Ne plus suivre";
"userProfile.title.follow" = "Suivre";
"userProfile.title.instance" = "Information sur l'instance";
"userProfile.title.blocks" = "Comptes bloqués";
"userProfile.title.mutes" = "Comptes en sourdine";
"userProfile.title.muted" = "Compte mis en sourdine";
"userProfile.title.unmuted" = "Compte remis en actif";
"userProfile.title.blocked" = "Compte bloqué";
"userProfile.title.unblocked" = "Compte débloqué";
"userProfile.title.report" = "Rapport";
"userProfile.title.followsYou" = "Vous suit";
"userProfile.title.requestFollow" = "Demande de suivi";
"userProfile.title.cancelRequestFollow" = "Annuler la demande";
"userProfile.title.followRequests" = "Suivre les demandes";
"userProfile.title.privateProfileTitle" = "Ce profil est privé.";
"userProfile.title.privateProfileSubtitle" = "Seules les personnes approuvées peuvent voir les photos.";
"userProfile.error.notExists" = "Le compte n'existe pas.";
"userProfile.error.loadingAccountFailed" = "Erreur pendant le téléchargement du compte depuis le serveur.";
"userProfile.error.muting" = "L'action sourdine / réactivation a échoué.";
"userProfile.error.block" = "L'action bloquer / déblouquer a échoué.";
"userProfile.error.relationship" = "L'action de relation a échoué.";
"userProfile.title.edit" = "Editer";
"userProfile.title.muted" = "Sourdine";
"userProfile.title.blocked" = "Bloquer";
"userProfile.title.enableBoosts" = "Enable boosts";
"userProfile.title.disableBoosts" = "Disable boosts";
"userProfile.title.boostedStatusesMuted" = "Boosts muted";
// Mark: Notifications view.
"notifications.navigationBar.title" = "Notifications";
"notifications.title.noNotifications" = "Malheureusement, il n'y a rien ici.";
"notifications.title.followedYou" = "vous a suivi";
"notifications.title.mentionedYou" = "vous a mentionné";
"notifications.title.boosted" = "partagé";
"notifications.title.favourited" = "favori";
"notifications.title.postedStatus" = "statut posté";
"notifications.title.followRequest" = "demande de suivi";
"notifications.title.poll" = "sondage";
"notifications.title.updatedStatus" = "statut mis à jour";
"notifications.title.signedUp" = "s'inscrire";
"notifications.title.newReport" = "nouveau rapport";
"notifications.error.loadingNotificationsFailed" = "Chargement des notifications échoué.";
// Mark: Compose view.
"compose.navigationBar.title" = "Composer";
"compose.title.everyone" = "Tout le monde";
"compose.title.unlisted" = "Non listé";
"compose.title.followers" = "Abonnés";
"compose.title.attachPhotoFull" = "Joignez une photo et écrivez ce qui vous convient";
"compose.title.attachPhotoMini" = "Ecrivez ce qui vous convient";
"compose.title.publish" = "Publier";
"compose.title.cancel" = "Annuler";
"compose.title.writeContentWarning" = "Rédaction d'un avertissement sur le contenu";
"compose.title.commentsWillBeDisabled" = "Les commentaires seront désactivés";
"compose.title.statusPublished" = "Statuts publiés";
"compose.title.tryToUpload" = "Essayer de télécharger";
"compose.title.delete" = "Supprimer";
"compose.title.edit" = "Editer";
"compose.title.photos" = "Albums photos";
"compose.title.camera" = "Prendre une photo";
"compose.title.files" = "Parcourir les fichiers";
"compose.title.missingAltTexts" = "Manque un texte ALT";
"compose.title.missingAltTextsWarning" = "Toutes les images n'ont pas été décrites pour les malvoyants. Souhaitez-vous tout de même envoyer des photos ?";
"compose.error.loadingPhotosFailed" = "Impossible de récupérer l'image depuis la bibliothèque.";
"compose.error.postingPhotoFailed" = "Erreur pendant le post de la photo.";
"compose.error.postingStatusFailed" = "Erreur pendant le post du statut.";
// Mark: Photo editor view.
"photoEdit.navigationBar.title" = "Détails sur la photo";
"photoEdit.title.photo" = "Photo";
"photoEdit.title.accessibility" = "Accessibilité";
"photoEdit.title.accessibilityDescription" = "Description pour les malvoyants";
"photoEdit.title.save" = "Enregistrer";
"photoEdit.title.cancel" = "Annuler";
"photoEdit.error.updatePhotoFailed" = "Erreur pendant la mise à jour de la photo.";
// Mark: Place selector view.
"placeSelector.navigationBar.title" = "Lieux";
"placeSelector.title.search" = "Rechercher...";
"placeSelector.title.buttonSearch" = "Rechercher";
"placeSelector.title.cancel" = "Annuler";
"placeSelector.error.loadingPlacesFailed" = "Chargement des notifications échoué.";
// Mark: Settings view.
"settings.navigationBar.title" = "Paramètres";
"settings.title.close" = "Fermer";
"settings.title.version" = "Version";
"settings.title.accounts" = "Compte";
"settings.title.newAccount" = "Nouveau compte";
"settings.title.accent" = "Accent";
"settings.title.theme" = "Thème";
"settings.title.system" = "Système";
"settings.title.light" = "Clair";
"settings.title.dark" = "Sombre";
"settings.title.avatar" = "Avatar";
"settings.title.circle" = "Cercle";
"settings.title.rounderRectangle" = "Rectangle arrondi";
"settings.title.other" = "Autre";
"settings.title.thirdParty" = "Tiers";
"settings.title.reportBug" = "Rapporter un bogue";
"settings.title.githubIssues" = "Problèmes sur Github";
"settings.title.follow" = "Me suivre";
"settings.title.support" = "Support";
"settings.title.thankYouTitle" = "Merci 💕";
"settings.title.thankYouMessage" = "Merci pour votre achat. Les achats, petits et grands, nous aident à réaliser notre rêve de fournir des produits de la meilleure qualité à nos clients. Nous espérons que vous aimez Vernissage.";
"settings.title.thankYouClose" = "Fermer";
"settings.title.haptics" = "Haptique";
"settings.title.hapticsTabSelection" = "Sélection de l'onglet";
"settings.title.hapticsButtonPress" = "Appui sur un bouton";
"settings.title.hapticsListRefresh" = "Rafraîchir la liste";
"settings.title.hapticsAnimationFinished" = "Animation finie";
"settings.title.mediaSettings" = "Paramètres du media";
"settings.title.alwaysShowSensitiveTitle" = "Toujours montrer les NSFW";
"settings.title.alwaysShowSensitiveDescription" = "Forcer l'affichage de tous les media NFSW (contenu sensible) sans avertissement";
"settings.title.alwaysShowAltTitle" = "Afficher le texte alternatif";
"settings.title.alwaysShowAltDescription" = "Afficher le texte alternatif si présent sur l'écran des détails des statuts";
"settings.title.general" = "Général";
"settings.title.applicationIcon" = "Icône de l'application";
"settings.title.followVernissage" = "Suivre Vernissage";
"settings.title.mastodonAccount" = "Compte Mastodon";
"settings.title.pixelfedAccount" = "Compte Pixelfed";
"settings.title.openPage" = "Ouvrir";
"settings.title.privacyPolicy" = "Politique de confidentialité";
"settings.title.terms" = "Conditions générales d'utilisation";
"settings.title.sourceCode" = "Code source";
"settings.title.rate" = "Noter Vernissage";
"settings.title.socials" = "Social";
"settings.title.menuPosition" = "Position du menu";
"settings.title.topMenu" = "Barre de navigation";
"settings.title.bottomRightMenu" = "En bas à droite";
"settings.title.bottomLeftMenu" = "En bas à gauche";
"settings.title.showAvatars" = "Afficher les avatars";
"settings.title.showAvatarsOnTimeline" = "Les avatars sont affichés sur la timeline";
"settings.title.showFavourite" = "Afficher les favoris";
"settings.title.showFavouriteOnTimeline" = "Les favoris sont affichés sur la timeline";
"settings.title.showAltText" = "Afficher l'icône ALT";
"settings.title.showAltTextOnTimeline" = "L'icône ALT sera affichée sur la timeline";
"settings.title.warnAboutMissingAltTitle" = "Avertir de l'absence de texte ALT";
"settings.title.warnAboutMissingAltDescription" = "Un avertissement concernant les textes ALT manquants sera affiché avant la publication d'un nouveau message.";
"settings.title.enableReboostOnTimeline" = "Show boosted statuses";
"settings.title.enableReboostOnTimelineDescription" = "Boosted statuses will be visible on your home timeline.";
"settings.title.hideStatusesWithoutAlt" = "Hide statuses without ALT text";
"settings.title.hideStatusesWithoutAltDescription" = "Statuses without ALT text will not be visible on your home timeline.";
// Mark: Signin view.
"signin.navigationBar.title" = "Se connecter à Pixelfed";
"signin.title.serverAddress" = "Adresse du serveur";
"signin.title.signIn" = "Connecter";
"signin.title.enterServerAddress" = "Entrer l'adresse du server";
"signin.title.howToJoinLink" = "Comment rejoindre Pixelfed";
"signin.title.chooseServer" = "Ou choisissez un sereveur Pixelfed";
"signin.title.amountOfUsers" = "%d Utilisateurs";
"signin.title.amountOStatuses" = "%d statuts";
"signin.error.communicationFailed" = "La communication avec le server a échoué.";
// Mark: Status view.
"status.navigationBar.title" = "Détails";
"status.title.uploaded" = "Envoyé";
"status.title.via" = "via %@";
"status.title.reboostedBy" = "Partagé par";
"status.title.favouritedBy" = "Favoris par";
"status.title.openInBrowser" = "Ouvrir dans un navigateur";
"status.title.shareStatus" = "Partger le statut";
"status.title.yourStatus" = "Votre statut";
"status.title.delete" = "Supprimer";
"status.title.reboosted" = "Partagé";
"status.title.unreboosted" = "Enlever le partage";
"status.title.favourited" = "Favorisé";
"status.title.unfavourited" = "Enlever le favoris";
"status.title.bookmarked" = "Marque-pages effectué";
"status.title.unbookmarked" = "Marque-pages enlevé";
"status.title.statusDeleted" = "Statut supprimé";
"status.title.reboost" = "Partagé";
"status.title.unreboost" = "Enlever le partage";
"status.title.favourite" = "Favoris";
"status.title.unfavourite" = "Enlever le favoris";
"status.title.bookmark" = "Marque-pages";
"status.title.unbookmark" = "Marque-pages enlevé";
"status.title.comment" = "Commenter";
"status.title.report" = "Rapport";
"status.title.saveImage" = "Enregistrer l'image";
"status.title.showMediaDescription" = "Afficher la description du media";
"status.title.mediaDescription" = "Description du media";
"status.title.shareImage" = "Partager l'image";
"status.title.altText" = "ALT";
"status.error.loadingStatusFailed" = "Chargement du statut échoué.";
"status.error.notFound" = "Le statut n'existe plus.";
"status.error.loadingCommentsFailed" = "Les commentaires ne peuvent être téléchargés.";
"status.error.reboostFailed" = "L'action de partage a échoué.";
"status.error.favouriteFailed" = "L'action de favoris a échoué.";
"status.error.bookmarkFailed" = "L'action de marque-pages a échoué.";
"status.error.deleteFailed" = "L'action de suppression a échoué.";
// Mark: Accounts view.
"accounts.navigationBar.followers" = "Abonnés";
"accounts.navigationBar.following" = "Abonnements";
"accounts.navigationBar.favouritedBy" = "Favorisé par";
"accounts.navigationBar.reboostedBy" = "Partagé par";
"accounts.navigationBar.blocked" = "Comptes bloqués";
"accounts.navigationBar.mutes" = "Comptes mis en sourdine";
"accounts.title.noAccounts" = "Malheureusement, il n'y a personne ici.";
"accounts.error.loadingAccountsFailed" = "Le chargement des comptes a échoué.";
// Mark: Third party view.
"thirdParty.navigationBar.title" = "Tiers";
// Mark: Widget view.
"widget.title.photoDescription" = "Widget avec des photos de Pixelfed.";
"widget.title.qrCodeDescription" = "Widget avec QR Code vers votre profil Pixelfed.";
// Mark: In-app purchases.
"purchase.donut.title" = "Beignet";
"purchase.donut.description" = "Offrez-moi un beignet.";
"purchase.coffee.title" = "Café";
"purchase.coffee.description" = "Offrez-moi un café.";
"purchase.cake.title" = "Café et gâteau";
"purchase.cake.description" = "Offrez-moi un café et un gâteau.";
// Mark: Edit profile.
"editProfile.navigationBar.title" = "Editer le profil";
"editProfile.title.displayName" = "Afficher le nom";
"editProfile.title.bio" = "Bio";
"editProfile.title.website" = "Site web";
"editProfile.title.save" = "Enregistrer";
"editProfile.title.accountSaved" = "Le profil a été mis à jour.";
"editProfile.title.photoInfo" = "La photo modifiée sera visible dans l'application et sur le site web avec un petit délai.";
"editProfile.title.privateAccount" = "Compte privé";
"editProfile.title.privateAccountInfo" = "Lorsque votre compte est privé, seules les personnes que vous autorisez peuvent voir vos photos et vidéos sur Pixelfed. Les personnes qui vous suivent déjà ne seront pas affectées.";
"editProfile.error.saveAccountFailed" = "Enregistrement du profil échoué.";
"editProfile.error.loadingAvatarFailed" = "Chargement de l'avatar échoué.";
"editProfile.error.noProfileData" = "Les données du profil ne peuvent pas être affichées.";
"editProfile.error.loadingAccountFailed" = "Erreur lors du téléchargement du compte depuis le serveur.";
// Mark: Instance information.
"instance.navigationBar.title" = "Instance";
"instance.title.instanceInfo" = "Information sur l'instance";
"instance.title.name" = "Nom";
"instance.title.address" = "Addresse";
"instance.title.email" = "Email";
"instance.title.version" = "Version";
"instance.title.users" = "Utilisateurs";
"instance.title.posts" = "Posts";
"instance.title.domains" = "Domaines";
"instance.title.registrations" = "Inscriptions";
"instance.title.approvalRequired" = "Approbation requise";
"instance.title.rules" = "Règles de l'instance";
"instance.title.contact" = "Contact";
"instance.title.pixelfedAccount" = "Compte Pixelfed";
"instance.error.noInstanceData" = "Les données d'instance ne peuvent pas être affichées.";
"instance.error.loadingDataFailed" = "Erreur lors du téléchargement des données d'instance depuis le serveur.";
// Mark: Report screen.
"report.navigationBar.title" = "Rapport";
"report.title.close" = "Fermer";
"report.title.send" = "Envoyer";
"report.title.userReported" = "L'utilisateur a été signalé";
"report.title.postReported" = "Le post a été signalé";
"report.title.reportType" = "Type d'abus";
"report.title.spam" = "C'est un spam";
"report.title.sensitive" = "Nudité ou activité sexuelle";
"report.title.abusive" = "Discours ou symboles haineux";
"report.title.underage" = "Compte mineur";
"report.title.violence" = "Violence ou organisations dangereuses";
"report.title.copyright" = "Violation des droits d'auteur";
"report.title.impersonation" = "Usurpation d'identité";
"report.title.scam" = "Intimidation ou harcèlement";
"report.title.terrorism" = "Le terrorisme";
"report.error.notReported" = "Erreur lors de l'envoi du rapport.";
// Mark: Following requests.
"followingRequests.navigationBar.title" = "Suivre les demandes";
"followingRequests.title.approve" = "Approuver";
"followingRequests.title.reject" = "Rejeter";
"followingRequests.error.approve" = "Erreur lors de l'approbation de la demande.";
"followingRequests.error.reject" = "Erreur lors du rejet de la demande.";

View File

@ -1,381 +0,0 @@
// MARK: Common strings.
"global.title.contentWarning" = "Wrażliwe treści";
"global.title.seePost" = "Pokaż zdjęcie";
"global.title.refresh" = "Odśwież";
"global.title.momentsAgo" = "chwilę temu";
"global.title.success" = "Sukces";
"global.title.photoSaved" = "Zdjęcie zostało zapisane.";
"global.title.ok" = "OK";
"global.title.showMore" = "Pokaż więcej";
"global.title.showLess" = "Pokaż mniej";
"global.title.close" = "Zamknij";
"global.error.refreshingCredentialsTitle" = "Błąd odświeżania danych uwierzytelniających.";
"global.error.refreshingCredentialsSubtitle" = "Prosimy o ponowne zalogowanie się do Pixelfed.";
// MARK: Global errors.
"global.error.unexpected" = "Wystąpił nieoczekiwany błąd.";
"global.error.statusesNotRetrieved" = "Statusy nie zostały pobrane.";
"global.error.errorDuringDownloadStatuses" = "Błąd podczas pobierania statusów.";
"global.error.errorDuringDownloadHashtag" = "Błąd podczas pobierania taga.";
"global.error.hashtagNotExists" = "Tag nie istnieje.";
"global.error.errorDuringImageDownload" = "Błąd podczas pobierania zdjęcia.";
"global.error.canceledImageDownload" = "Pobieranie zdjęcia zostało anulowane.";
"global.error.errorDuringDataLoad" = "Błąd podczas pobierania danych.";
"global.error.errorDuringUserRead" = "Błąd podczas odczytu danych użytkownika.";
"global.error.badUrlServer" = "Niepoprawny adres serwera.";
"global.error.accessTokenNotFound" = "Brak tokenu dostępu.";
"global.error.errorDuringDownloadStatus" = "Błąd podczas pobierania statusu.";
"global.error.errorDuringPurchaseVerification" = "Błąd podczas weryfikacji płatności.";
// MARK: Main view (main navigation bar).
"mainview.tab.homeTimeline" = "Główna";
"mainview.tab.localTimeline" = "Lokalne";
"mainview.tab.federatedTimeline" = "Globalne";
"mainview.tab.trendingPhotos" = "Zdjęcia";
"mainview.tab.trendingTags" = "Tagi";
"mainview.tab.trendingAccounts" = "Użytkownicy";
"mainview.tab.userProfile" = "Profil";
"mainview.tab.notifications" = "Powiadomienia";
"mainview.tab.search" = "Wyszukaj";
"mainview.tab.trending" = "Popularne";
// MARK: Main view (leading navigation bar).
"mainview.menu.settings" = "Ustawienia";
// MARK: Main view (error notifications).
"mainview.error.switchAccounts" = "Błąd podczas przełączania kont.";
// MARK: Home timeline.
"home.title.allCaughtUp" = "Jesteś na bieżąco";
"home.title.noPhotos" = "Niestety nie ma jeszcze żadnych zdjęć.";
// MARK: Statuses timeline (local/federated/favourite/bookmarks etc.).
"statuses.navigationBar.localTimeline" = "Lokalne";
"statuses.navigationBar.federatedTimeline" = "Globalne";
"statuses.navigationBar.favourites" = "Polubione";
"statuses.navigationBar.bookmarks" = "Zakładki";
"statuses.title.noPhotos" = "Niestety nie ma jeszcze żadnych zdjęć.";
"statuses.title.tagFollowed" = "Od teraz śledzisz taga.";
"statuses.title.tagUnfollowed" = "Nie śledzisz już taga.";
"statuses.error.loadingStatusesFailed" = "Błąd podczas wczytywania statusów.";
"statuses.error.tagFollowFailed" = "Błąd podczas żądania śledzenia taga.";
"statuses.error.tagUnfollowFailed" = "Błąd podczas wyłączenia śledzenia taga.";
// Mark: Search view.
"search.navigationBar.title" = "Wyszukaj";
"search.title.placeholder" = "Wyszukaj...";
"search.title.usersWith" = "Użytkownicy zawierający %@";
"search.title.goToUser" = "Przejdź do użytkownika %@";
"search.title.hashtagWith" = "Tagi zawierające %@";
"search.title.goToHashtag" = "Przejdź do taga %@";
// Mark: Trending statuses.
"trendingStatuses.navigationBar.title" = "Zdjęcia";
"trendingStatuses.title.daily" = "Dzień";
"trendingStatuses.title.monthly" = "Miesiąc";
"trendingStatuses.title.yearly" = "Rok";
"trendingStatuses.error.loadingStatusesFailed" = "Błąd podczas wczytywania statusów.";
"trendingStatuses.title.noPhotos" = "Niestety nie ma jeszcze żadnych zdjęć.";
// Mark: Trending tags.
"tags.navigationBar.trendingTitle" = "Tagi";
"tags.navigationBar.searchTitle" = "Tagi";
"tags.navigationBar.followedTitle" = "Obserwowane tagi";
"tags.title.noTags" = "Niestety nie ma jeszcze żadnych tagów.";
"tags.title.amountOfPosts" = "%d statusów";
"tags.error.loadingTagsFailed" = "Błąd podczas wczytywania tagów.";
// Mark: Trending accounts.
"trendingAccounts.navigationBar.title" = "Użytkownicy";
"trendingAccounts.title.noAccounts" = "Niestety nie ma tutaj nikogo.";
"trendingAccounts.error.loadingAccountsFailed" = "Błąd podczas wczytywania użytkownikow.";
// Mark: User profile view.
"userProfile.title.openInBrowser" = "Otwórz w przeglądarce";
"userProfile.title.share" = "Udostępnij";
"userProfile.title.unmute" = "Wyłącz wyciszenie";
"userProfile.title.mute" = "Wycisz";
"userProfile.title.unblock" = "Odblokuj";
"userProfile.title.block" = "Zablokuj";
"userProfile.title.favourites" = "Polubione";
"userProfile.title.bookmarks" = "Zakładki";
"userProfile.title.followedTags" = "Obserwowane tagi";
"userProfile.title.posts" = "Statusy";
"userProfile.title.followers" = "Obserwujący";
"userProfile.title.following" = "Obserwowani";
"userProfile.title.joined" = "Dołączył(a) %@";
"userProfile.title.unfollow" = "Przestań obserwować";
"userProfile.title.follow" = "Obserwuj";
"userProfile.title.instance" = "Informacje o instancji";
"userProfile.title.blocks" = "Zablokowane konta";
"userProfile.title.mutes" = "Wyciszone konta";
"userProfile.title.muted" = "Konto wyciszone";
"userProfile.title.unmuted" = "Wyciszenie wyłączone";
"userProfile.title.blocked" = "Konto zablokowane";
"userProfile.title.unblocked" = "Konto odblokowane";
"userProfile.title.report" = "Zgłoś";
"userProfile.title.followsYou" = "Obserwuje ciebie";
"userProfile.title.requestFollow" = "Poproś o obserwowanie";
"userProfile.title.cancelRequestFollow" = "Anuluj prośbę";
"userProfile.title.followRequests" = "Prośby o obserwowanie";
"userProfile.title.privateProfileTitle" = "To konto jest prywatne.";
"userProfile.title.privateProfileSubtitle" = "Tylko zaakceptowani użytkownicy mogą przeglądać zdjęcia.";
"userProfile.error.notExists" = "Konto nie istnieje.";
"userProfile.error.notExists" = "Błąd podczas pobierania danych użytkownika.";
"userProfile.error.mute" = "Błąd podczas wyciszania użytkownika.";
"userProfile.error.block" = "Błąd podczas blokowania/odblokowywania użytkownika.";
"userProfile.error.relationship" = "Błąd podczas zmiany relacji z użytkownikiem.";
"userProfile.title.edit" = "Edytuj";
"userProfile.title.muted" = "Wyciszony";
"userProfile.title.blocked" = "Zablokowany";
"userProfile.title.enableBoosts" = "Wyświetl podbicia";
"userProfile.title.disableBoosts" = "Ukryj podbicia";
"userProfile.title.boostedStatusesMuted" = "Podbicia ukryte";
// Mark: Notifications view.
"notifications.navigationBar.title" = "Powiadomienia";
"notifications.title.noNotifications" = "Niestety nic tutaj nie ma.";
"notifications.title.followedYou" = "obserwuje ciebie";
"notifications.title.mentionedYou" = "wspomniał ciebie";
"notifications.title.boosted" = "podbił";
"notifications.title.favourited" = "polubił";
"notifications.title.postedStatus" = "stworzył status";
"notifications.title.followRequest" = "chce obserwować";
"notifications.title.poll" = "ankieta";
"notifications.title.updatedStatus" = "zaktualizował status";
"notifications.title.signedUp" = "zalogował się";
"notifications.title.newReport" = "nowy raport";
"notifications.error.loadingNotificationsFailed" = "Błąd podczas wczytywania powiadomień.";
// Mark: Compose view.
"compose.navigationBar.title" = "Utwórz";
"compose.title.everyone" = "Publiczny";
"compose.title.unlisted" = "Publiczny (niewidoczny)";
"compose.title.followers" = "Tylko obserwujący";
"compose.title.attachPhotoFull" = "Dołącz zdjęcie i napisz, co myślisz";
"compose.title.attachPhotoMini" = "Wpisz, co masz na myśli";
"compose.title.publish" = "Wyślij";
"compose.title.cancel" = "Anuluj";
"compose.title.writeContentWarning" = "Napisz ostrzeżenie o treści";
"compose.title.commentsWillBeDisabled" = "Komentarze zostaną wyłączone";
"compose.title.statusPublished" = "Stan opublikowany";
"compose.title.tryToUpload" = "Ponów";
"compose.title.delete" = "Usuń";
"compose.title.edit" = "Edytuj";
"compose.title.photos" = "Biblioteka zdjęć";
"compose.title.camera" = "Zrób zdjęcie";
"compose.title.files" = "Przeglądaj pliki";
"compose.title.missingAltTexts" = "Brakuje tekstów ALT";
"compose.title.missingAltTextsWarning" = "Nie wszystkie zdjęcia zostały opisane dla niedowidzących. Czy pomimo tego chcesz je wysłać?";
"compose.error.loadingPhotosFailed" = "Nie można pobrać zdjęcia z biblioteki.";
"compose.error.postingPhotoFailed" = "Błąd podczas publikowania zdjęcia.";
"compose.error.postingStatusFailed" = "Błąd podczas wysyłania statusu.";
// Mark: Photo editor view.
"photoEdit.navigationBar.title" = "Szczegóły zdjęcia";
"photoEdit.title.photo" = "Zdjęcie";
"photoEdit.title.accessibility" = "Dostępność";
"photoEdit.title.accessibilityDescription" = "Opis dla osób niedowidzących";
"photoEdit.title.save" = "Zapisz";
"photoEdit.title.cancel" = "Anuluj";
"photoEdit.error.updatePhotoFailed" = "Błąd podczas aktualizowania zdjęcia.";
// Mark: Place selector view.
"placeSelector.navigationBar.title" = "Lokalizacja";
"placeSelector.title.search" = "Wyszukaj...";
"placeSelector.title.buttonSearch" = "Szukaj";
"placeSelector.title.cancel" = "Anuluj";
"placeSelector.error.loadingPlacesFailed" = "Błąd podczas wczytywanie lokalizacji.";
// Mark: Settings view.
"settings.navigationBar.title" = "Ustawienia";
"settings.title.close" = "Zamknij";
"settings.title.version" = "Wersja";
"settings.title.accounts" = "Konta";
"settings.title.newAccount" = "Dodaj konto";
"settings.title.accent" = "Akcent";
"settings.title.theme" = "Wygląd";
"settings.title.system" = "Systemowy";
"settings.title.light" = "Jasny";
"settings.title.dark" = "Ciemny";
"settings.title.avatar" = "Awatar";
"settings.title.circle" = "Okrągły";
"settings.title.rounderRectangle" = "Zaokrąglony kwadratowy";
"settings.title.other" = "Inne";
"settings.title.thirdParty" = "Zewnętrzne biblioteki";
"settings.title.reportBug" = "Zgłoś błąd";
"settings.title.githubIssues" = "Błędy na Github";
"settings.title.follow" = "Obserwuj mnie";
"settings.title.support" = "Wsparcie";
"settings.title.thankYouTitle" = "Dziękuję 💕";
"settings.title.thankYouMessage" = "Dziękujemy za twój zakup. Zakupy zarówno te duże, jak i te małe pomagają nam w realizacji marzenia o dostarczaniu naszym klientom produktów najwyższej jakości. Mamy nadzieję, że Vernissage spełnia Twoje oczekiwania.";
"settings.title.thankYouClose" = "Zamknij";
"settings.title.haptics" = "Haptyka";
"settings.title.hapticsTabSelection" = "Wybór zakładki";
"settings.title.hapticsButtonPress" = "Naciśnięcie przycisku";
"settings.title.hapticsListRefresh" = "Odświeżanie listy";
"settings.title.hapticsAnimationFinished" = "Zakończenie animacji";
"settings.title.mediaSettings" = "Ustawienia mediów";
"settings.title.alwaysShowSensitiveTitle" = "Zawsze pokazuj statusy NSFW";
"settings.title.alwaysShowSensitiveDescription" = "Wymuś pokazywanie statusów NFSW (czułych) bez ostrzeżeń";
"settings.title.alwaysShowAltTitle" = "Pokaż tekst alternatywny";
"settings.title.alwaysShowAltDescription" = "Pokaż alternatywny tekst, jeśli jest obecny na szczegółach statusu";
"settings.title.general" = "Ogólne";
"settings.title.applicationIcon" = "Ikona aplikacji";
"settings.title.followVernissage" = "Obserwuj Vernissage";
"settings.title.mastodonAccount" = "Konto Mastodon";
"settings.title.pixelfedAccount" = "Konto Pixelfed";
"settings.title.openPage" = "Otwórz";
"settings.title.privacyPolicy" = "Polityka prywatności";
"settings.title.terms" = "Zasady i warunki";
"settings.title.sourceCode" = "Kod źródłowy";
"settings.title.rate" = "Oceń Vernissage";
"settings.title.socials" = "Społeczności";
"settings.title.menuPosition" = "Pozycja menu";
"settings.title.topMenu" = "Panel tytułowy";
"settings.title.bottomRightMenu" = "Dolny prawy";
"settings.title.bottomLeftMenu" = "Dolny lewy";
"settings.title.showAvatars" = "Wyświetlaj awatary";
"settings.title.showAvatarsOnTimeline" = "Awatary będą widoczne na osiach zdjęć";
"settings.title.showFavourite" = "Wyświetlaj polubienia";
"settings.title.showFavouriteOnTimeline" = "Polubienia będą widoczne na osiach zdjęć";
"settings.title.showAltText" = "Wyświetlaj ikonę ALT";
"settings.title.showAltTextOnTimeline" = "Ikony ALT będą widonczne na osiach zdjęć";
"settings.title.warnAboutMissingAltTitle" = "Ostrzeganie o brakującym tekście ALT";
"settings.title.warnAboutMissingAltDescription" = "Ostrzeżenie o brakujących tekstach ALT będzie wyświetlane przed opublikowaniem nowego statusu.";
"settings.title.enableReboostOnTimeline" = "Wyświetl podbite statusy";
"settings.title.enableReboostOnTimelineDescription" = "Podbite statusy będą widoczne na twojej osi czasu.";
"settings.title.hideStatusesWithoutAlt" = "Ukryj statusy bez tekstu ALT";
"settings.title.hideStatusesWithoutAltDescription" = "Statusy bez tekstu ALT nie będą wyświetlane na twojej osi czasu.";
// Mark: Signin view.
"signin.navigationBar.title" = "Zaloguj się do Pixelfed";
"signin.title.serverAddress" = "Adres serwera";
"signin.title.signIn" = "Zaloguj się";
"signin.title.enterServerAddress" = "Wpisz adres serwera";
"signin.title.howToJoinLink" = "Jak przyłączyć się do Pixelfed";
"signin.title.chooseServer" = "Lub wybierz serwer Pixelfed";
"signin.title.amountOfUsers" = "%d użytkowników";
"signin.title.amountOStatuses" = "%d statusów";
"signin.error.communicationFailed" = "Błąd podczas komunikacji z serwerem.";
// Mark: Status view.
"status.navigationBar.title" = "Szczegóły";
"status.title.uploaded" = "Wysłano";
"status.title.via" = "przez %@";
"status.title.reboostedBy" = "Podbite przez";
"status.title.favouritedBy" = "Polubione przez";
"status.title.openInBrowser" = "Otwórz w przeglądarce";
"status.title.shareStatus" = "Udostępnij status";
"status.title.yourStatus" = "Twój status";
"status.title.delete" = "Usuń";
"status.title.reboosted" = "Podbite";
"status.title.unreboosted" = "Podbicie wycofane";
"status.title.favourited" = "Polubione";
"status.title.unfavourited" = "Polubienie wycofane";
"status.title.bookmarked" = "Dodane do zakładek";
"status.title.unbookmarked" = "Usunięte z zakładek";
"status.title.statusDeleted" = "Status usunięty";
"status.title.reboost" = "Podbij";
"status.title.unreboost" = "Cofnij podbicie";
"status.title.favourite" = "Polub";
"status.title.unfavourite" = "Cofnij polubienie";
"status.title.bookmark" = "Dodaj do zakładek";
"status.title.unbookmark" = "Usuń z zakładek";
"status.title.comment" = "Skomentuj";
"status.title.report" = "Zgłoś";
"status.title.saveImage" = "Zapisz zdjęcie";
"status.title.showMediaDescription" = "Pokaż opis zdjęcia";
"status.title.mediaDescription" = "Opis zdjęcia";
"status.title.shareImage" = "Udostępnij zdjęcie";
"status.title.altText" = "ALT";
"status.error.loadingStatusFailed" = "Błąd podczas wczytywanie statusu.";
"status.error.notFound" = "Status już nie istnieje.";
"status.error.loadingCommentsFailed" =" Błąd podczas wczytywanie komentarzy.";
"status.error.reboostFailed" = "Błąd podczas podbijania.";
"status.error.favouriteFailed" = "Błąd podczas polubiania.";
"status.error.bookmarkFailed" = "Błąd podczas dodawania/usuwania z zakładek.";
"status.error.deleteFailed" = "Błąd podczas usuwania.";
// Mark: Accounts view.
"accounts.navigationBar.followers" = "Obserwujący";
"accounts.navigationBar.following" = "Obserwowani";
"accounts.navigationBar.favouritedBy" = "Polubione przez";
"accounts.navigationBar.reboostedBy" = "Podbite przez";
"accounts.navigationBar.blocked" = "Zablokowani";
"accounts.navigationBar.mutes" = "Wyciszeni";
"accounts.title.noAccounts" = "Niestety nie ma tutaj nikogo.";
"accounts.error.loadingAccountsFailed" = "Błąd podczas wczytywania użytkownikow.";
// Mark: Third party view.
"thirdParty.navigationBar.title" = "Zewnętrzne biblioteki";
// Mark: Widget view.
"widget.title.photoDescription" = "Widget ze zdjęciami z Pixelfed.";
"widget.title.qrCodeDescription" = "Widget z QR kodem do profilu na Pixelfed.";
// Mark: In-app purchases.
"purchase.donut.title" = "Pączek";
"purchase.donut.description" = "Poczęstuj mnie pączkiem.";
"purchase.coffee.title" = "Kawa";
"purchase.coffee.description" = "Poczęstuj mnie kawą.";
"purchase.cake.title" = "Kawa z ciastkiem";
"purchase.cake.description" = "Poczęstuj mnie kawą i ciastkiem.";
// Mark: Edit profile.
"editProfile.navigationBar.title" = "Edutuj profil";
"editProfile.title.displayName" = "Wyświetlana nazwa";
"editProfile.title.bio" = "Bio";
"editProfile.title.website" = "Strona";
"editProfile.title.save" = "Zapisz";
"editProfile.title.accountSaved" = "Profil zaktualizowano.";
"editProfile.title.photoInfo" = "Zmienione zdjęcie będzie widoczne w aplikacji oraz na stronie z małym opóźnieniem.";
"editProfile.title.privateAccount" = "Konto prywatne";
"editProfile.title.privateAccountInfo" = "Kiedy Twoje konto jest prywatne, tylko osoby, które zaakceptujesz mogą oglądać Twoje zdjęcia i filmy na Pixelfed. Nie wpłynie to na Twoich obecnych obserwujących.";
"editProfile.error.saveAccountFailed" = "Błąd podczas aktualizacji profilu.";
"editProfile.error.loadingAvatarFailed" = "Błąd podczas wczytywania zdjęcia.";
"editProfile.error.noProfileData" = "Dane profilu nie mogą zostać wyświetlone.";
"editProfile.error.loadingAccountFailed" = "Błąd podczas pobierania profilu użytkownika.";
// Mark: Instance information.
"instance.navigationBar.title" = "Instancja";
"instance.title.instanceInfo" = "Informacja o instancji";
"instance.title.name" = "Nazwa";
"instance.title.address" = "Adres";
"instance.title.email" = "Email";
"instance.title.version" = "Wersja";
"instance.title.users" = "Użytkownicy";
"instance.title.posts" = "Statusów";
"instance.title.domains" = "Domen";
"instance.title.registrations" = "Rejestracja";
"instance.title.approvalRequired" = "Akeptowanie rejestracji";
"instance.title.rules" = "Reguły instancji";
"instance.title.contact" = "Kontakt";
"instance.title.pixelfedAccount" = "Konto Pixelfed";
"instance.error.noInstanceData" = "Dane instancji nie mogą zostać wyświetlone.";
"instance.error.loadingDataFailed" = "Błąd podczas pobierania danych instancji.";
// Mark: Report screen.
"report.navigationBar.title" = "Zgłoś";
"report.title.close" = "Zamknij";
"report.title.send" = "Wyślij";
"report.title.userReported" = "Użytkownik został zgłoszony.";
"report.title.postReported" = "Status został zgłoszony.";
"report.title.reportType" = "Typ nadużycia";
"report.title.spam" = "Spam";
"report.title.sensitive" = "Nagość lub aktywność seksualna";
"report.title.abusive" = "Mowa lub symbole nienawiści";
"report.title.underage" = "Konto niepełnoletniego";
"report.title.violence" = "Przemoc lub niebezpieczne organizacje";
"report.title.copyright" = "Naruszenie praw autorskich";
"report.title.impersonation" = "Podszywanie się";
"report.title.scam" = "Znęcanie się lub nękanie";
"report.title.terrorism" = "Terroryzm";
"report.error.notReported" = "Błąd podczas wysyłania zgłoszenia.";
// Mark: Following requests.
"followingRequests.navigationBar.title" = "Prośby o obserwowanie";
"followingRequests.title.approve" = "Zaakceptuj";
"followingRequests.title.reject" = "Odrzuć";
"followingRequests.error.approve" = "Błąd podczas akceptowania prośby.";
"followingRequests.error.reject" = "Błąd podczas odrzucania prośby.";

View File

@ -1,4 +1,4 @@
// swift-tools-version: 5.7
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription

View File

@ -16,7 +16,7 @@ extension NetworkError: LocalizedError {
switch self {
case .notSuccessResponse(let response):
let statusCode = response.statusCode()
let localizedString = NSLocalizedString("global.error.notSuccessResponse",
bundle: Bundle.module,
comment: "It's error returned from remote server. Request URL: '\(response.url?.string ?? "unknown")'.")

View File

@ -0,0 +1,286 @@
{
"sourceLanguage" : "en",
"strings" : {
"global.error.notSuccessResponse" : {
"comment" : "It's error returned from remote server. Request URL: '(response.url?.string ?? \"unknown\")'.",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Server response: %@."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Respuesta del servidor: %@."
}
},
"eu" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zerbitzariaren erantzuna: %@."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Réponse du serveur : %@."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Odpowiedź serwera: %@."
}
}
}
},
"global.error.unknownError" : {
"comment" : "Response doesn't contains any information about request status.",
"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" : "Nieznany błąd serwera."
}
}
}
},
"report.error.duplicate" : {
"comment" : "The report has already been sent.",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "The report has already been sent."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "El informe ya ha sido enviado."
}
},
"eu" : {
"stringUnit" : {
"state" : "translated",
"value" : "Txostena bidali da dagoeneko."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Le rapport a déjà été envoyé."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zgłoszenie zostało już wysłane."
}
}
}
},
"report.error.invalidObject" : {
"comment" : "Invalid object type.",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Invalid object type."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipo de objeto no válido."
}
},
"eu" : {
"stringUnit" : {
"state" : "translated",
"value" : "Elementu-mota ez da baliozkoa."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Type d'objet non valide."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Niepoprawny typ obiektu."
}
}
}
},
"report.error.invalidObjectId" : {
"comment" : "Incorrect object Id.",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Incorrect object Id."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Identificador de objeto incorrecto."
}
},
"eu" : {
"stringUnit" : {
"state" : "translated",
"value" : "Elementuaren IDa ez da zuzena."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Identifiant d'object incorrect."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Niepoprawny Id obiektu."
}
}
}
},
"report.error.invalidParameters" : {
"comment" : "Invalid report parameters.",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Invalid report parameters."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Parámetros de informe no válidos."
}
},
"eu" : {
"stringUnit" : {
"state" : "translated",
"value" : "Txostenaren parametroak ez dira baliozkoak."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paramètres de rapport non valides."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Niepoprawne parametry zgłoszenia."
}
}
}
},
"report.error.invalidType" : {
"comment" : "Invalid report type.",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Invalid report type."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipo de informe no válido."
}
},
"eu" : {
"stringUnit" : {
"state" : "translated",
"value" : "Txosten-mota ez da baliozkoa."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Type de rapport non valide."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Niepoprawny typ raportu."
}
}
}
},
"report.error.noSelfReports" : {
"comment" : "Self-reporting is not allowed.",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Self-reporting is not allowed."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "No se permite el autoinforme."
}
},
"eu" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ezin duzu zure burua salatu."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "L'autodéclaration n'est pas autorisée."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zgłaszanie siebie jest niedozwolone."
}
}
}
}
},
"version" : "1.0"
}

View File

@ -1,11 +0,0 @@
// MARK: Network errors.
"global.error.notSuccessResponse" = "Server response: %@.";
"global.error.unknownError" = "Unexpected error.";
// Mark: Report errors.
"report.error.noSelfReports" = "Self-reporting is not allowed.";
"report.error.invalidObjectId" = "Incorrect object Id.";
"report.error.duplicate" = "The report has already been sent.";
"report.error.invalidParameters" = "Invalid report parameters.";
"report.error.invalidType" = "Invalid report type.";
"report.error.invalidObject" = "Invalid object type.";

View File

@ -1,11 +0,0 @@
// MARK: Network errors.
"global.error.notSuccessResponse" = "Respuesta del servidor: %@.";
"global.error.unknownError" = "Error inesperado.";
// Mark: Report errors.
"report.error.noSelfReports" = "No se permite el autoinforme.";
"report.error.invalidObjectId" = "Identificador de objeto incorrecto.";
"report.error.duplicate" = "El informe ya ha sido enviado.";
"report.error.invalidParameters" = "Parámetros de informe no válidos.";
"report.error.invalidType" = "Tipo de informe no válido.";
"report.error.invalidObject" = "Tipo de objeto no válido.";

View File

@ -1,11 +0,0 @@
// MARK: Network errors.
"global.error.notSuccessResponse" = "Zerbitzariaren erantzuna: %@.";
"global.error.unknownError" = "Espero ez zen errorea.";
// Mark: Report errors.
"report.error.noSelfReports" = "Ezin duzu zure burua salatu.";
"report.error.invalidObjectId" = "Elementuaren IDa ez da zuzena.";
"report.error.duplicate" = "Txostena bidali da dagoeneko.";
"report.error.invalidParameters" = "Txostenaren parametroak ez dira baliozkoak.";
"report.error.invalidType" = "Txosten-mota ez da baliozkoa.";
"report.error.invalidObject" = "Elementu-mota ez da baliozkoa.";

View File

@ -1,11 +0,0 @@
// MARK: Network errors.
"global.error.notSuccessResponse" = "Réponse du serveur : %@.";
"global.error.unknownError" = "Erreur inattendue.";
// Mark: Report errors.
"report.error.noSelfReports" = "L'autodéclaration n'est pas autorisée.";
"report.error.invalidObjectId" = "Identifiant d'object incorrect.";
"report.error.duplicate" = "Le rapport a déjà été envoyé.";
"report.error.invalidParameters" = "Paramètres de rapport non valides.";
"report.error.invalidType" = "Type de rapport non valide.";
"report.error.invalidObject" = "Type d'objet non valide.";

View File

@ -1,11 +0,0 @@
// MARK: Network errors.
"global.error.notSuccessResponse" = "Odpowiedź serwera: %@.";
"global.error.unknownError" = "Nieznany błąd serwera.";
// Mark: Report errors.
"report.error.noSelfReports" = "Zgłaszanie siebie jest niedozwolone.";
"report.error.invalidObjectId" = "Niepoprawny Id obiektu.";
"report.error.duplicate" = "Zgłoszenie zostało już wysłane.";
"report.error.invalidParameters" = "Niepoprawne parametry zgłoszenia.";
"report.error.invalidType" = "Niepoprawny typ raportu.";
"report.error.invalidObject" = "Niepoprawny typ obiektu.";

View File

@ -24,12 +24,20 @@ Thank you in advance for any, even the smallest help, with the development of th
## Translations
Creating new translation is pretty easy, all you need to do is to copy two folders:
- `Vernissage/Localization/en.lproj`
- `Vernissage/PixelfedKit/Sources/PixelfedKit/Resources/en.lproj`
Application is using new translation mechanism introduced in XCode 15 (xcstring). Here you can find description how this mechanism is working: [https://www.youtube.com/watch?v=jNbnwwLrJE8](https://www.youtube.com/watch?v=jNbnwwLrJE8).
In the name of the folders you have to put the code of the new language ([here](https://stackoverflow.com/a/13360348) you can find the languages codes).
Then you have to open files in these folders and translate them 🇯🇵🇫🇷🇨🇮🇧🇪. After translation create a Pull Request 👍.
In the applications we have several string catalogs:
- Localization/Localizable
- EnvironmentKit/Source/EnvironmentKit/Localizable
- WidgetKit/Source/WidgetKit/Localizable
- ServicesKit/Source/ServicesKit/Localizable
- PixelfedKit/Source/PixelfedKit/Localizable
- ClientKit/Source/ClientKit/Localizable
Right now it's very easy to find new (not translated yet) titles. Also you can mark titles which need some review.
However you need to have XCode 15 installed. There isn't right now good external tool that have similar features.
![translations](Resources/translations.png)
From time to time you have to come back and translate lines which has been added since the last translation.

BIN
Resources/translations.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@ -1,10 +1,11 @@
// swift-tools-version: 5.8
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "ServicesKit",
defaultLocalization: "en",
platforms: [
.iOS(.v16),
.macOS(.v12),

View File

@ -28,7 +28,7 @@ public class CacheImageService {
self.add(data: imageData, for: url)
}
} catch {
ErrorService.shared.handle(error, message: "Downloading image into cache failed.")
ErrorService.shared.handle(error, message: "global.error.downloadingImageFailed")
}
}

View File

@ -13,8 +13,8 @@ public class ErrorService {
public static let shared = ErrorService()
private init() { }
public func handle(_ error: Error, message: String, showToastr: Bool = false) {
let localizedMessage = NSLocalizedString(message, comment: "Error message")
public func handle(_ error: Error, message: LocalizedStringResource, showToastr: Bool = false) {
let localizedMessage = NSLocalizedString(message.key, comment: "Error message")
if showToastr {
switch error {
@ -28,4 +28,18 @@ public class ErrorService {
Logger.main.error("Error ['\(localizedMessage)']: \(error.localizedDescription)")
Logger.main.error("Error ['\(localizedMessage)']: \(error)")
}
public func handle(_ error: Error, localizedMessage: String, showToastr: Bool = false) {
if showToastr {
switch error {
case is LocalizedError:
ToastrService.shared.showError(localizedMessage: localizedMessage, subtitle: error.localizedDescription)
default:
ToastrService.shared.showError(subtitle: localizedMessage)
}
}
Logger.main.error("Error ['\(localizedMessage)']: \(error.localizedDescription)")
Logger.main.error("Error ['\(localizedMessage)']: \(error)")
}
}

View File

@ -0,0 +1,62 @@
{
"sourceLanguage" : "en",
"strings" : {
"global.error.downloadingImageFailed" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Downloading image into cache failed."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Error al descargar la imagen en la caché."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Błąd podczas pobieranie obrazków do pamięci podręcznej."
}
}
}
},
"global.error.unexpected" : {
"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"
}

View File

@ -12,14 +12,14 @@ public class ToastrService {
public static let shared = ToastrService()
private init() { }
public func showSuccess(_ title: String, imageSystemName: String, subtitle: String? = nil) {
public func showSuccess(_ title: LocalizedStringResource, imageSystemName: String, subtitle: String? = nil) {
let image = self.createImage(systemName: imageSystemName, color: UIColor(Color.accentColor))
self.showSuccess(title, image: image, subtitle: subtitle)
self.showSuccess(title.key, image: image, subtitle: subtitle)
}
public func showSuccess(_ title: String, imageName: String, subtitle: String? = nil) {
public func showSuccess(_ title: LocalizedStringResource, imageName: String, subtitle: String? = nil) {
let image = self.createImage(name: imageName, color: UIColor(Color.accentColor))
self.showSuccess(title, image: image, subtitle: subtitle)
self.showSuccess(title.key, image: image, subtitle: subtitle)
}
private func showSuccess(_ title: String, image: UIImage?, subtitle: String? = nil) {
@ -39,14 +39,19 @@ public class ToastrService {
Drops.show(drop)
}
public func showError(title: String = "global.error.unexpected", imageSystemName: String = "ant.circle.fill", subtitle: String? = nil) {
public func showError(title: LocalizedStringResource = LocalizedStringResource("global.error.unexpected"), imageSystemName: String = "ant.circle.fill", subtitle: String? = nil) {
let image = self.createImage(systemName: imageSystemName, color: UIColor(Color.accentColor))
self.showError(title: title, image: image, subtitle: subtitle)
self.showError(title: title.key, image: image, subtitle: subtitle)
}
public func showError(localizedMessage: String, imageSystemName: String = "ant.circle.fill", subtitle: String? = nil) {
let image = self.createImage(systemName: imageSystemName, color: UIColor(Color.accentColor))
self.showError(title: localizedMessage, image: image, subtitle: subtitle)
}
public func showError(title: String = "global.error.unexpected", imageName: String, subtitle: String? = nil) {
public func showError(title: LocalizedStringResource = LocalizedStringResource("global.error.unexpected"), imageName: String, subtitle: String? = nil) {
let image = self.createImage(name: imageName, color: UIColor(Color.accentColor))
self.showError(title: title, image: image, subtitle: subtitle)
self.showError(title: title.key, image: image, subtitle: subtitle)
}
private func showError(title: String = "global.error.unexpected", image: UIImage?, subtitle: String? = nil) {

View File

@ -27,8 +27,6 @@
F8210DEA2966E4F9001D9973 /* AnimatePlaceholderModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8210DE92966E4F9001D9973 /* AnimatePlaceholderModifier.swift */; };
F825F0C929F7A562008BD204 /* UserProfilePrivateAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F825F0C829F7A562008BD204 /* UserProfilePrivateAccountView.swift */; };
F825F0CB29F7CFC4008BD204 /* FollowRequestsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F825F0CA29F7CFC4008BD204 /* FollowRequestsView.swift */; };
F835082329BEF9C400DE3247 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F835082629BEF9C400DE3247 /* Localizable.strings */; };
F835082429BEF9C400DE3247 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F835082629BEF9C400DE3247 /* Localizable.strings */; };
F83CBEFB298298A1002972C8 /* ImageCarouselPicture.swift in Sources */ = {isa = PBXBuildFile; fileRef = F83CBEFA298298A1002972C8 /* ImageCarouselPicture.swift */; };
F84625E929FE2788002D3AF4 /* QRCodeWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F84625E829FE2788002D3AF4 /* QRCodeWidget.swift */; };
F84625EB29FE28D4002D3AF4 /* QRCodeWidgetEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F84625EA29FE28D4002D3AF4 /* QRCodeWidgetEntryView.swift */; };
@ -129,7 +127,6 @@
F88BC52A29E046D700CE6141 /* WidgetsKit in Frameworks */ = {isa = PBXBuildFile; productRef = F88BC52929E046D700CE6141 /* WidgetsKit */; };
F88BC52D29E04BB600CE6141 /* EnvironmentKit in Frameworks */ = {isa = PBXBuildFile; productRef = F88BC52C29E04BB600CE6141 /* EnvironmentKit */; };
F88BC52F29E04C5F00CE6141 /* EnvironmentKit in Frameworks */ = {isa = PBXBuildFile; productRef = F88BC52E29E04C5F00CE6141 /* EnvironmentKit */; };
F88BC53029E0672000CE6141 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F835082629BEF9C400DE3247 /* Localizable.strings */; };
F88BC53229E0677000CE6141 /* EnvironmentKit in Frameworks */ = {isa = PBXBuildFile; productRef = F88BC53129E0677000CE6141 /* EnvironmentKit */; };
F88BC53B29E06A5100CE6141 /* ImageContextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88BC53A29E06A5100CE6141 /* ImageContextMenu.swift */; };
F88BC53D29E06EAD00CE6141 /* ServicesKit in Frameworks */ = {isa = PBXBuildFile; productRef = F88BC53C29E06EAD00CE6141 /* ServicesKit */; };
@ -170,6 +167,9 @@
F88FAD2B295F43B8009B20C9 /* AccountData+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88FAD29295F43B8009B20C9 /* AccountData+CoreDataProperties.swift */; };
F891E7CE29C35BF50022C449 /* ImageRowItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F891E7CD29C35BF50022C449 /* ImageRowItem.swift */; };
F891E7D029C368750022C449 /* ImageRowItemAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = F891E7CF29C368750022C449 /* ImageRowItemAsync.swift */; };
F89229EF2ADA63620040C964 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = F89229EE2ADA63620040C964 /* Localizable.xcstrings */; };
F89229F02ADA63620040C964 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = F89229EE2ADA63620040C964 /* Localizable.xcstrings */; };
F89229F12ADA63620040C964 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = F89229EE2ADA63620040C964 /* Localizable.xcstrings */; };
F897978F29684BCB00B22335 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897978E29684BCB00B22335 /* LoadingView.swift */; };
F89992C9296D6DC7005994BF /* CommentBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F89992C8296D6DC7005994BF /* CommentBodyView.swift */; };
F89A46DC296EAACE0062125F /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F89A46DB296EAACE0062125F /* SettingsView.swift */; };
@ -277,8 +277,6 @@
F8210DE92966E4F9001D9973 /* AnimatePlaceholderModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimatePlaceholderModifier.swift; sourceTree = "<group>"; };
F825F0C829F7A562008BD204 /* UserProfilePrivateAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfilePrivateAccountView.swift; sourceTree = "<group>"; };
F825F0CA29F7CFC4008BD204 /* FollowRequestsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowRequestsView.swift; sourceTree = "<group>"; };
F835082529BEF9C400DE3247 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
F835082729BEFA1E00DE3247 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = "<group>"; };
F837269429A221420098D3C4 /* PixelfedKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = PixelfedKit; sourceTree = "<group>"; };
F83CBEFA298298A1002972C8 /* ImageCarouselPicture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageCarouselPicture.swift; sourceTree = "<group>"; };
F844F42429D2DC39000DD896 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
@ -390,6 +388,7 @@
F8911A1829DE9E5500770F44 /* Vernissage-007.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Vernissage-007.xcdatamodel"; sourceTree = "<group>"; };
F891E7CD29C35BF50022C449 /* ImageRowItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRowItem.swift; sourceTree = "<group>"; };
F891E7CF29C368750022C449 /* ImageRowItemAsync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRowItemAsync.swift; sourceTree = "<group>"; };
F89229EE2ADA63620040C964 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
F897978E29684BCB00B22335 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = "<group>"; };
F89992C8296D6DC7005994BF /* CommentBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentBodyView.swift; sourceTree = "<group>"; };
F89A46DB296EAACE0062125F /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
@ -403,7 +402,6 @@
F89D6C49297196FF001DA3D4 /* ImageViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageViewer.swift; sourceTree = "<group>"; };
F89F0605299139F6003DC875 /* Vernissage-002.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Vernissage-002.xcdatamodel"; sourceTree = "<group>"; };
F89F57AF29D1C11200001EE3 /* RelationshipModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelationshipModel.swift; sourceTree = "<group>"; };
F8A270DA29F500860062D275 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
F8A4A88429E4099900267E36 /* Vernissage-008.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Vernissage-008.xcdatamodel"; sourceTree = "<group>"; };
F8A93D7D2965FD89001D8331 /* UserProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfileView.swift; sourceTree = "<group>"; };
F8AFF7C029B259150087D083 /* HashtagsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagsView.swift; sourceTree = "<group>"; };
@ -428,7 +426,6 @@
F8D8E0D22ACC89CB00AA1374 /* Vernissage-017.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Vernissage-017.xcdatamodel"; sourceTree = "<group>"; };
F8DF38E329DD68820047F1AA /* ViewOffsetKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewOffsetKey.swift; sourceTree = "<group>"; };
F8DF38E529DDB98A0047F1AA /* SocialsSectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialsSectionView.swift; sourceTree = "<group>"; };
F8DF38E729DDC3D20047F1AA /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Localizable.strings; sourceTree = "<group>"; };
F8E36E452AB8745300769C55 /* Sizable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sizable.swift; sourceTree = "<group>"; };
F8E36E472AB874A500769C55 /* StatusModel+Sizeable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StatusModel+Sizeable.swift"; sourceTree = "<group>"; };
F8E6D03229CDD52500416CCA /* EditProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileView.swift; sourceTree = "<group>"; };
@ -617,7 +614,7 @@
F835081F29BEF88600DE3247 /* Localization */ = {
isa = PBXGroup;
children = (
F835082629BEF9C400DE3247 /* Localizable.strings */,
F89229EE2ADA63620040C964 /* Localizable.xcstrings */,
);
path = Localization;
sourceTree = "<group>";
@ -1065,6 +1062,7 @@
pl,
eu,
fr,
es,
);
mainGroup = F88C245F295C37B80006098B;
packageReferences = (
@ -1091,7 +1089,7 @@
buildActionMask = 2147483647;
files = (
F85D0C652ABA08F9002B3577 /* Assets.xcassets in Resources */,
F835082429BEF9C400DE3247 /* Localizable.strings in Resources */,
F89229F02ADA63620040C964 /* Localizable.xcstrings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1099,8 +1097,8 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F88BC53029E0672000CE6141 /* Localizable.strings in Resources */,
F88BC55429E0798900CE6141 /* SharedAssets.xcassets in Resources */,
F89229F12ADA63620040C964 /* Localizable.xcstrings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1110,7 +1108,7 @@
files = (
F88BC55229E0798900CE6141 /* SharedAssets.xcassets in Resources */,
F88C2473295C37BB0006098B /* Preview Assets.xcassets in Resources */,
F835082329BEF9C400DE3247 /* Localizable.strings in Resources */,
F89229EF2ADA63620040C964 /* Localizable.xcstrings in Resources */,
F88C2470295C37BB0006098B /* Assets.xcassets in Resources */,
F86A42FF299A8C5500DF7645 /* InAppPurchaseStoreKitConfiguration.storekit in Resources */,
);
@ -1341,20 +1339,6 @@
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
F835082629BEF9C400DE3247 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
F835082529BEF9C400DE3247 /* en */,
F835082729BEFA1E00DE3247 /* pl */,
F8DF38E729DDC3D20047F1AA /* eu */,
F8A270DA29F500860062D275 /* fr */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
F864F76E29BB91B600B13921 /* Debug */ = {
isa = XCBuildConfiguration;
@ -1372,13 +1356,13 @@
INFOPLIST_FILE = VernissageWidget/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = VernissageWidget;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.6;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.13.0;
MARKETING_VERSION = 2.0.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage.widget;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
@ -1403,13 +1387,13 @@
INFOPLIST_FILE = VernissageWidget/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = VernissageWidget;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.6;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.13.0;
MARKETING_VERSION = 2.0.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage.widget;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
@ -1433,13 +1417,13 @@
INFOPLIST_FILE = VernissageShare/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = VernissageShareExtension;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.6;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.13.0;
MARKETING_VERSION = 2.0.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage.share;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
@ -1462,13 +1446,13 @@
INFOPLIST_FILE = VernissageShare/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = VernissageShareExtension;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.6;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.13.0;
MARKETING_VERSION = 2.0.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage.share;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
@ -1531,7 +1515,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 16.6;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@ -1588,7 +1573,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 16.6;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
@ -1624,12 +1610,12 @@
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 16.6;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.13.0;
MARKETING_VERSION = 2.0.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -1667,12 +1653,12 @@
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 16.6;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.13.0;
MARKETING_VERSION = 2.0.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.mczachurski.vernissage;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";

View File

@ -62,7 +62,7 @@ final class TipsStore: ObservableObject {
try await self.handlePurchase(from: result)
} catch {
self.status = .failed(.system(error))
ErrorService.shared.handle(error, message: "Purchase failed.", showToastr: false)
ErrorService.shared.handle(error, message: "global.error.purchaseFailed", showToastr: false)
}
}
@ -109,7 +109,7 @@ final class TipsStore: ObservableObject {
}
} catch {
self?.status = .failed(.system(error))
ErrorService.shared.handle(error, message: "Cannot configure transaction listener.", showToastr: false)
ErrorService.shared.handle(error, message: "global.error.cannotConfigureTransactionListener", showToastr: false)
}
}
}
@ -123,7 +123,7 @@ final class TipsStore: ObservableObject {
self.items = products
} catch {
self.status = .failed(.system(error))
ErrorService.shared.handle(error, message: "Cannot download in-app products.", showToastr: false)
ErrorService.shared.handle(error, message: "global.error.cannotDownloadInAppProducts", showToastr: false)
}
}
}

View File

@ -33,7 +33,7 @@ public class AppMetadataService {
self.memoryCacheData[metadataCacheKey] = metadata
return metadata
} catch {
ErrorService.shared.handle(error, message: "Error during downloading metadata.")
ErrorService.shared.handle(error, message: "global.error.errorDuringDownloadingMetadata")
return AppMetadata()
}
}

View File

@ -41,7 +41,7 @@ public class AuthorizationService {
let signedInAccountModel = try await self.refreshCredentials(for: accountModel, presentationContextProvider: session)
result(signedInAccountModel)
} catch {
ErrorService.shared.handle(error, message: "Issues during refreshing credentials.")
ErrorService.shared.handle(error, message: "global.error.refreshingCredentialsTitle")
ToastrService.shared.showError(title: "global.error.refreshingCredentialsTitle",
subtitle: NSLocalizedString("global.error.refreshingCredentialsSubtitle", comment: ""))
result(nil)
@ -115,7 +115,7 @@ public class AuthorizationService {
let avatarData = try await RemoteFileService.shared.fetchData(url: avatarUrl)
accountData.avatarData = avatarData
} catch {
ErrorService.shared.handle(error, message: "Avatar has not been downloaded.")
ErrorService.shared.handle(error, message: "global.error.avatarHasNotBeenDownloaded")
}
}
@ -143,11 +143,11 @@ public class AuthorizationService {
_ = try await self.refreshAccessToken(accountData: account)
#if DEBUG
ToastrService.shared.showSuccess("New access tokens has been retrieved.", imageSystemName: "key.fill")
ToastrService.shared.showSuccess("global.title.newAccessTokenRetrieved", imageSystemName: "key.fill")
#endif
} catch {
#if DEBUG
ErrorService.shared.handle(error, message: "Refresh token failed: '\(account.acct)'.", showToastr: true)
ErrorService.shared.handle(error, message: "global.error.refreshTokenFailed", showToastr: true)
#else
ErrorService.shared.handle(error, message: "Error during refreshing access token for account '\(account.acct)'.")
#endif
@ -242,7 +242,7 @@ public class AuthorizationService {
let avatarData = try await RemoteFileService.shared.fetchData(url: avatarUrl)
dbAccount.avatarData = avatarData
} catch {
ErrorService.shared.handle(error, message: "Avatar has not been downloaded.")
ErrorService.shared.handle(error, message: "global.error.avatarHasNotBeenDownloaded")
}
}

View File

@ -169,7 +169,7 @@ public class HomeTimelineService {
newestStatusId = firstStatus.id
} catch {
ErrorService.shared.handle(error, message: "Error during downloading new statuses for amount of new statuses.")
ErrorService.shared.handle(error, message: "global.error.errorDuringDownloadingNewStatuses")
break
}
}

View File

@ -125,7 +125,7 @@ private struct ImageContextMenu: ViewModifier {
private func reboost() async {
do {
_ = try await self.client.statuses?.boost(statusId: self.id)
ToastrService.shared.showSuccess(NSLocalizedString("status.title.reboosted", comment: "Reboosted"), imageName: "custom.rocket.fill")
ToastrService.shared.showSuccess("status.title.reboosted", imageName: "custom.rocket.fill")
} catch {
ErrorService.shared.handle(error, message: "status.error.reboostFailed", showToastr: true)
}
@ -134,7 +134,7 @@ private struct ImageContextMenu: ViewModifier {
private func favourite() async {
do {
_ = try await self.client.statuses?.favourite(statusId: self.id)
ToastrService.shared.showSuccess(NSLocalizedString("status.title.favourited", comment: "Favourited"), imageSystemName: "star.fill")
ToastrService.shared.showSuccess("status.title.favourited", imageSystemName: "star.fill")
} catch {
ErrorService.shared.handle(error, message: "status.error.favouriteFailed", showToastr: true)
}
@ -143,7 +143,7 @@ private struct ImageContextMenu: ViewModifier {
private func bookmark() async {
do {
_ = try await self.client.statuses?.bookmark(statusId: self.id)
ToastrService.shared.showSuccess(NSLocalizedString("status.title.bookmarked", comment: "Bookmarked"), imageSystemName: "bookmark.fill")
ToastrService.shared.showSuccess("status.title.bookmarked", imageSystemName: "bookmark.fill")
} catch {
ErrorService.shared.handle(error, message: "status.error.bookmarkFailed", showToastr: true)
}

View File

@ -103,7 +103,7 @@ struct SignInView: View {
}
}
} catch let error as AuthorisationError {
ErrorService.shared.handle(error, message: error.localizedDescription, showToastr: true)
ErrorService.shared.handle(error, localizedMessage: error.localizedDescription, showToastr: true)
} catch {
ErrorService.shared.handle(error, message: "signin.error.communicationFailed", showToastr: true)
}

View File

@ -31,10 +31,10 @@ struct StatusPlaceholderView: View {
accountDisplayName: "Verylong Displayname",
accountUsername: "@username")
Text("Lorem ispum text something")
Text("statusPlaceholder.title.line1", comment: "Lorem ispum text something")
.foregroundColor(.customGrayColor)
.font(.footnote)
Text("Lorem ispum text something sdf sdfsdf sdfdsfsdfsdf")
Text("statusPlaceholder.title.line2", comment: "Lorem ispum text something sdf sdfsdf sdfdsfsdfsdf")
.foregroundColor(.customGrayColor)
.font(.footnote)

View File

@ -316,7 +316,7 @@ struct StatusesView: View {
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: "global.error.hashtagNotExists", imageSystemName: "exclamationmark.octagon")
ToastrService.shared.showError(title: LocalizedStringResource("global.error.hashtagNotExists"), imageSystemName: "exclamationmark.octagon")
dismiss()
return []

View File

@ -9,94 +9,93 @@ import SwiftUI
struct ThirdPartyView: View {
var body: some View {
List {
Section("Lazy image & cache") {
Section("thirdparty.lazyimage.title") {
VStack(alignment: .leading) {
Link("https://github.com/kean/Nuke",
Link("thirdparty.lazyimage.address",
destination: URL(string: "https://github.com/kean/Nuke")!)
.padding(.bottom, 4)
// swiftlint:disable:next line_length
Text("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.")
Text("thirdparty.lazyimage.description", comment: "Lazy image section description.")
}
.font(.footnote)
}
Section("Custom emoji") {
Section("thirdparty.customemoji.title") {
VStack(alignment: .leading) {
Link("https://github.com/divadretlaw/EmojiText",
Link("thirdparty.customemoji.address",
destination: URL(string: "https://github.com/divadretlaw/EmojiText")!)
.padding(.bottom, 4)
Text("Render Custom Emoji in Text. Supports local and remote emojis. Remote emojis are loadad and cached using Nuke.")
Text("thirdparty.customemoji.description", comment: "Render Custom Emoji in Text. Supports local and remote emojis. Remote emojis are loadad and cached using Nuke.")
}
.font(.footnote)
}
Section("Status body") {
Section("thirdparty.htmlmarkdown.title") {
VStack(alignment: .leading) {
Link("https://gitlab.com/mflint/HTML2Markdown",
Link("thirdparty.htmlmarkdown.address",
destination: URL(string: "https://gitlab.com/mflint/HTML2Markdown")!)
.padding(.bottom, 4)
Text("It's a Swift Package which attempts to convert HTML into Markdown.")
Text("thirdparty.htmlmarkdown.description", comment: "It's a Swift Package which attempts to convert HTML into Markdown.")
}
.font(.footnote)
}
Section("OAuth authorization") {
Section("thirdparty.oauth.title") {
VStack(alignment: .leading) {
Link("https://github.com/OAuthSwift/OAuthSwift",
Link("thirdparty.oauth.address",
destination: URL(string: "https://github.com/OAuthSwift/OAuthSwift")!)
.padding(.bottom, 4)
Text("Swift based OAuth library for iOS and macOS.")
Text("thirdparty.oauth.description", comment: "Swift based OAuth library for iOS and macOS.")
}
.font(.footnote)
}
Section("Notifications") {
Section("thirdparty.notifications.title") {
VStack(alignment: .leading) {
Link("https://github.com/omaralbeik/Drops",
Link("thirdparty.notifications.address",
destination: URL(string: "https://github.com/omaralbeik/Drops")!)
.padding(.bottom, 4)
Text("A µFramework for showing alerts like the one used when copying from pasteboard or connecting Apple pencil.")
Text("thirdparty.notifications.description", comment: "A µFramework for showing alerts like the one used when copying from pasteboard or connecting Apple pencil.")
}
.font(.footnote)
}
Section("Loaders") {
Section("thirdparty.loaders.title") {
VStack(alignment: .leading) {
Link("https://github.com/exyte/ActivityIndicatorView",
Link("thirdparty.loaders.address",
destination: URL(string: "https://github.com/exyte/ActivityIndicatorView")!)
.padding(.bottom, 4)
Text("A number of preset loading indicators created with SwiftUI.")
Text("thirdparty.loaders.description", comment: "A number of preset loading indicators created with SwiftUI.")
}
.font(.footnote)
}
Section("HTML String") {
Section("thirdparty.htmlstring.title") {
VStack(alignment: .leading) {
Link("https://github.com/alexisakers/HTMLString",
Link("thirdparty.htmlstring.address",
destination: URL(string: "https://github.com/alexisakers/HTMLString")!)
.padding(.bottom, 4)
Text("HTMLString is a library written in Swift that allows your program to add and remove HTML entities in Strings.")
Text("thirdparty.htmlstring.description", comment: "HTMLString is a library written in Swift that allows your program to add and remove HTML entities in Strings.")
}
.font(.footnote)
}
Section("Fleur De Leah") {
Section("thirdparty.fleur.title") {
VStack(alignment: .leading) {
Link("https://fonts.google.com/specimen/Fleur+De+Leah",
Link("thirdparty.fleur.address",
destination: URL(string: "https://fonts.google.com/specimen/Fleur+De+Leah")!)
.padding(.bottom, 4)
Text("Font used in the application in the icons and in the splash screen.")
Text("thirdparty.fleur.description", comment: "Font used in the application in the icons and in the splash screen.")
}
.font(.footnote)
}
Section("QR codes") {
Section("thirdparty.qrcodes.title") {
VStack(alignment: .leading) {
Link("https://github.com/dmrschmidt/QRCode",
Link("thirdparty.qrcodes.address",
destination: URL(string: "https://github.com/dmrschmidt/QRCode")!)
.padding(.bottom, 4)
Text("A simple QR code image generator to use in your apps, written in Swift 5.")
Text("thirdparty.qrcodes.description", comment: "A simple QR code image generator to use in your apps, written in Swift 5.")
}
.font(.footnote)
}

View File

@ -290,7 +290,7 @@ struct UserProfileView: View {
}
}
} catch {
ErrorService.shared.handle(error, message: "userProfile.error.mute", showToastr: true)
ErrorService.shared.handle(error, message: "userProfile.error.muting", showToastr: true)
}
}

View File

@ -39,7 +39,7 @@ struct ImagesGrid: View {
ImageGrid(photoUrl: photoUrl, maxHeight: $maxHeight)
}
Text("more...")
Text("global.title.more", comment: "more...")
.foregroundColor(.accentColor)
.fontWeight(.bold)
.padding(10)

View File

@ -155,9 +155,7 @@ struct InteractionRow: View {
self.reblogged = status.reblogged
}
ToastrService.shared.showSuccess(self.reblogged
? NSLocalizedString("status.title.reboosted", comment: "Reboosted")
: NSLocalizedString("status.title.unreboosted", comment: "Unreboosted"), imageName: "custom.rocket.fill")
ToastrService.shared.showSuccess(self.reblogged ? "status.title.reboosted" : "status.title.unreboosted", imageName: "custom.rocket.fill")
} catch {
ErrorService.shared.handle(error, message: "status.error.reboostFailed", showToastr: true)
}
@ -177,9 +175,7 @@ struct InteractionRow: View {
self.favourited = status.favourited
}
ToastrService.shared.showSuccess(self.favourited
? NSLocalizedString("status.title.favourited", comment: "Favourited")
: NSLocalizedString("status.title.unfavourited", comment: "Unfavourited"), imageSystemName: "star.fill")
ToastrService.shared.showSuccess(self.favourited ? "status.title.favourited" : "status.title.unfavourited", imageSystemName: "star.fill")
} catch {
ErrorService.shared.handle(error, message: "status.error.favouriteFailed", showToastr: true)
}
@ -192,9 +188,7 @@ struct InteractionRow: View {
: try await self.client.statuses?.bookmark(statusId: self.statusModel.getOrginalStatusId())
self.bookmarked.toggle()
ToastrService.shared.showSuccess(self.bookmarked
? NSLocalizedString("status.title.bookmarked", comment: "Bookmarked")
: NSLocalizedString("status.title.unbookmarked", comment: "Unbookmarked"), imageSystemName: "bookmark.fill")
ToastrService.shared.showSuccess(self.bookmarked ? "status.title.bookmarked" : "status.title.unbookmarked", imageSystemName: "bookmark.fill")
} catch {
ErrorService.shared.handle(error, message: "status.error.bookmarkFailed", showToastr: true)
}

View File

@ -17,7 +17,7 @@ struct PhotoWidgetEntryView: View {
case .systemSmall: PhotoSmallWidgetView(entry: entry)
case .systemMedium: PhotoMediumWidgetView(entry: entry)
case .systemLarge: PhotoLargeWidgetView(entry: entry)
default: Text("Not supported")
default: Text("widget.family.notSupported", comment: "Not supported")
}
}
}

View File

@ -17,7 +17,7 @@ struct QRCodeWidgetEntryView: View {
case .systemSmall: QRCodeSmallWidgetView(entry: entry)
case .systemMedium: QRCodeMediumWidgetView(entry: entry)
case .systemLarge: QRCodeLargeWidgetView(entry: entry)
default: Text("Not supported")
default: Text("widget.family.notSupported", comment: "Not supported")
}
}
}

View File

@ -1,10 +1,11 @@
// swift-tools-version: 5.8
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "WidgetsKit",
defaultLocalization: "en",
platforms: [
.iOS(.v16),
.macOS(.v12),

View File

@ -19,11 +19,11 @@ public extension FileManager {
do {
try removeItem(atPath: fileUrl.path)
} catch {
ErrorService.shared.handle(error, message: "Error during deleting file: '\(fileUrl.path)' from tmp directory.")
ErrorService.shared.handle(error, message: "global.error.errorDuringDeletingFileFromTmpDirectory")
}
}
} catch {
ErrorService.shared.handle(error, message: "Error during getting tmp directory contents.")
ErrorService.shared.handle(error, message: "global.error.errorDuringGettingTmpDirectoryContents")
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -117,7 +117,7 @@ public extension [PhotoAttachment] {
do {
try FileManager.default.removeItem(at: fileUrl)
} catch {
ErrorService.shared.handle(error, message: "Error during removing transferred image from tmp directory.")
ErrorService.shared.handle(error, message: "global.error.errorDuringRemovingTransferredImage")
}
}
}

View File

@ -131,7 +131,7 @@ public class TextModel: NSObject, ObservableObject {
}
}
} catch {
ErrorService.shared.handle(error, message: "Error during composing attribute string.")
ErrorService.shared.handle(error, message: "compose.error.errorDuringComposingAttributeString")
}
}
@ -158,7 +158,7 @@ public class TextModel: NSObject, ObservableObject {
break
}
} catch {
ErrorService.shared.handle(error, message: "Error during downloading autocomplete.")
ErrorService.shared.handle(error, message: "compose.error.errorDuringDownloadingAutocomplete")
}
}
}

View File

@ -116,14 +116,14 @@ public struct BaseComposeView: View {
await self.publishStatus()
}
} label: {
Text("compose.title.publish", comment: "Publish")
Text("compose.title.publish", bundle: Bundle.module, comment: "Publish")
}
.disabled(self.publishDisabled)
.buttonStyle(.borderedProminent)
}
ToolbarItem(placement: .cancellationAction) {
Button(NSLocalizedString("compose.title.cancel", comment: "Cancel"), role: .cancel) {
Button(NSLocalizedString("compose.title.cancel", bundle: Bundle.module, comment: "Cancel"), role: .cancel) {
self.close()
}
}
@ -184,14 +184,14 @@ public struct BaseComposeView: View {
.background(.black)
})
.alert(isPresented: $showAltAlert, content: {
Alert(title: Text("compose.title.missingAltTexts", comment: "Missing ALT texts"),
message: Text("compose.title.missingAltTextsWarning", comment: "Missing ALT texts warning"),
primaryButton: .default(Text("compose.title.publish", comment: "Publish")) {
Alert(title: Text("compose.title.missingAltTexts", bundle: Bundle.module, comment: "Missing ALT texts"),
message: Text("compose.title.missingAltTextsWarning", bundle: Bundle.module, comment: "Missing ALT texts warning"),
primaryButton: .default(Text("compose.title.publish", bundle: Bundle.module, comment: "Publish")) {
Task {
await self.sendToServer()
}
},
secondaryButton: .cancel(Text("compose.title.cancel", comment: "Cancel")))
secondaryButton: .cancel(Text("compose.title.cancel", bundle: Bundle.module, comment: "Cancel")))
})
.interactiveDismissDisabled(self.interactiveDismissDisabled)
}
@ -302,7 +302,7 @@ public struct BaseComposeView: View {
TextView($textModel.text, getTextView: { textView in
self.textModel.textView = textView
})
.placeholder(self.placeholder())
.placeholder(LocalizedStringKey(self.placeholder()))
.padding(.horizontal, 8)
.focused($focusedField, equals: .content)
.onFirstAppear {
@ -328,7 +328,7 @@ public struct BaseComposeView: View {
@ViewBuilder
private func contentWarningView() -> some View {
if self.isSensitive {
TextField("compose.title.writeContentWarning", text: $spoilerText, axis: .vertical)
TextField(NSLocalizedString("compose.title.writeContentWarning", bundle: Bundle.module, comment: "Content warning"), text: $spoilerText, axis: .vertical)
.padding(8)
.lineLimit(1...2)
.focused($focusedField, equals: .spoilerText)
@ -342,7 +342,7 @@ public struct BaseComposeView: View {
if self.commentsDisabled {
HStack {
Spacer()
Text("compose.title.commentsWillBeDisabled")
Text("compose.title.commentsWillBeDisabled", bundle: Bundle.module, comment: "Comments disabled")
.textCase(.uppercase)
.font(.caption2)
.foregroundColor(.dangerColor)
@ -360,7 +360,11 @@ public struct BaseComposeView: View {
self.visibilityText = "compose.title.everyone"
self.visibilityImage = "globe.europe.africa"
} label: {
Label("compose.title.everyone", systemImage: "globe.europe.africa")
Label {
Text("compose.title.everyone", bundle: Bundle.module, comment: "Everyone")
} icon: {
Image(systemName: "globe.europe.africa")
}
}
Button {
@ -368,7 +372,11 @@ public struct BaseComposeView: View {
self.visibilityText = "compose.title.unlisted"
self.visibilityImage = "lock.open"
} label: {
Label("compose.title.unlisted", systemImage: "lock.open")
Label {
Text("compose.title.unlisted", bundle: Bundle.module, comment: "Unlisted")
} icon: {
Image(systemName: "lock.open")
}
}
Button {
@ -376,11 +384,19 @@ public struct BaseComposeView: View {
self.visibilityText = "compose.title.followers"
self.visibilityImage = "lock"
} label: {
Label("compose.title.followers", systemImage: "lock")
Label {
Text("compose.title.followers", bundle: Bundle.module, comment: "Followers")
} icon: {
Image(systemName: "lock")
}
}
} label: {
HStack {
Label(self.visibilityText, systemImage: self.visibilityImage)
Label {
Text(self.visibilityText, bundle: Bundle.module, comment: "Visibility text")
} icon: {
Image(systemName: self.visibilityImage)
}
Image(systemName: "chevron.down")
}
.padding(.vertical, 4)
@ -465,7 +481,11 @@ public struct BaseComposeView: View {
self.focusedField = .unknown
self.photosPickerVisible = true
} label: {
Label("compose.title.photos", systemImage: "photo")
Label {
Text("compose.title.photos", bundle: Bundle.module, comment: "Photo")
} icon: {
Image(systemName: "photo")
}
}
Button {
@ -473,7 +493,11 @@ public struct BaseComposeView: View {
self.focusedField = .unknown
self.isCameraPickerPresented = true
} label: {
Label("compose.title.camera", systemImage: "camera")
Label {
Text("compose.title.camera", bundle: Bundle.module, comment: "Camera")
} icon: {
Image(systemName: "camera")
}
}
Button {
@ -481,7 +505,11 @@ public struct BaseComposeView: View {
self.focusedField = .unknown
isFileImporterPresented = true
} label: {
Label("compose.title.files", systemImage: "folder")
Label {
Text("compose.title.files", bundle: Bundle.module, comment: "Files")
} icon: {
Image(systemName: "folder")
}
}
} label: {
Image(systemName: self.photosAreAttached ? "photo.fill.on.rectangle.fill" : "photo.on.rectangle")
@ -547,8 +575,8 @@ public struct BaseComposeView: View {
.background(Color.keyboardToolbarColor)
}
private func placeholder() -> LocalizedStringKey {
self.statusViewModel == nil ? "compose.title.attachPhotoFull" : "compose.title.attachPhotoMini"
private func placeholder() -> String {
self.statusViewModel == nil ? NSLocalizedString("compose.title.attachPhotoFull", bundle: Bundle.module, comment: "") : NSLocalizedString("compose.title.attachPhotoMini", bundle: Bundle.module, comment: "")
}
private func isPublishButtonDisabled() -> Bool {
@ -643,7 +671,7 @@ public struct BaseComposeView: View {
photoAttachment.loadError = error
if Bundle.main.bundlePath.hasSuffix(".appex") {
ErrorService.shared.handle(error, message: "Cannot load image from external library.")
ErrorService.shared.handle(error, message: "compose.error.cannotLoadImageFromExternalLibrary")
} else {
ErrorService.shared.handle(error, message: "compose.error.loadingPhotosFailed", showToastr: true)
}

View File

@ -39,7 +39,7 @@ public struct ImageUploadView: View {
HapticService.shared.fireHaptic(of: .buttonPress)
self.upload()
} label: {
Text("compose.title.tryToUpload", comment: "Try to upload")
Text("compose.title.tryToUpload", bundle: Bundle.module, comment: "Try to upload")
.font(.caption)
}.buttonStyle(.borderedProminent)
} else {
@ -113,7 +113,7 @@ public struct ImageUploadView: View {
.foregroundStyle(Color.white, Color.systemGreen)
}
Text("status.title.altText", comment: "ALT")
Text("status.title.altText", bundle: Bundle.module, comment: "ALT")
.foregroundStyle(Color.white)
}
.font(.system(size: 12))

View File

@ -37,7 +37,7 @@ public struct PhotoEditorView: View {
}
Section(header: Text("photoEdit.title.accessibility")) {
TextField("photoEdit.title.accessibilityDescription", text: $description, axis: .vertical)
TextField(NSLocalizedString("photoEdit.title.accessibilityDescription", bundle: Bundle.module, comment: "Accesibility"), text: $description, axis: .vertical)
.keyboardType(.default)
.lineLimit(3...6)
.multilineTextAlignment(.leading)
@ -53,7 +53,7 @@ public struct PhotoEditorView: View {
.onAppear {
self.description = self.photoAttachment.uploadedAttachment?.description ?? String.empty()
}
.navigationTitle("photoEdit.navigationBar.title")
.navigationTitle(NSLocalizedString("photoEdit.navigationBar.title", bundle: Bundle.module, comment: "Title"))
.navigationBarTitleDisplayMode(.inline)
.toolbar {
self.getTrailingToolbar()
@ -67,12 +67,12 @@ public struct PhotoEditorView: View {
ActionButton(showLoader: false) {
await self.update()
} label: {
Text("photoEdit.title.save", comment: "Save")
Text("photoEdit.title.save", bundle: Bundle.module, comment: "Save")
}.buttonStyle(.borderedProminent)
}
ToolbarItem(placement: .cancellationAction) {
Button(NSLocalizedString("photoEdit.title.cancel", comment: "Cancel"), role: .cancel) {
Button(NSLocalizedString("photoEdit.title.cancel", bundle: Bundle.module, comment: "Cancel"), role: .cancel) {
dismiss()
}
}

View File

@ -37,7 +37,7 @@ public struct PlaceSelectorView: View {
List {
Section {
HStack {
TextField("placeSelector.title.search", text: $query)
TextField(NSLocalizedString("placeSelector.title.search", bundle: Bundle.module, comment: "Search"), text: $query)
.padding(8)
.focused($focusedField, equals: .search)
.keyboardType(.default)
@ -50,7 +50,7 @@ public struct PlaceSelectorView: View {
await self.searchPlaces()
}
} label: {
Text("placeSelector.title.buttonSearch", comment: "Search")
Text("placeSelector.title.buttonSearch", bundle: Bundle.module, comment: "Search")
}
.buttonStyle(.bordered)
@ -93,7 +93,7 @@ public struct PlaceSelectorView: View {
}
}
}
.navigationTitle("placeSelector.navigationBar.title")
.navigationTitle(NSLocalizedString("placeSelector.navigationBar.title", bundle: Bundle.module, comment: "Title"))
.navigationBarTitleDisplayMode(.inline)
.toolbar {
self.getTrailingToolbar()
@ -104,7 +104,7 @@ public struct PlaceSelectorView: View {
@ToolbarContentBuilder
private func getTrailingToolbar() -> some ToolbarContent {
ToolbarItem(placement: .cancellationAction) {
Button(NSLocalizedString("placeSelector.title.cancel", comment: "Cancel"), role: .cancel) {
Button(NSLocalizedString("placeSelector.title.cancel", bundle: Bundle.module, comment: "Cancel"), role: .cancel) {
self.dismiss()
}
}

View File

@ -23,11 +23,3 @@ public struct BottomRight<Content: View>: View {
}
}
}
struct BottomRight_Previews: PreviewProvider {
static var previews: some View {
BottomRight {
Text("1/2")
}
}
}

View File

@ -58,7 +58,7 @@ public struct ContentWarning<Content: View, Blurred: View>: View {
Image(systemName: "eye.slash.fill")
.font(.title2)
.shadow(color: Color.systemBackground, radius: 0.3)
Text("global.title.contentWarning", comment: "Sensitive content")
Text("global.title.contentWarning", bundle: Bundle.module, comment: "Sensitive content")
.font(.title2)
.shadow(color: Color.systemBackground, radius: 0.3)
if let spoilerText {
@ -72,7 +72,7 @@ public struct ContentWarning<Content: View, Blurred: View>: View {
self.showSensitive = true
}
} label: {
Text("global.title.seePost", comment: "See post")
Text("global.title.seePost", bundle: Bundle.module, comment: "See post")
.shadow(color: Color.systemBackground, radius: 0.3)
}
.buttonStyle(.bordered)

View File

@ -31,7 +31,7 @@ public struct ErrorView: View {
await refreshAction()
}
} label: {
Text("global.title.refresh", comment: "Refresh")
Text("global.title.refresh", bundle: Bundle.module, comment: "Refresh")
}
}
}

View File

@ -57,7 +57,7 @@ struct ExpandableText: View {
isExpanded.toggle()
}
} label: {
Text(isExpanded ? "global.title.showLess" : "global.title.showMore", comment: "Show less/more")
Text(isExpanded ? "global.title.showLess" : "global.title.showMore", bundle: Bundle.module, comment: "Show less/more")
.foregroundColor(.accentColor)
.textCase(.uppercase)
}

View File

@ -29,7 +29,7 @@ public struct ImageAlternativeText: View {
Button {
self.open(text)
} label: {
Text("status.title.altText", comment: "ALT")
Text("status.title.altText", bundle: Bundle.module, comment: "ALT")
.font(.system(size: 12))
.shadow(color: .black, radius: 4)
.foregroundColor(.white.opacity(0.8))