diff --git a/app/Data/Articles/FeaturedCollectionData.php b/app/Data/Articles/FeaturedCollectionData.php index 649e05e61..087485b1b 100644 --- a/app/Data/Articles/FeaturedCollectionData.php +++ b/app/Data/Articles/FeaturedCollectionData.php @@ -24,7 +24,7 @@ public static function fromModel(Collection $collection): self { return new self( name: $collection->name, - image: $collection->image + image: $collection->image(), ); } } diff --git a/app/Http/Controllers/ArticleController.php b/app/Http/Controllers/ArticleController.php index 357a91951..cf8b64bbe 100644 --- a/app/Http/Controllers/ArticleController.php +++ b/app/Http/Controllers/ArticleController.php @@ -42,4 +42,19 @@ public function index(Request $request): Response|JsonResponse 'title' => trans('metatags.articles.title'), ]); } + + public function show(Article $article): Response + { + if ($article->isNotPublished()) { + abort(404); + } + + return Inertia::render('Articles/Show', [ + 'article' => ArticleData::fromModel($article), + ])->withViewData([ + 'title' => trans('metatags.articles.view.title', ['title' => $article->title]), + 'description' => $article->metaDescription(), + 'image' => $article->getMedia()->first()->getUrl(), + ]); + } } diff --git a/app/Models/Article.php b/app/Models/Article.php index c8127a5c6..08cd377c9 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -13,6 +13,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Str; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\Sluggable\HasSlug; @@ -68,6 +69,16 @@ public function scopeSortById(Builder $query): Builder return $query->orderBy('articles.id', 'desc'); } + public function metaDescription(): string + { + return $this->meta_description ?? Str::limit(strip_tags($this->content), 157); + } + + public function isNotPublished(): bool + { + return $this->published_at === null || $this->published_at->isFuture(); + } + public function getSlugOptions(): SlugOptions { return SlugOptions::create() diff --git a/lang/en/metatags.php b/lang/en/metatags.php index 7b72a8ab6..9c3ee2872 100644 --- a/lang/en/metatags.php +++ b/lang/en/metatags.php @@ -76,6 +76,9 @@ 'articles' => [ 'title' => 'Articles | Dashbrd', + 'view' => [ + 'title' => ':title | Dashbrd', + ], ], 'login' => [ diff --git a/resources/js/Components/Articles/ArticleCard/ArticleCard.tsx b/resources/js/Components/Articles/ArticleCard/ArticleCard.tsx index 08cd05c9d..09ad45770 100644 --- a/resources/js/Components/Articles/ArticleCard/ArticleCard.tsx +++ b/resources/js/Components/Articles/ArticleCard/ArticleCard.tsx @@ -23,7 +23,7 @@ export const ArticleCard = ({ return (
diff --git a/resources/js/I18n/Locales/en.json b/resources/js/I18n/Locales/en.json index d623b0350..c96ab394c 100644 --- a/resources/js/I18n/Locales/en.json +++ b/resources/js/I18n/Locales/en.json @@ -1 +1 @@ -{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.market_cap":"Market Cap","common.volume":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.sort":"Sort","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by Galleries","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery successfully deleted","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} \ No newline at end of file +{"auth.welcome":"Welcome to Dashbrd","auth.logged_in":"You're logged in!","auth.log_out":"Log out","auth.failed":"These credentials do not match our records.","auth.session_timeout":"Your session has timed out. Please refresh the page and try connecting your account again.","auth.password":"The provided password is incorrect.","auth.throttle":"Too many login attempts. Please try again in {{seconds}} seconds.","auth.wallet.connecting":"Connecting …","auth.wallet.waiting_for_signature":"Waiting for Signature …","auth.wallet.switching_wallet":"Switching Wallet …","auth.wallet.connect":"Connect Wallet","auth.wallet.connect_long":"Connect Your Wallet to Get Started","auth.wallet.sign_subtitle":"Connect Your Wallet to Continue","auth.wallet.disconnect":"Disconnect Wallet","auth.wallet.install":"Install MetaMask","auth.wallet.install_long":"Install MetaMask to Get Started","auth.wallet.sign":"Sign Message","auth.wallet.sign_message":"Welcome to Dashbrd. In order to login, sign this message with your wallet. It doesn't cost you anything!\n\nSigning ID (you can ignore this): {{nonce}}","auth.wallet.connect_subtitle":"Click on the MetaMask icon in your browser to confirm the action and connect your wallet.","auth.wallet.requires_signature":"In order to prevent impersonation, we require a signature to perform this action. This signature is only a signed message and does not give any access to your wallet.","auth.errors.metamask.no_account":"No account found. Please connect your wallet and try again.","auth.errors.metamask.generic":"Connection attempt error. Please retry and follow the steps to connect your wallet.","auth.errors.metamask.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","auth.errors.metamask.provider_missing":"You don't have MetaMask installed in your browser. Please install and try again.","auth.errors.metamask.user_rejected":"It looks like you cancelled signing of the authentication message. Please try again.","auth.errors.metamask.provider_not_set":"Ethereum provider is not set","auth.validation.wallet_login_failed":"There was a problem trying to verify your signature. Please try again.","auth.validation.invalid_address":"Your wallet address is invalid. Please try again.","auth.validation.invalid_signature":"Signature is invalid. Please try again.","auth.validation.invalid_network":"Please switch to Polygon or Ethereum Mainnet in your MetaMask plugin to connect to Dashbrd.","common.add":"Add","common.amount":"Amount","common.balance":"Balance","common.cancel":"Cancel","common.delete":"Delete","common.edit":"Edit","common.confirm":"Confirm","common.connect":"Connect","common.continue":"Continue","common.done":"Done","common.filter":"Filter","common.items":"Items","common.receive":"Receive","common.received":"Received","common.retry":"Retry","common.records":"Records","common.save":"Save","common.send":"Send","common.sent":"Sent","common.show":"Show","common.searching":"Searching...","common.other":"Other","common.owned":"Owned","common.token":"Token","common.tokens":"Tokens","common.wallet":"Wallet","common.pending":"Pending","common.publish":"Publish","common.empty":"Empty","common.your_address":"Your Address","common.warning":"Warning","common.my_address":"My Address","common.my_wallet":"My Wallet","common.my_balance":"My Balance","common.na":"N/A","common.simple_plural_without_data":"One comment|Many comments","common.simple_plural_with_data":"{{count}} comment|{{count}} comments","common.advanced_plural_without_data":"{0} no comments yet|{1} 1 comment|[2,*] Many comments","common.advanced_plural_with_data":"{0} no comments yet|{1} 1 comment|[2,*] {{count}} comments","common.copy_clipboard":"Copy to Clipboard","common.copy":"Copy","common.download":"Download","common.zoom":"Zoom","common.my_collection":"My Collection","common.max":"Max","common.chain":"Chain","common.copied":"Copied!","common.coming_soon":"Coming Soon","common.more_details":"More Details","common.close":"Close","common.close_toast":"Close toast","common.loading":"Loading","common.price":"Price","common.market_cap":"Market Cap","common.volume":"Volume {{frequency}}","common.value":"Value","common.last_n_days":"Last {{count}} Days","common.details":"Details","common.view_all":"View All","common.view_more_on_polygonscan":"View More on Polygonscan","common.view_more_on_etherscan":"View More on Etherscan","common.view_nft_on_etherscan":"View NFT on Etherscan","common.view_nft_on_polygonscan":"View NFT on Polygonscan","common.view_nft_on_goerli_tesnet":"View NFT on Goerli Testnet Explorer","common.view_nft_on_mumbai_tesnet":"View NFT on Mumbai Testnet Explorer","common.polygonscan":"Polygonscan","common.etherscan":"Etherscan","common.featured":"Featured","common.floor_price":"Floor Price","common.floor":"Floor","common.supply":"Supply","common.owners":"Owners","common.created":"Created","common.nft":"NFT","common.collection":"Collection","common.collections":"Collections","common.gallery":"Gallery","common.basic_gallery":"Basic Gallery","common.gallery_name":"Gallery Name","common.create_gallery":"Create Gallery","common.external_link":"External Link","common.follow_link":"Follow Link","common.cover":"Cover","common.template":"Template","common.page":"Page","common.polygon":"Polygon","common.ethereum":"Ethereum","common.mumbai":"Mumbai","common.goerli":"Goerli","common.of":"of","common.pagination_input_placeholder":"Enter the page number","common.pagination_input_placeholder_mobile":"Page number","common.nft_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","common.nft_gallery":"NFT Gallery","common.unable_to_retrieve_image":"Unable to retrieve your NFT image at this time","common.optional":"Optional","common.selected":"Selected","common.select":"Select","common.preview":"Preview","common.image_size_error":"Image size must not exceed 2MB","common.image_dimensions_error":"Image dimensions must exceed 287px x 190px","common.write_to_confirm":"Write {{word}} to confirm","common.n_hours":"{0} {{count}} hour|{1} {{count}} hour|[2,*] {{count}} hours","common.n_minutes":"{0} {{count}} minute|{1} {{count}} minute|[2,*] {{count}} minutes","common.report":"Report","common.n_nfts":"{0}NFTs|{1}NFT|[2,*]NFTs","common.n_collections":"{0}collections|{1}collection|[2,*]collections","common.back":"Back","common.back_to":"Back to","common.name":"Name","common.type":"Type","common.from":"From","common.to":"To","common.sale_price":"Sale Price","common.recent_activity":"Recent Activity","common.time":"Time","common.datetime.few_seconds_ago":"A few seconds ago","common.datetime.minutes_ago":"{0} Less than a minute ago|{1} A minute ago|[2,*] {{count}} minutes ago","common.datetime.hours_ago":"{0} Less than an hour ago|{1} An hour ago|[2,*] {{count}} hours ago","common.datetime.days_ago":"{0} Less than a day ago|{1} A day ago|[2,*] {{count}} days ago","common.datetime.weeks_ago":"{0} Less than a week ago|{1} A week ago|[2,*] {{count}} weeks ago","common.datetime.months_ago":"{0} Less than a month ago|{1} A month ago|[2,*] {{count}} months ago","common.datetime.years_ago":"{0} Less than a year ago|{1} A year ago|[2,*] {{count}} years ago","common.no_traits_found":"No traits found.","common.empty_transactions":"You don't have any transactions yet. Once transactions have been made, they will show up here.","common.error":"Error","common.refresh_metadata":"Refresh Metadata","common.refreshing_metadata":"Refreshing Metadata... Please check back later.","common.pending_confirmation":"Pending Confirmation","common.confirmed_transaction":"Confirmed Transaction","common.transaction_error":"Transaction Error","common.transaction_error_description_first_part":"Your transaction encountered an error. View this transaction on","common.transaction_error_description_second_part":"for more details.","common.home":"Home","common.contact":"Contact","common.menu":"Menu","common.website":"Website","common.twitter":"Twitter","common.discord":"Discord","common.sort":"Sort","footer.copyright":"{{year}} © Dashbrd. All rights reserved.","footer.all_rights_reserved":"All rights reserved","footer.privacy_policy":"Privacy Policy","footer.terms_of_service":"Terms of Service","footer.powered_by":"Powered by","format.fiat":"{{ value, currency }}","format.number":"{{ value, number }}","metatags.home.title":"Dashbrd | Web3 Portfolio Management Made Simple","metatags.home.description":"Simplify your Web3 journey with Dashbrd. Manage your portfolio of tokens, NFTs, and other digital collectibles across the Ethereum and Polygon blockchains.","metatags.home.image":"/images/meta/home.png","metatags.error.title":"Error {{code}} | Dashbrd","metatags.wallet.title":"My Wallet | Dashbrd","metatags.galleries.title":"Top NFT Galleries | Dashbrd","metatags.galleries.image":"/images/meta/nft-galleries.png","metatags.galleries.description":"Explore user published NFT galleries to find custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.most_popular.title":"Most Popular Galleries | Dashbrd","metatags.galleries.most_popular.image":"/images/meta/most-popular-nft-galleries.png","metatags.galleries.most_popular.description":"Explore and discover Most Popular NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.newest.title":"Newest Galleries | Dashbrd","metatags.galleries.newest.image":"/images/meta/newest-nft-galleries.png","metatags.galleries.newest.description":"Explore and discover most recent NFT galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More","metatags.galleries.most_valuable.title":"Most Valuable Galleries | Dashbrd","metatags.galleries.most_valuable.image":"/images/meta/most-valuable-nft-galleries.png","metatags.galleries.most_valuable.description":"Explore and discover Most Valuable NFT Galleries created by our users featuring custom curated PFPs, Digital Collectibles, & More.","metatags.galleries.view.title":"{{name}} | Dashbrd","metatags.galleries.view.description":"{{name}} | A Curated NFT Gallery at Dashbrd","metatags.galleries.view.image":"/images/meta/nft-gallery.png","metatags.my_galleries.title":"My Galleries | Dashbrd","metatags.my_galleries.create.title":"Create Gallery | Dashbrd","metatags.my_galleries.edit.title":"Edit {{name}} | Dashbrd","metatags.collections.title":"Collections | Dashbrd","metatags.collections.view.title":"{{name}} Collection | Dashbrd","metatags.collections.view.description":"Immerse yourself in the intricate details of {{name}} collection, featuring remarkable digital assets. Start your NFT journey today!","metatags.collections.view.image":"/images/meta/nft-collection.png","metatags.nfts.view.title":"{{nft}} NFT | Dashbrd","metatags.nfts.view.description":"Uncover the complete story of {{nft}} NFT from the {{collection}} collection, delving into its unique attributes and distinctive features.","metatags.nfts.view.image":"/images/meta/nft-details.png","metatags.settings.title":"Settings | Dashbrd","metatags.articles.title":"Articles | Dashbrd","metatags.articles.view.title":"{{title}} | Dashbrd","metatags.login.title":"Login | Dashbrd","metatags.privacy_policy.title":"Privacy Policy | Dashbrd","metatags.privacy_policy.description":"Dashbrd’s privacy policy outlines the information we collect and explains your choices surrounding how we use information about you.","metatags.terms_of_service.title":"Terms of Service | Dashbrd","metatags.terms_of_service.description":"These Terms of Service cover your use and access to services, products or websites of Dashbrd.","metatags.cookie_policy.title":"Cookie Policy | Dashbrd","metatags.cookie_policy.description":"Dashbrd uses cookies to make the website more user-friendly. Find out about the main types of cookies we use, and what we use them for.","metatags.welcome.title":"Welcome to Dashbrd | Web3 Simplified","pages.onboarding.title":"Get Started","pages.onboarding.heading":"Your monkeys were bored and ran off, we are trying to round them up.","pages.onboarding.message":"We are setting up your account. This process usually takes just a few minutes, but can take up to 15 minutes.","pages.error.heading":"Oops, something went wrong ...","pages.error.message":"Please try again or get in touch if the issue persists.","pages.maintenance.title":"Dashbrd is currently down for scheduled maintenance.","pages.maintenance.description":"We expect to be back soon. Thanks for your patience.","pages.dashboard.title":"My Wallet","pages.dashboard.breakdown.title":"Portfolio Breakdown","pages.dashboard.line_chart.data_error":"Could not load chart data","pages.articles.title":"Articles","pages.articles.featured_collections":"Featured Collections","pages.articles.placeholder_more_soon":"More Soon","pages.articles.no_articles":"No articles have been published yet. Please check back later!","pages.collections.title":"Collections","pages.collections.collections":"Collections","pages.collections.collection_value":"Collection Value","pages.collections.nfts_owned":"NFTs Owned","pages.collections.header_title":"You own <0>{{nftsCount}} {{nfts}} across <0>{{collectionsCount}} {{collections}}, worth about <0><1>{{worth}}","pages.collections.search_placeholder":"Search by Collection","pages.collections.properties":"Properties","pages.collections.collections_network":"Collections Network","pages.collections.property_search_placeholder":"Feature Search","pages.collections.floor_price":"Floor Price","pages.collections.value":"Value","pages.collections.rarity":"Rarity","pages.collections.report":"Report","pages.collections.hide_collection":"Hide Collection","pages.collections.unhide_collection":"Unhide Collection","pages.collections.no_collections":"You do not own any NFTs yet. Once you do they will be shown here.","pages.collections.all_collections_hidden":"You have hidden all your collections. Unhide and they will appear here.","pages.collections.about_collection":"About Collection","pages.collections.show_hidden":"Show Hidden","pages.collections.show_my_collection":"Show My Collection","pages.collections.owned":"Owned","pages.collections.activities.loading_activities":"We're fetching Activity for this NFT, please hang tight, this can take a while.","pages.collections.activities.no_activity":"This collection does not have any activity yet.","pages.collections.activities.types.LABEL_MINT":"Mint","pages.collections.activities.types.LABEL_TRANSFER":"Transfer","pages.collections.activities.types.LABEL_SALE":"Sale","pages.collections.articles.no_articles":"No articles have been linked to this collection as of now.","pages.collections.articles.no_articles_with_filters":"We could not find any articles matching your search criteria, please try again!","pages.collections.articles.search_placeholder":"Search in Articles","pages.collections.articles.sort_latest":"Latest","pages.collections.articles.sort_popularity":"Most Popular","pages.collections.search.loading_results":"Loading results...","pages.collections.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.collections.search.no_results_with_filters":"We could not find anything matching your filters, please try again!","pages.collections.search.no_results_ownership":"You do not own any NFTs in this collection","pages.collections.search.error":"Could not load search results. Please try again later.","pages.collections.sorting.token_number":"Token Number","pages.collections.sorting.recently_received":"Recently Received","pages.collections.sorting.recently_created":"Recently Created","pages.collections.sorting.oldest_collection":"Oldest Collection","pages.collections.traits.description":"List of NFT traits by % of occurrence in the collection","pages.collections.traits.no_traits":"No Properties can be found for this NFT","pages.collections.menu.collection":"Collection","pages.collections.menu.articles":"Articles","pages.collections.menu.activity":"Activity","pages.collections.hidden_modal.collection_hidden":"Collection Hidden","pages.collections.hidden_modal.description":"This collection is currently set to Hidden. Are you sure you want to unhide this collection? You can\n reset the collection to hidden from the collection menu.","pages.collections.hidden_modal.unhide":"Unhide","pages.collections.hidden_modal.error":"Something went wrong. Please try again.","pages.collections.external_modal.you_wish_continue":"You are about to leave Dashbrd to an external website. Dashbrd has no control over the content of\n this site. Are you sure you wish to continue?","pages.collections.external_modal.not_show":"Do not show this message again.","pages.nfts.nft":"nft","pages.nfts.about_nft":"About NFT","pages.nfts.owned_by":"Owned by","pages.nfts.collection_image":"collection image","pages.nfts.menu.properties":"Properties","pages.nfts.menu.activity":"Activity","pages.reports.title":"Submit a Report","pages.reports.description":"Thanks for looking out by reporting things that break the rules. Let us know what's happening and we'll receive the report.","pages.reports.success":"Thank you for your report. We'll review it and see if it breaks our ToS.","pages.reports.failed":"Something went wrong. Please try again.","pages.reports.throttle":"You have made too many requests. Please wait {{time}} before reporting again.","pages.reports.reported":"You have already reported this {{model}}.","pages.reports.reasons.spam":"Spam","pages.reports.reasons.violence":"Promoting Violence","pages.reports.reasons.hate":"Hate","pages.reports.reasons.inappropriate_content":"Inappropriate Content","pages.reports.reasons.impersonation":"Impersonation","pages.reports.reasons.trademark":"Trademark or Copyright","pages.reports.reasons.selfharm":"Self-Harm","pages.reports.reasons.harassment":"Harassment","pages.galleries.title":"Galleries","pages.galleries.empty_title":"No galleries have been published yet. Once they do they will appear here.","pages.galleries.search.loading_results":"Loading results...","pages.galleries.search.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.search.placeholder":"Search by Galleries","pages.galleries.search.placeholder_nfts":"Search by NFTs","pages.galleries.search.error":"Could not load search results. Please try again later.","pages.galleries.my_galleries.title":"My Galleries","pages.galleries.my_galleries.new_gallery":"New Gallery","pages.galleries.my_galleries.no_galleries":"You have not created any galleries yet. To create a gallery, click on the \"Create Gallery\" button.","pages.galleries.my_galleries.succesfully_deleted":"Gallery successfully deleted","pages.galleries.my_galleries.successfully_created":"Gallery has been successfully created","pages.galleries.my_galleries.successfully_updated":"Gallery has been successfully updated","pages.galleries.my_galleries.new_gallery_no_nfts":"Creating a Gallery requires you to own an NFT.","pages.galleries.copy_gallery_link":"Copy Gallery Link","pages.galleries.my_nfts":"My NFTs","pages.galleries.value":"Value","pages.galleries.floor_price":"Floor Price","pages.galleries.nfts":"NFTs","pages.galleries.collections":"Collections","pages.galleries.galleries_count_simple":"{0} galleries|{1} gallery|[2,*] galleries","pages.galleries.galleries_count":"{0} {{count}} Galleries|{1} {{count}} Gallery|[2,*] {{count}} Galleries","pages.galleries.collections_count_simple":"{0} collections|{1} collection|[2,*] collections","pages.galleries.collections_count":"{0} {{count}} Collections|{1} {{count}} Collection|[2,*] {{count}} Collections","pages.galleries.nfts_count_simple":"{0} NFTs|{1} NFT|[2,*] NFTs","pages.galleries.nfts_count":"{0} {{count}} NFTs|{1} {{count}} NFT|[2,*] {{count}} NFTs","pages.galleries.users_count_simple":"{0} users|{1} user|[2,*] users","pages.galleries.users_count":"{0} {{count}} Users|{1} {{count}} User|[2,*] {{count}} Users","pages.galleries.featuring":"Featuring","pages.galleries.curated_by":"Curated by","pages.galleries.worth_about":"Worth About","pages.galleries.valued_at":"valued at","pages.galleries.from":"From","pages.galleries.most_popular_galleries":"Most Popular Galleries","pages.galleries.newest_galleries":"Newest Galleries","pages.galleries.most_valuable_galleries":"Most Valuable Galleries","pages.galleries.most_popular":"Most Popular","pages.galleries.newest":"Newest","pages.galleries.most_valuable":"Most Valuable","pages.galleries.create.search_by_nfts":"Search by NFTs","pages.galleries.create.input_placeholder":"Enter gallery name","pages.galleries.create.title_too_long":"Gallery name must not exceed {{max}} characters.","pages.galleries.create.already_selected_nft":"NFT already exists in this gallery","pages.galleries.create.gallery_cover":"Gallery Cover","pages.galleries.create.gallery_cover_description":"The cover is used for the card on the gallery list page. While the cover is not a requirement it will allow you to add personality and stand out from the crowd.","pages.galleries.create.gallery_cover_information":"Image dimensions must be at least 287px x 190px, with a max size of 2 MB (JPG, PNG or GIF)","pages.galleries.create.no_results":"We could not find anything matching your search criteria, please try again!","pages.galleries.create.templates.cover":"Cover","pages.galleries.create.templates.template":"Template","pages.galleries.create.templates.select":"Select Gallery Template","pages.galleries.create.templates.basic":"Basic Gallery","pages.galleries.create.templates.coming_soon":"More Coming Soon","pages.galleries.create.load_more_collections_one":"Load {{count}} More Collection","pages.galleries.create.load_more_collections_other":"Load {{count}} More Collections","pages.galleries.create.load_more_nfts":"Load More NFTs","pages.galleries.create.can_purchase":"You can purchase NFTs with these top NFT Marketplaces:","pages.galleries.create.must_own_one_nft":"You must own at least one (1) NFT in order to create a gallery.","pages.galleries.create.back_to_galleries":"Back to Galleries","pages.galleries.delete_modal.title":"Delete Gallery","pages.galleries.delete_modal.confirmation_text":"Are you sure you want to delete the gallery? Everything you've done will be deleted and you won't be able to get it back.","pages.galleries.consists_of_collections":"{0} This gallery consists of {{count}} collections|{1} This gallery consists of {{count}} collection|[2,*] This gallery consists of {{count}} collections","pages.galleries.guest_banner.title":"Craft the ultimate","pages.galleries.guest_banner.subtitle":"Pick your favorites, curate your gallery, & share it with the world.","pages.profile.title":"Profile","pages.token_panel.balance_tooltip":"Total percentage of the portfolio held in this token","pages.token_panel.insufficient_funds":"Insufficient Balance","pages.token_panel.error":"Dashbrd has failed to load token information. Please try again later.","pages.token_panel.failed_to_retrieve_transactions":"We were unable to fetch your transactions.","pages.token_panel.tabs.transaction_history":"Transaction History","pages.token_panel.tabs.history":"History","pages.token_panel.tabs.market_data":"Market Data","pages.token_panel.details.current_price":"Current Price","pages.token_panel.details.title":"Token Details","pages.token_panel.details.market_cap":"Market Cap","pages.token_panel.details.volume":"Daily Volume","pages.token_panel.details.supply":"Minted Supply","pages.token_panel.details.ath":"All-Time High","pages.token_panel.details.atl":"All-Time Low","pages.token_panel.chart.failed":"Dashbrd has failed to load chart information. Please try again later.","pages.transaction_details_panel.title":"Transaction Details","pages.transaction_details_panel.details.blockchain":"Blockchain","pages.transaction_details_panel.details.timestamp":"Timestamp","pages.transaction_details_panel.details.transaction_hash":"Transaction Hash","pages.transaction_details_panel.details.transaction_fee":"Transaction Fee","pages.transaction_details_panel.details.gas_price":"Gas Price","pages.transaction_details_panel.details.gas_used":"Gas Used","pages.transaction_details_panel.details.nonce":"Nonce","pages.send_receive_panel.send.labels.token_and_amount":"Token and Amount","pages.send_receive_panel.send.labels.destination_address":"Destination Address","pages.send_receive_panel.send.labels.projected_fee":"Projected Fee","pages.send_receive_panel.send.placeholders.enter_amount":"Enter Amount","pages.send_receive_panel.send.placeholders.insert_recipient_address":"Insert Recipient Address","pages.send_receive_panel.send.placeholders.projected_fee":"Projected Fee","pages.send_receive_panel.send.errors.amount":"Insufficient Funds: You do not have enough to cover the amount + fee.","pages.send_receive_panel.send.errors.destination":"Destination address is not correct. Check and input again.","pages.send_receive_panel.send.hints.token_price":"Token Price","pages.send_receive_panel.send.fees.Fast":"Fast","pages.send_receive_panel.send.fees.Avg":"Avg","pages.send_receive_panel.send.fees.Slow":"Slow","pages.send_receive_panel.send.search_dropdown.placeholder":"Search token","pages.send_receive_panel.send.search_dropdown.no_results":"No results","pages.send_receive_panel.send.search_dropdown.error":"Error occurred while searching tokens.","pages.send_receive_panel.send.transaction_time":"Transaction Time: ~{{ time }} minutes","pages.send_receive_panel.send.from":"From","pages.send_receive_panel.send.to":"To","pages.send_receive_panel.send.amount":"Amount","pages.send_receive_panel.send.fee":"Fee","pages.send_receive_panel.send.total_amount":"Total Amount","pages.send_receive_panel.send.waiting_message":"Review and verify the information on your MetaMask. Sign to send the transaction.","pages.send_receive_panel.send.waiting_spinner_text":"Waiting for confirmation...","pages.send_receive_panel.send.failed_message":"It looks like something went wrong while sending your transaction. Press 'Retry' to make another attempt.","pages.send_receive_panel.receive.alert":"Send only Polygon or Ethereum Network compatible tokens to this address or you could permanently lose your funds!","pages.settings.title":"Settings","pages.settings.sidebar.general":"General","pages.settings.sidebar.notifications":"Notifications","pages.settings.sidebar.session_history":"Sessions History","pages.settings.general.title":"Settings","pages.settings.general.subtitle":"Customize your App Experience","pages.settings.general.currency":"Currency","pages.settings.general.currency_subtitle":"Select your default currency which will be used throughout the app.","pages.settings.general.time_date":"Time & Date","pages.settings.general.time_date_subtitle":"Select how you want time and date be shown inside app.","pages.settings.general.date_format":"Date Format","pages.settings.general.time_format":"Time Format","pages.settings.general.timezone":"Timezone","pages.settings.general.set_defaults":"Set Defaults","pages.settings.general.set_defaults_content":"Reverting to the default settings will remove any customizations previously made. Are you sure?","pages.settings.general.save":"Save Settings","pages.settings.general.saved":"Your settings have been successfully saved","pages.wallet.title":"Wallet","pages.privacy_policy.title":"Privacy Policy","pages.terms_of_service.title":"Terms of Service","pagination.previous":"« Previous","pagination.next":"Next »","passwords.reset":"Your password has been reset!","passwords.sent":"We have emailed your password reset link!","passwords.throttled":"Please wait before retrying.","passwords.token":"This password reset token is invalid.","passwords.user":"We can't find a user with that email address.","urls.landing":"https://dashbrd.com","urls.cookie_policy":"https://dashbrd.com/cookie-policy","urls.privacy_policy":"https://dashbrd.com/privacy-policy","urls.terms_of_service":"https://dashbrd.com/terms-of-service","urls.twitter":"https://x.com/DashbrdApp","urls.discord":"https://discord.gg/MJyWKkCJ5k","urls.github":"https://github.com/ArdentHQ/dashbrd","urls.coingecko":"https://www.coingecko.com","urls.etherscan":"https://etherscan.io","urls.polygonscan":"https://polygonscan.com","urls.alchemy":"https://www.alchemy.com","urls.moralis":"https://moralis.io","urls.mnemonic":"https://www.mnemonichq.com","urls.opensea":"https://opensea.io/","urls.explorers.etherscan.token_transactions":"https://etherscan.io/token/{{token}}?a={{address}}","urls.explorers.etherscan.addresses":"https://etherscan.io/address/{{address}}","urls.explorers.etherscan.transactions":"https://etherscan.io/tx/{{id}}","urls.explorers.etherscan.nft":"https://etherscan.io/nft/{{address}}/{{nftId}}","urls.explorers.polygonscan.token_transactions":"https://polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.polygonscan.addresses":"https://polygonscan.com/address/{{address}}","urls.explorers.polygonscan.transactions":"https://polygonscan.com/tx/{{id}}","urls.explorers.polygonscan.nft":"https://polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.mumbai.token_transactions":"https://mumbai.polygonscan.com/token/{{token}}?a={{address}}","urls.explorers.mumbai.addresses":"https://mumbai.polygonscan.com/address/{{address}}","urls.explorers.mumbai.transactions":"https://mumbai.polygonscan.com/tx/{{id}}","urls.explorers.mumbai.nft":"https://mumbai.polygonscan.com/nft/{{address}}/{{nftId}}","urls.explorers.goerli.token_transactions":"https://goerli.etherscan.io/token/{{token}}?a={{address}}","urls.explorers.goerli.addresses":"https://goerli.etherscan.io/address/{{address}}","urls.explorers.goerli.transactions":"https://goerli.etherscan.io/tx/{{id}}","urls.explorers.goerli.nft":"https://goerli.etherscan.io/nft/{{address}}/{{nftId}}","urls.marketplaces.opensea.collection":"https://opensea.io/assets/{{network}}/{{address}}","urls.marketplaces.opensea.nft":"https://opensea.io/assets/{{network}}/{{address}}/{{nftId}}","urls.marketplaces.rarible.collection":"https://rarible.com/collection/{{address}}/items","urls.marketplaces.rarible.nft":"https://rarible.com/token/{{address}}:{{nftId}}","urls.marketplaces.blur.collection":"https://blur.io/collection/{{address}}","urls.marketplaces.blur.nft":"https://blur.io/asset/{{address}}/{{nftId}}","urls.marketplaces.looksrare.collection":"https://looksrare.org/collections/{{address}}","urls.marketplaces.looksrare.nft":"https://looksrare.org/collections/{{address}}/{{nftId}}","validation.accepted":"The {{attribute}} must be accepted.","validation.accepted_if":"The {{attribute}} must be accepted when {{other}} is {{value}}.","validation.active_url":"The {{attribute}} is not a valid URL.","validation.after":"The {{attribute}} must be a date after {{date}}.","validation.after_or_equal":"The {{attribute}} must be a date after or equal to {{date}}.","validation.alpha":"The {{attribute}} must only contain letters.","validation.alpha_dash":"The {{attribute}} must only contain letters, numbers, dashes and underscores.","validation.alpha_num":"The {{attribute}} must only contain letters and numbers.","validation.array":"The {{attribute}} must be an array.","validation.ascii":"The {{attribute}} must only contain single-byte alphanumeric characters and symbols.","validation.before":"The {{attribute}} must be a date before {{date}}.","validation.before_or_equal":"The {{attribute}} must be a date before or equal to {{date}}.","validation.between.array":"The {{attribute}} must have between {{min}} and {{max}} items.","validation.between.file":"The {{attribute}} must be between {{min}} and {{max}} kilobytes.","validation.between.numeric":"The {{attribute}} must be between {{min}} and {{max}}.","validation.between.string":"The {{attribute}} must be between {{min}} and {{max}} characters.","validation.boolean":"The {{attribute}} field must be true or false.","validation.confirmed":"The {{attribute}} confirmation does not match.","validation.current_password":"The password is incorrect.","validation.date":"The {{attribute}} is not a valid date.","validation.date_equals":"The {{attribute}} must be a date equal to {{date}}.","validation.date_format":"The {{attribute}} does not match the format {{format}}.","validation.decimal":"The {{attribute}} must have {{decimal}} decimal places.","validation.declined":"The {{attribute}} must be declined.","validation.declined_if":"The {{attribute}} must be declined when {{other}} is {{value}}.","validation.different":"The {{attribute}} and {{other}} must be different.","validation.digits":"The {{attribute}} must be {{digits}} digits.","validation.digits_between":"The {{attribute}} must be between {{min}} and {{max}} digits.","validation.dimensions":"The {{attribute}} has invalid image dimensions.","validation.distinct":"The {{attribute}} field has a duplicate value.","validation.doesnt_end_with":"The {{attribute}} may not end with one of the following: {{values}}.","validation.doesnt_start_with":"The {{attribute}} may not start with one of the following: {{values}}.","validation.email":"The {{attribute}} must be a valid email address.","validation.ends_with":"The {{attribute}} must end with one of the following: {{values}}.","validation.enum":"The selected {{attribute}} is invalid.","validation.exists":"The selected {{attribute}} is invalid.","validation.file":"The {{attribute}} must be a file.","validation.filled":"The {{attribute}} field must have a value.","validation.gt.array":"The {{attribute}} must have more than {{value}} items.","validation.gt.file":"The {{attribute}} must be greater than {{value}} kilobytes.","validation.gt.numeric":"The {{attribute}} must be greater than {{value}}.","validation.gt.string":"The {{attribute}} must be greater than {{value}} characters.","validation.gte.array":"The {{attribute}} must have {{value}} items or more.","validation.gte.file":"The {{attribute}} must be greater than or equal to {{value}} kilobytes.","validation.gte.numeric":"The {{attribute}} must be greater than or equal to {{value}}.","validation.gte.string":"The {{attribute}} must be greater than or equal to {{value}} characters.","validation.image":"The {{attribute}} must be an image.","validation.in":"The selected {{attribute}} is invalid.","validation.in_array":"The {{attribute}} field does not exist in {{other}}.","validation.integer":"The {{attribute}} must be an integer.","validation.ip":"The {{attribute}} must be a valid IP address.","validation.ipv4":"The {{attribute}} must be a valid IPv4 address.","validation.ipv6":"The {{attribute}} must be a valid IPv6 address.","validation.json":"The {{attribute}} must be a valid JSON string.","validation.lowercase":"The {{attribute}} must be lowercase.","validation.lt.array":"The {{attribute}} must have less than {{value}} items.","validation.lt.file":"The {{attribute}} must be less than {{value}} kilobytes.","validation.lt.numeric":"The {{attribute}} must be less than {{value}}.","validation.lt.string":"The {{attribute}} must be less than {{value}} characters.","validation.lte.array":"The {{attribute}} must not have more than {{value}} items.","validation.lte.file":"The {{attribute}} must be less than or equal to {{value}} kilobytes.","validation.lte.numeric":"The {{attribute}} must be less than or equal to {{value}}.","validation.lte.string":"The {{attribute}} must be less than or equal to {{value}} characters.","validation.mac_address":"The {{attribute}} must be a valid MAC address.","validation.max.array":"The {{attribute}} must not have more than {{max}} items.","validation.max.file":"The {{attribute}} must not be greater than {{max}} kilobytes.","validation.max.numeric":"The {{attribute}} must not be greater than {{max}}.","validation.max.string":"The {{attribute}} must not be greater than {{max}} characters.","validation.max_digits":"The {{attribute}} must not have more than {{max}} digits.","validation.mimes":"The {{attribute}} must be a file of type: {{values}}.","validation.mimetypes":"The {{attribute}} must be a file of type: {{values}}.","validation.min.array":"The {{attribute}} must have at least {{min}} items.","validation.min.file":"The {{attribute}} must be at least {{min}} kilobytes.","validation.min.numeric":"The {{attribute}} must be at least {{min}}.","validation.min.string":"The {{attribute}} must be at least {{min}} characters.","validation.min_digits":"The {{attribute}} must have at least {{min}} digits.","validation.missing":"The {{attribute}} field must be missing.","validation.missing_if":"The {{attribute}} field must be missing when {{other}} is {{value}}.","validation.missing_unless":"The {{attribute}} field must be missing unless {{other}} is {{value}}.","validation.missing_with":"The {{attribute}} field must be missing when {{values}} is present.","validation.missing_with_all":"The {{attribute}} field must be missing when {{values}} are present.","validation.multiple_of":"The {{attribute}} must be a multiple of {{value}}.","validation.not_in":"The selected {{attribute}} is invalid.","validation.not_regex":"The {{attribute}} format is invalid.","validation.numeric":"The {{attribute}} must be a number.","validation.password.letters":"The {{attribute}} must contain at least one letter.","validation.password.mixed":"The {{attribute}} must contain at least one uppercase and one lowercase letter.","validation.password.numbers":"The {{attribute}} must contain at least one number.","validation.password.symbols":"The {{attribute}} must contain at least one symbol.","validation.password.uncompromised":"The given {{attribute}} has appeared in a data leak. Please choose a different {{attribute}}.","validation.present":"The {{attribute}} field must be present.","validation.prohibited":"The {{attribute}} field is prohibited.","validation.prohibited_if":"The {{attribute}} field is prohibited when {{other}} is {{value}}.","validation.prohibited_unless":"The {{attribute}} field is prohibited unless {{other}} is in {{values}}.","validation.prohibits":"The {{attribute}} field prohibits {{other}} from being present.","validation.regex":"The {{attribute}} format is invalid.","validation.required":"The {{attribute}} field is required.","validation.required_array_keys":"The {{attribute}} field must contain entries for: {{values}}.","validation.required_if":"The {{attribute}} field is required when {{other}} is {{value}}.","validation.required_if_accepted":"The {{attribute}} field is required when {{other}} is accepted.","validation.required_unless":"The {{attribute}} field is required unless {{other}} is in {{values}}.","validation.required_with":"The {{attribute}} field is required when {{values}} is present.","validation.required_with_all":"The {{attribute}} field is required when {{values}} are present.","validation.required_without":"The {{attribute}} field is required when {{values}} is not present.","validation.required_without_all":"The {{attribute}} field is required when none of {{values}} are present.","validation.same":"The {{attribute}} and {{other}} must match.","validation.size.array":"The {{attribute}} must contain {{size}} items.","validation.size.file":"The {{attribute}} must be {{size}} kilobytes.","validation.size.numeric":"The {{attribute}} must be {{size}}.","validation.size.string":"The {{attribute}} must be {{size}} characters.","validation.starts_with":"The {{attribute}} must start with one of the following: {{values}}.","validation.string":"The {{attribute}} must be a string.","validation.timezone":"The {{attribute}} must be a valid timezone.","validation.unique":"The {{attribute}} has already been taken.","validation.uploaded":"The {{attribute}} failed to upload.","validation.uppercase":"The {{attribute}} must be uppercase.","validation.url":"The {{attribute}} must be a valid URL.","validation.ulid":"The {{attribute}} must be a valid ULID.","validation.uuid":"The {{attribute}} must be a valid UUID.","validation.custom.attribute-name.rule-name":"custom-message","validation.unsupported_currency_code":"The currency code you provided is invalid or not supported.","validation.unsupported_period":"The period you provided is invalid or not supported.","validation.unsupported_token_symbol":"The token symbol you provided is invalid or not supported.","validation.gallery_title_required":"Gallery name is required.","validation.gallery_title_max_characters":"The gallery name should not exceed 50 characters.","validation.gallery_title_invalid":"The gallery name is invalid.","validation.nfts_required":"Please add at least one NFT.","validation.nfts_max_size":"Galleries can contain no more than {{limit}} NFTs","validation.invalid_nfts":"The NFT in position {{position}} is invalid, please select another one.","validation.invalid_cover":"You have selected an invalid cover image, please try another one."} \ No newline at end of file diff --git a/resources/js/Pages/Articles/Show.tsx b/resources/js/Pages/Articles/Show.tsx new file mode 100644 index 000000000..601ad993f --- /dev/null +++ b/resources/js/Pages/Articles/Show.tsx @@ -0,0 +1,9 @@ +import { DefaultLayout } from "@/Layouts/DefaultLayout"; + +const ArticlesShow = ({ article }: { article: App.Data.Articles.ArticleData }): JSX.Element => ( + +
{article.title}
+
+); + +export default ArticlesShow; diff --git a/routes/web.php b/routes/web.php index 2d2fa54aa..b4478cf9c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -80,6 +80,7 @@ Route::group(['prefix' => 'articles', 'middleware' => 'features:articles'], function () { Route::get('', [ArticleController::class, 'index'])->name('articles'); + Route::get('{article:slug}', [ArticleController::class, 'show'])->name('articles.view'); }); Route::group(['prefix' => 'collections', 'middleware' => 'features:collections'], function () { diff --git a/tests/App/Http/Controllers/ArticleControllerTest.php b/tests/App/Http/Controllers/ArticleControllerTest.php index 127b8cfb5..37e1d7565 100644 --- a/tests/App/Http/Controllers/ArticleControllerTest.php +++ b/tests/App/Http/Controllers/ArticleControllerTest.php @@ -33,6 +33,22 @@ function seedArticles(int $articlesCount = 4, int $collectionsCount = 2): array ->assertStatus(200); }); +it('should render a single published article', function () { + [, [$article]] = seedArticles(1); + + $this->get(route('articles.view', ['article' => $article->slug])) + ->assertStatus(200); +}); + +it('should not render a single unpublished article', function () { + [, [$article]] = seedArticles(1); + + $article->update(['published_at' => null]); + + $this->get(route('articles.view', ['article' => $article->slug])) + ->assertStatus(404); +}); + it('should return articles with the given pageLimit', function ($pageLimit, $resultCount) { seedArticles(35, 4); diff --git a/tests/App/Models/ArticleTest.php b/tests/App/Models/ArticleTest.php index 3932b33b7..3820d19f0 100644 --- a/tests/App/Models/ArticleTest.php +++ b/tests/App/Models/ArticleTest.php @@ -29,3 +29,62 @@ expect($articles[0]->id)->toBe($createdArticles[1]->id) ->and($articles[1]->id)->toBe($createdArticles[0]->id); }); + +it('gets meta description from attribute', function () { + $article = Article::factory()->create([ + 'meta_description' => 'This is a meta description', + 'content' => 'This is the content', + ]); + + expect($article->metaDescription())->toBe('This is a meta description'); +}); + +it('gets meta description from content if meta description is not set', function () { + $article = Article::factory()->create([ + 'meta_description' => null, + 'content' => 'This is the content', + ]); + + expect($article->metaDescription())->toBe('This is the content'); +}); + +it('truncates the content if used as meta description', function () { + $article = Article::factory()->create([ + 'meta_description' => null, + 'content' => str_repeat('a', 300), + ]); + + expect($article->metaDescription())->toHaveLength(160); +}); + +it('determines that article is published if published_at is in the past', function () { + $article = Article::factory()->create([ + 'published_at' => now()->subDay(), + ]); + + expect($article->isNotPublished())->toBeFalse(); +}); + +it('determines that article is published if published_at is now', function () { + $article = Article::factory()->create([ + 'published_at' => now(), + ]); + + expect($article->isNotPublished())->toBeFalse(); +}); + +it('determines that article is not published if published_at is in the future', function () { + $article = Article::factory()->create([ + 'published_at' => now()->addDay(), + ]); + + expect($article->isNotPublished())->toBeTrue(); +}); + +it('determines that article is not published if published_at is null', function () { + $article = Article::factory()->create([ + 'published_at' => null, + ]); + + expect($article->isNotPublished())->toBeTrue(); +});