diff --git a/IceCubesApp/App/AppRegistry.swift b/IceCubesApp/App/AppRegistry.swift index 52de18a5..9a6eb754 100644 --- a/IceCubesApp/App/AppRegistry.swift +++ b/IceCubesApp/App/AppRegistry.swift @@ -44,6 +44,12 @@ extension View { selectedTagGroup: .constant(nil), scrollToTopSignal: .constant(0), canFilterTimeline: false) + case let .linkTimeline(url, title): + TimelineView(timeline: .constant(.link(url: url, title: title)), + pinnedFilters: .constant([]), + selectedTagGroup: .constant(nil), + scrollToTopSignal: .constant(0), + canFilterTimeline: false) case let .following(id): AccountsListView(mode: .following(accountId: id)) case let .followers(id): diff --git a/IceCubesApp/App/Tabs/Tabs.swift b/IceCubesApp/App/Tabs/Tabs.swift index 71823d0e..7e6ff76c 100644 --- a/IceCubesApp/App/Tabs/Tabs.swift +++ b/IceCubesApp/App/Tabs/Tabs.swift @@ -186,6 +186,7 @@ class SidebarTabs { .init(tab: .favorites, enabled: true), .init(tab: .followedTags, enabled: true), .init(tab: .lists, enabled: true), + .init(tab: .links, enabled: true), .init(tab: .settings, enabled: true), .init(tab: .profile, enabled: true), @@ -221,7 +222,7 @@ class iOSTabs { @AppStorage(TabEntries.first.rawValue) var firstTab = Tab.timeline @AppStorage(TabEntries.second.rawValue) var secondTab = Tab.notifications @AppStorage(TabEntries.third.rawValue) var thirdTab = Tab.explore - @AppStorage(TabEntries.fourth.rawValue) var fourthTab = Tab.messages + @AppStorage(TabEntries.fourth.rawValue) var fourthTab = Tab.links @AppStorage(TabEntries.fifth.rawValue) var fifthTab = Tab.profile } diff --git a/IceCubesApp/Resources/Localization/Localizable.xcstrings b/IceCubesApp/Resources/Localization/Localizable.xcstrings index cee96b14..99a30779 100644 --- a/IceCubesApp/Resources/Localization/Localizable.xcstrings +++ b/IceCubesApp/Resources/Localization/Localizable.xcstrings @@ -327,6 +327,12 @@ "value" : "%@" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -388,7 +394,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ is already selected" + "value" : "%@ est déjà sélectionné" } }, "it" : { @@ -506,7 +512,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ already exists" + "value" : "%@ existe déjà" } }, "it" : { @@ -624,7 +630,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ is an invalid SFSymbol name" + "value" : "%@ n'est pas un nom valide de SFSymbol" } }, "it" : { @@ -715,6 +721,12 @@ "value" : "%@ Mastodonen argitaratu da" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ a été publié sur Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -1120,7 +1132,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Opens options sheet." + "value" : "Ouvrir la page d'options" } }, "it" : { @@ -1239,7 +1251,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "AI prompt" + "value" : "Prompt d'IA" } }, "it" : { @@ -1477,7 +1489,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Characters remaining" + "value" : "Caractères restants" } }, "it" : { @@ -2071,8 +2083,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Alerte spoiler" + "state" : "translated", + "value" : "Avertissement sur le contenu" } }, "it" : { @@ -2191,7 +2203,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Changes post audience." + "value" : "Change l'audience de la publication" } }, "it" : { @@ -2310,7 +2322,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Visibility" + "value" : "Visibilité" } }, "it" : { @@ -2787,7 +2799,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "More alt text available" + "value" : "Plus de texte alternatif disponible" } }, "it" : { @@ -3025,7 +3037,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Animated Gif" + "value" : "Gif animé" } }, "it" : { @@ -3263,7 +3275,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Video" + "value" : "Vidéo" } }, "it" : { @@ -3382,7 +3394,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ boosted %@" + "value" : "%@ a boosté %@" } }, "it" : { @@ -3501,7 +3513,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ replied to" + "value" : "%@ a répondu" } }, "it" : { @@ -3739,7 +3751,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Contains %@" + "value" : "Contient %@" } }, "it" : { @@ -3858,7 +3870,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Open media viewer" + "value" : "Ouvrir la visionneuse multimédia" } }, "it" : { @@ -3977,7 +3989,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Active poll" + "value" : "Sondage actif" } }, "it" : { @@ -4096,7 +4108,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Poll results" + "value" : "Résultats de sondage" } }, "it" : { @@ -4334,7 +4346,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Selected" + "value" : "Sélectionné" } }, "it" : { @@ -4453,7 +4465,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Full Content" + "value" : "Tout le contenu" } }, "it" : { @@ -4572,7 +4584,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Unread" + "value" : "Non lu" } }, "it" : { @@ -4691,7 +4703,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "User-defined fields" + "value" : "Champs définis par l'utilisateur" } }, "it" : { @@ -4810,7 +4822,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Verified" + "value" : "Vérifié" } }, "it" : { @@ -4929,7 +4941,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Navigates to list." + "value" : "Navigue jusque la liste" } }, "it" : { @@ -5048,7 +5060,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Navigates to list." + "value" : "Navigue jusque la liste." } }, "it" : { @@ -5167,7 +5179,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Displays a larger version." + "value" : "Affiche une version plus grande." } }, "it" : { @@ -5286,7 +5298,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Header image" + "value" : "Image d'en-tête" } }, "it" : { @@ -5405,7 +5417,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Settings" + "value" : "Réglages" } }, "it" : { @@ -5524,7 +5536,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "More" + "value" : "Plus" } }, "it" : { @@ -5762,7 +5774,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bookmarks" + "value" : "Marque-pages" } }, "it" : { @@ -5881,7 +5893,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Favorites" + "value" : "Favoris" } }, "it" : { @@ -6119,7 +6131,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Lists" + "value" : "Listes" } }, "it" : { @@ -6238,7 +6250,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Media" + "value" : "Média" } }, "it" : { @@ -6476,7 +6488,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Posts" + "value" : "Publications" } }, "it" : { @@ -6595,7 +6607,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Scrolls to list." + "value" : "Défile jusqu'à la liste." } }, "it" : { @@ -6833,7 +6845,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Profile photo" + "value" : "Photo de profil" } }, "it" : { @@ -7071,7 +7083,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Receive notifications" + "value" : "Recevoir des notifications" } }, "it" : { @@ -7190,7 +7202,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Display boosts" + "value" : "Afficher les boosts" } }, "it" : { @@ -7309,7 +7321,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Blocked" + "value" : "Bloqué" } }, "it" : { @@ -7428,7 +7440,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bot account" + "value" : "Compte robot" } }, "it" : { @@ -7547,7 +7559,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Muted" + "value" : "Silencié" } }, "it" : { @@ -7666,7 +7678,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Private account" + "value" : "Compte privé" } }, "it" : { @@ -7784,7 +7796,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter un compte>" + "value" : "Ajouter un compte" } }, "it" : { @@ -8022,7 +8034,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Visit %@" + "value" : "Visiter %@" } }, "it" : { @@ -8141,7 +8153,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "New" + "value" : "Nouveau" } }, "it" : { @@ -8260,7 +8272,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Create" + "value" : "Créer" } }, "it" : { @@ -8379,7 +8391,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Compose" + "value" : "Composer" } }, "it" : { @@ -8498,7 +8510,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Scrolls the timeline." + "value" : "Déroule la chronologie." } }, "it" : { @@ -8703,14 +8715,14 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%lld new posts" + "state" : "translated", + "value" : "%lld nouvelle publication" } }, "other" : { "stringUnit" : { "state" : "translated", - "value" : "%lld new posts" + "value" : "%lld nouvelles publications" } } } @@ -8942,6 +8954,12 @@ "value" : "Kontua" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compte" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -9005,7 +9023,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter/Retirer des listes" + "value" : "Ajouter / retirer des listes" } }, "it" : { @@ -9243,7 +9261,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Block %@" + "value" : "Bloquer %@" } }, "it" : { @@ -9362,7 +9380,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Do you want to block this user?" + "value" : "Voulez-vous bloquer cet utilisateur ?" } }, "it" : { @@ -10072,7 +10090,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "More Settings" + "value" : "Plus de réglages" } }, "it" : { @@ -10548,7 +10566,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Privacy Settings" + "value" : "Paramètres de confidentialité" } }, "it" : { @@ -11262,7 +11280,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Cette instance n'est pas actuellement prise en charge." + "value" : "Cette instance n'est actuellement pas prise en charge." } }, "it" : { @@ -11616,8 +11634,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Blocked accounts" + "state" : "translated", + "value" : "Comptes bloqués" } }, "it" : { @@ -12060,8 +12078,8 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%lld publications" + "state" : "translated", + "value" : "%lld publication" } }, "other" : { @@ -12413,8 +12431,8 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%lld champs" + "state" : "translated", + "value" : "%lld champ" } }, "other" : { @@ -12799,7 +12817,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Compte bot" + "value" : "Compte robot" } }, "it" : { @@ -13275,7 +13293,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Add a new metadata" + "value" : "Ajouter une nouvelle métadonnée" } }, "it" : { @@ -13394,7 +13412,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Editer l'avatar" + "value" : "Éditer l'avatar" } }, "it" : { @@ -13887,7 +13905,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Editer la bannière" + "value" : "Éditer la bannière" } }, "it" : { @@ -14142,7 +14160,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Profile Metadata" + "value" : "Métadonnées du profil" } }, "it" : { @@ -14261,7 +14279,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Content" + "value" : "Contenu" } }, "it" : { @@ -14499,7 +14517,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Warning: These settings are overwritten by the global content settings" + "value" : "Attention : ces paramètres sont écrasés par les paramètres de contenu globaux" } }, "it" : { @@ -14975,7 +14993,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Favorisé par" + "value" : "Mis en favoris par" } }, "it" : { @@ -17494,8 +17512,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Muted accounts" + "state" : "translated", + "value" : "Comptes silenciés" } }, "it" : { @@ -19278,7 +19296,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tag Group Icon (SFSymbol name)" + "value" : "Icône du groupe de tags (nom SFSymbol)" } }, "it" : { @@ -19396,7 +19414,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Add tags to the group" + "value" : "Ajouter des tags au groupe" } }, "it" : { @@ -19632,7 +19650,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Duplicated tag" + "value" : "Tag dupliqué" } }, "it" : { @@ -19750,7 +19768,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Number of tags is less than 2" + "value" : "Le nombre de balises est inférieur à 2" } }, "it" : { @@ -19868,7 +19886,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "No Symbol Found" + "value" : "Pas de Symbole trouvé" } }, "it" : { @@ -19987,7 +20005,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tag Group Title" + "value" : "Titre du groupe de tags" } }, "it" : { @@ -20105,7 +20123,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Empty title" + "value" : "Titre vide" } }, "it" : { @@ -20223,7 +20241,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "No symbol is selected" + "value" : "Aucun symbole n'est sélectionné" } }, "it" : { @@ -20459,7 +20477,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Erreur!" + "value" : "Erreur !" } }, "it" : { @@ -20550,6 +20568,12 @@ "value" : "Errorea gertatu da Mastodonen argitaratzean, saiatu berriro." } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une erreur s'est produite lors de la publication sur Mastodon, veuillez réessayer." + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -20704,6 +20728,12 @@ "value" : "AppAccount" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compte de l'app" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -20738,6 +20768,12 @@ "value" : "Laster-markak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Marque-pages" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -20772,6 +20808,12 @@ "value" : "Idatzi bidalketa bat" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Composer une publication" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -20806,6 +20848,12 @@ "value" : "Idatzi bidalketa bat Mastodonerako" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Composer une publication vers Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -20840,6 +20888,12 @@ "value" : "Mastodonera bidaliko den bidalketaren edukia" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contenu de la publication à envoyer vers Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -21141,7 +21195,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "View detail" + "value" : "Afficher les détails" } }, "it" : { @@ -21855,7 +21909,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Latest Message" + "value" : "Dernier message" } }, "it" : { @@ -22415,6 +22469,12 @@ "value" : "Ezin izan da DeepL atzitu!\nZuzena al da API gakoa?" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "DeepL n'est pas joignable ! Est-ce que la clé d'API est correcte ?" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -24114,7 +24174,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "custom" + "value" : "personnalisé" } }, "it" : { @@ -24352,7 +24412,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "infinite" + "value" : "infini" } }, "it" : { @@ -25423,7 +25483,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Masquer sensible" + "value" : "Masquer les éléments sensibles" } }, "it" : { @@ -26824,6 +26884,12 @@ "value" : "Arakatu & Joerak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Explore & tendances" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -27006,7 +27072,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "All" + "value" : "Tout" } }, "it" : { @@ -27244,7 +27310,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "People" + "value" : "Personne" } }, "it" : { @@ -27363,7 +27429,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Posts" + "value" : "Publications" } }, "it" : { @@ -28315,7 +28381,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Étiquettes" + "value" : "Tags" } }, "it" : { @@ -28391,115 +28457,115 @@ "localizations" : { "be" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Трэндавыя спасылкі" } }, "ca" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Enllaços populars" } }, "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Links im Trend" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Trending Links" + "value" : "News" } }, "en-GB" : { "stringUnit" : { "state" : "translated", - "value" : "Trending Links" + "value" : "News" } }, "es" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Enlaces que son tendencia" } }, "eu" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Gori-gorian dauden estekak" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Liens tendance" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Link in tendenza" } }, "ja" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "人気のリンク" } }, "ko" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "뜨고 있는 링크" } }, "nb" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Trendende lenker" } }, "nl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Trending links" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Popularne linki" } }, "pt-BR" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Links em Tendência" } }, "tr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Yükselişteki Bağlantılar" } }, "uk" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Популярні посилання" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "当下流行的网页" } }, "zh-Hant" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "流行連結" } } @@ -28882,6 +28948,12 @@ "value" : "Gogokoak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoris" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -28916,6 +28988,12 @@ "value" : "Denbora-lerro federatua" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chronologie fédérée" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -30049,7 +30127,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Expiry" + "value" : "Expiration" } }, "it" : { @@ -30168,7 +30246,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Date/Time" + "value" : "Date / Heure" } }, "it" : { @@ -30287,7 +30365,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Duration" + "value" : "Durée" } }, "it" : { @@ -30763,7 +30841,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Expired" + "value" : "Expiré" } }, "it" : { @@ -30882,7 +30960,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Expiry: %@" + "value" : "Expiration : %@" } }, "it" : { @@ -31212,6 +31290,12 @@ "value" : "Jarraitutako traolak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tags suivis" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -31246,6 +31330,12 @@ "value" : "Jarraitzaileak bakarrik" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abonnés uniquement" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -31280,6 +31370,12 @@ "value" : "Hasierako denbora-lerroa" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chronologie personnelle" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -31314,6 +31410,12 @@ "value" : "Irudia" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Image" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -31348,6 +31450,12 @@ "value" : "Mastodonen argitaratzeko irudia" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Image à publier sur Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -31383,6 +31491,12 @@ "value" : "Instantzia" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Instance" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -32953,6 +33067,12 @@ "value" : "Hala ere zure intantziako itzulpen zerbituzaren ordezko gisa erabili daiteke." } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il peut cependant toujours être utilisé comme solution de secours pour le service de traduction de votre instance." + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -32982,6 +33102,12 @@ "value" : "Gakoa" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clé" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -33044,7 +33170,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Hide these posts from home" + "value" : "Masquer ces messages depuis chez vous" } }, "it" : { @@ -33163,7 +33289,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Show replies to" + "value" : "Affiche les réponses à" } }, "it" : { @@ -33282,7 +33408,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Title" + "value" : "Titre" } }, "it" : { @@ -33401,7 +33527,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Any followed user" + "value" : "Tout utilisateur suivi" } }, "it" : { @@ -33520,7 +33646,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Members of the list" + "value" : "Membres de la lsite" } }, "it" : { @@ -33639,7 +33765,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "No one" + "value" : "Personne" } }, "it" : { @@ -33730,6 +33856,12 @@ "value" : "Zerrendak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Listes" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -33793,7 +33925,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter/Supprimer %@" + "value" : "Ajouter / supprimer %@" } }, "it" : { @@ -34150,7 +34282,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "List settings" + "value" : "Réglage de la liste" } }, "it" : { @@ -34388,7 +34520,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Search users" + "value" : "Rechercher des utilisateurs" } }, "it" : { @@ -34717,6 +34849,12 @@ "value" : "Denbora-lerro lokala" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chronologie locale" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -34751,6 +34889,12 @@ "value" : "Aipamenak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mentions" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -35521,8 +35665,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Réglages ..." + "state" : "translated", + "value" : "Réglages..." } }, "it" : { @@ -35613,6 +35757,12 @@ "value" : "Bidalketa berria" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nouvelle publication" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -35647,6 +35797,12 @@ "value" : "Jakinarazpenak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notifications" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -36049,8 +36205,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "New accounts" + "state" : "translated", + "value" : "Nouveaux comptes" } }, "it" : { @@ -36168,8 +36324,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "People not following you" + "state" : "translated", + "value" : "Personnes ne vous suivant pas" } }, "it" : { @@ -36287,8 +36443,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "People you don't follow" + "state" : "translated", + "value" : "Personnes que vous ne suivez pas" } }, "it" : { @@ -36406,8 +36562,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Unsolicited private mentions" + "state" : "translated", + "value" : "Mentions privées non sollicitées" } }, "it" : { @@ -36525,8 +36681,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Filtered notifications" + "state" : "translated", + "value" : "Notifications filtrées" } }, "it" : { @@ -36644,8 +36800,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Notifications Filter" + "state" : "translated", + "value" : "Filtre de notifications" } }, "it" : { @@ -36763,8 +36919,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Filter out notifications from…" + "state" : "translated", + "value" : "Filtrer les notifications de…" } }, "it" : { @@ -37563,7 +37719,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "⭐️ Favori: " + "value" : "⭐️ Favori : " } }, "it" : { @@ -38123,7 +38279,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "👋 Vous ont suivi: " + "value" : "👋 Vous ont suivi : " } }, "it" : { @@ -38564,7 +38720,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "📈 Sondage terminé: " + "value" : "📈 Sondage terminé : " } }, "it" : { @@ -38886,7 +39042,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "🚀 Boosté: " + "value" : "🚀 Boosté : " } }, "it" : { @@ -39124,7 +39280,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "🖊️ Publié: " + "value" : "🖊️ Publié : " } }, "it" : { @@ -39362,7 +39518,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Mis à jour: " + "value" : "Mis à jour : " } }, "it" : { @@ -40762,6 +40918,12 @@ "value" : "Ireki Ice Cubes" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ouvrir Ice Cubes" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -40796,6 +40958,12 @@ "value" : "Ireki erlaitz batean" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ouvrir dans un onglet" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -40830,6 +40998,12 @@ "value" : "Ireki aplikazioa erlaitz zehatz batean" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ouvrir l'app sur un onglet spécifique" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41095,6 +41269,12 @@ "value" : "Argitaratu egoera bat" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Publier un statut" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41129,6 +41309,12 @@ "value" : "Argitaratu egoera bat irudi batekin" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Publier un statut avec une image" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41163,6 +41349,12 @@ "value" : "Argitaratu irudi bat Mastodonen" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Publier une image vers Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41197,6 +41389,12 @@ "value" : "Argitaratu edukia" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Publier contenu" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41226,6 +41424,12 @@ "value" : "Argitaratu irudiak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Publier des images" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41255,6 +41459,12 @@ "value" : "Argitaratu egoera Mastodonen" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Publier un status sur Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41289,6 +41499,12 @@ "value" : "Bidalketaren ikusgaitasuna" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visibilité de la publication" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41323,6 +41539,12 @@ "value" : "Pribatua" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Privée" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41357,6 +41579,12 @@ "value" : "Mezu pribatuak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messages privées" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41391,6 +41619,12 @@ "value" : "Profila" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41425,6 +41659,12 @@ "value" : "Publikoa" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Public" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41459,6 +41699,12 @@ "value" : "Zerrendatu gabea" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Public calme" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -41967,6 +42213,12 @@ "value" : "Hautatutako erlaitza" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Onglet sélectionné" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -42001,6 +42253,12 @@ "value" : "Bidali bidalketa bat" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Envoyer une publication" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -42035,6 +42293,12 @@ "value" : "Bidali Mastodonen argitaratzeko testu bat Ice Cubes bidez" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Envoyer une publication textulle à Mastodon avec Ice Cubes" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -42069,6 +42333,12 @@ "value" : "Bidali bidalketa Mastodonera" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Envoyer la publication vers Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -42103,6 +42373,12 @@ "value" : "Ezarpenak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paramètres" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -43347,7 +43623,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Source (lien GitHub)" + "value" : "Code source (lien GitHub)" } }, "it" : { @@ -43583,7 +43859,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Clear Media Cache" + "value" : "Nettoyer le cache de médias" } }, "it" : { @@ -43701,7 +43977,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Collapse long posts" + "value" : "Réduire les messages longs" } }, "it" : { @@ -43819,7 +44095,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Collapsed posts only display a limited number of lines together with a button to show the full post" + "value" : "Les publications réduites n'affichent qu'un nombre limité de lignes ainsi qu'un bouton pour afficher la publication complète" } }, "it" : { @@ -43937,7 +44213,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Reply Visibility" + "value" : "Visibilité de la réponse" } }, "it" : { @@ -45235,7 +45511,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Require Alt Text to Post" + "value" : "Exiger un text alternatif (ALT) pour publier" } }, "it" : { @@ -45353,7 +45629,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Sharing" + "value" : "Partage" } }, "it" : { @@ -45472,7 +45748,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Link and Text" + "value" : "Lien et texte" } }, "it" : { @@ -45591,7 +45867,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Link Only" + "value" : "Lien uniquement" } }, "it" : { @@ -45709,7 +45985,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Share Button Behavior" + "value" : "Comportement du bouton partager" } }, "it" : { @@ -46182,7 +46458,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Apply custom colors" + "value" : "Appliquer des couleurs personnalisées" } }, "it" : { @@ -46656,7 +46932,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Line Spacing: %@" + "value" : "Espacement de ligne : %@" } }, "it" : { @@ -46774,7 +47050,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Mise à l'échelle de la police: %@" + "value" : "Mise à l'échelle de la police : %@" } }, "it" : { @@ -47130,7 +47406,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Max reply indentation: %@" + "value" : "Indentation maximale des réponses : %@" } }, "it" : { @@ -47485,7 +47761,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Show Pending Button on the Left" + "value" : "Afficher le bouton en attente sur la gauche" } }, "it" : { @@ -48650,7 +48926,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les couleurs personnalisées ne peuvent être définies que si le schéma de couleur système est désactivé" + "value" : "Les couleurs personnalisées ne peuvent être définies que si le thème système est désactivé" } }, "it" : { @@ -49004,8 +49280,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Max reply indentation: %@" + "state" : "translated", + "value" : "Afficher l'indentation des réponses" } }, "it" : { @@ -49358,8 +49634,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Secondary status action" + "state" : "translated", + "value" : "Action de statut secondaire" } }, "it" : { @@ -49831,7 +50107,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Correspondre au système" + "value" : "Réglage système" } }, "it" : { @@ -51011,7 +51287,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Retour vibrations" + "value" : "Retours par vibrations" } }, "it" : { @@ -51364,8 +51640,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Recently Used Tags" + "state" : "translated", + "value" : "Tags Récemment Utilisés" } }, "it" : { @@ -51601,8 +51877,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Sidebar Customizations" + "state" : "translated", + "value" : "Personnalisations de la barre latérale" } }, "it" : { @@ -51838,7 +52114,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tabs Customizations" + "value" : "Personnalisation des onglets" } }, "it" : { @@ -51956,7 +52232,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Translation Settings" + "value" : "Paramètres de traduction" } }, "it" : { @@ -52664,7 +52940,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Fast refresh" + "value" : "Rafraîchissement rapide" } }, "it" : { @@ -52782,7 +53058,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Activer 🤖 aide" + "value" : "Activer l'aide 🤖" } }, "it" : { @@ -52899,8 +53175,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Mute Videos" + "state" : "translated", + "value" : "Mettre les vidéos en sourdine" } }, "it" : { @@ -53136,7 +53412,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Enable Sound Effects" + "value" : "Activer les effets sonores" } }, "it" : { @@ -55024,7 +55300,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Version de l'application: %@" + "value" : "Version de l'application : %@" } }, "it" : { @@ -55495,8 +55771,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Fast refresh disables timeline position saving and caching. It'll always fetch a fresh timeline." + "state" : "translated", + "value" : "L’actualisation rapide désactive l’enregistrement et la mise en cache de la position dans la chronologie. Il récupèrera toujours une nouvelle chronologie." } }, "it" : { @@ -55968,7 +56244,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Cela ira loin pour maintenir Ice Cubes en marche !" + "value" : "Cela ira loin pour maintenir Ice Cubes fonctionnel !" } }, "it" : { @@ -56794,7 +57070,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Privacy Policy" + "value" : "Politique de confidentialité" } }, "it" : { @@ -56912,7 +57188,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Restore purchase" + "value" : "Récupérer les achats" } }, "it" : { @@ -57030,7 +57306,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Restore your supporter subscription if it hasn't been synced automatically." + "value" : "Restaurer votre abonnement de supporter s'il n'a pas été synchronisé automatiquement." } }, "it" : { @@ -57148,7 +57424,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : " Thanks for being an Ice Cubes supporter!" + "value" : "Merci d'être un supporter de Ice Cubes supporter !" } }, "it" : { @@ -57266,7 +57542,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "The supporter subscription is a monthly auto renewable subscription giving you a verified badge only visible to you on your profile. Subscription are automatically renewed unless you cancel them a day before the next renewal cycle." + "value" : "L'abonnement supporter est un abonnement mensuel renouvelable automatiquement vous donnant un badge vérifié visible uniquement par vous sur votre profil. Les abonnements sont automatiquement renouvelés, sauf si vous les annulez un jour avant le prochain cycle de renouvellement." } }, "it" : { @@ -57384,7 +57660,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "By giving a monthly tip to Ice Cubes, you become a supporter, you'll even get verified badge on your profile. For your 👀 only." + "value" : "En donnant un pourboire mensuel à Ice Cubes, vous devenez supporter, vous obtiendrez même un badge vérifié sur votre profil. Pour vos 👀 seulement." } }, "it" : { @@ -57502,7 +57778,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : " Become a supporter!" + "value" : "Devenez un supporter !" } }, "it" : { @@ -57620,7 +57896,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Terms" + "value" : "Termes et Conditions" } }, "it" : { @@ -58564,7 +58840,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Primary Action" + "value" : "Action principale" } }, "it" : { @@ -58682,7 +58958,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Secondary Action" + "value" : "Action Secondaire" } }, "it" : { @@ -59632,7 +59908,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les actions de balayage sont disponibles en balayant à gauche ou à droite sur un post. L'action secondaire n'est disponible que si l'action primaire est définie." + "value" : "Les actions de balayage sont disponibles en balayant à gauche ou à droite sur une publication. L'action secondaire n'est disponible que si l'action primaire est définie." } }, "it" : { @@ -60340,7 +60616,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Fifth Tab" + "value" : "Cinquième onglet" } }, "it" : { @@ -60458,7 +60734,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "First Tab" + "value" : "Premier onglet" } }, "it" : { @@ -60576,7 +60852,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Fourth Tab" + "value" : "Quatrième onglet" } }, "it" : { @@ -60694,7 +60970,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Second Tab" + "value" : "Deuxième onglet" } }, "it" : { @@ -60812,7 +61088,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Third Tab" + "value" : "Troisième onglet" } }, "it" : { @@ -61166,7 +61442,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Type of the Key" + "value" : "Type de Clé" } }, "it" : { @@ -61284,7 +61560,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Auto detect language" + "value" : "Détection automatique de la langue" } }, "it" : { @@ -61402,7 +61678,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ice Cubes will try to automatically detect the language of the post you're about to post and will suggest to update your post language if necessary." + "value" : "Ice Cubes tentera de détecter automatiquement la langue du message que vous êtes sur le point de publier et vous proposera de mettre à jour la langue de votre message si nécessaire." } }, "it" : { @@ -61520,7 +61796,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Translation" + "value" : "Traduction" } }, "it" : { @@ -61637,8 +61913,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "This feature requires a DeepL API key" + "state" : "translated", + "value" : "Cette fonctionnalité requiert une clé API DeepL" } }, "it" : { @@ -61756,7 +62032,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "DeepL API Key" + "value" : "Clé API DeepL" } }, "it" : { @@ -62113,7 +62389,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Boost to Followers" + "value" : "Booster pour les abonnés" } }, "it" : { @@ -62589,7 +62865,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Êtes vous sûr de vouloir supprimer ce message ?" + "value" : "Êtes-vous sûr de vouloir supprimer ce message ?" } }, "it" : { @@ -64851,7 +65127,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Translated from %@ using %@" + "value" : "Traduit depuis %@ avec %@" } }, "it" : { @@ -65565,7 +65841,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Copy this link" + "value" : "Copier ce lien" } }, "it" : { @@ -65684,7 +65960,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Share this link" + "value" : "Partager ce lien" } }, "it" : { @@ -66041,7 +66317,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Add #Tags in place" + "value" : "Ajoute des #Tags" } }, "it" : { @@ -66517,7 +66793,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Add #Tags after my text" + "value" : "Ajouter les #tags après mon texte" } }, "it" : { @@ -66636,7 +66912,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Browse Files" + "value" : "Parcourir les Fichiers" } }, "it" : { @@ -66755,7 +67031,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Take Photo" + "value" : "Prendre une Photo" } }, "it" : { @@ -67468,8 +67744,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Type your follow-up content here." + "state" : "translated", + "value" : "Écrivez votre contenu ici" } }, "it" : { @@ -68897,7 +69173,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Photos Library" + "value" : "Bibliothèque de photos" } }, "it" : { @@ -69134,8 +69410,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Texte spoilé" + "state" : "translated", + "value" : "Avertissement sur le contenu" } }, "it" : { @@ -69730,7 +70006,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Your settings require alt text on all media before posting" + "value" : "Vos paramètres nécessitent un texte alternatif sur tous les médias avant de publier" } }, "it" : { @@ -69849,7 +70125,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Error while posting" + "value" : "Erreur pendant la publication" } }, "it" : { @@ -71633,8 +71909,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Hide Results" + "state" : "translated", + "value" : "Cacher les résultats" } }, "it" : { @@ -71839,8 +72115,8 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%lld votes" + "state" : "translated", + "value" : "%lld vote" } }, "other" : { @@ -73264,8 +73540,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Show Results" + "state" : "translated", + "value" : "Afficher les résultats" } }, "it" : { @@ -73979,7 +74255,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Show full post" + "value" : "Afficher toute la publication" } }, "it" : { @@ -74455,7 +74731,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Edit History" + "value" : "Éditer l'historique" } }, "it" : { @@ -74779,8 +75055,8 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%lld boosts" + "state" : "translated", + "value" : "%lld boost" } }, "other" : { @@ -75132,7 +75408,7 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%lld favoris" } }, @@ -75485,14 +75761,14 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%lld replies" + "state" : "translated", + "value" : "%lld réponse" } }, "other" : { "stringUnit" : { "state" : "translated", - "value" : "%lld replies" + "value" : "%lld réponses" } } } @@ -76194,6 +76470,12 @@ "value" : "Erlaitza" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Onglet" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -77081,8 +77363,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Profile (%@)" + "state" : "translated", + "value" : "Profil (%@)" } }, "it" : { @@ -77555,7 +77837,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Add or remove tag from tag groups" + "value" : "Ajouter ou supprimer un tag d'un groupe de tags" } }, "it" : { @@ -77760,8 +78042,8 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%lld mentions" + "state" : "translated", + "value" : "%lld mention" } }, "other" : { @@ -78000,6 +78282,12 @@ "value" : "DeepL API gakoa gordeta dago oraindik ere!" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La clé API DeepL est déjà stockée !" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -78035,6 +78323,12 @@ "value" : "Ezin izan da zure instantziako itzulpen zerbitzua atzitu!" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le Service de Traduction de votre instance n'est pas joignable !" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -78910,8 +79204,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Content Filter" + "state" : "translated", + "value" : "Filtre de contenu" } }, "it" : { @@ -79267,7 +79561,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Add tag group" + "value" : "Ajouter un groupe de tags" } }, "it" : { @@ -79385,7 +79679,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Edit tag group" + "value" : "Éditer le groupe de tags" } }, "it" : { @@ -79739,8 +80033,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Show Boosts" + "state" : "translated", + "value" : "Afficher les boosts" } }, "it" : { @@ -79858,8 +80152,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Show Quotes" + "state" : "translated", + "value" : "Afficher les citations" } }, "it" : { @@ -79977,8 +80271,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Show Replies" + "state" : "translated", + "value" : "Afficher les Réponses" } }, "it" : { @@ -80096,8 +80390,8 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Show Threads" + "state" : "translated", + "value" : "Afficher Threads" } }, "it" : { @@ -80215,7 +80509,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tag Groups" + "value" : "Groupes de tags" } }, "it" : { @@ -81124,7 +81418,7 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%#@arg1@ publications récentes de %#@arg2@ participants" }, "substitutions" : { @@ -81135,14 +81429,14 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%arg" + "state" : "translated", + "value" : "%arg publication récente" } }, "other" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%arg" + "state" : "translated", + "value" : "%arg publications récentes" } } } @@ -81155,14 +81449,14 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%arg" + "state" : "translated", + "value" : "%arg participant" } }, "other" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%arg" + "state" : "translated", + "value" : "%arg participants" } } } @@ -81938,6 +82232,12 @@ "value" : "TimelineFilter" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filtre de chronologie" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -81973,6 +82273,12 @@ "value" : "Itzulpen zerbitzua" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Service de traduction" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -82007,6 +82313,12 @@ "value" : "Gori-gorian dauden estekak" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Liens tendances" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -82041,6 +82353,12 @@ "value" : "Joeren denbora-lerroa" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chronologie des tendances" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -82069,7 +82387,7 @@ }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld people talking" } } @@ -82099,13 +82417,13 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld Person redet" } }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld Personen reden" } } @@ -82118,13 +82436,13 @@ "one" : { "stringUnit" : { "state" : "translated", - "value" : "%lld person talking" + "value" : "%lld post" } }, "other" : { "stringUnit" : { "state" : "translated", - "value" : "%lld people talking" + "value" : "%lld posts" } } } @@ -82136,13 +82454,13 @@ "one" : { "stringUnit" : { "state" : "translated", - "value" : "%lld people talking" + "value" : "%lld post" } }, "other" : { "stringUnit" : { "state" : "translated", - "value" : "%lld people talking" + "value" : "%lld posts" } } } @@ -82153,13 +82471,13 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld persona hablando" } }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld personas hablando" } } @@ -82171,13 +82489,13 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Pertsona batek hizpide" } }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld pertsonak hizpide" } } @@ -82190,13 +82508,13 @@ "one" : { "stringUnit" : { "state" : "needs_review", - "value" : "%lld people talking" + "value" : "%lld personne parle" } }, "other" : { "stringUnit" : { "state" : "needs_review", - "value" : "%lld people talking" + "value" : "%lld personnes parlent" } } } @@ -82207,13 +82525,13 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld persona ne parla" } }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld persone ne parlano" } } @@ -82297,25 +82615,25 @@ "plural" : { "few" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld osoby rozmawiają" } }, "many" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld osób rozmawia" } }, "one" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld osoba rozmawia" } }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld osób rozmawia" } } @@ -82345,13 +82663,13 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld kişi konuşuyor" } }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld kişi konuşuyor" } } @@ -82381,13 +82699,13 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld 人正在参与讨论" } }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld 人正在参与讨论" } } @@ -82399,13 +82717,13 @@ "plural" : { "one" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld 人議論中" } }, "other" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%lld 人議論中" } } @@ -82434,6 +82752,12 @@ "value" : "Erabili Ice Cubes Mastodonerako bidalketa bat idazteko" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utiliser Ice Cubes pour composer une publication pour Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -82468,6 +82792,12 @@ "value" : "Erabili Ice Cubes irudi bat duen Mastodonerako bidalketa bat idazteko" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utiliser Ice Cubes pour composer une publication avec une image sur Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -82497,6 +82827,12 @@ "value" : "Erabili Ice Cubes Mastodonen egoera bat argitaratzeko" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilisez Ice Cubes pour publier un statut sur Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -82526,6 +82862,12 @@ "value" : "Erabili Ice Cubes irudi bat duen Mastodonerako bidalketa bat argitaratzeko" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utiliser Ice Cubes pour publier un statut avec une image sur Mastodon" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -82560,6 +82902,12 @@ "value" : "Ikusgaitasuna" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visibilité" + } + }, "tr" : { "stringUnit" : { "state" : "translated", @@ -82594,6 +82942,12 @@ "value" : "Zure bidalketaren ikusgaitasuna" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visibilité de votre publication" + } + }, "tr" : { "stringUnit" : { "state" : "translated", diff --git a/Packages/Env/Sources/Env/CurrentInstance.swift b/Packages/Env/Sources/Env/CurrentInstance.swift index df80cc14..69e41bb5 100644 --- a/Packages/Env/Sources/Env/CurrentInstance.swift +++ b/Packages/Env/Sources/Env/CurrentInstance.swift @@ -38,6 +38,10 @@ import Observation public var isNotificationsFilterSupported: Bool { version >= 4.3 } + + public var isLinkTimelineSupported: Bool { + version >= 4.3 + } private init() {} diff --git a/Packages/Env/Sources/Env/Router.swift b/Packages/Env/Sources/Env/Router.swift index 6827d295..065fba9e 100644 --- a/Packages/Env/Sources/Env/Router.swift +++ b/Packages/Env/Sources/Env/Router.swift @@ -21,6 +21,7 @@ public enum RouterDestination: Hashable { case rebloggedBy(id: String) case accountsList(accounts: [Account]) case trendingTimeline + case linkTimeline(url: URL, title: String) case trendingLinks(cards: [Card]) case tagsList(tags: [Tag]) case notificationsRequests diff --git a/Packages/Models/Sources/Models/Card.swift b/Packages/Models/Sources/Models/Card.swift index 3eb1d84b..9dd6f555 100644 --- a/Packages/Models/Sources/Models/Card.swift +++ b/Packages/Models/Sources/Models/Card.swift @@ -4,15 +4,27 @@ public struct Card: Codable, Identifiable, Equatable, Hashable { public var id: String { url } + + public struct CardAuthor: Codable, Sendable, Identifiable, Equatable, Hashable { + public var id: String { + url + } + public let name: String + public let url: String + public let account: Account? + } public let url: String public let title: String? + public let authorName: String? public let description: String? + public let providerName: String? public let type: String public let image: URL? public let width: CGFloat public let height: CGFloat public let history: [History]? + public let authors: [CardAuthor]? } extension Card: Sendable {} diff --git a/Packages/Network/Sources/Network/Endpoint/Timelines.swift b/Packages/Network/Sources/Network/Endpoint/Timelines.swift index ab1a2309..2749b827 100644 --- a/Packages/Network/Sources/Network/Endpoint/Timelines.swift +++ b/Packages/Network/Sources/Network/Endpoint/Timelines.swift @@ -5,6 +5,7 @@ public enum Timelines: Endpoint { case home(sinceId: String?, maxId: String?, minId: String?) case list(listId: String, sinceId: String?, maxId: String?, minId: String?) case hashtag(tag: String, additional: [String]?, maxId: String?, minId: String?) + case link(url: URL, sinceId: String?, maxId: String?, minId: String?) public func path() -> String { switch self { @@ -16,6 +17,8 @@ public enum Timelines: Endpoint { "timelines/list/\(listId)" case let .hashtag(tag, _, _, _): "timelines/tag/\(tag)" + case .link: + "timelines/link" } } @@ -34,6 +37,10 @@ public enum Timelines: Endpoint { params.append(contentsOf: (additional ?? []) .map { URLQueryItem(name: "any[]", value: $0) }) return params + case let .link(url, sinceId, maxId, minId): + var params = makePaginationParam(sinceId: sinceId, maxId: maxId, mindId: minId) ?? [] + params.append(.init(name: "url", value: url.absoluteString)) + return params } } } diff --git a/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowCardView.swift b/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowCardView.swift index d9ff53ac..5c83a1fd 100644 --- a/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowCardView.swift +++ b/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowCardView.swift @@ -14,6 +14,7 @@ public struct StatusRowCardView: View { @Environment(Theme.self) private var theme @Environment(RouterPath.self) private var routerPath + @Environment(CurrentInstance.self) private var currentInstance let card: Card @@ -122,6 +123,9 @@ public struct StatusRowCardView: View { .font(.scaledFootnote) .foregroundColor(theme.tintColor) .lineLimit(1) + if let account = card.authors?.first?.account { + moreFromAccountView(account) + } } .frame(maxWidth: .infinity, alignment: .leading) .padding(10) @@ -149,18 +153,39 @@ public struct StatusRowCardView: View { .frame(width: imageHeight, height: imageHeight) } VStack(alignment: .leading, spacing: 6) { - Text(title) - .font(.scaledHeadline) - .lineLimit(3) - Text(url.host() ?? url.absoluteString) + Text(card.providerName ?? url.host() ?? url.absoluteString) .font(.scaledFootnote) .foregroundColor(theme.tintColor) .lineLimit(1) + Text(title) + .font(.scaledHeadline) + .lineLimit(3) + if let account = card.authors?.first?.account { + moreFromAccountView(account, divider: false) + } else if let authorName = card.authorName, !authorName.isEmpty { + Text("by \(authorName)") + .font(.scaledFootnote) + .foregroundStyle(.secondary) + .lineLimit(1) + } if let history = card.history { let uses = history.compactMap { Int($0.accounts) }.reduce(0, +) HStack(spacing: 4) { - Image(systemName: "bubble.left.and.text.bubble.right") - Text("trending-tag-people-talking \(uses)") + Button { + if currentInstance.isLinkTimelineSupported { + routerPath.navigate(to: .linkTimeline(url: url, title: title)) + } + } label: { + HStack(spacing: 4) { + Image(systemName: "bubble.left.and.text.bubble.right") + Text("trending-tag-people-talking \(uses)") + if currentInstance.isLinkTimelineSupported { + Image(systemName: "chevron.right") + } + } + } + .buttonStyle(.bordered) + Spacer() Button { #if targetEnvironment(macCatalyst) @@ -170,11 +195,11 @@ public struct StatusRowCardView: View { #endif } label: { Image(systemName: "quote.opening") + .foregroundStyle(.secondary) } .buttonStyle(.plain) } .font(.scaledCaption) - .foregroundStyle(.secondary) .lineLimit(1) .padding(.top, 12) } @@ -222,6 +247,37 @@ public struct StatusRowCardView: View { }.padding(16) } } + + @ViewBuilder + private func moreFromAccountView(_ account: Account, divider: Bool = true) -> some View { + if divider { + Divider() + } + Button { + routerPath.navigate(to: .accountDetailWithAccount(account: account)) + } label: { + HStack(alignment: .center, spacing: 8) { + AvatarView(account.avatar, config: .list) + .padding(.top, 2) + + HStack(alignment: .firstTextBaseline, spacing: 0) { + Text("More from ") + EmojiTextApp(account.cachedDisplayName, emojis: account.emojis) + .fontWeight(.semibold) + .emojiText.size(Font.scaledFootnoteFont.emojiSize) + .emojiText.baselineOffset(Font.scaledFootnoteFont.emojiBaselineOffset) + } + .font(.scaledFootnote) + .lineLimit(1) + .padding(.top, 3) + + Spacer() + Image(systemName: "chevron.right") + } + .padding(.vertical, 4) + } + .buttonStyle(.plain) + } } struct DefaultPreviewImage: View { diff --git a/Packages/Timeline/Sources/Timeline/TimelineFilter.swift b/Packages/Timeline/Sources/Timeline/TimelineFilter.swift index 2c7fe901..2fa739e6 100644 --- a/Packages/Timeline/Sources/Timeline/TimelineFilter.swift +++ b/Packages/Timeline/Sources/Timeline/TimelineFilter.swift @@ -35,6 +35,7 @@ public enum TimelineFilter: Hashable, Equatable, Identifiable, Sendable { case tagGroup(title: String, tags: [String], symbolName: String?) case list(list: Models.List) case remoteLocal(server: String, filter: RemoteTimelineFilter) + case link(url: URL, title: String) case latest case resume @@ -46,6 +47,8 @@ public enum TimelineFilter: Hashable, Equatable, Identifiable, Sendable { return list.id case let .tagGroup(title, tags, _): return title + tags.joined() + case let .link(url, _): + return url.absoluteString default: return title } @@ -87,6 +90,8 @@ public enum TimelineFilter: Hashable, Equatable, Identifiable, Sendable { "Trending" case .home: "Home" + case let .link(_, title): + title case let .hashtag(tag, _): "#\(tag)" case let .tagGroup(title, _, _): @@ -112,6 +117,8 @@ public enum TimelineFilter: Hashable, Equatable, Identifiable, Sendable { "timeline.trending" case .home: "timeline.home" + case let .link(_, title): + LocalizedStringKey(title) case let .hashtag(tag, _): "#\(tag)" case let .tagGroup(title, _, _): @@ -145,6 +152,8 @@ public enum TimelineFilter: Hashable, Equatable, Identifiable, Sendable { symbolName ?? "tag" case .hashtag: "number" + case .link: + "link" } } @@ -165,6 +174,7 @@ public enum TimelineFilter: Hashable, Equatable, Identifiable, Sendable { case .resume: return Timelines.home(sinceId: nil, maxId: nil, minId: nil) case .home: return Timelines.home(sinceId: sinceId, maxId: maxId, minId: minId) case .trending: return Trends.statuses(offset: offset) + case let .link(url, _): return Timelines.link(url: url, sinceId: sinceId, maxId: maxId, minId: minId) case let .list(list): return Timelines.list(listId: list.id, sinceId: sinceId, maxId: maxId, minId: minId) case let .hashtag(tag, accountId): if let accountId { @@ -202,6 +212,7 @@ extension TimelineFilter: Codable { case remoteLocal case latest case resume + case link } public init(from decoder: Decoder) throws { @@ -250,6 +261,11 @@ extension TimelineFilter: Codable { ) case .latest: self = .latest + case .link: + var nestedContainer = try container.nestedUnkeyedContainer(forKey: .link) + let url = try nestedContainer.decode(URL.self) + let title = try nestedContainer.decode(String.self) + self = .link(url: url, title: title) default: throw DecodingError.dataCorrupted( DecodingError.Context( @@ -290,6 +306,10 @@ extension TimelineFilter: Codable { try container.encode(CodingKeys.latest.rawValue, forKey: .latest) case .resume: try container.encode(CodingKeys.resume.rawValue, forKey: .latest) + case let .link(url, title): + var nestedContainer = container.nestedUnkeyedContainer(forKey: .link) + try nestedContainer.encode(url) + try nestedContainer.encode(title) } } }