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
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
'title' => '게시물',
|
|
|
|
|
'search' => '게시물 검색...',
|
|
|
|
|
'all_posts' => '모든 게시물',
|
|
|
|
|
'new_post' => '새 게시물',
|
|
|
|
|
'no_posts' => '게시물을 찾을 수 없습니다',
|
|
|
|
|
'no_search_results' => '검색과 일치하는 게시물이 없습니다',
|
|
|
|
|
'try_different_search' => '다른 키워드로 시도하거나 검색을 지우세요.',
|
|
|
|
|
'start_creating' => '첫 게시물을 만들어 시작하세요.',
|
|
|
|
|
'filter_by_label' => '라벨로 필터',
|
|
|
|
|
'label_search_placeholder' => '라벨 검색...',
|
|
|
|
|
'no_labels' => '라벨을 찾을 수 없습니다.',
|
|
|
|
|
'clear_label_filter' => '라벨 필터 지우기',
|
|
|
|
|
'table' => [
|
|
|
|
|
'post' => '게시물',
|
|
|
|
|
'status' => '상태',
|
|
|
|
|
'content' => '내용',
|
|
|
|
|
'platforms' => '플랫폼',
|
|
|
|
|
'labels' => '라벨',
|
|
|
|
|
'scheduled_at' => '날짜',
|
|
|
|
|
'actions' => '',
|
|
|
|
|
],
|
|
|
|
|
'manage_posts' => '모든 게시물 관리',
|
|
|
|
|
'delete_confirm' => '이 게시물을 삭제하시겠습니까?',
|
|
|
|
|
'by' => '작성자',
|
|
|
|
|
|
|
|
|
|
'actions' => [
|
|
|
|
|
'view' => '게시물 보기',
|
|
|
|
|
'delete' => '삭제',
|
|
|
|
|
'duplicate' => '복제',
|
|
|
|
|
'copy_id' => 'ID 복사',
|
|
|
|
|
'copied' => 'ID가 클립보드에 복사되었습니다',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'form' => [
|
|
|
|
|
'post_type' => '게시물 유형',
|
|
|
|
|
'board' => '보드',
|
|
|
|
|
'select_board' => '보드 선택',
|
|
|
|
|
'search_board' => '보드 검색...',
|
|
|
|
|
'no_board_found' => '보드를 찾을 수 없습니다',
|
|
|
|
|
'media' => '미디어',
|
|
|
|
|
'min' => '최소',
|
|
|
|
|
'uploading' => '업로드 중...',
|
|
|
|
|
'drop_to_upload' => '놓아서 업로드',
|
|
|
|
|
'drag_and_drop' => '끌어다 놓거나 클릭하여 업로드',
|
|
|
|
|
'photos_and_videos' => '사진 및 동영상',
|
|
|
|
|
'photos_only' => '사진만',
|
|
|
|
|
'videos_only' => '동영상만',
|
|
|
|
|
'drag_to_reorder' => '드래그하여 순서 변경',
|
|
|
|
|
'caption' => '캡션',
|
|
|
|
|
'write_caption' => '캡션을 작성하세요...',
|
|
|
|
|
'content_exceeds_platform' => ':platform: :over자 초과 (최대 :limit자).',
|
|
|
|
|
'tiktok' => [
|
|
|
|
|
'settings' => 'TikTok 설정',
|
|
|
|
|
'variant_label' => '게시물 유형',
|
|
|
|
|
'variant' => [
|
|
|
|
|
'video' => '동영상',
|
|
|
|
|
'photo' => '사진 캐러셀',
|
|
|
|
|
],
|
|
|
|
|
'posting_to' => '게시 대상',
|
|
|
|
|
'privacy_level' => '이 동영상을 볼 수 있는 사람은?',
|
|
|
|
|
'privacy_placeholder' => '이 게시물을 볼 수 있는 사람을 선택하세요',
|
|
|
|
|
'privacy' => [
|
|
|
|
|
'public' => '전체 공개',
|
|
|
|
|
'friends' => '맞팔로우 친구',
|
|
|
|
|
'followers' => '팔로워',
|
|
|
|
|
'private' => '나만 보기',
|
|
|
|
|
'private_disabled_branded' => '브랜디드 콘텐츠는 공개 범위를 나만 보기로 설정할 수 없습니다.',
|
|
|
|
|
],
|
|
|
|
|
'privacy_hint' => '사용 가능한 옵션은 TikTok 계정 설정에 따라 다릅니다.',
|
|
|
|
|
'auto_add_music' => '음악 자동 추가',
|
|
|
|
|
'auto_add_music_hint' => '이 기능은 사진에만 사용할 수 있습니다. 나중에 변경할 수 있는 기본 음악이 추가됩니다.',
|
|
|
|
|
'yes' => '예',
|
|
|
|
|
'no' => '아니요',
|
|
|
|
|
'allow_users' => '사용자에게 다음을 허용:',
|
|
|
|
|
'comments' => '댓글',
|
|
|
|
|
'duet' => '듀엣',
|
|
|
|
|
'stitch' => '스티치',
|
|
|
|
|
'is_aigc' => 'AI로 제작한 동영상',
|
|
|
|
|
'disclose' => '동영상 콘텐츠 공개',
|
|
|
|
|
'disclose_hint' => '이 동영상이 대가를 받고 상품이나 서비스를 홍보함을 공개하려면 켜세요. 동영상은 본인, 서드파티 또는 둘 다를 홍보할 수 있습니다.',
|
|
|
|
|
'promotional_organic_title' => '사진/동영상에 "홍보 콘텐츠" 라벨이 표시됩니다.',
|
|
|
|
|
'promotional_paid_title' => '사진/동영상에 "유료 파트너십" 라벨이 표시됩니다.',
|
|
|
|
|
'promotional_description' => '동영상을 게시한 후에는 변경할 수 없습니다.',
|
|
|
|
|
'compliance_incomplete' => '콘텐츠가 본인, 서드파티 또는 둘 다를 홍보하는지 표시해야 합니다.',
|
|
|
|
|
'privacy_required' => '게시할 때 TikTok 공개 범위는 필수입니다.',
|
|
|
|
|
'branded_cleared_private' => '브랜디드 콘텐츠는 나만 보기로 설정할 수 없으므로 공개 범위가 초기화되었습니다.',
|
|
|
|
|
'interaction_disabled_by_creator' => 'TikTok 계정 설정에서 꺼져 있음',
|
|
|
|
|
'max_duration_exceeded' => '동영상 길이가 :duration초이지만 이 계정은 최대 :max초까지만 게시할 수 있습니다.',
|
|
|
|
|
'processing_hint' => '게시 후 콘텐츠가 처리되어 TikTok 프로필에 표시되기까지 몇 분이 걸릴 수 있습니다.',
|
|
|
|
|
'brand_organic' => '내 브랜드',
|
|
|
|
|
'brand_organic_hint' => '본인 또는 본인의 브랜드를 홍보하는 경우입니다. 이 동영상은 브랜드 오가닉으로 분류됩니다.',
|
|
|
|
|
'brand_content' => '브랜디드 콘텐츠',
|
|
|
|
|
'brand_content_hint' => '다른 브랜드나 서드파티를 홍보하는 경우입니다. 이 동영상은 브랜디드 콘텐츠로 분류됩니다.',
|
|
|
|
|
'compliance' => [
|
|
|
|
|
'agree' => '게시하면 TikTok의 다음 정책에 동의하게 됩니다:',
|
|
|
|
|
'music_usage' => '음악 사용 확인',
|
|
|
|
|
'and' => '및',
|
|
|
|
|
'branded_policy' => '브랜디드 콘텐츠 정책',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'instagram' => [
|
|
|
|
|
'settings' => 'Instagram 설정',
|
|
|
|
|
'posting_to' => '게시 대상',
|
|
|
|
|
'variant_label' => '게시물 유형',
|
|
|
|
|
'variant' => [
|
|
|
|
|
'feed' => '피드 게시물',
|
|
|
|
|
'reel' => '릴스',
|
|
|
|
|
'story' => '스토리',
|
|
|
|
|
],
|
|
|
|
|
'aspect_label' => '가로세로 비율',
|
|
|
|
|
'aspect' => [
|
|
|
|
|
'square' => '정사각형 (1:1)',
|
|
|
|
|
'portrait' => '세로 (4:5)',
|
|
|
|
|
'landscape' => '가로 (16:9)',
|
|
|
|
|
'original' => '원본',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'facebook' => [
|
|
|
|
|
'settings' => 'Facebook 설정',
|
|
|
|
|
'posting_to' => '게시 대상',
|
|
|
|
|
'variant_label' => '게시물 유형',
|
|
|
|
|
'variant' => [
|
|
|
|
|
'post' => '게시물',
|
|
|
|
|
'reel' => '릴스',
|
|
|
|
|
'story' => '스토리',
|
|
|
|
|
],
|
|
|
|
|
'aspect_label' => '가로세로 비율',
|
|
|
|
|
'aspect' => [
|
|
|
|
|
'square' => '정사각형 (1:1)',
|
|
|
|
|
'portrait' => '세로 (4:5)',
|
|
|
|
|
'landscape' => '가로 (16:9)',
|
|
|
|
|
'original' => '원본',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'linkedin' => [
|
|
|
|
|
'settings' => 'LinkedIn 설정',
|
|
|
|
|
'settings_page' => 'LinkedIn 페이지 설정',
|
|
|
|
|
'posting_to' => '게시 대상',
|
|
|
|
|
'document_title' => '문서 제목',
|
|
|
|
|
'document_title_placeholder' => 'PDF 문서 게시물에 표시됩니다',
|
|
|
|
|
],
|
|
|
|
|
'pinterest' => [
|
|
|
|
|
'settings' => 'Pinterest 설정',
|
|
|
|
|
'posting_to' => '게시 대상',
|
|
|
|
|
'variant_label' => '핀 유형',
|
|
|
|
|
'variant' => [
|
|
|
|
|
'pin' => '핀',
|
|
|
|
|
'video_pin' => '동영상 핀',
|
|
|
|
|
'carousel' => '캐러셀',
|
|
|
|
|
],
|
|
|
|
|
'board' => '보드',
|
|
|
|
|
'select_board' => '보드 선택',
|
|
|
|
|
'no_boards' => 'Pinterest 보드를 찾을 수 없습니다. 먼저 Pinterest 계정에서 보드를 만드세요.',
|
2026-07-25 02:02:40 +00:00
|
|
|
'boards_truncated' => '일부 보드를 불러오지 못했습니다. 내 보드가 없다면 Pinterest를 연 뒤 다시 시도하세요.',
|
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' => '보드 검색...',
|
|
|
|
|
'no_board_found' => '검색과 일치하는 보드가 없습니다.',
|
|
|
|
|
'board_required' => '이 게시물을 게시할 Pinterest 보드를 선택하세요.',
|
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' => '제목',
|
|
|
|
|
'title_placeholder' => '선택적 핀 제목',
|
|
|
|
|
'link' => '도착 링크',
|
|
|
|
|
'link_placeholder' => 'https://example.com',
|
|
|
|
|
'link_invalid' => '유효한 목적지 링크를 입력하세요(http 또는 https).',
|
|
|
|
|
'title_max' => '제목은 100자를 초과할 수 없습니다.',
|
|
|
|
|
'link_max' => '목적지 링크는 2048자를 초과할 수 없습니다.',
|
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 설정',
|
|
|
|
|
'posting_to' => '게시 대상',
|
|
|
|
|
'channel' => '채널',
|
|
|
|
|
'select_channel' => '채널 선택',
|
|
|
|
|
'loading_channels' => '채널을 불러오는 중…',
|
|
|
|
|
'search_channel' => '채널 검색…',
|
|
|
|
|
'no_channels' => '채널을 찾을 수 없습니다.',
|
|
|
|
|
'channel_required' => '이 게시물을 게시할 Discord 채널을 선택하세요.',
|
|
|
|
|
'mentions' => '멘션',
|
|
|
|
|
'search_mention' => '역할 또는 멤버 멘션…',
|
|
|
|
|
'embeds' => '임베드',
|
|
|
|
|
'embed' => '임베드',
|
|
|
|
|
'add_embed' => '임베드 추가',
|
|
|
|
|
'embed_title' => '임베드 제목',
|
|
|
|
|
'embed_description' => '임베드 설명',
|
|
|
|
|
'embed_url' => '임베드 URL',
|
|
|
|
|
'embed_image' => '이미지 URL',
|
|
|
|
|
'embed_color' => '색상',
|
|
|
|
|
],
|
|
|
|
|
'warnings' => [
|
|
|
|
|
'no_variant' => '계속하려면 게시물 유형을 선택하세요.',
|
|
|
|
|
'requires_media' => '이 게시물 유형에는 이미지 또는 동영상이 하나 이상 필요합니다.',
|
|
|
|
|
'max_files_exceeded' => '이 게시물 유형은 최대 :max개의 미디어 파일을 허용합니다 (현재 :current개).',
|
|
|
|
|
'min_files_required' => '이 게시물 유형에는 최소 :min개의 미디어 파일이 필요합니다 (현재 :current개).',
|
|
|
|
|
'no_video_allowed' => '이 게시물 유형은 동영상을 허용하지 않습니다.',
|
|
|
|
|
'no_image_allowed' => '이 게시물 유형은 동영상만 허용합니다.',
|
|
|
|
|
'no_document_allowed' => '이 게시물 유형은 PDF 문서를 허용하지 않습니다.',
|
|
|
|
|
'no_mixed_media' => '이미지와 동영상은 같은 게시물에 함께 넣을 수 없습니다.',
|
|
|
|
|
'document_not_alone' => 'PDF는 다른 이미지나 동영상 없이 단독으로 게시해야 합니다.',
|
|
|
|
|
'gif_not_allowed' => '이 플랫폼은 GIF를 허용하지 않습니다. GIF를 제거하거나 다른 네트워크를 선택하세요.',
|
|
|
|
|
'image_too_large' => '이미지가 이 게시물 유형의 :max 한도를 초과합니다 (현재 :current).',
|
|
|
|
|
'video_too_large' => '동영상이 이 게시물 유형의 :max 한도를 초과합니다 (현재 :current).',
|
|
|
|
|
'document_too_large' => 'PDF가 이 게시물 유형의 :max 한도를 초과합니다 (현재 :current).',
|
|
|
|
|
'video_too_long' => '동영상 길이가 :current이지만 이 게시물 유형은 최대 :max까지 허용합니다.',
|
|
|
|
|
'aspect_ratio_too_narrow' => '가로세로 비율 :current이(가) 이 게시물 유형에는 너무 세로로 깁니다 (최소 :min).',
|
|
|
|
|
'aspect_ratio_too_wide' => '가로세로 비율 :current이(가) 이 게시물 유형에는 너무 가로로 넓습니다 (최대 :max).',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'status' => [
|
|
|
|
|
'pending' => '대기 중',
|
|
|
|
|
'draft' => '초안',
|
|
|
|
|
'scheduled' => '예약됨',
|
|
|
|
|
'publishing' => '게시 중',
|
|
|
|
|
'retrying' => '재시도 중',
|
|
|
|
|
'published' => '게시됨',
|
|
|
|
|
'partially_published' => '부분 게시됨',
|
|
|
|
|
'failed' => '실패',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'descriptions' => [
|
|
|
|
|
'draft' => '예약 대기 중인 게시물',
|
|
|
|
|
'scheduled' => '게시 예약된 게시물',
|
|
|
|
|
'published' => '이미 게시된 게시물',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'ai' => [
|
|
|
|
|
'generate' => [
|
|
|
|
|
'button_tooltip' => 'AI로 생성',
|
|
|
|
|
'title' => 'AI로 게시물 생성',
|
|
|
|
|
'description' => '게시물의 내용을 설명하세요. AI가 브랜드 컨텍스트를 사용하여 작성합니다.',
|
|
|
|
|
'prompt_label' => '이 게시물은 무엇에 관한 것인가요?',
|
|
|
|
|
'prompt_placeholder' => '예: 캐러셀용 새 이미지 생성 기능 발표',
|
|
|
|
|
'preview_label' => '미리보기',
|
|
|
|
|
'start' => '생성',
|
|
|
|
|
'apply' => '이 콘텐츠 사용',
|
|
|
|
|
'retry' => '다시 시도',
|
|
|
|
|
'cancel' => '취소',
|
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' => '생성을 시작할 수 없습니다.',
|
|
|
|
|
'generation_failed' => 'AI 생성에 실패했습니다.',
|
|
|
|
|
],
|
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로 검토',
|
|
|
|
|
'title' => 'AI로 게시물 검토',
|
|
|
|
|
'description' => 'AI가 문법, 맞춤법, 명확성을 검사합니다. 동의하는 제안을 적용하세요.',
|
|
|
|
|
'loading' => '텍스트를 검토하는 중...',
|
|
|
|
|
'no_issues' => '문제가 없습니다. 좋아 보입니다.',
|
|
|
|
|
'original' => '원본',
|
|
|
|
|
'suggestion' => '제안',
|
|
|
|
|
'apply' => '적용',
|
|
|
|
|
'apply_all' => '모두 적용',
|
|
|
|
|
'applied' => '적용됨',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
],
|
|
|
|
|
'image_regenerate' => [
|
|
|
|
|
'button' => '조정',
|
|
|
|
|
'title' => 'AI 이미지 조정',
|
|
|
|
|
'description' => '수정 사항을 설명하세요. 새 이미지가 현재 이미지를 대체하고 캐러셀 내 위치를 유지합니다.',
|
|
|
|
|
'instruction_label' => '지시사항',
|
|
|
|
|
'instruction_placeholder' => '예: 헤드라인의 오타를 수정하고 배경을 더 밝게 해주세요.',
|
|
|
|
|
'processing' => '이미지를 재생성하는 중... 몇 초 정도 걸릴 수 있습니다.',
|
|
|
|
|
'submit' => '이미지 재생성',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
'success' => '이미지가 업데이트되었습니다. 새 버전이 게시물의 이전 이미지를 대체했습니다.',
|
|
|
|
|
'fallback_title' => '이 이미지 문구 개선',
|
|
|
|
|
'errors' => [
|
|
|
|
|
'required' => '지시사항은 필수입니다.',
|
|
|
|
|
'start_failed' => '재생성을 시작하지 못했습니다.',
|
|
|
|
|
'unavailable' => '지금은 이 이미지를 재생성할 수 없습니다.',
|
|
|
|
|
'timeout' => '재생성이 예상보다 오래 걸리고 있습니다. 잠시 후 다시 시도하세요.',
|
|
|
|
|
'media_not_found' => '미디어 항목을 찾을 수 없습니다.',
|
|
|
|
|
'not_ai_media' => 'AI가 생성한 미디어만 재생성할 수 있습니다.',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'templates' => [
|
|
|
|
|
'image_card' => [
|
|
|
|
|
'name' => '이미지 게시물',
|
|
|
|
|
'description' => '헤드라인과 캡션이 있는 AI 이미지.',
|
|
|
|
|
],
|
|
|
|
|
'carousel' => [
|
|
|
|
|
'name' => '캐러셀',
|
|
|
|
|
'description' => '캡션이 있는 다중 슬라이드 캐러셀.',
|
|
|
|
|
],
|
|
|
|
|
'tweet_card' => [
|
|
|
|
|
'name' => '트윗 카드',
|
|
|
|
|
'description' => 'X/Twitter 게시물 스타일의 게시물.',
|
|
|
|
|
],
|
|
|
|
|
'tweet_card_image' => [
|
|
|
|
|
'name' => '사진이 있는 트윗 카드',
|
|
|
|
|
'description' => '흐릿한 사진 위에 X/Twitter 카드로 표시된 게시물.',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'show' => [
|
|
|
|
|
'title' => '게시물 세부정보',
|
|
|
|
|
'edit' => '편집',
|
|
|
|
|
'back' => '뒤로',
|
|
|
|
|
'no_content' => '캡션 없음',
|
|
|
|
|
'platforms' => '플랫폼',
|
|
|
|
|
'no_platforms' => '선택된 플랫폼이 없습니다.',
|
|
|
|
|
'view_on_platform' => '플랫폼에서 보기',
|
|
|
|
|
'published_on' => ':date에 게시됨',
|
|
|
|
|
'scheduled_for' => ':date로 예약됨',
|
|
|
|
|
'draft' => '초안',
|
|
|
|
|
'status_pending' => '대기 중',
|
|
|
|
|
'metrics' => '지표',
|
|
|
|
|
'metrics_loading' => '지표를 불러오는 중…',
|
|
|
|
|
'metrics_unavailable' => '아직 이 플랫폼의 지표를 사용할 수 없습니다.',
|
|
|
|
|
'metrics_empty' => '반환된 지표가 없습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'edit' => [
|
|
|
|
|
'title' => '게시물 편집',
|
|
|
|
|
'view_title' => '게시물 보기',
|
|
|
|
|
'labels' => '라벨',
|
|
|
|
|
'no_labels' => '아직 만든 라벨이 없습니다',
|
|
|
|
|
'schedule' => '예약',
|
|
|
|
|
'pick_time' => '시간 선택',
|
|
|
|
|
'pick_time_past' => '미래의 날짜와 시간을 선택하세요.',
|
|
|
|
|
'post_now' => '지금 게시',
|
|
|
|
|
'time' => '시간',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
'delete' => '삭제',
|
|
|
|
|
'schedule_for' => '예약 대상',
|
|
|
|
|
'schedule_date' => '예약 날짜',
|
|
|
|
|
'unschedule' => '예약 취소',
|
|
|
|
|
'saving' => '저장 중...',
|
|
|
|
|
'saved' => '저장됨',
|
|
|
|
|
'draft' => '초안',
|
|
|
|
|
'media' => '미디어',
|
|
|
|
|
'add_media' => '미디어 추가',
|
|
|
|
|
'caption' => '캡션',
|
|
|
|
|
'caption_placeholder' => '캡션을 작성하세요...',
|
|
|
|
|
'compose_title' => '게시물 만들기',
|
|
|
|
|
'compose_subtitle' => '메시지를 작성하고 미디어를 추가하세요',
|
|
|
|
|
'preview_empty' => [
|
|
|
|
|
'title' => '선택된 플랫폼이 없습니다',
|
|
|
|
|
'description' => '미리보기를 보려면 게시할 플랫폼을 선택하세요.',
|
|
|
|
|
],
|
|
|
|
|
'drop_zone_title' => '미디어 추가',
|
|
|
|
|
'drop_zone_subtitle' => '파일을 끌어다 놓거나 클릭하여 찾아보기',
|
|
|
|
|
'add' => '추가',
|
|
|
|
|
'publish_to' => '게시 대상',
|
|
|
|
|
'organize' => '정리',
|
|
|
|
|
'signatures' => '서명',
|
|
|
|
|
'view_on_platform' => '플랫폼에서 보기',
|
|
|
|
|
'platform_status' => '플랫폼 상태',
|
|
|
|
|
'compliance_incomplete' => '일부 플랫폼 설정이 불완전하거나 첨부된 미디어와 호환되지 않습니다.',
|
|
|
|
|
'compliance' => [
|
|
|
|
|
'requires_content_or_media' => '게시하려면 텍스트나 미디어를 추가하세요.',
|
|
|
|
|
'requires_media' => '여기에 게시하려면 이미지나 동영상을 추가하세요.',
|
|
|
|
|
'too_many_files' => '이 형식은 최대 :max개의 파일만 허용됩니다.',
|
|
|
|
|
'too_few_files' => '이 형식에는 최소 :min개의 파일을 추가하세요.',
|
|
|
|
|
'no_videos' => '이 형식은 이미지만 허용됩니다.',
|
|
|
|
|
'no_images' => '이 형식은 동영상만 허용됩니다.',
|
|
|
|
|
'no_mixed_media' => '이미지와 동영상은 같은 게시물에 함께 넣을 수 없습니다.',
|
|
|
|
|
'no_gifs' => '여기에서는 GIF가 지원되지 않습니다.',
|
|
|
|
|
'no_documents' => '이 형식은 PDF 문서를 지원하지 않습니다.',
|
|
|
|
|
'document_not_alone' => 'PDF는 다른 이미지나 동영상 없이 단독으로 게시해야 합니다.',
|
|
|
|
|
'video_too_large' => '동영상이 이 플랫폼의 크기 한도를 초과합니다.',
|
|
|
|
|
'video_too_long' => '이 형식은 동영상이 :seconds초 미만이어야 합니다.',
|
|
|
|
|
'image_too_large' => '이미지가 이 플랫폼의 크기 한도를 초과합니다.',
|
|
|
|
|
'document_too_large' => 'PDF가 이 플랫폼의 크기 한도를 초과합니다.',
|
|
|
|
|
'aspect_ratio_invalid' => '이 형식은 해당 가로세로 비율을 지원하지 않습니다.',
|
|
|
|
|
'no_content_type' => '이 플랫폼의 콘텐츠 유형을 선택하세요.',
|
|
|
|
|
'requires_text' => '텍스트를 추가하세요 — 이 형식에는 제목이 필요합니다.',
|
|
|
|
|
],
|
|
|
|
|
'publishing' => '게시 중...',
|
|
|
|
|
'publishing_overlay_title' => '게시물을 게시하는 중',
|
|
|
|
|
'publishing_overlay_subtitle' => '몇 분 정도 걸릴 수 있습니다. 이 페이지를 나가도 괜찮습니다.',
|
|
|
|
|
'scheduled_overlay_title' => '이 게시물은 예약되었습니다',
|
|
|
|
|
'scheduled_overlay_subtitle' => ':date로 예약됨. 변경하려면 먼저 예약을 취소하세요.',
|
|
|
|
|
'unschedule_cta' => '편집하려면 예약 취소',
|
|
|
|
|
|
|
|
|
|
'tabs' => [
|
2026-07-17 21:38:20 +00:00
|
|
|
'compose' => '작성',
|
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' => '미리보기',
|
|
|
|
|
'channels' => '채널',
|
|
|
|
|
'comments' => '댓글',
|
|
|
|
|
'comments_empty' => '아직 댓글이 없습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'media_picker' => [
|
|
|
|
|
'title' => '갤러리에서 선택',
|
|
|
|
|
'search' => '미디어 검색...',
|
|
|
|
|
'empty' => '아직 갤러리에 미디어가 없습니다',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
'add' => '추가',
|
|
|
|
|
'add_count' => ':count개 추가',
|
|
|
|
|
],
|
|
|
|
|
|
2026-07-11 12:45:52 +00:00
|
|
|
'alt_text' => [
|
|
|
|
|
'label' => '대체 텍스트',
|
|
|
|
|
'edit' => '대체 텍스트 편집',
|
|
|
|
|
'placeholder' => '화면 낭독 프로그램을 사용하는 사람들을 위해 이 이미지를 설명하세요',
|
|
|
|
|
'hint' => '이미지 설명을 지원하는 플랫폼에 게시됩니다.',
|
|
|
|
|
'save' => '저장',
|
|
|
|
|
],
|
|
|
|
|
|
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' => '이모지 검색',
|
|
|
|
|
'empty' => '이모지를 찾을 수 없습니다',
|
|
|
|
|
'recent' => '자주 사용함',
|
|
|
|
|
'smileys' => '스마일리 및 감정',
|
|
|
|
|
'people' => '사람 및 신체',
|
|
|
|
|
'nature' => '동물 및 자연',
|
|
|
|
|
'food' => '음식 및 음료',
|
|
|
|
|
'activities' => '활동',
|
|
|
|
|
'travel' => '여행 및 장소',
|
|
|
|
|
'objects' => '사물',
|
|
|
|
|
'symbols' => '기호',
|
|
|
|
|
'flags' => '깃발',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'status' => [
|
|
|
|
|
'pending' => '대기 중',
|
|
|
|
|
'scheduled' => '예약됨',
|
|
|
|
|
'published' => '게시됨',
|
|
|
|
|
'publishing' => '게시 중...',
|
|
|
|
|
'retrying' => '재시도 중...',
|
|
|
|
|
'failed' => '실패',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'delete_modal' => [
|
|
|
|
|
'title' => '게시물 삭제',
|
|
|
|
|
'description' => '이 게시물을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
|
|
|
|
|
'action' => '삭제',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'sync_enable' => [
|
|
|
|
|
'title' => '동기화를 활성화하시겠어요?',
|
|
|
|
|
'description' => '모든 플랫폼이 동일한 콘텐츠를 공유합니다. 개별 플랫폼에 적용한 맞춤 편집은 현재 콘텐츠로 대체됩니다.',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
'action' => '동기화 활성화',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'sync_disable' => [
|
|
|
|
|
'title' => '동기화를 비활성화하시겠어요?',
|
|
|
|
|
'description' => '각 플랫폼은 현재 콘텐츠를 유지하지만, 이후 편집은 편집 중인 플랫폼에만 적용됩니다.',
|
|
|
|
|
'customize_note' => '각 플랫폼의 콘텐츠를 개별적으로 맞춤 설정할 수 있습니다.',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
'action' => '동기화 비활성화',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'platforms_dialog' => [
|
|
|
|
|
'title' => '플랫폼 선택',
|
|
|
|
|
'description' => '이 게시물을 게시할 플랫폼을 선택하세요.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'signatures_modal' => [
|
|
|
|
|
'search' => '서명 검색...',
|
|
|
|
|
'no_results' => '서명을 찾을 수 없습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'validation' => [
|
|
|
|
|
'select_board' => '보드 선택',
|
|
|
|
|
'images_not_supported' => '이미지가 지원되지 않습니다',
|
|
|
|
|
'videos_not_supported' => '동영상이 지원되지 않습니다',
|
|
|
|
|
'max_images' => '최대 :count개 이미지',
|
|
|
|
|
'requires_media' => '미디어 필요',
|
|
|
|
|
'requires_content' => '텍스트 내용이 필요합니다',
|
|
|
|
|
'exceeded' => ':count 초과',
|
|
|
|
|
'does_not_support_images' => ':platform은(는) 이미지를 지원하지 않습니다',
|
|
|
|
|
'supports_up_to_images' => ':platform은(는) 최대 :count개 이미지를 지원합니다',
|
|
|
|
|
'does_not_support_videos' => ':platform은(는) 동영상을 지원하지 않습니다',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'content_types' => [
|
|
|
|
|
'instagram_feed' => [
|
|
|
|
|
'label' => '피드 게시물',
|
|
|
|
|
'description' => '피드와 프로필에 표시됩니다',
|
|
|
|
|
],
|
|
|
|
|
'instagram_reel' => [
|
|
|
|
|
'label' => '릴스',
|
2026-07-25 00:21:39 +00:00
|
|
|
'description' => '최대 15분 짧은 동영상',
|
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' => '스토리',
|
|
|
|
|
'description' => '24시간 후 사라집니다',
|
|
|
|
|
],
|
|
|
|
|
'linkedin_post' => [
|
|
|
|
|
'label' => '게시물',
|
|
|
|
|
'description' => '표준 게시물 — 단일 이미지, 다중 이미지, 동영상 또는 PDF',
|
|
|
|
|
],
|
|
|
|
|
'linkedin_page_post' => [
|
|
|
|
|
'label' => '게시물',
|
|
|
|
|
'description' => '표준 게시물 — 단일 이미지, 다중 이미지, 동영상 또는 PDF',
|
|
|
|
|
],
|
|
|
|
|
'facebook_post' => [
|
|
|
|
|
'label' => '게시물',
|
|
|
|
|
'description' => '페이지의 표준 게시물',
|
|
|
|
|
],
|
|
|
|
|
'facebook_reel' => [
|
|
|
|
|
'label' => '릴스',
|
|
|
|
|
'description' => '최대 90초 짧은 동영상',
|
|
|
|
|
],
|
|
|
|
|
'facebook_story' => [
|
|
|
|
|
'label' => '스토리',
|
|
|
|
|
'description' => '최대 60초 세로 동영상 스토리',
|
|
|
|
|
],
|
|
|
|
|
'tiktok_video' => [
|
|
|
|
|
'label' => '동영상',
|
|
|
|
|
'description' => '숏폼 동영상 콘텐츠',
|
|
|
|
|
],
|
|
|
|
|
'tiktok_photo' => [
|
|
|
|
|
'label' => '사진 캐러셀',
|
|
|
|
|
'description' => '최대 35장의 사진을 스와이프 캐러셀로',
|
|
|
|
|
],
|
|
|
|
|
'youtube_short' => [
|
|
|
|
|
'label' => 'Short',
|
2026-07-23 15:06:15 +00:00
|
|
|
'description' => '최대 3분 세로 동영상',
|
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' => '게시물',
|
|
|
|
|
'description' => '텍스트와 미디어가 있는 트윗',
|
|
|
|
|
],
|
|
|
|
|
'threads_post' => [
|
|
|
|
|
'label' => '게시물',
|
|
|
|
|
'description' => '선택적 미디어가 있는 텍스트 게시물',
|
|
|
|
|
],
|
|
|
|
|
'pinterest_pin' => [
|
|
|
|
|
'label' => '핀',
|
|
|
|
|
'description' => '표준 이미지 핀',
|
|
|
|
|
],
|
|
|
|
|
'pinterest_video_pin' => [
|
|
|
|
|
'label' => '동영상 핀',
|
|
|
|
|
'description' => '동영상 핀 (4초 - 15분)',
|
|
|
|
|
],
|
|
|
|
|
'pinterest_carousel' => [
|
|
|
|
|
'label' => '캐러셀',
|
|
|
|
|
'description' => '다중 이미지 캐러셀 (2-5장)',
|
|
|
|
|
],
|
|
|
|
|
'bluesky_post' => [
|
|
|
|
|
'label' => '게시물',
|
|
|
|
|
'description' => '선택적 이미지가 있는 텍스트 게시물',
|
|
|
|
|
],
|
|
|
|
|
'mastodon_post' => [
|
|
|
|
|
'label' => '게시물',
|
|
|
|
|
'description' => '선택적 미디어가 있는 텍스트 게시물',
|
|
|
|
|
],
|
|
|
|
|
'telegram_post' => [
|
|
|
|
|
'label' => '게시물',
|
|
|
|
|
'description' => '선택적 미디어가 있는 텍스트 게시물',
|
|
|
|
|
],
|
|
|
|
|
'discord_message' => [
|
|
|
|
|
'label' => '메시지',
|
|
|
|
|
'description' => '선택적 미디어 및 임베드가 있는 Discord 채널 메시지',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'platforms' => [
|
|
|
|
|
'linkedin' => 'LinkedIn',
|
|
|
|
|
'linkedin-page' => 'LinkedIn 페이지',
|
|
|
|
|
'x' => 'X',
|
|
|
|
|
'tiktok' => 'TikTok',
|
|
|
|
|
'youtube' => 'YouTube Shorts',
|
|
|
|
|
'facebook' => 'Facebook 페이지',
|
|
|
|
|
'instagram' => 'Instagram',
|
|
|
|
|
'threads' => 'Threads',
|
|
|
|
|
'pinterest' => 'Pinterest',
|
|
|
|
|
'bluesky' => 'Bluesky',
|
|
|
|
|
'mastodon' => 'Mastodon',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'flash' => [
|
|
|
|
|
'scheduled' => '게시물이 성공적으로 예약되었습니다!',
|
|
|
|
|
'deleted' => '게시물이 성공적으로 삭제되었습니다!',
|
|
|
|
|
'duplicated' => '게시물이 초안으로 복제되었습니다.',
|
|
|
|
|
'cannot_edit_finalized' => '이 게시물은 이미 처리되어 다시 게시할 수 없습니다. 다시 시도하려면 복제하세요.',
|
|
|
|
|
'cannot_delete_published' => '게시된 게시물은 삭제할 수 없습니다.',
|
|
|
|
|
'connect_first' => '게시물을 만들기 전에 소셜 네트워크를 하나 이상 연결하세요.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'errors' => [
|
|
|
|
|
'account_disconnected' => '소셜 계정 연결이 해제되었습니다',
|
|
|
|
|
'account_inactive' => '소셜 계정이 비활성화되었습니다',
|
|
|
|
|
'account_token_expired' => '소셜 계정 세션이 만료되었습니다 — 재연결하세요',
|
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_unavailable_exhausted' => '여러 번 재시도했지만 플랫폼을 사용할 수 없었습니다. 나중에 다시 시도하세요.',
|
|
|
|
|
'publishing_timed_out' => '게시에 시간이 초과되었습니다. 다시 시도하세요.',
|
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' => '게시물을 삭제하시겠어요?',
|
|
|
|
|
'description' => '이 작업은 되돌릴 수 없습니다. 게시물과 모든 미디어가 영구적으로 제거됩니다.',
|
|
|
|
|
'confirm' => '예, 삭제합니다',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'create' => [
|
|
|
|
|
'title' => '새 게시물 만들기',
|
|
|
|
|
'description' => '어떻게 시작할지 선택하세요.',
|
|
|
|
|
'scratch_title' => '처음부터 시작',
|
|
|
|
|
'scratch_description' => '빈 게시물을 열고 직접 모든 것을 작성하세요.',
|
|
|
|
|
'ai_title' => 'AI로 생성',
|
|
|
|
|
'ai_description' => '원하는 것을 설명하면 AI가 콘텐츠를 생성해 드립니다.',
|
|
|
|
|
'ai_configure_description' => '형식을 선택하고 만들고 싶은 게시물을 설명하세요.',
|
|
|
|
|
'ai_pick_template_description' => 'AI가 생성할 게시물의 스타일을 선택하세요.',
|
|
|
|
|
'coming_soon' => '곧 제공 예정',
|
|
|
|
|
|
|
|
|
|
'preview' => [
|
|
|
|
|
'image_title' => '이미지 제목',
|
|
|
|
|
'image_body' => '이미지 본문',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'steps' => [
|
|
|
|
|
'template_picker_title' => '스타일 선택',
|
|
|
|
|
'format_title' => '형식 선택',
|
|
|
|
|
'format_description' => '만들고 싶은 게시물 유형을 선택하세요.',
|
|
|
|
|
'account_title' => '계정 선택',
|
|
|
|
|
'account_description' => '게시할 소셜 계정을 선택하세요.',
|
|
|
|
|
'media_title' => '미디어 옵션',
|
|
|
|
|
'media_carousel' => '슬라이드는 몇 장인가요?',
|
|
|
|
|
'media_optional' => '이미지를 포함할까요?',
|
|
|
|
|
'media_optional_label' => '이미지는 몇 장인가요?',
|
|
|
|
|
'media_none' => '없음',
|
|
|
|
|
'media_count_label' => '이미지 수',
|
2026-07-18 18:12:26 +00:00
|
|
|
'brand_colors_label' => '브랜드 색상',
|
|
|
|
|
'brand_colors_description' => '생성되는 이미지에 워크스페이스 브랜드 색상을 적용합니다. 끄면 AI가 콘텐츠에 어울리는 색상을 선택합니다.',
|
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' => '게시물을 설명하세요',
|
|
|
|
|
'prompt_label' => '이 게시물은 무엇에 관한 것인가요?',
|
|
|
|
|
'prompt_placeholder' => '예: Instagram용 새 캐러셀 기능 발표',
|
|
|
|
|
'preview_error' => '문제가 발생했습니다. 다시 시도해 주세요.',
|
|
|
|
|
'loading_page_title' => '게시물을 생성하는 중',
|
|
|
|
|
'loading_eta' => '예상 시간: 약 :minutes.',
|
|
|
|
|
'loading_eta_minute_one' => '1분',
|
|
|
|
|
'loading_eta_minute_other' => ':count분',
|
|
|
|
|
'loading_leave_title' => '계속 작업하셔도 됩니다.',
|
|
|
|
|
'loading_leave_body' => '게시물이 준비되면 알려드리겠습니다.',
|
|
|
|
|
'loading_leave_cta' => '캘린더로 이동',
|
|
|
|
|
'loading_create_another_cta' => '다른 게시물 만들기',
|
|
|
|
|
'loading_tip_credits' => '각 AI 이미지는 약 15크레딧을 사용합니다.',
|
|
|
|
|
'loading_tip_edit' => '게시물이 준비되면 모든 것을 편집할 수 있습니다.',
|
|
|
|
|
'loading_tip_draft' => '생성된 게시물은 초안에 저장됩니다.',
|
|
|
|
|
'loading_tip_brand' => '브랜드 설정을 조정하여 향후 게시물에 영향을 주세요.',
|
|
|
|
|
'loading_tip_carousel' => '캐러셀은 업로드한 이미지당 슬라이드 하나를 제공합니다.',
|
|
|
|
|
'loading_tip_quality' => '이미지 품질은 속도와 비용의 균형에 맞게 설정됩니다.',
|
|
|
|
|
'create' => '게시물 만들기',
|
|
|
|
|
'back' => '뒤로',
|
|
|
|
|
'next' => '계속',
|
|
|
|
|
'cancel' => '취소',
|
|
|
|
|
'discard' => '버리기',
|
|
|
|
|
'retry' => '다시 시도',
|
|
|
|
|
'no_platforms' => '연결된 계정 없음',
|
|
|
|
|
'connect_first' => 'AI 생성을 사용하려면 소셜 계정을 하나 이상 연결하세요.',
|
|
|
|
|
'no_account_for_template' => '이 템플릿을 사용하려면 호환되는 계정을 연결하세요.',
|
|
|
|
|
|
|
|
|
|
'format' => [
|
|
|
|
|
'instagram_feed' => 'Instagram 피드 게시물',
|
|
|
|
|
'instagram_carousel' => 'Instagram 캐러셀',
|
|
|
|
|
'linkedin_post' => 'LinkedIn 게시물',
|
|
|
|
|
'linkedin_page_post' => 'LinkedIn 페이지 게시물',
|
|
|
|
|
'x_post' => 'X 게시물',
|
|
|
|
|
'bluesky_post' => 'Bluesky 게시물',
|
|
|
|
|
'threads_post' => 'Threads 게시물',
|
|
|
|
|
'mastodon_post' => 'Mastodon 게시물',
|
|
|
|
|
'telegram_post' => 'Telegram 게시물',
|
|
|
|
|
'discord_message' => 'Discord 메시지',
|
|
|
|
|
'facebook_post' => 'Facebook 게시물',
|
|
|
|
|
'pinterest_pin' => 'Pinterest 핀',
|
|
|
|
|
'instagram_story' => 'Instagram 스토리',
|
|
|
|
|
'facebook_story' => 'Facebook 스토리',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
];
|