Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
< ? php
declare ( strict_types = 1 );
return [
'title' => 'Gönderiler' ,
'search' => 'Gönderi ara...' ,
'all_posts' => 'Tüm Gönderiler' ,
'new_post' => 'Yeni Gönderi' ,
'no_posts' => 'Gönderi bulunamadı ' ,
'no_search_results' => 'Aramanı zla eşleşen gönderi yok' ,
'try_different_search' => 'Farklı bir anahtar kelime deneyin veya aramayı temizleyin.' ,
'start_creating' => 'İlk gönderinizi oluşturarak başlayı n.' ,
'filter_by_label' => 'Etikete göre filtrele' ,
'label_search_placeholder' => 'Etiket ara...' ,
'no_labels' => 'Etiket bulunamadı .' ,
'clear_label_filter' => 'Etiket filtresini temizle' ,
'table' => [
'post' => 'Gönderi' ,
'status' => 'Durum' ,
'content' => 'İçerik' ,
'platforms' => 'Platformlar' ,
'labels' => 'Etiketler' ,
'scheduled_at' => 'Tarih' ,
'actions' => '' ,
],
'manage_posts' => 'Tüm gönderilerinizi yönetin' ,
'delete_confirm' => 'Bu gönderiyi silmek istediğinizden emin misiniz?' ,
'by' => 'gönderen' ,
'actions' => [
'view' => 'Gönderiyi görüntüle' ,
'delete' => 'Sil' ,
'duplicate' => 'Çoğalt' ,
'copy_id' => 'Kimliği kopyala' ,
'copied' => 'Kimlik panoya kopyalandı ' ,
],
'form' => [
'post_type' => 'Gönderi Türü' ,
'board' => 'Pano' ,
'select_board' => 'Bir pano seçin' ,
'search_board' => 'Pano ara...' ,
'no_board_found' => 'Pano bulunamadı ' ,
'media' => 'Medya' ,
'min' => 'En az' ,
'uploading' => 'Yükleniyor...' ,
'drop_to_upload' => 'Yüklemek için bı rakı n' ,
'drag_and_drop' => 'Sürükleyip bı rakı n veya yüklemek için tı klayı n' ,
'photos_and_videos' => 'Fotoğraflar ve videolar' ,
'photos_only' => 'Yalnı zca fotoğraflar' ,
'videos_only' => 'Yalnı zca videolar' ,
'drag_to_reorder' => 'Yeniden sı ralamak için sürükleyin' ,
'caption' => 'Açı klama' ,
'write_caption' => 'Açı klamanı zı yazı n...' ,
'content_exceeds_platform' => ':platform: :over karakter fazla (en fazla :limit).' ,
'tiktok' => [
'settings' => 'TikTok Ayarları ' ,
'variant_label' => 'Gönderi türü' ,
'variant' => [
'video' => 'Video' ,
'photo' => 'Fotoğraf karuseli' ,
],
'posting_to' => 'Şuraya paylaşı lı yor' ,
'privacy_level' => 'Bu videoyu kim görebilir?' ,
'privacy_placeholder' => 'Bu gönderiyi kimin görebileceğini seçin' ,
'privacy' => [
'public' => 'Herkese açı k' ,
'friends' => 'Karşı lı klı takipleşilen arkadaşlar' ,
'followers' => 'Takipçiler' ,
'private' => 'Yalnı zca ben' ,
'private_disabled_branded' => 'Markalı içerik görünürlüğü özel olarak ayarlanamaz.' ,
],
'privacy_hint' => 'Mevcut seçenekler TikTok hesap ayarları nı za bağlı dı r.' ,
'auto_add_music' => 'Otomatik müzik ekle' ,
'auto_add_music_hint' => 'Bu özellik yalnı zca fotoğraflar için kullanı labilir. Daha sonra değiştirebileceğiniz varsayı lan bir müzik ekler.' ,
'yes' => 'Evet' ,
'no' => 'Hayı r' ,
'allow_users' => 'Kullanı cı ları n şunlara izin ver:' ,
'comments' => 'Yorum yapma' ,
'duet' => 'Düet' ,
'stitch' => 'Birleştirme (Stitch)' ,
'is_aigc' => 'AI ile yapı lan video' ,
'disclose' => 'Video içeriğini beyan et' ,
'disclose_hint' => 'Bu videonun bir değer karşı lı ğı nda ürün veya hizmet tanı ttı ğı nı beyan etmek için açı n. Videonuz sizi, üçüncü bir tarafı veya her ikisini de tanı tabilir.' ,
'promotional_organic_title' => 'Fotoğrafı nı z/videonuz "Tanı tı m içeriği" olarak etiketlenecek.' ,
'promotional_paid_title' => 'Fotoğrafı nı z/videonuz "Ücretli ortaklı k" olarak etiketlenecek.' ,
'promotional_description' => 'Bu, videonuz paylaşı ldı ktan sonra değiştirilemez.' ,
'compliance_incomplete' => 'İçeriğinizin sizi mi, üçüncü bir tarafı mı yoksa her ikisini mi tanı ttı ğı nı belirtmeniz gerekir.' ,
'privacy_required' => 'Yayı nlarken TikTok gizlilik düzeyi gereklidir.' ,
'branded_cleared_private' => 'Markalı İçerik özel olamayacağı için gizlilik temizlendi.' ,
'interaction_disabled_by_creator' => 'TikTok hesap ayarları nı zda kapalı ' ,
'max_duration_exceeded' => 'Video :duration sn uzunluğunda ancak bu hesap yalnı zca :max sn\'ye kadar video paylaşabilir.' ,
'processing_hint' => 'Yayı nladı ktan sonra, içeriğin işlenip TikTok profilinizde görünmesi birkaç dakika sürebilir.' ,
'brand_organic' => 'Markanı z' ,
'brand_organic_hint' => 'Kendinizi veya kendi markanı zı tanı tı yorsunuz. Bu video Marka Organik olarak sı nı flandı rı lacak.' ,
'brand_content' => 'Markalı içerik' ,
'brand_content_hint' => 'Başka bir markayı veya üçüncü bir tarafı tanı tı yorsunuz. Bu video Markalı İçerik olarak sı nı flandı rı lacak.' ,
'compliance' => [
'agree' => 'Paylaşarak, TikTok\'un şunları nı kabul etmiş olursunuz:' ,
'music_usage' => 'Müzik Kullanı m Onayı ' ,
'and' => 've' ,
'branded_policy' => 'Markalı İçerik Politikası ' ,
],
],
'instagram' => [
'settings' => 'Instagram Ayarları ' ,
'posting_to' => 'Şuraya paylaşı lı yor' ,
'variant_label' => 'Gönderi türü' ,
'variant' => [
'feed' => 'Akı ş Gönderisi' ,
'reel' => 'Reel' ,
'story' => 'Hikaye' ,
],
'aspect_label' => 'En boy oranı ' ,
'aspect' => [
'square' => 'Kare (1:1)' ,
'portrait' => 'Dikey (4:5)' ,
'landscape' => 'Yatay (16:9)' ,
'original' => 'Orijinal' ,
],
],
'facebook' => [
'settings' => 'Facebook Ayarları ' ,
'posting_to' => 'Şuraya paylaşı lı yor' ,
'variant_label' => 'Gönderi türü' ,
'variant' => [
'post' => 'Gönderi' ,
'reel' => 'Reel' ,
'story' => 'Hikaye' ,
],
'aspect_label' => 'En boy oranı ' ,
'aspect' => [
'square' => 'Kare (1:1)' ,
'portrait' => 'Dikey (4:5)' ,
'landscape' => 'Yatay (16:9)' ,
'original' => 'Orijinal' ,
],
],
'linkedin' => [
'settings' => 'LinkedIn Ayarları ' ,
'settings_page' => 'LinkedIn Sayfa Ayarları ' ,
'posting_to' => 'Şuraya paylaşı lı yor' ,
'document_title' => 'Belge başlı ğı ' ,
'document_title_placeholder' => 'PDF belge gönderinizde gösterilir' ,
],
'pinterest' => [
'settings' => 'Pinterest Ayarları ' ,
'posting_to' => 'Şuraya paylaşı lı yor' ,
'variant_label' => 'Pin türü' ,
'variant' => [
'pin' => 'Pin' ,
'video_pin' => 'Video Pin' ,
'carousel' => 'Karusel' ,
],
'board' => 'Pano' ,
'select_board' => 'Bir pano seçin' ,
'no_boards' => 'Pinterest panosu bulunamadı . Önce Pinterest hesabı nı zda bir tane oluşturun.' ,
2026-07-25 02:02:40 +00:00
'boards_truncated' => 'Bazı panolar yüklenemedi. Sizinki eksikse Pinterest’ i açı p tekrar deneyin.' ,
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
'search_board' => 'Pano ara...' ,
'no_board_found' => 'Aramanı zla eşleşen pano yok.' ,
'board_required' => 'Bu gönderiyi yayı nlamak için bir Pinterest panosu seçin.' ,
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' => 'Başlı k' ,
'title_placeholder' => 'İsteğe bağlı pin başlı ğı ' ,
'link' => 'Hedef bağlantı ' ,
'link_placeholder' => 'https://ornek.com' ,
'link_invalid' => 'Geçerli bir hedef bağlantı sı girin (http veya https).' ,
'title_max' => 'Başlı k en fazla 100 karakter olabilir.' ,
'link_max' => 'Hedef bağlantı sı en fazla 2048 karakter olabilir.' ,
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
],
'discord' => [
'settings' => 'Discord Ayarları ' ,
'posting_to' => 'Şuraya paylaşı lı yor' ,
'channel' => 'Kanal' ,
'select_channel' => 'Bir kanal seçin' ,
'loading_channels' => 'Kanallar yükleniyor…' ,
'search_channel' => 'Kanal ara…' ,
'no_channels' => 'Kanal bulunamadı .' ,
'channel_required' => 'Bu gönderiyi yayı nlamak için bir Discord kanalı seçin.' ,
'mentions' => 'Etiketlemeler' ,
'search_mention' => 'Bir rolü veya üyeyi etiketle…' ,
'embeds' => 'Yerleştirmeler' ,
'embed' => 'Yerleştirme' ,
'add_embed' => 'Yerleştirme ekle' ,
'embed_title' => 'Yerleştirme başlı ğı ' ,
'embed_description' => 'Yerleştirme açı klaması ' ,
'embed_url' => 'Yerleştirme URL\'si' ,
'embed_image' => 'Görsel URL\'si' ,
'embed_color' => 'Renk' ,
],
'warnings' => [
'no_variant' => 'Devam etmek için bir gönderi türü seçin.' ,
'requires_media' => 'Bu gönderi türü en az bir görsel veya video gerektirir.' ,
'max_files_exceeded' => 'Bu gönderi türü en fazla :max medya dosyası kabul eder (sizde :current var).' ,
'min_files_required' => 'Bu gönderi türü en az :min medya dosyası gerektirir (sizde :current var).' ,
'no_video_allowed' => 'Bu gönderi türü video kabul etmez.' ,
'no_image_allowed' => 'Bu gönderi türü yalnı zca video kabul eder.' ,
'no_document_allowed' => 'Bu gönderi türü PDF belge kabul etmez.' ,
'no_mixed_media' => 'Görseller ve bir video aynı gönderide birleştirilemez.' ,
'document_not_alone' => 'Bir PDF, başka görsel veya video olmadan tek başı na paylaşı lmalı dı r.' ,
'gif_not_allowed' => 'Bu platform GIF kabul etmez. GIF\'i kaldı rı n veya farklı bir ağ seçin.' ,
'image_too_large' => 'Görsel, bu gönderi türü için :max sı nı rı nı aşı yor (sizinki :current).' ,
'video_too_large' => 'Video, bu gönderi türü için :max sı nı rı nı aşı yor (sizinki :current).' ,
'document_too_large' => 'PDF, bu gönderi türü için :max sı nı rı nı aşı yor (sizinki :current).' ,
'video_too_long' => 'Video :current uzunluğunda ancak bu gönderi türü en fazla :max izin verir.' ,
'aspect_ratio_too_narrow' => ':current en boy oranı bu gönderi türü için fazla uzun (en az :min).' ,
'aspect_ratio_too_wide' => ':current en boy oranı bu gönderi türü için fazla geniş (en fazla :max).' ,
],
],
'status' => [
'pending' => 'Beklemede' ,
'draft' => 'Taslak' ,
'scheduled' => 'Zamanlandı ' ,
'publishing' => 'Yayı nlanı yor' ,
'retrying' => 'Yeniden deneniyor' ,
'published' => 'Yayı nlandı ' ,
'partially_published' => 'Kı smen Yayı nlandı ' ,
'failed' => 'Başarı sı z' ,
],
'descriptions' => [
'draft' => 'Zamanlanmayı bekleyen gönderiler' ,
'scheduled' => 'Yayı nlanmak üzere zamanlanan gönderiler' ,
'published' => 'Zaten yayı nlanmı ş gönderiler' ,
],
'ai' => [
'generate' => [
'button_tooltip' => 'AI ile oluştur' ,
'title' => 'AI ile gönderi oluştur' ,
'description' => 'Gönderinin ne hakkı nda olması gerektiğini açı klayı n. AI, onu yazmak için marka bağlamı nı zı kullanacak.' ,
'prompt_label' => 'Bu gönderi ne hakkı nda?' ,
'prompt_placeholder' => 'örn. Karuseller için yeni görsel oluşturma özelliğimizi duyur' ,
'preview_label' => 'Önizleme' ,
'start' => 'Oluştur' ,
'apply' => 'Bu içeriği kullan' ,
'retry' => 'Tekrar dene' ,
'cancel' => 'İptal' ,
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' => 'Oluşturma başlatı lamadı .' ,
'generation_failed' => 'AI oluşturma başarı sı z oldu.' ,
],
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
],
'review' => [
'button_tooltip' => 'AI ile incele' ,
'title' => 'AI ile gönderiyi incele' ,
'description' => 'AI dil bilgisi, yazı m ve açı klı k açı sı ndan tarar. Katı ldı ğı nı z önerileri uygulayı n.' ,
'loading' => 'Metniniz inceleniyor...' ,
'no_issues' => 'Sorun bulunamadı . İyi görünüyor.' ,
'original' => 'Orijinal' ,
'suggestion' => 'Öneri' ,
'apply' => 'Uygula' ,
'apply_all' => 'Tümünü uygula' ,
'applied' => 'Uygulandı ' ,
'cancel' => 'İptal' ,
],
'image_regenerate' => [
'button' => 'Ayarla' ,
'title' => 'AI görselini ayarla' ,
'description' => 'Düzeltmeyi açı klayı n. Yeni görsel mevcut olanı n yerini alı r ve karuseldeki konumunu korur.' ,
'instruction_label' => 'Talimat' ,
'instruction_placeholder' => 'örn. Başlı ktaki yazı m hatası nı düzelt ve arka planı daha aydı nlı k yap.' ,
'processing' => 'Görsel yeniden oluşturuluyor... bu birkaç saniye sürebilir.' ,
'submit' => 'Görseli yeniden oluştur' ,
'cancel' => 'İptal' ,
'success' => 'Görsel güncellendi. Yeni sürüm, gönderinizde öncekinin yerini aldı .' ,
'fallback_title' => 'Bu görsel metnini iyileştir' ,
'errors' => [
'required' => 'Talimat gereklidir.' ,
'start_failed' => 'Yeniden oluşturma başlatı lamadı .' ,
'unavailable' => 'Şu anda bu görsel yeniden oluşturulamı yor.' ,
'timeout' => 'Yeniden oluşturma beklenenden uzun sürüyor. Birazdan tekrar deneyin.' ,
'media_not_found' => 'Medya öğesi bulunamadı .' ,
'not_ai_media' => 'Yalnı zca AI ile oluşturulan medya yeniden oluşturulabilir.' ,
],
],
'templates' => [
'image_card' => [
'name' => 'Görsel gönderisi' ,
'description' => 'Başlı k ve açı klama içeren AI görseli.' ,
],
'carousel' => [
'name' => 'Karusel' ,
'description' => 'Açı klamalı çok slaytlı karusel.' ,
],
'tweet_card' => [
'name' => 'Tweet kartı ' ,
'description' => 'X/Twitter gönderisi biçiminde gönderiniz.' ,
],
'tweet_card_image' => [
'name' => 'Fotoğraflı tweet kartı ' ,
'description' => 'Bulanı k bir fotoğrafı n üzerinde X/Twitter kartı olarak gönderiniz.' ,
],
],
],
'show' => [
'title' => 'Gönderi Ayrı ntı ları ' ,
'edit' => 'Düzenle' ,
'back' => 'Geri' ,
'no_content' => 'Açı klama yok' ,
'platforms' => 'Platformlar' ,
'no_platforms' => 'Platform seçilmedi.' ,
'view_on_platform' => 'Platformda görüntüle' ,
'published_on' => ':date tarihinde yayı nlandı ' ,
'scheduled_for' => ':date için zamanlandı ' ,
'draft' => 'Taslak' ,
'status_pending' => 'Beklemede' ,
'metrics' => 'Metrikler' ,
'metrics_loading' => 'Metrikler yükleniyor…' ,
'metrics_unavailable' => 'Bu platform için metrikler henüz kullanı lamı yor.' ,
'metrics_empty' => 'Metrik döndürülmedi.' ,
],
'edit' => [
'title' => 'Gönderiyi Düzenle' ,
'view_title' => 'Gönderiyi Görüntüle' ,
'labels' => 'Etiketler' ,
'no_labels' => 'Henüz etiket oluşturulmadı ' ,
'schedule' => 'Zamanla' ,
'pick_time' => 'Saat seç' ,
'pick_time_past' => 'Gelecek bir tarih ve saat seçin.' ,
'post_now' => 'Şimdi paylaş' ,
'time' => 'Saat' ,
'cancel' => 'İptal' ,
'delete' => 'Sil' ,
'schedule_for' => 'Şunun için zamanla' ,
'schedule_date' => 'Zamanlama tarihi' ,
'unschedule' => 'Zamanlamayı kaldı r' ,
'saving' => 'Kaydediliyor...' ,
'saved' => 'Kaydedildi' ,
'draft' => 'Taslak' ,
'media' => 'Medya' ,
'add_media' => 'Medya ekle' ,
'caption' => 'Açı klama' ,
'caption_placeholder' => 'Açı klamanı zı yazı n...' ,
'compose_title' => 'Bir gönderi oluşturun' ,
'compose_subtitle' => 'Mesajı nı zı yazı n ve medya ekleyin' ,
'preview_empty' => [
'title' => 'Platform seçilmedi' ,
'description' => 'Önizlemeyi görmek için yayı nlanacak bir platform seçin.' ,
],
'drop_zone_title' => 'Medya ekle' ,
'drop_zone_subtitle' => 'Dosyaları sürükleyip bı rakı n veya göz atmak için tı klayı n' ,
'add' => 'Ekle' ,
'publish_to' => 'Şuraya yayı nla' ,
'organize' => 'Düzenle' ,
'signatures' => 'İmzalar' ,
'view_on_platform' => 'Platformda görüntüle' ,
'platform_status' => 'Platform durumu' ,
'compliance_incomplete' => 'Bazı platform ayarları eksik veya eklenen medyayla uyumsuz.' ,
'compliance' => [
'requires_content_or_media' => 'Yayı nlamak için metin veya medya ekleyin.' ,
'requires_media' => 'Burada yayı nlamak için bir görsel veya video ekleyin.' ,
'too_many_files' => 'Bu format için yalnı zca :max dosyaya izin verilir.' ,
'too_few_files' => 'Bu format için en az :min dosya ekleyin.' ,
'no_videos' => 'Bu format için yalnı zca görsellere izin verilir.' ,
'no_images' => 'Bu format için yalnı zca videolara izin verilir.' ,
'no_mixed_media' => 'Görseller ve videolar aynı gönderide birleştirilemez.' ,
'no_gifs' => 'Burada GIF desteklenmez.' ,
'no_documents' => 'PDF belgeler bu format tarafı ndan desteklenmez.' ,
'document_not_alone' => 'Bir PDF, başka görsel veya video olmadan tek başı na paylaşı lmalı dı r.' ,
'video_too_large' => 'Video, bu platformun boyut sı nı rı nı aşı yor.' ,
'video_too_long' => 'Video bu format için :seconds saniyenin altı nda olmalı dı r.' ,
'image_too_large' => 'Görsel, bu platformun boyut sı nı rı nı aşı yor.' ,
'document_too_large' => 'PDF, bu platformun boyut sı nı rı nı aşı yor.' ,
'aspect_ratio_invalid' => 'En boy oranı bu format tarafı ndan desteklenmez.' ,
'no_content_type' => 'Bu platform için bir içerik türü seçin.' ,
'requires_text' => 'Metin ekleyin — bu format bir başlı k gerektiriyor.' ,
],
'publishing' => 'Yayı nlanı yor...' ,
'publishing_overlay_title' => 'Gönderiniz yayı nlanı yor' ,
'publishing_overlay_subtitle' => 'Bu birkaç dakika sürebilir. Bu sayfadan güvenle ayrı labilirsiniz.' ,
'scheduled_overlay_title' => 'Bu gönderi zamanlandı ' ,
'scheduled_overlay_subtitle' => ':date için zamanlandı . Değişiklik yapmak için önce zamanlamayı kaldı rı n.' ,
'unschedule_cta' => 'Düzenlemek için zamanlamayı kaldı r' ,
'tabs' => [
2026-07-17 21:38:20 +00:00
'compose' => 'Oluştur' ,
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
'preview' => 'Önizleme' ,
'channels' => 'Kanallar' ,
'comments' => 'Yorumlar' ,
'comments_empty' => 'Henüz yorum yok.' ,
],
'media_picker' => [
'title' => 'Galeriden seç' ,
'search' => 'Medya ara...' ,
'empty' => 'Galerinizde henüz medya yok' ,
'cancel' => 'İptal' ,
'add' => 'Ekle' ,
'add_count' => ':count tane ekle' ,
],
2026-07-11 12:45:52 +00:00
'alt_text' => [
'label' => 'Alternatif metin' ,
'edit' => 'Alternatif metni düzenle' ,
'placeholder' => 'Ekran okuyucu kullanan kişiler için bu görseli açı klayı n' ,
'hint' => 'Görsel açı klamaları nı destekleyen platformlarda yayı nlanı r.' ,
'save' => 'Kaydet' ,
],
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
'emoji_picker' => [
'search' => 'Emoji ara' ,
'empty' => 'Emoji bulunamadı ' ,
'recent' => 'Sı k kullanı lanlar' ,
'smileys' => 'İfadeler ve duygular' ,
'people' => 'İnsanlar ve beden' ,
'nature' => 'Hayvanlar ve doğa' ,
'food' => 'Yiyecek ve içecek' ,
'activities' => 'Etkinlikler' ,
'travel' => 'Seyahat ve yerler' ,
'objects' => 'Nesneler' ,
'symbols' => 'Semboller' ,
'flags' => 'Bayraklar' ,
],
'status' => [
'pending' => 'Beklemede' ,
'scheduled' => 'Zamanlandı ' ,
'published' => 'Yayı nlandı ' ,
'publishing' => 'Yayı nlanı yor...' ,
'retrying' => 'Yeniden deneniyor...' ,
'failed' => 'Başarı sı z' ,
],
'delete_modal' => [
'title' => 'Gönderiyi Sil' ,
'description' => 'Bu gönderiyi silmek istediğinizden emin misiniz? Bu işlem geri alı namaz.' ,
'action' => 'Sil' ,
'cancel' => 'İptal' ,
],
'sync_enable' => [
'title' => 'Senkronizasyon etkinleştirilsin mi?' ,
'description' => 'Tüm platformlar aynı içeriği paylaşacak. Tek tek platformlara yapı lan özel düzenlemeler mevcut içerikle değiştirilecek.' ,
'cancel' => 'İptal' ,
'action' => 'Senkronizasyonu etkinleştir' ,
],
'sync_disable' => [
'title' => 'Senkronizasyon devre dı şı bı rakı lsı n mı ?' ,
'description' => 'Her platform mevcut içeriğini koruyacak, ancak gelecekteki düzenlemeler yalnı zca düzenlediğiniz platforma uygulanacak.' ,
'customize_note' => 'İçeriği her platform için ayrı ayrı özelleştirebileceksiniz.' ,
'cancel' => 'İptal' ,
'action' => 'Senkronizasyonu devre dı şı bı rak' ,
],
'platforms_dialog' => [
'title' => 'Platformları Seç' ,
'description' => 'Bu gönderinin hangi platformlarda yayı nlanacağı nı seçin.' ,
],
'signatures_modal' => [
'search' => 'İmza ara...' ,
'no_results' => 'İmza bulunamadı .' ,
],
'validation' => [
'select_board' => 'Bir pano seçin' ,
'images_not_supported' => 'Görseller desteklenmiyor' ,
'videos_not_supported' => 'Videolar desteklenmiyor' ,
'max_images' => 'En fazla :count görsel' ,
'requires_media' => 'Medya gerekli' ,
'requires_content' => 'Metin içeriği gereklidir' ,
'exceeded' => ':count aşı ldı ' ,
'does_not_support_images' => ':platform görselleri desteklemiyor' ,
'supports_up_to_images' => ':platform en fazla :count görsel destekliyor' ,
'does_not_support_videos' => ':platform videoları desteklemiyor' ,
],
],
'content_types' => [
'instagram_feed' => [
'label' => 'Akı ş Gönderisi' ,
'description' => 'Akı şı nı zda ve profilinizde görünür' ,
],
'instagram_reel' => [
'label' => 'Reel' ,
2026-07-25 00:21:39 +00:00
'description' => '15 dakikaya kadar kı sa video' ,
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
],
'instagram_story' => [
'label' => 'Hikaye' ,
'description' => '24 saat sonra kaybolur' ,
],
'linkedin_post' => [
'label' => 'Gönderi' ,
'description' => 'Standart gönderi — tek görsel, çoklu görsel, video veya PDF' ,
],
'linkedin_page_post' => [
'label' => 'Gönderi' ,
'description' => 'Standart gönderi — tek görsel, çoklu görsel, video veya PDF' ,
],
'facebook_post' => [
'label' => 'Gönderi' ,
'description' => 'Sayfanı zda standart gönderi' ,
],
'facebook_reel' => [
'label' => 'Reel' ,
'description' => '90 saniyeye kadar kı sa video' ,
],
'facebook_story' => [
'label' => 'Hikaye' ,
'description' => 'Dikey video hikayesi, 60 saniyeye kadar' ,
],
'tiktok_video' => [
'label' => 'Video' ,
'description' => 'Kı sa biçimli video içeriği' ,
],
'tiktok_photo' => [
'label' => 'Fotoğraf karuseli' ,
'description' => 'Kaydı rı labilir karusel olarak 35 fotoğrafa kadar' ,
],
'youtube_short' => [
'label' => 'Short' ,
2026-07-23 15:06:15 +00:00
'description' => '3 dakikaya kadar dikey video' ,
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
],
'x_post' => [
'label' => 'Gönderi' ,
'description' => 'Metin ve medya içeren tweet' ,
],
'threads_post' => [
'label' => 'Gönderi' ,
'description' => 'İsteğe bağlı medya içeren metin gönderisi' ,
],
'pinterest_pin' => [
'label' => 'Pin' ,
'description' => 'Standart görsel pin' ,
],
'pinterest_video_pin' => [
'label' => 'Video Pin' ,
'description' => 'Video pin (4 sn - 15 dk)' ,
],
'pinterest_carousel' => [
'label' => 'Karusel' ,
'description' => 'Çoklu görsel karusel (2-5 görsel)' ,
],
'bluesky_post' => [
'label' => 'Gönderi' ,
'description' => 'İsteğe bağlı görsel içeren metin gönderisi' ,
],
'mastodon_post' => [
'label' => 'Gönderi' ,
'description' => 'İsteğe bağlı medya içeren metin gönderisi' ,
],
'telegram_post' => [
'label' => 'Gönderi' ,
'description' => 'İsteğe bağlı medya içeren metin gönderisi' ,
],
'discord_message' => [
'label' => 'Mesaj' ,
'description' => 'İsteğe bağlı medya ve yerleştirmeler içeren Discord kanalı na mesaj' ,
],
],
'platforms' => [
'linkedin' => 'LinkedIn' ,
'linkedin-page' => 'LinkedIn Sayfası ' ,
'x' => 'X' ,
'tiktok' => 'TikTok' ,
'youtube' => 'YouTube Shorts' ,
'facebook' => 'Facebook Sayfası ' ,
'instagram' => 'Instagram' ,
'threads' => 'Threads' ,
'pinterest' => 'Pinterest' ,
'bluesky' => 'Bluesky' ,
'mastodon' => 'Mastodon' ,
],
'flash' => [
'scheduled' => 'Gönderi başarı yla zamanlandı !' ,
'deleted' => 'Gönderi başarı yla silindi!' ,
'duplicated' => 'Gönderi taslak olarak çoğaltı ldı .' ,
'cannot_edit_finalized' => 'Bu gönderi zaten işlendi ve yeniden yayı nlanamaz. Yeniden denemek için çoğaltı n.' ,
'cannot_delete_published' => 'Yayı nlanmı ş gönderiler silinemez.' ,
'connect_first' => 'Gönderi oluşturmadan önce en az bir sosyal ağ bağlayı n.' ,
],
'errors' => [
'account_disconnected' => 'Sosyal hesabı n bağlantı sı kesildi' ,
'account_inactive' => 'Sosyal hesap devre dı şı bı rakı ldı ' ,
'account_token_expired' => 'Sosyal hesap oturumunun süresi doldu — lütfen yeniden bağlanı n' ,
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' => 'Platform geçici olarak kullanı lamı yor. Kı sa süre içinde yeniden deneyeceğiz.' ,
'platform_unavailable_exhausted' => 'Platform birkaç denemeden sonra kullanı lamaz kaldı . Lütfen daha sonra tekrar deneyin.' ,
'publishing_timed_out' => 'Yayı nlama zaman aşı mı na uğradı . Lütfen tekrar deneyin.' ,
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
],
'delete' => [
'title' => 'Gönderi silinsin mi?' ,
'description' => 'Bu işlem geri alı namaz. Gönderi ve tüm medyası kalı cı olarak kaldı rı lacak.' ,
'confirm' => 'Evet, sil' ,
'cancel' => 'İptal' ,
],
'create' => [
'title' => 'Yeni bir gönderi oluştur' ,
'description' => 'Nası l başlamak istediğinizi seçin.' ,
'scratch_title' => 'Sı fı rdan başla' ,
'scratch_description' => 'Boş bir gönderi açı n ve her şeyi kendiniz yazı n.' ,
'ai_title' => 'AI ile oluştur' ,
'ai_description' => 'İstediğinizi açı klayı n, AI içeriği sizin için oluştursun.' ,
'ai_configure_description' => 'Bir format seçin ve oluşturmak istediğiniz gönderiyi açı klayı n.' ,
'ai_pick_template_description' => 'AI ile oluşturulan gönderiniz için bir stil seçin.' ,
'coming_soon' => 'Yakı nda' ,
'preview' => [
'image_title' => 'Görsel başlı ğı ' ,
'image_body' => 'Görsel gövdesi' ,
],
'steps' => [
'template_picker_title' => 'Bir stil seçin' ,
'format_title' => 'Bir format seçin' ,
'format_description' => 'Oluşturmak istediğiniz gönderi türünü seçin.' ,
'account_title' => 'Bir hesap seçin' ,
'account_description' => 'Yayı nlanacak sosyal hesabı seçin.' ,
'media_title' => 'Medya seçenekleri' ,
'media_carousel' => 'Kaç slayt?' ,
'media_optional' => 'Görsel eklensin mi?' ,
'media_optional_label' => 'Kaç görsel?' ,
'media_none' => 'Hiçbiri' ,
'media_count_label' => 'Görsel sayı sı ' ,
2026-07-18 18:12:26 +00:00
'brand_colors_label' => 'Marka renkleri' ,
'brand_colors_description' => 'Oluşturulan görsellere çalı şma alanı nı zı n marka paletini uygular. Yapay zekânı n içeriğe uygun renkleri seçmesi için kapatı n.' ,
Translate the interface into 12 languages
Add full lang/ translations for fr, de, it, nl, pl, el, ja, ko, zh, ru,
tr, and ar — all 23 base files each, with identical key trees to lang/en,
preserved :placeholders and plural forms, and native product terminology.
2026-07-03 18:38:40 +00:00
'prompt_title' => 'Gönderinizi açı klayı n' ,
'prompt_label' => 'Bu gönderi ne hakkı nda?' ,
'prompt_placeholder' => 'örn. Instagram için yeni karusel özelliğimizi duyur' ,
'preview_error' => 'Bir şeyler ters gitti. Lütfen tekrar deneyin.' ,
'loading_page_title' => 'Gönderiniz oluşturuluyor' ,
'loading_eta' => 'Tahmini süre: yaklaşı k :minutes.' ,
'loading_eta_minute_one' => '1 dakika' ,
'loading_eta_minute_other' => ':count dakika' ,
'loading_leave_title' => 'Çalı şmaya devam edebilirsiniz.' ,
'loading_leave_body' => 'Gönderi hazı r olduğunda sizi bilgilendireceğiz.' ,
'loading_leave_cta' => 'Takvime git' ,
'loading_create_another_cta' => 'Başka bir gönderi oluştur' ,
'loading_tip_credits' => 'Her AI görseli yaklaşı k 15 kredi kullanı r.' ,
'loading_tip_edit' => 'Gönderi hazı r olduğunda her şeyi düzenleyebileceksiniz.' ,
'loading_tip_draft' => 'Oluşturulan gönderiler taslakları nı za gider.' ,
'loading_tip_brand' => 'Gelecekteki gönderileri etkilemek için marka ayarları nı zı düzenleyin.' ,
'loading_tip_carousel' => 'Karuseller yüklenen her görsel için bir slayt sunar.' ,
'loading_tip_quality' => 'Görsel kalitesi, hı z ve maliyeti dengelemek için ayarlanı r.' ,
'create' => 'Gönderi oluştur' ,
'back' => 'Geri' ,
'next' => 'Devam et' ,
'cancel' => 'İptal' ,
'discard' => 'Vazgeç' ,
'retry' => 'Tekrar dene' ,
'no_platforms' => 'Bağlı hesap yok' ,
'connect_first' => 'AI oluşturmayı kullanmak için en az bir sosyal hesap bağlayı n.' ,
'no_account_for_template' => 'Bu şablonu kullanmak için uyumlu bir hesap bağlayı n.' ,
'format' => [
'instagram_feed' => 'Instagram Akı ş Gönderisi' ,
'instagram_carousel' => 'Instagram Karuseli' ,
'linkedin_post' => 'LinkedIn Gönderisi' ,
'linkedin_page_post' => 'LinkedIn Sayfa Gönderisi' ,
'x_post' => 'X Gönderisi' ,
'bluesky_post' => 'Bluesky Gönderisi' ,
'threads_post' => 'Threads Gönderisi' ,
'mastodon_post' => 'Mastodon Gönderisi' ,
'telegram_post' => 'Telegram Gönderisi' ,
'discord_message' => 'Discord Mesajı ' ,
'facebook_post' => 'Facebook Gönderisi' ,
'pinterest_pin' => 'Pinterest Pin\'i' ,
'instagram_story' => 'Instagram Hikayesi' ,
'facebook_story' => 'Facebook Hikayesi' ,
],
],
],
];