diff --git a/en/bot.json b/en/bot.json index b5f95c2..8b2a27a 100644 --- a/en/bot.json +++ b/en/bot.json @@ -378,6 +378,67 @@ }, "ping": { "description": "Ping the bot." + }, + "sus": { + "description": "Manually manage Suspicion Level.", + "add": { + "description": "Grant Suspicion Level to a user.", + "options": { + "user": { + "description": "Target user" + }, + "level": { + "description": "Level to grant (1=GRAY, 2=BLACKISH, 3=DANGER)" + } + } + }, + "remove": { + "description": "Remove Suspicion Level from a user.", + "options": { + "user": { + "description": "Target user" + } + } + } + }, + "mod": { + "description": "Advanced moderation commands.", + "quarantine": { + "description": "Quarantine a user (apply quarantine role and strip permissions).", + "options": { + "user": { + "description": "User to quarantine" + }, + "reason": { + "description": "Reason for quarantine" + } + } + }, + "unquarantine": { + "description": "Unquarantine a user.", + "options": { + "user": { + "description": "User to unquarantine" + }, + "reason": { + "description": "Reason for unquarantine" + } + } + }, + "info": { + "description": "Show user's moderation status (Heat, Suspicion, etc.).", + "title": "Moderation Info for {user}", + "heat": "Current Heat", + "suspicion": "Suspicion Level", + "last_violation": "Last Violation", + "trust_status": "Trust Status", + "violations": "Violation History Counts", + "options": { + "user": { + "description": "User to show info for" + } + } + } } }, "context": { @@ -417,6 +478,12 @@ } }, "manage": { + "warn": { + "cannot_warn_self": "❌ You cannot warn yourself or a bot.", + "dm_title": "⚠️ Warning", + "dm_body": "You have received a warning from the moderators of **{guildName}**.\n**Reason:** {reason}\n\nPlease review the server rules.", + "success": "✅ Recorded a warning for <@{userId}>.\n**Reason:** {reason}" + }, "clear": { "confirm_description": "This message and all messages after it will be deleted.", "error": { @@ -490,7 +557,8 @@ "success": "✅ Successfully gave role to {user}.", "cant_find_role_or_member": "❌ We couldn't find the role or member.", "failed_add_role": "❌ Failed to give role to {user}.\nPlease check role hierarchy and permissions.", - "already_has_role": "ℹ️ {user} already has the role." + "already_has_role": "ℹ️ {user} already has the role.", + "dangerous_role_blocked": "❌ This role has dangerous permissions. Only users with AntiNuke exemption can grant it." }, "remove": { "success": "✅ Successfully removed role from {user}.", @@ -548,6 +616,53 @@ "delete": { "success": "Deleted sticky message." } + }, + "sus": { + "added": "✅ Added Suspicion Level {level} to <@{userId}>.", + "removed": "✅ Removed Suspicion Level from <@{userId}>.", + "already_exists": "User <@{userId}> is already in that state or the action was skipped." + }, + "report": { + "self_error": "You cannot report yourself or the bot.", + "reporter_prefix": "Reported by: {moderatorTag} — {reason}", + "success": "✅ Reported <@{userId}>. A moderator will review it shortly.", + "modal_title": "Report Message", + "modal_reason_label": "Reason for report", + "modal_reason_placeholder": "Spam, harassment, rule violation, etc.", + "no_content": "no text content", + "log_title": "Message Reported", + "log_reporter": "Reporter", + "log_target": "Reported User", + "log_channel": "Channel", + "log_reason": "Reason", + "log_message": "Message Content" + }, + "verify": { + "not_found": "Member not found.", + "no_role_configured": "PoW Gate verification role is not configured.", + "not_in_gate": "<@{userId}> is not pending verification.", + "success": "✅ Manually verified <@{userId}>." + }, + "quarantine": { + "cannot_quarantine_self": "You cannot quarantine yourself or the bot.", + "modal_title": "Quarantine Member", + "modal_reason_label": "Reason (optional)", + "modal_reason_placeholder": "e.g. Spam, suspicious behavior, etc.", + "not_found": "Member not found.", + "manual_prefix": "Manual quarantine by moderator", + "success": "✅ Quarantined <@{userId}>.", + "already_quarantined": "<@{userId}> is already quarantined." + }, + "flag_suspicious": { + "cannot_flag_self": "You cannot flag yourself or the bot as suspicious.", + "success": "✅ Added Suspicion Level 1 (Gray) to <@{userId}>." + }, + "setup": { + "owner_only": "❌ Only the server owner can run this command.", + "already_setup": "❌ This server is already set up.", + "success": "✅ Setup completed successfully.", + "no_manage_roles": "❌ The bot is missing the **Manage Roles** permission. Please grant it and try again.", + "role_too_low": "❌ The bot's role (**{roleName}**) is too low. Please move it to the top 3 in the role list and try again." } }, "info": { @@ -666,7 +781,11 @@ "invalid_format": "❌ Invalid time format. Example: 5s, 2m, 1h", "blacklisted": "❌ You are blacklisted.", "no_permission": "❌ This command requires {permission} permission.", - "no_available": "❌ This command/feature is not available." + "no_available": "❌ This command/feature is not available.", + "missing_permissions": "❌ The bot is missing required permissions. Please check your server settings.", + "missing_access": "❌ The bot cannot access this channel. Please check the channel permissions.", + "unknown_message": "❌ The target message was not found. It may have already been deleted.", + "cannot_send_dm": "❌ Cannot send a DM to this user. They may have DMs disabled." }, "yes": "Yes", "no": "No", @@ -769,6 +888,9 @@ "user": "User", "author": "Author", "deleted_by": "Deleted By", + "deleted_by_moderation": "Cube (Auto Moderation)", + "deleted_by_moderation_with_reason": "Cube (Auto Moderation) — {reason}", + "deleted_by_unknown_self": "Unknown (possibly self-deleted)", "kicked_by": "Kicked By", "banned_by": "Banned By", "unbanned_by": "Unbanned By", @@ -881,7 +1003,40 @@ "message_content": "Message Content", "before_embed_preview": "Embed Before Edit", "after_embed_preview": "Embed After Edit", - "removed": "Removed" + "removed": "Removed", + "embeds_deleted_threaded": "Deleted message embeds (see thread for details)", + "embed_deleted_thread_name": "deleted-embed-{id}", + "embed_deleted_thread_intro": "This thread stores the embed preview of the deleted message.", + "deleted_embed_preview": "Deleted Embed", + "emoji": "Emoji", + "message": "Message", + "enabled": "Enabled", + "disabled": "Disabled", + "afk_channel": "AFK Channel", + "afk_timeout": "AFK Timeout", + "mfa_level": "2FA Requirement", + "widget_enabled": "Widget", + "widget_channel": "Widget Channel", + "preferred_locale": "Preferred Language", + "safety_alerts_channel": "Safety Alerts Channel", + "nsfw_level": "NSFW Level", + "public_updates_channel": "Community Updates Channel", + "features_added": "Features Added", + "features_removed": "Features Removed", + "automod_trigger": "Trigger Type", + "automod_trigger_keyword": "Keyword", + "automod_trigger_spam": "Spam", + "automod_trigger_preset": "Keyword Preset", + "automod_trigger_mention_spam": "Mention Spam", + "automod_trigger_member_profile": "Member Profile", + "automod_actions": "Actions", + "automod_action_block": "Block Message", + "automod_action_alert": "Send Alert", + "automod_action_timeout": "Timeout", + "automod_action_block_interaction": "Block Interaction", + "automod_enabled": "Enabled", + "automod_exempt_roles": "Exempt Roles", + "automod_exempt_channels": "Exempt Channels" }, "events": { "guild_update": "Server Updated", @@ -898,6 +1053,8 @@ "message_update": "Message Edited", "message_update_embed_before": "Embed Preview Before Edit", "message_update_embed_after": "Embed Preview After Edit", + "message_reaction_add": "Reaction Added", + "message_reaction_remove": "Reaction Removed", "member_add": "Member Joined", "member_remove": "Member Left", "member_kick": "Member Kicked", @@ -930,7 +1087,317 @@ "guild_scheduled_event_delete": "Event Deleted", "thread_create": "Thread Created", "thread_update": "Thread Updated", - "thread_delete": "Thread Deleted" + "thread_delete": "Thread Deleted", + "automod_rule_create": "AutoMod Rule Created", + "automod_rule_update": "AutoMod Rule Updated", + "automod_rule_delete": "AutoMod Rule Deleted" + }, + "reason": { + "role_keeper_regrant": "RoleKeeper: Re-granting previously held roles", + "pow_gate_success": "PoW Gate: Verification successful", + "role_add_manual": "Role command: Added by {userTag}", + "role_remove_manual": "Role command: Removed by {userTag}", + "role_add_bulk": "Role command (Bulk): Added by {userTag}", + "role_remove_bulk": "Role command (Bulk): Removed by {userTag}", + "workflow_role_add": "Workflow: Role granted", + "workflow_role_remove": "Workflow: Role removed", + "workflow_timeout_add": "Workflow: Timeout applied", + "workflow_timeout_remove": "Workflow: Timeout removed", + "workflow_thread_create": "Workflow: Thread created", + "workflow_thread_delete": "Workflow: Thread deleted", + "workflow_kick": "Workflow: Kicked", + "workflow_ban": "Workflow: Banned", + "join_gate_pow": "JoinGate: PoW Gate requirement", + "verify_manual": "Context Verify: Verified manually by {userTag}", + "audit_test": "Audit Test" + } + }, + "moderation": { + "mod_log": { + "title": "🚨 Moderation Action", + "body": "**User:** <@{userId}> ({userTag})\n**Action(s):** {actions}\n**Reason:** {reason}", + "default_reason": "Automod Action", + "failed_title": "⚠️ Moderation Action Failed", + "failed_body": "**User:** <@{userId}> ({userTag})\n**Attempted action(s):** {actions}\n**Reason:** {reason}\n\nThe action could not be performed because the target has administrator permission or a role higher than the bot. Please handle this manually.", + "v2_target": "**User:** <@{userId}>\n`{userTag}`", + "v2_actions": "**⚡ Action(s):** {actions}", + "v2_failed_actions": "**⚡ Attempted action(s):** {actions}", + "v2_reason": "**📝 Reason:** {reason}", + "v2_suppressed": "**🛑 Suppressed by policy:** {actions}", + "v2_confidence": "**🎯 Confidence:** `{gauge}`", + "v2_severity": "**🔥 Severity:** `{gauge}`", + "v2_categories": "**🏷️ Categories:** {categories}", + "v2_triggers": "**🚦 Triggered rules:** {triggers}", + "v2_executor": "**👮 Executor:** <@{executorId}>", + "v2_message": "**📄 Target message:**\n{content}", + "v2_message_empty": "**📄 Target message:** -# (no text content; attachment only)", + "v2_jump": "[📨 Jump to message]({url})", + "compact_line": "🚨 <@{userId}> ・ ⚡ {actions}", + "compact_category": "🏷️ {category}", + "compact_confidence": "🎯 {percent}%", + "btn_jump": "📨 Jump to message", + "v2_failed_hint": "-# Auto-moderation could not act because the target has administrator permission or a role higher than the bot. Please handle this manually using the buttons below.", + "btn_ban": "BAN", + "btn_kick": "Kick", + "btn_unquarantine": "Release", + "btn_untimeout": "Remove Timeout", + "btn_false_positive": "False Positive", + "btn_confirm_spam": "Confirm Spam" + }, + "review_queue": { + "title": "🔍 Review Required (Gray Zone)", + "body": "**Target:** <@{userId}> ({userTag})\n**Reason:** {reason}\n\nAutomatic detection confidence was low. Please review this case manually." + }, + "ai_lane": { + "review": { + "title": "🤖 AI Moderation — Review Required", + "author": "**Target:** <@{userId}>\n`{userTag}`", + "verdict": "**Verdict:** {label} (confidence {confidence}%)", + "verdict_label": "**⚖️ Verdict:** {label}", + "confidence": "**🎯 Confidence:** `{gauge}`", + "severity": "**🔥 Severity:** `{gauge}`", + "categories": "**🏷️ Categories:** {categories}", + "triggers": "**🚦 Triggered rules:** {triggers}", + "reason": "**📝 Reason:** {reason}", + "jump": "[📨 Jump to message]({url})", + "btn_jump": "📨 Jump to message", + "label_gray": "Gray", + "label_violation": "Violation", + "recommended": "**🤖 Recommended policy action:** {actions}", + "btn_apply": "Apply", + "btn_reject": "Reject (false positive)", + "btn_override": "Other action", + "no_data": "Pending review data not found (it may have expired or already been handled).", + "applied": "✅ <@{executorId}> applied the recommended action to <@{userId}>.", + "apply_failed": "Failed to apply the recommended action to <@{userId}>.", + "rejected": "🚫 <@{executorId}> rejected the verdict for <@{userId}> as a false positive.", + "reject_failed": "Failed to reject for <@{userId}>.", + "override_prompt": "Select another action to apply.", + "override_placeholder": "Select an action", + "override_invalid": "An invalid action was selected.", + "overridden": "✅ <@{executorId}> applied **{action}** to <@{userId}>.", + "override_failed": "Failed to apply the action to <@{userId}>." + }, + "categories": { + "harassment": "Harassment", + "hate": "Hate", + "sexual": "Sexual", + "violence": "Violence", + "self_harm": "Self-harm", + "spam": "Spam", + "scam_phishing": "Scam / Phishing", + "advertising": "Advertising", + "nsfw": "NSFW", + "server_rule": "Server rule violation" + }, + "pipeline_stage": { + "omni": "Primary screening (Omni)", + "lite_llm": "Lite LLM verdict", + "detail_llm": "Detailed LLM verdict", + "heuristic": "Heuristic verdict" + }, + "pipeline": { + "summary": "-# ⚙️ Pipeline: verdict finalized at {stage}" + } + }, + "warn": { + "dm_title": "⚠️ Warning", + "dm_body": "You have received a warning from **{guildName}**'s auto-moderation. Please review the server rules.", + "v2_body": "You have received a warning from **{guildName}**'s auto-moderation.", + "v2_reason": "**📝 Reason:** {reason}", + "v2_categories": "**🏷️ Categories:** {categories}", + "v2_guide": "-# Please review the server rules. Repeated violations may result in stronger action." + }, + "notify_owner": { + "dm_title": "🛡️ Anti-Nuke Detected (Owner Notification)", + "dm_body": "**Server:** {guildName}\n**Target:** <@{userId}> ({userTag})\n**Reason:** {reason}\n**Action applied:** {action}\n\nAnti-Nuke detected a destructive action. Please verify manually that this is not a false positive.", + "no_action": "Could not be applied (manual action required)" + }, + "scheduled_security": { + "started_title": "🔒 Scheduled Security Started", + "started_body": "**{action}** has started.\nActive window: {range}", + "ended_title": "🔓 Scheduled Security Ended", + "ended_body": "**{action}** has ended and the original state was restored.", + "type": { + "invite_disable": "Invite pause", + "dm_disable": "Member DM pause", + "security_level": "Raised verification level" + } + }, + "appeal_dm": { + "quarantine_title": "⚠️ Quarantine Applied", + "timeout_title": "⚠️ Timeout Applied", + "body": "Auto-moderation has applied a **{label}** to your account.\n\n**🏠 Server:** {guildName}\n**📝 Reason:** {reason}\n\n-# If you believe this is a false positive, you can submit an appeal using the button below.", + "quarantine_label": "Quarantine", + "timeout_label": "Timeout", + "btn_appeal": "Submit Appeal" + }, + "notify": { + "channel_title": "🚨 Auto Moderation", + "channel_body": "Applied punishment to <@{userId}>.\n**Action:** {action}\n**Reason:** {reason}", + "v2_target": "**👤 Target:** <@{userId}>", + "v2_action": "**⚡ Action:** {action}", + "v2_reason": "**📝 Reason:** {reason}", + "v2_categories": "**🏷️ Categories:** {categories}" + }, + "appeal_modal": { + "title": "Submit Appeal", + "reason_label": "Reason for Appeal", + "reason_placeholder": "Please describe why you believe this action was a false positive.", + "success": "✅ Your appeal has been submitted. A moderator will review it shortly.", + "already_submitted": "❌ You have already submitted an appeal. Please wait for a moderator to review it.", + "log_title": "📩 Appeal Received", + "log_body": "**Appellant:** <@{userId}> ({userTag})\n**Message:**\n{reason}" + }, + "mod_ban": { + "success": "Successfully banned user <@{userId}>.", + "failed": "Failed to ban user <@{userId}>.", + "reason": "Banned by {moderatorTag} via Mod-Log" + }, + "mod_kick": { + "success": "Successfully kicked user <@{userId}>.", + "failed": "Failed to kick user <@{userId}>.", + "reason": "Kicked by {moderatorTag} via Mod-Log" + }, + "mod_unquarantine": { + "not_found": "Failed to find quarantine snapshot for user <@{userId}>.", + "not_in_server": "User <@{userId}> is no longer in the server.", + "success": "Successfully unquarantined user <@{userId}> and restored roles.", + "failed": "Failed to unquarantine user <@{userId}>.", + "already_exists": "User <@{userId}> is not currently quarantined." + }, + "mod_untimeout": { + "success": "Successfully removed timeout for user <@{userId}>.", + "not_timed_out": "User <@{userId}> is not currently timed out.", + "not_found": "User <@{userId}> not found.", + "failed": "Failed to remove timeout for user <@{userId}>." + }, + "mod_false_positive": { + "success": "Successfully released user <@{userId}> as a false positive.", + "failed": "Failed to unquarantine user <@{userId}>.", + "already_exists": "User <@{userId}> is not currently quarantined." + }, + "mod_confirm_spam": { + "success": "✅ Spam pattern has been registered.", + "no_data": "Pattern data not found (may have expired)." + }, + "join_gate": { + "dm_title": "🔒 Verification Required", + "dm_body": "Verification is required to join **{guildName}**.\n\n[Click here to verify]({verifyUrl})\n\nThis link is valid for **10 minutes**.", + "channel_fallback": "<@{userId}> Verification is required. Click the button below to get your verification link." + }, + "pow_gate": { + "channel_title": "🔒 Verification Required", + "channel_body": "Verification is required to join this server.\nClick the button below to get your verification link.", + "channel_note": "-# Verification link is valid for 10 minutes", + "btn_label": "Get Verification Link", + "no_guild": "Failed to retrieve verification information.", + "no_settings": "Verification settings not found.", + "not_needed": "Verification is not required.", + "link_reply": "Please verify using the following link (**valid for 10 minutes**):\n{verifyUrl}", + "log_title": "Verification Complete (PoW Gate)", + "log_body": "User: <@{userId}> ({userTag})\n**Time:** " + }, + "actions": { + "QUARANTINE": "Quarantine", + "UNQUARANTINE": "Unquarantine", + "TIMEOUT_5M": "5 Minute Timeout", + "TIMEOUT_10M": "10 Minute Timeout", + "TIMEOUT_30M": "30 Minute Timeout", + "TIMEOUT_1H": "1 Hour Timeout", + "TIMEOUT_24H": "24 Hour Timeout", + "DELETE_MESSAGE": "Message Deletion", + "WARN": "Warning", + "SEND_TO_REVIEW_QUEUE": "Send to Manual Review", + "ADD_SUSPICION_LEVEL_1": "Add Suspicion Level 1", + "NOTIFY_OWNER": "Notify Owner", + "MARK_COHORT_SUSPICION_LV2": "Add Cohort Suspicion Level 2" + }, + "rules": { + "MESSAGE_SEND": "Sending Messages", + "MESSAGE_REPEAT": "Repeating Same Message", + "LINE_BREAK_SPAM": "Line Break Spam", + "ATTACHMENT": "Sending Attachments", + "EMOJI": "Emoji Spam", + "ZALGO": "Zalgo Text", + "LONG_TEXT": "Sending Long Text", + "URL": "Sending URLs", + "MENTION_USER": "User Mentions", + "MENTION_ROLE": "Role Mentions", + "MENTION_HERE": "Here Mention", + "MENTION_EVERYONE": "Everyone Mention", + "INVITATION": "Invite Link", + "PHISHING": "Phishing Link", + "IMAGE_HASH": "Inappropriate Image", + "CROSS_CHANNEL": "Cross-channel Spam", + "BLACKLIST_WORD": "Blacklisted Word", + "INACTIVE_CHANNEL": "Posting in Inactive Channel", + "NSFW_URL": "NSFW Link", + "ANTINUKE": "Anti-Nuke Detection", + "ANTINUKE_CHANNEL_DELETE": "Mass channel deletion", + "ANTINUKE_ROLE_DELETE": "Mass role deletion", + "ANTINUKE_CHANNEL_CREATE": "Mass channel creation", + "ANTINUKE_ROLE_CREATE": "Mass role creation", + "ANTINUKE_WEBHOOK_CREATE": "Mass webhook creation", + "ANTINUKE_BAN_KICK": "Mass member ban/kick", + "ANTINUKE_ROLE_GRANT": "Granted dangerous permissions to a role", + "AI_HARASSMENT": "AI Detection: Harassment", + "AI_HATE": "AI Detection: Hate Speech", + "AI_SEXUAL": "AI Detection: Sexual Content", + "AI_VIOLENCE": "AI Detection: Violence", + "AI_SELF_HARM": "AI Detection: Self-harm", + "AI_SCAM_PHISHING": "AI Detection: Scam / Phishing", + "AI_SERVER_RULE": "AI Detection: Server Rule Violation", + "AI_SPAM": "AI Detection: Spam" + }, + "legacy_automod": { + "category": { + "harassment": "Harassment", + "harassment/threatening": "Harassment (Threatening)", + "hate": "Hate", + "hate/threatening": "Hate (Threatening)", + "sexual": "Sexual", + "sexual/minors": "Sexual (Minors)", + "violence": "Violence", + "violence/graphic": "Violence (Graphic)", + "self-harm": "Self-harm", + "self-harm/intent": "Self-harm (Intent)", + "self-harm/instructions": "Self-harm (Instructions)", + "illicit": "Illicit", + "illicit/violent": "Illicit (Violent)" + }, + "thread_delete_reason": "Auto-deleted by Legacy AI Moderation", + "report": { + "title": "🛡️ Legacy AI Moderation Detection", + "thread_title": "🛡️ Legacy AI Moderation Detection (Thread)", + "author": "**Author:** <@{userId}> (`{userTag}`)", + "content": "**Content:**\n{content}", + "high_score": "**High-score categories:** {categories}", + "flagged": "**Flagged categories:** {categories}", + "auto_action": "**Auto action:** {action}", + "action_deleted": "Deleted", + "action_none": "None", + "jump": "[Jump to message]({url})", + "btn_jump": "📨 Jump to message", + "btn_delete": "Delete Message", + "btn_warn": "Send Warning" + }, + "delete": { + "success": "Message deleted.", + "failed": "Failed to delete the message.", + "not_found": "The target message was not found." + }, + "warn": { + "modal_title": "Send Warning", + "reason_label": "Warning Reason", + "reason_placeholder": "Enter the reason for the warning", + "bot_not_allowed": "You cannot send a warning to a bot.", + "success": "Sent a warning to <@{userId}>.", + "dm_failed": "Failed to DM <@{userId}> (their DMs may be closed).", + "dm_title": "⚠️ Warning", + "dm_body": "You have received a warning from **{guildName}**.\n**Reason:** {reason}", + "log_appended": "✅ <@{moderatorId}> sent a warning to <@{userId}>.\n**Reason:** {reason}" + } } } } diff --git a/en/web.json b/en/web.json index cb352b6..effdb90 100644 --- a/en/web.json +++ b/en/web.json @@ -18,6 +18,9 @@ "save": "Save", "saving": "Saving...", "saved": "Saved", + "unsavedChanges": "Unsaved changes", + "leaveWarning": "You have unsaved changes. Leave this page?", + "discard": "Discard changes", "cancel": "Cancel", "close": "Close", "loading": "Loading...", @@ -25,7 +28,8 @@ "notSet": "Not set", "buy": "Buy", "processing": "Processing...", - "soon": "Soon" + "soon": "Soon", + "back": "Back" }, "authBlocked": { "title": "Access blocked", @@ -43,7 +47,9 @@ "inviteBot": "Invite Bot", "viewDashboard": "View Dashboard", "pricing": "Pricing", - "changelog": "Changelog" + "changelog": "Changelog", + "security": "Security", + "subscription": "Subscription" }, "top": { "featuresSectionLabel": "Features", @@ -150,7 +156,9 @@ "open": "Open", "invite": "Add Bot", "reload": "Reload", - "refreshHint": "Don't see your server? Try refreshing after adding the bot." + "refreshHint": "Don't see your server? Try refreshing after adding the bot.", + "passkeyBtn": "Log in with Passkey", + "orDivider": "or" }, "sidebar": { "overview": "Overview", @@ -162,10 +170,20 @@ "subscription": "Subscription", "credits": "Credits", "allServers": "All Servers", + "searchServers": "Search servers...", "manageSubscription": "Manage Subscription", + "security": "Security", "logout": "Log Out", "messages": "Messages", - "workflow": "Workflow" + "workflow": "Workflow", + "automod": "Moderation", + "activityLog": "Activity Log", + "analytics": "Analytics" + }, + "featureGate": { + "title": "This feature is not available", + "desc": "The corresponding plan or feature flag is required to use this page.", + "upgrade": "Upgrade plan" }, "overview": { "desc": "Check your server status and available features", @@ -183,6 +201,68 @@ "aimod": { "label": "AI Moderation", "desc": "AI monitors and responds to chat in real time" + }, + "analytics": { + "title": "Analytics", + "messages": "Messages", + "members": "Member Changes", + "joins": "Joins", + "leaves": "Leaves", + "range7": "7 days", + "range30": "30 days", + "noData": "No data available" + }, + "widget": { + "customize": "Customize", + "done": "Done" + }, + "fastaccess": { + "title": "Quick Access" + }, + "recentwork": { + "title": "Recent Work", + "empty": "No recent activity yet", + "justNow": "Just now", + "minutesAgo": "{n}m ago", + "hoursAgo": "{n}h ago", + "daysAgo": "{n}d ago" + }, + "analyticsummary": { + "title": "This Week's Summary", + "messages": "Messages", + "joins": "Joins", + "leaves": "Leaves", + "netChange": "Net Change" + }, + "moderationMetrics": { + "title": "AI Moderation", + "screened": "Messages Screened", + "actions": "Actions Taken", + "detections": "Detections", + "range7": "7 days", + "range30": "30 days", + "categoryTitle": "Top Categories", + "timeseriesTitle": "Daily Detections", + "noData": "No data available", + "empty": "No moderation activity yet", + "error": "Failed to load moderation metrics", + "categories": { + "harassment": "Harassment", + "harassment/threatening": "Harassment (Threatening)", + "hate": "Hate", + "hate/threatening": "Hate (Threatening)", + "sexual": "Sexual", + "sexual/minors": "Sexual (Minors)", + "violence": "Violence", + "violence/graphic": "Violence (Graphic)", + "self-harm": "Self-harm", + "self-harm/intent": "Self-harm (Intent)", + "self-harm/instructions": "Self-harm (Instructions)", + "illicit": "Illicit", + "illicit/violent": "Illicit (Violent)", + "spam": "Spam", + "other": "Other" + } } }, "general": { @@ -259,11 +339,450 @@ "aimod": { "title": "AI Moderation", "desc": "Configure automatic chat monitoring and response by AI", + "logChannelLabel": "Log Channel", + "logChannelDesc": "Specify the channel to send AI moderation logs and review notices", "statusNotSet": "Not configured", "statusRunning": "Running", "statusStopped": "Stopped", "logTitle": "Moderation Logs", - "logEmpty": "No logs" + "logEmpty": "No logs", + "legacyAiSection": "Legacy AI Moderation Settings", + "legacyAiDesc": "Automatically reports and deletes messages based on omni-moderation scores", + "legacyAiLogChannelLabel": "Log Channel", + "legacyAiReportScoreLabel": "Report Score Threshold", + "legacyAiReportScoreDesc": "Lower is more sensitive; flagged messages are reported to the log", + "legacyAiDeleteScoreLabel": "Delete Score Threshold", + "legacyAiDeleteScoreDesc": "Messages above this value are auto-deleted (recommended ≥ report value)", + "legacyAiScoreRecommend": "Delete score should be greater than or equal to report score", + "legacyAiBypassChannelsLabel": "Bypass Channels", + "legacyAiBypassChannelsDesc": "Messages in these channels skip AI moderation", + "legacyAiBypassRolesLabel": "Bypass Roles", + "legacyAiBypassRolesDesc": "Users with these roles skip AI moderation", + "legacyAiBypassStringsLabel": "Bypass Strings", + "legacyAiBypassStringsDesc": "Messages containing these strings are skipped", + "legacyAiBypassStringPlaceholder": "Enter string to bypass", + "legacyAiBypassStringAdd": "Add", + "noChannel": "No channel", + "noRole": "No role", + "permissionDenied": "You don't have Master permission to change settings", + "saveError": "Failed to save", + "forbiddenTitle": "Access Denied", + "forbiddenDesc": "You need Master permission to view or edit moderation settings for this server.", + "modeLabel": "Moderation mode", + "modeDesc": "Choose how messages are automatically monitored", + "modeOff": "Off", + "modeOffDesc": "No automatic monitoring", + "modeLegacy": "Legacy", + "modeLegacyDesc": "Automatically detects, reports and removes inappropriate messages (free)", + "modeAdvanced": "Next-gen", + "modeAdvancedDesc": "Advanced AI moderation that understands context", + "advancedLaneSectionTitle": "AI Lane Settings", + "advancedLaneSectionDesc": "Configure detailed settings for next-gen AI moderation (advanced mode)", + "naturalLanguageRulesLabel": "Natural Language Rules", + "naturalLanguageRulesDesc": "Describe server-specific moderation rules in plain language. The AI will understand and apply them during evaluation", + "naturalLanguageRulesSurcharge": "Rules add +{cc} CC per judgment based on length (+1 CC per 500 characters)", + "naturalLanguageRulesNoSurcharge": "No additional CC — no rules set", + "naturalLanguageRulesPlaceholder": "e.g.\n- No political or religious debates\n- No content inappropriate for users under 18\n- Remove insulting remarks directed at other users", + "advancedViolationStorageLabel": "Advanced Violation Storage", + "advancedViolationStorageDesc": "AI classifies and stores violation reasons in detail. Useful for richer moderation logs, but consumes 2 CC per violation", + "modLogCompactLabel": "Compact Log", + "modLogCompactDesc": "Show moderator logs as a concise one-line entry. When off (default), logs are shown in detail with thumbnails and confidence gauges", + "nodeEditorLinkLabel": "Node Editor", + "nodeEditorLinkDesc": "Visually build and edit the moderation pipeline with nodes", + "nodeEditorLockedTooltip": "The node editor is available on a higher plan (NODE_EDITOR)", + "nodeEditorSectionTitle": "Node Editor", + "nodeEditorSectionDesc": "Build your AI moderation flow with the visual pipeline builder", + "nodeEditorOpenBtn": "Open Node Editor", + "nodeEditorAdvancedOnly": "Works in advanced mode only", + "modeOffFeature": "No monitoring", + "modeLegacyFeature": "Free · OpenAI score · Threshold-based deletion", + "modeAdvancedFeature": "Gemini context · CC cost · Auto punishment", + "presetLabel": "Detection preset", + "presetDesc": "Pick how strict detection should be. Choose Custom to fine-tune each value", + "preset_lenient_name": "Lenient", + "preset_lenient_desc": "Only auto-punishes very high-confidence verdicts", + "preset_lenient_trait": "False positives: minimal / Cost: low / Misses: more", + "preset_balanced_name": "Balanced", + "preset_balanced_desc": "A balanced default trading off confidence and cost", + "preset_balanced_trait": "False positives: medium / Cost: medium / Misses: medium", + "preset_strict_name": "Strict", + "preset_strict_desc": "Analyzes gray cases broadly to minimize misses", + "preset_strict_trait": "False positives: higher / Cost: high / Misses: minimal", + "preset_custom_name": "Custom", + "preset_custom_desc": "Set each threshold manually", + "preset_custom_trait": "Tune every value by hand", + "cfgConfidenceLabel": "Confidence threshold", + "cfgConfidenceDesc": "Only verdicts at or above this confidence are auto-punished. Higher is more cautious", + "cfgGrayLabel": "Gray detail-analysis threshold", + "cfgGrayDesc": "How aggressively ambiguous (gray) messages are sent to detailed AI analysis. Higher uses detailed analysis more (more cost)", + "cfgMinLenLabel": "Minimum content length", + "cfgMinLenDesc": "Messages shorter than this character count are excluded from AI analysis", + "cfgTrustedLabel": "Trusted-user sampling rate", + "cfgTrustedDesc": "What share of trusted users (no violation history) to spot-check. 0% skips them entirely", + "cfgScreenLabel": "First-pass screening sensitivity", + "cfgScreenDesc": "Sensitivity of the mechanical first-pass before AI analysis. Higher sends more messages to deeper analysis", + "cfgScreenLow": "Low", + "cfgScreenMedium": "Medium", + "cfgScreenHigh": "High", + "cfgDetailLlmLabel": "Detailed LLM analysis", + "cfgDetailLlmDesc": "Enable high-accuracy detailed AI analysis including prior history (increases CC cost)", + "cfgOn": "On", + "cfgOff": "Off", + "enforcementModeLabel": "Enforcement mode", + "enforcementModeDesc": "Choose how far AI verdicts are enforced automatically", + "enforcement_review_all_name": "Review everything", + "enforcement_review_all_desc": "Moderators review everything (AI never auto-punishes)", + "enforcement_auto_lowrisk_name": "Auto for low risk only (recommended)", + "enforcement_auto_lowrisk_desc": "Auto-punish only clear low-risk cases; everything else goes to review", + "enforcement_auto_full_name": "Full auto enforcement", + "enforcement_auto_full_desc": "Enforce automatically per policy verdict (trusted users always go to review)", + "aiActiveLabel": "Enable AI moderation", + "aiActiveDesc": "Runs AI verdicts for the advanced lane. When OFF, the bot will not run any verdicts even if advanced mode is selected", + "aiActiveOffWarning": "Currently OFF, so the bot will not run any verdicts even if advanced mode is selected", + "imageModerationLabel": "Image analysis (AI judges image contents)", + "imageModerationDesc": "When OFF, only text is analyzed and images are not sent to the AI (saves CC)", + "imageModerationSurchargeNote": "When images are actually sent to Gemini, image analysis adds +{cc} CC per image.", + "aiBypassSectionLabel": "AI bypass exclusions", + "aiBypassSectionDesc": "These exclusions skip the entire advanced AI lane, including both the default preset and node workflow lanes.", + "aiBypassChannelsLabel": "AI bypass channels", + "aiBypassChannelsDesc": "Messages in these channels skip advanced AI moderation. Threads also match the selected parent channel.", + "aiBypassRolesLabel": "AI bypass roles", + "aiBypassRolesDesc": "Users with these roles skip advanced AI moderation.", + "detections": { + "title": "Recent Detections", + "desc": "Latest messages flagged by AI moderation", + "empty": "No detections yet", + "error": "Failed to load detections", + "filterAll": "All", + "confidence": "Confidence", + "action": "Action", + "reason": "Reason", + "viewMessage": "View message", + "sourceAuto": "AI", + "sourceManual": "Manual", + "user": "User", + "justNow": "Just now", + "minutesAgo": "{n}m ago", + "hoursAgo": "{n}h ago", + "daysAgo": "{n}d ago", + "page": "Page", + "of": "of", + "total": "detections", + "categories": { + "harassment": "Harassment", + "harassment/threatening": "Harassment (Threatening)", + "hate": "Hate", + "hate/threatening": "Hate (Threatening)", + "sexual": "Sexual", + "sexual/minors": "Sexual (Minors)", + "violence": "Violence", + "violence/graphic": "Violence (Graphic)", + "self-harm": "Self-harm", + "self-harm/intent": "Self-harm (Intent)", + "self-harm/instructions": "Self-harm (Instructions)", + "illicit": "Illicit", + "illicit/violent": "Illicit (Violent)", + "spam": "Spam", + "other": "Other" + } + }, + "logs": { + "title": "Moderation Logs", + "desc": "View AI moderation execution logs", + "backToSettings": "Back to settings", + "filters": "Filters", + "clearFilters": "Clear", + "filterAction": "Action", + "filterActionPlaceholder": "e.g. delete, warn", + "filterStatus": "Status", + "filterStatusAll": "All", + "filterNodeType": "Node type", + "filterNodeTypePlaceholder": "e.g. screen, llm", + "statusCompleted": "Completed", + "statusFailed": "Failed", + "statusSkipped": "Skipped", + "statusPending": "Pending", + "error": "Failed to load logs", + "empty": "No logs yet", + "confidence": "Confidence", + "cost": "Cost", + "reason": "Reason", + "logId": "Log ID", + "messageRef": "Message ref", + "nodeId": "Node ID", + "nodeType": "Node type", + "actionParams": "Action parameters", + "pipelineTrace": "Pipeline trace", + "pageLabel": "Page" + } + }, + "aimodEditor": { + "title": "Node Editor", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "saved": "Saved", + "saveError": "Failed to save", + "paletteTitle": "Add node", + "imageSurchargeNote": "Node costs exclude image surcharge. Lite/Detail add +{cc}CC per image only when images are sent to Gemini.", + "close": "Close", + "deleteNode": "Delete node", + "noParams": "This node has no settings", + "stringListPlaceholder": "Type and press Enter to add", + "costBadge": "{cost}CC", + "categories": { + "input": "Input", + "utility": "Utility", + "mechanical": "Mechanical", + "ai": "AI", + "action": "Action" + }, + "handles": { + "next": "Next", + "true": "Match", + "false": "No match", + "safe": "Safe", + "gray": "Gray", + "violation": "Violation", + "else": "Else" + }, + "validation": { + "errorNoEntry": "A MessageReceived node is required", + "errorMultipleEntry": "Only one input node is allowed", + "errorCycle": "Cannot save: the pipeline contains a cycle (it would cause an infinite loop)", + "warningDisconnected": "There are disconnected nodes", + "errorMultipleOnError": "Only one error handler node is allowed" + }, + "fields": { + "channel": "Channel", + "channel_hint": "Channels to target. Leave empty to target all channels", + "category": "Category", + "category_hint": "Categories to target. All channels under them are included", + "user": "User", + "user_hint": "User IDs to target. Leave empty to target all users", + "role": "Role", + "role_hint": "Roles to target. Users with these roles are included", + "joinAge": "Time since join", + "joinAge_hint": "Filter by time since joining the server (e.g. 7d, 24h)", + "report_type": "Report type", + "report_type_hint": "How detailed the log report is. Normal = standard / Minimum = minimal / Debug = verbose", + "velocity_limit": "Velocity limit", + "velocity_limit_hint": "More joins/posts than this in a short window is treated as a raid", + "detect_bots": "Detect bots", + "detect_bots_hint": "Also detect mass joins/posts from bots", + "block_invites": "Block invites", + "block_invites_hint": "Block messages containing Discord invite links", + "block_scams": "Block scams", + "block_scams_hint": "Block messages matching known scam or phishing patterns", + "custom_patterns": "Custom patterns", + "custom_patterns_hint": "Add your own regex patterns to block", + "max_mentions": "Max mentions", + "max_mentions_hint": "A message with more mentions than this is flagged as a violation", + "sensitivity": "Sensitivity", + "sensitivity_hint": "Screening sensitivity. Higher sends more messages downstream as suspects", + "threshold": "Confidence threshold", + "threshold_hint": "If the latest verdict's confidence is at or above this, branch to true", + "message": "Target message", + "message_hint": "The message to act on. Use 'current' for the current message", + "duration": "Duration", + "duration_hint": "Punishment duration (e.g. 1h, 1d). Leave empty for permanent", + "delete_message": "Delete message range", + "delete_message_hint": "How far back to delete messages on ban (e.g. 1d). Empty deletes nothing", + "content": "Content", + "content_hint": "The body of the message to send", + "enableDynamicContext": "Dynamic Context Expansion", + "enableDynamicContext_hint": "When AI determines more context is needed, fetches additional messages and re-analyzes (+5CC)", + "deniedActions": "Excluded actions", + "deniedActions_hint": "Selected actions will not be executed" + }, + "actionKeys": { + "QUARANTINE": "Quarantine", + "TIMEOUT_24H": "Timeout 24h", + "TIMEOUT_1H": "Timeout 1h", + "TIMEOUT_30M": "Timeout 30m", + "TIMEOUT_10M": "Timeout 10m", + "TIMEOUT_5M": "Timeout 5m", + "DELETE_MESSAGE": "Delete Message", + "WARN": "Warn", + "SEND_TO_REVIEW_QUEUE": "Send to Review", + "ADD_SUSPICION_LEVEL_1": "Suspicion Lv1", + "NOTIFY_OWNER": "Notify Owner", + "MARK_COHORT_SUSPICION_LV2": "Suspicion Lv2", + "UNQUARANTINE": "Unquarantine" + }, + "nodes": { + "MessageReceived": { + "label": "Message Received", + "desc": "The pipeline entry point. Each posted message flows from here to the next node" + }, + "Rule": { + "label": "Rule", + "desc": "Evaluates against your natural-language rules and passes the result to the next node" + }, + "Condition": { + "label": "Condition", + "desc": "Branches into match / no-match based on channel/category/user/role/join age" + }, + "TimeWindowCondition": { + "label": "Time Window", + "desc": "Branches into match / no-match based on whether now falls in the given time window" + }, + "ParallelStart": { + "label": "Parallel Start", + "desc": "Runs several branches at once from here; they rejoin at Parallel End" + }, + "ParallelEnd": { + "label": "Parallel End", + "desc": "Waits for all branches from Parallel Start, then merges into one and continues" + }, + "SummaryReport": { + "label": "Summary Report", + "desc": "Sends the verdict so far to the log channel as a report (1CC)" + }, + "HistorySummarizer": { + "label": "History Summarizer", + "desc": "Summarizes recent conversation history so downstream AI nodes have context" + }, + "ReviewQueue": { + "label": "Review Queue", + "desc": "Adds to a human moderator review queue instead of auto-punishing" + }, + "AntiRaid": { + "label": "Anti-Raid", + "desc": "Detects mass joins/posts in a short window and branches match / no-match (0CC)" + }, + "RegexBlock": { + "label": "Regex Block", + "desc": "Checks invites, scams and custom regex patterns and branches match / no-match (0CC)" + }, + "TextFilter": { + "label": "Text Filter", + "desc": "Branches match / no-match on mechanical rules such as mention count (0CC)" + }, + "ThreatDb": { + "label": "Threat DB", + "desc": "Matches against a known threat database and branches match / no-match (0CC)" + }, + "Screen": { + "label": "Screen", + "desc": "Lightweight AI first pass; branches match / no-match so only suspects go to downstream LLMs (0CC)" + }, + "LiteLlm": { + "label": "Lite LLM", + "desc": "A lightweight AI (Gemini) reads the content and routes it to safe/gray/violation (2CC)" + }, + "DetailLlm": { + "label": "Detail LLM", + "desc": "A high-accuracy AI (Gemini) judges in detail including prior history, branching match / no-match (5CC)" + }, + "Confidence": { + "label": "Confidence", + "desc": "Compares the latest verdict's confidence to a threshold and branches match / no-match (2CC)" + }, + "ActionPolicy": { + "label": "Action Policy", + "desc": "Determines the punishment policy based on the verdict so far" + }, + "ExecuteAction": { + "label": "Execute Action", + "desc": "Executes the punishments decided by Action Policy together" + }, + "MessageDelete": { + "label": "Message Delete", + "desc": "Deletes the target message" + }, + "Timeout": { + "label": "Timeout", + "desc": "Times out (mutes) the target user for the given period" + }, + "Kick": { + "label": "Kick", + "desc": "Kicks the target user from the server" + }, + "Ban": { + "label": "Ban", + "desc": "Bans the target user. You can also set how far back to delete their messages" + }, + "Warn": { + "label": "Warn", + "desc": "Records and notifies a warning to the target user" + }, + "MessageSend": { + "label": "Message Send", + "desc": "Sends a message with the given content to the channel" + }, + "OnError": { + "label": "Error Handler", + "desc": "Continues from here when a node throws an error during execution. Connect to DM/message nodes for error notifications" + } + }, + "unsavedChanges": "Unsaved changes", + "unsavedDot": "●", + "emptyTitle": "No nodes yet", + "emptyDesc": "Drag nodes from the palette or start from a template", + "loadTemplate": "Load standard template", + "searchPlaceholder": "Search nodes...", + "unsavedTooltip": "You have unsaved changes", + "deleteEdge": "Delete edge", + "test": { + "open": "Test run", + "title": "Test run", + "subtitle": "Run a sample message through the current pipeline (unsaved changes included) and trace each node", + "inputLabel": "Sample message", + "inputPlaceholder": "Type a message to test, e.g. \"Join now https://discord.gg/...\"", + "charCount": "{count} / {max}", + "run": "Run", + "running": "Running...", + "rerun": "Run again", + "clear": "Clear", + "close": "Close", + "emptyHint": "Enter a sample message and press Run to see how each node judges it.", + "noTrace": "No nodes were executed", + "traceTitle": "Trace", + "stepLabel": "Step {n}", + "branchTaken": "Branch: {branch}", + "result": "Result: {result}", + "llmCalled": "LLM", + "duration": "{ms}ms", + "wouldExecute": "Would run: {actions}", + "verdict": { + "label": "Verdict", + "confidence": "Confidence {percent}%", + "severity": "Severity {severity}", + "categories": "Categories", + "reason": "Reason" + }, + "finalVerdict": "Final verdict", + "noFinalVerdict": "No final verdict", + "footer": { + "llmCalls": "LLM calls", + "estimatedCost": "Est. cost", + "cost": "{cc}CC", + "charged": "Charged", + "free": "Free (no charge)", + "freeRemaining": "Free CC left today: {cc}", + "partialShortfall": "Some checks were skipped due to insufficient credits" + }, + "errors": { + "title": "Test run failed", + "noFunds": "Free test runs for today are used up and you don't have enough Cube Credit. Add credits or try again tomorrow.", + "forbidden": "You don't have permission to run a test on this server.", + "botMissing": "The bot isn't in this server yet. Invite the bot before running a test.", + "noConfig": "AI moderation isn't set up yet. Add at least one node and try again.", + "generic": "Something went wrong while running the test. Please try again.", + "unavailable": "The bot is temporarily unavailable. Please try again in a moment." + }, + "actionsTitle": "Actions in production", + "noActions": "No actions (safe)", + "actions": { + "message_delete": "Delete message", + "member_timeout": "Timeout", + "member_kick": "Kick", + "member_ban": "Ban", + "warn": "Warn" + } + }, + "mobileAddNode": "Add node" }, "subscription": { "title": "Subscription", @@ -295,6 +814,39 @@ "buy": "Buy Credits", "history": "Transaction History", "noHistory": "No transaction history", + "spent": "Spent (last {days}d)", + "spentAi": "AI Moderation (last {days}d)", + "cc": "{amount} CC", + "charts": { + "usageTrend": "Consumption Trend", + "byCategory": "Consumption by Category", + "balanceTrend": "Balance Trend", + "daily": "Daily", + "weekly": "Weekly", + "noData": "No consumption data", + "consumed": "Consumed", + "balance": "Balance" + }, + "filter": { + "label": "Filter", + "all": "All", + "ai": "AI Moderation", + "purchase": "Purchase", + "other": "Other" + }, + "category": { + "ai_screen": "AI Screening", + "ai_lite": "AI Judgment (Lite)", + "ai_detail": "AI Judgment (Detail)", + "ai_advanced": "AI Judgment (Advanced)", + "ai_violation": "Violation Classification", + "purchase": "Purchase", + "subscription": "Subscription", + "admin": "Grant", + "manual": "Manual Adjustment", + "refund": "Refund", + "other": "Other" + }, "lots": { "title": "Expiry", "noLots": "No active credit lots", @@ -317,6 +869,10 @@ "selectDesc": "Choose the server you want to purchase for" }, "purchaseFlow": { + "purchaseFailed": "The purchase is incomplete or the session is invalid.", + "purchaseSuccess": "Thank you for your purchase!", + "purchaseSuccessDesc": "Returning to dashboard in {seconds} seconds...", + "backToDashboard": "Back to Dashboard", "subscriptionTitle": "Subscription", "ccTitle": "Buy Cube Credit", "popular": "Popular", @@ -376,7 +932,20 @@ "Priority support" ], "confirmTitle": "Purchase {plan} plan?", - "confirmDesc": "You will be billed ¥{price}/month. Cancel anytime." + "confirmDesc": "You will be billed ¥{price}/month. Cancel anytime.", + "consentTitle": "Before You Continue", + "consentDesc": "To proceed with your purchase, we need to verify your age and obtain your consent.", + "consentDob": "Date of birth", + "consentYear": "Year", + "consentMonth": "Month", + "consentDay": "Day", + "consentTermsLabel": "I agree to the Terms of Service and Privacy Policy", + "consentParentalLabel": "I have obtained parental permission to make this purchase", + "consentMinorNotice": "Because you are under 18, parental consent is required.", + "consentUnderageError": "Sorry, users under 13 are not eligible to make purchases.", + "consentDataNote": "Your date of birth is used solely for age verification and will be shared with Stripe for payment processing.", + "consentContinue": "Agree and continue", + "consentSubmitting": "Verifying..." }, "accountSub": { "title": "Subscription Management", @@ -457,7 +1026,15 @@ "changePlanChanging": "Changing...", "changePlanNote": "Changes will take effect from your next billing date.", "downgradeNotAllowed": "Downgrade is not allowed. Please cancel your current plan and resubscribe to a lower tier.", - "addNew": "Add new plan" + "addNew": "Add new plan", + "pagination": { + "prev": "Previous", + "next": "Next" + }, + "syncBtn": "Sync Subscription", + "syncOk": "Subscription info synced successfully", + "syncFail": "Sync failed", + "syncNote": "If your purchased subscription isn't showing up, click the sync button to fetch the latest info" }, "pricing": { "title": "Pricing", @@ -658,6 +1235,10 @@ "threads": { "name": "Threads", "desc": "Thread lifecycle changes" + }, + "automod": { + "name": "AutoMod", + "desc": "AutoMod rule create, update, and delete" } } }, @@ -710,6 +1291,14 @@ "name": "Message Update", "desc": "Log Message Update events" }, + "message_reaction_add": { + "name": "Message Reaction Add", + "desc": "Log Message Reaction Add events" + }, + "message_reaction_remove": { + "name": "Message Reaction Remove", + "desc": "Log Message Reaction Remove events" + }, "member_kick": { "name": "Member Kick", "desc": "Log Member Kick events" @@ -841,6 +1430,18 @@ "thread_delete": { "name": "Thread Delete", "desc": "Log Thread Delete events" + }, + "automod_rule_create": { + "name": "AutoMod Rule Created", + "desc": "Logs AutoMod rule creation events" + }, + "automod_rule_update": { + "name": "AutoMod Rule Updated", + "desc": "Logs AutoMod rule update events" + }, + "automod_rule_delete": { + "name": "AutoMod Rule Deleted", + "desc": "Logs AutoMod rule deletion events" } }, "options": { @@ -865,6 +1466,36 @@ "contentOptional": "(optional)", "contentPlaceholder": "Enter message content...", "addEmbed": "Add Embed", + "addActionRow": "Add Action Row", + "actionRow": { + "rowN": "Action Row {n}", + "typeButtons": "Buttons", + "typeSelect": "Select Menu", + "addButton": "Add Button", + "buttonLabel": "Label", + "buttonLabelPlaceholder": "Button text", + "buttonStyle": "Style", + "buttonStylePrimary": "Primary (Blue)", + "buttonStyleSecondary": "Secondary (Gray)", + "buttonStyleSuccess": "Success (Green)", + "buttonStyleDanger": "Danger (Red)", + "buttonStyleLink": "Link (URL)", + "customId": "Custom ID", + "customIdPlaceholder": "ID used in workflow", + "linkUrl": "URL", + "linkUrlPlaceholder": "https://...", + "selectCustomId": "Custom ID", + "selectCustomIdPlaceholder": "ID used in workflow", + "selectPlaceholder": "Placeholder", + "selectPlaceholderPlaceholder": "Please select", + "addOption": "Add Option", + "optionLabel": "Label", + "optionLabelPlaceholder": "Display text", + "optionValue": "Value", + "optionValuePlaceholder": "Value used in workflow", + "optionDescription": "Description (optional)", + "optionN": "Option {n}" + }, "send": "Send", "update": "Update", "cancel": "Cancel", @@ -907,7 +1538,8 @@ "title": "Sent Messages", "desc": "List of messages sent by Cube", "empty": "No sent messages yet", - "embedCount": "{count} embed(s)" + "embedCount": "{count} embed(s)", + "componentCount": "{count} component(s)" } }, "workflow": { @@ -999,6 +1631,36 @@ "messageDeleteTitle": "Message Delete Settings", "modalSubmitTitle": "Modal Submit Settings", "webhookReceiveTitle": "Webhook Receive Settings", + "rssPollTitle": "RSS Monitor Settings", + "youtubeWebsubTitle": "YouTube Post Notification Settings", + "twitchEventsubTitle": "Twitch Event Notification Settings", + "rssFeedUrl": "RSS Feed URL", + "rssFeedUrlHint": "Specify the RSS/Atom feed URL to monitor (http/https)", + "rssFeedUrlPlaceholder": "e.g. https://example.com/feed.xml", + "rssInterval": "Check Interval", + "rssIntervalHint": "Choose how often to check for new posts", + "rssIntervals": { + "5m": "Every 5 minutes", + "15m": "Every 15 minutes", + "30m": "Every 30 minutes", + "1h": "Every 1 hour", + "6h": "Every 6 hours", + "12h": "Every 12 hours", + "24h": "Every 24 hours" + }, + "youtubeChannelId": "YouTube Channel ID", + "youtubeChannelIdHint": "Specify the YouTube channel ID to receive notifications from", + "youtubeChannelIdPlaceholder": "e.g. UCxxxxxxxxxxxxxxxxxxxxxx", + "twitchBroadcasterUserId": "Twitch Broadcaster User ID", + "twitchBroadcasterUserIdHint": "Specify the broadcaster's numeric user ID", + "twitchBroadcasterUserIdPlaceholder": "e.g. 123456789", + "twitchSubscriptionTypes": "Event Types", + "twitchSubscriptionTypesHint": "Select which Twitch events should trigger the workflow", + "twitchSubscriptionTypeLabels": { + "stream_online": "Stream Online (stream.online)", + "stream_offline": "Stream Offline (stream.offline)", + "channel_update": "Channel Update (channel.update)" + }, "customIdFilter": "Custom ID (Optional)", "customIdFilterHint": "Only trigger for custom IDs starting with this value. Empty means all.", "customIdPlaceholder": "e.g. my-button", @@ -1013,6 +1675,8 @@ "webhookNoToken": "Webhook token not yet generated. It will appear after saving.", "allVoiceChannels": "All Voice Channels", "webhookUrlCopy": "Copy URL", + "webhookRegenerateTitle": "Regenerate URL", + "webhookRegenerateConfirm": "Regenerating the Webhook URL will invalidate the current URL. Continue?", "webhookUrlCopied": "Copied!", "webhookUrlDesc": "Send a POST request to this URL to trigger the workflow. JSON body fields are available as '{{webhook.payload.key}}'." }, @@ -1023,6 +1687,7 @@ "config": "Config", "match": "✓ Match", "unmatch": "✗ No Match", + "errorTrigger": "Error", "triggers": { "member_join": { "label": "Member Join", @@ -1083,6 +1748,18 @@ "webhook_receive": { "label": "Webhook Receive", "desc": "When a webhook request is received" + }, + "rss_poll": { + "label": "RSS Post", + "desc": "When a new item is published in the RSS feed" + }, + "youtube_websub": { + "label": "YouTube Post", + "desc": "When a new video is published on the channel" + }, + "twitch_eventsub": { + "label": "Twitch Event", + "desc": "When a selected Twitch event is received" } }, "conditions": { @@ -1150,7 +1827,18 @@ "validationThreadChannelEmpty": "\"Create Thread\" nodes require a target channel.", "validationRenameChannelEmpty": "\"Rename Channel\" nodes require a channel and a new name.", "validationAccountAgeEmpty": "\"Account Age\" nodes require a minimum number of days.", - "validationVarKeyEmpty": "\"Variable Value\" nodes require a variable name." + "validationVarKeyEmpty": "\"Variable Value\" nodes require a variable name.", + "validationScheduledCronMissing": "Scheduled triggers require a cron expression (the cron field).", + "validationScheduledCronInvalid": "Invalid cron expression. Use standard 5-field format (e.g. */5 * * * *).", + "validationScheduledCronTooFrequent": "Minimum execution interval is 5 minutes (e.g. */5 * * * *).", + "validationRssFeedUrlMissing": "RSS triggers require a feed URL.", + "validationRssFeedUrlInvalid": "RSS feed URL must be a valid http:// or https:// URL.", + "validationRssIntervalInvalid": "RSS interval is invalid.", + "validationYoutubeChannelIdMissing": "YouTube triggers require a channel ID.", + "validationTwitchBroadcasterUserIdMissing": "Twitch triggers require a broadcaster user ID.", + "validationTwitchBroadcasterUserIdInvalid": "Broadcaster user ID must contain numbers only.", + "validationTwitchSubscriptionTypesMissing": "Select at least one Twitch subscription type.", + "validationTwitchSubscriptionTypeInvalid": "Twitch subscription types include an invalid value." }, "logs": { "empty": "No execution logs", @@ -1248,6 +1936,8 @@ "buttonCustomIdPlaceholder": "e.g. confirm-btn", "buttonModeCustomId": "Custom ID", "buttonModeLinked": "Link Workflow", + "buttonModeContinue": "Continue", + "buttonModeContinueHint": "Clicking this button continues the same workflow. Use '{{button.label}}' and '{{button.index}}' to identify which button was pressed.", "buttonLinkedWorkflow": "Linked Workflow", "buttonLinkedWorkflowHint": "Workflow to run when this button is clicked", "buttonLinkedWorkflowPlaceholder": "Select a workflow...", @@ -1335,5 +2025,549 @@ "executionCount": "{count} executions", "planViolationBadge": "Plan limit", "duplicateError": "Failed to duplicate workflow" + }, + "admin": { + "title": "Cube Admin", + "loggedInAs": "Logged in as", + "exitAdmin": "Back to Dashboard", + "cancel": "Cancel", + "create": "Create", + "save": "Save", + "saving": "Saving...", + "add": "Add", + "nav": { + "dashboard": "Dashboard", + "subscriptions": "Subscriptions", + "users": "Users", + "guilds": "Servers", + "blacklist": "Blacklist", + "spamPatterns": "Spam Patterns", + "economy": "Economy", + "features": "Feature Flags", + "testGroups": "Test Groups", + "aiStats": "AI Stats" + }, + "dashboard": { + "title": "System Status", + "desc": "Real-time shard monitoring and control", + "totalGuilds": "Total Guilds", + "avgPing": "Avg Ping", + "totalMemory": "Total Memory", + "shards": "Shards", + "refresh": "Refresh", + "noShards": "No shard data available", + "errorShards": "Failed to load shard status", + "leaveBtn": "Leave", + "reloadI18nBtn": "Reload i18n", + "restartAllBtn": "Restart All", + "confirmRestartAll": "Are you sure you want to restart ALL shards? This will disconnect all bots momentarily.", + "confirmRestartShard": "Are you sure you want to restart Shard {id}?", + "confirmReloadI18n": "Are you sure you want to reload translation files?", + "confirmLeaveGuild": "Are you sure you want to force leave guild {id}?", + "restartAllOk": "Restart sequence initiated", + "restartAllFail": "Failed to initiate restart", + "restartShardOk": "Shard {id} restart initiated", + "restartShardFail": "Failed to restart shard", + "reloadI18nOk": "Translations reloaded successfully", + "reloadI18nFail": "Failed to reload translations", + "leaveGuildOk": "Left guild {id}", + "leaveGuildFail": "Failed to leave guild" + }, + "subscriptions": { + "title": "Subscriptions", + "create": "Create", + "createTitle": "Create Subscription", + "searchPlaceholder": "Search by name, email or guild...", + "colUser": "User", + "colGuild": "Guild", + "colStatus": "Status", + "colExpiry": "Expires", + "extend": "Extend", + "extendOk": "Subscription extended", + "extendFail": "Failed to extend subscription", + "empty": "No subscriptions found", + "syncBtn": "Sync with Stripe", + "confirmSync": "Sync all subscriptions from Stripe to DB?", + "syncOk": "Synced {synced} subscriptions (errors: {errors})", + "syncFail": "Sync failed", + "cancelAtEnd": "cancels at period end", + "syncUserPlaceholder": "User ID", + "confirmSyncUser": "Sync subscription info for user {userId}?" + }, + "blacklist": { + "title": "Blacklist", + "add": "Add", + "addTitle": "Add to Blacklist", + "addBtn": "Add", + "reason": "Reason", + "isBlacklisted": "Banned", + "isMuted": "GC Muted", + "searchPlaceholder": "Search by User ID or reason...", + "confirmRemove": "Remove user {userId} from blacklist?", + "removeOk": "Removed from blacklist", + "removeFail": "Failed to remove", + "empty": "Blacklist is empty" + }, + "guilds": { + "title": "Server List", + "searchPlaceholder": "Search by name or ID...", + "colName": "Server Name", + "confirmDelete": "Delete all data for {name}? This cannot be undone.", + "deleteOk": "Server data deleted", + "deleteFail": "Failed to delete", + "empty": "No servers found", + "syncBtn": "Sync Bot", + "confirmSync": "Sync servers the Bot has joined to the DB?", + "syncOk": "Synced {synced} servers", + "syncFail": "Sync failed", + "leaveBtn": "Leave", + "confirmLeave": "Remove the Bot from {name}?", + "leaveOk": "Bot left the server", + "leaveFail": "Failed to leave", + "notFound": "Server not found", + "saveOk": "Settings saved", + "saveFail": "Failed to save", + "detailSettings": "Settings", + "detailLang": "Language", + "detailCreated": "Created", + "detailUpdated": "Updated", + "detailCredits": "Credits", + "creditPaid": "Paid", + "creditBonus": "Bonus", + "creditTotal": "Total", + "detailSubscription": "Subscription", + "noSubscription": "No subscription", + "detailExpiry": "Expires", + "detailFeatures": "Feature flags", + "featureFromPlan": "plan", + "featureRawValue": "Raw value", + "addPurge": "Add Auto Purge", + "purgeDesc": "{msgLimit} msgs / every {interval} min", + "msgLimit": "Message Limit", + "msgs": "msgs", + "purgeInterval": "Purge Interval", + "min": "min", + "addReact": "Add Auto React", + "emoji": "Emoji", + "roleKeeperTitle": "Role Keeper", + "rkEnable": "Enable", + "rkEnableDesc": "Enable the Role Keeper module", + "rkExcludeAdmin": "Exclude admin roles", + "rkExcludeAdminDesc": "Skip roles with administrator permissions", + "rkExcludeMod": "Exclude mod roles", + "rkExcludeModDesc": "Skip roles with moderation permissions", + "addSticky": "Add Sticky Message", + "stickyContent": "Message Content", + "workflowTitle": "Workflows", + "noWorkflows": "No workflows found", + "execCount": "{count} executions", + "confirmDeleteWorkflow": "Delete this workflow? This cannot be undone." + }, + "economy": { + "title": "Economy Management", + "grantTitle": "Grant Credits", + "grantAllTitle": "Grant to All Servers", + "grantAllDesc": "Grant bonus credits to all active servers. A confirm key is required.", + "amount": "Amount", + "type": "Type", + "reason": "Reason", + "confirmKey": "Confirm Key", + "confirmGrantAll": "Grant {amount} CC to all servers?", + "confirmKeyMismatch": "Confirm key does not match", + "grantBtn": "Grant", + "grantAllBtn": "Grant to All", + "grantOk": "Credits granted", + "grantFail": "Failed to grant credits", + "grantAllOk": "Bulk grant executed", + "grantAllFail": "Failed to execute bulk grant" + }, + "users": { + "title": "User Lookup", + "searchPlaceholder": "Discord ID or User ID", + "searchBtn": "Search", + "notFound": "User not found", + "economyTitle": "Credit Balance", + "confirmDelete": "Delete all data for {name}? This cannot be undone.", + "deleteBtn": "Delete User", + "deleteOk": "User data deleted", + "deleteFail": "Failed to delete user" + }, + "aiStats": { + "title": "AI Moderation Stats", + "desc": "Real AI moderation usage, CC, estimated provider cost, and profitability", + "guildIdPlaceholder": "Guild ID (blank for overall stats)", + "scopeLabel": "Scope", + "scopeGlobal": "Overall", + "scopeGuild": "Guild-specific", + "allGuilds": "All guilds", + "guildIdLabel": "Guild ID", + "guildCount": "Guilds: {count}", + "search": "Search", + "period": "Period", + "days7": "7 days", + "days30": "30 days", + "days90": "90 days", + "totalMessages": "Messages Processed", + "laneMessages": "Default / Workflow", + "reachRate": "Reach Rate", + "tokenUsage": "Token Usage", + "ccUsage": "CC Usage", + "estimatedCc": "Estimated CC", + "paidBonusFreeCc": "Paid / Bonus / Free CC", + "consumedCc": "Consumed CC", + "billableCc": "Consumed CC", + "paidCc": "Paid CC", + "bonusCc": "Bonus CC", + "freeCc": "Free CC", + "billableFreeCc": "Billable / Free CC", + "avgCcPerMessage": "Avg CC/message", + "providerCost": "Estimated Provider Cost", + "grossProfit": "Estimated Gross Profit", + "grossMargin": "Gross Margin", + "avgTokens": "Avg Tokens/Call", + "summaryNote": "Average tokens/message: {avgTokens}. Estimated revenue from paid CC only: {revenue}.", + "unmeasured": "Unmeasured", + "unmeasuredCostNote": "Some provider costs are unmeasured, so gross profit and margin are N/A.", + "inputTokens": "Input Tokens", + "outputTokens": "Output Tokens", + "thinkingTokens": "Thinking Tokens", + "totalTokens": "Total Tokens", + "screen": "Screen", + "lite": "LiteLLM", + "detail": "DetailLLM", + "confidence": "Confidence", + "classify": "Classify", + "noData": "No data. Guild ID is optional; leave it blank and search to show overall stats.", + "loading": "Loading...", + "dailyTrend": "Daily Trend", + "nodeBreakdown": "Node Breakdown" + } + }, + "automod": { + "unknownUser": "Unknown", + "title": "Unified Moderation", + "desc": "Configure AutoMod, AntiRaid, and JoinGate settings", + "tabFilters": "Filters", + "tabProtection": "Protection", + "tabVerification": "Verification", + "tabPermissions": "Permissions", + "tabWhitelist": "Whitelists", + "whitelistDesc": "Configure users, roles, and channels to be exempt from each rule", + "automodSection": "AutoMod", + "automodDesc": "Automatically detects and responds to spam and suspicious messages", + "enabled": "Enabled", + "disabled": "Disabled", + "heatPresetLabel": "Heat Preset", + "heatPresetDesc": "Adjust sensitivity to violations and the strength of sanctions", + "lenientLabel": "Lenient", + "lenientDesc": "Tolerates minor violations", + "standardLabel": "Standard", + "standardDesc": "Balanced default configuration", + "strictLabel": "Strict", + "strictDesc": "Responds quickly to even minor violations", + "logChannelLabel": "Log Channel", + "logChannelDesc": "Channel to receive moderation action notifications", + "noChannel": "No channel", + "quarantineRoleLabel": "Quarantine Role", + "quarantineRoleDesc": "Role assigned to quarantined users", + "noRole": "No role", + "panicModeLabel": "Emergency Mode", + "panicModeDesc": "When enabled, significantly lowers the action threshold for all users", + "crossServerOptInLabel": "Cross-Server Risk Sharing", + "crossServerOptInDesc": "When enabled, anonymously contributes violation data to the cross-server risk database to improve threat detection across servers", + "trustedRolesLabel": "Trusted Roles (AutoMod Bypass)", + "trustedRolesDesc": "Members with these roles will bypass all AutoMod detection", + "antiNukeSection": "AntiNuke", + "antiNukeDesc": "Detects and responds to destructive server actions (channel deletion, mass bans, etc.)", + "antiNukeChannelDeleteLabel": "Channel delete", + "antiNukeRoleDeleteLabel": "Role delete", + "antiNukeChannelCreateLabel": "Channel create", + "antiNukeRoleCreateLabel": "Role create", + "antiNukeWebhookCreateLabel": "Webhook create", + "antiNukeBanKickLabel": "Ban/Kick", + "antiNukeRoleGrantLabel": "Role grant", + "antiNukeLimitSuffix": "actions trigger", + "antiNukeWindowSuffix": "sec window", + "antiRaidSection": "AntiRaid", + "antiRaidDesc": "Detects and responds to raid attacks (mass joins)", + "antiRaidJoinRateLabel": "Join Rate Limit", + "antiRaidJoinRateDesc": "Triggers raid detection when this many users join within the time window", + "antiRaidWindowLabel": "Join Window (seconds)", + "antiRaidAccountAgeLabel": "Account Age (days)", + "antiRaidAccountAgeDesc": "Accounts newer than this many days add to the raid score", + "joinGateSection": "JoinGate", + "joinGateDesc": "Quarantines and requires verification from suspicious new joiners", + "joinGateFilterNoAvatarLabel": "Filter Default Avatars", + "joinGateFilterNoAvatarDesc": "Quarantine accounts with no profile picture", + "joinGateFilterNewAccountLabel": "Filter New Accounts (days)", + "joinGateFilterNewAccountDesc": "Quarantine accounts newer than this many days. 0 to disable", + "joinGateFilterAdvertisingLabel": "Filter Advertising Accounts", + "joinGateFilterAdvertisingDesc": "Quarantine accounts with invite links or banned URLs in their profile", + "joinGateFilterUnverifiedBotLabel": "Filter Unverified Bots", + "joinGateFilterUnverifiedBotDesc": "Quarantine bot accounts that are not verified by Discord", + "joinGateFilterUnauthorizedBotLabel": "Filter Unauthorized Bots", + "joinGateFilterUnauthorizedBotDesc": "Quarantine bots added by members without Master permissions", + "powGateSectionInner": "Verification Flow (PoW Gate)", + "powGateRoleReady": "Configured", + "powGateRoleNotReady": "Not set (auto-created after setup)", + "quarantineRoleReady": "Configured", + "quarantineRoleNotReady": "Not configured", + "powGateSection": "PoW Gate (Human Verification)", + "powGateDesc": "Require Cloudflare Turnstile human verification to prevent bots and raiders", + "powGateAllUsersLabel": "Apply to All New Members", + "powGateAllUsersDesc": "When off, only targets users who triggered JoinGate filters", + "powGateRoleLabel": "Restricted Role", + "powGateRoleDesc": "Role assigned before verification (automatically removed after success)", + "powGateChannelLabel": "Verification Channel", + "powGateChannelDesc": "Fallback channel when DM fails (permissions auto-adjusted on save)", + "powGateTimeoutLabel": "Timeout", + "powGateTimeoutDesc": "Minutes before auto-kicking unverified users (0 to disable)", + "minutes": "min", + "messages": "msgs", + "limit": "Limit", + "window": "Window", + "age": "Age", + "automodRules": "Rule Settings", + "quarantineSetupBanner": "Quarantine Role Not Configured", + "quarantineSetupBannerDesc": "Moderation features are enabled but the quarantine role is not set up. Click the button to have the bot auto-create the role and configure channel permissions.", + "quarantineSetupBtn": "Setup Now", + "quarantineSetupRequesting": "Setting up...", + "quarantineSetupDone": "Setup requested. Changes will apply in a few seconds.", + "setupBtn": "Setup", + "requesting": "Processing...", + "setupDone": "Done", + "discordRegistered": "Synced with Discord", + "discordNotRegistered": "Not synced with Discord", + "discordRegisterBtn": "Sync with Discord", + "discordRegistering": "Syncing...", + "ruleMentionSpam": "Mention Spam", + "ruleMentionSpamDesc": "Adds heat for @user / @role / @here / @everyone mentions", + "ruleInviteLink": "Invite Links", + "ruleInviteLinkDesc": "Detect unauthorized Discord invite URLs", + "ruleEmojiSpam": "Emoji Spam", + "ruleEmojiSpamDesc": "+1% per emoji, capped at +20% per message", + "ruleCharSpam": "Character Spam", + "ruleCharSpamDesc": "Detect repeated characters or Zalgo text", + "ruleUrlScan": "URL Scanning", + "ruleUrlScanDesc": "Expand short URLs → check with Safe Browsing API", + "ruleImageHash": "Spam Image Blocking", + "ruleImageHashDesc": "Compares images against Cube's spam/NSFW database and auto-removes matches", + "ruleCrossChannel": "Cross-Channel", + "ruleCrossChannelDesc": "Detect similar posts across multiple channels in short time", + "rulePhishing": "Phishing", + "rulePhishingDesc": "Detect known phishing domains and scam URL patterns", + "ruleBlacklistWord": "Blacklist Words", + "ruleBlacklistWordDesc": "Add heat to messages containing admin-configured words", + "blacklistWordAdd": "Add", + "blacklistWordPlaceholder": "Enter forbidden word", + "blacklistWordPlaceholder_text": "Enter forbidden word (substring match)", + "blacklistWordPlaceholder_wildcard": "e.g. *badword* or spam*", + "blacklistWordPlaceholder_regex": "e.g. (bad|spam)\\w+", + "blacklistWordType_text": "Text", + "blacklistWordType_wildcard": "Wildcard", + "blacklistWordType_regex": "Regex", + "blacklistWordWildcardHint": "* matches any sequence of characters. e.g. *word* for substring, word* for prefix", + "blacklistWordRegexHint": "JavaScript regex supported (up to 10 regex patterns are synced to Discord AutoMod)", + "blacklistWordHeat": "Heat Value", + "blacklistWordHeatHelp": "1–100 (default 30%)", + "ruleInactiveChannel": "Inactive Channel Post", + "ruleInactiveChannelDesc": "Add +3% heat for posting in channels with no recent activity", + "inactiveChannelThreshold": "Inactivity threshold (days)", + "nightTimeRange": "Night Hours (JST)", + "nightTimeRangeDesc": "Severity threshold is lowered during this window (night-time policy)", + "nightTimeRangeTo": "to", + "spamHashManagement": "Known Spam Image Hashes", + "spamHashAdd": "Add Hash", + "spamHashPlaceholder": "dHash bit string (64 chars)", + "spamHashLabelPlaceholder": "Label (optional)", + "save": "Save", + "saving": "Saving...", + "saved": "Saved", + "saveError": "Failed to save", + "days": "days", + "people": "people", + "seconds": "sec", + "alwaysOnRulesWhitelist": "Always-on Rule Exemptions", + "ruleMessageSend": "Message Send", + "ruleMessageSendDesc": "Every message sent (+2% always)", + "ruleMessageRepeat": "Repeated Messages", + "ruleMessageRepeatDesc": "Content similar to the previous message (+8% always)", + "ruleAttachment": "Attachments", + "ruleAttachmentDesc": "Image and file attachments (+4% each, always)", + "whitelistSection": "Whitelist", + "whitelistRoles": "Exempt Roles", + "whitelistChannels": "Exempt Channels", + "whitelistAddPlaceholder": "Enter ID", + "whitelistEmpty": "No exemptions set", + "mastersSection": "Moderation Admins (Master)", + "mastersDesc": "Users who can modify moderation settings (independent of Discord admin permissions)", + "trustedSection": "Exempt Users (Trusted)", + "trustedDesc": "Users exempt from Heat, AI, AntiNuke and other enforcement actions", + "addMaster": "Add Master", + "addTrusted": "Add Trusted", + "userIdPlaceholder": "Discord UserID", + "remove": "Remove", + "permissionDenied": "You don't have Master permission to change settings", + "exemptHeatLane": "Heat Lane Exempt", + "exemptAiLane": "AI Lane Exempt", + "exemptAntinuke": "AntiNuke Exempt", + "exemptAntiraid": "AntiRaid Exempt", + "tabSchedule": "Schedule", + "scheduleSection": "Scheduled Security Rules", + "scheduleSectionDesc": "Automatically change server security settings during specific times or periods.", + "scheduleAddRule": "Add Rule", + "scheduleRuleType": "Action", + "scheduleRuleTypeInviteDisable": "Disable Invites", + "scheduleRuleTypeDmDisable": "Disable DMs", + "scheduleRuleTypeSecurityLevel": "Change Verification Level", + "scheduleScheduleType": "Schedule Type", + "scheduleTimeRange": "Daily Time Range", + "scheduleDateRange": "One-time Date Range", + "scheduleStartTime": "Start Time (JST)", + "scheduleEndTime": "End Time (JST)", + "scheduleStartDate": "Start Date", + "scheduleEndDate": "End Date", + "scheduleSecurityLevel": "Verification Level", + "scheduleSecurityLevelNone": "None (0)", + "scheduleSecurityLevelLow": "Low (1)", + "scheduleSecurityLevelMedium": "Medium (2)", + "scheduleSecurityLevelHigh": "High (3)", + "scheduleSecurityLevelVeryHigh": "Very High (4)", + "scheduleLabel": "Label (optional)", + "scheduleLabelPlaceholder": "e.g. Nightly security boost", + "scheduleEnabled": "Enabled", + "scheduleDeleteConfirm": "Delete this rule?", + "scheduleNoRules": "No schedule rules", + "scheduleRuleTypeInviteDisableDesc": "Pauses server invite links during the selected time window.", + "scheduleRuleTypeDmDisableDesc": "Pauses member-to-member DMs through the server during the selected time window.", + "scheduleRuleTypeSecurityLevelDesc": "Raises the verification level only during the window, then restores the original level automatically.", + "scheduleTimeRangeHint": "Applied repeatedly every day during this window (JST). Overnight ranges (e.g. 22:00→08:00) are supported.", + "scheduleDateRangeHint": "Applied once between the start and end date/time.", + "schedulePreviewLabel": "Preview", + "schedulePreviewTimeRange": "Every day from {start} to {end} JST, {action}", + "schedulePreviewDateRange": "Between {start} and {end}, {action}", + "scheduleActionInviteDisable": "invite links are paused.", + "scheduleActionDmDisable": "member DMs are paused.", + "scheduleActionSecurityLevel": "the verification level is raised to \"{level}\".", + "scheduleAddRuleTitle": "Add Rule", + "scheduleEditRuleTitle": "Edit Rule", + "scheduleSave": "Save", + "scheduleSaved": "Saved", + "scheduleDailyHint": "Applied automatically during this window every day (JST). Overnight ranges (e.g. 22:00 → 08:00 next day) are supported.", + "scheduleEnableLog": "Enable logging", + "scheduleEnableLogDesc": "Send a log when this starts and ends.", + "scheduleLogChannel": "Log channel", + "scheduleSelectChannel": "Select a channel", + "scheduleLevelLowDesc": "Only email-verified accounts", + "scheduleLevelMediumDesc": "Only accounts registered on Discord for more than 5 minutes", + "scheduleLevelHighDesc": "Only accounts in this server for more than 10 minutes", + "scheduleLevelVeryHighDesc": "Only phone-verified accounts" + }, + "accountSecurity": { + "title": "Security", + "desc": "Register passkeys to log in even if you lose access to Discord", + "passkeyTitle": "Passkeys", + "passkeyDesc": "Use registered passkeys to log in during emergencies", + "addPasskey": "Add Passkey", + "adding": "Registering...", + "noPasskeys": "No passkeys registered", + "noPasskeysDesc": "Add a passkey so you can log in even if you lose your Discord account", + "deletePasskey": "Delete", + "deleting": "Deleting...", + "addSuccess": "Passkey registered", + "addError": "Failed to register passkey", + "deleteSuccess": "Passkey deleted", + "deleteError": "Failed to delete passkey", + "registeredAt": "Registered", + "addModalTitle": "Name your Passkey", + "addModalDesc": "Enter a name that helps you identify this device.", + "addModalPlaceholder": "e.g. My iPhone, Work PC", + "addModalBtn": "Start Registration" + }, + "activityLog": { + "title": "Activity Log", + "desc": "View the history of settings changes and actions performed in the dashboard", + "empty": "No activity logs found", + "loadMore": "Load more", + "loading": "Loading...", + "filterAll": "All", + "page": "Page", + "of": "of", + "total": "entries", + "categories": { + "module": "Module", + "workflow": "Workflow", + "audit_log": "Audit Log Settings", + "guild": "Server Settings", + "moderation": "Moderation", + "ai_moderation": "AI Moderation", + "general": "General" + }, + "actions": { + "auto_purge_updated": "Updated auto purge settings", + "auto_purge_deleted": "Deleted auto purge settings", + "auto_react_updated": "Updated auto react settings", + "auto_react_deleted": "Deleted auto react settings", + "role_keeper_updated": "Updated role keeper settings", + "role_keeper_deleted": "Deleted role keeper settings", + "workflow_created": "Created workflow", + "workflow_updated": "Updated workflow", + "workflow_deleted": "Deleted workflow", + "audit_log_channel_set": "Set audit log channel", + "guild_settings_updated": "Updated server settings", + "moderation_settings_updated": "Updated moderation settings" + } + }, + "analytics": { + "title": "Moderation Analytics", + "rangePicker": { + "7d": "Last 7 days", + "30d": "Last 30 days" + }, + "flow": { + "title": "Flow Analysis", + "totalExecutions": "Total Executions", + "nodeType": "Node", + "entered": "Entered", + "passed": "Passed", + "passRate": "Pass Rate", + "noData": "No data available" + }, + "verdict": { + "title": "Verdict Distribution", + "safe": "Safe", + "gray": "Gray", + "violation": "Violation" + }, + "category": { + "title": "Category Distribution" + }, + "ccUsage": { + "title": "CC Usage", + "totalCc": "Total CC", + "date": "Date", + "cc": "CC", + "byNodeType": "By Node Type" + }, + "userStats": { + "title": "Top Violating Users", + "userId": "User ID", + "violations": "Violations", + "categories": "Categories", + "lastViolation": "Last Violation", + "noUsers": "No users found", + "viewDetails": "View Details" + }, + "userViolations": { + "title": "Violation Log", + "back": "Back", + "ruleType": "Rule", + "reason": "Reason", + "action": "Action", + "content": "Content", + "noViolations": "No violation logs", + "retentionNote": "Your current plan ({plan}) shows the last {days} days", + "page": "Page {page} of {total}" + } } } diff --git a/ja/bot.json b/ja/bot.json index 5c9bc05..aac2d2f 100644 --- a/ja/bot.json +++ b/ja/bot.json @@ -378,6 +378,67 @@ }, "ping": { "description": "Ping値を表示します" + }, + "sus": { + "description": "不審者(Suspicion)レベルを手動で管理します。", + "add": { + "description": "ユーザーに不審者レベルを付与します。", + "options": { + "user": { + "description": "対象のユーザー" + }, + "level": { + "description": "付与するレベル (1:GRAY, 2:BLACKISH, 3:DANGER)" + } + } + }, + "remove": { + "description": "ユーザーの不審者レベルを解除します。", + "options": { + "user": { + "description": "対象のユーザー" + } + } + } + }, + "mod": { + "description": "高度なモデレーションコマンド", + "quarantine": { + "description": "ユーザーを隔離(隔離ロール付与+権限剥奪)します。", + "options": { + "user": { + "description": "隔離するユーザー" + }, + "reason": { + "description": "隔離の理由" + } + } + }, + "unquarantine": { + "description": "ユーザーの隔離を解除します。", + "options": { + "user": { + "description": "解除するユーザー" + }, + "reason": { + "description": "解除の理由" + } + } + }, + "info": { + "description": "ユーザーのモデレーションステータス(Heat, Suspicion等)を表示します。", + "title": "{user} のモデレーション情報", + "heat": "現在のHeat", + "suspicion": "不審者レベル", + "last_violation": "最終違反日時", + "trust_status": "信頼ステータス", + "violations": "違反履歴カウント", + "options": { + "user": { + "description": "情報を表示するユーザー" + } + } + } } }, "context": { @@ -417,6 +478,12 @@ } }, "manage": { + "warn": { + "cannot_warn_self": "❌ 自分自身または Bot に警告を送ることはできません。", + "dm_title": "⚠️ 警告", + "dm_body": "**{guildName}** のモデレーターから警告を受けました。\n**理由:** {reason}\n\nサーバーのルールを確認してください。", + "success": "✅ <@{userId}> に警告を記録しました。\n**理由:** {reason}" + }, "clear": { "confirm_description": "これより後のメッセージが削除されます。", "error": { @@ -490,7 +557,8 @@ "success": "✅ {user} にロールを与えました。", "cant_find_role_or_member": "❌ ロールまたはメンバーが見つかりませんでした。", "failed_add_role": "❌ {user}にロールを与えられませんでした。\nロールの順序と権限を確認してください。", - "already_has_role": "❌ {user} already has the role." + "already_has_role": "❌ {user} already has the role.", + "dangerous_role_blocked": "❌ このロールは危険な権限を持っているため、AntiNuke免除のないユーザーは付与できません。" }, "remove": { "success": "✅ {user} からロールを削除しました。", @@ -548,6 +616,53 @@ "delete": { "success": "ピン留めメッセージを削除しました。" } + }, + "sus": { + "added": "✅ <@{userId}> に Suspicion Level {level} を付与しました。", + "removed": "✅ <@{userId}> の Suspicion Level を解除しました。", + "already_exists": "ユーザー <@{userId}> はすでにその状態であるか、処罰をスキップしました。" + }, + "report": { + "self_error": "自分自身やBotを通報することはできません。", + "reporter_prefix": "通報者: {moderatorTag} — {reason}", + "success": "✅ <@{userId}> を通報しました。モデレーターが確認します。", + "modal_title": "メッセージを通報", + "modal_reason_label": "通報理由", + "modal_reason_placeholder": "スパム、ハラスメント、規約違反など…", + "no_content": "テキストなし", + "log_title": "メッセージ通報", + "log_reporter": "通報者", + "log_target": "対象ユーザー", + "log_channel": "チャンネル", + "log_reason": "理由", + "log_message": "メッセージ内容" + }, + "verify": { + "not_found": "メンバーが見つかりませんでした。", + "no_role_configured": "認証ロール(PoW Gate)が設定されていません。", + "not_in_gate": "<@{userId}> は認証待ちではありません。", + "success": "✅ <@{userId}> の認証を完了しました。" + }, + "quarantine": { + "cannot_quarantine_self": "自分自身またはBotを隔離することはできません。", + "modal_title": "メンバーを隔離", + "modal_reason_label": "理由(任意)", + "modal_reason_placeholder": "例: スパム行為、不審な行動など", + "not_found": "メンバーが見つかりませんでした。", + "manual_prefix": "モデレーターによる手動隔離", + "success": "✅ <@{userId}> を隔離しました。", + "already_quarantined": "<@{userId}> はすでに隔離されています。" + }, + "flag_suspicious": { + "cannot_flag_self": "自分自身またはBotにSuspicion Levelを付与することはできません。", + "success": "✅ <@{userId}> にSuspicion Level 1(グレー)を付与しました。" + }, + "setup": { + "owner_only": "❌ このコマンドはサーバーオーナーのみ実行できます。", + "already_setup": "❌ 既にセットアップ済みです。", + "success": "✅ セットアップが完了しました。", + "no_manage_roles": "❌ Botに **ロールの管理** 権限がありません。権限を付与してから再度お試しください。", + "role_too_low": "❌ Botのロール(**{roleName}**)が低すぎます。ロール一覧の上から3番目以内に移動してから再度お試しください。" } }, "info": { @@ -666,7 +781,11 @@ "invalid_format": "❌無効な時間形式です。例: 5s, 2m, 1h", "blacklisted": "❌ ブラックリストに登録されています。", "no_permission": "❌ このコマンドを実行するには {permission} 権限が必要です。", - "no_available": "❌ このコマンド/機能は利用できません。" + "no_available": "❌ このコマンド/機能は利用できません。", + "missing_permissions": "❌ The bot is missing required permissions. Please check your server settings.", + "missing_access": "❌ The bot cannot access this channel. Please check the channel permissions.", + "unknown_message": "❌ The target message was not found. It may have already been deleted.", + "cannot_send_dm": "❌ Cannot send a DM to this user. They may have DMs disabled." }, "yes": "はい", "no": "いいえ", @@ -769,6 +888,9 @@ "user": "ユーザー", "author": "送信者", "deleted_by": "削除者", + "deleted_by_moderation": "Cube(自動モデレーション)", + "deleted_by_moderation_with_reason": "Cube(自動モデレーション)— {reason}", + "deleted_by_unknown_self": "不明(自己削除の可能性)", "kicked_by": "キック実行者", "banned_by": "BAN実行者", "unbanned_by": "BAN解除者", @@ -881,7 +1003,40 @@ "message_content": "メッセージ内容", "before_embed_preview": "編集前Embed", "after_embed_preview": "編集後Embed", - "removed": "削除" + "removed": "削除", + "embeds_deleted_threaded": "削除されたメッセージのEmbed(詳細はスレッド)", + "embed_deleted_thread_name": "deleted-embed-{id}", + "embed_deleted_thread_intro": "このスレッドには削除されたメッセージのEmbedプレビューが保存されています。", + "deleted_embed_preview": "削除前Embed", + "emoji": "絵文字", + "message": "メッセージ", + "enabled": "有効", + "disabled": "無効", + "afk_channel": "AFKチャンネル", + "afk_timeout": "AFKタイムアウト", + "mfa_level": "2段階認証要件", + "widget_enabled": "ウィジェット", + "widget_channel": "ウィジェットチャンネル", + "preferred_locale": "優先言語", + "safety_alerts_channel": "セーフティアラートチャンネル", + "nsfw_level": "NSFWレベル", + "public_updates_channel": "コミュニティアップデートチャンネル", + "features_added": "追加された機能", + "features_removed": "削除された機能", + "automod_trigger": "トリガータイプ", + "automod_trigger_keyword": "キーワード", + "automod_trigger_spam": "スパム", + "automod_trigger_preset": "キーワードプリセット", + "automod_trigger_mention_spam": "メンションスパム", + "automod_trigger_member_profile": "メンバープロフィール", + "automod_actions": "アクション", + "automod_action_block": "メッセージをブロック", + "automod_action_alert": "アラート送信", + "automod_action_timeout": "タイムアウト", + "automod_action_block_interaction": "インタラクションをブロック", + "automod_enabled": "有効化", + "automod_exempt_roles": "除外ロール", + "automod_exempt_channels": "除外チャンネル" }, "events": { "guild_update": "サーバー設定更新", @@ -898,6 +1053,8 @@ "message_update": "メッセージ編集", "message_update_embed_before": "編集前Embedプレビュー", "message_update_embed_after": "編集後Embedプレビュー", + "message_reaction_add": "リアクション追加", + "message_reaction_remove": "リアクション削除", "member_add": "メンバー参加", "member_remove": "メンバー退出", "member_kick": "メンバーキック", @@ -930,7 +1087,317 @@ "guild_scheduled_event_delete": "イベント削除", "thread_create": "スレッド作成", "thread_update": "スレッド更新", - "thread_delete": "スレッド削除" + "thread_delete": "スレッド削除", + "automod_rule_create": "AutoModルール作成", + "automod_rule_update": "AutoModルール更新", + "automod_rule_delete": "AutoModルール削除" + }, + "reason": { + "role_keeper_regrant": "RoleKeeper: 以前保持していたロールの再付与", + "pow_gate_success": "PoW Gate: 認証成功", + "role_add_manual": "Role コマンド: {userTag} により付与", + "role_remove_manual": "Role コマンド: {userTag} により剥奪", + "role_add_bulk": "Role コマンド (一括): {userTag} により付与", + "role_remove_bulk": "Role コマンド (一括): {userTag} により剥奪", + "workflow_role_add": "ワークフロー: ロール付与", + "workflow_role_remove": "ワークフロー: ロール剥奪", + "workflow_timeout_add": "ワークフロー: タイムアウト", + "workflow_timeout_remove": "ワークフロー: タイムアウト解除", + "workflow_thread_create": "ワークフロー: スレッド作成", + "workflow_thread_delete": "ワークフロー: スレッド削除", + "workflow_kick": "ワークフロー: キック", + "workflow_ban": "ワークフロー: BAN", + "join_gate_pow": "JoinGate: PoW Gate による要求", + "verify_manual": "Context Verify: {userTag} による手動認証", + "audit_test": "監査ログテスト" + } + }, + "moderation": { + "mod_log": { + "title": "🚨 モデレーション実行", + "body": "**対象:** <@{userId}> ({userTag})\n**実施アクション:** {actions}\n**理由:** {reason}", + "default_reason": "自動モデレーションによる処罰", + "failed_title": "⚠️ モデレーション実行失敗", + "failed_body": "**対象:** <@{userId}> ({userTag})\n**試行アクション:** {actions}\n**理由:** {reason}\n\n対象が管理者権限を持っている、またはBotより上位のロールを持っているため、アクションを実行できませんでした。手動で対応してください。", + "v2_target": "**対象:** <@{userId}>\n`{userTag}`", + "v2_actions": "**⚡ 実施アクション:** {actions}", + "v2_failed_actions": "**⚡ 試行アクション:** {actions}", + "v2_reason": "**📝 理由:** {reason}", + "v2_suppressed": "**🛑 ポリシーにより抑制:** {actions}", + "v2_confidence": "**🎯 信頼度:** `{gauge}`", + "v2_severity": "**🔥 深刻度:** `{gauge}`", + "v2_categories": "**🏷️ カテゴリ:** {categories}", + "v2_triggers": "**🚦 発火ルール:** {triggers}", + "v2_executor": "**👮 実行者:** <@{executorId}>", + "v2_message": "**📄 対象メッセージ:**\n{content}", + "v2_message_empty": "**📄 対象メッセージ:** -# (本文なし・添付のみ)", + "v2_jump": "[📨 対象メッセージへ移動]({url})", + "compact_line": "🚨 <@{userId}> ・ ⚡ {actions}", + "compact_category": "🏷️ {category}", + "compact_confidence": "🎯 {percent}%", + "btn_jump": "📨 対象メッセージへ移動", + "v2_failed_hint": "-# 対象が管理者権限を持っている、またはBotより上位のロールを持っているため自動処罰できませんでした。下のボタンから手動で対応してください。", + "btn_ban": "BAN", + "btn_kick": "キック", + "btn_unquarantine": "隔離解除", + "btn_untimeout": "タイムアウト解除", + "btn_false_positive": "誤検知として解除", + "btn_confirm_spam": "スパム確認" + }, + "review_queue": { + "title": "🔍 要審査(グレーゾーン)", + "body": "**対象:** <@{userId}> ({userTag})\n**理由:** {reason}\n\n自動判定の信頼度が低いため、モデレーターによる手動確認が必要です。" + }, + "ai_lane": { + "review": { + "title": "🤖 AIモデレーション 要確認", + "author": "**対象:** <@{userId}>\n`{userTag}`", + "verdict": "**判定:** {label}(信頼度 {confidence}%)", + "verdict_label": "**⚖️ 判定:** {label}", + "confidence": "**🎯 信頼度:** `{gauge}`", + "severity": "**🔥 深刻度:** `{gauge}`", + "categories": "**🏷️ カテゴリ:** {categories}", + "triggers": "**🚦 発火ルール:** {triggers}", + "reason": "**📝 理由:** {reason}", + "jump": "[📨 メッセージへ移動]({url})", + "btn_jump": "📨 対象メッセージへ移動", + "label_gray": "グレー", + "label_violation": "違反", + "recommended": "**🤖 ポリシー推奨アクション:** {actions}", + "btn_apply": "適用", + "btn_reject": "却下(誤検知)", + "btn_override": "別アクション", + "no_data": "このレビューの保留データが見つかりませんでした(有効期限切れ、または既に処理済みの可能性があります)。", + "applied": "✅ <@{executorId}> が <@{userId}> に推奨アクションを適用しました。", + "apply_failed": "<@{userId}> への推奨アクション適用に失敗しました。", + "rejected": "🚫 <@{executorId}> が <@{userId}> の判定を誤検知として却下しました。", + "reject_failed": "<@{userId}> の却下処理に失敗しました。", + "override_prompt": "適用する別のアクションを選択してください。", + "override_placeholder": "アクションを選択", + "override_invalid": "無効なアクションが選択されました。", + "overridden": "✅ <@{executorId}> が <@{userId}> に **{action}** を適用しました。", + "override_failed": "<@{userId}> へのアクション適用に失敗しました。" + }, + "categories": { + "harassment": "嫌がらせ", + "hate": "ヘイト", + "sexual": "性的", + "violence": "暴力", + "self_harm": "自傷", + "spam": "スパム", + "scam_phishing": "詐欺・フィッシング", + "advertising": "宣伝・広告", + "nsfw": "NSFW", + "server_rule": "サーバールール違反" + }, + "pipeline_stage": { + "omni": "一次スクリーニング(Omni)", + "lite_llm": "軽量LLM判定", + "detail_llm": "詳細LLM判定", + "heuristic": "ヒューリスティック判定" + }, + "pipeline": { + "summary": "-# ⚙️ パイプライン: {stage} で判定が確定しました" + } + }, + "warn": { + "dm_title": "⚠️ 警告", + "dm_body": "**{guildName}** の自動モデレーションにより警告を受けました。サーバーのルールを確認してください。", + "v2_body": "**{guildName}** の自動モデレーションにより警告を受けました。", + "v2_reason": "**📝 理由:** {reason}", + "v2_categories": "**🏷️ カテゴリ:** {categories}", + "v2_guide": "-# サーバーのルールを今一度ご確認ください。違反が続くと、より重い措置が取られる場合があります。" + }, + "notify_owner": { + "dm_title": "🛡️ Anti-Nuke 検知(オーナー通知)", + "dm_body": "**サーバー:** {guildName}\n**対象:** <@{userId}> ({userTag})\n**理由:** {reason}\n**適用アクション:** {action}\n\nAnti-Nuke が破壊的な操作を検知しました。誤検知でないか手動でご確認ください。", + "no_action": "適用できませんでした(手動対応が必要)" + }, + "scheduled_security": { + "started_title": "🔒 スケジュールセキュリティ開始", + "started_body": "**{action}** を開始しました。\n適用時間帯: {range}", + "ended_title": "🔓 スケジュールセキュリティ終了", + "ended_body": "**{action}** を終了し、元の状態に戻しました。", + "type": { + "invite_disable": "招待リンクの一時停止", + "dm_disable": "メンバー間DMの一時停止", + "security_level": "認証レベルの引き上げ" + } + }, + "appeal_dm": { + "quarantine_title": "⚠️ 隔離(Quarantine)が適用されました", + "timeout_title": "⚠️ タイムアウトが適用されました", + "body": "自動モデレーションにより **{label}** が適用されました。\n\n**🏠 サーバー:** {guildName}\n**📝 理由:** {reason}\n\n-# 誤検知と思われる場合は、下のボタンから異議申し立てができます。", + "quarantine_label": "隔離(Quarantine)", + "timeout_label": "タイムアウト", + "btn_appeal": "異議申し立て" + }, + "notify": { + "channel_title": "🚨 自動モデレーション", + "channel_body": "<@{userId}> に対して処罰を実施しました。\n**処罰:** {action}\n**理由:** {reason}", + "v2_target": "**👤 対象:** <@{userId}>", + "v2_action": "**⚡ 処罰:** {action}", + "v2_reason": "**📝 理由:** {reason}", + "v2_categories": "**🏷️ カテゴリ:** {categories}" + }, + "appeal_modal": { + "title": "異議申し立て", + "reason_label": "申し立ての理由", + "reason_placeholder": "誤検知と思われる理由や状況を詳しく入力してください。", + "success": "✅ 異議申し立てを受け付けました。モデレーターが確認次第、対応します。", + "already_submitted": "❌ 異議申し立てはすでに送信済みです。モデレーターの確認をお待ちください。", + "log_title": "📩 異議申し立て", + "log_body": "**申立人:** <@{userId}> ({userTag})\n**内容:**\n{reason}" + }, + "mod_ban": { + "success": "ユーザー <@{userId}> をBANしました。", + "failed": "ユーザー <@{userId}> のBANに失敗しました。", + "reason": "{moderatorTag} が Mod-Log からBANしました" + }, + "mod_kick": { + "success": "ユーザー <@{userId}> をKickしました。", + "failed": "ユーザー <@{userId}> のKickに失敗しました。", + "reason": "{moderatorTag} が Mod-Log からKickしました" + }, + "mod_unquarantine": { + "not_found": "ユーザー <@{userId}> の隔離スナップショットが見つかりません。", + "not_in_server": "ユーザー <@{userId}> はすでにサーバーにいません。", + "success": "ユーザー <@{userId}> の隔離を解除し、ロールを復元しました。", + "failed": "ユーザー <@{userId}> の隔離解除に失敗しました。", + "already_exists": "ユーザー <@{userId}> は現在隔離されていません。" + }, + "mod_untimeout": { + "success": "ユーザー <@{userId}> のタイムアウトを解除しました。", + "not_timed_out": "ユーザー <@{userId}> は現在タイムアウト中ではありません。", + "not_found": "ユーザー <@{userId}> が見つかりません。", + "failed": "ユーザー <@{userId}> のタイムアウト解除に失敗しました。" + }, + "mod_false_positive": { + "success": "ユーザー <@{userId}> を誤検知として隔離解除しました。", + "failed": "ユーザー <@{userId}> の隔離解除に失敗しました。", + "already_exists": "ユーザー <@{userId}> は現在隔離されていません。" + }, + "mod_confirm_spam": { + "success": "✅ スパムパターンを登録しました。", + "no_data": "パターンデータが見つかりませんでした(有効期限切れの可能性があります)。" + }, + "join_gate": { + "dm_title": "🔒 認証が必要です", + "dm_body": "**{guildName}** に参加するには認証が必要です。\n\n[こちらをクリックして認証してください]({verifyUrl})\n\nリンクは **10分間** 有効です。", + "channel_fallback": "<@{userId}> 認証が必要です。下のボタンをクリックして認証リンクを取得してください。" + }, + "pow_gate": { + "channel_title": "🔒 認証が必要です", + "channel_body": "このサーバーに参加するには認証が必要です。\n下のボタンをクリックして認証リンクを取得してください。", + "channel_note": "-# 認証リンクは10分間有効です", + "btn_label": "認証リンクを取得", + "no_guild": "認証情報を取得できませんでした。", + "no_settings": "認証設定が見つかりません。", + "not_needed": "認証は不要です。", + "link_reply": "以下のリンクから認証してください(**10分間有効**):\n{verifyUrl}", + "log_title": "認証完了 (PoW Gate)", + "log_body": "ユーザー: <@{userId}> ({userTag})\n**日時:** " + }, + "actions": { + "QUARANTINE": "隔離(Quarantine)", + "UNQUARANTINE": "隔離解除", + "TIMEOUT_5M": "5分のタイムアウト", + "TIMEOUT_10M": "10分のタイムアウト", + "TIMEOUT_30M": "30分のタイムアウト", + "TIMEOUT_1H": "1時間のタイムアウト", + "TIMEOUT_24H": "24時間のタイムアウト", + "DELETE_MESSAGE": "メッセージ削除", + "WARN": "警告", + "SEND_TO_REVIEW_QUEUE": "手動レビューへ送信", + "ADD_SUSPICION_LEVEL_1": "監視レベル1追加", + "NOTIFY_OWNER": "オーナー通知", + "MARK_COHORT_SUSPICION_LV2": "連座制による監視レベル2付与" + }, + "rules": { + "MESSAGE_SEND": "メッセージの連続送信", + "MESSAGE_REPEAT": "同一メッセージの反復", + "LINE_BREAK_SPAM": "改行スパム", + "ATTACHMENT": "添付ファイル送信", + "EMOJI": "絵文字スパム", + "ZALGO": "Zalgoテキスト", + "LONG_TEXT": "長文送信", + "URL": "URL送信", + "MENTION_USER": "ユーザーメンション", + "MENTION_ROLE": "ロールメンション", + "MENTION_HERE": "Hereメンション", + "MENTION_EVERYONE": "Everyoneメンション", + "INVITATION": "招待リンク", + "PHISHING": "フィッシングリンク", + "IMAGE_HASH": "不適切画像", + "CROSS_CHANNEL": "複数チャンネルへのスパム", + "BLACKLIST_WORD": "禁止ワード", + "INACTIVE_CHANNEL": "非アクティブチャンネルへの投稿", + "NSFW_URL": "NSFWリンク", + "ANTINUKE": "破壊行為(Anti-Nuke)の検出", + "ANTINUKE_CHANNEL_DELETE": "チャンネルの大量削除", + "ANTINUKE_ROLE_DELETE": "ロールの大量削除", + "ANTINUKE_CHANNEL_CREATE": "チャンネルの大量作成", + "ANTINUKE_ROLE_CREATE": "ロールの大量作成", + "ANTINUKE_WEBHOOK_CREATE": "Webhookの大量作成", + "ANTINUKE_BAN_KICK": "メンバーの大量BAN/キック", + "ANTINUKE_ROLE_GRANT": "ロールへの危険な権限の付与", + "AI_HARASSMENT": "AI検知: 嫌がらせ", + "AI_HATE": "AI検知: ヘイト", + "AI_SEXUAL": "AI検知: 性的コンテンツ", + "AI_VIOLENCE": "AI検知: 暴力", + "AI_SELF_HARM": "AI検知: 自傷", + "AI_SCAM_PHISHING": "AI検知: 詐欺・フィッシング", + "AI_SERVER_RULE": "AI検知: サーバールール違反", + "AI_SPAM": "AI検知: スパム" + }, + "legacy_automod": { + "category": { + "harassment": "嫌がらせ", + "harassment/threatening": "嫌がらせ(脅迫)", + "hate": "ヘイト", + "hate/threatening": "ヘイト(脅迫)", + "sexual": "性的", + "sexual/minors": "性的(未成年)", + "violence": "暴力", + "violence/graphic": "暴力(描写)", + "self-harm": "自傷", + "self-harm/intent": "自傷(意図)", + "self-harm/instructions": "自傷(手段)", + "illicit": "違法行為", + "illicit/violent": "違法行為(暴力)" + }, + "thread_delete_reason": "レガシーAIモデレーションによる自動削除", + "report": { + "title": "🛡️ レガシーAIモデレーション検知", + "thread_title": "🛡️ レガシーAIモデレーション検知(スレッド)", + "author": "**送信者:** <@{userId}> (`{userTag}`)", + "content": "**内容:**\n{content}", + "high_score": "**高スコアカテゴリ:** {categories}", + "flagged": "**フラグ付きカテゴリ:** {categories}", + "auto_action": "**自動対応:** {action}", + "action_deleted": "削除", + "action_none": "なし", + "jump": "[メッセージへ移動]({url})", + "btn_jump": "📨 対象メッセージへ移動", + "btn_delete": "メッセージ削除", + "btn_warn": "警告を送信" + }, + "delete": { + "success": "メッセージを削除しました。", + "failed": "メッセージの削除に失敗しました。", + "not_found": "対象のメッセージが見つかりませんでした。" + }, + "warn": { + "modal_title": "警告の送信", + "reason_label": "警告理由", + "reason_placeholder": "警告の理由を入力してください", + "bot_not_allowed": "Botへ警告を送信することはできません。", + "success": "<@{userId}> へ警告を送信しました。", + "dm_failed": "<@{userId}> へのDM送信に失敗しました(DMが閉じられている可能性があります)。", + "dm_title": "⚠️ 警告", + "dm_body": "**{guildName}** から警告を受けました。\n**理由:** {reason}", + "log_appended": "✅ <@{moderatorId}> が <@{userId}> へ警告を送信しました。\n**理由:** {reason}" + } } } } diff --git a/ja/web.json b/ja/web.json index c9e6334..989c8ab 100644 --- a/ja/web.json +++ b/ja/web.json @@ -18,6 +18,9 @@ "save": "保存", "saving": "保存中...", "saved": "保存しました", + "unsavedChanges": "未保存の変更があります", + "leaveWarning": "未保存の変更があります。ページを離れますか?", + "discard": "変更を破棄", "cancel": "キャンセル", "close": "閉じる", "loading": "読み込み中...", @@ -25,7 +28,8 @@ "notSet": "未設定", "buy": "購入する", "processing": "処理中...", - "soon": "近日公開" + "soon": "近日公開", + "back": "戻る" }, "authBlocked": { "title": "アクセスが制限されています", @@ -43,7 +47,9 @@ "inviteBot": "Botを招待", "viewDashboard": "ダッシュボードを見る", "pricing": "料金プラン", - "changelog": "更新履歴" + "changelog": "更新履歴", + "security": "セキュリティ", + "subscription": "サブスクリプション" }, "top": { "featuresSectionLabel": "機能", @@ -150,7 +156,9 @@ "open": "開く", "invite": "Botを追加", "reload": "再読み込み", - "refreshHint": "サーバーが表示されない場合は、Bot追加後に更新してください。" + "refreshHint": "サーバーが表示されない場合は、Bot追加後に更新してください。", + "passkeyBtn": "パスキーでログイン", + "orDivider": "または" }, "sidebar": { "overview": "概要", @@ -162,10 +170,20 @@ "subscription": "サブスクリプション", "credits": "クレジット", "allServers": "すべてのサーバー", + "searchServers": "サーバーを検索...", "manageSubscription": "サブスクリプション管理", + "security": "セキュリティ", "logout": "ログアウト", "messages": "メッセージ送信", - "workflow": "ワークフロー" + "workflow": "ワークフロー", + "automod": "統合モデレーション", + "activityLog": "操作ログ", + "analytics": "アナリティクス" + }, + "featureGate": { + "title": "この機能はご利用いただけません", + "desc": "このページの機能を使用するには、対応するプランまたは機能フラグが必要です。", + "upgrade": "プランをアップグレード" }, "overview": { "desc": "サーバーの状態と利用可能な機能を確認できます", @@ -183,6 +201,68 @@ "aimod": { "label": "AI モデレーション", "desc": "AI がリアルタイムでチャットを監視・対応" + }, + "analytics": { + "title": "アナリティクス", + "messages": "メッセージ数", + "members": "メンバー増減", + "joins": "参加", + "leaves": "退出", + "range7": "7日間", + "range30": "30日間", + "noData": "データがありません" + }, + "widget": { + "customize": "カスタマイズ", + "done": "完了" + }, + "fastaccess": { + "title": "クイックアクセス" + }, + "recentwork": { + "title": "最近の作業", + "empty": "まだ作業履歴がありません", + "justNow": "たった今", + "minutesAgo": "{n}分前", + "hoursAgo": "{n}時間前", + "daysAgo": "{n}日前" + }, + "analyticsummary": { + "title": "今週のサマリー", + "messages": "メッセージ数", + "joins": "参加", + "leaves": "退出", + "netChange": "純増減" + }, + "moderationMetrics": { + "title": "AI モデレーション", + "screened": "スクリーニング総数", + "actions": "アクション実行数", + "detections": "検出数", + "range7": "7日間", + "range30": "30日間", + "categoryTitle": "上位カテゴリ", + "timeseriesTitle": "日別検出数", + "noData": "データがありません", + "empty": "モデレーションの記録はまだありません", + "error": "モデレーション指標の読み込みに失敗しました", + "categories": { + "harassment": "嫌がらせ", + "harassment/threatening": "嫌がらせ(脅迫)", + "hate": "差別的表現", + "hate/threatening": "差別的表現(脅迫)", + "sexual": "性的", + "sexual/minors": "性的(未成年)", + "violence": "暴力", + "violence/graphic": "暴力(描写)", + "self-harm": "自傷", + "self-harm/intent": "自傷(意図)", + "self-harm/instructions": "自傷(手段)", + "illicit": "違法行為", + "illicit/violent": "違法行為(暴力)", + "spam": "スパム", + "other": "その他" + } } }, "general": { @@ -259,11 +339,450 @@ "aimod": { "title": "AI モデレーション", "desc": "AI によるチャットの自動監視・対応を設定します", + "logChannelLabel": "ログチャンネル", + "logChannelDesc": "AIモデレーションのログやレビュー通知を送信するチャンネルを指定します", "statusNotSet": "未設定", "statusRunning": "実行中", "statusStopped": "停止中", "logTitle": "モデレーションログ", - "logEmpty": "ログはありません" + "logEmpty": "ログはありません", + "legacyAiSection": "レガシーAIモデレーション設定", + "legacyAiDesc": "omni-moderationのスコアを基に自動でレポート・削除を行います", + "legacyAiLogChannelLabel": "ログチャンネル", + "legacyAiReportScoreLabel": "レポートスコア閾値", + "legacyAiReportScoreDesc": "低いほど敏感に検知し、ログに通知します", + "legacyAiDeleteScoreLabel": "削除スコア閾値", + "legacyAiDeleteScoreDesc": "この値を超えたメッセージを自動削除します(通知の値以上を推奨)", + "legacyAiScoreRecommend": "削除スコアはレポートスコア以上を推奨します", + "legacyAiBypassChannelsLabel": "バイパスチャンネル", + "legacyAiBypassChannelsDesc": "このチャンネルのメッセージはAIモデレーションをスキップします", + "legacyAiBypassRolesLabel": "バイパスロール", + "legacyAiBypassRolesDesc": "このロールを持つユーザーはAIモデレーションをスキップします", + "legacyAiBypassStringsLabel": "バイパス文字列", + "legacyAiBypassStringsDesc": "この文字列を含むメッセージはスキップします", + "legacyAiBypassStringPlaceholder": "バイパスする文字列を入力", + "legacyAiBypassStringAdd": "追加", + "noChannel": "チャンネルなし", + "noRole": "ロールなし", + "permissionDenied": "Master権限がないため設定を変更できません", + "saveError": "保存に失敗しました", + "forbiddenTitle": "アクセス権限がありません", + "forbiddenDesc": "このサーバーのモデレーション設定を閲覧・編集するにはMaster権限が必要です。", + "modeLabel": "モデレーションモード", + "modeDesc": "メッセージの自動監視方法を選択します", + "modeOff": "なし", + "modeOffDesc": "自動監視を行いません", + "modeLegacy": "レガシー版", + "modeLegacyDesc": "不適切なメッセージを自動で検知・通知・削除します(無料)", + "modeAdvanced": "次世代", + "modeAdvancedDesc": "文脈を理解する高度な AI モデレーション", + "advancedLaneSectionTitle": "AIレーン設定", + "advancedLaneSectionDesc": "次世代 AI モデレーション(advanced モード)の詳細設定を行います", + "naturalLanguageRulesLabel": "自然言語ルール", + "naturalLanguageRulesDesc": "このサーバー固有のモデレーションルールを自然言語で記述します。AI がルールを理解し、判定に反映します", + "naturalLanguageRulesSurcharge": "ルールの長さにより判定1回あたり +{cc}CC が追加されます(500文字ごとに +1CC)", + "naturalLanguageRulesNoSurcharge": "ルール未設定のため追加CCはありません", + "naturalLanguageRulesPlaceholder": "例:\n- 政治・宗教の議論は禁止\n- 18歳未満に不適切なコンテンツを送ってはならない\n- 他のユーザーへの侮辱的な発言は削除する", + "advancedViolationStorageLabel": "高度な違反保存", + "advancedViolationStorageDesc": "AI が違反理由を分類して保存します。モデレーションログの詳細化に役立ちますが、1CC/件 のクレジットを消費します", + "modLogCompactLabel": "コンパクトなログ", + "modLogCompactDesc": "モデレーターログを簡潔な1行表示にします。オフ(既定)では、サムネイルや信頼度ゲージを含む詳細表示になります", + "nodeEditorLinkLabel": "ノードエディター", + "nodeEditorLinkDesc": "パイプラインをノードで視覚的に構築・編集します", + "nodeEditorLockedTooltip": "ノードエディターは上位プラン (NODE_EDITOR) で利用できます", + "nodeEditorSectionTitle": "ノードエディター", + "nodeEditorSectionDesc": "視覚的なパイプラインビルダーで AI モデレーションフローを構築します", + "nodeEditorOpenBtn": "ノードエディターを開く", + "nodeEditorAdvancedOnly": "advancedモードでのみ動作します", + "modeOffFeature": "自動監視: なし", + "modeLegacyFeature": "無料 · OpenAIスコア · 閾値ベース削除", + "modeAdvancedFeature": "Gemini文脈判定 · CC消費 · 自動処罰", + "presetLabel": "検知プリセット", + "presetDesc": "検知の厳しさをプリセットから選びます。細かく調整したい場合は「カスタム」を選択してください", + "preset_lenient_name": "緩め", + "preset_lenient_desc": "確信度が非常に高いものだけを自動処罰します", + "preset_lenient_trait": "誤検知: 最小 / コスト: 低 / 見逃し: 多め", + "preset_balanced_name": "標準", + "preset_balanced_desc": "確信度とコストのバランスを取った標準設定です", + "preset_balanced_trait": "誤検知: 中 / コスト: 中 / 見逃し: 中", + "preset_strict_name": "厳格", + "preset_strict_desc": "グレーも広く詳細分析し、見逃しを最小にします", + "preset_strict_trait": "誤検知: やや多め / コスト: 高 / 見逃し: 最小", + "preset_custom_name": "カスタム", + "preset_custom_desc": "各しきい値を自分で細かく設定します", + "preset_custom_trait": "各項目を手動で調整", + "cfgConfidenceLabel": "確信度しきい値", + "cfgConfidenceDesc": "この確信度以上の判定のみ自動処罰します。高いほど慎重になります", + "cfgGrayLabel": "グレー詳細分析しきい値", + "cfgGrayDesc": "判定が曖昧(グレー)なメッセージを詳細AI分析に回す度合い。高いほど詳細分析を多用します(コスト増)", + "cfgMinLenLabel": "最小解析文字数", + "cfgMinLenDesc": "この文字数未満の短いメッセージはAI解析の対象外にします", + "cfgTrustedLabel": "高信頼ユーザー検査率", + "cfgTrustedDesc": "違反履歴のない高信頼ユーザーをどの割合で抜き取り検査するか。0%で完全にスキップします", + "cfgScreenLabel": "一次スクリーニング感度", + "cfgScreenDesc": "AI解析の前段で行う機械的な一次判定の感度。高いほど多くのメッセージを精査に回します", + "cfgScreenLow": "低", + "cfgScreenMedium": "中", + "cfgScreenHigh": "高", + "cfgDetailLlmLabel": "詳細LLM分析", + "cfgDetailLlmDesc": "前科を含めた高精度な詳細AI分析を有効にします(CC消費が増えます)", + "cfgOn": "オン", + "cfgOff": "オフ", + "enforcementModeLabel": "執行モード", + "enforcementModeDesc": "AI の判定結果をどこまで自動で執行するかを選びます", + "enforcement_review_all_name": "全てレビュー", + "enforcement_review_all_desc": "全てモデレーターがレビューします(AI は自動処罰しません)", + "enforcement_auto_lowrisk_name": "低リスクのみ自動(推奨)", + "enforcement_auto_lowrisk_desc": "明白な低リスクのみ自動で処罰し、それ以外はレビューに回します", + "enforcement_auto_full_name": "完全自動執行", + "enforcement_auto_full_desc": "ポリシー判定どおりに自動執行します(信頼ユーザーは常にレビュー)", + "aiActiveLabel": "AI モデレーションを有効化", + "aiActiveDesc": "高度なモードの AI 判定を実行します。OFF にすると高度なモードを選んでいてもボットは判定を実行しません", + "aiActiveOffWarning": "現在 OFF のため、高度なモードを選んでいてもボットは判定を実行しません", + "imageModerationLabel": "画像解析(AI による画像内容の判定)", + "imageModerationDesc": "OFF にするとテキストのみ解析し、画像は AI に送りません(CC 節約)", + "imageModerationSurchargeNote": "画像が実際に Gemini へ送信された場合、画像解析は1枚あたり +{cc}CC です。", + "aiBypassSectionLabel": "AIバイパス除外", + "aiBypassSectionDesc": "ここで指定した対象は、デフォルトプリセットとノードワークフローの両方を含む高度なAIレーン全体をスキップします。", + "aiBypassChannelsLabel": "AIバイパスチャンネル", + "aiBypassChannelsDesc": "このチャンネルのメッセージは高度なAIモデレーションをスキップします。スレッドは親チャンネル指定にも一致します。", + "aiBypassRolesLabel": "AIバイパスロール", + "aiBypassRolesDesc": "このロールを持つユーザーは高度なAIモデレーションをスキップします。", + "detections": { + "title": "最近の検出", + "desc": "AI モデレーションが検出した最新のメッセージ", + "empty": "まだ検出はありません", + "error": "検出の読み込みに失敗しました", + "filterAll": "すべて", + "confidence": "信頼度", + "action": "アクション", + "reason": "理由", + "viewMessage": "メッセージを表示", + "sourceAuto": "AI", + "sourceManual": "手動", + "user": "ユーザー", + "justNow": "たった今", + "minutesAgo": "{n}分前", + "hoursAgo": "{n}時間前", + "daysAgo": "{n}日前", + "page": "ページ", + "of": "/", + "total": "件", + "categories": { + "harassment": "嫌がらせ", + "harassment/threatening": "嫌がらせ(脅迫)", + "hate": "差別的表現", + "hate/threatening": "差別的表現(脅迫)", + "sexual": "性的", + "sexual/minors": "性的(未成年)", + "violence": "暴力", + "violence/graphic": "暴力(描写)", + "self-harm": "自傷", + "self-harm/intent": "自傷(意図)", + "self-harm/instructions": "自傷(手段)", + "illicit": "違法行為", + "illicit/violent": "違法行為(暴力)", + "spam": "スパム", + "other": "その他" + } + }, + "logs": { + "title": "モデレーションログ", + "desc": "AIモデレーションの実行ログを確認します", + "backToSettings": "設定に戻る", + "filters": "フィルター", + "clearFilters": "クリア", + "filterAction": "アクション", + "filterActionPlaceholder": "例: 削除, 警告", + "filterStatus": "ステータス", + "filterStatusAll": "すべて", + "filterNodeType": "ノードタイプ", + "filterNodeTypePlaceholder": "例: screen, llm", + "statusCompleted": "完了", + "statusFailed": "失敗", + "statusSkipped": "スキップ", + "statusPending": "保留中", + "error": "ログの読み込みに失敗しました", + "empty": "ログはありません", + "confidence": "信頼度", + "cost": "コスト", + "reason": "理由", + "logId": "ログID", + "messageRef": "メッセージ参照", + "nodeId": "ノードID", + "nodeType": "ノードタイプ", + "actionParams": "アクションパラメータ", + "pipelineTrace": "パイプライントレース", + "pageLabel": "ページ" + } + }, + "aimodEditor": { + "title": "ノードエディター", + "back": "戻る", + "save": "保存", + "saving": "保存中...", + "saved": "保存しました", + "saveError": "保存に失敗しました", + "paletteTitle": "ノードを追加", + "imageSurchargeNote": "ノードのコストは画像追加分を含みません。Lite/Detail は画像を Gemini に送る場合のみ1枚あたり +{cc}CC です。", + "close": "閉じる", + "deleteNode": "ノードを削除", + "noParams": "このノードに設定項目はありません", + "stringListPlaceholder": "入力して Enter で追加", + "costBadge": "{cost}CC", + "categories": { + "input": "入力", + "utility": "ユーティリティ", + "mechanical": "メカニカル", + "ai": "AI", + "action": "アクション" + }, + "handles": { + "next": "次へ", + "true": "一致", + "false": "不一致", + "safe": "安全", + "gray": "グレー", + "violation": "違反", + "else": "それ以外" + }, + "validation": { + "errorNoEntry": "MessageReceived ノードが必要です", + "errorMultipleEntry": "入力ノードは1つだけ配置できます", + "errorCycle": "循環があるため保存できません(無限ループの原因になります)", + "warningDisconnected": "未接続のノードがあります", + "errorMultipleOnError": "エラーハンドラーノードは1つだけ配置できます" + }, + "fields": { + "channel": "チャンネル", + "channel_hint": "対象とするチャンネル。空欄ですべてのチャンネルが対象になります", + "category": "カテゴリ", + "category_hint": "対象とするカテゴリ。配下のチャンネルすべてが対象になります", + "user": "ユーザー", + "user_hint": "対象とするユーザーID。空欄ですべてのユーザーが対象になります", + "role": "ロール", + "role_hint": "対象とするロール。このロールを持つユーザーが対象になります", + "joinAge": "参加からの経過時間", + "joinAge_hint": "サーバー参加からの経過時間で絞り込みます(例: 7d, 24h)", + "report_type": "レポート種別", + "report_type_hint": "ログに出力するレポートの詳しさ。Normal=標準 / Minimum=最小 / Debug=詳細", + "velocity_limit": "速度上限", + "velocity_limit_hint": "短時間にこの件数を超える参加・投稿があるとレイドと判定します", + "detect_bots": "Bot を検知", + "detect_bots_hint": "Bot による大量参加・投稿も検知対象に含めます", + "block_invites": "招待リンクをブロック", + "block_invites_hint": "Discord の招待リンクを含むメッセージをブロックします", + "block_scams": "詐欺をブロック", + "block_scams_hint": "既知の詐欺・フィッシングパターンを含むメッセージをブロックします", + "custom_patterns": "カスタムパターン", + "custom_patterns_hint": "ブロックする独自の正規表現パターンを追加します", + "max_mentions": "最大メンション数", + "max_mentions_hint": "1メッセージあたりのメンションがこの数を超えると違反と判定します", + "sensitivity": "感度", + "sensitivity_hint": "スクリーニングの感度。high ほど多くのメッセージを違反候補として下流に流します", + "threshold": "確信度しきい値", + "threshold_hint": "直近の判定の確信度がこの値以上なら true 側へ分岐します", + "message": "対象メッセージ", + "message_hint": "操作対象のメッセージ。current で現在のメッセージを指します", + "duration": "期間", + "duration_hint": "処罰の期間(例: 1h, 1d)。空欄で無期限になります", + "delete_message": "メッセージ削除範囲", + "delete_message_hint": "BAN時にさかのぼって削除するメッセージの範囲(例: 1d)。空欄で削除しません", + "content": "本文", + "content_hint": "送信するメッセージの本文", + "enableDynamicContext": "動的コンテキスト拡張", + "enableDynamicContext_hint": "AIが文脈不足と判断した場合、追加メッセージを取得して再分析します(+5CC)", + "deniedActions": "除外するアクション", + "deniedActions_hint": "選択したアクションは実行されません" + }, + "actionKeys": { + "QUARANTINE": "隔離", + "TIMEOUT_24H": "24h停止", + "TIMEOUT_1H": "1時間タイムアウト", + "TIMEOUT_30M": "30分間タイムアウト", + "TIMEOUT_10M": "10分間タイムアウト", + "TIMEOUT_5M": "5分間タイムアウト", + "DELETE_MESSAGE": "メッセージ削除", + "WARN": "警告", + "SEND_TO_REVIEW_QUEUE": "レビュー送信", + "ADD_SUSPICION_LEVEL_1": "疑惑Lv1", + "NOTIFY_OWNER": "オーナー通知", + "MARK_COHORT_SUSPICION_LV2": "疑惑Lv2", + "UNQUARANTINE": "隔離解除" + }, + "nodes": { + "MessageReceived": { + "label": "メッセージ受信", + "desc": "パイプラインの開始点です。送信された各メッセージがここから次のノードへ流れます" + }, + "Rule": { + "label": "ルール", + "desc": "設定した自然言語ルールに照らして判定し、結果を次のノードへ渡します" + }, + "Condition": { + "label": "条件分岐", + "desc": "チャンネル/カテゴリ/ユーザー/ロール/参加経過のいずれかに一致するかで、一致/不一致の2方向へ分岐します" + }, + "TimeWindowCondition": { + "label": "時間帯分岐", + "desc": "現在が指定した時間帯に入っているかで、一致/不一致の2方向へ分岐します" + }, + "ParallelStart": { + "label": "並列開始", + "desc": "ここから複数の処理を同時に走らせます。各分岐は並列終了で合流します" + }, + "ParallelEnd": { + "label": "並列終了", + "desc": "並列開始から分かれた処理をすべて待ち合わせ、1本にまとめて次へ進みます" + }, + "SummaryReport": { + "label": "サマリーレポート", + "desc": "ここまでの判定結果をまとめてログチャンネルにレポートとして送ります (1CC)" + }, + "HistorySummarizer": { + "label": "履歴要約", + "desc": "直近の会話履歴を要約し、後続のAI判定が文脈を踏まえられるようにします" + }, + "ReviewQueue": { + "label": "レビューキュー", + "desc": "自動処罰せず、人間のモデレーターが確認するキューに追加します" + }, + "AntiRaid": { + "label": "アンチレイド", + "desc": "短時間の大量参加・投稿を検知し、レイドかどうかで一致/不一致へ分岐します (0CC)" + }, + "RegexBlock": { + "label": "正規表現ブロック", + "desc": "招待リンク・詐欺・カスタムパターンに該当するかを正規表現で判定し、一致/不一致へ分岐します (0CC)" + }, + "TextFilter": { + "label": "テキストフィルター", + "desc": "メンション数などの機械的な条件に違反するかで、一致/不一致へ分岐します (0CC)" + }, + "ThreatDb": { + "label": "脅威DB", + "desc": "既知の脅威データベースと照合し、ヒットするかで一致/不一致へ分岐します (0CC)" + }, + "Screen": { + "label": "スクリーニング", + "desc": "軽量AIで一次判定し、違反の疑いがあるかで一致/不一致へ分岐します。疑わしいものだけを下流のLLMへ流せます (0CC)" + }, + "LiteLlm": { + "label": "軽量LLM", + "desc": "軽量AI(Gemini)が内容を読み、safe/gray/violation のいずれかの結果に振り分けて分岐します (1CC)" + }, + "DetailLlm": { + "label": "詳細LLM", + "desc": "前科を含めて高精度AI(Gemini)が詳しく判定し、違反かどうかで一致/不一致へ分岐します (3CC)" + }, + "Confidence": { + "label": "確信度分岐", + "desc": "直近のAI判定の確信度をしきい値と比較し、しきい値以上かで一致/不一致へ分岐します (1CC)" + }, + "ActionPolicy": { + "label": "アクションポリシー", + "desc": "ここまでの判定をもとに、実行すべき処罰の方針を決めます" + }, + "ExecuteAction": { + "label": "アクション実行", + "desc": "アクションポリシーで決まった処罰をまとめて実行します" + }, + "MessageDelete": { + "label": "メッセージ削除", + "desc": "対象のメッセージを削除します" + }, + "Timeout": { + "label": "タイムアウト", + "desc": "対象ユーザーを指定期間タイムアウト(発言不可)にします" + }, + "Kick": { + "label": "キック", + "desc": "対象ユーザーをサーバーからキックします" + }, + "Ban": { + "label": "BAN", + "desc": "対象ユーザーをBANします。過去メッセージの削除範囲も指定できます" + }, + "Warn": { + "label": "警告", + "desc": "対象ユーザーに警告を記録・通知します" + }, + "MessageSend": { + "label": "メッセージ送信", + "desc": "指定した本文のメッセージをチャンネルに送信します" + }, + "OnError": { + "label": "エラーハンドラー", + "desc": "ノードの実行中にエラーが発生した場合に、ここから処理を続行します。DMやメッセージ送信ノードと繋いでエラー通知に使えます" + } + }, + "unsavedChanges": "未保存の変更", + "unsavedDot": "●", + "emptyTitle": "ノードがありません", + "emptyDesc": "パレットからノードをドラッグするか、テンプレートから始めてください", + "loadTemplate": "標準テンプレートを読み込む", + "searchPlaceholder": "ノードを検索...", + "unsavedTooltip": "未保存の変更があります", + "deleteEdge": "エッジを削除", + "test": { + "open": "テスト実行", + "title": "テスト実行", + "subtitle": "現在のパイプライン(未保存の変更を含む)にサンプルメッセージを流し、各ノードの判定をトレースします", + "inputLabel": "サンプルメッセージ", + "inputPlaceholder": "テストするメッセージを入力(例: 「今すぐ参加 https://discord.gg/...」)", + "charCount": "{count} / {max}", + "run": "実行", + "running": "実行中...", + "rerun": "もう一度実行", + "clear": "クリア", + "close": "閉じる", + "emptyHint": "サンプルメッセージを入力して実行すると、各ノードがどう判定するかを確認できます。", + "noTrace": "実行されたノードはありません", + "traceTitle": "トレース", + "stepLabel": "ステップ {n}", + "branchTaken": "分岐: {branch}", + "result": "結果: {result}", + "llmCalled": "自然言語処理モデル", + "duration": "{ms}ms", + "wouldExecute": "実行予定: {actions}", + "verdict": { + "label": "判定", + "confidence": "確信度 {percent}%", + "severity": "深刻度 {severity}", + "categories": "カテゴリ", + "reason": "理由" + }, + "finalVerdict": "最終判定", + "noFinalVerdict": "最終判定なし", + "footer": { + "llmCalls": "LLM呼び出し", + "estimatedCost": "推定コスト", + "cost": "{cc}CC", + "charged": "課金あり", + "free": "無料(課金なし)", + "freeRemaining": "本日の無料枠残り: {cc} CC", + "partialShortfall": "残高不足のため一部の判定をスキップしました" + }, + "errors": { + "title": "テスト実行に失敗しました", + "noFunds": "本日の無料テスト回数を使い切り、Cubeクレジットも不足しています。クレジットを追加するか、明日もう一度お試しください。", + "forbidden": "このサーバーでテストを実行する権限がありません。", + "botMissing": "Botがまだこのサーバーに参加していません。Botを招待してからテストを実行してください。", + "noConfig": "AIモデレーションがまだ設定されていません。ノードを1つ以上追加してからお試しください。", + "generic": "テスト実行中に問題が発生しました。もう一度お試しください。", + "unavailable": "Botが一時的に応答していません。しばらくしてからもう一度お試しください。" + }, + "actionsTitle": "本番で実行されるアクション", + "noActions": "アクションなし(safe)", + "actions": { + "message_delete": "メッセージ削除", + "member_timeout": "タイムアウト", + "member_kick": "キック", + "member_ban": "BAN", + "warn": "警告" + } + }, + "mobileAddNode": "ノードを追加" }, "subscription": { "title": "サブスクリプション", @@ -295,6 +814,39 @@ "buy": "クレジットを購入", "history": "取引履歴", "noHistory": "取引履歴がありません", + "spent": "消費合計 (過去{days}日)", + "spentAi": "AIモデレーション (過去{days}日)", + "cc": "{amount} CC", + "charts": { + "usageTrend": "消費推移", + "byCategory": "カテゴリ別内訳", + "balanceTrend": "残高推移", + "daily": "日次", + "weekly": "週次", + "noData": "消費データがありません", + "consumed": "消費", + "balance": "残高" + }, + "filter": { + "label": "絞り込み", + "all": "すべて", + "ai": "AIモデレーション", + "purchase": "購入", + "other": "その他" + }, + "category": { + "ai_screen": "AIスクリーニング", + "ai_lite": "AI判定 (Lite)", + "ai_detail": "AI判定 (Detail)", + "ai_advanced": "AI判定 (Advanced)", + "ai_violation": "違反分類", + "purchase": "購入", + "subscription": "サブスク", + "admin": "付与", + "manual": "手動調整", + "refund": "返金", + "other": "その他" + }, "lots": { "title": "有効期限", "noLots": "アクティブなクレジットロットがありません", @@ -317,6 +869,10 @@ "selectDesc": "購入するサーバーを選んでください" }, "purchaseFlow": { + "purchaseFailed": "購入処理が完了していないか、セッションが無効です。", + "purchaseSuccess": "ご購入ありがとうございます!", + "purchaseSuccessDesc": "{seconds}秒後にダッシュボードに戻ります...", + "backToDashboard": "ダッシュボードに戻る", "subscriptionTitle": "サブスクリプション", "ccTitle": "Cubeクレジットを購入", "popular": "人気", @@ -376,7 +932,20 @@ "優先サポート" ], "confirmTitle": "{plan} プランを購入しますか?", - "confirmDesc": "月額 ¥{price} が請求されます。いつでもキャンセルできます。" + "confirmDesc": "月額 ¥{price} が請求されます。いつでもキャンセルできます。", + "consentTitle": "購入前の確認", + "consentDesc": "購入手続きを進めるにあたり、生年月日の確認と利用規約への同意が必要です。", + "consentDob": "生年月日", + "consentYear": "年", + "consentMonth": "月", + "consentDay": "日", + "consentTermsLabel": "利用規約およびプライバシーポリシーに同意します", + "consentParentalLabel": "保護者から購入の許可を得ています", + "consentMinorNotice": "18歳未満の方は、保護者の同意が必要です。", + "consentUnderageError": "申し訳ありませんが、13歳未満の方はご購入いただけません。", + "consentDataNote": "入力された生年月日は年齢確認のためにのみ使用され、決済処理のためStripeと共有されます。", + "consentContinue": "同意して続ける", + "consentSubmitting": "確認中..." }, "accountSub": { "title": "サブスクリプション管理", @@ -457,7 +1026,15 @@ "changePlanChanging": "変更中...", "changePlanNote": "変更は次の請求日から適用されます。", "downgradeNotAllowed": "ダウングレードはできません。一度解約してから下位プランに再契約してください。", - "addNew": "新しいプランを追加" + "addNew": "新しいプランを追加", + "pagination": { + "prev": "前へ", + "next": "次へ" + }, + "syncBtn": "サブスクリプションを同期", + "syncOk": "サブスクリプション情報を同期しました", + "syncFail": "同期に失敗しました", + "syncNote": "購入済みのサブスクリプションが表示されない場合は、同期ボタンで最新情報を取得できます" }, "pricing": { "title": "料金プラン", @@ -658,6 +1235,10 @@ "threads": { "name": "スレッド", "desc": "スレッドの作成・更新・削除" + }, + "automod": { + "name": "AutoMod", + "desc": "AutoModルールの作成・更新・削除" } } }, @@ -710,6 +1291,14 @@ "name": "メッセージ編集", "desc": "メッセージ編集のログを記録します" }, + "message_reaction_add": { + "name": "リアクション追加", + "desc": "メッセージへのリアクション追加のログを記録します" + }, + "message_reaction_remove": { + "name": "リアクション削除", + "desc": "メッセージへのリアクション削除のログを記録します" + }, "member_kick": { "name": "メンバーキック", "desc": "メンバーキックのログを記録します" @@ -841,6 +1430,18 @@ "thread_delete": { "name": "スレッド削除", "desc": "スレッド削除のログを記録します" + }, + "automod_rule_create": { + "name": "AutoModルール作成", + "desc": "AutoModルール作成のログを記録します" + }, + "automod_rule_update": { + "name": "AutoModルール更新", + "desc": "AutoModルール更新のログを記録します" + }, + "automod_rule_delete": { + "name": "AutoModルール削除", + "desc": "AutoModルール削除のログを記録します" } }, "options": { @@ -865,6 +1466,36 @@ "contentOptional": "(任意)", "contentPlaceholder": "メッセージの内容を入力...", "addEmbed": "Embedを追加", + "addActionRow": "Action Row を追加", + "actionRow": { + "rowN": "アクション行{n}", + "typeButtons": "ボタン", + "typeSelect": "セレクトメニュー", + "addButton": "ボタンを追加", + "buttonLabel": "ラベル", + "buttonLabelPlaceholder": "ボタンのテキスト", + "buttonStyle": "スタイル", + "buttonStylePrimary": "Primary(青)", + "buttonStyleSecondary": "Secondary(グレー)", + "buttonStyleSuccess": "Success(緑)", + "buttonStyleDanger": "Danger(赤)", + "buttonStyleLink": "Link(URL)", + "customId": "カスタムID", + "customIdPlaceholder": "ワークフローで使用するID", + "linkUrl": "URL", + "linkUrlPlaceholder": "https://...", + "selectCustomId": "カスタムID", + "selectCustomIdPlaceholder": "ワークフローで使用するID", + "selectPlaceholder": "プレースホルダー", + "selectPlaceholderPlaceholder": "選択してください", + "addOption": "オプションを追加", + "optionLabel": "ラベル", + "optionLabelPlaceholder": "表示テキスト", + "optionValue": "値", + "optionValuePlaceholder": "ワークフローで使用する値", + "optionDescription": "説明(任意)", + "optionN": "オプション {n}" + }, "send": "送信", "update": "更新", "cancel": "キャンセル", @@ -907,7 +1538,8 @@ "title": "送信済みメッセージ", "desc": "送信済みのメッセージ一覧です", "empty": "送信済みメッセージはありません", - "embedCount": "{count}件のEmbed" + "embedCount": "{count}件のEmbed", + "componentCount": "{count}個のコンポーネント" } }, "workflow": { @@ -999,6 +1631,36 @@ "messageDeleteTitle": "メッセージ削除設定", "modalSubmitTitle": "モーダル送信設定", "webhookReceiveTitle": "Webhook受信設定", + "rssPollTitle": "RSS監視設定", + "youtubeWebsubTitle": "YouTube投稿通知設定", + "twitchEventsubTitle": "Twitchイベント通知設定", + "rssFeedUrl": "RSSフィードURL", + "rssFeedUrlHint": "監視するRSS/AtomフィードのURLを指定します(http/https)", + "rssFeedUrlPlaceholder": "例: https://example.com/feed.xml", + "rssInterval": "確認間隔", + "rssIntervalHint": "新着投稿の確認頻度を選択します", + "rssIntervals": { + "5m": "5分ごと", + "15m": "15分ごと", + "30m": "30分ごと", + "1h": "1時間ごと", + "6h": "6時間ごと", + "12h": "12時間ごと", + "24h": "24時間ごと" + }, + "youtubeChannelId": "YouTubeチャンネルID", + "youtubeChannelIdHint": "通知を受け取りたいYouTubeチャンネルのIDを指定します", + "youtubeChannelIdPlaceholder": "例: UCxxxxxxxxxxxxxxxxxxxxxx", + "twitchBroadcasterUserId": "Twitch配信者ユーザーID", + "twitchBroadcasterUserIdHint": "通知を受け取りたい配信者の数値ユーザーIDを指定します", + "twitchBroadcasterUserIdPlaceholder": "例: 123456789", + "twitchSubscriptionTypes": "通知タイプ", + "twitchSubscriptionTypesHint": "受け取りたいTwitchイベントを選択します", + "twitchSubscriptionTypeLabels": { + "stream_online": "配信開始 (stream.online)", + "stream_offline": "配信終了 (stream.offline)", + "channel_update": "チャンネル更新 (channel.update)" + }, "customIdFilter": "カスタムID(任意)", "customIdFilterHint": "特定のカスタムIDから始まるものだけを対象にします。空欄で全て対象", "customIdPlaceholder": "例: my-button", @@ -1013,6 +1675,8 @@ "webhookNoToken": "Webhookトークンはまだ生成されていません。保存後に表示されます。", "allVoiceChannels": "すべてのVCチャンネル", "webhookUrlCopy": "URLをコピー", + "webhookRegenerateTitle": "URLを再生成", + "webhookRegenerateConfirm": "Webhook URLを再生成すると、現在のURLは無効になります。続行しますか?", "webhookUrlCopied": "コピーしました", "webhookUrlDesc": "このURLにPOSTリクエストを送るとワークフローが起動します。JSONボディは '{{webhook.payload.key}}' で参照できます。" }, @@ -1023,6 +1687,7 @@ "config": "設定", "match": "✓ 一致", "unmatch": "✗ 不一致", + "errorTrigger": "エラー", "triggers": { "member_join": { "label": "メンバー参加", @@ -1083,6 +1748,18 @@ "webhook_receive": { "label": "Webhook受信", "desc": "Webhookリクエストを受信したとき" + }, + "rss_poll": { + "label": "RSS投稿", + "desc": "RSSフィードに新着記事が追加されたとき" + }, + "youtube_websub": { + "label": "YouTube投稿", + "desc": "指定チャンネルに新しい動画が公開されたとき" + }, + "twitch_eventsub": { + "label": "Twitchイベント", + "desc": "Twitchの指定イベントを受信したとき" } }, "conditions": { @@ -1150,7 +1827,18 @@ "validationThreadChannelEmpty": "「スレッド作成」ノードには対象チャンネルが必要です。", "validationRenameChannelEmpty": "「チャンネル名変更」ノードにはチャンネルと新しい名前が必要です。", "validationAccountAgeEmpty": "「アカウント作成日数」ノードには最小日数が必要です。", - "validationVarKeyEmpty": "「変数の値」ノードには変数名が必要です。" + "validationVarKeyEmpty": "「変数の値」ノードには変数名が必要です。", + "validationScheduledCronMissing": "scheduledトリガーにはcron式(cron フィールド)の指定が必要です", + "validationScheduledCronInvalid": "無効なcron式です。標準の5フィールド形式(例: */5 * * * *)で指定してください", + "validationScheduledCronTooFrequent": "最短実行間隔は5分です(例: */5 * * * *)", + "validationRssFeedUrlMissing": "RSSトリガーにはフィードURLの指定が必要です。", + "validationRssFeedUrlInvalid": "RSSフィードURLは http:// または https:// で始まる有効なURLを指定してください。", + "validationRssIntervalInvalid": "RSSの実行間隔が不正です。", + "validationYoutubeChannelIdMissing": "YouTubeトリガーにはチャンネルIDの指定が必要です。", + "validationTwitchBroadcasterUserIdMissing": "Twitchトリガーには配信者ユーザーIDの指定が必要です。", + "validationTwitchBroadcasterUserIdInvalid": "配信者ユーザーIDは数字のみで指定してください。", + "validationTwitchSubscriptionTypesMissing": "Twitchトリガーには少なくとも1つの購読タイプが必要です。", + "validationTwitchSubscriptionTypeInvalid": "Twitchの購読タイプに不正な値が含まれています。" }, "logs": { "empty": "実行ログがありません", @@ -1217,7 +1905,7 @@ "variableKey": "変数名", "variableKeyPlaceholder": "例: myVar", "variableValue": "値", - "variableValuePlaceholder": "例: '{{user.name}}'", + "variableValuePlaceholder": "例: {{user.name}}'", "ephemeral": "エフェメラル(本人のみ表示)", "replyContent": "返信内容(省略可)", "replyContentPlaceholder": "返信メッセージ...", @@ -1247,11 +1935,13 @@ "buttonCustomIdHint": "内部識別子(英数字・ハイフン)", "buttonCustomIdPlaceholder": "例: confirm-btn", "buttonModeCustomId": "カスタムID", - "buttonModeLinked": "ワークフロー連携", - "buttonLinkedWorkflow": "連携するワークフロー", - "buttonLinkedWorkflowHint": "ボタンを押したときに実行されるワークフロー", + "buttonModeLinked": "ワークフローを連携する", + "buttonModeContinue": "続けて実行", + "buttonModeContinueHint": "このボタンが押されると、同じワークフローの続きが実行されます。'{{button.label}}' と '{{button.index}}' で押されたボタンを判別できます。", + "buttonLinkedWorkflow": "ワークフローを連携しました", + "buttonLinkedWorkflowHint": "ボタンがクリックされたときに実行するワークフロー", "buttonLinkedWorkflowPlaceholder": "ワークフローを選択...", - "buttonLinkedWorkflowNone": "ワークフローが見つかりません", + "buttonLinkedWorkflowNone": "ワークフローが見つかりませんでした。", "buttonStyle": "スタイル", "buttonStylePrimary": "プライマリ(青)", "buttonStyleSecondary": "セカンダリ(灰)", @@ -1301,8 +1991,8 @@ "enabled": "有効", "disabled": "無効", "noSettings": "設定項目はありません", - "varNote": "set_variableノードでセットした変数は '{{変数名}}' で参照できます", - "webhookPayloadHint": "受信したJSONの各キーは '{{webhook.payload.keyName}}' で参照できます", + "varNote": "Set Variable ノードで設定された変数は、'{{変数名}} ' として参照できます。", + "webhookPayloadHint": "受信した JSON の各キーは '{{webhook.payload.keyName}}' として利用できます", "webhookHeaders": "カスタムヘッダー", "webhookHeadersHint": "Authorization: Bearer token など", "webhookAddHeader": "ヘッダーを追加", @@ -1335,5 +2025,549 @@ "executionCount": "{count} 回実行", "planViolationBadge": "プラン制限", "duplicateError": "複製に失敗しました" + }, + "admin": { + "title": "Cube 管理者", + "loggedInAs": "ログイン中", + "exitAdmin": "ダッシュボードへ戻る", + "cancel": "キャンセル", + "create": "作成", + "save": "保存", + "saving": "保存中...", + "add": "追加", + "nav": { + "dashboard": "ダッシュボード", + "subscriptions": "サブスクリプション", + "users": "ユーザー", + "guilds": "サーバー", + "blacklist": "ブラックリスト", + "spamPatterns": "スパムパターン", + "economy": "エコノミー", + "features": "フィーチャーフラグ", + "testGroups": "テストグループ", + "aiStats": "AI統計" + }, + "dashboard": { + "title": "システム状況", + "desc": "シャードのリアルタイム監視と管理", + "totalGuilds": "総サーバー数", + "avgPing": "平均 Ping", + "totalMemory": "合計メモリ", + "shards": "シャード", + "refresh": "更新", + "noShards": "シャード情報がありません", + "errorShards": "シャード情報の取得に失敗しました", + "leaveBtn": "退出", + "reloadI18nBtn": "i18n 再読み込み", + "restartAllBtn": "全再起動", + "confirmRestartAll": "全シャードを再起動しますか?Botが一時的に切断されます。", + "confirmRestartShard": "Shard {id} を再起動しますか?", + "confirmReloadI18n": "翻訳ファイルを再読み込みしますか?", + "confirmLeaveGuild": "ギルド {id} から強制退出しますか?", + "restartAllOk": "全シャードの再起動を開始しました", + "restartAllFail": "再起動の開始に失敗しました", + "restartShardOk": "Shard {id} の再起動を開始しました", + "restartShardFail": "シャードの再起動に失敗しました", + "reloadI18nOk": "翻訳ファイルを再読み込みしました", + "reloadI18nFail": "再読み込みに失敗しました", + "leaveGuildOk": "ギルド {id} から退出しました", + "leaveGuildFail": "ギルドからの退出に失敗しました" + }, + "subscriptions": { + "title": "サブスクリプション", + "create": "作成", + "createTitle": "サブスクリプション作成", + "searchPlaceholder": "ユーザー名・メール・ギルド名で検索...", + "colUser": "ユーザー", + "colGuild": "ギルド", + "colStatus": "ステータス", + "colExpiry": "有効期限", + "extend": "期間延長", + "extendOk": "期間を延長しました", + "extendFail": "期間延長に失敗しました", + "empty": "サブスクリプションがありません", + "syncBtn": "Stripe同期", + "confirmSync": "StripeとDBのサブスクリプション情報を同期しますか?", + "syncOk": "{synced}件同期しました(エラー: {errors}件)", + "syncFail": "同期に失敗しました", + "cancelAtEnd": "期間終了時にキャンセル", + "syncUserPlaceholder": "ユーザーID", + "confirmSyncUser": "ユーザー {userId} のサブスクリプション情報を同期しますか?" + }, + "blacklist": { + "title": "ブラックリスト", + "add": "追加", + "addTitle": "ブラックリストに追加", + "addBtn": "追加", + "reason": "理由", + "isBlacklisted": "BAN", + "isMuted": "グロチャミュート", + "searchPlaceholder": "User ID・理由で検索...", + "confirmRemove": "ユーザー {userId} をブラックリストから削除しますか?", + "removeOk": "ブラックリストから削除しました", + "removeFail": "削除に失敗しました", + "empty": "ブラックリストが空です" + }, + "guilds": { + "title": "サーバー一覧", + "searchPlaceholder": "サーバー名・IDで検索...", + "colName": "サーバー名", + "confirmDelete": "{name} のデータを削除しますか?この操作は取り消せません。", + "deleteOk": "サーバーデータを削除しました", + "deleteFail": "削除に失敗しました", + "empty": "サーバーがありません", + "syncBtn": "Bot同期", + "confirmSync": "Botが参加しているサーバーをDBに同期しますか?", + "syncOk": "{synced} 件のサーバーを同期しました", + "syncFail": "同期に失敗しました", + "leaveBtn": "退出", + "confirmLeave": "{name} からBotを退出させますか?", + "leaveOk": "Botがサーバーから退出しました", + "leaveFail": "退出に失敗しました", + "notFound": "サーバーが見つかりません", + "saveOk": "設定を保存しました", + "saveFail": "保存に失敗しました", + "detailSettings": "設定", + "detailLang": "言語", + "detailCreated": "作成日", + "detailUpdated": "更新日", + "detailCredits": "クレジット", + "creditPaid": "有料", + "creditBonus": "ボーナス", + "creditTotal": "合計", + "detailSubscription": "サブスクリプション", + "noSubscription": "サブスクリプションなし", + "detailExpiry": "有効期限", + "detailFeatures": "機能フラグ", + "featureFromPlan": "プラン", + "featureRawValue": "フラグ値", + "addPurge": "Auto Purge 追加", + "purgeDesc": "{msgLimit}件 / {interval}分ごとに削除", + "msgLimit": "メッセージ上限", + "msgs": "件", + "purgeInterval": "削除間隔", + "min": "分", + "addReact": "Auto React 追加", + "emoji": "絵文字", + "roleKeeperTitle": "ロールキーパー", + "rkEnable": "有効化", + "rkEnableDesc": "Role Keeper を有効にします", + "rkExcludeAdmin": "管理者権限を除外", + "rkExcludeAdminDesc": "管理者権限のあるロールの自動ロール保持を除外します", + "rkExcludeMod": "モデレーター権限を除外", + "rkExcludeModDesc": "モデレーター権限のあるロールの自動ロール保持を除外します", + "addSticky": "Sticky Message 追加", + "stickyContent": "メッセージ内容", + "workflowTitle": "ワークフロー", + "noWorkflows": "ワークフローがありません", + "execCount": "{count} 回実行", + "confirmDeleteWorkflow": "このワークフローを削除しますか?この操作は取り消せません。" + }, + "economy": { + "title": "エコノミー管理", + "grantTitle": "クレジット付与", + "grantAllTitle": "全サーバーへ一括付与", + "grantAllDesc": "稼働中の全サーバーへボーナスクレジットを付与します。確認キーの入力が必要です。", + "amount": "付与量", + "type": "種別", + "reason": "理由", + "confirmKey": "確認キー", + "confirmGrantAll": "{amount} CC を全サーバーへ付与しますか?", + "confirmKeyMismatch": "確認キーが一致しません", + "grantBtn": "付与する", + "grantAllBtn": "全サーバーへ付与", + "grantOk": "クレジットを付与しました", + "grantFail": "付与に失敗しました", + "grantAllOk": "一括付与を実行しました", + "grantAllFail": "一括付与に失敗しました" + }, + "users": { + "title": "ユーザー検索", + "searchPlaceholder": "Discord ID または User ID", + "searchBtn": "検索", + "notFound": "ユーザーが見つかりません", + "economyTitle": "クレジット残高", + "confirmDelete": "{name} の全データを削除しますか?この操作は取り消せません。", + "deleteBtn": "ユーザー削除", + "deleteOk": "ユーザーデータを削除しました", + "deleteFail": "削除に失敗しました" + }, + "aiStats": { + "title": "AIモデレーション統計", + "desc": "AIモデレーションの実利用・CC・推定原価・採算", + "guildIdPlaceholder": "Guild ID(空欄で全体統計)", + "scopeLabel": "表示範囲", + "scopeGlobal": "全体", + "scopeGuild": "Guild指定", + "allGuilds": "全Guild", + "guildIdLabel": "Guild ID", + "guildCount": "対象Guild数: {count}", + "search": "検索", + "period": "期間", + "days7": "7日間", + "days30": "30日間", + "days90": "90日間", + "totalMessages": "処理メッセージ数", + "laneMessages": "Default / Workflow", + "reachRate": "到達率", + "tokenUsage": "トークン消費量", + "ccUsage": "CC使用量", + "estimatedCc": "推定CC", + "paidBonusFreeCc": "有償 / ボーナス / 無料CC", + "consumedCc": "消費CC", + "billableCc": "消費CC", + "paidCc": "有償CC", + "bonusCc": "ボーナスCC", + "freeCc": "無料CC", + "billableFreeCc": "課金 / 無料 CC", + "avgCcPerMessage": "平均CC/メッセージ", + "providerCost": "推定プロバイダ原価", + "grossProfit": "推定粗利", + "grossMargin": "粗利率", + "avgTokens": "平均トークン/回", + "summaryNote": "平均トークン/メッセージ: {avgTokens}。推定売上は有償CCのみから算出: {revenue}。", + "unmeasured": "未計測", + "unmeasuredCostNote": "一部のプロバイダー原価が未計測のため、粗利と粗利率は N/A です。", + "inputTokens": "入力トークン", + "outputTokens": "出力トークン", + "thinkingTokens": "思考トークン", + "totalTokens": "合計トークン", + "screen": "スクリーニング", + "lite": "軽量LLM", + "detail": "詳細LLM", + "confidence": "Confidence", + "classify": "Classify", + "noData": "データがありません。Guild ID は任意です。空欄で検索すると全体統計を表示します。", + "loading": "読み込み中...", + "dailyTrend": "日別推移", + "nodeBreakdown": "ノード別内訳" + } + }, + "automod": { + "unknownUser": "不明", + "title": "統合モデレーション", + "desc": "AutoMod・AntiRaid・JoinGate の設定を行います", + "tabFilters": "フィルター", + "tabProtection": "保護", + "tabVerification": "認証", + "tabPermissions": "権限", + "tabWhitelist": "除外設定", + "whitelistDesc": "特定のユーザー、ロール、チャンネルを各ルールの対象外に設定します", + "automodSection": "AutoMod", + "automodDesc": "スパムや不審なメッセージを自動検知・対応します", + "enabled": "有効", + "disabled": "無効", + "heatPresetLabel": "熱量プリセット", + "heatPresetDesc": "違反への感度と制裁の強さを調整します", + "lenientLabel": "緩め", + "lenientDesc": "軽微な違反は許容", + "standardLabel": "標準", + "standardDesc": "バランスの取れたデフォルト", + "strictLabel": "厳格", + "strictDesc": "軽い違反にも即対応", + "logChannelLabel": "ログチャンネル", + "logChannelDesc": "モデレーションアクションを通知するチャンネル", + "noChannel": "チャンネルなし", + "quarantineRoleLabel": "隔離ロール", + "quarantineRoleDesc": "隔離対象ユーザーに付与するロール", + "noRole": "ロールなし", + "panicModeLabel": "エマージェンシーモード", + "panicModeDesc": "有効時、全ユーザーへの制裁閾値を大幅に下げます", + "crossServerOptInLabel": "サーバー間のリスク共有", + "crossServerOptInDesc": "有効時、このサーバーの違反情報を匿名でクロスサーバーリスクデータベースに提供し、他サーバーの脅威検知精度を向上します", + "trustedRolesLabel": "信頼ロール(AutoMod完全免除)", + "trustedRolesDesc": "このロールを持つメンバーはすべてのAutoMod検知をスキップします", + "antiNukeSection": "AntiNuke", + "antiNukeDesc": "サーバーへの破壊的な操作(チャンネル削除・一括BAN等)を検知・対応します", + "antiNukeChannelDeleteLabel": "チャンネル削除", + "antiNukeRoleDeleteLabel": "ロール削除", + "antiNukeChannelCreateLabel": "チャンネル作成", + "antiNukeRoleCreateLabel": "ロール作成", + "antiNukeWebhookCreateLabel": "Webhook作成", + "antiNukeBanKickLabel": "BAN/Kick", + "antiNukeRoleGrantLabel": "ロール一括付与", + "antiNukeLimitSuffix": "回で発動", + "antiNukeWindowSuffix": "秒以内", + "antiRaidSection": "AntiRaid", + "antiRaidDesc": "レイド攻撃(大量参加)を検知・対応します", + "antiRaidJoinRateLabel": "参加レート上限", + "antiRaidJoinRateDesc": "設定した時間内にこの人数以上が参加するとレイドと判定します", + "antiRaidWindowLabel": "参加ウィンドウ(秒)", + "antiRaidAccountAgeLabel": "アカウント年齢(日)", + "antiRaidAccountAgeDesc": "この日数未満のアカウントはレイドスコアが加算されます", + "joinGateSection": "JoinGate", + "joinGateDesc": "不審な条件に合致した新規参加者を隔離・認証させます", + "joinGateFilterNoAvatarLabel": "デフォルトアバターをフィルター", + "joinGateFilterNoAvatarDesc": "プロフィール画像を設定していないアカウントを隔離", + "joinGateFilterNewAccountLabel": "新規アカウントをフィルター(日数)", + "joinGateFilterNewAccountDesc": "指定日数未満のアカウントを隔離。0で無効", + "joinGateFilterAdvertisingLabel": "広告アカウントをフィルター", + "joinGateFilterAdvertisingDesc": "プロフィールに招待リンク等を含むアカウントを隔離", + "joinGateFilterUnverifiedBotLabel": "未認証Botをフィルター", + "joinGateFilterUnverifiedBotDesc": "Discordで認証されていないBotアカウントを隔離する", + "joinGateFilterUnauthorizedBotLabel": "未承認Botをフィルター", + "joinGateFilterUnauthorizedBotDesc": "Masterでないメンバーが追加したBotを隔離", + "powGateSectionInner": "認証フロー(PoW Gate)", + "powGateRoleReady": "設定済み", + "powGateRoleNotReady": "未設定(セットアップ後に自動作成)", + "quarantineRoleReady": "設定済み", + "quarantineRoleNotReady": "未設定", + "powGateSection": "PoW Gate(人間証明)", + "powGateDesc": "Cloudflare Turnstileで人間確認を要求し、BOTや荒らしを防ぐ", + "powGateAllUsersLabel": "全新規メンバーに適用", + "powGateAllUsersDesc": "オフ時はJoinGateフィルターに引っかかったユーザーのみ対象", + "powGateRoleLabel": "制限ロール", + "powGateRoleDesc": "認証前のユーザーに付与するロール(認証後に自動削除)", + "powGateChannelLabel": "認証チャンネル", + "powGateChannelDesc": "DMが届かない場合の案内チャンネル(設定時に自動権限調整)", + "powGateTimeoutLabel": "タイムアウト", + "powGateTimeoutDesc": "認証未完了ユーザーを自動キックするまでの時間(0で無効)", + "minutes": "分", + "messages": "件", + "limit": "上限", + "window": "期間", + "age": "年齢", + "automodRules": "ルール設定", + "quarantineSetupBanner": "隔離ロールが未セットアップです", + "quarantineSetupBannerDesc": "モデレーション機能が有効ですが、隔離ロールが設定されていません。ボタンを押すとBotが自動でロール作成・チャンネル権限設定を行います。", + "quarantineSetupBtn": "今すぐセットアップ", + "quarantineSetupRequesting": "セットアップ中...", + "quarantineSetupDone": "セットアップをリクエストしました。数秒後に反映されます。", + "setupBtn": "セットアップ", + "requesting": "処理中...", + "setupDone": "完了", + "discordRegistered": "Discordと同期済み", + "discordNotRegistered": "Discord未同期", + "discordRegisterBtn": "Discordと同期", + "discordRegistering": "同期中...", + "ruleMentionSpam": "メンションスパム", + "ruleMentionSpamDesc": "@user / @role / @here / @everyone のメンションをheatとして加算", + "ruleInviteLink": "招待リンク", + "ruleInviteLinkDesc": "Discord 招待URLを検知", + "ruleEmojiSpam": "絵文字スパム", + "ruleEmojiSpamDesc": "絵文字1個につき+1%(上限20%/メッセージ)", + "ruleCharSpam": "文字スパム", + "ruleCharSpamDesc": "同一文字の連続・Zalgoテキストを検知", + "ruleUrlScan": "URLスキャン", + "ruleUrlScanDesc": "短縮URL展開 → Safe Browsing APIで悪意あるURLを検知", + "ruleImageHash": "スパム画像ブロック", + "ruleImageHashDesc": "Cubeのスパム・NSFW画像データベースと照合し、一致した画像を自動削除します", + "ruleCrossChannel": "クロスチャンネル", + "ruleCrossChannelDesc": "短時間に複数チャンネルへの類似投稿を検知", + "rulePhishing": "フィッシング", + "rulePhishingDesc": "既知フィッシングドメイン・詐欺URLパターンを検知", + "ruleBlacklistWord": "ブラックリストワード", + "ruleBlacklistWordDesc": "管理者が設定したワードを含むメッセージにheatを加算", + "blacklistWordAdd": "追加", + "blacklistWordPlaceholder": "禁止ワードを入力", + "blacklistWordPlaceholder_text": "禁止ワードを入力(部分一致)", + "blacklistWordPlaceholder_wildcard": "例: *悪い言葉* または spam*", + "blacklistWordPlaceholder_regex": "例: (bad|spam)\\w+", + "blacklistWordType_text": "テキスト", + "blacklistWordType_wildcard": "ワイルドカード", + "blacklistWordType_regex": "正規表現", + "blacklistWordWildcardHint": "* は任意の文字列に一致します。例: *word* で部分一致、word* で前方一致", + "blacklistWordRegexHint": "JavaScript 正規表現が使用できます(最大10件まで Discord AutoMod に同期されます)", + "blacklistWordHeat": "Heat値", + "blacklistWordHeatHelp": "1〜100(デフォルト30%)", + "ruleInactiveChannel": "活発でないチャンネルへの投稿", + "ruleInactiveChannelDesc": "長時間投稿がなかったチャンネルへの投稿に+3%を加算", + "inactiveChannelThreshold": "非活性判定時間(日)", + "nightTimeRange": "夜間時間帯(JST)", + "nightTimeRangeDesc": "この時間帯は深刻度閾値が低く設定される(夜間ポリシー)", + "nightTimeRangeTo": "〜", + "spamHashManagement": "既知スパム画像ハッシュ管理", + "spamHashAdd": "ハッシュを追加", + "spamHashPlaceholder": "dHashビット列(64文字)", + "spamHashLabelPlaceholder": "ラベル(任意)", + "save": "保存", + "saving": "保存中...", + "saved": "保存しました", + "saveError": "保存に失敗しました", + "days": "日", + "people": "人", + "seconds": "秒", + "alwaysOnRulesWhitelist": "常時適用ルールの除外設定", + "ruleMessageSend": "メッセージ送信", + "ruleMessageSendDesc": "すべてのメッセージ送信ごとに +2%(常時適用)", + "ruleMessageRepeat": "繰り返しメッセージ", + "ruleMessageRepeatDesc": "直前と類似した内容の繰り返し送信に +8%(常時適用)", + "ruleAttachment": "添付ファイル", + "ruleAttachmentDesc": "画像・ファイルの添付ごとに +4%(常時適用)", + "whitelistSection": "ホワイトリスト", + "whitelistRoles": "ロール除外", + "whitelistChannels": "チャンネル除外", + "whitelistAddPlaceholder": "IDを入力", + "whitelistEmpty": "除外設定なし", + "mastersSection": "モデレーション管理者(Master)", + "mastersDesc": "統合モデレーション設定を変更できるユーザー(Discord管理者権限とは独立)", + "trustedSection": "免除ユーザー(Trusted)", + "trustedDesc": "Heat・AI・AntiNukeなどの処罰アクションを免除するユーザー", + "addMaster": "Masterを追加", + "addTrusted": "Trustedを追加", + "userIdPlaceholder": "Discord ユーザーID", + "remove": "削除", + "permissionDenied": "Master権限がないため設定を変更できません", + "exemptHeatLane": "Heatレーン免除", + "exemptAiLane": "AIレーン免除", + "exemptAntinuke": "AntiNuke免除", + "exemptAntiraid": "AntiRaid免除", + "tabSchedule": "スケジュール", + "scheduleSection": "スケジュールセキュリティルール", + "scheduleSectionDesc": "特定の時間帯・期間にサーバーのセキュリティ設定を自動で変更します", + "scheduleAddRule": "ルールを追加", + "scheduleRuleType": "アクション", + "scheduleRuleTypeInviteDisable": "招待リンクを無効化", + "scheduleRuleTypeDmDisable": "DM を無効化", + "scheduleRuleTypeSecurityLevel": "認証レベルを変更", + "scheduleScheduleType": "スケジュール種別", + "scheduleTimeRange": "毎日繰り返し(時間帯)", + "scheduleDateRange": "一回限り(期間指定)", + "scheduleStartTime": "開始時刻 (JST)", + "scheduleEndTime": "終了時刻 (JST)", + "scheduleStartDate": "開始日時", + "scheduleEndDate": "終了日時", + "scheduleSecurityLevel": "認証レベル", + "scheduleSecurityLevelNone": "なし (0)", + "scheduleSecurityLevelLow": "低 (1)", + "scheduleSecurityLevelMedium": "中 (2)", + "scheduleSecurityLevelHigh": "高 (3)", + "scheduleSecurityLevelVeryHigh": "最高 (4)", + "scheduleLabel": "ラベル(任意)", + "scheduleLabelPlaceholder": "例: 深夜帯セキュリティ強化", + "scheduleEnabled": "有効", + "scheduleDeleteConfirm": "このルールを削除しますか?", + "scheduleNoRules": "スケジュールルールがありません", + "scheduleRuleTypeInviteDisableDesc": "指定した時間帯はサーバーの招待リンクを一時停止します。", + "scheduleRuleTypeDmDisableDesc": "指定した時間帯はサーバー経由のメンバー間 DM を一時停止します。", + "scheduleRuleTypeSecurityLevelDesc": "指定した時間帯だけ認証レベルを引き上げ、時間外は元のレベルへ自動で戻します。", + "scheduleTimeRangeHint": "毎日この時間帯に繰り返し適用されます(JST)。日をまたぐ指定(例: 22:00→08:00)も可能です。", + "scheduleDateRangeHint": "指定した開始〜終了日時の一度きりで適用されます。", + "schedulePreviewLabel": "プレビュー", + "schedulePreviewTimeRange": "毎日 {start}〜{end} JST の間、{action}", + "schedulePreviewDateRange": "{start} 〜 {end} の間、{action}", + "scheduleActionInviteDisable": "招待リンクを一時停止します。", + "scheduleActionDmDisable": "メンバー間 DM を一時停止します。", + "scheduleActionSecurityLevel": "認証レベルを「{level}」に引き上げます。", + "scheduleAddRuleTitle": "ルールを追加", + "scheduleEditRuleTitle": "ルールを編集", + "scheduleSave": "保存", + "scheduleSaved": "保存しました", + "scheduleDailyHint": "毎日この時間帯に自動で適用されます(JST)。日をまたぐ指定(例: 22:00→翌08:00)も可能です。", + "scheduleEnableLog": "ログを有効にする", + "scheduleEnableLogDesc": "開始・終了時にログを送信します。", + "scheduleLogChannel": "ログを送信するチャンネル", + "scheduleSelectChannel": "チャンネルを選択", + "scheduleLevelLowDesc": "メール認証済みのアカウントのみ", + "scheduleLevelMediumDesc": "Discord登録から5分以上経過したアカウントのみ", + "scheduleLevelHighDesc": "サーバー参加から10分以上経過したアカウントのみ", + "scheduleLevelVeryHighDesc": "電話番号認証済みのアカウントのみ" + }, + "accountSecurity": { + "title": "セキュリティ", + "desc": "パスキーを登録して、Discordにアクセスできない場合でもログインできます", + "passkeyTitle": "パスキー", + "passkeyDesc": "登録済みのパスキーを使って緊急時にログインできます", + "addPasskey": "パスキーを追加", + "adding": "登録中...", + "noPasskeys": "パスキーが登録されていません", + "noPasskeysDesc": "パスキーを追加すると、Discordアカウントを失った場合でもログインできます", + "deletePasskey": "削除", + "deleting": "削除中...", + "addSuccess": "パスキーを登録しました", + "addError": "パスキーの登録に失敗しました", + "deleteSuccess": "パスキーを削除しました", + "deleteError": "パスキーの削除に失敗しました", + "registeredAt": "登録日", + "addModalTitle": "パスキーに名前を付ける", + "addModalDesc": "このデバイスを識別しやすい名前を入力してください。", + "addModalPlaceholder": "例: 私のiPhone、メインPC", + "addModalBtn": "登録を開始" + }, + "activityLog": { + "title": "操作ログ", + "desc": "ダッシュボードでの設定変更・操作の履歴を確認できます", + "empty": "操作ログがありません", + "loadMore": "さらに読み込む", + "loading": "読み込み中...", + "filterAll": "すべて", + "page": "ページ", + "of": "/", + "total": "件", + "categories": { + "module": "モジュール", + "workflow": "ワークフロー", + "audit_log": "監査ログ設定", + "guild": "サーバー設定", + "moderation": "モデレーション", + "ai_moderation": "AIモデレーション", + "general": "一般" + }, + "actions": { + "auto_purge_updated": "自動削除設定を更新", + "auto_purge_deleted": "自動削除設定を削除", + "auto_react_updated": "自動リアクション設定を更新", + "auto_react_deleted": "自動リアクション設定を削除", + "role_keeper_updated": "ロールキーパー設定を更新", + "role_keeper_deleted": "ロールキーパー設定を削除", + "workflow_created": "ワークフローを作成", + "workflow_updated": "ワークフローを更新", + "workflow_deleted": "ワークフローを削除", + "audit_log_channel_set": "監査ログチャンネルを設定", + "guild_settings_updated": "サーバー設定を更新", + "moderation_settings_updated": "モデレーション設定を更新" + } + }, + "analytics": { + "title": "モデレーション アナリティクス", + "rangePicker": { + "7d": "過去7日", + "30d": "過去30日" + }, + "flow": { + "title": "フロー分析", + "totalExecutions": "総実行数", + "nodeType": "ノード", + "entered": "通過", + "passed": "パス", + "passRate": "パス率", + "noData": "データがありません" + }, + "verdict": { + "title": "判定分布", + "safe": "安全", + "gray": "グレー", + "violation": "違反" + }, + "category": { + "title": "カテゴリ分布" + }, + "ccUsage": { + "title": "CC 消費量", + "totalCc": "合計 CC", + "date": "日付", + "cc": "CC", + "byNodeType": "ノード別" + }, + "userStats": { + "title": "違反ユーザー ランキング", + "userId": "ユーザー ID", + "violations": "違反数", + "categories": "カテゴリ", + "lastViolation": "最終違反", + "noUsers": "該当なし", + "viewDetails": "詳細を見る" + }, + "userViolations": { + "title": "違反ログ", + "back": "戻る", + "ruleType": "ルール", + "reason": "理由", + "action": "アクション", + "content": "内容", + "noViolations": "違反ログはありません", + "retentionNote": "現在のプラン ({plan}) では過去 {days} 日分を表示可能です", + "page": "ページ {page} / {total}" + } } }