trypost/lang/nl/posts.php

671 lines
31 KiB
PHP
Raw Permalink Normal View History

<?php
return [
'title' => 'Posts',
'search' => 'Posts zoeken...',
'all_posts' => 'Alle posts',
'new_post' => 'Nieuwe post',
'no_posts' => 'Geen posts gevonden',
'no_search_results' => 'Geen posts komen overeen met je zoekopdracht',
'try_different_search' => 'Probeer een ander zoekwoord of wis de zoekopdracht.',
'start_creating' => 'Begin met het aanmaken van je eerste post.',
'filter_by_label' => 'Filteren op label',
'label_search_placeholder' => 'Labels zoeken...',
'no_labels' => 'Geen labels gevonden.',
'clear_label_filter' => 'Labelfilter wissen',
'table' => [
'post' => 'Post',
'status' => 'Status',
'content' => 'Inhoud',
'platforms' => 'Platforms',
'labels' => 'Labels',
'scheduled_at' => 'Datum',
'actions' => '',
],
'manage_posts' => 'Beheer al je posts',
'delete_confirm' => 'Weet je zeker dat je deze post wilt verwijderen?',
'by' => 'door',
'actions' => [
'view' => 'Post bekijken',
'delete' => 'Verwijderen',
'duplicate' => 'Dupliceren',
'copy_id' => 'ID kopiëren',
'copied' => 'ID gekopieerd naar klembord',
],
'form' => [
'post_type' => 'Posttype',
'board' => 'Bord',
'select_board' => 'Selecteer een bord',
'search_board' => 'Bord zoeken...',
'no_board_found' => 'Geen bord gevonden',
'media' => 'Media',
'min' => 'Min',
'uploading' => 'Uploaden...',
'drop_to_upload' => 'Neerzetten om te uploaden',
'drag_and_drop' => 'Sleep hierheen of klik om te uploaden',
'photos_and_videos' => 'Foto\'s en video\'s',
'photos_only' => 'Alleen foto\'s',
'videos_only' => 'Alleen video\'s',
'drag_to_reorder' => 'Sleep om de volgorde te wijzigen',
'caption' => 'Bijschrift',
'write_caption' => 'Schrijf je bijschrift...',
'content_exceeds_platform' => ':platform: :over tekens te lang (max. :limit).',
'tiktok' => [
'settings' => 'TikTok-instellingen',
'variant_label' => 'Posttype',
'variant' => [
'video' => 'Video',
'photo' => 'Fotocarrousel',
],
'posting_to' => 'Posten naar',
'privacy_level' => 'Wie kan deze video zien?',
'privacy_placeholder' => 'Selecteer wie deze post kan bekijken',
'privacy' => [
'public' => 'Openbaar voor iedereen',
'friends' => 'Vrienden die je terug volgt',
'followers' => 'Volgers',
'private' => 'Alleen ik',
'private_disabled_branded' => 'De zichtbaarheid van branded content kan niet op privé worden ingesteld.',
],
'privacy_hint' => 'De beschikbare opties zijn afhankelijk van je TikTok-accountinstellingen.',
'auto_add_music' => 'Automatisch muziek toevoegen',
'auto_add_music_hint' => 'Deze functie is alleen beschikbaar voor foto\'s. Er wordt standaardmuziek toegevoegd die je later kunt wijzigen.',
'yes' => 'Ja',
'no' => 'Nee',
'allow_users' => 'Gebruikers toestaan om:',
'comments' => 'Reageren',
'duet' => 'Duet',
'stitch' => 'Stitch',
'is_aigc' => 'Video gemaakt met AI',
'disclose' => 'Video-inhoud onthullen',
'disclose_hint' => 'Schakel in om te onthullen dat deze video goederen of diensten promoot in ruil voor iets van waarde. Je video kan jezelf, een derde partij of beide promoten.',
'promotional_organic_title' => 'Je foto/video wordt gelabeld als "Promotionele content".',
'promotional_paid_title' => 'Je foto/video wordt gelabeld als "Betaald partnerschap".',
'promotional_description' => 'Dit kan niet worden gewijzigd zodra je video is geplaatst.',
'compliance_incomplete' => 'Je moet aangeven of je content jezelf, een derde partij of beide promoot.',
'privacy_required' => 'Het TikTok-privacyniveau is vereist bij het publiceren.',
'branded_cleared_private' => 'De privacy is gewist omdat branded content niet privé kan zijn.',
'interaction_disabled_by_creator' => 'Uitgeschakeld in je TikTok-accountinstellingen',
'max_duration_exceeded' => 'De video is :duration s lang, maar dit account kan alleen video\'s tot :max s plaatsen.',
'processing_hint' => 'Na het publiceren kan het enkele minuten duren voordat de content is verwerkt en op je TikTok-profiel verschijnt.',
'brand_organic' => 'Je merk',
'brand_organic_hint' => 'Je promoot jezelf of je eigen merk. Deze video wordt geclassificeerd als Brand Organic.',
'brand_content' => 'Branded content',
'brand_content_hint' => 'Je promoot een ander merk of een derde partij. Deze video wordt geclassificeerd als Branded Content.',
'compliance' => [
'agree' => 'Door te plaatsen ga je akkoord met de',
'music_usage' => 'Bevestiging muziekgebruik',
'and' => 'en',
'branded_policy' => 'Branded Content Policy',
],
],
'instagram' => [
'settings' => 'Instagram-instellingen',
'posting_to' => 'Posten naar',
'variant_label' => 'Posttype',
'variant' => [
'feed' => 'Feedpost',
'reel' => 'Reel',
'story' => 'Story',
],
'aspect_label' => 'Beeldverhouding',
'aspect' => [
'square' => 'Vierkant (1:1)',
'portrait' => 'Portret (4:5)',
'landscape' => 'Liggend (16:9)',
'original' => 'Origineel',
],
],
'facebook' => [
'settings' => 'Facebook-instellingen',
'posting_to' => 'Posten naar',
'variant_label' => 'Posttype',
'variant' => [
'post' => 'Post',
'reel' => 'Reel',
'story' => 'Story',
],
'aspect_label' => 'Beeldverhouding',
'aspect' => [
'square' => 'Vierkant (1:1)',
'portrait' => 'Portret (4:5)',
'landscape' => 'Liggend (16:9)',
'original' => 'Origineel',
],
],
'linkedin' => [
'settings' => 'LinkedIn-instellingen',
'settings_page' => 'LinkedIn-pagina-instellingen',
'posting_to' => 'Posten naar',
'document_title' => 'Documenttitel',
'document_title_placeholder' => 'Getoond op je PDF-documentpost',
],
'pinterest' => [
'settings' => 'Pinterest-instellingen',
'posting_to' => 'Posten naar',
'variant_label' => 'Pintype',
'variant' => [
'pin' => 'Pin',
'video_pin' => 'Videopin',
'carousel' => 'Carrousel',
],
'board' => 'Bord',
'select_board' => 'Selecteer een bord',
'no_boards' => 'Geen Pinterest-borden gevonden. Maak er eerst een aan in je Pinterest-account.',
'boards_truncated' => 'Sommige borden konden niet worden geladen. Ontbreekt die van jou, open Pinterest en probeer opnieuw.',
'search_board' => 'Borden zoeken...',
'no_board_found' => 'Geen bord komt overeen met je zoekopdracht.',
'board_required' => 'Selecteer een Pinterest-bord om deze post te publiceren.',
Add optional Pinterest pin title and destination link (#232) * Add optional Pinterest pin title, description, and link. Expose title/description/link across web, API, and MCP; seed description from caption into meta on save, and publish description only from meta. Co-authored-by: Cursor <cursoragent@cursor.com> * Expand Pinterest title/description/link test coverage. Cover web draft persistence and validation bounds, API/MCP update merge and seed, and publisher payload fields on video and carousel pins. Co-authored-by: Cursor <cursoragent@cursor.com> * Simplify Pinterest: description is post content again. Keep optional title and link in meta/settings only. Remove the separate description textarea, seed logic, and meta.description path so Pinterest follows the shared caption pattern. Co-authored-by: Cursor <cursoragent@cursor.com> * Refactor Pinterest meta handling and validation. - Update CreatePost and UpdatePost actions to filter out null values from meta fields. - Introduce a new method in PinterestPublisher to resolve board IDs, ensuring required fields are validated. - Enhance PinterestSettings component to manage title and link inputs, including validation for HTTP URLs. - Update PostPlatformMetaRules to enforce URL validation for Pinterest links. - Add tests for clearing Pinterest title and link, and for rejecting invalid links during scheduling. This refactor improves the handling of Pinterest metadata and enhances user experience by ensuring proper validation and error handling. * Add validation messages and attributes for Pinterest meta fields - Introduced custom validation messages and friendly attribute names for Pinterest link and title fields in PostPlatformMetaRules. - Updated StorePostRequest, UpdatePostRequest, and related tools to utilize these new messages and attributes. - Enhanced tests to assert correct error messages for invalid Pinterest links and title length constraints. This update improves user feedback during post creation and editing, ensuring clarity in validation errors. * Remove click.prevent directive from Pinterest link in PinterestPreview component. This change simplifies the link behavior, allowing default click actions to occur, which may enhance user interaction with the Pinterest link. * Update validation error messages for Pinterest meta fields in tests - Refined the assertions in PostApiPlatformMetaTest to include localized validation messages for Pinterest title and link fields. - Ensured that error messages reflect the updated validation rules, enhancing clarity for users during post creation and editing. --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 21:15:50 +00:00
'title' => 'Titel',
'title_placeholder' => 'Optionele pin-titel',
'link' => 'Bestemmingslink',
'link_placeholder' => 'https://voorbeeld.com',
'link_invalid' => 'Voer een geldige bestemmingslink in (http of https).',
'title_max' => 'Titel mag niet langer zijn dan 100 tekens.',
'link_max' => 'Bestemmingslink mag niet langer zijn dan 2048 tekens.',
],
'discord' => [
'settings' => 'Discord-instellingen',
'posting_to' => 'Posten naar',
'channel' => 'Kanaal',
'select_channel' => 'Selecteer een kanaal',
'loading_channels' => 'Kanalen laden…',
'search_channel' => 'Kanalen zoeken…',
'no_channels' => 'Geen kanalen gevonden.',
'channel_required' => 'Selecteer een Discord-kanaal om deze post te publiceren.',
'mentions' => 'Vermeldingen',
'search_mention' => 'Vermeld een rol of lid…',
'embeds' => 'Embeds',
'embed' => 'Embed',
'add_embed' => 'Embed toevoegen',
'embed_title' => 'Embed-titel',
'embed_description' => 'Embed-omschrijving',
'embed_url' => 'Embed-URL',
'embed_image' => 'Afbeeldings-URL',
'embed_color' => 'Kleur',
],
'warnings' => [
'no_variant' => 'Kies een posttype om door te gaan.',
'requires_media' => 'Dit posttype vereist ten minste één afbeelding of video.',
'max_files_exceeded' => 'Dit posttype accepteert maximaal :max mediabestanden (je hebt er :current).',
'min_files_required' => 'Dit posttype vereist ten minste :min mediabestanden (je hebt er :current).',
'no_video_allowed' => 'Dit posttype accepteert geen video\'s.',
'no_image_allowed' => 'Dit posttype accepteert alleen video\'s.',
'no_document_allowed' => 'Dit posttype accepteert geen PDF-documenten.',
'no_mixed_media' => 'Afbeeldingen en een video kunnen niet in dezelfde post worden gecombineerd.',
'document_not_alone' => 'Een PDF moet apart worden geplaatst, zonder andere afbeeldingen of video\'s.',
'gif_not_allowed' => 'Dit platform accepteert geen GIF. Verwijder de GIF of kies een ander netwerk.',
'image_too_large' => 'De afbeelding overschrijdt de limiet van :max voor dit posttype (die van jou is :current).',
'video_too_large' => 'De video overschrijdt de limiet van :max voor dit posttype (die van jou is :current).',
'document_too_large' => 'De PDF overschrijdt de limiet van :max voor dit posttype (die van jou is :current).',
'video_too_long' => 'De video is :current lang, maar dit posttype staat maximaal :max toe.',
'aspect_ratio_too_narrow' => 'Beeldverhouding :current is te hoog voor dit posttype (min. :min).',
'aspect_ratio_too_wide' => 'Beeldverhouding :current is te breed voor dit posttype (max. :max).',
],
],
'status' => [
'pending' => 'In afwachting',
'draft' => 'Concept',
'scheduled' => 'Gepland',
'publishing' => 'Publiceren',
'retrying' => 'Opnieuw proberen',
'published' => 'Gepubliceerd',
'partially_published' => 'Gedeeltelijk gepubliceerd',
'failed' => 'Mislukt',
],
'descriptions' => [
'draft' => 'Posts die wachten om te worden ingepland',
'scheduled' => 'Posts die zijn ingepland om te worden gepubliceerd',
'published' => 'Posts die al zijn gepubliceerd',
],
'ai' => [
'generate' => [
'button_tooltip' => 'Genereren met AI',
'title' => 'Post genereren met AI',
'description' => 'Beschrijf waar de post over moet gaan. De AI gebruikt je merkcontext om hem te schrijven.',
'prompt_label' => 'Waar gaat deze post over?',
'prompt_placeholder' => 'bijv. Kondig onze nieuwe functie voor beeldgeneratie voor carrousels aan',
'preview_label' => 'Voorbeeld',
'start' => 'Genereren',
'apply' => 'Gebruik deze inhoud',
'retry' => 'Opnieuw proberen',
'cancel' => 'Annuleren',
fix: subscribe to AI generation channel before dispatching the job (#269) * fix: subscribe to AI generation channel before dispatching the job AiGenerateDialog posted the generate request and only subscribed to the broadcast channel once the response came back. Reverb's plain Channel (vendor/laravel/reverb/.../Channels/Channel.php) delivers broadcasts by iterating the in-memory connection list at send time only — no history, no replay. If the queued job started streaming text_delta/stream_end events before the private-channel subscribe handshake finished, those events were gone for good and the dialog hung on 'streaming' forever. Generate the generation_id client-side, await channel subscription confirmation (Echo's channel.subscribed(), backed by pusher:subscription_succeeded) before sending the generate request, and have the backend use the client-supplied id instead of minting its own. Related to #218. * fix: handle subscribe failure, dialog-close race, and i18n hardcoded strings Code review on the previous commit surfaced real gaps: - useAiStream only handled the subscribe-success path (.subscribed()). A definitive pusher:subscription_error (expired session, CSRF mismatch) fell through to the 5s timeout and was treated as success, reproducing the exact #218 hang via a different trigger. subscribe() now returns a boolean: true on confirm-or-ambiguous-timeout (proceed optimistically), false only on an explicit error (don't dispatch work nothing will ever hear). - AiGenerateDialog now bails without dispatching if the dialog is closed while awaiting subscription confirmation (up to 5s), and unsubscribes on a post-subscribe dispatch failure so stale listeners can't flip status to 'completed' after an error was already shown. - Extracted aiGenerationChannel() so the frontend has one place to update if the channel format changes, and cross-referenced the two remaining backend copies (PostAiGenerateController, StreamPostContent). - Replaced the two hardcoded English fallback error strings with i18n keys (posts.ai.generate.errors.*) across all 16 locales — this app only ships translated copy. - Simplified subscribe(): dropped a redundant "already settled" guard and the clearTimeout bookkeeping — Promise.resolve() already no-ops after the first call, so there was nothing to guard. * fix: subscribe before dispatch in AI post creation and image regeneration flows Extracts subscribePrivateChannel as a shared helper and applies the same subscribe-before-dispatch fix from the post edit flow (issue #218) to the other two flows that stream over private channels. Post creation wizard moves the StreamPostCreation dispatch out of AiPostWizard.vue and into Loading.vue, so the channel is subscribed before the job that broadcasts on it is dispatched — previously a full page navigation happened between dispatch and subscribe with no timeout fallback, so a lost event hung the page forever. * refactor: trim explanatory comments added in the subscribe-before-dispatch fix Rationale lives in the commit history, not scattered inline comments. * refactor: trim remaining explanatory comments from the subscribe-before-dispatch fix Same cleanup as the previous commit, applied to the files from the original post-edit-flow fix. * fix: dedup post-creation dispatch, surface field-level AI errors, harden edge cases Uses ShouldBeUnique on StreamPostCreation (scoped per-user) instead of an ad-hoc cache guard, matching the pattern already used by PublishToSocialPlatform and VerifyUpcomingPostConnections. Field-level validation errors (prompt/instruction) now render inline via InputError, matching how every other form in the app surfaces them, instead of a generic status banner. Also fixes a 422 response missing the `errors` key that Inertia's client silently swallows, adds error handling around the wizard's navigation to the loading page, and extracts the duplicated error-message parsing into a shared helper.
2026-08-10 19:06:37 +00:00
'errors' => [
'start_failed' => 'Kan generatie niet starten.',
'generation_failed' => 'AI-generatie mislukt.',
],
],
'review' => [
'button_tooltip' => 'Controleren met AI',
'title' => 'Post controleren met AI',
'description' => 'AI controleert op grammatica, spelling en duidelijkheid. Pas de suggesties toe waar je het mee eens bent.',
'loading' => 'Je tekst controleren...',
'no_issues' => 'Geen problemen gevonden. Ziet er goed uit.',
'original' => 'Origineel',
'suggestion' => 'Suggestie',
'apply' => 'Toepassen',
'apply_all' => 'Alles toepassen',
'applied' => 'Toegepast',
'cancel' => 'Annuleren',
],
'image_regenerate' => [
'button' => 'Aanpassen',
'title' => 'AI-afbeelding aanpassen',
'description' => 'Beschrijf de correctie. De nieuwe afbeelding vervangt de huidige en behoudt zijn positie in de carrousel.',
'instruction_label' => 'Instructie',
'instruction_placeholder' => 'bijv. Herstel de typefout in de kop en maak de achtergrond lichter.',
'processing' => 'Afbeelding opnieuw genereren... dit kan enkele seconden duren.',
'submit' => 'Afbeelding opnieuw genereren',
'cancel' => 'Annuleren',
'success' => 'Afbeelding bijgewerkt. De nieuwe versie heeft de vorige in je post vervangen.',
'fallback_title' => 'Verbeter deze afbeeldingstekst',
'errors' => [
'required' => 'Instructie is vereist.',
'start_failed' => 'Het opnieuw genereren kon niet worden gestart.',
'unavailable' => 'Deze afbeelding kan op dit moment niet opnieuw worden gegenereerd.',
'timeout' => 'Het opnieuw genereren duurt langer dan verwacht. Probeer het zo dadelijk opnieuw.',
'media_not_found' => 'Media-item niet gevonden.',
'not_ai_media' => 'Alleen AI-gegenereerde media kan opnieuw worden gegenereerd.',
],
],
'templates' => [
'image_card' => [
'name' => 'Afbeeldingspost',
'description' => 'AI-afbeelding met een kop en bijschrift.',
],
'carousel' => [
'name' => 'Carrousel',
'description' => 'Carrousel met meerdere slides en een bijschrift.',
],
'tweet_card' => [
'name' => 'Tweet-kaart',
'description' => 'Je post in de stijl van een X/Twitter-post.',
],
'tweet_card_image' => [
'name' => 'Tweet-kaart met foto',
'description' => 'Je post als een X/Twitter-kaart over een vervaagde foto.',
],
],
],
'show' => [
'title' => 'Postdetails',
'edit' => 'Bewerken',
'back' => 'Terug',
'no_content' => 'Geen bijschrift',
'platforms' => 'Platforms',
'no_platforms' => 'Geen platforms geselecteerd.',
'view_on_platform' => 'Bekijken op platform',
'published_on' => 'Gepubliceerd op :date',
'scheduled_for' => 'Gepland voor :date',
'draft' => 'Concept',
'status_pending' => 'In afwachting',
'metrics' => 'Statistieken',
'metrics_loading' => 'Statistieken laden…',
'metrics_unavailable' => 'Statistieken zijn voor dit platform nog niet beschikbaar.',
'metrics_empty' => 'Geen statistieken teruggegeven.',
],
'edit' => [
'title' => 'Post bewerken',
'view_title' => 'Post bekijken',
'labels' => 'Labels',
'no_labels' => 'Nog geen labels aangemaakt',
'schedule' => 'Plannen',
'pick_time' => 'Kies tijd',
'pick_time_past' => 'Kies een datum en tijd in de toekomst.',
'post_now' => 'Nu posten',
'time' => 'Tijd',
'cancel' => 'Annuleren',
'delete' => 'Verwijderen',
'schedule_for' => 'Plannen voor',
'schedule_date' => 'Plandatum',
'unschedule' => 'Planning opheffen',
'saving' => 'Opslaan...',
'saved' => 'Opgeslagen',
'draft' => 'Concept',
'media' => 'Media',
'add_media' => 'Media toevoegen',
'caption' => 'Bijschrift',
'caption_placeholder' => 'Schrijf je bijschrift...',
'compose_title' => 'Een post maken',
'compose_subtitle' => 'Stel je bericht op en voeg media toe',
'preview_empty' => [
'title' => 'Geen platform geselecteerd',
'description' => 'Selecteer een platform om naar te publiceren om het voorbeeld te zien.',
],
'drop_zone_title' => 'Media toevoegen',
'drop_zone_subtitle' => 'Sleep bestanden hierheen of klik om te bladeren',
'add' => 'Toevoegen',
'publish_to' => 'Publiceren naar',
'organize' => 'Organiseren',
'signatures' => 'Handtekeningen',
'view_on_platform' => 'Bekijken op platform',
'platform_status' => 'Platformstatus',
'compliance_incomplete' => 'Sommige platforminstellingen zijn onvolledig of niet compatibel met de bijgevoegde media.',
'compliance' => [
'requires_content_or_media' => 'Voeg tekst of media toe om te publiceren.',
'requires_media' => 'Voeg een afbeelding of video toe om hier te publiceren.',
'too_many_files' => 'Slechts :max bestand(en) toegestaan voor dit formaat.',
'too_few_files' => 'Voeg ten minste :min bestanden toe voor dit formaat.',
'no_videos' => 'Alleen afbeeldingen zijn toegestaan voor dit formaat.',
'no_images' => 'Alleen video\'s zijn toegestaan voor dit formaat.',
'no_mixed_media' => 'Afbeeldingen en video\'s kunnen niet in dezelfde post worden gecombineerd.',
'no_gifs' => 'GIFs worden hier niet ondersteund.',
'no_documents' => 'PDF-documenten worden niet ondersteund door dit formaat.',
'document_not_alone' => 'Een PDF moet apart worden geplaatst, zonder andere afbeeldingen of video\'s.',
'video_too_large' => 'De video overschrijdt de groottelimiet voor dit platform.',
'video_too_long' => 'De video moet korter zijn dan :seconds seconden voor dit formaat.',
'image_too_large' => 'De afbeelding overschrijdt de groottelimiet voor dit platform.',
'document_too_large' => 'De PDF overschrijdt de groottelimiet voor dit platform.',
'aspect_ratio_invalid' => 'De beeldverhouding wordt niet ondersteund door dit formaat.',
'no_content_type' => 'Kies een contenttype voor dit platform.',
'requires_text' => 'Voeg tekst toe — dit formaat heeft een titel nodig.',
],
'publishing' => 'Publiceren...',
'publishing_overlay_title' => 'Je post wordt gepubliceerd',
'publishing_overlay_subtitle' => 'Dit kan even duren. Je kunt deze pagina veilig verlaten.',
'scheduled_overlay_title' => 'Deze post is gepland',
'scheduled_overlay_subtitle' => 'Gepland voor :date. Hef eerst de planning op om wijzigingen aan te brengen.',
'unschedule_cta' => 'Planning opheffen om te bewerken',
'tabs' => [
'compose' => 'Opstellen',
'preview' => 'Voorbeeld',
'channels' => 'Kanalen',
'comments' => 'Reacties',
'comments_empty' => 'Nog geen reacties.',
],
'media_picker' => [
'title' => 'Kiezen uit galerij',
'search' => 'Media zoeken...',
'empty' => 'Nog geen media in je galerij',
'cancel' => 'Annuleren',
'add' => 'Toevoegen',
'add_count' => ':count toevoegen',
],
'alt_text' => [
'label' => 'Alt-tekst',
'edit' => 'Alt-tekst bewerken',
'placeholder' => 'Beschrijf deze afbeelding voor mensen die schermlezers gebruiken',
'hint' => 'Wordt gepubliceerd op platforms die afbeeldingsbeschrijvingen ondersteunen.',
'save' => 'Opslaan',
],
'emoji_picker' => [
'search' => 'Emoji zoeken',
'empty' => 'Geen emoji\'s gevonden',
'recent' => 'Vaak gebruikt',
'smileys' => 'Smileys en emotie',
'people' => 'Mensen en lichaam',
'nature' => 'Dieren en natuur',
'food' => 'Eten en drinken',
'activities' => 'Activiteiten',
'travel' => 'Reizen en plaatsen',
'objects' => 'Objecten',
'symbols' => 'Symbolen',
'flags' => 'Vlaggen',
],
'status' => [
'pending' => 'In afwachting',
'scheduled' => 'Gepland',
'published' => 'Gepubliceerd',
'publishing' => 'Publiceren...',
'retrying' => 'Opnieuw proberen...',
'failed' => 'Mislukt',
],
'delete_modal' => [
'title' => 'Post verwijderen',
'description' => 'Weet je zeker dat je deze post wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.',
'action' => 'Verwijderen',
'cancel' => 'Annuleren',
],
'sync_enable' => [
'title' => 'Synchronisatie inschakelen?',
'description' => 'Alle platforms delen dezelfde inhoud. Aangepaste bewerkingen aan afzonderlijke platforms worden vervangen door de huidige inhoud.',
'cancel' => 'Annuleren',
'action' => 'Synchronisatie inschakelen',
],
'sync_disable' => [
'title' => 'Synchronisatie uitschakelen?',
'description' => 'Elk platform behoudt zijn huidige inhoud, maar toekomstige bewerkingen gelden alleen voor het platform dat je bewerkt.',
'customize_note' => 'Je kunt de inhoud voor elk platform afzonderlijk aanpassen.',
'cancel' => 'Annuleren',
'action' => 'Synchronisatie uitschakelen',
],
'platforms_dialog' => [
'title' => 'Platforms selecteren',
'description' => 'Kies naar welke platforms je deze post wilt publiceren.',
],
'signatures_modal' => [
'search' => 'Handtekeningen zoeken...',
'no_results' => 'Geen handtekeningen gevonden.',
],
'validation' => [
'select_board' => 'Selecteer een bord',
'images_not_supported' => 'Afbeeldingen niet ondersteund',
'videos_not_supported' => 'Video\'s niet ondersteund',
'max_images' => 'Max. :count afbeeldingen',
'requires_media' => 'Media vereist',
'requires_content' => 'Tekstinhoud is vereist',
'exceeded' => ':count overschreden',
'does_not_support_images' => ':platform ondersteunt geen afbeeldingen',
'supports_up_to_images' => ':platform ondersteunt maximaal :count afbeeldingen',
'does_not_support_videos' => ':platform ondersteunt geen video\'s',
],
],
'content_types' => [
'instagram_feed' => [
'label' => 'Feedpost',
'description' => 'Verschijnt in je feed en profiel',
],
'instagram_reel' => [
'label' => 'Reel',
'description' => 'Korte video tot 15 minuten',
],
'instagram_story' => [
'label' => 'Story',
'description' => 'Verdwijnt na 24 uur',
],
'linkedin_post' => [
'label' => 'Post',
'description' => 'Standaardpost — enkele afbeelding, meerdere afbeeldingen, video of PDF',
],
'linkedin_page_post' => [
'label' => 'Post',
'description' => 'Standaardpost — enkele afbeelding, meerdere afbeeldingen, video of PDF',
],
'facebook_post' => [
'label' => 'Post',
'description' => 'Standaardpost op je pagina',
],
'facebook_reel' => [
'label' => 'Reel',
'description' => 'Korte video tot 90 seconden',
],
'facebook_story' => [
'label' => 'Story',
'description' => 'Verticale videostory, tot 60 seconden',
],
'tiktok_video' => [
'label' => 'Video',
'description' => 'Korte video-content',
],
'tiktok_photo' => [
'label' => 'Fotocarrousel',
'description' => 'Tot 35 foto\'s als een swipebare carrousel',
],
'youtube_short' => [
'label' => 'Short',
'description' => 'Verticale video tot 3 minuten',
],
'x_post' => [
'label' => 'Post',
'description' => 'Tweet met tekst en media',
],
'threads_post' => [
'label' => 'Post',
'description' => 'Tekstpost met optionele media',
],
'pinterest_pin' => [
'label' => 'Pin',
'description' => 'Standaard afbeeldingspin',
],
'pinterest_video_pin' => [
'label' => 'Videopin',
'description' => 'Videopin (4s - 15min)',
],
'pinterest_carousel' => [
'label' => 'Carrousel',
'description' => 'Carrousel met meerdere afbeeldingen (2-5 afbeeldingen)',
],
'bluesky_post' => [
'label' => 'Post',
'description' => 'Tekstpost met optionele afbeeldingen',
],
'mastodon_post' => [
'label' => 'Post',
'description' => 'Tekstpost met optionele media',
],
'telegram_post' => [
'label' => 'Post',
'description' => 'Tekstpost met optionele media',
],
'discord_message' => [
'label' => 'Bericht',
'description' => 'Bericht naar een Discord-kanaal met optionele media en embeds',
],
],
'platforms' => [
'linkedin' => 'LinkedIn',
'linkedin-page' => 'LinkedIn-pagina',
'x' => 'X',
'tiktok' => 'TikTok',
'youtube' => 'YouTube Shorts',
'facebook' => 'Facebook-pagina',
'instagram' => 'Instagram',
'threads' => 'Threads',
'pinterest' => 'Pinterest',
'bluesky' => 'Bluesky',
'mastodon' => 'Mastodon',
],
'flash' => [
'scheduled' => 'Post succesvol ingepland!',
'deleted' => 'Post succesvol verwijderd!',
'duplicated' => 'Post gedupliceerd als concept.',
'cannot_edit_finalized' => 'Deze post is al verwerkt en kan niet opnieuw worden gepubliceerd. Dupliceer hem om het opnieuw te proberen.',
'cannot_delete_published' => 'Gepubliceerde posts kunnen niet worden verwijderd.',
'connect_first' => 'Koppel ten minste één social netwerk voordat je een post aanmaakt.',
],
'errors' => [
'account_disconnected' => 'Social account is losgekoppeld',
'account_inactive' => 'Social account is gedeactiveerd',
'account_token_expired' => 'Sessie van social account verlopen — koppel opnieuw',
fix: Pinterest video processing timeout — longer poll + retry (#246) * fix: give Pinterest video processing more time and retry on timeout A valid ~54s video pin failed after ~90s of polling while Pinterest was still processing. Extend the poll window to ~5 minutes and treat timeout as platform unavailable so PublishToSocialPlatform reschedules instead of failing the post on the first attempt. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: use Laravel Sleep for Pinterest media processing polls Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: inline Pinterest video processing poll constants Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: map Pinterest media upload statuses to an enum Use the official MediaUploadStatus values (registered, processing, succeeded, failed) instead of comparing raw strings in the publisher. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: trim Pinterest media processing docblock * fix: cap platform-unavailable retries and recover stuck retrying posts Stop infinite reschedules after 6 attempts with a user-safe failure message, keep technical detail in error_context, recover Retrying platforms in social:recover-stuck-posts, and drop unused isTerminal(). Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: remove unused failedCount in RecoverStuckPosts Co-authored-by: Cursor <cursoragent@cursor.com> * fix: skip final Pinterest poll sleep and localize recover timeout Co-authored-by: Cursor <cursoragent@cursor.com> * fix: raise publish job timeout headroom and ignore already-failed platforms Give social publish jobs 15 minutes so Pinterest media polling fits under the worker limit, bump Horizon/redis retry_after above that timeout, and skip handle/failed when the platform is already Failed so delayed jobs cannot revive posts recovered by social:recover-stuck-posts. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: restore social-publishing and ai-assistant horizon supervisors Co-authored-by: Cursor <cursoragent@cursor.com> * fix: harden Pinterest 401 handling, unique publish jobs, and recover JSON Treat media-status 401 as TokenExpired, make PublishToSocialPlatform unique per platform+attempt so retries still queue, and persist recover error_context via Eloquent casts instead of manual json_encode. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: mass-update stuck post platforms without per-row each Eloquent query updates already bind JSON arrays correctly here, so one UPDATE is enough — no manual json_encode and no N model writes. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: simplify Pinterest media processing poll loop Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: simplify publish job retry and terminal status checks Co-authored-by: Cursor <cursoragent@cursor.com> * fix: do not finalize posts while platforms are still retrying Co-authored-by: Cursor <cursoragent@cursor.com> * test: cover Pinterest timeout, unique jobs, and recover edge cases Co-authored-by: Cursor <cursoragent@cursor.com> * fix: retry Pinterest media poll on connection errors and tighten tests Co-authored-by: Cursor <cursoragent@cursor.com> * fix: remove ineffective TypeError import that breaks CI Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 23:49:37 +00:00
'platform_unavailable' => 'Het platform is tijdelijk niet beschikbaar. We proberen het zo opnieuw.',
'platform_unavailable_exhausted' => 'Het platform bleef na meerdere pogingen niet beschikbaar. Probeer het later opnieuw.',
'publishing_timed_out' => 'Publiceren is timed-out. Probeer het opnieuw.',
],
'delete' => [
'title' => 'Post verwijderen?',
'description' => 'Deze actie kan niet ongedaan worden gemaakt. De post en alle bijbehorende media worden permanent verwijderd.',
'confirm' => 'Ja, verwijderen',
'cancel' => 'Annuleren',
],
'create' => [
'title' => 'Een nieuwe post maken',
'description' => 'Kies hoe je wilt beginnen.',
'scratch_title' => 'Vanaf nul beginnen',
'scratch_description' => 'Open een lege post en schrijf alles zelf.',
'ai_title' => 'Genereren met AI',
'ai_description' => 'Beschrijf wat je wilt en AI genereert de inhoud voor je.',
'ai_configure_description' => 'Kies een formaat en beschrijf de post die je wilt maken.',
'ai_pick_template_description' => 'Kies een stijl voor je AI-gegenereerde post.',
'coming_soon' => 'Binnenkort beschikbaar',
'preview' => [
'image_title' => 'Afbeeldingstitel',
'image_body' => 'Afbeeldingstekst',
],
'steps' => [
'template_picker_title' => 'Kies een stijl',
'format_title' => 'Kies een formaat',
'format_description' => 'Selecteer het type post dat je wilt maken.',
'account_title' => 'Kies een account',
'account_description' => 'Selecteer het social account om naar te publiceren.',
'media_title' => 'Media-opties',
'media_carousel' => 'Hoeveel slides?',
'media_optional' => 'Afbeeldingen toevoegen?',
'media_optional_label' => 'Hoeveel afbeeldingen?',
'media_none' => 'Geen',
'media_count_label' => 'Aantal afbeeldingen',
'brand_colors_label' => 'Merkkleuren',
'brand_colors_description' => 'Pas het merkkleurenpalet van je workspace toe op de gegenereerde afbeeldingen. Zet het uit om de AI kleuren te laten kiezen die bij de inhoud passen.',
'prompt_title' => 'Beschrijf je post',
'prompt_label' => 'Waar gaat deze post over?',
'prompt_placeholder' => 'bijv. Kondig onze nieuwe carrouselfunctie voor Instagram aan',
'preview_error' => 'Er is iets misgegaan. Probeer het opnieuw.',
'loading_page_title' => 'Je post wordt gegenereerd',
'loading_eta' => 'Geschatte tijd: ongeveer :minutes.',
'loading_eta_minute_one' => '1 minuut',
'loading_eta_minute_other' => ':count minuten',
'loading_leave_title' => 'Je kunt gewoon doorwerken.',
'loading_leave_body' => 'We laten het je weten wanneer de post klaar is.',
'loading_leave_cta' => 'Ga naar kalender',
'loading_create_another_cta' => 'Nog een post maken',
'loading_tip_credits' => 'Elke AI-afbeelding gebruikt ongeveer 15 credits.',
'loading_tip_edit' => 'Je kunt alles bewerken zodra de post klaar is.',
'loading_tip_draft' => 'Gegenereerde posts komen in je concepten terecht.',
'loading_tip_brand' => 'Pas je merkinstellingen aan om toekomstige posts te beïnvloeden.',
'loading_tip_carousel' => 'Carrousels leveren één slide per geüploade afbeelding.',
'loading_tip_quality' => 'De beeldkwaliteit is ingesteld op een balans tussen snelheid en kosten.',
'create' => 'Post aanmaken',
'back' => 'Terug',
'next' => 'Doorgaan',
'cancel' => 'Annuleren',
'discard' => 'Verwijderen',
'retry' => 'Opnieuw proberen',
'no_platforms' => 'Geen gekoppelde accounts',
'connect_first' => 'Koppel ten minste één social account om AI-generatie te gebruiken.',
'no_account_for_template' => 'Koppel een compatibel account om dit sjabloon te gebruiken.',
'format' => [
'instagram_feed' => 'Instagram-feedpost',
'instagram_carousel' => 'Instagram-carrousel',
'linkedin_post' => 'LinkedIn-post',
'linkedin_page_post' => 'LinkedIn-paginapost',
'x_post' => 'X-post',
'bluesky_post' => 'Bluesky-post',
'threads_post' => 'Threads-post',
'mastodon_post' => 'Mastodon-post',
'telegram_post' => 'Telegram-post',
'discord_message' => 'Discord-bericht',
'facebook_post' => 'Facebook-post',
'pinterest_pin' => 'Pinterest-pin',
'instagram_story' => 'Instagram-story',
'facebook_story' => 'Facebook-story',
],
],
],
];