trypost/lang/ja/accounts.php
Paulo Castellano 173a1e4c61
Fix Facebook Page connect pagination (#212) (#253)
* Fix Facebook and Instagram-via-Facebook Page connect pagination.

Follow Graph API paging.next on /me/accounts so authorized non-first Pages are found and multi-Page accounts get the picker instead of silently connecting the first result.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Paginate Meta accounts until paging.next is exhausted.

Drop the artificial 50-page cap and stop only when there is no next URL, or the same request URL repeats (broken pagination loop).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Redact tokens in Graph pagination logs and harden test coverage.

Cover happy-path and failure cases for Meta /me/accounts pagination, including mid-loop failures, invalid paging.next, and Instagram pages without a linked IG account.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fail closed on incomplete Meta accounts pagination.

If a later /me/accounts page fails after earlier pages succeeded, throw instead of returning a truncated list that could auto-connect the wrong Page. Also revert the IG detail timeout that could wipe the whole connect list.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Simplify Graph pagination helpers and page fetchers.

Bake the first request query into the URL, drop requestKey, and let IncompleteGraphPaginationException bubble from the controllers without catch/rethrow noise.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Move incomplete pagination exception under Social\Meta.

Colocate it with GraphPaginator so the Meta scope is clear from the namespace instead of a generic Social exception name.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Rename pagination exception to IncompleteMetaGraphPaginationException.

Keep it under Exceptions/Social with Meta in the class name instead of moving it into Services.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Make GraphPaginator results explicit before mapping pages.

Assign the paginated accounts to a variable first so the Facebook and Instagram-via-Facebook fetchers read more clearly.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Build Meta Graph pagination URLs with Laravel Uri.

Replace manual http_build_query concatenation with Uri::of()->withQuery().

Co-authored-by: Cursor <cursoragent@cursor.com>

* Use Laravel HTTP and Uri helpers in Meta Graph pagination.

Prefer response collect/json key access, filled(), and Uri path parsing over manual array and parse_url handling.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Simplify graphVersion using Uri path and str().

Drop basename and native string casts; Uri::path() already yields the Graph API version segment.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Drop unnecessary str() around graph API config.

Uri: :of() already accepts the string returned by config().
Co-authored-by: Cursor <cursoragent@cursor.com>

* Simplify GraphPaginator with Laravel helpers.

Consolidate failure handling via abort(), and use collect, when, throw_if, and Uri::value() for a shorter pagination loop.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Refactor social OAuth page/channel selection handling. Update selectPage and selectChannel methods in Facebook, Instagram, and YouTube controllers to return popup callbacks instead of redirecting on session expiration or workspace not found. Enhance HandleInertiaRequests middleware to prevent deferring onboarding progress on social OAuth popup routes. Add tests to verify behavior for expired sessions and onboarding progress.

* Unify Instagram connect behind one card with a method picker.

Hide the Instagram-via-Facebook grid card and offer Instagram Login vs Facebook Pages from a single network entry, matching LinkedIn.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Move social popup onboarding assertions into connection tests.

Cover the deferred-prop popup regression on Facebook, Instagram, and YouTube select routes instead of a synthetic onboarding share check.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Stop suppressing onboarding defer on all social routes.

Override onboardingProgress only in popupCallback so picker pages stay deferred and the close page does not re-hit select after session clear.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Always open the Instagram method dialog on connect.

Drop connectMethods and the single-method OAuth shortcut; the picker always offers both Login and Facebook Pages.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Filter Instagram dialog options by enabled platforms.

Keep always opening the method picker, but only list OAuth entry points that are turned on.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Extract Instagram connect methods into a dedicated helper.

Keep connectableOptions focused on shaping grid options while the enabled OAuth list lives in instagramConnectMethods().

Co-authored-by: Cursor <cursoragent@cursor.com>

* Harden Meta Graph pagination and localize Instagram connect copy.

Fail closed on Graph request errors and pathological paging, keep Instagram connect going when profile detail lookups time out, and translate the Instagram method dialog strings.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 12:01:46 -03:00

157 lines
9.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
return [
'title' => '接続',
'page_title' => 'ソーシャルアカウント',
'description' => '接続済みのソーシャルアカウントの一覧',
'connect_cta' => '接続',
'not_connected' => '未接続',
'connect' => '接続',
'connection_lost' => '接続が切れました',
'reconnect' => '再接続',
'reconnect_account' => 'アカウントを再接続',
'view_profile' => 'プロフィールを表示',
'disconnect' => '接続解除',
'descriptions' => [
'linkedin' => 'LinkedIn プロフィールまたは会社ページを接続',
'linkedin-page' => 'LinkedIn 会社ページを接続',
'x' => 'XTwitterアカウントを接続',
'tiktok' => 'TikTok アカウントを接続',
'youtube' => 'YouTube チャンネルを接続',
'facebook' => 'Facebook ページを接続',
'instagram' => 'Instagram Login または Facebook ページで接続',
'instagram-facebook' => 'Facebook ページ経由で Instagram を接続',
'threads' => 'Threads アカウントを接続',
'pinterest' => 'Pinterest アカウントを接続',
'bluesky' => 'Bluesky アカウントを接続',
'mastodon' => 'Mastodon アカウントを接続',
'telegram' => 'Telegram チャンネルまたはグループを接続',
'discord' => 'Discord サーバーを接続',
],
'disconnect_modal' => [
'title' => 'アカウントの接続解除',
'description' => 'このアカウントの接続を解除してもよろしいですか?いつでも再接続できます。',
'confirm' => '接続解除',
'cancel' => 'キャンセル',
],
'bluesky' => [
'title' => 'Bluesky を接続',
'description' => '接続するには認証情報を入力してください',
'email' => 'メールアドレス',
'email_placeholder' => 'yourhandle.bsky.social',
'app_password' => 'アプリパスワード',
'app_password_placeholder' => 'xxxx-xxxx-xxxx-xxxx',
'app_password_hint' => 'セキュリティのため<strong>アプリパスワード</strong>を使用してください。<a href="https://bsky.app/settings/app-passwords" target="_blank" class="underline">bsky.app/settings</a> で作成できます。',
'submit' => 'Bluesky を接続',
'submitting' => '接続中...',
],
'mastodon' => [
'title' => 'Mastodon を接続',
'description' => 'Mastodon のインスタンスを入力してください',
'instance_url' => 'インスタンス URL',
'instance_placeholder' => 'https://mastodon.social',
'instance_hint' => 'Mastodon のインスタンス URL を入力してください(例: mastodon.social、techhub.social',
'submit' => 'Mastodon で続ける',
'submitting' => '接続中...',
],
'telegram' => [
'title' => 'Telegram を接続',
'description' => 'チャンネルまたはグループを連携',
'step_admin' => ':bot を Telegram のチャンネルまたはグループの管理者として追加してください。',
'step_command' => 'このコマンドをチャンネルまたはグループに投稿してください:',
'waiting' => 'チャンネルの接続を待っています…',
'connected' => 'チャンネルを接続しました!',
'connected_toast' => 'Telegram チャンネルを正常に接続しました!',
'copied_toast' => 'コマンドをクリップボードにコピーしました',
'copy_tooltip' => 'コマンドをコピー',
'expired' => 'このコードは有効期限が切れています。新しいコードを生成してもう一度お試しください。',
'new_code' => '新しいコードを生成',
'retry' => 'もう一度試す',
'error_generic' => '接続を開始できませんでした。もう一度お試しください。',
'network_taken' => 'このワークスペースにはすでに Telegram チャンネルが接続されています。先に接続を解除してください。',
],
'facebook' => [
'title' => 'Facebook ページを選択',
'description' => '接続するページを選択してください',
'no_pages' => 'ページが見つかりません',
'no_pages_description' => 'あなたは管理者となっている Facebook ページがありません。',
'page_label' => 'Facebook ページ',
'view' => '表示',
'choose' => '選択',
],
'instagram_facebook' => [
'title' => 'Instagram アカウントを選択',
'description' => '接続する Instagram アカウントを選択してください',
'no_pages' => 'Instagram アカウントが見つかりません',
'no_pages_description' => 'Instagram ビジネスアカウントが連携された Facebook ページが見つかりませんでした。',
'view' => '表示',
'choose' => '選択',
],
'instagram_connect' => [
'title' => 'Instagram を接続',
'description' => 'Instagram アカウントの接続方法を選択してください',
'standalone_title' => 'Instagram Login',
'standalone_description' => 'Instagram のプロフェッショナルアカウントでサインイン',
'facebook_title' => 'Facebook ページ',
'facebook_description' => 'Facebook ページに連携された Instagram アカウントを接続',
],
'linkedin' => [
'title' => 'LinkedIn ページを選択',
'description' => '接続するページを選択してください',
'no_pages' => 'ページが見つかりません',
'no_pages_description' => 'あなたは管理者となっている LinkedIn ページがありません。',
'page_label' => 'LinkedIn ページ',
'select_title' => 'どこに投稿しますか?',
'select_subtitle' => '自分として投稿するか、管理している会社ページを選択してください。',
'person_tag' => '個人',
'organization_tag' => '組織',
'view' => '表示',
'choose' => '選択',
],
'flash' => [
'disconnected' => 'アカウントの接続を解除しました!',
'connected' => 'アカウントを接続しました!',
'session_expired' => 'セッションの有効期限が切れました。もう一度お試しください。',
'workspace_not_found' => 'ワークスペースが見つかりません。',
'activated' => 'アカウントを有効化しました!',
'deactivated' => 'アカウントを無効化しました!',
'already_connected' => 'このプラットフォームはすでに接続されています。',
'no_youtube_channels' => 'YouTube チャンネルが見つかりません。先にチャンネルを作成してください。',
],
'popup_callback' => [
'title_success' => '接続完了',
'title_error' => 'エラー',
'closing' => 'このウィンドウは自動的に閉じます...',
'manual_close' => 'このウィンドウを閉じても構いません。',
'popup_blocked' => '接続ウィンドウを開けませんでした。ポップアップを許可してもう一度お試しください。',
'connected' => 'アカウントを接続しました!',
'reconnected' => 'アカウントを再接続しました!',
'error_connecting' => 'アカウントの接続中にエラーが発生しました。もう一度お試しください。',
'network_taken' => 'このワークスペースにはすでにこのネットワークのアカウントが接続されています。先に接続を解除してください。',
'error_connecting_page' => 'ページの接続中にエラーが発生しました。もう一度お試しください。',
'error_connecting_channel' => 'チャンネルの接続中にエラーが発生しました。もう一度お試しください。',
'session_expired' => 'セッションの有効期限が切れました。もう一度お試しください。',
'workspace_not_found' => 'ワークスペースが見つかりません。',
'invalid_state' => '不正な状態です。もう一度お試しください。',
'failed_to_authenticate' => '認証に失敗しました。',
'failed_to_get_profile' => 'プロフィールの取得に失敗しました。',
'page_not_found' => 'ページが見つかりません。',
'channel_not_found' => 'チャンネルが見つかりません。',
'no_facebook_pages' => 'Facebook ページが見つかりません。少なくとも 1 つのページの管理者である必要があります。',
'no_facebook_instagram_pages' => 'Instagram アカウントが連携された Facebook ページが見つかりません。',
'no_youtube_channels' => 'YouTube チャンネルが見つかりません。先にチャンネルを作成してください。',
'not_linkedin_admin' => 'あなたは管理者となっている LinkedIn ページがありません。',
],
];