{
    "auth.errors.invalid_callback": "Invalid callback",
    "auth.scope_popup.close_hint": "You can close this window.",
    "auth.oauth.consent_title": "Authorize access?",
    "auth.oauth.consent_intro": "wants to access your Streambytes account:",
    "auth.oauth.approve": "Authorize",
    "auth.oauth.deny": "Deny",
    "auth.oauth.scope_property_read": "Read resources and flows",
    "auth.oauth.scope_resources_write": "Create and edit resources",
    "auth.oauth.scope_flows_write": "Create and edit flows",
    "auth.oauth.scope_flows_test": "Test-run flows",
    "auth.oauth.scope_scenes_write": "Place scene widgets",
    "auth.oauth.scope_packages_configure": "Change installed packages' settings",
    "auth.oauth.scope_builder_read": "Read builder packages",
    "auth.oauth.scope_builder_write": "Edit builder drafts",
    "auth.oauth.scope_builder_test": "Test builder drafts",
    "auth.oauth.scope_builder_apply": "Publish packages and test them on your own channel",
    "admin.extensions.toggle_aria": "Toggle extension :alias",
    "admin.extensions.edit_aria": "Edit extension :alias",
    "admin.audit_log.package_filter": "Package",
    "admin.audit_log.package_filter_apply": "Filter",
    "admin.audit_log.package_chip": "package",
    "admin.marketplace.approve_taken_down": "This package was taken down by the platform. Restore it before approving a submitted version.",
    "admin.marketplace.approve_deleted": "Its author deleted this package, so this submitted version can't be approved. Reject it instead.",
    "admin.marketplace.takedown_no_approved": "This package has no approved version to take down.",
    "admin.marketplace.restore_not_taken_down": "This package is not taken down, so there is nothing to restore.",
    "admin.marketplace.package_not_found": "No version exists under this package id. The list may be stale — reload it.",
    "admin.marketplace.destroy_taken_down": "This package is taken down and cannot be deleted. Restore it first.",
    "admin.marketplace.restore_counts": "Restored: :history from the flow history, :discarded from Discarded",
    "admin.marketplace.co_open_counts": "Open at once: :people between two people, :agent between a person and an agent",
    "admin.marketplace.conflict_counts": "Save conflicts: :people between two people, :agent between a person and an agent, :other other",
    "admin.marketplace.builtin_not_uninstallable": "Built-in packages cannot be uninstalled from the admin UI.",
    "admin.marketplace.destroy_pinned": ":count channel has this release installed. It can only be deleted once no channel has it installed.|:count channels have this release installed. It can only be deleted once no channel has it installed.",
    "admin.marketplace.upload_pinned": ":count channel has this release installed. Upload your package under a new version.|:count channels have this release installed. Upload your package under a new version.",
    "admin.marketplace.upload_builtin": "Streambridge ships this version itself. Upload your package under a new version.",
    "admin.marketplace.takedown_action": "Take down…",
    "admin.marketplace.takedown_title": "Take this package down?",
    "admin.marketplace.takedown_prompt": "Every version of this package leaves distribution, and properties that have it installed lose access. The note is stored with the takedown.",
    "admin.marketplace.takedown_note_label": "Takedown reason",
    "admin.marketplace.takedown_note_placeholder": "Why is this package being taken down?",
    "admin.marketplace.takedown_note_required": "A reason is required when taking a package down.",
    "admin.marketplace.takedown_confirm": "Take down",
    "admin.marketplace.restore_action": "Restore",
    "admin.marketplace.state_taken_down": "Taken down",
    "admin.marketplace.visibility_feature": "Feature apps are listed through their extension. Change the listing on the extension page.",
    "admin.marketplace.visibility_not_builtin": "Only first-party packages can be hidden here. For other packages, take them down.",
    "admin.marketplace.hide_action": "Hide from marketplace",
    "admin.marketplace.show_action": "Show in marketplace",
    "admin.marketplace.hide_hint": "Properties that installed it keep it.",
    "admin.marketplace.state_hidden": "Hidden",
    "admin.marketplace.feature_listing_note": "Whether this app is listed is decided on its extension.",
    "admin.marketplace.feature_listing_link": "Open extension",
    "admin.marketplace.uninstall_title": "Uninstall this package.",
    "admin.cloudbot.usage_title": "Message usage",
    "admin.cloudbot.usage_empty": "No data yet.",
    "admin.cloudbot.sent": "Sent",
    "admin.cloudbot.failed": "Failed",
    "admin.cloudbot.peak_30s": "Peak (30s)",
    "admin.cloudbot.helix_bucket": "Helix bucket (1 min)",
    "admin.cloudbot.helix_unseen": "no response seen yet",
    "admin.cloudbot.status_title": "Status",
    "admin.cloudbot.connect_title": "Connection",
    "admin.groups.delete_confirm_message": "Members lose access granted by this group.",
    "admin.groups.delete_confirm_title": "Delete user group :name?",
    "admin.groups.toggle_aria": "Toggle user group :name",
    "admin.user_groups.edit_aria": "Edit user group :name",
    "admin.tts.title": "TTS Usage",
    "admin.tts.period": "Period",
    "admin.tts.neural_quota": "Neural quota",
    "admin.tts.standard_quota": "Standard quota",
    "admin.tts.characters": "characters",
    "admin.tts.est_cost": "Estimated cost",
    "admin.tts.properties_period": "Properties with usage in this period",
    "admin.tts.neural": "Neural",
    "admin.tts.standard": "Standard",
    "admin.tts.of_neural_cap": "of neural cap",
    "admin.tts.cap_exhausted": "Neural cap exhausted",
    "admin.tts.near_abuse_fuse": "Near abuse limit",
    "admin.tts.empty": "No TTS usage in this period.",
    "admin.users.title": "Users",
    "admin.users.add": "Add User",
    "admin.users.search_placeholder": "Search users…",
    "admin.users.open_property": "Open Property",
    "admin.users.grant_access": "Grant Access",
    "admin.users.revoke_access": "Revoke Access",
    "admin.users.stats": "Stats",
    "admin.users.edit": "Edit",
    "admin.users.remove": "Remove",
    "admin.users.remove_confirm_title": "Remove :login?",
    "admin.users.remove_confirm_message": "This permanently deletes the account and all of its data. The Twitch identity is preserved.",
    "admin.users.loading_more": "Loading more…",
    "admin.users.deleted_flash": "Account :user has been removed",
    "admin.users.access_revoked_flash": "Access for :user has been revoked",
    "admin.waitlist.group_label": "Group",
    "events.delete_blocked": "This event is still used in one or more graphs. Remove the trigger nodes first.",
    "events.empty_state": "Nothing connected yet. Install Commands or Keywords, or register a Twitch event to get started.",
    "events.registrations.retry_button": "Retry",
    "events.registrations.retry_only_failed": "Only failed registrations can be retried.",
    "events.registrations.retry_queued": "Retry queued for :event on property #:property",
    "events.registrations.retry_tooltip": "Reset retry counter and re-queue immediately",
    "events.registrations.scope_drift": "Scope drift:",
    "events.registrations.scope_drift_hint": "Active registrations require scopes that are no longer granted by any connection:",
    "events.sample.variant_label": "Sample variant",
    "events.sample.variant_plain": "Plain sample",
    "events.sample_variant.provider_emotes": "BetterTTV and 7TV emotes",
    "events.sample_variant.emote_stacks": "Stacked emotes",
    "events.sample_variant.emote_modifier": "Emote modifier",
    "events.sample_variant.emote_only": "Emotes only",
    "events.branch.add_tooltip": "Add success/failure branch",
    "events.branch.error_reason": "Failure reason",
    "events.branch.lane_empty": "No action yet.",
    "events.branch.on_failure": "On failure",
    "events.branch.on_success": "On success",
    "events.branch.result_tokens": "Branch variables",
    "events.recipe.created": "Automation created",
    "events.wizard.title": "New automation",
    "events.wizard.when": "When this happens",
    "events.wizard.then": "Do this",
    "events.wizard.configure": "Customise",
    "events.wizard.show_advanced": "Show advanced",
    "events.wizard.message_placeholder": "Type a message. Insert a value with the picker.",
    "events.wizard.configure_in_editor": "This reaction has no simple options. Tweak it in the editor after creating.",
    "events.wizard.sender": "Send from",
    "events.wizard.create": "Create automation",
    "events.tagline": "Connect reactions to events. Register Twitch events and attach actions.",
    "events.unregister_confirm": "Unregister this event from your property? Connected actions stay configured but stop firing until the event is registered again.",
    "events.user_event.app_owned_notice": "This event belongs to :name. That app manages it, so it cannot be edited here.",
    "events.user_event.app_owned_unknown": "an installed app",
    "events.user_event.identifier_hint": "Event identifier: sent as `user.{key}`. Lowercase letters, digits, underscores; must start with a letter.",
    "events.user_event.identifier_hint_wire": "Event identifier: fires as `:event_key`. Lowercase letters, digits, underscores; must start with a letter.",
    "events.user_event.no_pins_hint": "No pins yet. Pin-less events fire just for the effect (handy for cross-graph signals).",
    "events.user_event.option_label": ":event_name (:key)",
    "events.user_event.option_label_app": ":event_name (:name)",
    "graphs.channel_vars.steam_url": "Steam Store Link",
    "graphs.channel_vars.steam_url_help": "Steam store page for the current category. Empty if it's not a Steam game.",
    "graphs.list.editor_button": "Editor",
    "graphs.list.delete_confirm": "This permanently removes the graph and its run history.",
    "graphs.list.delete_confirm_title": "Delete :name?",
    "graphs.list.last_run": "last run",
    "graphs.list.nodes": "Nodes",
    "graphs.list.share_button": "Share",
    "graphs.editor.create_title": "New flow",
    "graphs.editor.no_actions_yet": "No actions connected yet. Add one below to make this trigger do something.",
    "graphs.editor.no_node_for_type": "No node accepts a :type connection.",
    "graphs.editor.scope_grant_unsaved_title": "Unsaved changes will be lost",
    "graphs.editor.scope_grant_unsaved_message": "You have unsaved changes that will be lost during the Twitch sign-in. Save first, then click Grant again. Continue without saving?",
    "graphs.editor.scope_grant_continue": "Continue without saving",
    "graphs.editor.promote_button": "Convert to Flow",
    "graphs.editor.promote_tooltip": "Convert this trigger's actions into a visual flow",
    "graphs.editor.promote_needs_flow": "Install the Event Flows extension first to convert this trigger.",
    "graphs.editor.promote_confirm_title": "Convert to a visual flow?",
    "graphs.editor.promote_confirm": "All currently-wired actions move into the new flow; this view will then show one Custom Flow row instead.",
    "graphs.editor.promote_confirm_cta": "Convert",
    "graphs.editor.promoted_toast": "Converted to flow",
    "graphs.editor.promoted_label": "Promoted from the flat-action setup; edit visually here.",
    "graphs.inline.editing": "Editing",
    "graphs.node.not_configured": "Not configured yet",
    "graphs.editor.leave_confirm_title": "Unsaved changes will be lost",
    "graphs.editor.leave_confirm": "This flow has unsaved changes. Leaving this page now discards them.",
    "graphs.editor.leave_confirm_cta": "Leave",
    "graphs.editor.rename": "Rename",
    "graphs.editor.saved_ago": "Saved :ago",
    "graphs.editor.unsaved": "Unsaved changes",
    "graphs.editor.active": "Active",
    "graphs.form.serialize_runs": "One run at a time",
    "graphs.form.serialize_runs_help": "Queue this flow's runs instead of running them side by side. Use it when the flow changes a variable that other runs read, for example a game turn, a queue, or a shared score.",
    "graphs.editor.test_run": "Test run",
    "graphs.editor.more_actions": "More actions",
    "graphs.editor.variables": "Variables",
    "graphs.editor.save_before_share": "Save before sharing",
    "graphs.editor.save_ref_scope": "Save failed: a resource used in this flow does not belong to this workspace. Pick it again.",
    "graphs.editor.save_body_invalid": "Save failed: the server rejected this flow.",
    "graphs.editor.save_url_plain": "Save failed: an HTTP request's URL must be a plain http(s)://host/path, without backslash, spaces, login or encoded host.",
    "graphs.editor.save_regex": "Save failed: a “matches regex” pattern cannot run here. Backreferences, lookahead and counts above 16 are not supported; use + or * instead.",
    "graphs.configure.conflict_no_longer_linked": "This graph is no longer linked. Reloading.",
    "graphs.configure.discard": "Discard changes",
    "graphs.configure.discard_message": "Your edits will be lost.",
    "graphs.configure.discard_title": "Discard unsaved changes?",
    "graphs.configure.empty": "Nothing to configure.",
    "graphs.configure.resource_missing": "Resource no longer exists",
    "graphs.configure.save_failed": "Could not save configuration",
    "graphs.configure.saved": "Configuration saved",
    "graphs.configure.tab_canvas": "Canvas",
    "graphs.configure.tab_configure": "Configure",
    "graphs.configure.validation_summary": ":count field(s) need attention",
    "graphs.configure.activate": "Activate",
    "graphs.configure.activate_anyway": "Activate anyway?",
    "graphs.configure.activate_warning": "Some fields still need attention. The flow may not run correctly.",
    "graphs.configure.active": "Active",
    "graphs.configure.basics_title": "Basics",
    "graphs.configure.paused": "Paused",
    "graphs.configure.field_name": "Name",
    "graphs.configure.field_description": "Description",
    "graphs.configure.grant_scopes": "Grant scopes",
    "graphs.configure.helper.command_link": "No commands yet, create one under Extensions, Commands.",
    "graphs.configure.helper.keyword_link": "No keywords yet, create one under Extensions, Keywords.",
    "graphs.configure.helper.reward_link": "No rewards yet, create one in your Twitch dashboard or via Streambridge Rewards.",
    "graphs.configure.status_banner.ready": "Fully configured, but not active yet. Switch it on with the toggle in the top right.",
    "graphs.configure.status_banner.missing_scopes": "{count} scope(s) not granted",
    "graphs.configure.status_banner.missing_refs": "{count} resource(s) not linked",
    "graphs.configure.status_banner.missing_params": "{count} field(s) incomplete",
    "graphs.counter_ref.pick": "– pick a counter –",
    "graphs.counter_ref.per_stream": "per stream",
    "graphs.counter_ref.empty": "No counters yet, create one under Extensions, Counters.",
    "graphs.configure.references_title": "References",
    "graphs.configure.references_ready": "{ready}/{total} ready",
    "graphs.expose.exposed_toggle": "Exposed on import",
    "graphs.expose.bound": "Bound to the package setting “:key”. Its label, help and default are the setting's.",
    "graphs.expose.node_title_label": "Node title",
    "graphs.expose.node_title_help": "Shown as the section heading in the Configurator.",
    "graphs.expose.node_title_required": "Name this node before exposing its fields.",
    "graphs.expose.help_field": "Help",
    "graphs.expose.help_placeholder": "Shown to streamers when they import",
    "graphs.expose.label_field": "Label",
    "graphs.expose.label_help": "Empty defaults to '{key}'",
    "graphs.expose.panel_title": "Expose '{key}'",
    "graphs.expose.required_disabled_boolean": "Boolean fields always have a value",
    "graphs.expose.required_field": "Required at import",
    "graphs.expose.required_help": "Wizard blocks if default is empty",
    "graphs.expose.tooltip_connection_ref": "Connection refs are always cleared on import",
    "graphs.expose.tooltip_exposable": "Expose this field on import",
    "graphs.expose.tooltip_resource_ref": "Resource refs are always exposed on import",
    "graphs.expose.clear_value_field": "Don't copy current value",
    "graphs.expose.clear_value_help": "When shared, this field stays editable but ships empty. The recipient enters their own value. Use it for secrets like webhook URLs or API keys.",
    "graphs.gate.condition_intro": "Fires only when these values match:",
    "graphs.history.restored": "Flow restored",
    "graphs.inputtext.ctx_key_entry": "ctx key…",
    "graphs.inputtext.example_placeholder": "Text",
    "graphs.inputtext.insert_variable": "Insert variable",
    "graphs.inputtext.no_match": "No matching variables. Press Escape to keep \":text\" as text.",
    "graphs.inputtext.no_variables": "No matching variables.",
    "graphs.inputtext.picker_tip": "Type { in the text to open this list at the cursor.",
    "graphs.inputtext.preview_label": "Preview:",
    "graphs.inputtext.search_placeholder": "Search variable…",
    "graphs.inputtext.var_enriched_help": "Empty if the user can't be found.",
    "graphs.install.cap_exceeded": "Too many resources of one type to auto-create",
    "graphs.install.enable_extension": "Enable",
    "graphs.install.extension_required": "Extension required",
    "graphs.install.failed": "Install failed.",
    "graphs.install.grant_scopes": "Grant scopes",
    "graphs.install.grant_scopes_bulk": "Grant permissions (:count)",
    "graphs.install.install_extension": "Install extension",
    "graphs.install.install_extensions_bulk": "Install extensions (:count)",
    "graphs.install.install": "Install",
    "graphs.install.installing_to": "Installing to :property",
    "graphs.install.missing_extensions_error": "Missing extensions: :list",
    "graphs.install.open_editor": "Open in Editor",
    "graphs.install.owner_only_hint": "Installing or enabling these extensions needs the “Manage apps” permission, please ask the channel owner.",
    "graphs.install.prereq_count_unmet": ":count prerequisites unmet",
    "graphs.install.prerequisites": "Prerequisites",
    "graphs.install.recheck": "Re-check",
    "graphs.install.scope_required": "Scope required",
    "graphs.install.status_ok": "Ready",
    "graphs.install.status_missing": "Missing",
    "graphs.install.status_disabled": "Disabled",
    "graphs.install.share_link_name_default": "Imported graph",
    "graphs.install.share_link_name_from": "Graph from @{sharer}",
    "graphs.install.share_link_invalid": "Share link expired or invalid",
    "graphs.install.success": "Flow installed successfully.",
    "graphs.install.switch_property": "Switch",
    "graphs.install.extensions_required": "Extensions required",
    "graphs.install.flow_name_label": "Flow name",
    "graphs.install.modal_title": "Install flow",
    "graphs.install.scopes_grant_later": "Missing scopes can be granted after install.",
    "graphs.install.scopes_needed": "Scopes needed",
    "graphs.install.tier_required": "Premium required",
    "graphs.install.will_create": "Will be created for you",
    "graphs.install.you_will_wire": "You'll need to assign after install",
    "graphs.install.string_invalid": "That flow string could not be read.",
    "graphs.install.string_label": "Flow string",
    "graphs.install.string_paste_help": "Paste a flow string to import it.",
    "graphs.install.string_import_button": "Import",
    "graphs.install.lineage_title": "You already have this flow",
    "graphs.install.lineage_update": "Update my existing copy",
    "graphs.install.lineage_new_copy": "Create a new copy",
    "graphs.import.string_unrecognized": "This is not a valid flow string.",
    "graphs.import.string_corrupted": "This flow string looks corrupted or incomplete. Copy it again.",
    "graphs.import.string_version_mismatch": "This flow was created on a newer version and cannot be imported yet.",
    "graphs.import.string_unknown_node": "This flow uses a block this server does not recognise.",
    "graphs.inspector.wired_label": "connected",
    "graphs.inspector.deleted_instance": "Deleted instance",
    "marketplace.filter.all": "All",
    "marketplace.filter.apps": "Apps",
    "marketplace.filter.widgets": "Widgets",
    "marketplace.filter.themes": "Themes",
    "marketplace.filter.scenes": "Scenes",
    "marketplace.filter.compositions": "Compositions",
    "marketplace.filter.flows": "Flows",
    "marketplace.kind.app": "App",
    "marketplace.kind.widget": "Widget",
    "marketplace.kind.theme": "Theme",
    "marketplace.kind.scene": "Scene",
    "marketplace.kind.flow": "Flow",
    "marketplace.kind.composition": "Composition",
    "marketplace.state.submitted": "Submitted",
    "marketplace.state.approved": "Approved",
    "marketplace.state.unsubmitted": "Unsubmitted",
    "marketplace.state.rejected": "Rejected",
    "marketplace.index.search_placeholder": "Search packages…",
    "marketplace.sort.newest": "Newest",
    "marketplace.sort.updated": "Updated",
    "marketplace.sort.name": "Name",
    "marketplace.content.widgets": ":count Widget|:count Widgets",
    "marketplace.content.flows": ":count Flow|:count Flows",
    "marketplace.content.compositions": ":count Composition|:count Compositions",
    "marketplace.content.scenes": ":count Scene|:count Scenes",
    "marketplace.wizard.scopes_title": "Twitch permissions",
    "marketplace.wizard.scopes_hint": "This package needs Twitch permissions to run. Grant them now, or skip and enable the flows later.",
    "marketplace.wizard.scopes_skip": "Skip for now",
    "marketplace.wizard.scopes_skip_hint": "If you skip, the parts of this app that need these permissions wait. They start on their own once you grant them.",
    "marketplace.wizard.scopes_granted": "All permissions granted.",
    "marketplace.wizard.dropped_custom_events": "This version no longer has the event “:name”: it goes quiet in your flow :list.|This version no longer has the event “:name”: it goes quiet in your flows :list.",
    "marketplace.wizard.dropped_compositions": "This version no longer has the composition “:name”: :list goes quiet.|This version no longer has the composition “:name”: :list go quiet.",
    "marketplace.switch.title": "Switch to version :version",
    "marketplace.switch.confirm": "Switch",
    "marketplace.switch.changes_title": "What changes",
    "marketplace.switch.questions_title": "The new version asks",
    "marketplace.switch.taken": "“:setting” takes :value from the placement.|“:setting” takes :value from the placements.",
    "marketplace.switch.taken_from": "The other placements held :list.",
    "marketplace.switch.rule_majority": "Most of them held it.",
    "marketplace.switch.rule_latest": "On a tie, the one changed last counts.",
    "marketplace.switch.rule_state": "The state saved last counts.",
    "marketplace.switch.reset": "“:setting”: :old → :new (:why)",
    "marketplace.switch.why_type": "another type",
    "marketplace.switch.why_option": "option removed",
    "marketplace.switch.why_min": "below the minimum",
    "marketplace.switch.why_max": "above the maximum",
    "marketplace.switch.why_size": "too long",
    "marketplace.switch.set_aside": "“:setting” (:value) is set aside and comes back when you switch back.",
    "marketplace.switch.copied": "“:setting” is copied with :value into :count placement.|“:setting” is copied with :value into :count placements.",
    "marketplace.switch.set_aside_ref": "“:setting” is set aside and comes back when you switch back.",
    "marketplace.switch.unbound": "“:setting” now has another type: your earlier pick no longer applies.",
    "marketplace.switch.play_removed": "“:name” no longer plays automatically on :events. Its action there is deleted.|“:name” no longer plays automatically on :events. Its actions there are deleted.",
    "marketplace.switch.play_added": "“:name” now also plays automatically on :events.",
    "marketplace.switch.switching": "Switching…",
    "marketplace.wizard.placement_title": "Scenes",
    "marketplace.wizard.ref_settings_title": "What this package needs from your channel",
    "marketplace.wizard.placement_new_scene": "Add as new scene",
    "marketplace.wizard.placement_merge": "Merge",
    "marketplace.wizard.placement_merge_target": "Merge into scene",
    "marketplace.wizard.placement_merge_unavailable": "Your scenes could not be loaded. Merging is unavailable.",
    "marketplace.wizard.placement_skip": "Skip",
    "marketplace.wizard.placement_stage_exists": "You already have a stage named \":stage\" in the scene \":scene\". A second one would show every alert twice, so this scene was skipped.",
    "marketplace.wizard.placement_add_anyway": "Add anyway",
    "marketplace.wizard.placement_done_url": "Copy URL",
    "marketplace.wizard.placement_open_editor": "Edit in scene editor",
    "marketplace.wizard.scene_widget_count": ":count Widget(s)",
    "marketplace.wizard.done_title": "Added scenes",
    "marketplace.wizard.step_consent": "Review",
    "marketplace.wizard.step_scopes": "Permissions",
    "marketplace.wizard.step_triggers": "Chat commands",
    "marketplace.wizard.step_placement": "Scenes",
    "marketplace.wizard.step_done": "Done",
    "marketplace.wizard.add_scene": "Add scene",
    "marketplace.wizard.triggers_title": "Chat commands you already have",
    "marketplace.wizard.triggers_hint": "This app ships chat commands that are already taken on your channel. Decide for each one before anything is created.",
    "marketplace.wizard.trigger_wants": "The app wants the command \":keyword\"",
    "marketplace.wizard.trigger_owner_you": "You created this command yourself.",
    "marketplace.wizard.trigger_owner_app": "This command belongs to the app \":app\".",
    "marketplace.wizard.trigger_existing_alias": "\":keyword\" is an alias of the command \":existing\".",
    "marketplace.wizard.trigger_existing_disabled": "The command \":keyword\" is switched off. If the app points at it, the trigger will not fire until you switch it back on.",
    "marketplace.wizard.trigger_choice_label": "What should happen?",
    "marketplace.wizard.trigger_mode_rename": "Give the app a different command",
    "marketplace.wizard.trigger_mode_bind": "Point the app at \":keyword\"",
    "marketplace.wizard.trigger_bind_blocked": "Not possible, because this command belongs to the app \":app\".",
    "marketplace.wizard.trigger_rename_label": "New command for the app",
    "marketplace.wizard.trigger_rename_required": "Enter a command.",
    "marketplace.wizard.trigger_rename_charset": "Only letters, digits, underscore and hyphen are allowed.",
    "marketplace.wizard.trigger_rename_taken": "The command \":keyword\" is already taken on this channel.",
    "marketplace.wizard.trigger_rename_normalised": "Will be created as \":keyword\".",
    "marketplace.wizard.retry": "Retry",
    "marketplace.detail.install": "Install",
    "marketplace.detail.update": "Update to v:version",
    "marketplace.detail.installed_badge": "Installed",
    "marketplace.detail.installed_badge_version": "Installed: v:version",
    "marketplace.detail.owner_only": "Installing apps needs the “Manage apps” permission, please ask the property owner.",
    "marketplace.card.official": "Official",
    "marketplace.card.owner_only": "Needs “Manage apps”",
    "marketplace.card.install_aria": "Install :name",
    "marketplace.card.update_aria": "Update :name to v:version",
    "marketplace.card.installed_aria": ":name is installed",
    "marketplace.card.add_scene_aria": "Add scene for :name",
    "marketplace.card.open_aria": "Open app :name",
    "marketplace.detail.description_title": "Description",
    "marketplace.detail.authors": "Who builds this package",
    "marketplace.detail.gallery_title": "Screenshots",
    "marketplace.detail.preview_title": "Preview",
    "marketplace.detail.preview_play": "Play the preview",
    "marketplace.detail.preview_no_stage": "The preview needs the Alert Stage.",
    "marketplace.detail.gallery_alt": "Screenshot :index of :name",
    "marketplace.detail.permissions_title": "What this app may do",
    "marketplace.detail.subscribes_title": "Events this app reacts to",
    "marketplace.usage.button": "How to use",
    "marketplace.usage.title": "How to use :name",
    "marketplace.usage.empty": "This package has no usage notes yet.",
    "marketplace.install.package_waits_for_scopes": ":name waits for these Twitch permissions: :scopes. It starts on its own once you grant them.",
    "marketplace.install.requires_tier": "Requires :tier",
    "marketplace.install.no_access": "Not available for this property",
    "marketplace.install.notices_title": "Installed. Next steps:",
    "marketplace.install.stage_missing_notice": "This package ships compositions, but none of your scenes has a stage widget to play them. Place one in the scene editor so the compositions can show up.",
    "marketplace.install.trigger_flow_gone": "This app changed while you were choosing: it no longer ships the flow \":flow\", so your answer for that flow was not applied.",
    "marketplace.install.trigger_slot_gone": "This app changed while you were choosing: the flow \":flow\" no longer asks for a chat command there, so your answer was not applied and the app's own keyword was used.",
    "marketplace.install.trigger_answer_repeated": "More than one answer arrived for the same trigger in the flow \":flow\". The first was applied and the rest were ignored.",
    "marketplace.install.trigger_bind_gone": "The command you picked for the flow \":flow\" is no longer available, so this app created its own instead.",
    "marketplace.install.trigger_bind_disabled": "The command \":keyword\" you picked for the flow \":flow\" is switched off, so the trigger will not fire until you switch it back on.",
    "marketplace.install.trigger_keyword_taken": "The command \":keyword\" is already in use on this channel. Pick another one.",
    "marketplace.switch.unanswered": "The new version asks for “:setting”.",
    "marketplace.switch.unasked": "“:list” still needs a value after the switch. Someone who may configure this app enters it in the app's settings.",
    "marketplace.scenes.template_unknown": "Unknown scene template.",
    "marketplace.scenes.target_missing": "Target scene not found.",
    "marketplace.scenes.builtin_unavailable": "Builtin ':builtin' is not available.",
    "marketplace.scenes.composition_ref_unresolved": "The composition ':name' from this template is missing in your account. Reinstall the package version, then add the scene again.",
    "marketplace.import_link.unavailable": "This import link is no longer available (already redeemed, revoked, or expired).",
    "marketplace.import_link.expired": "This import link has expired.",
    "marketplace.import_link.version_unpublished": "The package version this link was generated for is no longer published.",
    "graphs.node.orphan": "Orphan (no registry entry)",
    "graphs.node.tag_event": "Event",
    "graphs.node.tag_logic": "Logic",
    "graphs.node.tag_action": "Action",
    "graphs.palette.group_events": "Events",
    "graphs.palette.group_logic": "Logic",
    "graphs.palette.group_actions": "Actions",
    "graphs.page.empty": "No flows yet. Create one to chain events to actions visually.",
    "graphs.page.new_button": "New flow",
    "graphs.page.subtitle": ":count flows · :active active",
    "graphs.page.title": "Event Flows",
    "graphs.ref_picker.placeholder": "Select…",
    "graphs.ref_picker.none": "None",
    "graphs.ref_picker.new": "New",
    "graphs.ref_picker.edit": "Edit",
    "graphs.ref_picker.new_tab": "New (opens the editor in a new tab)",
    "graphs.ref_picker.edit_tab": "Edit (opens the editor in a new tab)",
    "graphs.ref_picker.empty_createable": "Nothing here yet. Use + to create one.",
    "graphs.ref_picker.empty_pick": "Nothing to pick yet.",
    "graphs.ref_picker.loading": "Loading…",
    "graphs.ref_picker.badge_external": "External",
    "graphs.placement.no_asset_hint": "Select an asset first to position it.",
    "graphs.placement.click_to_place": "Click to place the asset",
    "graphs.placement.x": "X %",
    "graphs.placement.y": "Y %",
    "graphs.placement.width": "Width %",
    "graphs.placement.preset_original": "Original size",
    "graphs.placement.preset_fill": "Fit into widget",
    "graphs.placement.reset": "Reset",
    "graphs.placement.edit": "Edit…",
    "graphs.placement.summary_default": "Centered (default)",
    "graphs.placement.summary_custom": "Custom",
    "graphs.placement.done": "Done",
    "graphs.publish.secrets_warning": "This graph may contain inline secrets (Bearer tokens, API keys). Remove the value before sharing, or enable \"Don't copy current value\" on the field.",
    "graphs.setup_share.button": "Share setup",
    "graphs.setup_share.modal_title": "Share a setup",
    "graphs.setup_share.intro": "Pick the flows you want to hand on, name the bundle and share the link you get back.",
    "graphs.setup_share.name_label": "Setup name",
    "graphs.setup_share.name_placeholder": "My alert setup",
    "graphs.setup_share.flows_label": "Flows in this setup",
    "graphs.setup_share.max_hint": "At most :max flows per setup.",
    "graphs.setup_share.no_flows": "You have no flows to share yet.",
    "graphs.setup_share.paused_hint": "Sharing setups is paused at the moment.",
    "graphs.setup_share.submit": "Create share link",
    "graphs.setup_share.result_label": "Share link",
    "graphs.setup_share.result_help": "Anyone who opens this link can install your setup.",
    "graphs.setup_share.failed": "The setup could not be shared.",
    "graphs.setup_share.errors.quota": "You have shared too many setups in the last 24 hours. Try again later.",
    "graphs.setup_share.errors.invalid": "This setup could not be shared. Check the flows you picked.",
    "graphs.setup_share.errors.no_flows": "Pick at least one flow.",
    "graphs.setup_share.errors.unknown": "One of the picked flows is not available any more.",
    "graphs.setup_share.errors.too_many": "A setup holds at most :max flows.",
    "graphs.setup_share.errors.duplicate_name": "Two of the picked flows are called :name. Rename one of them first.",
    "graphs.setup_share.errors.mint_failed": "No setup could be created under that name. Try a different one.",
    "graphs.setup_share.errors.paused": "Sharing setups is paused at the moment. Nothing was created.",
    "graphs.share.modal_title": "Share this flow",
    "graphs.share.publish_to_marketplace_help": "Publish to the Flow Marketplace.",
    "graphs.share.export_string_title": "Copy as code string",
    "graphs.share.export_string_help": "Generate a self-contained string anyone can paste to import this flow. Works off-platform.",
    "graphs.share.export_string_button": "Generate string",
    "graphs.share.export_string_label": "Flow string",
    "graphs.share.context_failed": "Could not open sharing.",
    "graphs.share.copy_string": "Copy string",
    "graphs.share.export_failed": "Could not generate the flow string.",
    "graphs.share.secret_ack": "I understand this string is permanent and will contain the flagged values.",
    "graphs.share.package_snippet_button": "Copy package snippet",
    "graphs.share.package_snippet_copied": "Copied!",
    "graphs.share.package_snippet_help": "For builders: a ready-made entry for a package manifest's graphs list.",
    "graphs.test_run.dry_label": "Dry run (no real actions)",
    "graphs.test_run.channel_test_off": "A live run of a package's flow runs only while \"Try it on my channel\" is on. Switch it on, then run again.",
    "graphs.test_run.live_needs_channel_test": "A live run needs \"Try it on my channel\".",
    "graphs.test_run.settings_not_loaded": "Your channel is still loading this package's settings. Try again in a moment.",
    "graphs.test_run.dry_short": "Dry run",
    "graphs.test_run.empty_payload": "This trigger has no data fields, the event data will be empty.",
    "graphs.test_run.real_label": "Real run: sends chat, hits URLs, triggers real actions.",
    "graphs.test_run.real_short": "Real run!",
    "graphs.test_run.title": "Test run with sample data",
    "graphs.test_run.trigger_skip": "Trigger skipped: :param is :expected, the sample carries :actual",
    "graphs.wizard.auto_enable": "Activate immediately",
    "graphs.wizard.field_invalid_identifier": "Only letters, digits, dash, and underscore.",
    "graphs.wizard.field_invalid_number": "Must be a valid number.",
    "graphs.wizard.field_max": "At most {max}.",
    "graphs.wizard.field_min": "At least {min}.",
    "graphs.wizard.field_not_in_options": "Value not in the option list.",
    "graphs.wizard.field_required": "This field is required.",
    "graphs.wizard.name_label": "Name on my channel",
    "graphs.wizard.title": "Install Graph",
    "graphs.wizard.unknown_type_hint": "Field type '{type}' has no renderer. Value is passed as text.",
    "graphs.validation.name_required": "The name field is required.",
    "graphs.tabs.editor": "Editor",
    "graphs.tabs.variables": "Variables",
    "graphs.variables.create_button": "Add variable",
    "graphs.variables.empty_state": "No variables defined yet.",
    "graphs.variables.scope_property": "Property-wide",
    "graphs.variables.scope_graph": "Graph only",
    "graphs.variables.types.string": "Text",
    "graphs.variables.types.number": "Number",
    "graphs.variables.types.boolean": "Yes/No",
    "graphs.variables.slug_label": "Slug",
    "graphs.variables.slug_help": "Used as {var.<slug>} in templates",
    "graphs.variables.picker_group": "Variables",
    "graphs.variables.paste_linked": ":count variable linked|:count variables linked",
    "graphs.variables.pick_placeholder": "Pick a variable",
    "graphs.run_context.picker_group": "Run Context",
    "graphs.settings.picker_group": "Package settings",
    "graphs.variables.type_label": "Type",
    "graphs.variables.default_label": "Default value",
    "graphs.variables.scope_label": "Visibility",
    "graphs.variables.confirm_delete": "Delete this variable? Existing references will fall back to empty.",
    "graphs.variables.confirm_reset": "Reset to default? The stored value will be lost.",
    "graphs.variables.reset_button": "Reset",
    "graphs.variables.delete_button": "Delete",
    "graphs.variables.scope_locked_help": "Visibility cannot be changed after creation.",
    "graphs.variables.aria_edit": "Edit variable :slug",
    "graphs.variables.aria_reset": "Reset variable :slug",
    "graphs.variables.aria_delete": "Delete variable :slug",
    "graphs.ctx.set_node.label": "Set Context",
    "graphs.ctx.set_node.slug_help": "Pickable as {ctx.<slug>} in this graph's templates",
    "graphs.cond.add_branch": "Add branch",
    "graphs.cond.remove_branch": "Remove branch",
    "graphs.cond.default_lane": "Default",
    "graphs.cond.field_placeholder": "Select field",
    "graphs.cond.label_placeholder": "Branch label (optional)",
    "graphs.cond.branch_enabled": "Enabled",
    "graphs.cond.op_contains": "contains",
    "graphs.cond.op_matches": "matches regex",
    "graphs.cond.field_search": "Search field…",
    "graphs.cond.move_branch": "Move branch",
    "graphs.cond.branch_count": ":n branch(es)",
    "graphs.cond.rule_empty": "Choose a condition…",
    "graphs.cond.when_label": "When",
    "graphs.command_modal.title_new": "New Command",
    "graphs.command_modal.title_edit": "Edit Command:",
    "graphs.command_modal.keyword_label": "Command",
    "graphs.command_modal.keyword_placeholder": "e.g. hug",
    "graphs.command_modal.aliases_label": "Aliases",
    "graphs.command_modal.aliases_placeholder": "Add an alias",
    "graphs.command_modal.audience_label": "Who may trigger this",
    "graphs.command_modal.cooldown_global_label": "Channel cooldown (s)",
    "graphs.command_modal.cooldown_user_label": "Per-user cooldown (s)",
    "graphs.command_modal.delete_title": "Delete command :keyword?",
    "graphs.command_modal.delete_message": "This permanently removes the command and its aliases.",
    "graphs.command_modal.delete_confirm": "Delete command",
    "graphs.keyword_modal.title_new": "New Keyword",
    "graphs.keyword_modal.title_edit": "Edit Keyword",
    "graphs.keyword_modal.phrases_label": "Phrases",
    "graphs.keyword_modal.phrases_placeholder": "Add a phrase",
    "graphs.keyword_modal.match_mode_label": "Match mode",
    "graphs.keyword_modal.match_word": "Whole word",
    "graphs.keyword_modal.match_contains": "Contains",
    "graphs.keyword_modal.case_sensitive_label": "Case sensitive",
    "graphs.keyword_modal.audience_label": "Who may trigger this",
    "graphs.keyword_modal.cooldown_global_label": "Channel cooldown (s)",
    "graphs.keyword_modal.cooldown_user_label": "Per-user cooldown (s)",
    "graphs.keyword_modal.delete_title": "Delete keyword?",
    "graphs.keyword_modal.delete_message": "This permanently removes the keyword.",
    "graphs.keyword_modal.delete_confirm": "Delete keyword",
    "graphs.res_modal.enabled_label": "Enabled",
    "marketing.welcome.login_cta": "Sign in with Twitch",
    "marketing.welcome.status_badge": "Closed alpha",
    "marketing.welcome.tagline": "Visual workflows: connect events to actions.",
    "marketing.welcome.waitlist_cta": "Join the waitlist",
    "marketing.welcome.waitlist_prompt": "No access yet?",
    "tags.cancel": "Cancel",
    "tags.clear_filter": "Clear filter",
    "ui.back": "Back",
    "ui.next": "Next",
    "ui.nav.overview": "Overview",
    "ui.nav.extensions": "Extensions",
    "ui.nav.discover": "Discover",
    "ui.nav.channel": "Channel",
    "ui.nav.add_extension": "Add extension",
    "ui.toast.undo": "Undo",
    "ui.nav.featured": "Featured",
    "ui.nav.add_featured": "Add",
    "ui.nav.reorder_featured": "Reorder",
    "ui.nav.save_order": "Save order",
    "ui.badge_new": "New",
    "ui.stale.save_rejected": "This resource was changed elsewhere in the meantime. Reload the editor and re-apply your changes.",
    "ui.stale.changed_externally": "This page was changed elsewhere in the meantime.",
    "ui.stale.unsaved_hint": "You have unsaved changes, reloading discards them.",
    "ui.stale.reload": "Reload",
    "ui.stale.saved_by": ":name saved :item at :time, while you had it open.",
    "ui.person.deleted": "Deleted account",
    "ui.person.unknown": "Unknown",
    "ui.stale.someone": "Someone",
    "ui.stale.agent_mark": ":name · Agent",
    "ui.stale.you": "you",
    "ui.stale.your_agent": "your agent",
    "ui.bell.title": "Notifications",
    "ui.bell.unread": "Notifications, :count unread",
    "ui.bell.empty": "No new notifications",
    "ui.bell.mark_all_read": "Mark all as read",
    "ui.bell.fallback": "Notification",
    "ui.stale.yesterday": "yesterday",
    "ui.stale.saved_by_banner": ":name saved this at :time.",
    "ui.conflict.title": ":item was saved in the meantime",
    "ui.conflict.body": ":name saved it at :time, while you had it open.",
    "ui.conflict.autosave_paused": "Saving automatically is paused until you choose.",
    "ui.conflict.load": "Load the other version",
    "ui.conflict.load_hint": "Your changes since you opened it are lost.",
    "ui.conflict.save_mine": "Save mine",
    "ui.conflict.save_mine_hint": "Overwrites the other version.",
    "ui.conflict.confirm_title": "Overwrite the other version?",
    "ui.conflict.confirm_text": "This overwrites the version of :item that :name saved at :time.",
    "ui.conflict.confirm_kept": "The overwritten version stays under Versions › Discarded for 30 days.",
    "ui.combobox.select": "Select…",
    "ui.combobox.search": "Search…",
    "ui.combobox.no_matches": "No matches.",
    "ui.combobox.empty": "Nothing here yet.",
    "ui.combobox.none": "None",
    "ui.token.remove": "Remove",
    "ui.user_picker.type_to_search": "Type at least 2 characters to search.",
    "ui.user_picker.searching": "Searching…",
    "ui.companion.stats_title": "Usage",
    "ui.companion.stats_uses": "Uses",
    "ui.companion.stats_last_used": "Last used",
    "ui.companion.stats_empty": "Not used yet.",
    "ui.companion.concept_actions_title": "Actions",
    "ui.companion.concept_actions_body": "Once this is triggered, its actions run in order. You can chain several actions one after another.",
    "ui.companion.concept_timer_modes_title": "Single & Rotation",
    "ui.companion.concept_timer_modes_body": "Single fires all actions on every interval. With Rotation, one rotation entry fires per interval with all its actions, in order, looping back to the first after the last.",
    "ui.companion.concept_variables_title": "Using variables",
    "ui.companion.concept_variables_body": "In text fields you can insert variables like {user.name}. When this runs they are replaced with the real value, here the viewer's name.",
    "ui.companion.concept_variables_custom": "You can also create your own custom variables. Depending on their setting, they're available everywhere.",
    "ui.companion.concept_configure_title": "Configuring",
    "ui.companion.concept_configure_body": "Fill in the required references and fields below, then switch Active on to make it run. The banner above lists anything still missing.",
    "ui.companion.concept_variables_empty": "No custom variables created yet.",
    "ui.companion.concept_context_title": "Context",
    "ui.companion.concept_context_body": "The context is the data that comes with the trigger, such as who caused it and with which details. These values are available to you as variables.",
    "ui.twitch_category.clear_aria": "Remove :name",
    "ui.twitch_category.search_placeholder": "Search Twitch categories…",
    "ui.unsaved_changes": "Unsaved changes",
    "ui.palette.search_placeholder": "Search, jump, run …",
    "ui.palette.trigger": "Search or jump to …",
    "ui.palette.group_actions": "Actions",
    "ui.palette.group_navigation": "Navigation",
    "ui.palette.open_extension": "Open :name",
    "ui.palette.action_new_command": "Create new command",
    "ui.palette.action_new_flow": "Create new event flow",
    "ui.palette.no_results": "No matches.",
    "ui.palette.shortcut_ctrl": "Ctrl",
    "ui.mcp_tokens.card_label": "MCP Access",
    "ui.mcp_tokens.card_description": "Let AI agents manage your channel through access tokens.",
    "ui.mcp_tokens.title": "Service tokens",
    "ui.mcp_tokens.intro": "Service tokens let your own automations manage your channel on your behalf without anyone logging in. Each token only gets the abilities you pick.",
    "ui.mcp_tokens.endpoint_hint": "AI agents connect through the MCP server at this address, sending the token as Bearer in the Authorization header:",
    "ui.mcp_tokens.copy_hint": "Copy this token now. It is only shown once.",
    "ui.mcp_tokens.name_label": "Token name",
    "ui.mcp_tokens.abilities_label": "Abilities",
    "ui.mcp_tokens.create": "Create token",
    "ui.mcp_tokens.revoke": "Revoke",
    "ui.mcp_tokens.revoke_title": "Revoke token?",
    "ui.mcp_tokens.revoke_message": "Tools using this token lose access immediately.",
    "ui.mcp_tokens.empty": "No tokens yet.",
    "ui.mcp_tokens.last_used": "Last used",
    "ui.mcp_tokens.claude_label": "Claude Code (one command):",
    "ui.mcp_tokens.json_label": "Other MCP clients (JSON config):",
    "ui.mcp_tokens.oauth_title": "Connection",
    "ui.mcp_tokens.oauth_intro": "Just add the URL to your MCP client, login and approval happen in the browser.",
    "ui.mcp_tokens.oauth_connected_at": "Connected since",
    "ui.mcp_tokens.oauth_disconnect": "Disconnect",
    "ui.mcp_tokens.oauth_disconnect_title": "Disconnect client?",
    "ui.mcp_tokens.oauth_disconnect_message": "The client loses access immediately and must reconnect.",
    "ui.mcp_tokens.oauth_empty": "No connected clients yet.",
    "tags.delete": "Delete",
    "tags.delete_confirm_button": "Delete tag",
    "tags.delete_confirm_unused": "Delete tag «:name»?",
    "tags.delete_confirm_used": "Delete tag «:name»? :n items will lose this tag.",
    "tags.delete_title": "Delete tag?",
    "tags.edit": "Edit",
    "tags.empty": "No tags yet.",
    "tags.field_label": "Tags",
    "tags.filter_label": "Filter by tags",
    "tags.manage": "Manage tags",
    "tags.max_reached": "Up to :max tags per item.",
    "tags.no_results": "No items match these tags.",
    "tags.pick_color": "Pick color",
    "tags.placeholder": "Add a tag",
    "tags.rename_collision": "A tag «:name» already exists.",
    "tags.rename_error": "Could not rename the tag.",
    "tags.rename_label": "Rename tag",
    "tags.save": "Save",
    "tags.suggestion_create": "Create new: :name",
    "tags.usage_count": ":n items",
    "widgets.alert_lane.label": "Alert lane",
    "widgets.alert_lane.author_default": "Author default",
    "widgets.alert_lane.shared": "Shared lane",
    "widgets.alert_lane.own": "Own lane",
    "widgets.alert_lane.live": "Instant (no queue)",
    "widgets.alert_lane.help": "How this widget's alerts line up with other alert widgets.",
    "widgets.audio_out.copy_url_title": "Audio Browsersource URL",
    "widgets.audio_out.copy_button": "Copy",
    "widgets.audio_out.copied_feedback": "Copied",
    "widgets.audio_out.pending_create_tooltip": "Created on save",
    "widgets.audio_out.paused_warning": "Audio paused for this scene",
    "widgets.media_out.created_flash": "Media scene \":name\" created. Add its browsersource URL to OBS to see video and image alerts.",
    "widgets.chatbox.global_emotes_hint": "Show Twitch emotes in chat messages.",
    "widgets.chatbox.tagline": "A chatbox widget shows the live chat from these messages.",
    "compositions.title": "Compositions",
    "compositions.subtitle": "Animated alert building blocks for the Play action",
    "compositions.new": "New composition",
    "compositions.empty": "No compositions yet. Create your first one.",
    "compositions.no_match": "No compositions match your search.",
    "compositions.context_free": "No context",
    "compositions.duration_min": "min. :s s",
    "compositions.elements_count": ":n elements",
    "compositions.delete_title": "Delete composition?",
    "compositions.delete_body": "Actions pointing at it will then run into nothing.",
    "compositions.name": "Name",
    "compositions.context_move_up": "Move :event_name up",
    "compositions.context_move_down": "Move :event_name down",
    "compositions.context_removed_auto": "Saving also deletes the automatic action on :events.",
    "compositions.rail_base_hint": "Plays when no variation matches",
    "compositions.rail_no_events": "No events yet. Add the events this composition is for.",
    "compositions.rail_view_base": "Show the base with the :event_name sample",
    "compositions.rail_first": "first",
    "compositions.rail_first_hint": "Its sample is what previews outside the editor show.",
    "compositions.rail_state_auto": "Plays automatically",
    "compositions.rail_state_flow": "A flow plays it",
    "compositions.rail_state_inline": "An inline action plays it",
    "compositions.rail_state_none": "Not connected",
    "compositions.rail_state_unsaved": "Not saved yet",
    "compositions.rail_state_install_auto": "Wired on install: plays automatically once the composition is placed in a Composition widget and nothing else plays it",
    "compositions.rail_state_install_flow": "Not wired on install: a flow of this package plays the composition",
    "compositions.rail_add_variant": "Variation for :event_name",
    "compositions.rail_add_variant_any": "Variation for any event",
    "compositions.rail_add_events": "Events",
    "compositions.rail_remove_event": "Remove :event_name.",
    "compositions.rail_remove_event_variants": "Remove :event_name and delete :count variation that plays only for it.|Remove :event_name and delete :count variations that play only for it.",
    "compositions.rail_group_empty": "Plays the base",
    "compositions.rail_always": "always",
    "compositions.rail_also": "also :events",
    "compositions.rail_shadowed": "shadowed",
    "compositions.rail_shadowed_hint": "Never plays: “:name” above it matches first.",
    "compositions.rail_changes": "Changes :count element against the base: :names|Changes :count elements against the base: :names",
    "compositions.rail_duplicate": "Duplicate :name",
    "compositions.rail_enabled": ":name enabled",
    "compositions.variant_copy_label": ":name copy",
    "compositions.variants_cap_reached": "A composition holds at most :max variations. :count event got none.|A composition holds at most :max variations. :count events got none.",
    "compositions.events_dialog_title": "Add events",
    "compositions.events_dialog_search": "Search events",
    "compositions.events_dialog_empty": "No event matches.",
    "compositions.events_dialog_alerts": "Alert events",
    "compositions.events_dialog_others": "Other events",
    "compositions.events_dialog_each": "and a variation for each",
    "compositions.events_dialog_each_hint": "The base plays the same for every event. A variation changes text, image or sound for its event.",
    "compositions.events_dialog_confirm": "{0} Add events|[1,1] Add :count event|[2,*] Add :count events",
    "compositions.events_dialog_full": "A composition lists at most :max events.",
    "compositions.context_events_group": "Event fields",
    "compositions.context_field_only": ":event_name only",
    "compositions.context_field_not_on": "not on :events",
    "compositions.variant_field_partial": ":key is missing on :events. This condition never matches there.",
    "compositions.clones_field_partial": ":key is missing on :events. The count under Fallback plays there.",
    "compositions.var_partial": "{:key} stays empty on :events",
    "compositions.chip_vars_partial": ":count placeholder not on every event|:count placeholders not on every event",
    "compositions.design_width": "Design Width (px)",
    "compositions.design_height": "Design Height (px)",
    "compositions.section_composition": "Composition",
    "compositions.duration_label": "Known duration",
    "compositions.usage_title": "Show on stream",
    "compositions.usage_hint": "A composition plays through a stage widget placed in a scene, triggered by an event or a flow.",
    "compositions.usage_open": "Check setup",
    "compositions.usage_save_first": "Save the composition first",
    "compositions.usage_where_title": "Where it plays",
    "compositions.usage_where_chip": "Composition widget · :size",
    "compositions.usage_where_fallback": "Placed in no Composition widget, so it plays on the old Alert Stage :stage in :scene.",
    "compositions.usage_where_place": "Place it in a scene",
    "compositions.usage_where_none": "Placed in no scene. Without a placement, nothing shows on stream.",
    "compositions.usage_when_title": "When it plays",
    "compositions.usage_when_none": "Nothing plays this composition yet.",
    "compositions.usage_kind_auto": "automatic",
    "compositions.usage_on_event": "on :event_name",
    "compositions.usage_auto_title": "Automatic",
    "compositions.usage_auto_text": "Plays on every :events.",
    "compositions.usage_autowire": "Connect automatically",
    "compositions.usage_manual_title": "Manual",
    "compositions.usage_manual_text": "As an inline action on an event, or through a flow.",
    "compositions.usage_missing_scope": "Plays on :event_name once the permission is granted. Missing: :scopes",
    "compositions.usage_grant": "Grant permission",
    "compositions.usage_double": "Plays once on :event_name: :names.|Plays :count times on :event_name: :names.",
    "compositions.usage_flow_named": "flow \":name\"",
    "compositions.usage_stage_link": "Open scenes",
    "compositions.usage_trigger_link_events": "Events",
    "compositions.usage_trigger_link_graphs": "Flows",
    "compositions.usage_kind_inline": "Inline action",
    "compositions.usage_kind_graph": "Flow",
    "compositions.usage_disabled": "disabled",
    "compositions.usage_state_none": "not connected",
    "compositions.usage_state_install_auto": "wired on install",
    "compositions.usage_state_install_flow": "the package's flow plays it",
    "compositions.usage_install_auto": "Nothing is connected inside a package. On a streamer's channel, each listed event gets its automatic action once the composition is placed in a Composition widget and nothing else plays it.",
    "compositions.usage_install_flow": "A flow of this package plays the composition, so no event gets an automatic action on install.",
    "compositions.usage_context_title": "Context check",
    "compositions.usage_context_hint": "This composition expects :context, but :names fires on :event_name. Placeholders may resolve empty.",
    "compositions.usage_obs_title": "In OBS",
    "compositions.usage_obs_hw_accel": "Keep \"Enable Browser Source Hardware Acceleration\" on (Settings → Advanced → Sources). Without it, large animated shapes stutter.",
    "compositions.usage_obs_blending": "Set the Blending Method of the browser source that shows the stage to \"SRGB Off\" (right-click the source → Blending Method, OBS 28+). Only then do translucent colors look as they do in the editor.",
    "compositions.select_hint": "Select an element on the canvas or in the timeline to edit it. Shift-click or Shift-drag adds more, Ctrl+A selects all.",
    "compositions.selection_count": ":count element selected|:count elements selected",
    "compositions.limit.key_position": "A keyframe reaches the edge of the work area",
    "compositions.limit.position": "Its position reaches the edge of the work area",
    "compositions.limit.size_max": "Its size reaches the canvas size",
    "compositions.limit.size_min": "It reaches the smallest size",
    "compositions.limit.text_size": "Its font size reaches its limit",
    "compositions.limit.blur": "Its blur reaches its limit",
    "compositions.limit.shape_length": "Its border or shadow reaches its limit",
    "compositions.toolbar.duplicate": "Duplicate (Ctrl+D)",
    "compositions.toolbar.delete": "Delete (Del)",
    "compositions.toolbar.align_left": "Align left",
    "compositions.toolbar.align_center": "Align center",
    "compositions.toolbar.align_right": "Align right",
    "compositions.toolbar.align_top": "Align top",
    "compositions.toolbar.align_middle": "Align middle",
    "compositions.toolbar.align_bottom": "Align bottom",
    "compositions.toolbar.distribute_x": "Distribute horizontally",
    "compositions.toolbar.distribute_y": "Distribute vertically",
    "compositions.add_element": "Add element",
    "compositions.el_text": "Text",
    "compositions.el_media": "Media",
    "compositions.el_sound": "Sound",
    "compositions.el_tts": "TTS",
    "compositions.el_shape": "Shape",
    "compositions.el_markup": "HTML/CSS",
    "compositions.markup.field": "HTML and CSS",
    "compositions.markup.help": "Pasting replaces everything. No script runs in it, and nothing loads from outside the platform: fonts come from the font library, images as data: or inline SVG.",
    "compositions.markup.removed": "Removed: :items",
    "compositions.markup.clean": "Nothing removed.",
    "compositions.markup.script_named": "the :name script",
    "compositions.markup.scripts": "a script|:count scripts",
    "compositions.markup.stylesheet_named": "the :name stylesheet",
    "compositions.markup.stylesheets": "an external stylesheet|:count external stylesheets",
    "compositions.markup.font_files": "an external font file|:count external font files",
    "compositions.markup.images": "an external image|:count external images",
    "compositions.markup.sounds": "a sound|:count sounds",
    "compositions.markup.videos": "a video|:count videos",
    "compositions.markup.frames": "an embedded page|:count embedded pages",
    "compositions.markup.forms": "a form|:count forms",
    "compositions.markup.handlers": "a script in an attribute|:count scripts in attributes",
    "compositions.markup.links": "a link|:count links",
    "compositions.markup.settings": "a page setting|:count page settings",
    "compositions.markup.font_library": "font ':name' from the font library",
    "compositions.markup.font_missing": "font ':name', not in the font library",
    "compositions.cap_reached": "A composition holds at most 10 elements",
    "compositions.reads_ctx_missing": "No “Set Context” in this flow sets: :keys",
    "compositions.reads_label": "Reads",
    "compositions.remove_element": "Remove element",
    "compositions.reorder_element": "Drag to reorder",
    "compositions.start_label": "Start",
    "compositions.start_immediate": "Immediate",
    "compositions.start_after": "After :name",
    "compositions.start_after_unknown": "Starts when :name ends. The exact time depends on its length.",
    "compositions.offset": "Offset (ms)",
    "compositions.section_content": "Content",
    "compositions.section_transform": "Transform",
    "compositions.kf_time": "Time (ms)",
    "compositions.kf_ease": "Easing",
    "compositions.ease_linear": "Linear",
    "compositions.ease": "Smooth",
    "compositions.ease_in": "Ease in",
    "compositions.ease_out": "Ease out",
    "compositions.ease_in_out": "Ease in-out",
    "compositions.remove_keyframe": "Remove keyframe (K)",
    "compositions.add_keyframe": "Add keyframe at the playhead (K)",
    "compositions.prev_keyframe": "Previous keyframe",
    "compositions.next_keyframe": "Next keyframe",
    "compositions.transform_animated": "Animated: move the playhead onto a keyframe or press ◆ to add one.",
    "compositions.section_mask": "Mask",
    "compositions.mask_add": "Add mask",
    "compositions.mask_delete": "Delete mask",
    "compositions.section_box": "Background",
    "compositions.box_add": "Add background",
    "compositions.box_delete": "Delete background",
    "compositions.mask_linear": "Linear",
    "compositions.mask_radial": "Circle",
    "compositions.mask_image": "Image",
    "compositions.mask_angle": "Angle",
    "compositions.mask_feather": "Feather",
    "compositions.mask_invert": "Invert",
    "compositions.mask_x": "Position X",
    "compositions.mask_y": "Position Y",
    "compositions.mask_size": "Size",
    "compositions.mask_asset": "Mask image",
    "compositions.section_effects": "Effects",
    "compositions.effect_add": "Add effect",
    "compositions.effect_in": "In",
    "compositions.effect_out": "Out",
    "compositions.effect_text_reveal": "Text reveal",
    "compositions.reveal_fade": "Fade",
    "compositions.reveal_rise": "Rise",
    "compositions.reveal_pop": "Pop",
    "compositions.reveal_type": "Typewriter",
    "compositions.reveal_blur": "Blur",
    "compositions.effect_letter": "Letter",
    "compositions.effect_word": "Word",
    "compositions.effect_style": "Style",
    "compositions.effect_start": "Start (ms)",
    "compositions.effect_duration": "Duration (ms)",
    "compositions.effect_unit_ms": "Per unit (ms)",
    "compositions.effect_hide": "Hide",
    "compositions.effect_show": "Show",
    "compositions.effect_delete": "Delete effect",
    "compositions.effect_unlink": "Linked to the base. Unlink to change it in this variation",
    "compositions.effect_link": "Changed in this variation. Link to the base again",
    "compositions.effect_loop": "Loop",
    "compositions.loop_shake": "Shake",
    "compositions.loop_wobble": "Wobble",
    "compositions.loop_wave": "Wave",
    "compositions.loop_glitch": "Glitch",
    "compositions.effect_element": "Element",
    "compositions.effect_intensity": "Intensity",
    "compositions.effect_speed": "Speed",
    "compositions.effect_pause": "Pause",
    "compositions.effect_swing": "Swing",
    "compositions.effect_swing_from": "From the baseline",
    "compositions.effect_swing_around": "Around the baseline",
    "compositions.effect_open": "Runs while on stage",
    "compositions.effect_only_loop": "Only a loop moves this element, so it counts as done at once: elements chained after it start right away.",
    "compositions.effect_reveal_no_end": "This element has no duration in the base, so a variation can't add a reveal to it, only loops.",
    "compositions.effect_applies_to": "Applies to",
    "compositions.effect_whole_text": "Whole text",
    "compositions.section_clones": "Clones",
    "compositions.clones_add": "Add clones",
    "compositions.clones_delete": "Delete clones",
    "compositions.clones_reroll": "Roll again",
    "compositions.clones_count": "Count",
    "compositions.clones_count_fixed": "Fixed count",
    "compositions.clones_count_field": "From the event",
    "compositions.clones_field": "Field",
    "compositions.clones_per": "1 per",
    "compositions.clones_fallback": "Fallback",
    "compositions.clones_shown": "In the editor: :count clone|In the editor: :count clones",
    "compositions.clones_first": "First clone at",
    "compositions.clones_last": "Last clone at",
    "compositions.clones_order": "Order",
    "compositions.clones_forward": "Forward",
    "compositions.clones_reverse": "Reverse",
    "compositions.clones_random": "Random",
    "compositions.clones_layout": "Layout",
    "compositions.clones_layout_none": "None",
    "compositions.clones_layout_line": "Line",
    "compositions.clones_layout_circle": "Circle",
    "compositions.clones_layout_area": "Area",
    "compositions.clones_angle": "Angle",
    "compositions.clones_spacing": "Spacing",
    "compositions.clones_radius": "Radius",
    "compositions.clones_start": "Start angle",
    "compositions.clones_jitter": "Jitter",
    "compositions.clones_field_missing": "No context event supplies :key. The count under Fallback plays.",
    "compositions.clones_field_ctx_missing": "No flow that plays this composition sets :key. The count under Fallback plays.",
    "compositions.clones_field_var_missing": "No variable :slug exists any more. The count under Fallback plays.",
    "compositions.clones_field_settings_missing": "The package declares no setting :key. The count under Fallback plays.",
    "compositions.timeline_expand": "Expand",
    "compositions.timeline_collapse": "Collapse",
    "compositions.timeline_empty": "Add an element to see its timing here.",
    "compositions.timeline_keyframe": "Keyframe at",
    "compositions.timeline_resize": "Resize the timeline",
    "compositions.section_presets": "Presets",
    "compositions.preset_in": "Intro preset",
    "compositions.preset_out": "Outro preset",
    "compositions.preset_duration": "Duration",
    "compositions.preset_apply_in": "Insert intro",
    "compositions.preset_apply_out": "Append outro",
    "compositions.prop_x": "X",
    "compositions.prop_y": "Y",
    "compositions.prop_w": "W",
    "compositions.prop_h": "H",
    "compositions.prop_scale": "Scale",
    "compositions.prop_opacity": "Opacity",
    "compositions.prop_rotate": "Rotation",
    "compositions.prop_blur": "Blur",
    "compositions.template": "Template",
    "compositions.size": "Size",
    "compositions.shrink": "Shrink to fit",
    "compositions.shrink_help": "Size is the largest. A longer text gets smaller until it fits its box.",
    "compositions.align": "Alignment",
    "compositions.align_left": "Left",
    "compositions.align_center": "Center",
    "compositions.align_right": "Right",
    "compositions.color": "Color",
    "compositions.stroke_color": "Outline color",
    "compositions.stroke_width": "Outline width",
    "compositions.line_height": "Line height",
    "compositions.letter_spacing": "Letter spacing",
    "compositions.bg_color": "Background color",
    "compositions.bg_opacity": "Opacity",
    "compositions.fill": "Fill",
    "compositions.fill_linear": "Linear",
    "compositions.fill_radial": "Radial",
    "compositions.fill_presets": "Presets",
    "compositions.fill_preset_twitch": "Twitch",
    "compositions.fill_preset_sunset": "Sunset",
    "compositions.fill_preset_ocean": "Ocean",
    "compositions.fill_preset_gold": "Gold",
    "compositions.fill_preset_neon": "Neon",
    "compositions.fill_preset_night": "Night",
    "compositions.fill_preset_plate_fade": "Plate fade",
    "compositions.fill_preset_vignette": "Vignette",
    "compositions.fill_bar_hint": "Click the bar to add a stop. Drag a stop to move it, or drag it down off the bar to remove it.",
    "compositions.fill_stop_at": "Stop at :position %",
    "compositions.fill_stop_color": "Stop color",
    "compositions.fill_stop_remove": "Remove stop",
    "compositions.fill_add_stop": "+ Stop",
    "compositions.fill_reverse": "Reverse",
    "compositions.fill_angle": "Angle",
    "compositions.fill_center_x": "Center X",
    "compositions.fill_center_y": "Center Y",
    "compositions.fill_radius": "Radius",
    "compositions.hex": "Hex",
    "compositions.alpha": "Alpha",
    "compositions.position": "Position",
    "compositions.picker_sv": "Saturation and brightness",
    "compositions.picker_sv_value": "Saturation :saturation %, brightness :brightness %",
    "compositions.picker_hue": "Hue",
    "compositions.picker.missing": "Composition no longer exists",
    "compositions.picker.option_package": ":composition_name (:name)",
    "compositions.fill_none": "None",
    "compositions.deband": "Smooth banding",
    "compositions.corners_individual": "Individual corners",
    "compositions.corner_top_left": "Top left",
    "compositions.corner_top_right": "Top right",
    "compositions.corner_bottom_right": "Bottom right",
    "compositions.corner_bottom_left": "Bottom left",
    "compositions.padding_x": "Horizontal padding",
    "compositions.padding_y": "Vertical padding",
    "compositions.border_radius": "Corner radius",
    "compositions.border_width": "Border width",
    "compositions.border_color": "Border color",
    "compositions.border_style": "Border style",
    "compositions.border_solid": "Solid",
    "compositions.border_dashed": "Dashed",
    "compositions.border_dotted": "Dotted",
    "compositions.border_double": "Double",
    "compositions.shadow_color": "Shadow color",
    "compositions.shadow_x": "Shadow X",
    "compositions.shadow_y": "Shadow Y",
    "compositions.shadow_blur": "Shadow blur",
    "compositions.shadow_spread": "Shadow spread",
    "compositions.inner_shadow_color": "Inner shadow color",
    "compositions.inner_shadow_x": "Inner shadow X",
    "compositions.inner_shadow_y": "Inner shadow Y",
    "compositions.inner_shadow_blur": "Inner shadow blur",
    "compositions.inner_shadow_spread": "Inner shadow spread",
    "compositions.glow": "Glow",
    "compositions.var_colors": "Variable colors",
    "compositions.font": "Font",
    "compositions.asset": "File",
    "compositions.url_source_forbidden": "Only someone who may manage the Media Center can set or change a URL source.",
    "compositions.source_media_center": "Media Center",
    "compositions.source_url": "URL",
    "compositions.url_locked": "Only someone who may manage the Media Center can set a URL source.",
    "compositions.url_locked_hint": "This element loads from a URL. Only someone who may manage the Media Center can change it; you can switch it to a Media Center file.",
    "compositions.url_note_placeholder": "The host comes from a placeholder, so only platform hosts play: your uploads and Twitch images.",
    "compositions.url_note_literal": "Fixed host :host. The install consent shows it.",
    "compositions.url_note_platform": "A platform host: your uploads or Twitch images.",
    "compositions.url_rule_length": "Enter a URL of at most 500 characters.",
    "compositions.url_rule_https": "Only an https:// URL, or a placeholder at the start.",
    "compositions.url_rule_host_placeholder": "A placeholder cannot choose the host. Type the host itself.",
    "compositions.url_rule_plain": "No spaces, backslashes or user@ in the URL, and a host of plain letters, digits and dashes.",
    "compositions.url_rule_host": "The host needs a dot, and cannot be an IP address or carry a port.",
    "compositions.on_fail": "If it does not load",
    "compositions.on_fail_drop": "Drop the element",
    "compositions.on_fail_replacement": "Show a replacement",
    "compositions.replacement": "Replacement",
    "compositions.section_preview_values": "Preview values",
    "compositions.preview_values_hint": "Only for this preview, never saved and never used on stream: every placeholder this composition reads that the sample event cannot fill.",
    "compositions.preview_my_avatar": "My avatar",
    "compositions.fit": "Fit",
    "compositions.fit_contain": "Contain",
    "compositions.fit_cover": "Cover",
    "compositions.media_kind": "Media type",
    "compositions.media_kind_image": "Image",
    "compositions.media_kind_video": "Video",
    "compositions.length": "Length",
    "compositions.length_media": "Until the video ends",
    "compositions.length_track": "Like the keyframes",
    "compositions.volume": "Volume",
    "compositions.lang": "Language",
    "compositions.preset_none": "No transition",
    "compositions.preset_fade": "Fade",
    "compositions.preset_slide_up": "Slide up",
    "compositions.preset_slide_down": "Slide down",
    "compositions.preset_slide_left": "Slide left",
    "compositions.preset_slide_right": "Slide right",
    "compositions.preset_zoom": "Zoom",
    "compositions.duration_warn": "Over 50s of known duration. Late elements may get cut off.",
    "compositions.variant_config_hint": "Only content settings and effects can vary. Position, timing and keyframes come from the base.",
    "compositions.variant_enabled": "Enabled",
    "compositions.variant_field_ctx_draft_no_flow": "No flow in this package plays this composition yet.",
    "compositions.variant_field_ctx_inline_only": "Only an inline action plays this composition. Inline actions cannot set run context; use a flow.",
    "compositions.variant_field_ctx_loading": "Looking for flows that play this composition…",
    "compositions.variant_field_ctx_missing": "No flow that plays this composition sets :key. This condition will never match.",
    "compositions.variant_field_ctx_no_flow": "No flow plays this composition yet, so no run-context key can reach it.",
    "compositions.variant_field_ctx_none_set": "No flow that plays this composition sets a run-context key.",
    "compositions.variant_field_ctx_unsaved": "Save the composition first. Run-context keys come from the flows that play it.",
    "compositions.variant_field_missing": "No context event supplies :key. This condition will never match.",
    "compositions.variant_field_var_missing": "No variable :slug exists any more. This condition will never match.",
    "compositions.variant_field_settings_missing": "The package declares no setting :key. This condition will never match.",
    "compositions.variant_plays_for": "Plays for",
    "compositions.variant_plays_for_add": "Add event",
    "compositions.variant_plays_for_any": "Any event",
    "compositions.variant_plays_for_hint": "The variation plays only when one of these events triggered the composition. An event that is not a context event yet joins the list.",
    "compositions.variant_plays_for_other": "Other event: :event_name",
    "compositions.variant_plays_for_remove": "No longer play for :event_name",
    "compositions.variants_deleted_with_events": "Deleted :count variation whose events were removed: :names|Deleted :count variations whose events were removed: :names",
    "compositions.variant_priority_hint": "The first matching variation wins, top to bottom.",
    "compositions.variant_rules_pruned": "Removed :count condition no remaining context event supplies: :fields|Removed :count conditions no remaining context event supplies: :fields",
    "compositions.vars_unresolved": "No context event supplies these placeholders: :vars",
    "compositions.settings_undeclared": "The package declares none of these settings. They stay empty when the composition plays: :keys",
    "compositions.el_unresolved_vars": "Contains variables no context event supplies.",
    "compositions.el_undeclared_settings": "Reads a setting the package does not declare. It stays empty when this plays.",
    "compositions.chip_save_error": "Save failed",
    "compositions.chip_refused": ":error (:name)",
    "compositions.chip_refused_variant": ":error (:name, :variant)",
    "compositions.refused_in_variant": ":error (:variant)",
    "compositions.refused_text_missing": "Text is missing",
    "compositions.refused_text_long": "Text is too long",
    "compositions.refused_file_missing": "No file chosen",
    "compositions.refused_url_missing": "URL is missing",
    "compositions.refused_replacement_missing": "No replacement file chosen",
    "compositions.refused_mask_missing": "No mask image chosen",
    "compositions.refused_name_missing": "Name is missing",
    "compositions.refused_name_long": "Name is too long",
    "compositions.refused_effect_end": "Ends later than the element in the base",
    "compositions.chip_duration": "Longer than 50s",
    "compositions.chip_vars": ":n unresolved placeholders",
    "compositions.chip_settings_undeclared": ":count undeclared setting|:count undeclared settings",
    "compositions.binding_bind": "Bind to a setting",
    "compositions.binding_unbind": "Unbind",
    "compositions.binding_undeclared": "The package declares no setting :key. A play shows the value under it.",
    "compositions.binding_other_type": "The setting :key is of another type than this field takes. Publishing refuses the binding.",
    "compositions.canvas_empty": "Text and media elements show up here on the stage.",
    "compositions.widget_none": "No composition chosen",
    "compositions.widget_play": "Play",
    "compositions.widget_plays_auto": "Plays on :event_name (automatically)",
    "compositions.widget_plays_missing": "Plays on :event_name. Missing: :scopes",
    "compositions.preview": "Preview",
    "compositions.preview_loading": "Loading …",
    "compositions.preview_loading_count": "Loading :count/:total",
    "compositions.preview_loading_slow": "Your files are still spawning…",
    "compositions.preview_loading_tip": "Tip: large files load slowly, especially on a weak connection.",
    "compositions.stop": "Stop",
    "compositions.transport_play": "Play from the playhead (Space)",
    "compositions.transport_stop": "Stop (Space)",
    "compositions.export_json": "Export as JSON",
    "compositions.export_json_help": "Asset paths must point to files in the widget bundle.",
    "compositions.export_copied": "Copied to clipboard",
    "compositions.lazy_user_group": "Twitch user, loaded when used",
    "widgets.editor.axis_h": "H",
    "widgets.editor.axis_w": "W",
    "widgets.editor.close_panel": "Close panel",
    "widgets.editor.open_settings": "Open settings",
    "widgets.editor.package_settings_of": "Package settings for :name",
    "widgets.editor.config_title": "Configuration",
    "widgets.editor.config_title_variant": "Configuration · :label",
    "widgets.editor.duplicate": "Duplicate",
    "widgets.editor.group_delete": "Delete group",
    "widgets.editor.group_delete_confirm": "Delete this group and all its widgets from the scene?",
    "widgets.editor.group_label": "Group: :name",
    "widgets.editor.group_locked_hint": "Part of a group. Ungroup to edit single widgets.",
    "widgets.editor.inherited_hint": "Default",
    "widgets.editor.layer_back": "Send backward",
    "widgets.editor.layer_front": "Bring forward",
    "widgets.editor.open_panel": "Open settings",
    "widgets.editor.overridden": "overridden",
    "widgets.editor.override_promote": "Click to override",
    "widgets.editor.override_remove": "Remove override",
    "widgets.editor.position_size": "Position & Size",
    "widgets.editor.rail_title": "Widgets",
    "widgets.editor.remove_widget": "Remove widget",
    "widgets.editor.remove_widget_confirm": "Remove this widget from the scene?",
    "widgets.editor.scene_settings": "Scene",
    "widgets.editor.show_rail": "Show widgets",
    "widgets.editor.theme": "Theme",
    "widgets.editor.theme_none": "None",
    "widgets.editor.theme_title": "Scene theme",
    "widgets.editor.ungroup": "Ungroup",
    "widgets.editor.variation_add": "Variation",
    "widgets.editor.variation_banner": "You are editing the variation “:label”. Base values are dimmed.",
    "widgets.editor.variation_base": "Base",
    "widgets.editor.zoom_fit": "Fit view",
    "widgets.editor.zoom_in": "Zoom in",
    "widgets.editor.zoom_out": "Zoom out",
    "widgets.fonts.cat_display": "Display",
    "widgets.fonts.cat_handwriting": "Script",
    "widgets.fonts.cat_monospace": "Mono",
    "widgets.fonts.cat_sans_serif": "Sans",
    "widgets.fonts.cat_serif": "Serif",
    "widgets.fonts.search": "Search fonts...",
    "widgets.settings.asset_default": "Nothing picked: the package's default",
    "widgets.settings.font_custom": "Custom font",
    "widgets.settings.list_add": "Add entry",
    "widgets.settings.repeater_add": "Add row",
    "widgets.variants.title": "Variations",
    "widgets.variants.empty": "No variations. Events use the base settings.",
    "widgets.variants.unnamed": "Unnamed variation",
    "widgets.variants.no_overrides": "Overrides nothing yet",
    "widgets.variants.add": "Add variation",
    "widgets.variants.delete_confirm": "Delete this variation?",
    "widgets.variants.label": "Label",
    "widgets.variants.event": "Event",
    "widgets.variants.match": "Condition mode",
    "widgets.variants.match_all": "All conditions match",
    "widgets.variants.match_any": "Any condition matches",
    "widgets.variants.rules": "Conditions",
    "widgets.variants.add_rule": "Add condition",
    "widgets.variants.rules_empty_hint": "No conditions: this variation applies to every such event.",
    "widgets.variants.move_up": "Move up",
    "widgets.variants.move_down": "Move down",
    "widgets.variants.delete": "Delete variation",
    "widgets.version.label": "Version",
    "widgets.version.current_option": ":version (active)",
    "widgets.version.newer_available": "Newer version available",
    "widgets.version.manage": "Manage version",
    "widgets.manifest.mode": "Delivery",
    "widgets.manifest.mode_live": "Instant (state)",
    "widgets.manifest.mode_alert": "Alert (queued)",
    "widgets.manifest.lane": "Lane",
    "widgets.manifest.ack": "Completion",
    "widgets.manifest.ack_auto": "Automatic (duration)",
    "widgets.manifest.ack_manual": "Widget reports done",
    "widgets.manifest.duration_config_key": "Duration from setting",
    "widgets.manifest.duration_ms": "Fixed duration (ms)",
    "widgets.alert_lane.too_many_lanes": "Too many distinct alert lanes in this scene (max :max).",
    "widgets.save.package_not_installed": "That widget package is not installed for this property.",
    "widgets.save.theme_override_not_allowed": "This widget does not allow per-instance theme overrides.",
    "widgets.save.theme_not_installed": "That theme package is not installed for this property.",
    "widgets.save.widgets_gone": "Some widgets no longer exist. Please reload the editor.",
    "widgets.save.unknown_widget_key": "That widget no longer exists in this package.",
    "widgets.save.dashboard_widget": "A dashboard widget lives on the app page and cannot be placed in a scene.",
    "(add a trigger node)": "(add a trigger node)",
    "(empty template)": "(empty template)",
    "(no changelog)": "(no changelog)",
    "(no url)": "(no url)",
    "+ Alias": "+ Alias",
    "01 — The visual editor": "01: The visual editor",
    "02 — Every Twitch event, live": "02: Every Twitch event, live",
    "03 — Actions that go anywhere": "03: Actions that go anywhere",
    ":login is already linked as a bot for this property.": ":login is already linked as a bot for this property.",
    ":login is now linked as a bot for :property. You can close this window.": ":login is now linked as a bot for :property. You can close this window.",
    ":login is now linked. You can close this window.": ":login is now linked. You can close this window.",
    ":n aliases": ":n aliases",
    ":ok registered, :n failed": ":ok registered, :n failed",
    "A chatbox widget shows the live chat from these messages.": "A chatbox widget shows the live chat from these messages.",
    "A command !:keyword already exists. Switch to “Link existing” to attach the Quote graph to it without changing its current settings.": "A command !:keyword already exists. Switch to “Link existing” to attach the Quote graph to it without changing its current settings.",
    "A direct word about where this is.": "A direct word about where this is.",
    "A follower alert plays a sound effect when someone follows.": "A follower alert plays a sound effect when someone follows.",
    "A follower alert plays an animation.": "A follower alert plays an animation.",
    "A streamer-built platform. Rebuilt properly.": "A streamer-built platform. Rebuilt properly.",
    "Access": "Access",
    "Action added": "Action added",
    "Action configuration screenshot": "Action configuration screenshot",
    "Action removed": "Action removed",
    "Action updated": "Action updated",
    "Actions": "Actions",
    "Activate immediately": "Activate immediately",
    "Active": "Active",
    "Active in categories": "Active in categories",
    "Add Bot": "Add Bot",
    "Add Event": "Add Event",
    "Add New User": "Add New User",
    "Add Node": "Add Node",
    "Add Pin": "Add Pin",
    "Add User": "Add User",
    "Add a phrase…": "Add a phrase…",
    "Add a trigger node first": "Add a trigger node first",
    "Add a trigger node to the graph before running a test.": "Add a trigger node to the graph before running a test.",
    "Add action": "Add action",
    "Add alias": "Add alias",
    "Add alias to !:keyword": "Add alias to !:keyword",
    "Add an event to your property": "Add an event to your property",
    "Add at least one phrase.": "Add at least one phrase.",
    "Add command": "Add command",
    "Add option": "Add option",
    "Add tag": "Add tag",
    "Add tags…": "Add tags…",
    "Admin": "Admin",
    "Administration": "Administration",
    "Admins have unconditional access to every current and future extension on this property. Selecting this hides the per-extension permission picker below — admins do not need it.": "Admins have unconditional access to every current and future extension on this property. Selecting this hides the per-extension permission picker below: admins do not need it.",
    "Alias": "Alias",
    "Alias keyword": "Alias keyword",
    "Aliases": "Aliases",
    "All": "All",
    "All :n aliases drop with it. The auto-generated graph also goes.": "All :n aliases drop with it. The auto-generated graph also goes.",
    "All :provider events are already registered.": "All :provider events are already registered.",
    "All required scopes already granted. No sign-in needed.": "All required scopes already granted. No sign-in needed.",
    "All sources": "All sources",
    "All tags": "All tags",
    "All triggers": "All triggers",
    "All types": "All types",
    "Alpha means honest.": "Alpha means honest.",
    "Alpha — early access open": "Alpha: early access open",
    "Already have access?": "Already have access?",
    "Always subscribed because your Twitch account is connected": "Always subscribed because your Twitch account is connected",
    "App-Level Permissions": "App-Level Permissions",
    "App-level memberships (e.g. alpha/beta). These grant access to any extension linked to the group.": "App-level memberships (e.g. alpha/beta). These grant access to any extension linked to the group.",
    "Apply Now": "Apply Now",
    "Apply for Access": "Apply for Access",
    "Apply for Early Access": "Apply for Early Access",
    "Apply for early access.": "Apply for early access.",
    "Apply with Twitch": "Apply with Twitch",
    "Approve": "Approve",
    "Approved": "Approved",
    "Approved :email": "Approved :email",
    "Audience": "Audience",
    "Audio": "Audio",
    "Audio Out scene \":name\" created. Paste the OBS URL into your scene collection.": "Audio Out scene \":name\" created. Paste the OBS URL into your scene collection.",
    "Audit Log": "Audit Log",
    "Audit log screenshot": "Audit log screenshot",
    "BTTV and FFZ emotes are loaded directly from their respective servers.": "BTTV and FFZ emotes are loaded directly from their respective servers.",
    "Back": "Back",
    "Back to Configure": "Back to Configure",
    "Background color": "Background color",
    "Basics": "Basics",
    "graphs.share.builder_unlock": "Becoming a Streambridge Builder unlocks marketplace publishing.",
    "Behavior": "Behavior",
    "Body": "Body",
    "Bot Accounts": "Bot Accounts",
    "Bot already linked": "Bot already linked",
    "Bot limit reached": "Bot limit reached",
    "Bot limit reached. Remove one to add another.": "Bot limit reached. Remove one to add another.",
    "Bot linked": "Bot linked",
    "Broadcaster (primary)": "Broadcaster (primary)",
    "Browse": "Browse",
    "Build automations": "Build automations",
    "Builder access required": "Builder access required",
    "Built for how streamers actually think.": "Built for how streamers actually think.",
    "Cancel": "Cancel",
    "Captures a memorable line. Snapshots the current Twitch category automatically.": "Captures a memorable line. Snapshots the current Twitch category automatically.",
    "Case-sensitive": "Case-sensitive",
    "Category-bound": "Category-bound",
    "Change in the trigger node's picker.": "Change in the trigger node's picker.",
    "Changelog": "Changelog",
    "Channel": "Channel",
    "Channel Point Reward": "Channel Point Reward",
    "Channel cooldown (s)": "Channel cooldown (s)",
    "Check Updates": "Check Updates",
    "Choose files": "Choose files",
    "Choose group…": "Choose group…",
    "Close": "Close",
    "Close window": "Close window",
    "Color": "Color",
    "Color for :label": "Color for :label",
    "Coming with the Viewer Groups feature.": "Coming with the Viewer Groups feature.",
    "Command": "Command",
    "Command removed": "Command removed",
    "Command saved": "Command saved",
    "Command updated": "Command updated",
    "Commands": "Commands",
    "Configure": "Configure",
    "Confirm before continuing": "Confirm before continuing",
    "Confirm bot link": "Confirm bot link",
    "Connect your channel": "Connect your channel",
    "Connection": "Connection",
    "Connection #:id": "Connection #:id",
    "Connection refs are always cleared on import": "Connection refs are always cleared on import",
    "Connection refs will be remapped to Primary on import": "Connection refs will be remapped to Primary on import",
    "Contains — anywhere in message": "Contains: anywhere in message",
    "Continue to :provider": "Continue to :provider",
    "Continue with Twitch": "Continue with Twitch",
    "Cooldowns": "Cooldowns",
    "Copied!": "Copied!",
    "Copy to Clipboard": "Copy to Clipboard",
    "Cost (channel points)": "Cost (channel points)",
    "Could not identify Twitch account": "Could not identify Twitch account",
    "Counter": "Counter",
    "Create": "Create",
    "Create :slot command": "Create :slot command",
    "Create A New User Group": "Create A New User Group",
    "Create Reward": "Create Reward",
    "Create Role": "Create Role",
    "Create Share Link": "Create Share Link",
    "Create a new Form": "Create a new Form",
    "Create new": "Create new",
    "Dashboard": "Dashboard",
    "Date format": "Date format",
    "Declined": "Declined",
    "Default — (no sender configured)": "Default: (no sender configured)",
    "Default — :label": "Default: :label",
    "Default — broadcaster primary": "Default: broadcaster primary",
    "Defaults": "Defaults",
    "Delete": "Delete",
    "Delete !:keyword?": "Delete !:keyword?",
    "Delete (Del)": "Delete (Del)",
    "Delete :label": "Delete :label",
    "Delete :name?": "Delete :name?",
    "Delete alias": "Delete alias",
    "Delete alias !:keyword": "Delete alias !:keyword",
    "Delete alias !:keyword?": "Delete alias !:keyword?",
    "Delete asset": "Delete asset",
    "Delete command": "Delete command",
    "Delete failed.": "Delete failed.",
    "Delete quote #:n": "Delete quote #:n",
    "Delete quote #:n? This cannot be undone — the number stays retired and won't be reused.": "Delete quote #:n? This cannot be undone: the number stays retired and won't be reused.",
    "Delete reward?": "Delete reward?",
    "Delete tag :label?": "Delete tag :label?",
    "Delete this custom event? This cannot be undone.": "Delete this custom event? This cannot be undone.",
    "Description": "Description",
    "Detach": "Detach",
    "Detach this graph?": "Detach this graph?",
    "Detaching removes the link to the source. You'll be able to edit everything but won't receive future updates.": "Detaching removes the link to the source. You'll be able to edit everything but won't receive future updates.",
    "Disable": "Disable",
    "Disable this action": "Disable this action",
    "Disabled rewards do not appear in the redemption menu.": "Disabled rewards do not appear in the redemption menu.",
    "Display Name": "Display Name",
    "Drag to reorder": "Drag to reorder",
    "Duplicate (Ctrl+D)": "Duplicate (Ctrl+D)",
    "Each command below materialises as a chat trigger plus an editable graph. Add only the ones you want — skip Edit if you don't need it. The default response is a simple \"Quote #N: text\"; open the graph to customise.": "Each command below materialises as a chat trigger plus an editable graph. Add only the ones you want, skip Edit if you don't need it. The default response is a simple \"Quote #N: text\"; open the graph to customise.",
    "Each response segment must be a plain string or a {v,p?} variable object.": "Each response segment must be a plain string or a {v,p?} variable object.",
    "Edit": "Edit",
    "Edit !:keyword": "Edit !:keyword",
    "Edit :name": "Edit :name",
    "Edit :phrase": "Edit :phrase",
    "Edit Custom Event": "Edit Custom Event",
    "Edit Role: :name": "Edit Role: :name",
    "Edit User :user": "Edit User :user",
    "Edit User Group: :name": "Edit User Group: :name",
    "Edit command": "Edit command",
    "Edit command:": "Edit command:",
    "Edit event schema": "Edit event schema",
    "Edit keyword:": "Edit keyword:",
    "Edit trigger: :label": "Edit trigger: :label",
    "Edited": "Edited",
    "Enable": "Enable",
    "Enable :title": "Enable :title",
    "Enable this action": "Enable this action",
    "Enabled": "Enabled",
    "Enter a field explanation": "Enter a field explanation",
    "Enter a field label": "Enter a field label",
    "Enter trigger phrase…": "Enter trigger phrase…",
    "Event :key unregistered": "Event :key unregistered",
    "Event Graphs": "Event Graphs",
    "Event registered": "Event registered",
    "Events": "Events",
    "Every available event is already registered for this property.": "Every available event is already registered for this property.",
    "Example:": "Example:",
    "Existing command": "Existing command",
    "Expose this field on import": "Expose this field on import",
    "Exposed params": "Exposed params",
    "Extension :alias installed": "Extension :alias installed",
    "Extension :alias uninstalled": "Extension :alias uninstalled",
    "Extension :extension has been successfully disabled": "Extension :extension has been successfully disabled",
    "Extension :extension has been successfully enabled": "Extension :extension has been successfully enabled",
    "Extension :extension saved": "Extension :extension saved",
    "Extension: :name": "Extension: :name",
    "Extensions": "Extensions",
    "Extensions - Administration": "Extensions - Administration",
    "Extensions are the building blocks: Commands, Keywords, Loyalty, and more. Install what applies to your channel. Each one adds the events and actions it knows about.": "Extensions are the building blocks: Commands, Keywords, Loyalty, and more. Install what applies to your channel. Each one adds the events and actions it knows about.",
    "Extensions index screenshot": "Extensions index screenshot",
    "External": "External",
    "Failed to create share link.": "Failed to create share link.",
    "Failed to load consent info. Please retry.": "Failed to load consent info. Please retry.",
    "Fetch data from external hosts": "Fetch data from external hosts",
    "Field Explanation": "Field Explanation",
    "Field Label": "Field Label",
    "Field Name": "Field Name",
    "Filter by number, text, or category…": "Filter by number, text, or category…",
    "Form Generator": "Form Generator",
    "Free tier cap reached for category-bound rewards. Remove a binding from another reward, or upgrade to Premium, before adding categories here.": "Free tier cap reached for category-bound rewards. Remove a binding from another reward, or upgrade to Premium, before adding categories here.",
    "Free tier cap reached: :used / :limit category-bound rewards. Existing bindings keep working; new bindings are blocked until you upgrade or unbind one.": "Free tier cap reached: :used / :limit category-bound rewards. Existing bindings keep working; new bindings are blocked until you upgrade or unbind one.",
    "Free tier — active category bindings: :used / :limit.": "Free tier: active category bindings: :used / :limit.",
    "From :label": "From :label",
    "Gate": "Gate",
    "Generate a one-time share link.": "Generate a one-time share link.",
    "Grant Access": "Grant Access",
    "Grant property access to moderators, define role-based permissions.": "Grant property access to moderators, define role-based permissions.",
    "Graph": "Graph",
    "Graph Marketplace": "Graph Marketplace",
    "Graph installed successfully.": "Graph installed successfully.",
    "Graph removed": "Graph removed",
    "Graph saved": "Graph saved",
    "Graph updated": "Graph updated",
    "Graphs": "Graphs",
    "Groups": "Groups",
    "Header-Name: value\\nAnother-Header: value": "Header-Name: value\\nAnother-Header: value",
    "Headers": "Headers",
    "Here's what's different.": "Here's what's different.",
    "Hey :name,": "Hey :name,",
    "Hi there,": "Hi there,",
    "Hide upload": "Hide upload",
    "How it works": "How it works",
    "I rebuilt this from scratch after eight years because the old version had too much debt and too little trust in the core design. This version is built properly — and the alpha is the proof of that claim, not a claim about the product being finished. If you're the kind of streamer who wants to be early and shape what this becomes, you're who I built this for.": "I rebuilt this from scratch after eight years because the old version had too much debt and too little trust in the core design. This version is built properly. And the alpha is the proof of that claim, not a claim about the product being finished. If you're the kind of streamer who wants to be early and shape what this becomes, you're who I built this for.",
    "ID": "ID",
    "Icon Left": "Icon Left",
    "Icon Right": "Icon Right",
    "If the button doesn't work, copy and paste this link into your browser:": "If the button doesn't work, copy and paste this link into your browser:",
    "Images": "Images",
    "Import from :sharer": "Import from :sharer",
    "Import from code": "Import from code",
    "Import shared graph": "Import shared graph",
    "In the meantime there's nothing more to do. You can close this tab and come back later.": "In the meantime there's nothing more to do. You can close this tab and come back later.",
    "Inputs": "Inputs",
    "Inputs / Outputs": "Inputs / Outputs",
    "Inspector": "Inspector",
    "Install": "Install",
    "Install :name": "Install :name",
    "Install Graph": "Install Graph",
    "Install extensions": "Install extensions",
    "Install failed.": "Install failed.",
    "marketing.waitlist.title": "Join the Streambridge waitlist",
    "Key": "Key",
    "Keyword": "Keyword",
    "Keyword (without !)": "Keyword (without !)",
    "Keyword editor screenshot": "Keyword editor screenshot",
    "Keyword removed": "Keyword removed",
    "Keyword saved": "Keyword saved",
    "Keyword updated": "Keyword updated",
    "Keywords": "Keywords",
    "Label": "Label",
    "Leave": "Leave",
    "Leave all groups empty to allow everyone. Matches are OR-combined — a viewer only needs to satisfy one group.": "Leave all groups empty to allow everyone. Matches are OR-combined: a viewer only needs to satisfy one group.",
    "Leave empty": "Leave empty",
    "Leave empty to keep this reward always active. When set, the reward is auto-enabled while the stream sits in one of these categories and auto-disabled otherwise.": "Leave empty to keep this reward always active. When set, the reward is auto-enabled while the stream sits in one of these categories and auto-disabled otherwise.",
    "Let's go": "Let's go",
    "Link already used": "Link already used",
    "Link existing": "Link existing",
    "Link expired": "Link expired",
    "Link not found": "Link not found",
    "Link this Twitch account as a bot?": "Link this Twitch account as a bot?",
    "Linked": "Linked",
    "Linked to": "Linked to",
    "List": "List",
    "Literal value (string)": "Literal value (string)",
    "Loading…": "Loading…",
    "Log in": "Log in",
    "auth.login.to_app": "Log in to Streambridge",
    "Log out": "Log out",
    "Login": "Login",
    "Logout": "Logout",
    "Major": "Major",
    "Make this the default sender for Commands/Keywords with no explicit sender": "Make this the default sender for Commands/Keywords with no explicit sender",
    "Manage uploaded images, audio and video.": "Manage uploaded images, audio and video.",
    "Managed": "Managed",
    "Marketplace": "Marketplace",
    "Match mode": "Match mode",
    "Media Center": "Media Center",
    "Members": "Members",
    "Members of linked UserGroups can access this extension regardless of property-level role. Useful for alpha/beta rollouts.": "Members of linked UserGroups can access this extension regardless of property-level role. Useful for alpha/beta rollouts.",
    "Method": "Method",
    "Minor": "Minor",
    "Missing permissions": "Missing permissions",
    "Missing scopes": "Missing scopes",
    "More actions": "More actions",
    "My Graph Packages": "My Graph Packages",
    "Name": "Name",
    "Name on my property": "Name on my property",
    "New Command": "New Command",
    "New Custom Event": "New Custom Event",
    "New Graph": "New Graph",
    "New Graph Package": "New Graph Package",
    "New Keyword": "New Keyword",
    "New Reward": "New Reward",
    "New alias keyword": "New alias keyword",
    "New command": "New command",
    "New custom event": "New custom event",
    "New exposed params": "New exposed params",
    "New resource refs": "New resource refs",
    "New tag label": "New tag label",
    "Newest": "Newest",
    "No": "No",
    "No administrative activity logged yet on this property.": "No administrative activity logged yet on this property.",
    "No aliases yet.": "No aliases yet.",
    "No app-level permissions registered yet.": "No app-level permissions registered yet.",
    "No audit entries yet.": "No audit entries yet.",
    "No bot accounts linked yet.": "No bot accounts linked yet.",
    "No chat-writable connections linked yet. Grant the user:write:chat scope on an account to add it.": "No chat-writable connections linked yet. Grant the user:write:chat scope on an account to add it.",
    "No commands configured on this property yet.": "No commands configured on this property yet.",
    "No commands yet. Create one to get your chat bot talking.": "No commands yet. Create one to get your chat bot talking.",
    "No custom events yet — click + to create one.": "No custom events yet: click + to create one.",
    "No enabled UserGroup holds the `app.grant_access` permission. Create one before approving anyone — approval needs a group to attach.": "No enabled UserGroup holds the `app.grant_access` permission. Create one before approving anyone: approval needs a group to attach.",
    "No exposed params to configure.": "No exposed params to configure.",
    "No graph packages yet.": "No graph packages yet.",
    "No graphs yet. Create one to chain events to responses visually.": "No graphs yet. Create one to chain events to responses visually.",
    "No keywords configured on this property yet.": "No keywords configured on this property yet.",
    "No keywords yet. Create one to have the bot react to phrases in chat.": "No keywords yet. Create one to have the bot react to phrases in chat.",
    "No matches.": "No matches.",
    "No media found.": "No media found.",
    "No members yet.": "No members yet.",
    "No pending event registration found.": "No pending event registration found.",
    "No permissions available. Install extensions to get permissions.": "No permissions available. Install extensions to get permissions.",
    "No published graphs yet.": "No published graphs yet.",
    "No quotes match your filter.": "No quotes match your filter.",
    "No quotes yet. Mods can capture one in chat with the Add command.": "No quotes yet. Mods can capture one in chat with the Add command.",
    "No resources to configure.": "No resources to configure.",
    "No rewards match the filter.": "No rewards match the filter.",
    "No rewards yet. Click \"Sync now\" to import existing Twitch rewards, or create a new one.": "No rewards yet. Click \"Sync now\" to import existing Twitch rewards, or create a new one.",
    "No roles yet. Create one to grant extension permissions to your editors.": "No roles yet. Create one to grant extension permissions to your editors.",
    "No scopes required": "No scopes required",
    "No tags yet — create one below.": "No tags yet: create one below.",
    "No tags yet.": "No tags yet.",
    "No top-level commands available to link. All your existing commands are already linked or aliases.": "No top-level commands available to link. All your existing commands are already linked or aliases.",
    "No trace entries — graph had no executable path from the trigger.": "No trace entries: graph had no executable path from the trigger.",
    "No triggers match the current filter.": "No triggers match the current filter.",
    "No user groups defined yet.": "No user groups defined yet.",
    "No versions published yet.": "No versions published yet.",
    "No waitlist requests yet.": "No waitlist requests yet.",
    "Node": "Node",
    "Not linked": "Not linked",
    "OK": "OK",
    "On the waitlist": "On the waitlist",
    "One event. As many actions as you need.": "One event. As many actions as you need.",
    "One header per line, name and value separated by a colon.": "One header per line, name and value separated by a colon.",
    "Only continue if you actually intend to give this channel chat-write access via your Twitch account. If you weren't expecting this prompt, close this tab — your account stays untouched.": "Only continue if you actually intend to give this channel chat-write access via your Twitch account. If you weren't expecting this prompt, close this tab: your account stays untouched.",
    "Only while live": "Only while live",
    "Only while offline": "Only while offline",
    "Open": "Open",
    "Open Property": "Open Property",
    "Open graph": "Open graph",
    "Open in :owner": "Open in :owner",
    "Open in Editor": "Open in Editor",
    "Open this link in a private browser window where you are logged into your bot's Twitch account. It's single-use and expires in 15 minutes.": "Open this link in a private browser window where you are logged into your bot's Twitch account. It's single-use and expires in 15 minutes.",
    "Optional. Up to 200 characters — shown above the redeem button on Twitch.": "Optional. Up to 200 characters, shown above the redeem button on Twitch.",
    "Options": "Options",
    "Outputs": "Outputs",
    "Override active": "Override active",
    "Page :current of :last (:total entries)": "Page :current of :last (:total entries)",
    "Paste the share code you received from the graph's author.": "Paste the share code you received from the graph's author.",
    "Patch": "Patch",
    "Path (e.g. data.email)": "Path (e.g. data.email)",
    "Paused": "Paused",
    "Paused rewards stay visible but cannot be redeemed.": "Paused rewards stay visible but cannot be redeemed.",
    "Pending review": "Pending review",
    "Pending verification link": "Pending verification link",
    "Per-user cooldown (s)": "Per-user cooldown (s)",
    "Permission": "Permission",
    "Permissions": "Permissions",
    "Permissions Twitch will request": "Permissions Twitch will request",
    "Persistent": "Persistent",
    "Phrase": "Phrase",
    "Phrases": "Phrases",
    "Pick a trigger first.": "Pick a trigger first.",
    "Pick a trigger to configure the test-run.": "Pick a trigger to configure the test-run.",
    "Pick existing": "Pick existing",
    "Pick the events you want to react to. Provider scopes are batched into a single sign-in per provider; events from different providers go through separate sign-ins.": "Pick the events you want to react to. Provider scopes are batched into a single sign-in per provider; events from different providers go through separate sign-ins.",
    "Pin IDs must start with a lowercase letter and contain only lowercase letters, digits, and underscores.": "Pin IDs must start with a lowercase letter and contain only lowercase letters, digits, and underscores.",
    "Pin signature exposed as data ports on Fire / Trigger nodes.": "Pin signature exposed as data ports on Fire / Trigger nodes.",
    "Pins": "Pins",
    "Plain text or JSON. {variable.name} placeholders are substituted at fire time. Limited to 1MB.": "Plain text or JSON. {variable.name} placeholders are substituted at fire time. Limited to 1MB.",
    "Platform foundation": "Platform foundation",
    "Play audio": "Play audio",
    "Preferred default sender — click to clear": "Preferred default sender, click to clear",
    "Premium tier — unlimited category-bound rewards.": "Premium tier: unlimited category-bound rewards.",
    "Primary connections cannot be removed here.": "Primary connections cannot be removed here.",
    "Profile": "Profile",
    "Profile Settings": "Profile Settings",
    "Promote to Marketplace": "Promote to Marketplace",
    "Prompt": "Prompt",
    "Public": "Public",
    "Publish": "Publish",
    "Publish New Version": "Publish New Version",
    "Publish failed.": "Publish failed.",
    "Publish to the Graph Marketplace.": "Publish to the Graph Marketplace.",
    "Quick Share": "Quick Share",
    "Quota full": "Quota full",
    "Quote #:n deleted": "Quote #:n deleted",
    "Quote :slot command removed": "Quote :slot command removed",
    "Quote :slot command saved": "Quote :slot command saved",
    "Quote Settings": "Quote Settings",
    "Quote list": "Quote list",
    "Quotes": "Quotes",
    "Read chat messages": "Read chat messages",
    "Re-run": "Re-run",
    "Receive new followers": "Receive new followers",
    "Redeem": "Redeem",
    "Re-Enable": "Re-Enable",
    "Register 1 event": "Register 1 event",
    "Registered": "Registered",
    "Registration failed: :reason": "Registration failed: :reason",
    "Reject": "Reject",
    "Rejected": "Rejected",
    "Rejected :email": "Rejected :email",
    "Reject…": "Reject…",
    "Remove": "Remove",
    "Remove alias :keyword": "Remove alias :keyword",
    "Remove pin": "Remove pin",
    "Remove this action": "Remove this action",
    "Remove this action?": "Remove this action?",
    "Remove this step": "Remove this step",
    "Remove this bot? The Twitch token will be revoked.": "Remove this bot? The Twitch token will be revoked.",
    "Remove this command? The auto-generated graph drops with it; the underlying chat command stays only if it was already yours before.": "Remove this command? The auto-generated graph drops with it; the underlying chat command stays only if it was already yours before.",
    "Rename": "Rename",
    "Rename alias :keyword": "Rename alias :keyword",
    "Replaces the text of an existing quote without changing its number, category, or timestamp.": "Replaces the text of an existing quote without changing its number, category, or timestamp.",
    "Requested scopes:": "Requested scopes:",
    "Require user input": "Require user input",
    "Required scopes": "Required scopes",
    "Requirements": "Requirements",
    "Requires stream.online / stream.offline events registered on this property, otherwise this filter blocks every trigger.": "Requires stream.online / stream.offline events registered on this property, otherwise this filter blocks every trigger.",
    "Reset override": "Reset override",
    "Resource refs are always exposed on import": "Resource refs are always exposed on import",
    "Response": "Response",
    "Response template": "Response template",
    "Returns a random quote when typed bare; with a number, returns that specific quote.": "Returns a random quote when typed bare; with a number, returns that specific quote.",
    "Returns a random text from a list": "Returns a random text from a list",
    "Returns the command trigger (what the user typed after !).": "Returns the command trigger (what the user typed after !).",
    "Returns the matched phrase.": "Returns the matched phrase.",
    "Returns the target ID": "Returns the target ID",
    "Returns the target channel name": "Returns the target channel name",
    "Returns the target followage. The format can be changed after selection.": "Returns the target followage. The format can be changed after selection.",
    "Returns the target name": "Returns the target name",
    "Returns the user ID": "Returns the user ID",
    "Returns the user channel name": "Returns the user channel name",
    "Returns the user followage. The format can be changed after selection.": "Returns the user followage. The format can be changed after selection.",
    "Returns the user name": "Returns the user name",
    "Review & install": "Review & install",
    "Review the consent details in the modal. Close to cancel.": "Review the consent details in the modal. Close to cancel.",
    "Reward": "Reward",
    "Reward Tag": "Reward Tag",
    "Rewards": "Rewards",
    "Rewards Settings": "Rewards Settings",
    "Role": "Role",
    "Role :role created": "Role :role created",
    "Role :role deleted": "Role :role deleted",
    "Role :role updated": "Role :role updated",
    "Role Name": "Role Name",
    "Role Settings": "Role Settings",
    "Role Type": "Role Type",
    "Roles": "Roles",
    "Roles & Moderators": "Roles & Moderators",
    "Run": "Run",
    "Run finished in :ms ms": "Run finished in :ms ms",
    "Save": "Save",
    "Save (Ctrl+S)": "Save (Ctrl+S)",
    "Save Command": "Save Command",
    "Save Keyword": "Save Keyword",
    "Save Reward": "Save Reward",
    "Save alias": "Save alias",
    "Save command": "Save command",
    "Save failed.": "Save failed.",
    "Save keyword": "Save keyword",
    "Search Twitch categories…": "Search Twitch categories…",
    "Search by Twitch username…": "Search by Twitch username…",
    "Search for variables (Ctrl + K)": "Search for variables (Ctrl + K)",
    "Search rewards…": "Search rewards…",
    "Search triggers": "Search triggers",
    "Search user…": "Search user…",
    "Search…": "Search…",
    "See how it works": "See how it works",
    "Select events": "Select events",
    "Sender account": "Sender account",
    "Sender account is missing the user:write:chat scope.": "Sender account is missing the user:write:chat scope.",
    "Sender account not found or not owned by this property.": "Sender account not found or not owned by this property.",
    "Server misconfigured": "Server misconfigured",
    "Settings": "Settings",
    "Share": "Share",
    "Share code": "Share code",
    "Share this graph": "Share this graph",
    "Shared graph": "Shared graph",
    "widgets.consent.badges.label": "Show badge images from Twitch",
    "Show command": "Show command",
    "widgets.consent.emotes.label": "Show emote images from Twitch",
    "Sign out": "Sign out",
    "Size": "Size",
    "Skip this version": "Skip this version",
    "Something went wrong.": "Something went wrong.",
    "Source Graph": "Source Graph",
    "Specific viewers": "Specific viewers",
    "Stream State": "Stream State",
    "Stream state": "Stream state",
    "extensions.rewards.config_title": "Streambridge configuration",
    "marketing.waitlist.alpha_intro": "Streambridge is in closed alpha. Hit the button below: you'll sign in with Twitch so we can capture your email, and we'll let you know by mail the moment you're approved.",
    "widgets.consent.badges.description": "The widget loads badge images directly from Twitch's image server.",
    "widgets.consent.emotes.description": "The widget loads emote images directly from Twitch's image server.",
    "widgets.consent.media_remote.label": "Shows images and videos from the internet in the overlay",
    "widgets.consent.media_remote.description": "Compositions can show images, videos and sounds loaded from a web address. The host that serves them sees the IP address of your browsersource.",
    "widgets.consent.media_remote.example": "A follow alert shows the avatar of the person who followed.",
    "widgets.consent.fonts.label": "Load fonts from external hosts",
    "widgets.consent.fonts.description": "The widget loads fonts and font stylesheets from external servers. Those servers see the IP address of your browsersource.",
    "widgets.consent.fonts.example": "A headline displayed in a Google Font.",
    "widgets.consent.gifs.label": "Show GIFs from GIPHY",
    "widgets.consent.gifs.description": "The widget loads GIFs posted in chat directly from GIPHY. GIPHY sees the IP address of your browsersource.",
    "widgets.consent.gifs.example": "A GIF posted in chat shows up in the chatbox.",
    "widgets.consent.cheermotes.label": "Show cheermote images from Twitch",
    "widgets.consent.cheermotes.description": "The widget loads cheermote images directly from Twitch's image server.",
    "widgets.consent.cheermotes.example": "A Cheer100 in chat shows up as the animated cheermote in the chatbox.",
    "widgets.consent.emotes_bttv.label": "Show emotes from BetterTTV",
    "widgets.consent.emotes_bttv.description": "The widget loads BetterTTV emotes typed in chat directly from BetterTTV, a service outside Twitch. BetterTTV sees the IP address of your browsersource.",
    "widgets.consent.emotes_bttv.example": "Someone types the name of a BetterTTV emote in chat, and the chatbox shows its image.",
    "widgets.consent.emotes_7tv.label": "Show emotes from 7TV",
    "widgets.consent.emotes_7tv.description": "The widget loads 7TV emotes typed in chat directly from 7TV, a service outside Twitch. 7TV sees the IP address of your browsersource.",
    "widgets.consent.emotes_7tv.example": "Someone types the name of a 7TV emote in chat, and the chatbox shows its image.",
    "Subscribed because of installed extensions": "Subscribed because of installed extensions",
    "Sync now": "Sync now",
    "System": "System",
    "Tag label": "Tag label",
    "Tags": "Tags",
    "Tags are label + color pairs you can attach to rewards. They are property-scoped and used for filtering and visual grouping in the Rewards list.": "Tags are label + color pairs you can attach to rewards. They are property-scoped and used for filtering and visual grouping in the Rewards list.",
    "Tell us a little about your stream. We read every application.": "Tell us a little about your stream. We read every application.",
    "Test": "Test",
    "Test-Run": "Test-Run",
    "Test-Run panel": "Test-Run panel",
    "Test-run failed.": "Test-run failed.",
    "Thanks for signing up.": "Thanks for signing up.",
    "Thanks — you're on the list. We'll send an email to :email once your access is ready.": "Thanks. You're on the list. We'll send an email to :email once your access is ready.",
    "Thanks, :name.": "Thanks, :name.",
    "The Quote graph will fire alongside any existing actions on this command. Audience and cooldowns stay as the command already has them.": "The Quote graph will fire alongside any existing actions on this command. Audience and cooldowns stay as the command already has them.",
    "The auto-generated graph drops with it.": "The auto-generated graph drops with it.",
    "The bot verification flow is not fully configured on this server. Please contact the operator.": "The bot verification flow is not fully configured on this server. Please contact the operator.",
    "The following scopes were not granted: :missing. Please re-authorize and allow all requested permissions.": "The following scopes were not granted: :missing. Please re-authorize and allow all requested permissions.",
    "The key must start with a lowercase letter and contain only lowercase letters, digits, and underscores.": "The key must start with a lowercase letter and contain only lowercase letters, digits, and underscores.",
    "The parent command and its other aliases stay untouched.": "The parent command and its other aliases stay untouched.",
    "The phrase \":phrase\" is already used by another keyword.": "The phrase \":phrase\" is already used by another keyword.",
    "The verification link is invalid.": "The verification link is invalid.",
    "The visual editor isn't a gimmick. When your workflow spans four steps and two platforms, seeing it as a graph makes the difference between catching an error in 10 seconds or troubleshooting for an hour.": "The visual editor isn't a gimmick. When your workflow spans four steps and two platforms, seeing it as a graph makes the difference between catching an error in 10 seconds or troubleshooting for an hour.",
    "The widget can play audio clips inside the OBS browsersource.": "The widget can play audio clips inside the OBS browsersource.",
    "The widget is notified when someone follows your channel.": "The widget is notified when someone follows your channel.",
    "The widget loads data from external servers. Those servers see the IP address of your browsersource and can potentially track when your widget is active.": "The widget loads data from external servers. Those servers see the IP address of your browsersource and can potentially track when your widget is active.",
    "The widget receives every chat message — username, badges, emote positions — as it arrives in your chat.": "The widget receives every chat message (username, badges, emote positions) as it arrives in your chat.",
    "This Command is disabled — actions below stay configured but won't fire until you re-enable the Command.": "This Command is disabled: actions below stay configured but won't fire until you re-enable the Command.",
    "This extension is paused — changes are saved but won't run until you re-enable it.": "This extension is paused: changes are saved but won't run until you re-enable it.",
    "This Keyword is disabled — actions below stay configured but won't fire until you re-enable the Keyword.": "This Keyword is disabled: actions below stay configured but won't fire until you re-enable the Keyword.",
    "This Twitch event is not registered for this property — actions below stay configured but won't fire until you register the event.": "This Twitch event is not registered for this property: actions below stay configured but won't fire until you register the event.",
    "extensions.rewards.delete_managed_confirm": "This also removes the reward from Twitch when it is managed by Streambridge.",
    "This asset is used by scene :names — they will lose their background. Continue?": "This asset is used by scene :names — they will lose their background. Continue?",
    "This bot cannot be preferred — it lacks the user:write:chat scope.": "This bot cannot be preferred: it lacks the user:write:chat scope.",
    "events.consent.own_event": "This app's own event. It comes with the app and belongs to it.",
    "events.consent.undocumented": "This event is not yet documented. The Streambridge team is on it.",
    "This is a reboot of a platform that ran for eight years. The foundation is modern, event-driven, and built to scale. What you build here won't need to be rebuilt when your channel grows.": "This is a reboot of a platform that ran for eight years. The foundation is modern, event-driven, and built to scale. What you build here won't need to be rebuilt when your channel grows.",
    "This is your primary account": "This is your primary account",
    "This link expired. Ask the property owner to generate a new one.": "This link expired. Ask the property owner to generate a new one.",
    "This link has already been used.": "This link has already been used.",
    "This node has no editable parameters.": "This node has no editable parameters.",
    "widgets.consent.permission_undocumented": "This permission is not yet documented. The Streambridge team is on it.",
    "This property already has the maximum number of bot accounts.": "This property already has the maximum number of bot accounts.",
    "This property already has the maximum of :max bot accounts.": "This property already has the maximum of :max bot accounts.",
    "This removes the tag from all rewards that carry it. The rewards themselves stay.": "This removes the tag from all rewards that carry it. The rewards themselves stay.",
    "extensions.rewards.external_readonly": "This reward was created in the Twitch UI and is not managed by Streambridge. Edit it from your Twitch dashboard; this view is read-only.",
    "extensions.rewards.delete_managed_confirm_short": "This will also remove it from Twitch when managed by Streambridge.",
    "extensions.rewards.delete_confirm_title": "Delete reward?",
    "extensions.rewards.toggle_enabled_aria": "Enable :title",
    "extensions.rewards.meta_uses": ":count redemptions (7d)",
    "extensions.rewards.meta_last_used": "last redeemed :time",
    "extensions.rewards.meta_never_used": "never redeemed",
    "extensions.rewards.quick_action": "New reward",
    "extensions.rewards.settings_title": "Reward settings",
    "extensions.rewards.settings_saved": "Settings saved.",
    "extensions.rewards.automod_gate_section": "AutoMod check",
    "extensions.rewards.automod_gate_label": "Hold text redemptions until AutoMod has ruled",
    "extensions.rewards.automod_gate_help": "Redemptions that carry viewer text are held back until Twitch AutoMod has ruled on them. This delays every text redemption by about three seconds. A redemption AutoMod holds then waits for a moderator: approving it in Twitch releases it, possibly minutes later and out of context. Denying it, leaving it unruled, or ending your stream discards it: it never reaches your actions, overlays or activity feed. Redemptions without a text field are unaffected.",
    "extensions.rewards.automod_scope_missing": "This check needs a Twitch permission you have not granted yet. Until it is granted, switching the check on withholds every text redemption, including the clean ones.",
    "extensions.rewards.automod_scope_granted": "Twitch permission granted. The check has the signal it needs.",
    "extensions.rewards.automod_scope_grant": "Grant permission",
    "extensions.rewards.automod_scope_owner_hint": "Only the channel owner can grant this permission. Please ask them to sign in and complete the grant.",
    "Tier status": "Tier status",
    "Timer": "Timer",
    "Title": "Title",
    "Toggle": "Toggle",
    "Trace · :n entries": "Trace · :n entries",
    "Trigger": "Trigger",
    "Trigger anytime": "Trigger anytime",
    "Trigger is off.": "Trigger is off.",
    "Trigger on any Twitch event. Define exactly what happens in response. Configure conditions, cooldowns, and audience rules in one place — no YAML, no terminal, no deploy step. Save it and it runs.": "Trigger on any Twitch event. Define exactly what happens in response. Configure conditions, cooldowns, and audience rules in one place: no YAML, no terminal, no deploy step. Save it and it runs.",
    "Trigger:": "Trigger:",
    "Triggers": "Triggers",
    "Triggers:": "Triggers:",
    "Twitch authorization failed": "Twitch authorization failed",
    "Twitch badges": "Twitch badges",
    "Twitch events": "Twitch events",
    "Twitch global emotes shown alongside chat messages.": "Twitch global emotes shown alongside chat messages.",
    "Twitch rejected the authorization. Please try again.": "Twitch rejected the authorization. Please try again.",
    "Twitch returned without the expected parameters. Try again from the property owner's link.": "Twitch returned without the expected parameters. Try again from the property owner's link.",
    "Twitch scope:": "Twitch scope:",
    "Twitch subscriber badges in the chatbox widget.": "Twitch subscriber badges in the chatbox widget.",
    "Type": "Type",
    "Type the chat reply. Insert variables for runtime substitution.": "Type the chat reply. Insert variables for runtime substitution.",
    "URL": "URL",
    "Open app :name": "Open app :name",
    "Uninstall": "Uninstall",
    "Unregister": "Unregister",
    "Unregister failed: :err": "Unregister failed: :err",
    "Unregister this event from the property": "Unregister this event from the property",
    "Unsaved changes": "Unsaved changes",
    "Unsupported file type": "Unsupported file type",
    "Update": "Update",
    "Update Available": "Update Available",
    "Update available: v:v": "Update available: v:v",
    "Upload": "Upload",
    "Upload failed": "Upload failed",
    "Upload images, audio and video for your scenes and actions.": "Upload images, audio and video for your scenes and actions.",
    "Use \"Clear\" to fall back to the broadcaster.": "Use \"Clear\" to fall back to the broadcaster.",
    "Use existing": "Use existing",
    "Use the + Add button on the node to spawn another pin.": "Use the + Add button on the node to spawn another pin.",
    "Used by :ext": "Used by :ext",
    "Used by scenes": "Used by scenes",
    "User :user access has been granted": "User :user access has been granted",
    "User :user has been successfully updated": "User :user has been successfully updated",
    "User Group Name": "User Group Name",
    "User Groups": "User Groups",
    "User ID": "User ID",
    "User Information": "User Information",
    "User group :group created": "User group :group created",
    "User group :group deleted": "User group :group deleted",
    "User group :group disabled": "User group :group disabled",
    "User group :group enabled": "User group :group enabled",
    "User group :group updated": "User group :group updated",
    "UserGroups": "UserGroups",
    "Users": "Users",
    "Verification failed": "Verification failed",
    "Version": "Version",
    "Versions": "Versions",
    "Video": "Video",
    "Viewer groups": "Viewer groups",
    "Viewers must enter a text prompt when redeeming.": "Viewers must enter a text prompt when redeeming.",
    "Visit xeras.de": "Visit xeras.de",
    "Waitlist": "Waitlist",
    "Waitlist request is not pending.": "Waitlist request is not pending.",
    "We could not read your Twitch email — please try again and confirm the email scope.": "We could not read your Twitch email: please try again and confirm the email scope.",
    "We couldn't read the Twitch account that just authorized. Please try again.": "We couldn't read the Twitch account that just authorized. Please try again.",
    "We only ask for your Twitch email. No chat scopes, no channel access — that comes later when you're in.": "We only ask for your Twitch email. No chat scopes, no channel access: that comes later when you're in.",
    "We've received your request and are reviewing it. We read every application personally — you'll hear back via the email associated with your Twitch account when access is granted.": "We've received your request and are reviewing it. We read every application personally. You'll hear back via the email associated with your Twitch account when access is granted.",
    "auth.waitlist_email.heading": "Welcome to Streambridge",
    "What the widget is allowed to do": "What the widget is allowed to do",
    "What the widget reads": "What the widget reads",
    "When public is on, every property editor can use this extension. Otherwise access is granted via linked UserGroups (app-level) or property-level roles holding the permission above.": "When public is on, every property editor can use this extension. Otherwise access is granted via linked UserGroups (app-level) or property-level roles holding the permission above.",
    "When to trigger": "When to trigger",
    "Who changed what in this property, immutable history.": "Who changed what in this property, immutable history.",
    "Widget Event": "Widget Event",
    "Will be saved as:": "Will be saved as:",
    "Word boundary — exact phrase": "Word boundary: exact phrase",
    "Yes": "Yes",
    "You are about to link your currently signed-in Twitch account as a bot for the following channel:": "You are about to link your currently signed-in Twitch account as a bot for the following channel:",
    "You are acting as admin in :name (:login). All mutations are logged.": "You are acting as admin in :name (:login). All mutations are logged.",
    "You will be redirected to :provider to grant: ": "You will be redirected to :provider to grant: ",
    "You're authorizing your own streamer account. Bots must be a different Twitch account — use the sender dropdown in Commands/Keywords for primary-account responses.": "You're authorizing your own streamer account. Bots must be a different Twitch account: use the sender dropdown in Commands/Keywords for primary-account responses.",
    "You're in. Check your inbox or log in directly to get started.": "You're in. Check your inbox or log in directly to get started.",
    "You're on the list": "You're on the list",
    "You've used the alternatives.": "You've used the alternatives.",
    "auth.waitlist_email.subject": "Your Streambridge access is ready",
    "Your application wasn't approved this time.": "Your application wasn't approved this time.",
    "Your current settings will be preserved.": "Your current settings will be preserved.",
    "Your personal account — notifications, theme, connections.": "Your personal account: notifications, theme, connections.",
    "Your rules.": "Your rules.",
    "Your stream,": "Your stream,",
    "auth.waitlist_email.body": "Your waitlist request has been approved. You can log in with Twitch and start using Streambridge.",
    "Your workflow runs immediately.": "Your workflow runs immediately.",
    "actions": "actions",
    "alias": "alias",
    "alias of !:keyword": "alias of !:keyword",
    "alias of !:parent": "alias of !:parent",
    "applied": "applied",
    "attached": "attached",
    "automated.": "automated.",
    "by": "by",
    "case-sensitive": "case-sensitive",
    "category unknown": "category unknown",
    "centered on canvas": "centered on canvas",
    "common.back": "Back",
    "common.cancel": "Cancel",
    "common.continue": "Continue",
    "common.done": "Done",
    "common.next": "Next",
    "common.save": "Save",
    "consent.graphs.creates_label": "Creates",
    "consent.graphs.outbound_label": "Sends HTTP requests to",
    "consent.graphs.scopes_label": "Twitch permissions",
    "consent.graphs.scopes_missing_hint": "Highlighted permissions are not granted yet. The parts of this app that need them wait and start on their own once you grant them.",
    "consent.graphs.triggers_label": "Reacts to",
    "consent.section.compositions.elements": "[0,1] :count element|[2,*] :count elements",
    "consent.section.compositions.hosts_label": "Loads media from",
    "consent.section.compositions.platform_note": "Twitch images and your uploads",
    "consent.section.compositions.sound_hint": "Plays sound",
    "consent.section.compositions.title": "Bundled compositions",
    "consent.section.compositions.variants": "[0,1] :count variant|[2,*] :count variants",
    "consent.section.graphs.title": "What it reacts to",
    "consent.section.resources.title": "Resources to be created / used",
    "contains": "contains",
    "copied": "copied",
    "copy": "copy",
    "disabled": "disabled",
    "dry-run": "dry-run",
    "e.g. Soundalert": "e.g. Soundalert",
    "e.g. hello": "e.g. hello",
    "events.register.count": "[0,1] Register :count event|[2,*] Register :count events",
    "events.registered.count": "{0} no events|[1,1] :count event|[2,*] :count events",
    "events.automations.advanced_flow": "When :verb → advanced flow",
    "events.automations.advanced": "advanced flow",
    "events.automations.new": "New automation",
    "events.automations.no_match": "No automations match your search.",
    "events.automations.off": "off",
    "events.automations.paused_own_flows": "Automations are paused: your own flows don't run until you switch them back on. An installed package keeps running; you switch it off on its page in your library.",
    "events.automations.reaction_one": "reaction",
    "events.automations.reaction_other": "reactions",
    "events.automations.search": "Search automations",
    "events.automations.sentence": "When :verb → :reactions",
    "events.automations.sort_alpha": "A-Z",
    "events.automations.sort_recent": "Recently edited",
    "events.automations.sort_trigger": "By trigger",
    "events.automations.title": "Automations",
    "events.verb.follow": "someone follows",
    "events.verb.subscribe": "someone subscribes",
    "events.verb.resub": "someone shares a resub",
    "events.verb.gift_sub": "someone gifts subs",
    "events.verb.cheer": "someone cheers bits",
    "events.verb.raid": "someone raids the channel",
    "events.verb.raid_outgoing": "the channel raids another channel",
    "events.verb.hype_train_begin": "a hype train starts",
    "events.verb.watch_streak": "a viewer shares a watch streak",
    "events.verb.first_appearance": "appears for the first time",
    "events.verb.stream_online": "the stream goes live",
    "events.verb.hype_train_end": "a hype train ends",
    "events.verb.stream_offline": "the stream goes offline",
    "events.verb.shoutout_receive": "you receive a shoutout",
    "events.verb.charity_donate": "someone donates to your charity",
    "events.verb.goal_begin": "a goal starts",
    "events.verb.poll_begin": "a poll starts",
    "events.verb.prediction_begin": "a prediction starts",
    "events.verb.ad_break_begin": "an ad break starts",
    "events.verb.chat_send": "Send a chat message",
    "events.verb.chat_announce": "Send an announcement",
    "events.verb.chat_shoutout": "Shout out a user",
    "events.verb.sound_play": "Play a sound",
    "events.verb.tts_speak": "Read it aloud",
    "events.verb.http_request": "Make an HTTP request",
    "events.verb.set_title": "Set the stream title",
    "events.verb.set_category": "Set the stream category",
    "events.verb.add_marker": "Add a stream marker",
    "events.verb.create_clip": "Create a clip",
    "events.preset.welcome_followers.title": "Welcome followers",
    "events.preset.welcome_followers.text": "Welcome {user.name}! 💜",
    "events.preset.thank_subs.title": "Thank subscribers",
    "events.preset.thank_subs.text": "Thanks for subscribing, {user.name}!",
    "events.preset.shoutout_raiders.title": "Shout out raiders",
    "events.preset.reward_watch_streaks.title": "Reward watch streaks",
    "events.preset.reward_watch_streaks.text": "{user.name} is on a watch streak! 🔥",
    "events.subscriptions.title": "Subscriptions & scopes",
    "events.connection_warning": "Removing pins may break connections; deleting the event is blocked while it's still connected.",
    "extensions.common.enabled": "Enabled",
    "extensions.common.count_active": ":count :noun · :active active",
    "extensions.common.count_only": ":count :noun",
    "extensions.common.actions_menu": "Actions",
    "extensions.common.delete": "Delete",
    "extensions.common.delete_confirm_title": "Delete this item?",
    "extensions.common.edit": "Edit",
    "extensions.common.copy_url": "Copy URL",
    "extensions.common.rotate_token": "Rotate token",
    "extensions.common.open_editor": "Open editor",
    "extensions.common.settings": "Settings",
    "extensions.common.reset_override": "Reset override",
    "extensions.common.search": "Search…",
    "extensions.common.filter_all": "All",
    "extensions.common.filter_active": "Active",
    "extensions.common.filter_paused": "Paused",
    "extensions.warning.missing_scope": "Missing Twitch scope: :scope",
    "extensions.widgets.delete_confirm_title": "Delete scene :name?",
    "extensions.widgets.delete_confirm_message": "Active OBS browsersources for this scene will be disconnected. Widgets inside the scene are deleted with it.",
    "extensions.widgets.no_match": "No scenes match your filter.",
    "extensions.widgets.empty": "No scenes yet. Create one to compose Chatbox and your alerts into a Browsersource for OBS.",
    "extensions.actions.count": ":count action|:count actions",
    "extensions.actions.reorder_hint": "Reorder by drag & drop",
    "extensions.actions.search_placeholder": "Search actions…",
    "extensions.actions.no_match": "No actions match “:query”.",
    "extensions.commands.new_command": "New Command",
    "extensions.commands.search_placeholder": "Search commands…",
    "extensions.commands.filter_all": "All",
    "extensions.commands.filter_active": "Active",
    "extensions.commands.filter_paused": "Paused",
    "extensions.commands.status_paused": "Paused",
    "extensions.commands.audience_restricted": "Restricted",
    "extensions.commands.from_app": "From :name",
    "extensions.commands.meta_actions_one": ":count action",
    "extensions.commands.meta_actions_other": ":count actions",
    "extensions.commands.meta_uses": ":count uses (7d)",
    "extensions.commands.meta_last_used": "last used :time",
    "extensions.commands.meta_never_used": "never used",
    "extensions.commands.no_filter_results": "No commands match the filter.",
    "extensions.commands.more_actions": "More",
    "extensions.commands.add_alias": "Add alias",
    "extensions.commands.toggle_enabled_aria": "Toggle !:keyword",
    "extensions.commands.edit_aria": "Edit command !:keyword",
    "extensions.commands.delete_confirm_title": "Delete !:keyword?",
    "extensions.commands.delete_confirm_message": "The command and its actions are removed for good.",
    "extensions.commands.flash_enabled": "!:keyword enabled",
    "extensions.commands.flash_disabled": "!:keyword paused",
    "extensions.commands.alias_taken": "The alias !:keyword is already taken.",
    "extensions.commands.gates_title": "Conditions",
    "extensions.commands.gates_help": "Extra checks that must pass before this command runs. A failed condition blocks the command without using up its cooldown.",
    "extensions.commands.gates_empty": "No conditions: runs for anyone, anytime.",
    "extensions.commands.gates_add": "Add condition",
    "extensions.commands.gate_unavailable": "Extension not installed",
    "extensions.commands.gates_response_add": "Reply when blocked",
    "extensions.commands.gates_response_label": "Reply when blocked",
    "extensions.commands.gates_response_remove": "Remove reply",
    "extensions.commands.form.basics": "Basics",
    "extensions.commands.form.keyword_label": "Keyword",
    "extensions.commands.form.keyword_placeholder": "e.g. hello",
    "extensions.commands.form.keyword_help": "Viewers trigger the command with !:keyword in chat.",
    "extensions.commands.form.aliases_label": "Aliases",
    "extensions.commands.form.aliases_placeholder": "e.g. a, alt",
    "extensions.commands.form.aliases_help": "Enter or comma separates multiple aliases.",
    "extensions.commands.form.audience": "Audience",
    "extensions.commands.form.cooldowns": "Cooldowns",
    "extensions.commands.form.channel_cooldown": "Channel cooldown",
    "extensions.commands.form.channel_cooldown_help": "Pause for the whole channel after each call.",
    "extensions.commands.form.channel_cooldown_placeholder": "no cooldown",
    "extensions.commands.form.user_cooldown": "Per-viewer cooldown",
    "extensions.commands.form.user_cooldown_help": "0 or empty: no per-viewer cooldown.",
    "extensions.commands.form.cooldown_suffix": "Sec.",
    "extensions.commands.gate_orphaned_health": ":count command(s) use a condition from an uninstalled extension. They are blocked until you remove the condition or reinstall the extension.",
    "extensions.commands.quick_action": "New command",
    "extensions.command_slots.title": "Command slots",
    "extensions.counters.delete_confirm_title": "Delete counter :name?",
    "extensions.counters.delete_confirm_message": "The current value and history are gone for good. Graphs that read or write this counter keep working but will fall back to the default.",
    "extensions.counters.no_match": "No counters match your filter.",
    "extensions.counters.quick_action": "New counter",
    "extensions.keywords.meta_uses": ":count matches (7d)",
    "extensions.keywords.meta_last_used": "last match :time",
    "extensions.keywords.meta_never_used": "never matched",
    "extensions.keywords.delete_confirm_title": "Delete keyword :phrase?",
    "extensions.keywords.delete_confirm_message": "The auto-generated graph drops with it.",
    "extensions.keywords.no_match": "No keywords match your filter.",
    "extensions.keywords.no_action": "no action",
    "extensions.keywords.toggle_enabled_aria": "Toggle keyword :phrase",
    "extensions.keywords.edit_aria": "Edit keyword :phrase",
    "extensions.keywords.quick_action": "New keyword",
    "extensions.scenes.quick_action": "New scene",
    "extensions.compositions.quick_action": "New composition",
    "extensions.events.quick_action": "New automation",
    "extensions.graph.description": "Build visual workflows that connect events to actions.",
    "extensions.graph.name": "Event Flows",
    "extensions.graph.permission.access.description": "Flow list and read-only canvas view.",
    "extensions.graph.permission.access.label": "View flows",
    "extensions.graph.permission.configure.description": "Linked-flow Configure tab.",
    "extensions.graph.permission.configure.label": "Configure flows",
    "extensions.graph.permission.delete.description": "Remove flows from the property.",
    "extensions.graph.permission.delete.label": "Delete flows",
    "extensions.graph.permission.edit.description": "Create flows, edit, run test, restore versions.",
    "extensions.graph.permission.edit.label": "Edit flows",
    "extensions.graph.permission.import.description": "Install marketplace flows or share links.",
    "extensions.graph.permission.import.label": "Import flows",
    "extensions.graph.permission.publish.description": "Submit a flow to the marketplace as a builder.",
    "extensions.graph.permission.publish.label": "Publish flows",
    "extensions.graph.permission.share.description": "Generate a share link to a flow.",
    "extensions.graph.permission.share.label": "Share flows",
    "extensions.graph.quick_action": "New flow",
    "extensions.mod.action_ban": "Ban",
    "extensions.mod.action_delete": "Delete message",
    "extensions.mod.action_timeout": "Timeout",
    "extensions.mod.action_warning": "Warning",
    "extensions.mod.action_what_happens": "What happens",
    "extensions.mod.echo_reason": "Echo reason in chat",
    "extensions.mod.escalation_add_step": "Add step",
    "extensions.mod.escalation_hint": "The last step applies to every further violation.",
    "extensions.mod.escalation_title": "Escalation",
    "extensions.mod.module_rows_incomplete": "Module rows incomplete (:n of :total). Uninstall and reinstall the app to seed them again.",
    "extensions.mod.reason_label": "Reason",
    "extensions.mod.strike_window_help": "How long a strike counts toward escalating to the next step.",
    "extensions.mod.timeout_duration": "Timeout duration (s)",
    "extensions.mod.violation_nth": "Violation :n",
    "expired": "expired",
    "founder": "founder",
    "global": "global",
    "graph #:id": "graph #:id",
    "graphs.usage_count": "{0} Not used in any graph|[1,1] Used in :count graph|[2,*] Used in :count graphs",
    "linked": "linked",
    "managed": "managed",
    "more": "more",
    "next:": "next:",
    "no cooldown": "no cooldown",
    "nodes": "nodes",
    "none": "none",
    "not registered": "not registered",
    "or drop files here": "or drop files here",
    "owned": "owned",
    "per user": "per user",
    "permissions": "permissions",
    "property": "property",
    "real-run": "real-run",
    "reset": "reset",
    "scopes": "scopes",
    "t+ms": "t+ms",
    "trace entries": "trace entries",
    "trigger off": "trigger off",
    "users": "users",
    "via Import-Link": "via Import-Link",
    "with care by Xeras": "with care by Xeras",
    "word boundary": "word boundary",
    "— pick a command —": "– pick a command –",
    "— pick a keyword —": "– pick a keyword –",
    "— pick a trigger —": "– pick a trigger –",
    "— pick an event —": "– pick an event –",
    "— select —": "– select –",
    "— standalone command —": "– standalone command –",
    "extensions.loyalty.import.error_active": "An import is already in progress for this property. Apply or discard it first.",
    "extensions.loyalty.import.error_not_staged": "This import is not ready to apply.",
    "extensions.loyalty.import.title": "Import / Migration",
    "extensions.loyalty.import.description": "Import viewer points and watchtime from another bot's export. Logins are matched to Twitch accounts; unmatched and bot rows are skipped.",
    "extensions.loyalty.import.source_format": "Source",
    "extensions.loyalty.import.file": "Export file (CSV)",
    "extensions.loyalty.import.min_points": "Minimum points",
    "extensions.loyalty.import.min_hours": "Minimum hours",
    "extensions.loyalty.import.run": "Start import",
    "extensions.loyalty.import.apply": "Apply",
    "extensions.loyalty.import.discard": "Discard",
    "extensions.loyalty.import.working": "Working …",
    "extensions.loyalty.import.uploading": "Uploading …",
    "extensions.loyalty.import.parsed": "Rows parsed",
    "extensions.loyalty.import.resolved": "Matched",
    "extensions.loyalty.import.bots": "Bots skipped",
    "extensions.loyalty.import.unresolved": "Not matched",
    "extensions.loyalty.import.will_import": "Will import",
    "extensions.loyalty.import.unresolved_list": "Show unmatched logins",
    "extensions.loyalty.import.confirm_apply": "This overwrites existing balances for :count viewers. Continue?",
    "extensions.loyalty.import.applied": "Import applied: :count viewers updated.",
    "extensions.loyalty.import.failed": "Import failed.",
    "extensions.loyalty.milestones_placeholder": "e.g. 1000",
    "extensions.loyalty.var_balance": "Balance",
    "extensions.loyalty.var_watchtime": "Watchtime",
    "extensions.loyalty.var_rank": "Rank",
    "extensions.loyalty.var_chat_messages": "Chat Messages",
    "extensions.loyalty.var_chat_words": "Chat Words",
    "extensions.loyalty.var_chat_emotes": "Chat Emotes",
    "extensions.loyalty.var_currency_name": "Currency Name",
    "extensions.loyalty.var_currency_icon": "Currency Icon",
    "extensions.loyalty.hide_bots": "Hide bots",
    "extensions.quotes.flash.created": "Quote #:n created.",
    "extensions.quotes.flash.updated": "Quote #:n updated.",
    "extensions.quotes.form.add_title": "Add quote",
    "extensions.quotes.form.category_help": "Optional. Searched from Twitch categories.",
    "extensions.quotes.form.category_label": "Category",
    "extensions.quotes.form.date_label": "Date",
    "extensions.quotes.form.edit_title": "Edit quote #:n",
    "extensions.quotes.form.save": "Save",
    "extensions.quotes.form.text_label": "Text",
    "extensions.quotes.index.add": "Add quote",
    "extensions.quotes.index.edit": "Edit",
    "extensions.quotes.index.edit_aria": "Edit quote #:n",
    "extensions.quotes.index.empty": "No quotes yet. Add one with “Add quote”, or let mods capture them in chat.",
    "extensions.quotes.delete_confirm_title": "Delete quote #:n?",
    "extensions.quotes.delete_confirm_message": "This cannot be undone. The number stays retired and won't be reused.",
    "extensions.quotes.no_match": "No quotes match your filter.",
    "extensions.quotes.filter_placeholder": "Filter by number, text, or category…",
    "extensions.quotes.quick_action": "New quote",
    "extensions.timers.rotation.mode_single": "Single",
    "extensions.timers.rotation.mode_rotation": "Rotation",
    "extensions.timers.rotation.add_entry": "Rotation entry",
    "extensions.timers.rotation.entry_default_name": "Rotation :n",
    "extensions.timers.rotation.entries_count": ":n of :max",
    "extensions.timers.rotation.switch_back_blocked": "Switching back to Single needs exactly one rotation entry. Delete the other entries first.",
    "extensions.timers.rotation.delete_entry_title": "Delete rotation entry :name?",
    "extensions.timers.rotation.delete_entry_message": "Its attached actions drop with it on save.",
    "extensions.timers.rotation.delete_entry_confirm": "Delete entry",
    "extensions.timers.rotation.linked_graphs_note": "Linked graphs keep running on every interval, independent of the rotation.",
    "extensions.timers.rotation.mode_label": "Mode",
    "extensions.timers.rotation.list_badge": "Rotation · :n",
    "extensions.timers.meta_uses": ":count fires (7d)",
    "extensions.timers.meta_last_used": "last fired :time",
    "extensions.timers.meta_never_used": "never fired",
    "extensions.timers.delete_confirm_title": "Delete timer :name?",
    "extensions.timers.delete_confirm_message": "The schedule and any auto-generated chat reply graph drop with it.",
    "extensions.timers.no_match": "No timers match your filter.",
    "extensions.timers.toggle_enabled_aria": "Toggle timer :name",
    "extensions.timers.mode.label": "Timer type",
    "extensions.timers.mode.interval": "Recurring",
    "extensions.timers.mode.oneshot": "Countdown (one time)",
    "extensions.timers.oneshot.duration_label": "Duration (seconds)",
    "extensions.timers.oneshot.duration_help": "Length of the countdown. Start, pause, resume, stop and reset it from your flows with the Timer actions.",
    "extensions.timers.oneshot.modal_readonly_help": "Change the duration on the Timers page.",
    "extensions.timers.oneshot.chip": "Countdown",
    "extensions.timers.quick_action": "New timer",
    "graphs.format.duration.name": "Duration",
    "graphs.format.duration.preset.compact": "Compact (3h 24m)",
    "graphs.format.duration.preset.long": "Long (3 hours 24 minutes)",
    "graphs.format.duration.preset.clock": "Clock (1:23:45)",
    "graphs.format.date.name": "Date",
    "graphs.format.date.preset.short": "Short date (30.05.2026)",
    "graphs.format.date.preset.long": "Long date (30 May 2026)",
    "graphs.format.date.preset.datetime": "Date and time (UTC)",
    "graphs.format.date.preset.relative": "Relative (3 days ago)",
    "graphs.format.date.preset.elapsed": "Elapsed (4 weeks)",
    "graphs.format.date.preset.uptime": "Uptime (3 hours 24 minutes)",
    "graphs.format.date.input.auto": "Auto detect",
    "graphs.format.date.input.iso": "ISO 8601 string",
    "graphs.format.date.input.unix_s": "Unix timestamp (seconds)",
    "graphs.format.date.input.unix_ms": "Unix timestamp (milliseconds)",
    "graphs.format.formatter_label": "Format",
    "graphs.format.preset_label": "Preset",
    "graphs.format.input_label": "Input value",
    "graphs.format.none": "None",
    "graphs.format.raw": "Raw",
    "graphs.format.preview_label": "Preview",
    "connections.surface.title": "Sender & Connections",
    "connections.surface.subtitle": "Who writes to and moderates your channel.",
    "connections.surface.card_label": "Sender & Connections",
    "connections.surface.card_description": "Choose who Streambridge talks to chat as: your account, the shared Cloud Bot, or your own bot.",
    "connections.banner.title": "No chat-capable account connected yet",
    "connections.banner.body": "Streambridge needs a sender before it can write to your chat. Easiest: the shared Streambridge Cloud Bot, you just give it /mod.",
    "connections.banner.cta_cloud": "Use the Streambridge Cloud Bot",
    "connections.banner.manage": "or manage your connections here",
    "connections.banner.owner_hint": "Only the property owner can set this up, please ask them.",
    "connections.own.title": "Your account",
    "connections.own.emote_hint": "sends with your own emotes",
    "connections.own.grant": "Grant permissions",
    "connections.own.grant_chat": "Chat",
    "connections.own.grant_moderation": "Moderation",
    "connections.own.grant_broadcaster": "Broadcaster (title, category, ads)",
    "connections.cloud.title": "Streambridge Cloud Bot",
    "connections.cloud.subtitle": "shared bot, no permissions of your own needed",
    "connections.cloud.use": "Use Cloud Bot",
    "connections.cloud.mod_command_help": "in your chat, then check the status.",
    "connections.cloud.mod_copy": "Copy command",
    "connections.cloud.mod_copied": "Copied!",
    "connections.cloud.mod_check": "Check /mod status",
    "connections.cloud.not_provisioned": "The Cloud Bot is not available on this server yet.",
    "connections.cloud.stop": "Stop using",
    "connections.custom.title": "Your own bot",
    "connections.custom.empty": "Link your own bot account through a one-time link.",
    "connections.custom.add": "Add custom bot",
    "connections.custom.unlink": "Unlink",
    "connections.custom.linked_at": "linked :date",
    "connections.custom.pending": "Open this link in a browser signed in as the bot account:",
    "connections.active.badge": "active sender",
    "connections.active.set": "Set as active sender",
    "connections.class.chat": "Chat",
    "connections.class.moderation": "Moderation",
    "connections.class.broadcaster": "Broadcaster",
    "connections.class.ok": "ready",
    "connections.class.needs_mod": "needs /mod",
    "connections.class.needs_grant": "needs permission",
    "connections.operator.heading": "Streambridge Cloud Bot",
    "connections.operator.subtitle": "Connect and monitor the shared bot account.",
    "connections.operator.not_configured_title": "Not connected yet",
    "connections.operator.not_configured_body": "Set the bot's Twitch id in the environment, generate a connect link, then open it in a browser signed in as the bot account.",
    "connections.operator.redirect_missing": "The cloud-bot redirect URL is not configured on this server.",
    "connections.operator.generate": "Generate connect link",
    "connections.operator.reconnect": "Reconnect",
    "connections.operator.link_hint": "Open this link in a browser signed in as the bot account:",
    "connections.operator.copy": "Copy link",
    "connections.operator.copied": "Copied",
    "connections.operator.status_account": "Account",
    "connections.operator.status_scopes": "Permissions",
    "connections.operator.status_expiry": "Token expires",
    "connections.operator.status_refreshed": "Last refreshed",
    "connections.operator.status_enrolled": "Enrolled properties",
    "connections.operator.configured_id": "Configured Twitch id",
    "connections.operator.never": "never",
    "connections.operator.verify.eyebrow": "Confirm before continuing",
    "connections.operator.verify.headline": "Connect this account as the Streambridge Cloud Bot?",
    "connections.operator.verify.body": "You are about to connect your currently signed-in Twitch account as the global Streambridge Cloud Bot.",
    "connections.operator.verify.scopes_label": "Permissions Twitch will request",
    "connections.operator.verify.warn": "Only continue if this browser is signed in as the dedicated Streambridge bot account. If not, close this tab.",
    "connections.operator.verify.continue": "Continue with Twitch",
    "connections.operator.verify.cancel": "Cancel",
    "connections.operator.verify.close": "Close window",
    "connections.operator.verify.linked": "Connected",
    "connections.operator.verify.not_linked": "Not connected",
    "connections.operator.verify.result.success_title": "Cloud Bot connected",
    "connections.operator.verify.result.success_body": "The Streambridge Cloud Bot is now connected. You can close this window.",
    "connections.operator.verify.result.wrong_account_title": "Wrong account",
    "connections.operator.verify.result.wrong_account_body": "This Twitch account is not the configured Cloud Bot. Sign in as the correct bot account and try again.",
    "connections.operator.verify.result.not_found_title": "Link not found",
    "connections.operator.verify.result.not_found_body": "The connect link is invalid.",
    "connections.operator.verify.result.expired_title": "Link expired",
    "connections.operator.verify.result.expired_body": "This link expired. Generate a new one from the admin area.",
    "connections.operator.verify.result.consumed_title": "Link already used",
    "connections.operator.verify.result.consumed_body": "This link has already been used.",
    "connections.operator.verify.result.token_exchange_failed_title": "Twitch authorization failed",
    "connections.operator.verify.result.token_exchange_failed_body": "Twitch rejected the authorization. Please try again.",
    "connections.operator.verify.result.identity_lookup_failed_title": "Could not identify the Twitch account",
    "connections.operator.verify.result.identity_lookup_failed_body": "We could not read the Twitch account that just authorized. Please try again.",
    "connections.operator.verify.result.scopes_missing_title": "Missing permissions",
    "connections.operator.verify.result.scopes_missing_body": "Not all required permissions were granted. Please re-authorize and allow everything.",
    "connections.operator.verify.result.config_error_title": "Server misconfigured",
    "connections.operator.verify.result.config_error_body": "The cloud-bot connect flow is not fully configured on this server.",
    "connections.operator.verify.result.missing_params_title": "Authorization incomplete",
    "connections.operator.verify.result.missing_params_body": "Twitch returned without the expected parameters. Try the link again.",
    "connections.operator.verify.result.default_title": "Verification failed",
    "connections.operator.verify.result.default_body": "Something went wrong.",
    "onboarding.title": "Welcome to :app",
    "onboarding.fork.heading": "How do you want to set up your channel?",
    "onboarding.fork.fast_title": "Set me up with everything",
    "onboarding.fork.fast_description": "Install every feature and grant the permissions in one step. You can fine-tune everything later.",
    "onboarding.fork.fast_button": "Set me up",
    "onboarding.fork.guided_title": "Customize",
    "onboarding.fork.guided_description": "Pick exactly the features and events you want. Nothing is selected by default.",
    "onboarding.fork.guided_button": "Customize",
    "onboarding.step.chat_title": "Chat & Channel",
    "onboarding.step.events_title": "Channel events",
    "onboarding.step.summary_title": "Review & finish",
    "onboarding.group.chat_interactions": "Chat interactions",
    "onboarding.group.chat_moderation": "Chat moderation",
    "onboarding.group.channel_updates": "Channel updates",
    "onboarding.group.sender_account": "Sender account",
    "onboarding.item.channel_title_category": "Let automations change your stream title and category",
    "onboarding.events.intro": "Pick the channel events you want :app to track. Tracked events appear in your activity feed and can trigger automations.",
    "onboarding.summary.extensions": "Features to install",
    "onboarding.summary.events": "Events to track",
    "onboarding.summary.permissions": "Permissions we will request",
    "onboarding.summary.events_home_note": "The Events feature will also be installed so you can connect actions to these events.",
    "onboarding.action.next": "Next",
    "onboarding.action.back": "Back",
    "onboarding.action.skip": "Skip for now",
    "onboarding.action.finish": "Finish",
    "onboarding.action.run_again": "Run setup again",
    "onboarding.scope.user_read_chat": "Read your chat",
    "onboarding.scope.user_write_chat": "Send messages in your chat",
    "onboarding.scope.moderator_read_chatters": "See who is currently in your chat",
    "onboarding.scope.moderator_read_followers": "See who follows your channel",
    "onboarding.scope.channel_read_subscriptions": "See who subscribes to your channel",
    "onboarding.scope.bits_read": "See Bits cheered in your channel",
    "onboarding.scope.channel_manage_broadcast": "Change your stream title and category",
    "onboarding.scope.channel_read_redemptions": "See channel point redemptions",
    "onboarding.scope.channel_manage_redemptions": "Manage your channel point rewards",
    "onboarding.scope.moderator_manage_moderation": "Moderate your chat (timeouts, bans, chat settings)",
    "onboarding.fork.eyebrow": "Welcome to :app",
    "onboarding.fork.subtitle": "You can change anything later, nothing here is permanent.",
    "onboarding.fork.recommended": "Recommended",
    "onboarding.step.indicator": "Step :index of :total",
    "onboarding.step.chat_subtitle": "Choose the features you want. You can turn any of these on or off later in Settings.",
    "onboarding.group.selected": ":count selected",
    "onboarding.feature.commands": "Let viewers trigger replies and actions by typing ! commands in chat.",
    "onboarding.feature.keywords": "Reply automatically when chat mentions certain words, no ! needed.",
    "onboarding.feature.timers": "Post recurring messages on a schedule, only when chat is active.",
    "onboarding.feature.loyalty": "Reward regulars with points, and track watch time and viewer groups.",
    "onboarding.feature.mod": "Auto-moderate caps, spam, links and more, with your own rules and warnings.",
    "onboarding.event.follow": "When someone follows your channel.",
    "onboarding.event.subscribe": "When someone subscribes for the first time, or gets a gift sub.",
    "onboarding.event.subscription_message": "When a returning sub shares their resub message, with streak and months.",
    "onboarding.event.subscription_gift": "When someone gifts subscriptions to your community.",
    "onboarding.event.cheer": "When a viewer cheers with Bits in chat.",
    "onboarding.event.raid": "When another channel raids you with their viewers.",
    "onboarding.sender.title": "Add the bot to your chat",
    "onboarding.sender.optional": "Optional",
    "onboarding.sender.description": "To post in chat, :app uses a sending account. Paste this once in your chat to make it a moderator, you can do it now or any time later.",
    "onboarding.summary.intro": "Here is what we will set up. You will approve the permissions on Twitch in the next step.",
    "onboarding.summary.empty_title": "Nothing selected yet",
    "onboarding.summary.empty_desc": "Go back to pick features and events, or skip for now and set things up any time from Settings.",
    "onboarding.summary.trust": "We only ask for what your choices need. You will approve everything on Twitch in the next step, and you can change or revoke access any time.",
    "onboarding.success.title": "You're all set",
    "onboarding.success.description": ":app is connected and ready. Everything below is now live on your channel.",
    "onboarding.success.nothing": "Nothing installed yet, you can set things up any time from Settings.",
    "onboarding.success.features": "Features",
    "onboarding.success.events": "Events",
    "onboarding.success.open_dashboard": "Open dashboard",
    "dashboard.greeting": "Welcome back, :name",
    "dashboard.add_panel": "Add panel",
    "dashboard.edit.customize": "Customize",
    "dashboard.edit.done": "Done",
    "dashboard.edit.cancel": "Cancel",
    "dashboard.split.resize_aria": "Resize adjacent panels",
    "dashboard.drop.panel.left": "Left of :title",
    "dashboard.drop.panel.right": "Right of :title",
    "dashboard.drop.panel.top": "Above :title",
    "dashboard.drop.panel.bottom": "Below :title",
    "dashboard.drop.gap.column": "New column here, full height",
    "dashboard.drop.gap.row": "New row here, full width",
    "dashboard.drop.outer.left": "Full-height column, far left",
    "dashboard.drop.outer.right": "Full-height column, far right",
    "dashboard.drop.outer.top": "Full-width row, top",
    "dashboard.drop.outer.bottom": "Full-width row, bottom",
    "dashboard.empty.message": "Your dashboard is empty. Add your first panel.",
    "dashboard.empty.cta": "Add first panel",
    "dashboard.palette.title": "Add panel",
    "dashboard.palette.hint": "Click a card to add it to your dashboard.",
    "dashboard.activity_feed.title": "Activity",
    "dashboard.activity_feed.description": "Live events from your channel.",
    "dashboard.activity_feed.empty": "Your selected events show up here as they arrive.",
    "dashboard.activity_feed.field_title": "Title",
    "dashboard.activity_feed.field_events": "Events",
    "dashboard.activity_feed.field_limit": "Count",
    "dashboard.top_commands.title": "Top Commands",
    "dashboard.top_commands.description": "Your most-used commands over the last 7 days.",
    "dashboard.top_commands.field_title": "Title",
    "dashboard.top_commands.field_limit": "Count",
    "dashboard.top_commands.empty": "No command usage in the last 7 days yet.",
    "dashboard.top_commands.hint": "7 days",
    "dashboard.panel.settings": "Settings",
    "dashboard.panel.remove": "Remove",
    "dashboard.panel.refresh_failed": "Couldn't refresh",
    "dashboard.feed.follow": "followed the channel",
    "dashboard.feed.sub_new": "subscribed",
    "dashboard.feed.sub_resub": "resubscribed · :count month|resubscribed · :count months",
    "dashboard.feed.gift": "gifted :n subs",
    "dashboard.feed.bits": "cheered :n bits",
    "dashboard.feed.raid": "raided with :n viewers",
    "dashboard.feed.raid_sent": "received your raid with :count viewer|received your raid with :count viewers",
    "dashboard.feed.shoutout": "received a shoutout",
    "dashboard.feed.live": "is now live",
    "dashboard.feed.update": "updated the channel info",
    "dashboard.feed.run_cut_depth": "Flow \":flow\" was stopped at node :node: its chain ran five levels deep",
    "dashboard.feed.run_cut_budget": "Flow \":flow\" ran most often, and further runs were dropped for the rest of the minute",
    "dashboard.feed.run_cut_depth_unnamed": "An automation was stopped: its chain ran five levels deep",
    "dashboard.feed.run_cut_budget_unnamed": "Automations ran too often, and further runs were dropped for the rest of the minute",
    "dashboard.feed.run_cut_budget_package": "Package \":package\" ran most often, and further runs were dropped for the rest of the minute",
    "dashboard.feed.run_cut_depth_package": "An automation of package \":package\" was stopped: its chain ran five levels deep",
    "dashboard.feed.replay": "Show again",
    "dashboard.feed_chip.follow": "follow",
    "dashboard.feed_chip.sub": "sub",
    "dashboard.feed_chip.gift": "gift",
    "dashboard.feed_chip.bits": "bits",
    "dashboard.feed_chip.raid": "raid",
    "dashboard.feed_chip.raid_sent": "raid sent",
    "dashboard.feed_chip.shoutout": "shoutout",
    "dashboard.feed_chip.live": "live",
    "dashboard.feed_chip.update": "update",
    "dashboard.feed_chip.run_cut": "flow stopped",
    "dashboard.feed_time.just_now": "just now",
    "dashboard.feed_time.seconds": ":n s ago",
    "dashboard.feed_time.minutes": ":n min ago",
    "dashboard.feed_time.hours": ":n h ago",
    "dashboard.feed_time.days": ":n d ago",
    "dashboard.category.follow": "Follow",
    "dashboard.category.sub": "Sub",
    "dashboard.category.gifted_sub": "Gifted Sub",
    "dashboard.category.bits": "Bits",
    "dashboard.category.raid": "Raid",
    "dashboard.category.raid_sent": "Raid sent",
    "dashboard.category.stream_start": "Stream start",
    "dashboard.category.channel_update": "Channel update",
    "dashboard.category.shoutout_recv": "Shoutout received",
    "dashboard.error.unknown_panel": "Unknown panel type.",
    "dashboard.error.invalid_settings": "Invalid panel settings.",
    "dashboard.error.panel_type_mismatch": "The panel type does not match this panel.",
    "dashboard.error.settings_full": "This dashboard holds too many panel settings.",
    "dashboard.metric.calls_today": "Calls today",
    "dashboard.metric.active_commands": "Active commands",
    "dashboard.metric.followers_today": "Followers today",
    "dashboard.metric.subs_today": "Subs today",
    "dashboard.stat.delta_vs_yesterday": ":pct % vs. yesterday",
    "dashboard.stat.paused": ":n paused",
    "dashboard.stat_tile.title": "Stat tile",
    "dashboard.stat_tile.description": "A single metric as a tile.",
    "dashboard.stat_tile.field_title": "Title",
    "dashboard.stat_tile.field_metric": "Metric",
    "dashboard.quick_actions.title": "Quick actions",
    "dashboard.quick_actions.description": "Shortcuts to the most common actions.",
    "dashboard.quick_actions.field_title": "Title",
    "dashboard.quick_actions.add_aria": "Add quick action",
    "dashboard.quick_actions.search_placeholder": "Search actions…",
    "dashboard.quick_actions.picker_empty": "Everything is already on the panel.",
    "dashboard.quick_actions.remove_aria": "Remove :label",
    "dashboard.quick_actions.removed": "“:label” removed",
    "dashboard.quick.upload_media": "Upload media",
    "dashboard.alert_queue.title": "Alert Queue",
    "dashboard.alert_queue.description": "Watch and moderate upcoming alerts.",
    "dashboard.alert_queue.field_title": "Title",
    "dashboard.alert_queue.paused": "Paused",
    "dashboard.alert_queue.dropped": ":n dropped",
    "dashboard.alert_queue.empty": "No alerts waiting.",
    "dashboard.alert_queue.idle": "Idle",
    "dashboard.alert_queue.waiting": ":n waiting",
    "dashboard.alert_queue.skip": "Skip",
    "dashboard.alert_queue.replay_unavailable": "This entry cannot be shown again.",
    "dashboard.roles.delete_confirm_message": "Members lose the permissions granted by this role.",
    "dashboard.roles.delete_confirm_title": "Delete role :name?",
    "dashboard.roles.edit_aria": "Edit role :name",
    "ui.audience.question": "Who may trigger this?",
    "ui.audience.all": "Everyone",
    "ui.audience.moderators": "Moderators",
    "ui.audience.vips": "VIPs",
    "ui.audience.subscribers": "Subscribers",
    "ui.audience.help_all": "“Everyone” selected: any viewer can trigger it. Deselect groups to restrict.",
    "ui.audience.or_hint": "Matches are OR-combined",
    "ui.audience.specific_label": "Additionally allow specific viewers",
    "ui.audience.specific_search": "Search by Twitch user login…",
    "graphs.node.trigger_twitch_follow_label": "New Follower",
    "graphs.node.trigger_twitch_follow_desc": "Triggered when someone follows the channel.",
    "graphs.node.trigger_twitch_watch_streak_label": "Watch Streak",
    "graphs.node.trigger_twitch_watch_streak_desc": "Triggered when a viewer shares a watch streak: they have watched several consecutive streams. Twitch delivers it when the viewer chooses to share it in chat, so it does not fire automatically for every viewer.",
    "graphs.node.trigger_twitch_first_appearance_label": "First Appearance",
    "graphs.node.trigger_twitch_first_appearance_desc": "Fires once per viewer per live stream the first time they are active in chat - their first message, or their own sub/resub if that comes first.",
    "graphs.node.trigger_twitch_subscribe_label": "New Subscriber",
    "graphs.node.trigger_twitch_subscribe_desc": "Fires when a viewer subscribes for the first time, or receives a gift sub.",
    "graphs.node.trigger_twitch_subscription_gift_label": "Gift Subscription",
    "graphs.node.trigger_twitch_subscription_gift_desc": "Fires when a user gifts subscriptions - once per batch.",
    "graphs.node.trigger_twitch_cheer_label": "Cheer",
    "graphs.node.trigger_twitch_cheer_desc": "Fires when a viewer cheers with Bits in chat.",
    "graphs.node.trigger_twitch_raid_label": "Incoming Raid",
    "graphs.node.trigger_twitch_raid_desc": "Fires when another channel raids this one.",
    "graphs.node.trigger_twitch_raid_outgoing_label": "Raid sent",
    "graphs.node.trigger_twitch_raid_outgoing_desc": "Fires when your raid on another channel goes through, after Twitch's countdown or Raid Now, including a raid you start in Twitch itself. Only raids that show in chat fire it, and a cancelled raid fires nothing. {to_user.name} and {to_user.profile_image_url} name the channel raided and show its avatar.",
    "graphs.node.trigger_twitch_custom_power_up_redemption_add_label": "Power-up Redeemed",
    "graphs.node.trigger_twitch_custom_power_up_redemption_add_desc": "Fires when a viewer redeems one of your custom Power-ups with Bits, with what they typed in User Input, empty if the Power-up asks for nothing. Leave Power-up Title empty to fire for every Power-up. Bits Used fires for the same redemption too. Custom Power-ups are for Affiliates and Partners only; on other channels it never fires.",
    "graphs.group.audience_growth": "Audience growth",
    "graphs.group.engagement": "Engagement",
    "graphs.group.support": "Support",
    "graphs.group.follower": "Follower",
    "graphs.group.viewer": "Viewer",
    "graphs.group.watch_streak": "Watch Streak",
    "graphs.group.first_appearance": "First Appearance",
    "graphs.group.subscriber": "Subscriber",
    "graphs.group.subscription": "Subscription",
    "graphs.group.cheerer": "Cheerer",
    "graphs.group.cheer": "Cheer",
    "graphs.group.raider": "Raider",
    "graphs.group.raid": "Raid",
    "graphs.group.custom_power_up": "Custom Power-up",
    "graphs.exec.success": "Success",
    "graphs.port.user_id": "User ID",
    "graphs.port.user_login": "User Login",
    "graphs.port.user_display_name": "User Display Name",
    "graphs.port.user_channel": "User Channel",
    "graphs.port.followed_at": "Followed At",
    "graphs.port.streak_count": "Streak Count",
    "graphs.port.channel_points_awarded": "Channel Points Awarded",
    "graphs.port.kind": "Kind",
    "graphs.port.message": "Message",
    "graphs.port.message_without_emotes": "Message without emotes",
    "graphs.port.resub_message": "Resub Message",
    "graphs.port.message_id": "Message ID",
    "graphs.port.message_text": "Message Text",
    "graphs.port.message_text_without_emotes": "Message text without emotes",
    "graphs.port.without_emotes_help": "The text without emotes, cheermotes and GIFs: what a person wrote. Empty when the message is emotes only.",
    "graphs.port.is_mod": "Is Mod",
    "graphs.port.is_subscriber": "Is Subscriber",
    "graphs.port.tier": "Tier",
    "graphs.port.is_gift": "Is Gift",
    "graphs.port.gifter_id": "Gifter ID",
    "graphs.port.gifter_login": "Gifter Login",
    "graphs.port.gifter_display_name": "Gifter Display Name",
    "graphs.port.gifted_this_run": "Gifted (this run)",
    "graphs.port.lifetime_total": "Lifetime Total",
    "graphs.port.is_anonymous": "Is Anonymous",
    "graphs.port.anonymous": "Anonymous",
    "graphs.port.bits": "Bits",
    "graphs.port.raider_id": "Raider ID",
    "graphs.port.raider_login": "Raider Login",
    "graphs.port.raider_display_name": "Raider Display Name",
    "graphs.port.raider_category": "Raider Category",
    "graphs.port.raider_title": "Raider Title",
    "graphs.port.viewers": "Viewers",
    "graphs.exec.blocked": "Blocked",
    "graphs.group.chatter": "Chatter",
    "graphs.group.message": "Message",
    "graphs.group.command": "Command",
    "graphs.group.target": "Target",
    "graphs.group.shared_chat": "Shared Chat",
    "graphs.port.user_color": "User Color",
    "graphs.port.message_type": "Message Type",
    "graphs.port.badges": "Badges",
    "graphs.port.reply_to": "Reply To",
    "graphs.port.cheered_bits": "Cheered Bits",
    "graphs.port.is_channel_bot": "Is Channel Bot",
    "graphs.port.shared_chat_active": "Shared Chat: Active",
    "graphs.port.shared_chat_from_own_channel": "Shared Chat: From My Channel",
    "graphs.port.shared_chat_source_user_id": "Shared Chat: Source User ID",
    "graphs.port.shared_chat_source_user_login": "Shared Chat: Source User Login",
    "graphs.port.shared_chat_source_user_display_name": "Shared Chat: Source User Display Name",
    "graphs.port.shared_chat_source_message_id": "Shared Chat: Source Message ID",
    "graphs.port.shared_chat_is_source_only": "Shared Chat: Source Channel Only",
    "graphs.port.command": "Command",
    "graphs.port.args": "Args",
    "graphs.port.args_text": "Args Text",
    "graphs.port.args_text_without_emotes": "Args text without emotes",
    "graphs.port.arg_n": "Arg :n",
    "graphs.port.command_trigger": "Command Trigger",
    "graphs.port.command_args": "Command Args",
    "graphs.port.raw_message": "Raw Message",
    "graphs.port.target_id": "Target ID",
    "graphs.port.target_login": "Target Login",
    "graphs.port.lazy_profile_image_url": "Profile image URL",
    "graphs.port.lazy_offline_image_url": "Offline image URL",
    "graphs.port.lazy_description": "Channel description",
    "graphs.port.lazy_broadcaster_type": "Broadcaster type",
    "graphs.port.lazy_created_at": "Account created",
    "graphs.port.lazy_category": "Current category",
    "graphs.port.lazy_title": "Stream title",
    "graphs.port.target_display_name": "Target Display Name",
    "graphs.port.target_category": "Target Category",
    "graphs.port.target_stream_title": "Target Stream Title",
    "graphs.port.phrase": "Phrase",
    "graphs.port.match": "Match",
    "graphs.port.match_without_emotes": "Match without emotes",
    "graphs.port.matched_phrase": "Matched Phrase",
    "graphs.port.title": "Title",
    "graphs.port.language": "Language",
    "graphs.port.category_id": "Category ID",
    "graphs.port.category_name": "Category Name",
    "graphs.port.content_classification_labels": "Content Classification Labels",
    "graphs.port.previous_title": "Previous Title",
    "graphs.port.previous_category_id": "Previous Category ID",
    "graphs.port.previous_category_name": "Previous Category Name",
    "graphs.option.trigger_anytime": "Trigger anytime",
    "graphs.option.only_while_live": "Only while live",
    "graphs.option.only_while_offline": "Only while offline",
    "graphs.option.unchanged": "Unchanged",
    "graphs.option.pause": "Pause",
    "graphs.option.resume": "Resume",
    "graphs.option.fulfil": "Fulfil",
    "graphs.option.cancel_refund": "Cancel & refund",
    "graphs.param.audience": "Audience",
    "graphs.param.global_cooldown_seconds": "Global cooldown (s)",
    "graphs.param.user_cooldown_seconds": "Per-user cooldown (s)",
    "graphs.param.stream_state": "Stream state",
    "graphs.param.ignore_bots": "Ignore Bot Messages",
    "graphs.param.ignore_bots_help": "Skip messages from connected bot accounts. Self-emitted echoes from action.chat.send are always dropped earlier; this controls whether other bots in the channel fire this trigger.",
    "graphs.param.power_up_title": "Power-up Title",
    "graphs.param.power_up_title_help": "Fires only for the Power-up with this title, ignoring case. Leave it empty for every Power-up. If you rename the Power-up on Twitch, rename it here too, or it stops firing.",
    "graphs.param.command_ref": "Command",
    "graphs.param.keyword_ref": "Keyword",
    "graphs.node.trigger_twitch_chat_message_label": "Chat Message",
    "graphs.node.trigger_twitch_chat_message_desc": "Every chat message, no filter. Heavy traffic; prefer Command or Keyword triggers unless you really need it all.",
    "graphs.node.trigger_twitch_chat_command_label": "Chat Command",
    "graphs.node.trigger_twitch_chat_command_desc": "Fires when a configured !command is typed in chat. Audience, cooldown, and stream-state rules are managed on the command itself.",
    "graphs.node.trigger_twitch_chat_keyword_label": "Chat Keyword",
    "graphs.node.trigger_twitch_chat_keyword_desc": "Fires when a configured phrase shows up in chat. Audience, cooldown, and stream-state rules are managed on the keyword itself.",
    "graphs.node.trigger_twitch_update_label": "Channel Update",
    "graphs.node.trigger_twitch_update_desc": "Fires when the broadcaster changes title, category, language, or content classification.",
    "graphs.node.trigger_twitch_update_title_label": "Channel Update Title",
    "graphs.node.trigger_twitch_update_title_desc": "Fires only when the broadcaster changes the stream title.",
    "graphs.node.trigger_twitch_update_category_label": "Channel Update Category",
    "graphs.node.trigger_twitch_update_category_desc": "Fires only when the broadcaster changes the stream category (game).",
    "graphs.node.trigger_twitch_ban_label": "Ban / Timeout",
    "graphs.node.trigger_twitch_ban_desc": "Fires when a viewer is banned or timed out.",
    "graphs.node.trigger_twitch_unban_label": "Unban",
    "graphs.node.trigger_twitch_unban_desc": "Fires when a banned viewer is unbanned.",
    "graphs.node.trigger_twitch_moderate_label": "Moderation Action",
    "graphs.node.trigger_twitch_moderate_desc": "Fires for every moderator action (ban/timeout/delete/mode toggles/warn/etc.). Discriminate via the action field.",
    "graphs.node.trigger_twitch_moderator_add_label": "Moderator Added",
    "graphs.node.trigger_twitch_moderator_add_desc": "Fires when a user is given moderator privileges.",
    "graphs.node.trigger_twitch_moderator_remove_label": "Moderator Removed",
    "graphs.node.trigger_twitch_moderator_remove_desc": "Fires when a user has moderator privileges removed.",
    "graphs.node.trigger_twitch_vip_add_label": "VIP Added",
    "graphs.node.trigger_twitch_vip_add_desc": "Fires when a user is given VIP status.",
    "graphs.node.trigger_twitch_vip_remove_label": "VIP Removed",
    "graphs.node.trigger_twitch_vip_remove_desc": "Fires when a user has VIP status removed.",
    "graphs.node.trigger_twitch_shield_mode_begin_label": "Shield Mode Begin",
    "graphs.node.trigger_twitch_shield_mode_begin_desc": "Fires when Shield Mode is activated.",
    "graphs.node.trigger_twitch_shield_mode_end_label": "Shield Mode End",
    "graphs.node.trigger_twitch_shield_mode_end_desc": "Fires when Shield Mode is deactivated.",
    "graphs.node.trigger_twitch_warning_send_label": "Warning Sent",
    "graphs.node.trigger_twitch_warning_send_desc": "Fires when a moderator sends a warning to a user.",
    "graphs.node.trigger_twitch_warning_acknowledge_label": "Warning Acknowledged",
    "graphs.node.trigger_twitch_warning_acknowledge_desc": "Fires when a user acknowledges a pending warning.",
    "graphs.node.trigger_twitch_unban_request_create_label": "Unban Request Created",
    "graphs.node.trigger_twitch_unban_request_create_desc": "Fires when a banned viewer submits an unban request.",
    "graphs.node.trigger_twitch_unban_request_resolve_label": "Unban Request Resolved",
    "graphs.node.trigger_twitch_unban_request_resolve_desc": "Fires when a moderator approves, denies, or cancels an unban request. For moderator info on the approve path, prefer the Unban trigger, it fires right after and uses the standard moderator_user_* field naming.",
    "graphs.node.trigger_twitch_suspicious_user_message_label": "Suspicious User Message",
    "graphs.node.trigger_twitch_suspicious_user_message_desc": "Fires when a flagged or restricted user sends a chat message.",
    "graphs.node.trigger_twitch_suspicious_user_update_label": "Suspicious User Updated",
    "graphs.node.trigger_twitch_suspicious_user_update_desc": "Fires when a moderator changes a viewer's trust status.",
    "graphs.node.trigger_twitch_chat_settings_update_label": "Chat Settings Update",
    "graphs.node.trigger_twitch_chat_settings_update_desc": "Fires when chat mode toggles change.",
    "graphs.port.moderator_id": "Moderator ID",
    "graphs.port.moderator_login": "Moderator Login",
    "graphs.port.moderator_display_name": "Moderator Display Name",
    "graphs.port.reason": "Reason",
    "graphs.port.banned_at": "Banned At",
    "graphs.port.ends_at": "Ends At",
    "graphs.port.is_permanent": "Is Permanent",
    "graphs.port.action": "Action",
    "graphs.port.moderate_action_help": "Moderation action: ban, timeout, unban, untimeout, clear, emoteonly, emoteonlyoff, followers, followersoff, uniquechat, uniquechatoff, slow, slowoff, subscribers, subscribersoff, unraid, delete, unvip, vip, raid, add_blocked_term, add_permitted_term, remove_blocked_term, remove_permitted_term, mod, unmod, approve_unban_request, deny_unban_request, warn, shared_chat_ban, shared_chat_timeout, shared_chat_unban, shared_chat_untimeout or shared_chat_delete.",
    "graphs.port.started_at": "Started At",
    "graphs.port.is_live": "Is live",
    "graphs.port.is_live_help": "True while the stream is live. False while offline or before the state is known.",
    "graphs.port.stream_started_at": "Stream start",
    "graphs.port.stream_started_at_help": "ISO 8601 timestamp the current stream started. Empty while offline.",
    "graphs.port.ended_at": "Ended At",
    "graphs.port.stream_id": "Stream ID",
    "graphs.port.rules_cited": "Rules Cited",
    "graphs.port.request_id": "Request ID",
    "graphs.port.request_text": "Request Text",
    "graphs.port.created_at": "Created At",
    "graphs.port.resolution_text": "Resolution Text",
    "graphs.port.status": "Status",
    "graphs.port.trust_status": "Trust Status",
    "graphs.port.shared_ban_chans": "Shared Ban Chans",
    "graphs.port.flag_types": "Flag Types",
    "graphs.port.ban_evasion": "Ban Evasion",
    "graphs.port.emote_only": "Emote-Only",
    "graphs.port.follower_only": "Follower-Only",
    "graphs.port.follower_duration": "Follower Duration",
    "graphs.port.slow_mode": "Slow Mode",
    "graphs.port.slow_wait_s": "Slow Wait (s)",
    "graphs.port.sub_only": "Sub-Only",
    "graphs.port.unique_chat": "Unique Chat",
    "graphs.node.trigger_twitch_stream_online_label": "Stream Online",
    "graphs.node.trigger_twitch_stream_online_desc": "Triggered when the channel goes live.",
    "graphs.node.trigger_twitch_stream_offline_label": "Stream Offline",
    "graphs.node.trigger_twitch_stream_offline_desc": "Triggered when the channel goes offline.",
    "graphs.node.trigger_twitch_chat_clear_label": "Chat Cleared",
    "graphs.node.trigger_twitch_chat_clear_desc": "Fires when a moderator clears all chat messages.",
    "graphs.node.trigger_twitch_chat_clear_user_messages_label": "Cleared User Messages",
    "graphs.node.trigger_twitch_chat_clear_user_messages_desc": "Fires when all messages from a specific user are removed from chat.",
    "graphs.node.trigger_twitch_chat_message_delete_label": "Chat Message Deleted",
    "graphs.node.trigger_twitch_chat_message_delete_desc": "Fires when a moderator deletes a single chat message.",
    "graphs.node.trigger_twitch_chat_notification_label": "Chat Notification",
    "graphs.node.trigger_twitch_chat_notification_desc": "System notification line: sub announcements, raids, gifts, charity receipts.",
    "graphs.node.trigger_twitch_chat_user_message_hold_label": "My Message Held",
    "graphs.node.trigger_twitch_chat_user_message_hold_desc": "Fires when AutoMod holds the user's own message.",
    "graphs.node.trigger_twitch_chat_user_message_update_label": "My AutoMod Message Updated",
    "graphs.node.trigger_twitch_chat_user_message_update_desc": "Fires when the user's held message is approved, denied, or expires.",
    "graphs.node.trigger_twitch_automod_message_hold_label": "AutoMod Hold",
    "graphs.node.trigger_twitch_automod_message_hold_desc": "Fires when AutoMod holds a chat message for moderator review.",
    "graphs.node.trigger_twitch_automod_message_update_label": "AutoMod Message Updated",
    "graphs.node.trigger_twitch_automod_message_update_desc": "Fires when an AutoMod-held message is approved, denied, or expires.",
    "graphs.node.trigger_twitch_automod_settings_update_label": "AutoMod Settings Update",
    "graphs.node.trigger_twitch_automod_settings_update_desc": "Fires when AutoMod severity levels change.",
    "graphs.node.trigger_twitch_automod_terms_update_label": "AutoMod Terms Update",
    "graphs.node.trigger_twitch_automod_terms_update_desc": "Fires when AutoMod term lists are changed.",
    "graphs.node.trigger_twitch_user_update_label": "User Account Update",
    "graphs.node.trigger_twitch_user_update_desc": "Fires when the property owner updates their Twitch account.",
    "graphs.node.trigger_twitch_user_whisper_message_label": "Whisper Received",
    "graphs.node.trigger_twitch_user_whisper_message_desc": "Fires when the property owner receives a whisper.",
    "graphs.node.trigger_twitch_shoutout_create_label": "Shoutout Sent",
    "graphs.node.trigger_twitch_shoutout_create_desc": "Fires when this channel sends a shoutout to another broadcaster.",
    "graphs.node.trigger_twitch_shoutout_receive_label": "Shoutout Received",
    "graphs.node.trigger_twitch_shoutout_receive_desc": "Fires when another broadcaster shouts out this channel.",
    "graphs.group.stream": "Stream",
    "graphs.group.shoutout": "Shoutout",
    "graphs.group.shouter": "Shouter",
    "graphs.port.category": "Category",
    "graphs.port.notice_type": "Notice Type",
    "graphs.port.notice_type_help": "Notice kind: sub, resub, sub_gift, community_sub_gift, gift_paid_upgrade, prime_paid_upgrade, raid, unraid, pay_it_forward, announcement, bits_badge_tier, charity_donation, watch_streak, modiversary, gifted_drops_summary, their shared_chat_ twins (shared_chat_resub, …) or unknown. The notice's details sit under the key it names, e.g. {resub.cumulative_months}.",
    "graphs.port.chatter_id": "Chatter ID",
    "graphs.port.chatter_login": "Chatter Login",
    "graphs.port.chatter_display_name": "Chatter Display Name",
    "graphs.port.system_message": "System Message",
    "graphs.port.held_at": "Held At",
    "graphs.port.level": "Level",
    "graphs.port.from_automod": "From AutoMod",
    "graphs.port.terms": "Terms",
    "graphs.port.description": "Description",
    "graphs.port.email_verified": "Email Verified",
    "graphs.port.whisper_id": "Whisper ID",
    "graphs.port.whisper_text": "Whisper Text",
    "graphs.port.text": "Text",
    "graphs.port.from_id": "From ID",
    "graphs.port.from_login": "From Login",
    "graphs.port.from_display_name": "From Display Name",
    "graphs.port.overall_level": "Overall",
    "graphs.port.aggression": "Aggression",
    "graphs.port.bullying": "Bullying",
    "graphs.port.disability": "Disability",
    "graphs.port.misogyny": "Misogyny",
    "graphs.port.race_ethnicity_or_religion": "Race/Religion",
    "graphs.port.sex_based_terms": "Sex Terms",
    "graphs.port.sexuality_sex_or_gender": "Sexuality",
    "graphs.port.swearing": "Swearing",
    "graphs.port.shouter_id": "Shouter ID",
    "graphs.port.shouter_login": "Shouter Login",
    "graphs.port.shouter_display_name": "Shouter Display Name",
    "graphs.port.target_viewers": "Target Viewers",
    "graphs.port.cooldown_ends_at": "Cooldown Ends At",
    "graphs.port.cooldown_remaining": "Cooldown Remaining (s)",
    "graphs.port.cooldown_scope": "Cooldown Scope",
    "graphs.port.cooldown_ends": "Cooldown Ends",
    "graphs.port.target_cooldown_ends_at": "Target Cooldown",
    "graphs.port.viewer_user_id": "App Viewer ID",
    "graphs.port.viewer_name": "App Viewer Name",
    "graphs.port.viewer_is_owner": "App Viewer Is Owner",
    "graphs.port.viewer_roles": "App Viewer Roles",
    "graphs.app_viewer.picker_group": "App Viewer",
    "graphs.exec.triggered": "Triggered",
    "graphs.node.trigger_user_event_label": "Custom Event",
    "graphs.node.trigger_user_event_desc": "Fires when a user-defined event is emitted from another graph.",
    "graphs.node.trigger_widget_event_label": "Widget Event",
    "graphs.node.trigger_widget_event_desc": "Fires when a widget bundle calls sb.emit() on the configured key.",
    "graphs.node.trigger_twitch_ad_break_begin_label": "Ad Break Begin",
    "graphs.node.trigger_twitch_ad_break_begin_desc": "Fires when a midroll ad break starts on the channel.",
    "graphs.node.trigger_twitch_ad_break_incoming_label": "Ad Break Incoming",
    "graphs.node.trigger_twitch_ad_break_incoming_desc": "Fires N seconds before an ad break starts. Configurable lead-time per node (default 60s, range 10-600). Multiple graphs can subscribe with different lead-times - each fires at its own configured offset.",
    "graphs.node.trigger_twitch_subscription_end_label": "Subscription Ended",
    "graphs.node.trigger_twitch_subscription_end_desc": "Fires when a viewer's subscription expires.",
    "graphs.node.trigger_twitch_subscription_message_label": "Resub Message",
    "graphs.node.trigger_twitch_subscription_message_desc": "Fires when a returning subscriber posts their resub message.",
    "graphs.node.trigger_twitch_bits_use_label": "Bits Used",
    "graphs.node.trigger_twitch_bits_use_desc": "Superset of Cheer - also Power-ups, message effects and custom Power-ups.",
    "graphs.node.trigger_twitch_channel_points_reward_add_label": "Reward Added",
    "graphs.node.trigger_twitch_channel_points_reward_add_desc": "Fires when a custom channel-points reward is created.",
    "graphs.node.trigger_twitch_channel_points_reward_update_label": "Reward Updated",
    "graphs.node.trigger_twitch_channel_points_reward_update_desc": "Fires when a custom channel-points reward is updated.",
    "graphs.node.trigger_twitch_channel_points_reward_remove_label": "Reward Removed",
    "graphs.node.trigger_twitch_channel_points_reward_remove_desc": "Fires when a custom channel-points reward is deleted.",
    "graphs.node.trigger_twitch_channel_points_redemption_update_label": "Redemption Updated",
    "graphs.node.trigger_twitch_channel_points_redemption_update_desc": "Fires when a custom-reward redemption is fulfilled or canceled.",
    "graphs.node.trigger_twitch_channel_points_automatic_redemption_add_label": "Automatic Reward Redemption",
    "graphs.node.trigger_twitch_channel_points_automatic_redemption_add_desc": "Built-in rewards: highlight my message, sub-mode bypass, emote unlocks, Power-Ups.",
    "graphs.node.trigger_twitch_shared_chat_begin_label": "Shared Chat Begin",
    "graphs.node.trigger_twitch_shared_chat_begin_desc": "Fires when this channel becomes active in a shared-chat session.",
    "graphs.node.trigger_twitch_shared_chat_update_label": "Shared Chat Update",
    "graphs.node.trigger_twitch_shared_chat_update_desc": "Fires when the shared-chat session's participants change.",
    "graphs.node.trigger_twitch_shared_chat_end_label": "Shared Chat End",
    "graphs.node.trigger_twitch_shared_chat_end_desc": "Fires when this channel leaves a shared-chat session.",
    "graphs.param.lead_time_seconds": "Lead Time (seconds)",
    "graphs.param.user_event_id": "Event",
    "graphs.param.emit_ref": "Emit",
    "graphs.port.duration_seconds": "Duration (seconds)",
    "graphs.port.is_automatic": "Is Automatic",
    "graphs.port.requester_user_id": "Requester User ID",
    "graphs.port.requester_user_login": "Requester Login",
    "graphs.port.requester_user_name": "Requester Display Name",
    "graphs.port.next_ad_at": "Next Ad At",
    "graphs.port.lead_time_seconds": "Lead Time (s)",
    "graphs.port.seconds_until_ad": "Seconds Until Ad",
    "graphs.port.snooze_count": "Snoozes Remaining",
    "graphs.port.was_gift": "Was Gift",
    "graphs.port.cumulative_months": "Cumulative Months",
    "graphs.port.streak_months": "Streak Months",
    "graphs.port.duration_months": "Duration Months",
    "graphs.port.type": "Type",
    "graphs.port.power_up_type": "Power-Up Type",
    "graphs.port.bits_use_type_help": "How the Bits were used: cheer, power_up (a built-in Power-up) or custom_power_up (one of your own).",
    "graphs.port.custom_power_up_title": "Custom Power-up Title",
    "graphs.port.custom_power_up_id": "Custom Power-up ID",
    "graphs.port.custom_power_up_bits": "Custom Power-up Bits",
    "graphs.port.custom_power_up_prompt": "Custom Power-up Prompt",
    "graphs.port.reward_id": "Reward ID",
    "graphs.port.reward_title": "Reward Title",
    "graphs.port.reward_cost": "Reward Cost",
    "graphs.port.reward_type": "Reward Type",
    "graphs.port.redemption_id": "Redemption ID",
    "graphs.port.redemptions": "Redemptions",
    "graphs.port.redemptions_help": "The open redemptions, each an object with id, user_login, user_input and redeemed_at. Empty when none is open or the read failed.",
    "graphs.port.user_input": "User Input",
    "graphs.port.redeemed_at": "Redeemed At",
    "graphs.port.points_used": "Points Used",
    "graphs.port.cost": "Cost",
    "graphs.port.global_cooldown": "Global cooldown (s)",
    "graphs.port.max_per_stream": "Max per stream",
    "graphs.port.max_per_user_per_stream": "Max per user per stream",
    "graphs.port.reward_cost_help": "Empty leaves it as it is. At least 1.",
    "graphs.port.reward_limit_help": "Empty leaves it as it is, 0 turns it off.",
    "graphs.port.prompt": "Prompt",
    "graphs.port.is_enabled": "Enabled",
    "graphs.port.is_paused": "Paused",
    "graphs.port.is_in_stock": "In Stock",
    "graphs.port.session_id": "Session ID",
    "graphs.port.host_id": "Host ID",
    "graphs.port.host_login": "Host Login",
    "graphs.port.host_display_name": "Host Display Name",
    "graphs.port.participants": "Participants",
    "graphs.port.poll_id": "Poll ID",
    "graphs.port.choices": "Choices",
    "graphs.port.choice_n": "Choice :n",
    "graphs.port.prediction_id": "Prediction ID",
    "graphs.port.outcomes": "Outcomes",
    "graphs.port.outcome_n": "Outcome :n",
    "graphs.port.locks_at": "Locks At",
    "graphs.port.locked_at": "Locked At",
    "graphs.port.winning_outcome_id": "Winning Outcome ID",
    "graphs.port.goal_id": "Goal ID",
    "graphs.port.current_amount": "Current Amount",
    "graphs.port.target_amount": "Target Amount",
    "graphs.port.is_achieved": "Is Achieved",
    "graphs.port.train_id": "Train ID",
    "graphs.port.total_points": "Total Points",
    "graphs.port.progress": "Progress",
    "graphs.port.goal": "Goal",
    "graphs.port.expires_at": "Expires At",
    "graphs.port.golden_kappa": "Golden Kappa",
    "graphs.port.is_active": "Is active",
    "graphs.port.hype_train_active_help": "True while a hype train runs. The other pins are empty while none does.",
    "graphs.port.hype_train_type_help": "The train's kind as Twitch names it: regular, golden_kappa or treasure.",
    "graphs.port.is_shared_train": "Is Shared Train",
    "graphs.port.shared_train_participants": "Shared Train Participants",
    "graphs.port.all_time_high_level": "All-Time High Level",
    "graphs.port.all_time_high_total": "All-Time High Total",
    "graphs.port.final_level": "Final Level",
    "graphs.port.final_points": "Final Points",
    "graphs.port.donation_id": "Donation ID",
    "graphs.port.campaign_id": "Campaign ID",
    "graphs.port.charity_name": "Charity",
    "graphs.port.amount": "Amount",
    "graphs.port.decimals": "Decimals",
    "graphs.port.currency": "Currency",
    "graphs.port.current_currency": "Current Currency",
    "graphs.port.target_currency": "Target Currency",
    "graphs.port.stopped_at": "Stopped At",
    "graphs.node.trigger_twitch_poll_begin_label": "Poll Begin",
    "graphs.node.trigger_twitch_poll_begin_desc": "Fires when a poll is started.",
    "graphs.node.trigger_twitch_poll_progress_label": "Poll Progress",
    "graphs.node.trigger_twitch_poll_progress_desc": "Fires repeatedly while voters cast votes - high frequency.",
    "graphs.node.trigger_twitch_poll_end_label": "Poll End",
    "graphs.node.trigger_twitch_poll_end_desc": "Fires when a poll closes.",
    "graphs.node.trigger_twitch_prediction_begin_label": "Prediction Begin",
    "graphs.node.trigger_twitch_prediction_begin_desc": "Fires when a prediction is opened.",
    "graphs.node.trigger_twitch_prediction_progress_label": "Prediction Progress",
    "graphs.node.trigger_twitch_prediction_progress_desc": "Fires repeatedly while users predict - high frequency.",
    "graphs.node.trigger_twitch_prediction_lock_label": "Prediction Locked",
    "graphs.node.trigger_twitch_prediction_lock_desc": "Fires when betting on a prediction closes.",
    "graphs.node.trigger_twitch_prediction_end_label": "Prediction End",
    "graphs.node.trigger_twitch_prediction_end_desc": "Fires when a prediction is resolved or canceled.",
    "graphs.node.trigger_twitch_goal_begin_label": "Goal Begin",
    "graphs.node.trigger_twitch_goal_begin_desc": "Fires when the broadcaster starts a creator goal.",
    "graphs.node.trigger_twitch_goal_progress_label": "Goal Progress",
    "graphs.node.trigger_twitch_goal_progress_desc": "Fires when progress is made toward an active goal.",
    "graphs.node.trigger_twitch_goal_end_label": "Goal End",
    "graphs.node.trigger_twitch_goal_end_desc": "Fires when a creator goal ends - check is_achieved.",
    "graphs.node.trigger_twitch_hype_train_begin_label": "Hype Train Begin",
    "graphs.node.trigger_twitch_hype_train_begin_desc": "Fires when a Hype Train starts.",
    "graphs.node.trigger_twitch_hype_train_progress_label": "Hype Train Progress",
    "graphs.node.trigger_twitch_hype_train_progress_desc": "Fires for each Hype Train contribution.",
    "graphs.node.trigger_twitch_hype_train_end_label": "Hype Train End",
    "graphs.node.trigger_twitch_hype_train_end_desc": "Fires when a Hype Train ends.",
    "graphs.node.trigger_twitch_charity_campaign_donate_label": "Charity Donation",
    "graphs.node.trigger_twitch_charity_campaign_donate_desc": "Fires for each viewer donation to the active charity campaign.",
    "graphs.node.trigger_twitch_charity_campaign_start_label": "Charity Campaign Start",
    "graphs.node.trigger_twitch_charity_campaign_start_desc": "Fires when a charity campaign starts.",
    "graphs.node.trigger_twitch_charity_campaign_progress_label": "Charity Campaign Progress",
    "graphs.node.trigger_twitch_charity_campaign_progress_desc": "Fires as donations accumulate.",
    "graphs.node.trigger_twitch_charity_campaign_stop_label": "Charity Campaign Stop",
    "graphs.node.trigger_twitch_charity_campaign_stop_desc": "Fires when the broadcaster stops the charity campaign.",
    "graphs.node.flow_branch_label": "Branch",
    "graphs.node.flow_branch_desc": "Routes execution to true / false based on a boolean input.",
    "graphs.exec.true": "True",
    "graphs.exec.false": "False",
    "graphs.port.condition": "Condition",
    "graphs.node.flow_match_label": "Match",
    "graphs.node.flow_match_desc": "N-way exec dispatch on a string value. Add one Case pin per branch with the value to match against; the first matching case fires, or `default` when nothing matches. Strict string-equality after String() coerce: for ranges or operators, chain a Compare instead.",
    "graphs.exec.case_n": "Case :n",
    "graphs.exec.default": "Default",
    "graphs.port.value": "Value",
    "graphs.node.flow_cond_label": "Condition",
    "graphs.node.flow_cond_desc": "Ordered conditions, first match wins. Each \"When\" branch carries a condition (field + operator + value); the first satisfied branch fires, otherwise `default`. Operands are token-based, no connections required.",
    "graphs.exec.when_n": "When :n",
    "graphs.node.flow_sequence_label": "Sequence",
    "graphs.node.flow_sequence_desc": "Fires multiple exec branches in order.",
    "graphs.exec.then_n": "Then :n",
    "graphs.node.flow_delay_label": "Delay",
    "graphs.node.flow_delay_desc": "Pauses this branch for the given number of seconds before continuing. Counts toward the 30s graph runtime cap. A single delay is capped at 25 seconds.",
    "graphs.exec.out": "Out",
    "graphs.port.seconds": "Seconds",
    "graphs.node.flow_for_loop_label": "For Loop",
    "graphs.node.flow_for_loop_desc": "Iterates from `from` to `to` inclusive (counts down if from > to). Index is exposed each iteration. Hard cap: 1000 iterations.",
    "graphs.exec.body": "Body",
    "graphs.exec.completed": "Completed",
    "graphs.port.from": "From",
    "graphs.port.to": "To",
    "graphs.port.index": "Index",
    "graphs.node.flow_while_label": "While",
    "graphs.node.flow_while_desc": "Repeats the body branch as long as `condition` is true. The condition re-evaluates each iteration: connect it from a Compare or Logic chain that reflects loop state. Hard cap: 1000 iterations.",
    "graphs.port.iteration": "Iteration",
    "graphs.node.flow_foreach_label": "For Each",
    "graphs.node.flow_foreach_desc": "Iterates over an array, firing the body branch once per element. Element + index are exposed as data outputs that update each iteration. Hard cap: 1000 items.",
    "graphs.port.array": "Array",
    "graphs.port.element": "Element",
    "graphs.node.flow_compare_label": "Compare",
    "graphs.node.flow_compare_desc": "Compares two values with a simple operator; routes to true / false based on the result.",
    "graphs.node.pure_compare_label": "Compare",
    "graphs.node.pure_compare_desc": "Compares two values; returns a boolean (use Branch to route on it).",
    "graphs.param.operator": "Operator",
    "graphs.port.left": "Left",
    "graphs.port.right": "Right",
    "graphs.port.result": "Result",
    "graphs.port.a": "A",
    "graphs.port.b": "B",
    "graphs.port.length": "Length",
    "graphs.port.object": "Object",
    "graphs.param.list_name": "List name",
    "graphs.param.path": "Path",
    "graphs.node.pure_list_label": "List",
    "graphs.node.pure_list_desc": "Reference to a persistent named list. Connect into array actions/readers instead of repeating the name everywhere.",
    "graphs.node.pure_array_length_label": "Array Length",
    "graphs.node.pure_array_length_desc": "Reads the size of an array; works on any array source (a List output, command args, split results).",
    "graphs.node.pure_array_at_label": "Array At Index",
    "graphs.node.pure_array_at_desc": "Reads the element at the given zero-based index. Works on any array source.",
    "graphs.node.pure_array_contains_label": "Array Contains",
    "graphs.node.pure_array_contains_desc": "True if the array contains the given value. Works on any array source.",
    "graphs.node.pure_object_get_label": "Get Property",
    "graphs.node.pure_object_get_desc": "Reads a value at a dotted path from an object (e.g. `data.user.email`).",
    "graphs.node.pure_object_from_pairs_label": "Build Object",
    "graphs.node.pure_object_from_pairs_desc": "Builds an object from typed input pins. Each pin contributes one key/value pair: the pin's label is the JSON key, the connected value is the value. Useful for HTTP headers and JSON bodies without a JSON.parse hack.",
    "graphs.node.pure_destructure_label": "Destructure Object",
    "graphs.node.pure_destructure_desc": "Splits an object into multiple typed outputs. Add a pin per field you want to expose; each pin has a label, type, and dotted path into the source object.",
    "graphs.node.pure_logic_and_label": "And",
    "graphs.node.pure_logic_and_desc": "Logical AND of two booleans.",
    "graphs.node.pure_logic_or_label": "Or",
    "graphs.node.pure_logic_or_desc": "Logical OR of two booleans.",
    "graphs.node.pure_logic_not_label": "Not",
    "graphs.node.pure_logic_not_desc": "Logical NOT of a boolean.",
    "graphs.node.pure_math_add_label": "Add",
    "graphs.node.pure_math_add_desc": "a + b.",
    "graphs.node.pure_math_sub_label": "Subtract",
    "graphs.node.pure_math_sub_desc": "a − b.",
    "graphs.node.pure_math_mul_label": "Multiply",
    "graphs.node.pure_math_mul_desc": "a × b.",
    "graphs.node.pure_math_div_label": "Divide",
    "graphs.node.pure_math_div_desc": "a ÷ b. Returns 0 on division by zero.",
    "graphs.node.pure_math_mod_label": "Modulo",
    "graphs.node.pure_math_mod_desc": "a mod b: remainder of a ÷ b. Returns 0 on b = 0. Sign matches `a` (JavaScript semantics).",
    "graphs.node.pure_math_min_label": "Min",
    "graphs.node.pure_math_min_desc": "Smallest of the connected numbers. Unconnected pins are ignored; returns 0 when none are connected.",
    "graphs.node.pure_math_max_label": "Max",
    "graphs.node.pure_math_max_desc": "Largest of the connected numbers. Unconnected pins are ignored; returns 0 when none are connected.",
    "graphs.node.pure_math_round_label": "Round",
    "graphs.node.pure_math_round_desc": "Rounds to the nearest integer; .5 rounds up.",
    "graphs.node.pure_math_floor_label": "Floor",
    "graphs.node.pure_math_floor_desc": "Rounds down to the nearest integer.",
    "graphs.node.pure_math_ceil_label": "Ceil",
    "graphs.node.pure_math_ceil_desc": "Rounds up to the nearest integer.",
    "graphs.node.pure_math_abs_label": "Absolute",
    "graphs.node.pure_math_abs_desc": "Absolute value; drops the sign.",
    "graphs.node.pure_string_upper_label": "Uppercase",
    "graphs.node.pure_string_upper_desc": "Converts a string to uppercase.",
    "graphs.node.pure_string_lower_label": "Lowercase",
    "graphs.node.pure_string_lower_desc": "Converts a string to lowercase.",
    "graphs.node.pure_string_trim_label": "Trim",
    "graphs.node.pure_string_trim_desc": "Strips leading and trailing whitespace.",
    "graphs.option.eq": "= equals",
    "graphs.option.ne": "≠ not equals",
    "graphs.option.lt": "< less than",
    "graphs.option.le": "≤ less-or-equal",
    "graphs.option.gt": "> greater than",
    "graphs.option.ge": "≥ greater-or-equal",
    "graphs.option.contains": "contains",
    "graphs.option.matches": "matches regex",
    "graphs.node.debug_log_label": "Debug Log",
    "graphs.node.debug_log_desc": "Logs the connected value (with an optional label) to the runtime log. Drop it inline as a checkpoint during graph development.",
    "graphs.port.label": "Label",
    "graphs.node.primitive_number_label": "Number",
    "graphs.node.primitive_number_desc": "Emits a fixed numeric value as an output.",
    "graphs.node.primitive_string_label": "String",
    "graphs.node.primitive_string_desc": "Emits a fixed text value as an output. No variable interpolation: for templates use ChatSend.text.",
    "graphs.node.primitive_boolean_label": "Boolean",
    "graphs.node.primitive_boolean_desc": "Emits a fixed true/false value as an output.",
    "graphs.param.value": "Value",
    "graphs.node.action_chat_send_label": "Send Chat Message",
    "graphs.node.action_chat_send_desc": "Posts a message to the channel chat via Twitch Helix.",
    "graphs.node.action_chat_announce_label": "Send Announcement",
    "graphs.node.action_chat_announce_desc": "Posts a Twitch announcement (highlighted chat line). Optionally choose a colour band.",
    "graphs.node.action_chat_shoutout_label": "Send Shoutout",
    "graphs.node.action_chat_shoutout_desc": "Sends a Twitch /shoutout to the target channel.",
    "graphs.node.action_moderation_ban_label": "Ban User",
    "graphs.node.action_moderation_ban_desc": "Permanently bans a user from chat. Optional reason is shown in the mod log.",
    "graphs.node.action_moderation_timeout_label": "Timeout User",
    "graphs.node.action_moderation_timeout_desc": "Times out a user for the given duration (1-1209600 seconds; Twitch caps at 14 days).",
    "graphs.node.action_moderation_unban_label": "Unban User",
    "graphs.node.action_moderation_unban_desc": "Removes a ban or timeout from the channel.",
    "graphs.node.action_moderation_delete_message_label": "Delete Chat Message",
    "graphs.node.action_moderation_delete_message_desc": "Removes one chat message by id. Empty Message ID clears the entire chat (equivalent to /clear).",
    "graphs.node.action_moderation_warn_label": "Warn User",
    "graphs.node.action_moderation_warn_desc": "Issues a Twitch warning. The user must acknowledge before chatting again.",
    "graphs.node.action_moderation_shield_mode_label": "Toggle Shield Mode",
    "graphs.node.action_moderation_shield_mode_desc": "Activates or deactivates Twitch Shield Mode on the channel.",
    "graphs.node.action_moderation_suspicious_status_label": "Set suspicious status",
    "graphs.node.action_moderation_suspicious_status_desc": "Marks a chatter as suspicious in your channel, or clears the mark, on your own account. Monitor flags their messages for your mods, Restrict shows their messages only to them and your mods, Remove status clears either. It runs as you, never as your bot, so the mod log names you. User ID is the chatter's id, such as {user.id}. A chatter Twitch will not mark ends on Error.",
    "graphs.option.suspicious_monitor": "Monitor",
    "graphs.option.suspicious_restrict": "Restrict",
    "graphs.option.suspicious_remove": "Remove status",
    "graphs.node.action_channel_set_title_label": "Set Channel Title",
    "graphs.node.action_channel_set_title_desc": "Updates the stream title.",
    "graphs.node.action_channel_set_category_label": "Set Channel Category",
    "graphs.node.action_channel_set_category_desc": "Updates the streamed game / category. Accepts either the Twitch category name (e.g. \"Hollow Knight\") or the numeric category id.",
    "graphs.node.action_stream_add_marker_label": "Add Stream Marker",
    "graphs.node.action_stream_add_marker_desc": "Drops a stream marker at the current playback position. Stream must be live.",
    "graphs.node.action_clip_create_label": "Create Clip",
    "graphs.node.action_clip_create_desc": "Creates a clip of the last few seconds of the live stream and returns its URL. The stream must be live; the clip needs a few seconds to finish before the link plays.",
    "graphs.port.clip_title": "Title",
    "graphs.port.clip_duration": "Duration",
    "graphs.port.clip_id": "Clip ID",
    "graphs.port.clip_url": "Clip URL",
    "graphs.port.edit_url": "Edit URL",
    "graphs.node.action_vip_add_label": "Add VIP",
    "graphs.node.action_vip_add_desc": "Grants VIP status on the channel.",
    "graphs.node.action_vip_remove_label": "Remove VIP",
    "graphs.node.action_vip_remove_desc": "Revokes VIP status on the channel.",
    "graphs.node.action_mod_add_label": "Add Moderator",
    "graphs.node.action_mod_add_desc": "Grants moderator privileges on the channel.",
    "graphs.node.action_mod_remove_label": "Remove Moderator",
    "graphs.node.action_mod_remove_desc": "Revokes moderator privileges on the channel.",
    "graphs.exec.sent": "Sent",
    "graphs.exec.error": "Error",
    "graphs.group.chat": "Chat",
    "graphs.group.channel": "Channel",
    "graphs.port.target_user_id": "Target User ID",
    "graphs.port.duration_s": "Duration (s)",
    "graphs.port.active": "Active",
    "graphs.port.marker_id": "Marker ID",
    "graphs.param.connection_id": "Sender account",
    "graphs.param.color": "Color",
    "graphs.option.primary": "Primary (default)",
    "graphs.option.blue": "Blue",
    "graphs.option.green": "Green",
    "graphs.option.orange": "Orange",
    "graphs.option.purple": "Purple",
    "graphs.node.action_user_fire_event_label": "Fire Custom Event",
    "graphs.node.action_user_fire_event_desc": "Emits a user-defined event. Pin inputs become the event data that bound Trigger nodes receive.",
    "graphs.node.action_counter_set_label": "Set Counter",
    "graphs.node.action_counter_set_desc": "Updates a persistent named counter. Connect a Counter node into Counter to choose which one.",
    "graphs.node.action_array_push_label": "Push to List",
    "graphs.node.action_array_push_desc": "Appends a value to a persistent named list. Connect a List node into Array.",
    "graphs.node.action_array_pop_label": "Pop from List",
    "graphs.node.action_array_pop_desc": "Removes the front element from a persistent named list (FIFO). Connect a List node into Array.",
    "graphs.node.action_array_remove_label": "Remove from List",
    "graphs.node.action_array_remove_desc": "Drops every occurrence of a value from a persistent named list. Connect a List node into Array.",
    "graphs.node.action_array_set_label": "Write into List",
    "graphs.node.action_array_set_desc": "Overwrites the entry at a position in a persistent named list. Counting starts at 0; a negative position counts from the end. A position beyond the end takes the Out of range exit and changes nothing. Connect a List node into Array.",
    "graphs.node.action_array_clear_label": "Clear List",
    "graphs.node.action_array_clear_desc": "Empties a persistent named list. Connect a List node into Array.",
    "graphs.node.action_var_set_label": "Set Variable",
    "graphs.node.action_var_set_desc": "Writes a new value to a property or graph variable. Last-write-wins.",
    "graphs.node.action_var_reset_label": "Reset Variable",
    "graphs.node.action_var_reset_desc": "Clears the stored value of a variable. Subsequent reads return the declared default.",
    "graphs.node.pure_state_get_label": "Read App Value",
    "graphs.node.pure_state_get_desc": "Reads a stored value of an app. The value survives a restart and a browser source refresh, and can be a list or a structured record, not just a single number or text.",
    "graphs.node.action_state_set_label": "Write App Value",
    "graphs.node.action_state_set_desc": "Stores a value for an app. The last write wins. Use Write App Value Safely when a second flow can write the same name at the same time.",
    "graphs.node.action_state_cas_label": "Write App Value Safely",
    "graphs.node.action_state_cas_desc": "Stores a value only if nobody changed it since you read it. Takes the Conflict exit otherwise and hands you the value that won, so you can read it again and retry.",
    "graphs.node.action_cooldown_skip_label": "Skip Cooldown",
    "graphs.node.action_cooldown_skip_desc": "Cancels this run's cooldown so the command or keyword is not put on cooldown when the graph finishes.",
    "graphs.node.action_ctx_set_label": "Set Context",
    "graphs.node.action_ctx_set_desc": "Pushes a value into the current run context, pickable as {ctx.<slug>} in text fields with variable support.",
    "graphs.exec.done": "Done",
    "graphs.exec.popped": "Popped",
    "graphs.exec.empty": "Empty",
    "graphs.exec.removed": "Removed",
    "graphs.exec.not_found": "Not found",
    "graphs.exec.out_of_range": "Out of range",
    "graphs.exec.conflict": "Conflict",
    "graphs.port.revision": "Version",
    "graphs.port.expected_revision": "Expected Version",
    "graphs.port.current": "Current Value",
    "graphs.port.counter": "Counter",
    "graphs.param.mode": "Mode",
    "graphs.param.variable_id": "Variable",
    "graphs.param.slug": "Slug",
    "graphs.param.slug_help": "Pickable as {ctx.<slug>} in this graph's templates",
    "graphs.param.package_id": "App",
    "graphs.param.package_id_help": "The app this value belongs to, for example dev.example.battleship",
    "graphs.param.state_key": "Name",
    "graphs.param.state_key_help": "Name of the stored value, for example board or turn",
    "graphs.option.set_to_value": "Set to value",
    "graphs.option.increment_by_value": "Increment by value",
    "graphs.option.decrement_by_value": "Decrement by value",
    "graphs.node.action_http_request_label": "HTTP Request",
    "graphs.node.action_http_request_desc": "Performs an outbound HTTP call. Body has dual semantics on GET/HEAD: a string body is url-encoded and appended to the URL path (e.g. /summary/ + \"Berlin (Stadt)\" → /summary/Berlin%20%28Stadt%29), an object body becomes a query-string (?k=v&k2=v2). For other methods, body is sent as the request body (objects auto-stringified to JSON).",
    "graphs.node.action_twitch_start_commercial_label": "Start Commercial",
    "graphs.node.action_twitch_start_commercial_desc": "Starts a midroll commercial of the given length on the broadcaster's channel. Twitch enforces an 8-minute cooldown between commercials; on cooldown the call resolves through the Failure branch with retry_after_seconds populated.",
    "graphs.node.action_poll_create_label": "Create poll",
    "graphs.node.action_poll_create_desc": "Starts a poll with 2 to 5 choices, each typed in or wired. Outputs the poll's ID. Affiliate or Partner only.",
    "graphs.node.action_poll_end_label": "End poll",
    "graphs.node.action_poll_end_desc": "Ends a poll early and shows or hides its results. Leave Poll ID empty to end the poll that is running. Affiliate or Partner only.",
    "graphs.node.action_prediction_create_label": "Create prediction",
    "graphs.node.action_prediction_create_desc": "Starts a channel points prediction with 2 to 10 outcomes, each typed in or wired. Outputs the prediction's ID. Affiliate or Partner only.",
    "graphs.node.action_prediction_end_label": "End prediction",
    "graphs.node.action_prediction_end_desc": "Locks, resolves or cancels a prediction. Leave Prediction ID empty to act on the one that is running or locked. Winning outcome is read only on Resolve: its position, 1 for the first outcome, so !resolve 2 with {command.args} picks the second. Resolving pays out the points for good; a position the prediction does not have ends on Error and resolves nothing. Affiliate or Partner only.",
    "graphs.port.channel_points_voting": "Extra votes with channel points",
    "graphs.port.channel_points_per_vote": "Channel points per extra vote",
    "graphs.port.prediction_window": "Prediction window (seconds)",
    "graphs.port.winning_position": "Winning outcome (position)",
    "graphs.param.status": "Status",
    "graphs.option.poll_end_show": "End (show results)",
    "graphs.option.poll_end_hide": "End and hide",
    "graphs.option.prediction_lock": "Lock",
    "graphs.option.prediction_resolve": "Resolve",
    "graphs.option.prediction_cancel": "Cancel (refund points)",
    "graphs.node.action_chat_pin_label": "Pin chat message",
    "graphs.node.action_chat_pin_desc": "Pins a chat message above chat, or unpins it. Runs as your default sender, which has to moderate your channel. Leave Duration empty to pin until the stream ends, otherwise 30 to 1800 seconds. In a command sent as a reply, {reply.parent_message_id} is the message replied to, so a mod's !pin pins it. A message that is already pinned ends on Error.",
    "graphs.port.pin_duration_help": "Empty pins until the stream ends. Otherwise 30 to 1800 seconds.",
    "graphs.option.pin": "Pin",
    "graphs.option.unpin": "Unpin",
    "graphs.node.action_twitch_snooze_next_ad_label": "Snooze next ad",
    "graphs.node.action_twitch_snooze_next_ad_desc": "Pushes the next scheduled ad back by 5 minutes, on your own account. Outputs when the next ad now starts and how many snoozes are left. Not live, no ad scheduled and no snoozes left end on Error. Ad Break Incoming fires again for the new time, so a flow that snoozes on every Ad Break Incoming snoozes until none are left. Affiliate or Partner only.",
    "graphs.node.action_twitch_raid_label": "Raid a channel",
    "graphs.node.action_twitch_raid_desc": "Starts a raid on the channel named by Target Login, on your own account, or cancels the raid you started. Twitch counts down before the raid goes through, and the “Raid sent” trigger fires once it does. A cancelled raid fires nothing. A login no channel has, a raid already under way, no raid to cancel and more than 10 raids in 10 minutes end on Error. In a command, {target.login} is the channel named after it, so !raid name raids name.",
    "graphs.port.raid_target_help": "The channel to raid, by its login. A leading @ is fine. In a command, {target.login} is the channel named after it. Cancel ignores it.",
    "graphs.option.raid_start": "Start raid",
    "graphs.option.raid_cancel": "Cancel raid",
    "graphs.node.action_twitch_get_user_info_label": "Get User Info",
    "graphs.node.action_twitch_get_user_info_desc": "Looks up a user via Helix and returns whether they are a Mod, VIP, Subscriber, or Follower of this channel, plus their login + display name. Cached 60s per (property, user) inside the runtime. Missing scopes degrade gracefully: the corresponding boolean returns false with a debug-log warning, the Success branch still fires.",
    "graphs.node.action_tts_speak_label": "Speak (TTS)",
    "graphs.node.action_tts_speak_desc": "Reads the given text aloud through every active Audio-Out scene. Text is normalized (anti-screaming, URL cleanup, emoji strip, char-limit 500) before synthesis.",
    "graphs.node.action_sound_play_label": "Play Sound",
    "graphs.node.action_sound_play_desc": "Plays an audio asset through every active Audio-Out scene.",
    "graphs.node.action_text_filter_profanity_label": "Filter Profanity",
    "graphs.node.action_text_filter_profanity_desc": "Scans text against curated DE+EN profanity lists plus optional adhoc words. Routes to the \"Clean\" or \"Blocked\" branch and outputs the (optionally masked) text and match metadata.",
    "graphs.node.action_widgets_play_media_label": "Play Media",
    "graphs.node.action_widgets_play_media_desc": "Plays a video or image asset through the Media Player widget, one alert at a time, optionally with an extra sound track.",
    "graphs.node.action_widgets_play_composition_label": "Play Composition",
    "graphs.node.action_widgets_play_composition_desc": "Plays an alert composition on a named stage. Runs through the alert queue. Queued fires as soon as the play is in the alert queue; it does not wait for the composition. To act when it has ended, use Composition Ended.",
    "graphs.node.action_widgets_play_composition_param_composition": "Composition",
    "graphs.node.action_widgets_play_composition_param_stage": "Stage",
    "graphs.node.action_widgets_play_composition_param_stage_help": "Only for compositions placed in no Composition widget.",
    "graphs.node.action_rewards_update_label": "Update reward",
    "graphs.node.action_rewards_update_desc": "Sets the cost, the global cooldown and the limits of a channel-points reward, and pauses or resumes it. Leave a field empty to keep it as it is; 0 turns the cooldown or a limit off. The cooldown is in seconds, up to 7 days. Wire Reward Cost through Add into Cost to raise the price with each redemption. Whether the reward is enabled stays as it is, so its category binding keeps working. Works only for rewards created in Streambridge; any other reward ends on Error. Saving the reward form later overwrites these values.",
    "graphs.node.action_rewards_update_param_reward": "Reward",
    "graphs.node.action_rewards_update_param_paused": "Paused",
    "graphs.node.action_rewards_update_redemption_label": "Update redemption status",
    "graphs.node.action_rewards_update_redemption_desc": "Fulfils or cancels a channel-points redemption. Cancelling refunds the viewer's points. Leave Reward and Redemption ID empty to act on the redemption that started this run. Wire Get pending redemptions into Redemptions to update all of them in one go. Works only for rewards created in Streambridge that do not skip the request queue; any other reward ends on Error.",
    "graphs.node.action_rewards_update_redemption_param_status": "Status",
    "graphs.node.action_rewards_update_redemption_param_reward": "Reward",
    "graphs.node.action_rewards_update_redemption_param_reward_help": "Empty: the reward of the redemption that started this run.",
    "graphs.node.pure_rewards_pending_redemptions_label": "Get pending redemptions",
    "graphs.node.pure_rewards_pending_redemptions_desc": "The redemptions of a reward still waiting in the request queue, oldest first, each with id, user_login, user_input and redeemed_at. Wire them into Update redemption status's Redemptions, e.g. to refund every open request at stream end. Read from Twitch at most every 30 seconds. Works only for rewards created in Streambridge; any other reward gives an empty list.",
    "graphs.node.pure_rewards_pending_redemptions_param_reward": "Reward",
    "graphs.node.trigger_rewards_redemption_label": "Reward redeemed",
    "graphs.node.trigger_rewards_redemption_desc": "Fires when a viewer redeems the selected channel-points reward.",
    "graphs.node.trigger_rewards_redemption_param_reward": "Reward",
    "graphs.node.action_rewards_enable_label": "Enable reward",
    "graphs.node.action_rewards_enable_desc": "Enables the selected reward and sets its manual override.",
    "graphs.node.action_rewards_enable_param_reward": "Reward",
    "graphs.node.action_rewards_disable_label": "Disable reward",
    "graphs.node.action_rewards_disable_desc": "Disables the selected reward and sets its manual override.",
    "graphs.node.action_rewards_disable_param_reward": "Reward",
    "graphs.node.action_rewards_toggle_tag_label": "Toggle rewards by tag",
    "graphs.node.action_rewards_toggle_tag_desc": "Enables, disables or toggles every managed reward carrying the selected tag at once. Sets the manual override on each affected reward.",
    "graphs.node.action_rewards_toggle_tag_param_tag": "Tag",
    "graphs.node.action_rewards_toggle_tag_param_state": "State",
    "graphs.node.action_rewards_clear_override_label": "Clear manual override",
    "graphs.node.action_rewards_clear_override_desc": "Clears the manual override on a single reward or on every reward carrying a tag, so the category binding takes over again.",
    "graphs.node.action_rewards_clear_override_param_target": "Target",
    "graphs.node.action_rewards_clear_override_param_reward": "Reward",
    "graphs.node.action_rewards_clear_override_param_tag": "Tag",
    "graphs.exec.redeemed": "Redeemed",
    "graphs.port.affected_count": "Affected count",
    "graphs.option.enable": "Enable",
    "graphs.option.disable": "Disable",
    "graphs.option.toggle": "Toggle",
    "graphs.option.single_reward": "Single reward",
    "graphs.option.rewards_with_tag": "All rewards with tag",
    "graphs.node.trigger_compositions_ended_label": "Composition Ended",
    "graphs.node.trigger_compositions_ended_desc": "Triggered when a play of the selected composition has ended: played to the end, skipped, or not played, with the reason. `{origin.…}` reads the event that caused the play. Only plays from Play Composition are reported, and only while an overlay is connected. \"Played\" and \"overlay lost\" are reported by the overlay showing the composition: treat them as that overlay's word, not as proof.",
    "graphs.exec.played": "Played",
    "graphs.exec.skipped": "Skipped",
    "graphs.exec.not_played": "Not played",
    "graphs.exec.queued": "Queued",
    "graphs.composition_ended.origin_group": "Event that caused the play",
    "graphs.composition_ended.origin_only": "only when :events caused the play",
    "graphs.port.sound_asset": "Sound Track",
    "graphs.param.mute_video": "Mute video audio",
    "graphs.param.mute_video_help": "Silences only the video's own audio track. The sound track keeps playing.",
    "graphs.param.repeat": "Repetitions",
    "graphs.param.repeat_help": "Plays the video this many times in a row. Ignored for images.",
    "graphs.param.placement": "Placement",
    "graphs.param.placement_help": "Position and size inside the media widget. Without a value the asset fills the whole widget.",
    "events.verb.play_media": "Play a video or image",
    "graphs.exec.started": "Started",
    "graphs.exec.failed": "Failed",
    "graphs.exec.looked_up": "Looked up",
    "graphs.exec.clean": "Clean",
    "graphs.port.url": "URL",
    "graphs.port.body": "Body",
    "graphs.port.headers": "Headers",
    "graphs.port.response_body": "Response Body",
    "graphs.port.response_headers": "Response Headers",
    "graphs.port.length_s": "Length (s)",
    "graphs.port.retry_after_s": "Retry after (s)",
    "graphs.port.is_vip": "Is VIP",
    "graphs.port.is_follower": "Is Follower",
    "graphs.port.volume": "Volume",
    "graphs.port.asset": "Asset",
    "graphs.port.asset_name": "Asset Name",
    "graphs.port.extra_words": "Extra Words",
    "graphs.port.replacement": "Replacement",
    "graphs.port.had_match": "Had Match",
    "graphs.port.matched_words": "Matched Words",
    "graphs.param.method": "Method",
    "graphs.param.length": "Length",
    "graphs.param.language": "Language",
    "graphs.param.voice": "Voice",
    "graphs.option.get": "GET",
    "graphs.option.head": "HEAD",
    "graphs.option.post": "POST",
    "graphs.option.put": "PUT",
    "graphs.option.patch": "PATCH",
    "graphs.option.delete": "DELETE",
    "graphs.option.thirty_seconds": "30 seconds",
    "graphs.option.sixty_seconds": "60 seconds",
    "graphs.option.ninety_seconds": "90 seconds",
    "graphs.option.two_minutes": "2 minutes",
    "graphs.option.two_thirty_minutes": "2:30 minutes",
    "graphs.option.three_minutes": "3 minutes",
    "graphs.option.lang_de_de": "German (DE)",
    "graphs.option.lang_en_us": "English (US)",
    "graphs.option.voice_default": "Channel default",
    "graphs.option.voice_emma": "Emma",
    "graphs.option.voice_hans": "Hans",
    "graphs.option.voice_sarah": "Sarah",
    "graphs.option.voice_felix": "Felix",
    "graphs.option.voice_evelyn": "Evelyn",
    "graphs.option.voice_mia": "Mia",
    "graphs.option.voice_liam": "Liam",
    "graphs.option.voice_benjamin": "Benjamin",
    "graphs.tts.play_sample": "Play sample",
    "extensions.tts.settings_title": "Text-to-Speech",
    "extensions.tts.settings_card_description": "Default voice for spoken output in your stream.",
    "extensions.tts.settings_saved": "Settings saved.",
    "extensions.tts.profanity_section_title": "Word filter",
    "extensions.tts.profanity_mode_label": "Filter mode",
    "extensions.tts.profanity_mode_off": "Off",
    "extensions.tts.profanity_mode_mask": "Mask matched words",
    "extensions.tts.profanity_mode_block": "Skip the whole message",
    "extensions.tts.profanity_mode_help": "Applied to every spoken text before it is synthesized.",
    "extensions.tts.profanity_custom_words_label": "Custom words",
    "extensions.tts.profanity_custom_words_help": "One word per line. Matched anywhere inside a word.",
    "errors.tts.custom_word_too_long": "Custom words may be at most 64 characters long.",
    "errors.tts.too_many_custom_words": "Too many custom words (maximum 200).",
    "errors.tts.unknown_voice": "Unknown voice.",
    "graphs.port.search": "Search",
    "graphs.port.replace": "Replace",
    "graphs.port.start": "Start",
    "graphs.port.date_value": "Date value",
    "graphs.port.milliseconds": "Milliseconds",
    "graphs.port.iso": "ISO 8601",
    "graphs.port.unix_seconds": "Unix seconds",
    "graphs.port.category_since": "Category Since",
    "graphs.port.category_seconds": "Category Seconds",
    "graphs.port.stream_delay": "Stream Delay",
    "graphs.port.tags": "Tags",
    "graphs.port.branded_content": "Branded Content",
    "graphs.port.steam_store_link": "Steam Store Link",
    "graphs.port.length_s_help": "Length Twitch actually started (echo of the requested length on success, 0 on failure).",
    "graphs.port.retry_after_s_help": "Cooldown remaining when Twitch returned 429. 0 on success or non-rate-limit failures.",
    "graphs.port.message_help": "Twitch's message field on success, or the error message on failure.",
    "graphs.port.user_id_help": "Numeric Twitch user id. Connect from a trigger's user_id output or any user-emitting upstream node.",
    "graphs.port.milliseconds_help": "Milliseconds since 1970-01-01T00:00:00Z.",
    "graphs.port.iso_help": "ISO 8601 string in UTC, e.g. 2026-05-16T13:42:11.123Z.",
    "graphs.port.unix_seconds_help": "Seconds since 1970-01-01T00:00:00Z (floor of milliseconds/1000).",
    "graphs.port.title_help": "Current stream title.",
    "graphs.port.category_help": "Current Twitch category / game name.",
    "graphs.port.category_since_help": "ISO 8601 timestamp the current category was set (empty if unknown). Resets on category change and stream start.",
    "graphs.port.category_seconds_help": "Seconds since the category was set (0 if unknown).",
    "graphs.port.language_help": "Two-letter language code the broadcaster set on the channel.",
    "graphs.port.user_login_help": "Broadcaster's URL slug (e.g. xeras).",
    "graphs.port.user_display_name_help": "Broadcaster's display name (e.g. Xeras).",
    "graphs.port.stream_delay_help": "Configured stream delay in seconds.",
    "graphs.port.tags_help": "Stream tags.",
    "graphs.port.branded_content_help": "Whether the stream is flagged as branded content.",
    "graphs.port.steam_store_link_help": "store.steampowered.com/app/<id> for the current category, empty if not a Steam game.",
    "graphs.param.template": "Template",
    "graphs.param.preset": "Preset",
    "graphs.param.input": "Input",
    "graphs.param.min": "Min",
    "graphs.param.max": "Max",
    "graphs.option.duration_compact": "Compact (3h 24m)",
    "graphs.option.duration_long": "Long (3 hours 24 minutes)",
    "graphs.option.duration_clock": "Clock (1:23:45)",
    "graphs.option.date_short": "Short date (30.05.2026)",
    "graphs.option.date_long": "Long date (30 May 2026)",
    "graphs.option.date_datetime": "Date and time (UTC)",
    "graphs.option.date_relative": "Relative (3 days ago)",
    "graphs.option.date_elapsed": "Elapsed (4 weeks)",
    "graphs.option.date_uptime": "Uptime (3 hours 24 minutes)",
    "graphs.option.input_auto": "Auto detect",
    "graphs.option.input_iso": "ISO 8601 string",
    "graphs.option.input_unix_seconds": "Unix timestamp (seconds)",
    "graphs.option.input_unix_milliseconds": "Unix timestamp (milliseconds)",
    "graphs.node.pure_string_concat_label": "Concat Strings",
    "graphs.node.pure_string_concat_desc": "Joins multiple strings end to end.",
    "graphs.node.pure_format_label": "Format",
    "graphs.node.pure_format_desc": "Turns an InputText template (with variables and pickers) into a string. The same template engine ChatSend.text uses, but as an output: feed the result into HTTP body, JSON construction, or further string ops.",
    "graphs.node.pure_string_replace_label": "Replace",
    "graphs.node.pure_string_replace_desc": "Replaces every occurrence of `search` with `replace` in `value`. No regex: literal match.",
    "graphs.node.pure_string_substring_label": "Substring",
    "graphs.node.pure_string_substring_desc": "Cuts characters from `value` starting at `start`, up to `length` characters. Negative or missing `length` reads to the end.",
    "graphs.node.pure_string_length_label": "String Length",
    "graphs.node.pure_string_length_desc": "Number of characters in the string.",
    "graphs.node.pure_format_duration_label": "Format Duration",
    "graphs.node.pure_format_duration_desc": "Formats a number of seconds into a human-readable duration (e.g. 3h 24m). Same formatter as the InputText format option.",
    "graphs.node.pure_format_date_label": "Format Date",
    "graphs.node.pure_format_date_desc": "Formats an ISO 8601 string or Unix timestamp into a readable date. Auto-detects the input kind by default; absolute times are shown in UTC.",
    "graphs.node.pure_random_int_label": "Random Int",
    "graphs.node.pure_random_int_desc": "Random integer in [min, max] (inclusive).",
    "graphs.node.pure_random_choice_label": "Random Choice",
    "graphs.node.pure_random_choice_desc": "Picks one element of an array at random.",
    "graphs.node.pure_date_now_label": "Now",
    "graphs.node.pure_date_now_desc": "Current wall-clock timestamp at the moment this node executes. Returns fresh values on each call: two Now nodes in the same graph (with delay in between) report different times.",
    "graphs.node.pure_channel_info_label": "Get Channel Info",
    "graphs.node.pure_channel_info_desc": "Current channel data for the property this graph runs in. Re-reads live state on each call. Connect Category Since into Format Date, Category Seconds into Compare.",
    "graphs.node.pure_stream_state_label": "Get stream state",
    "graphs.node.pure_stream_state_desc": "Whether the stream is live and since when. Read from the stream state the online and offline events keep current, so it costs no Twitch call. Connect Stream start into Format Date with the Uptime preset for !uptime.",
    "graphs.node.pure_twitch_hype_train_label": "Get hype train",
    "graphs.node.pure_twitch_hype_train_desc": "The hype train running on the channel right now, if any. Read from Twitch at most every 30 seconds, so a chat flow can pull it on every message. Needs the hype train permission.",
    "graphs.node.pure_channel_steam_url_label": "Steam Store Link",
    "graphs.node.pure_channel_steam_url_desc": "Steam store page for the channel's current category. Empty when the category is not a Steam game. A separate node so its lookup only runs when connected.",
    "graphs.node.pure_variable_label": "Get Variable",
    "graphs.node.pure_variable_desc": "Reads the current value of a property or graph variable.",
    "graphs.node.pure_select_label": "Select",
    "graphs.node.pure_select_desc": "Outputs one of two values based on a condition. Both inputs are evaluated; use Branch for flow routing.",
    "graphs.node.pure_ctx_get_label": "Get Context",
    "graphs.node.pure_ctx_get_desc": "Reads a value by slug from the current run context (written by Set Context). Memoized per run, so place it after the matching Set Context.",
    "graphs.port.if_true": "If True",
    "graphs.port.if_false": "If False",
    "graphs.param.default": "Default",
    "graphs.param.separator": "Separator",
    "graphs.node.convert_to_string_label": "To String",
    "graphs.node.convert_to_string_desc": "Coerces any value to a string.",
    "graphs.node.convert_to_number_label": "To Number",
    "graphs.node.convert_to_number_desc": "Parses a string to a number. Returns Default when the input is empty or unparseable: set Default to 1 to make optional command args fall back cleanly (e.g. `!counter +` → 1, `!counter + 5` → 5).",
    "graphs.node.convert_to_boolean_label": "To Boolean",
    "graphs.node.convert_to_boolean_desc": "Coerces any value to a boolean (truthy-check; \"0\"/\"false\"/\"\" are false).",
    "graphs.node.convert_json_stringify_label": "JSON Stringify",
    "graphs.node.convert_json_stringify_desc": "Serialises an object or array to a JSON string.",
    "graphs.node.convert_json_parse_label": "JSON Parse",
    "graphs.node.convert_json_parse_desc": "Parses a JSON string. Invalid input → null.",
    "graphs.node.convert_string_split_label": "Split String",
    "graphs.node.convert_string_split_desc": "Splits a string on a separator into an array.",
    "graphs.node.convert_string_chunk_label": "Chunk String",
    "graphs.node.convert_string_chunk_desc": "Splits a string into chunks of a fixed maximum length.",
    "graphs.param.size": "Max Length",
    "graphs.option.chunk_words": "At word boundaries",
    "graphs.option.chunk_chars": "By characters",
    "graphs.node.convert_string_url_encode_label": "URL Encode",
    "graphs.node.convert_string_url_encode_desc": "Percent-encodes a string for safe inclusion in a URL (RFC 3986 component encoding). Spaces become %20, special chars are escaped: required for arbitrary user input in URL paths or query strings.",
    "graphs.node.convert_array_join_label": "Join Array",
    "graphs.node.convert_array_join_desc": "Joins array elements into a string with a separator.",
    "graphs.group.advanced": "Advanced",
    "graphs.group.alerts": "Alerts",
    "graphs.package_copy.frozen": "This flow belongs to an installed app and can't be edited. You can still configure it.",
    "graphs.own_flows.missing": "Your own flows don't run until the Automations app is installed on this channel.",
    "graphs.own_flows.install": "Install Automations",
    "graphs.package_copy.copy_refused": ":name belongs to an installed app and can't be copied into a package.",
    "extensions.discord.title": "Discord",
    "extensions.discord.add": "Webhook",
    "extensions.discord.empty": "No webhooks yet. Add one to post to Discord.",
    "extensions.discord.disabled": "disabled",
    "extensions.discord.form.label": "Label",
    "extensions.discord.form.label_help": "e.g. #stream-events, for your reference only.",
    "extensions.discord.form.url": "Webhook URL",
    "extensions.discord.form.create_title": "Add webhook",
    "extensions.discord.form.edit_title": "Edit webhook",
    "extensions.discord.form.url_edit_help": "Leave blank to keep the saved URL.",
    "extensions.discord.edit_aria": "Edit webhook :label",
    "extensions.discord.delete_confirm_title": "Delete webhook?",
    "extensions.discord.delete_confirm_message": "The webhook is removed. Graphs that use it will take the Error branch.",
    "extensions.discord.errors.invalid_webhook_url": "Please enter a valid Discord webhook URL (https://discord.com/api/webhooks/…).",
    "extensions.discord.flash.created": "Webhook created.",
    "extensions.discord.flash.updated": "Webhook saved.",
    "extensions.discord.flash.deleted": "Webhook deleted.",
    "extensions.discord.tutorial.title": "How to create a webhook",
    "extensions.discord.tutorial.body": "1. Discord → Server Settings\n2. Integrations → Webhooks\n3. \"New Webhook\" → choose a channel\n4. \"Copy Webhook URL\" and paste it here.",
    "extensions.discord.quick_action": "New webhook",
    "builder.api_tokens.title": "Service tokens",
    "builder.api_tokens.intro": "Service tokens let your own automations and tools use the Builder API on your behalf without anyone logging in. Each token only gets the abilities you pick.",
    "builder.api_tokens.copy_hint": "Copy this token now. It is only shown once.",
    "builder.api_tokens.name_label": "Token name",
    "builder.api_tokens.abilities_label": "Abilities",
    "builder.api_tokens.create": "Create token",
    "builder.api_tokens.revoke": "Revoke",
    "builder.api_tokens.revoke_title": "Revoke token?",
    "builder.api_tokens.revoke_message": "Tools using this token lose access immediately.",
    "builder.api_tokens.empty": "No tokens yet.",
    "builder.api_tokens.last_used": "Last used",
    "builder.api_tokens.endpoint_hint": "AI agents connect through the MCP server at this address, sending the token as Bearer in the Authorization header. The connected agent can build both widgets and event flows:",
    "builder.api_tokens.claude_label": "Claude Code (one command):",
    "builder.api_tokens.oauth_title": "Connection",
    "builder.api_tokens.oauth_intro": "Just add the URL to your MCP client, login and approval happen in the browser.",
    "builder.api_tokens.oauth_connected_at": "Connected since",
    "builder.api_tokens.oauth_disconnect": "Disconnect",
    "builder.api_tokens.oauth_disconnect_title": "Disconnect client?",
    "builder.api_tokens.oauth_disconnect_message": "The client loses access immediately and must reconnect.",
    "builder.api_tokens.oauth_empty": "No connected clients yet.",
    "builder.api_tokens.json_label": "Other MCP clients (JSON config):",
    "builder.content.tab": "Content",
    "builder.content.create_failed": "Create failed.",
    "builder.content.invalid_name": "This name cannot be used.",
    "builder.editor.help": "Help",
    "builder.api.read_first": "Read it first: read_file, get_flow or get_package returns the revision to send as expected_revision.",
    "builder.files.manifest_via_endpoint": "manifest.json is written through the manifest endpoint, which derives the id and validates — not as a raw file.",
    "builder.files.too_large": "A file may be at most :max.",
    "builder.new.title": "New package",
    "builder.new.from_flow": "Starts with flow: :name",
    "builder.start.title": "What do you want to build?",
    "builder.start.lead": "This is only the start. Any package can take anything afterwards.",
    "builder.start.starter_alert": "Alert",
    "builder.start.starter_alert_help": "Show something when something happens: follow, sub, raid …",
    "builder.start.starter_scene": "Overlay scene",
    "builder.start.starter_scene_help": "A scene for OBS, with widgets and compositions",
    "builder.start.starter_chat": "Chat automation",
    "builder.start.starter_chat_help": "React to the chat: commands and replies",
    "builder.start.starter_blank": "Blank",
    "builder.start.starter_blank_help": "No starting content. Code widgets are added from here.",
    "builder.start.take_over_help": "Flows, compositions and scenes you have already built. What they need comes along.",
    "builder.start.placeholder_alert": "e.g. Neon follow alert",
    "builder.start.placeholder_scene": "e.g. Gaming overlay",
    "builder.start.placeholder_chat": "e.g. Chat helper",
    "builder.start.placeholder_blank": "e.g. My package",
    "builder.start.event": "On which event?",
    "builder.start.submit": "Create package",
    "builder.start.later": "Version, description and images come later: in the listing and when you publish.",
    "builder.start.event_follow": "Follow",
    "builder.start.event_subscribe": "Sub",
    "builder.start.event_gift": "Gift sub",
    "builder.start.event_raid": "Raid",
    "builder.start.event_cheer": "Cheer",
    "builder.start.alert_text_follow": "{user.name} is now following!",
    "builder.start.alert_text_subscribe": "{user.name} just subscribed!",
    "builder.start.alert_text_gift": "{user.name} gifted {total} subs!",
    "builder.start.alert_text_raid": "{from_user.name} is raiding with {viewers} viewers!",
    "builder.start.alert_text_cheer": "{user.name} cheered {bits} bits!",
    "builder.start.alert_composition": ":event_name alert",
    "builder.start.alert_scene": "Alert scene",
    "builder.start.alert_needs_compositions": "An alert needs the Compositions extension.",
    "builder.start.slot_image": "Image",
    "builder.start.slot_sound": "Sound",
    "builder.start.overlay_scene": "Overlay",
    "builder.start.chat_keyword": "hello",
    "builder.start.chat_flow": "Hello command",
    "builder.start.chat_reply": "Hi {user.name}, good to see you!",
    "builder.start.default_scene": "My overlay",
    "builder.start.default_chat": "Chat helper",
    "builder.start.default_blank": "My package",
    "builder.assets.group_label": "Assets",
    "builder.assets.rights_hint": "Only upload content you hold the required rights to. These files ship with the package.",
    "builder.assets.add": "Add file",
    "builder.assets.drop_hint": "Drop images or sounds here to add them",
    "builder.assets.delete": "Delete",
    "builder.assets.delete_confirm": "Delete this file? Widget code that references it will stop working.",
    "builder.assets.size_label": "Size",
    "builder.assets.no_preview": "No preview available for this file.",
    "builder.assets.error_type": "Only images (png, jpg, gif, webp, svg) and sounds (mp3, ogg, wav) are allowed.",
    "builder.assets.error_file_size": "Each file must be 5 MB or smaller.",
    "builder.assets.error_bundle_size": "The bundle would exceed the 25 MB total limit.",
    "builder.assets.upload_failed": "Upload failed. Please try again.",
    "builder.assets.uploading_progress": "Uploading: :done of :total",
    "builder.assets.delete_failed": "Delete failed. Please try again.",
    "builder.assets.insert_code": "Insert in code",
    "builder.assets.copy_path": "Copy path",
    "builder.assets.copied": "Copied",
    "builder.assets.replace_type": "Replace takes a file of the same type (:mime) only. Upload this file as a new asset.",
    "builder.assets.type_refused": "A package cannot carry this kind of file: images (jpg, png, webp, gif), sounds (mp3, ogg, webm) and videos (mp4, webm), up to 20 MB, and data files (json) and code files (js, mjs, css), up to 2 MB.",
    "builder.assets.not_text": "This file is not text: a data or code file is UTF-8 text without a NUL byte.",
    "builder.assets.json_invalid": "This file is not valid JSON. A data file (json) must parse.",
    "builder.assets.text_too_large": "A data or code file may be at most :max.",
    "builder.assets.upload_size_mismatch": "The file does not have the declared size (:size bytes).",
    "builder.assets.upload_type_mismatch": "The file is not of the declared type (:mime).",
    "builder.assets.path_invalid": "A path is folders and a file name: letters, digits, `.`, `_` and `-`, separated by `/`.",
    "builder.assets.path_too_long": "The path is too long: at most :max characters with `assets/`.",
    "builder.assets.path_taken": "`:path` is taken in this package.",
    "builder.assets.path_clash": "`:path` cannot be a file and a folder at once: `:other` is in the way.",
    "builder.assets.paths_collide": "Several entries make the same path: :path",
    "builder.assets.move_manifest_invalid": "Nothing was moved: the package's technical settings are currently invalid. Under “:section”, “:action” shows what is wrong when you save.",
    "builder.assets.folder_missing": "This package has no folder “:folder”.",
    "builder.assets.folder_into_itself": "A folder cannot move into itself.",
    "builder.assets.folder_taken": ":count target path already exists. Nothing was moved:|:count target paths already exist. Nothing was moved:",
    "builder.assets.cursor_invalid": "This cursor belongs to no page of this listing. Read the first page without it.",
    "builder.assets.upload_count_mismatch": ":count file was declared and :received arrived. Nothing was stored.|:count files were declared and :received arrived. Nothing was stored.",
    "builder.assets.quota_count_refused": "That does not fit the package quota: :count of :total assets, :free free.",
    "builder.assets.quota_bytes_refused": "That does not fit the package quota: :used of :limit used, :free free.",
    "builder.assets.quota_support": "Contact support if you need more room.",
    "builder.assets.quota_support_link": "Ask for more room: :url",
    "builder.assets.quota_line": ":count of :total assets · :used of :limit",
    "builder.assets.quota_full": "The package quota is full.",
    "builder.assets.quota_ask": "Ask for more room",
    "builder.assets.selection_too_big": "This selection is :over too big for the package quota (:free free). Nothing was uploaded.",
    "builder.assets.selection_too_many": "This selection has :count asset too many for the package quota (:free free). Nothing was uploaded.|This selection has :count assets too many for the package quota (:free free). Nothing was uploaded.",
    "builder.assets.modal_title": "Package assets",
    "builder.assets.kind_image": "Image",
    "builder.assets.kind_audio": "Sound",
    "builder.assets.kind_video": "Video",
    "builder.assets.kind_data": "Data",
    "builder.assets.kind_code": "Code",
    "builder.assets.edit": "Edit",
    "builder.assets.file_saved": "Saved",
    "builder.assets.file_moved": "This file is now at `:path`. Reload the page to edit it there.",
    "builder.assets.back_to_gallery": "To the gallery",
    "builder.assets.new_file": "New file",
    "builder.assets.new_file_path": "The file's path",
    "builder.assets.new_file_hint": "A data file ends in .json, a code file in .js, .mjs or .css.",
    "builder.assets.new_file_type": "The path must end in .json, .js, .mjs or .css.",
    "builder.assets.filter_all": "All",
    "builder.assets.filter_image": "Images",
    "builder.assets.filter_audio": "Sounds",
    "builder.assets.filter_video": "Videos",
    "builder.assets.filter_data": "Data",
    "builder.assets.filter_code": "Code",
    "builder.assets.filter_unused": "Unused",
    "builder.assets.upload": "Upload",
    "builder.assets.from_library": "From my library",
    "builder.assets.library_hint": "A copy is taken over: your library stays as it is.",
    "builder.assets.library_empty": "Your library is empty.",
    "builder.assets.adopt": "Take over",
    "builder.assets.adopt_failed": "Taking it over did not work. Please try again.",
    "builder.assets.back": "Back to the assets",
    "builder.assets.search": "Search …",
    "builder.assets.sort": "Sort",
    "builder.assets.sort_newest": "Newest",
    "builder.assets.sort_name": "Name",
    "builder.assets.sort_size": "Size",
    "builder.assets.sort_usage": "Usage",
    "builder.assets.drop_here": "Drop files here",
    "builder.assets.checked": "selected",
    "builder.assets.uncheck": "Clear selection",
    "builder.assets.delete_many": "Delete one asset?|Delete :count assets?",
    "builder.assets.delete_used": "It is still used. Where it goes missing, the spot stays empty:",
    "builder.assets.delete_unused": "It is not used anywhere.",
    "builder.assets.move_failed": "Moving did not work. Please try again.",
    "builder.assets.detail": "Asset",
    "builder.assets.close": "Close",
    "builder.assets.path": "Path",
    "builder.assets.export_path": "Path in the package",
    "builder.assets.path_hint": "Code reaches the file at `../../assets/` and this path.",
    "builder.assets.move_title": "Move anyway?",
    "builder.assets.move_code": "These places write the old path, and none of them is changed:",
    "builder.assets.move": "Move",
    "builder.assets.used_in": "Used in",
    "builder.assets.unused": "Not used anywhere yet.",
    "builder.assets.replace": "Replace …",
    "builder.assets.replace_all": "Replace",
    "builder.assets.taken_title": "This path is taken|These :count paths are taken",
    "builder.assets.taken_body": "Replace keeps each asset and its path and swaps the file only. The old file stays under Versions › Discarded for 30 days.",
    "builder.assets.converted": ":count name converted: :list|:count names converted: :list",
    "builder.assets.use": "Choose",
    "builder.assets.insert_path": "Insert path",
    "builder.assets.usage_composition": "Composition",
    "builder.assets.usage_flow": "Flow",
    "builder.assets.usage_scene": "Scene",
    "builder.assets.usage_widget": "Widget code",
    "builder.assets.usage_listing": "Listing",
    "builder.assets.usage_data": "Data file",
    "builder.assets.usage_code": "Code file",
    "builder.assets.file_name": "File name",
    "builder.assets.folder": "Folder",
    "builder.assets.folder_count": ":count asset|:count assets",
    "builder.assets.usages_failed": "Could not load where the asset is used.",
    "builder.assets.folder_name": "Folder name",
    "builder.assets.folder_places": "Code that names this folder",
    "builder.assets.delete_folder": "Delete folder “:folder” and its :count asset?|Delete folder “:folder” and its :count assets?",
    "builder.assets.deleted_kept": "What is deleted stays under Versions › Discarded for 30 days.",
    "builder.assets.select_all": "Select all",
    "builder.assets.new_folder": "New folder",
    "builder.assets.folder_held": "A folder stays as long as an asset is in it.",
    "builder.assets.tree_search": "Search paths …",
    "builder.assets.tree_none": "No asset matches the search.",
    "builder.assets.tree_more": "One more asset here: search shows it.|:count more assets here: search shows them.",
    "builder.assets.tree_more_found": "One more match: narrow the search.|:count more matches: narrow the search.",
    "builder.assets.move_to": "Move …",
    "builder.assets.move_into_title": "Move where?",
    "builder.assets.move_into_path": "Or a new path",
    "builder.assets.intake_checking": "Checking: :done of :total",
    "builder.assets.skip_taken": "Skip",
    "builder.assets.collisions_title": "Several files make the same path",
    "builder.assets.collisions_body": "Rename them so each gets a path of its own, then upload them again. Nothing was uploaded.",
    "builder.assets.quota_stop_title": "This does not fit the package quota",
    "builder.assets.replace_too_big": "Replacing would go :over past the package quota.",
    "builder.assets.more_paths": ":count more path|:count more paths",
    "builder.assets.result_title": "Uploaded",
    "builder.assets.result_added": ":count added|:count added",
    "builder.assets.result_replaced": ":count replaced|:count replaced",
    "builder.assets.result_unchanged": ":count unchanged|:count unchanged",
    "builder.assets.result_converted": ":count name converted|:count names converted",
    "builder.assets.result_skipped": ":count skipped|:count skipped",
    "builder.assets.result_failed": ":count not uploaded|:count not uploaded",
    "builder.assets.reason_type": "A type a package cannot take",
    "builder.assets.reason_size": "Larger than :max",
    "builder.assets.reason_clash": "A file and a folder would share one name",
    "builder.assets.reason_path": "Path too long",
    "builder.assets.reason_taken": "Path taken",
    "builder.assets.reason_quota": "Quota",
    "builder.assets.reason_taken_since": "Taken in the meantime",
    "builder.assets.reason_aborted": "Cancelled",
    "builder.assets.retry": "Try again",
    "builder.assets.upload_files": "Files …",
    "builder.assets.upload_folder": "Folder …",
    "builder.assets.upload_more": "More ways to upload",
    "builder.assets.adopt_selected": "Take over selection (:count)",
    "builder.assets.fold": "Expand or collapse",
    "builder.import.asset_missing": "A referenced media file no longer exists on your property.",
    "builder.import.name_collision": "An item named ':name' already exists in this package.",
    "builder.import.failed": "Import failed.",
    "builder.import.scene_composition_foreign": "The Composition widget plays ':name', which is not one of this package's compositions. Pick one of the package's own.",
    "builder.import.scene_foreign_widget": "Widget belongs to package :package. Only this package's widgets and builtins can be part of a scene template.",
    "builder.import.scene_widget_key_missing": "Widget key ':key' is not part of this package's widgets. It cannot be imported as a scene template.",
    "builder.import.scene_dropped_hint": "Not carried into the template: :fields",
    "builder.workspace.item_missing": "This item does not (or no longer) exist in the package.",
    "builder.workspace.sync_failed": "Saved, but not written into the package: :reason",
    "builder.workspace.sync_failed_invalid": "Saved, but not written into the package: the package's technical settings are currently invalid. Under “:section”, “:action” shows what is wrong when you save.",
    "builder.workspace.draft_missing": "The package this belongs to no longer exists.",
    "builder.package_row.no_tags": "A package's own resource has no tags: tags belong to a channel.",
    "builder.workspace.chip": "Package draft: :name",
    "builder.workspace.open_failed": "Opening the working copy failed. Please try again.",
    "builder.workspace.content_locked": "Flows, compositions and scenes cannot be changed through the manifest. Edit them in their editor, or import them from your channel.",
    "builder.workspace.asset_missing": "A media file this item uses is missing from the package or cannot be taken over.",
    "builder.workspace.asset_quota": "Media quota exceeded while importing this draft item's assets.",
    "builder.workspace.placeholder_outside_draft": "Placeholders for a package's widgets exist only in that package's scenes.",
    "builder.workspace.placeholder_binding_mismatch": "A widget's placeholder status is immutable once created.",
    "builder.workspace.scene_widget_unresolvable": "A widget of this scene names neither a built-in widget nor one of your package's. Fix it under Expert (Edit as JSON) before you open the scene.",
    "builder.workspace.placeholder_frame": "Placeholder: this widget belongs to your package and only displays after installation.",
    "builder.workspace.release_missing_banner": "This widget's files are missing, so it can't load. You can remove it from the scene.",
    "builder.workspace.palette_draft_widgets": "This package's widgets (placeholders)",
    "builder.config_schema.widget_writable": "Widget can write this value",
    "builder.config_schema.widget_writable_help": "The widget may update this value at runtime and it is saved (for example a counter that survives reloads). The value set in the scene acts as start value and reset.",
    "builder.config_schema.type_list": "List",
    "builder.config_schema.item_type": "Entry type",
    "builder.config_schema.asset_kind": "Asset type",
    "builder.config_schema.asset_kind_audio": "Audio",
    "builder.config_schema.asset_kind_image": "Image",
    "builder.config_schema.asset_kind_video": "Video",
    "builder.config_schema.multiline": "Multi-line",
    "builder.config_schema.slider": "Show as slider",
    "builder.config_schema.slider_suffix": "Suffix (e.g. %)",
    "builder.config_schema.slider_step": "Step",
    "builder.config_schema.group": "Group",
    "builder.config_schema.group_help": "Fields with the same group appear as one section.",
    "builder.config_schema.overridable": "Variations may override",
    "builder.config_schema.overridable_help": "Off = streamers cannot vary this field per event.",
    "builder.config_schema.show_if": "Show only when",
    "builder.config_schema.show_if_help": "Show this field only when another field matches.",
    "builder.config_schema.show_if_field": "Field",
    "builder.config_schema.show_if_op": "Comparison",
    "builder.config_schema.show_if_value": "Value",
    "builder.config_schema.list_min_max_help": "Min/Max bound the number of entries.",
    "builder.config_schema.drag_sort": "Drag to reorder",
    "builder.form_builder.catalog_title": "Form fields",
    "builder.form_builder.field_text": "Text",
    "builder.form_builder.field_number": "Number",
    "builder.form_builder.field_toggle": "Toggle",
    "builder.form_builder.field_dropdown": "Dropdown",
    "builder.form_builder.field_color": "Color",
    "builder.form_builder.field_template": "Template text",
    "builder.form_builder.field_asset": "Asset",
    "builder.form_builder.field_font": "Font",
    "builder.form_builder.field_repeater": "Repeater",
    "builder.form_builder.tile_hint": "Drag onto the form, or click to append",
    "builder.form_builder.canvas_empty": "Drag a field from the left to start building the form.",
    "builder.form_builder.canvas_drop_tail": "Drop here to add at the end",
    "builder.form_builder.drop_blocked": "Repeaters cannot be nested",
    "builder.form_builder.group_empty": "Drag fields here, they repeat together as one row",
    "builder.form_builder.untitled": "Untitled field",
    "builder.form_builder.panel_empty": "Select a field on the form to edit its settings.",
    "builder.form_builder.panel_repeater_hint": "Rows repeat this group's sub-fields. Drag fields into the group on the canvas.",
    "builder.form_builder.number_mode": "Number format",
    "builder.form_builder.number_int": "Whole number",
    "builder.form_builder.number_float": "Decimal",
    "builder.form_builder.min_rows": "Min rows",
    "builder.form_builder.max_rows": "Max rows",
    "builder.form_builder.warn_missing_key": "Key required",
    "builder.form_builder.warn_enum_options": "Add at least one option",
    "builder.form_builder.warn_repeater_fields": "Add at least one sub-field",
    "builder.form_builder.show_if_chip": "only if",
    "builder.form_builder.delete_field": "Remove field",
    "builder.form_builder.key_duplicate": "This key is already used by a sibling field.",
    "builder.permissions.fonts_hint": "Fonts and their stylesheets from third-party hosts (style-src + font-src). For Google Fonts declare fonts.googleapis.com and fonts.gstatic.com.",
    "builder.preview.live": "Live Preview",
    "builder.preview.placeholder": "Preview opens in a separate window. Use the Preview button above.",
    "builder.test_panel.trigger_label": "⚡ Test",
    "builder.test_panel.title": "Fire a test event",
    "builder.test_panel.event_label": "Event",
    "builder.test_panel.no_events": "This widget does not subscribe to any events.",
    "builder.test_panel.fields_label": "Sample data",
    "builder.test_panel.no_fields": "This event has no editable sample data.",
    "builder.test_panel.fire_once": "Fire once",
    "builder.test_panel.loop_start": "Loop",
    "builder.test_panel.loop_stop": "Stop loop",
    "builder.test_panel.interval_label": "Every",
    "builder.test_panel.interval_suffix": "s",
    "builder.test_panel.waiting_ready": "Waiting for the widget to load…",
    "builder.test_panel.pipeline_hint": "Also fires connected scene sessions (OBS).",
    "builder.settings.import_pick": "Import from my property",
    "builder.settings.import_stale": "outdated",
    "builder.settings.import_source_deleted": "source deleted",
    "builder.settings.import_resync": "Update from source",
    "builder.settings.import_empty_flows": "No flows in this package yet.",
    "builder.settings.import_empty_compositions": "No compositions in this package yet.",
    "builder.settings.import_empty_scenes": "No scenes yet - create one in the scene editor first.",
    "builder.publish.version_not_above": "The version :version must be higher than every earlier one, so higher than :highest.",
    "builder.publish.visibility_invalid": "Choose private, by link or public.",
    "builder.publish.bump_invalid": "Choose a small fix, new content or a major change.",
    "builder.publish.taken_down": "This package was removed from distribution by the platform and cannot be published. Contact support if you believe this is a mistake.",
    "builder.publish.over_quota": "This package is over its quota (:used of :limit, :count of :total assets). Delete assets, then publish again.",
    "builder.publish.listing_missing": "For public, the listing is missing: :fields.",
    "builder.publish.listing_field_description": "description",
    "builder.publish.listing_field_tagline": "tagline",
    "builder.publish.listing_field_cover": "cover",
    "builder.publish.nothing_to_publish": "Nothing changed since :version, and your package already has this visibility.",
    "builder.publish.open": "Publish…",
    "builder.publish.title": "Publish",
    "builder.publish.intro_first": "Your first version. You can keep working afterwards and publish new versions any time.",
    "builder.publish.intro_next": "Your changes since :version go out as a new version. Whoever installed an older version sees an update and decides.",
    "builder.publish.who": "Who gets it?",
    "builder.publish.private_help": "Only who you invite. Available at once.",
    "builder.publish.unlisted_help": "Whoever has the link. Available at once.",
    "builder.publish.public_help": "In the marketplace, after a review.",
    "builder.publish.version": "Version",
    "builder.publish.bump_patch": "Small fix",
    "builder.publish.bump_minor": "New content",
    "builder.publish.bump_major": "Major change",
    "builder.publish.first_version": "your first version",
    "builder.publish.notes": "What's new?",
    "builder.publish.notes_help": "Optional, for streamers.",
    "builder.publish.notes_placeholder": "e.g. The star spins now, and the chat reply names the follower number.",
    "builder.publish.no_changes": "Nothing changed since :version. No new version is made, only the visibility changes.",
    "builder.publish.to_listing": "To the listing",
    "builder.publish.replacing": ":version is still waiting for review and will be replaced by this version.",
    "builder.publish.lowering": "Your package leaves the marketplace, and :version is no longer reviewed. Whoever installed it keeps it. Going back to public needs a new review.",
    "builder.publish.submit": "Publish",
    "builder.publish.submit_public": "Publish for review",
    "builder.publish.failed": "Publishing failed.",
    "builder.publish.state_private": "private",
    "builder.publish.state_unlisted": "by link",
    "builder.publish.state_public": "public",
    "builder.publish.done": ":version is published, :visibility",
    "builder.publish.done_review": ":version is waiting for review",
    "builder.publish.replaced": ":version was replaced and is no longer reviewed.",
    "builder.publish.invite": "Invite a streamer",
    "builder.publish.invited": "Invitation sent to :name.",
    "builder.publish.make_link": "Create link",
    "builder.publish.copy": "Copy",
    "builder.publish.review_next": "We review :version. You get notified as soon as it is in the marketplace.",
    "builder.publish.next_invite": "Invite streamers: a private package reaches only who you invite.",
    "builder.publish.next_link": "Create a link: whoever has it can install the package.",
    "builder.publish.to_distribution": "All invitations and links in Distribution",
    "builder.publish.done_close": "Done",
    "builder.frame.state_waiting": ":version in review",
    "builder.changes.count": ":count change since the release|:count changes since the release",
    "builder.changes.added": ":kind “:name” added",
    "builder.changes.changed": ":kind “:name” changed",
    "builder.changes.removed": ":kind “:name” removed",
    "builder.changes.folder": ":folder/ · :counts",
    "builder.changes.count_added": ":count new|:count new",
    "builder.changes.count_changed": ":count changed|:count changed",
    "builder.changes.count_removed": ":count removed|:count removed",
    "builder.changes.listing": "Listing: :field",
    "builder.changes.settings": "Package settings changed",
    "builder.changes.kind_flow": "Flow",
    "builder.changes.kind_composition": "Composition",
    "builder.changes.kind_scene": "Scene",
    "builder.changes.kind_widget": "Widget",
    "builder.changes.kind_asset": "Asset",
    "builder.changes.field_name": "name",
    "builder.changes.field_description": "description",
    "builder.changes.field_usage": "instructions",
    "builder.changes.field_thumbnail": "cover",
    "builder.changes.field_gallery": "gallery",
    "builder.versions.now": "Now",
    "builder.versions.now_next": "in progress · next version :version (proposed)",
    "builder.versions.now_first": "in progress · first version :version",
    "builder.versions.no_changes": "No change since the last version.",
    "builder.versions.nothing_yet": "Nothing published yet.",
    "builder.versions.publish": "Publish…",
    "builder.versions.first": "First version",
    "builder.versions.note": "“:notes”",
    "builder.versions.replaced_by": "replaced by :version",
    "builder.versions.withdrawn": "withdrawn",
    "builder.versions.state_submitted": "in review",
    "builder.versions.state_rejected": "rejected",
    "builder.versions.state_taken_down": "taken down",
    "builder.versions.withdraw": "Withdraw review",
    "builder.versions.withdraw_title": "Withdraw :version?",
    "builder.versions.withdraw_message": "The version leaves the review. It keeps its number, and the next one counts on from it.",
    "builder.versions.restore": "Restore",
    "builder.versions.restore_title": "Restore :version?",
    "builder.versions.restore_discards": "Discards: :items.",
    "builder.versions.restore_kept": "The discarded versions stay under Discarded for 30 days. The flow history stays.",
    "builder.versions.your_agent": "your agent",
    "builder.versions.restored": ":version restored by :name, :when",
    "builder.versions.published_by": "published by :name",
    "builder.versions.restore_nothing_lost": "Nothing changed since this version, nothing will be lost.",
    "builder.versions.who_title": "Who gets which version",
    "builder.versions.who_marketplace": "Marketplace",
    "builder.versions.who_invited": "Invited",
    "builder.versions.who_link": "By link",
    "builder.versions.who_nobody": "Nobody yet.",
    "builder.versions.who_waiting": ":version is waiting for review for the marketplace.",
    "builder.versions.who_update": "Whoever installed an older version sees an update and decides.",
    "builder.discarded.widget_gone": "The widget of this file is gone. Restore the widget first.",
    "builder.discarded.cannot_restore": "This version cannot be restored.",
    "builder.discarded.copy_name": ":name (:n)",
    "builder.discarded.title": "Discarded",
    "builder.discarded.kept_for": "kept for 30 days",
    "builder.discarded.act_save_mine": "overwritten by :name (Save mine)",
    "builder.discarded.act_restore_release": "restored :version by :name",
    "builder.discarded.act_restore_discarded": "restored over by :name",
    "builder.discarded.act_delete": "deleted by :name",
    "builder.discarded.act_asset_delete": "deleted by :name",
    "builder.discarded.act_folder_delete": "Folder :folder deleted by :name",
    "builder.discarded.act_asset_replace": "file replaced by :name",
    "builder.discarded.act_assets_replace": "files replaced by :name",
    "builder.discarded.act_take_over": "replaced by a take-over by :name",
    "builder.discarded.yours": "Your version",
    "builder.discarded.theirs": "Version by :name",
    "builder.discarded.restore": "Restore",
    "builder.discarded.versions": ":count version|:count versions",
    "builder.discarded.came_back_as": ":from came back as :to",
    "builder.discarded.settings": "Package settings",
    "builder.help.title": "Author reference",
    "builder.help.events_heading": "Events this widget receives",
    "builder.help.events_empty": "This widget subscribes to no events yet.",
    "builder.help.event_fields_heading": "Fields on the sample event",
    "builder.help.event_no_fields": "No sample fields for this event.",
    "builder.help.sdk_heading": "Widget SDK",
    "builder.help.sdk_intro": "The host exposes a global Streambridge object. Wait for it, then read config, listen for events, and send events back.",
    "builder.help.tokens_heading": "Theme and config values",
    "builder.help.tokens_config": "Config values",
    "builder.help.tokens_theme": "Theme tokens",
    "builder.help.tokens_empty": "None defined for this widget.",
    "builder.help.assets_heading": "Referencing uploaded files",
    "builder.help.assets_intro": "Uploaded images and sounds live under assets/. Reference them by relative path from your code.",
    "builder.help.assets_note": "This is separate from ctx.assets, which resolves Twitch badges and emotes only.",
    "builder.help.config_fields_heading": "Config fields (stage 2)",
    "builder.help.config_fields_intro": "Additive config_schema properties: list, item, asset_kind, multiline, group, show_if, overridable. Every field stays valid without them; see manifest.v1.json for the authoritative schema.",
    "builder.help.config_fields_caching": "Variations swap the effective config right before each event, so read config inside your event handlers (ctx.on(...)), never once at startup. Config cached at Streambridge.ready() never sees per-event overrides; ctx.onConfigUpdate fires on every swap.",
    "builder.help.config_fields_asset_ref": "asset-ref config values are ids for the streamer's own property assets (their uploaded sound/image library), not your bundle files. Your bundle receives the id via config and resolves playback itself; bundle-relative files (assets/logo.png) stay plain paths, unrelated to this type.",
    "builder.help.close": "Close",
    "builder.scenes.settings_width": "Width (px)",
    "builder.scenes.settings_height": "Height (px)",
    "builder.scenes.settings_audio": "Enable audio",
    "builder.widgets.name_unusable": "This name does not produce a usable key. Please use letters or numbers.",
    "builder.widgets.section": "Widgets",
    "builder.widgets.name": "Name",
    "builder.widgets.surface": "Type",
    "builder.widgets.surface_overlay": "OBS overlay",
    "builder.widgets.surface_app": "Web app",
    "builder.widgets.remove_title": "Remove widget?",
    "builder.widgets.remove_message": "The code of widget :key will be removed with it.",
    "builder.widgets.tab_assets": "Assets",
    "builder.widgets.section_config": "Config schema",
    "builder.widgets.panel_hide": "Hide panel",
    "builder.widgets.panel_show": "Show panel",
    "builder.widgets.settings_saved": "Settings saved.",
    "builder.widgets.settings_failed": "The settings are invalid.",
    "builder.widgets.save_failed": "The file could not be saved.",
    "builder.widgets.copy_failed": "The path could not be copied.",
    "builder.widgets.assets_hint": "\"Insert path\" puts a file's or a folder's path into the code. A click on a data or code file opens it.",
    "builder.widgets.assets_empty": "No shared files in this package yet.",
    "migrate.hub.card_label": "Import from StreamElements",
    "migrate.hub.card_description": "Bring your StreamElements variables into this channel.",
    "migrate.title": "Import from StreamElements",
    "migrate.upload.heading": "Upload your StreamElements export",
    "migrate.upload.hint": "Select the .zip export file (max 50 MB).",
    "migrate.upload.file_label": "Export file",
    "migrate.upload.submit": "Upload",
    "migrate.progress.staging": "Reading your export…",
    "migrate.progress.applying": "Importing…",
    "migrate.review.heading": "Review what will be imported",
    "migrate.review.summary": ":ready ready, :conflict already exist",
    "migrate.review.col_source": "StreamElements name",
    "migrate.review.col_slug": "Variable",
    "migrate.review.col_type": "Type",
    "migrate.review.col_default": "Default value",
    "migrate.review.renamed": "renamed from \":name\"",
    "migrate.review.conflict_hint": "A variable with this name already exists and will be skipped.",
    "migrate.review.skipped_heading": "Not imported yet",
    "migrate.review.skipped_hint": "These blocks were in your export but aren't supported yet: :blocks",
    "migrate.review.empty": "Nothing to import from this export.",
    "migrate.review.apply": "Import :count variables",
    "migrate.done.heading": "Import complete",
    "migrate.done.summary": ":applied variables imported, :skipped skipped",
    "migrate.done.partial_heading": "Some rows could not be imported",
    "migrate.done.to_variables": "View variables",
    "migrate.done.restart": "Start a new import",
    "migrate.error.active": "An import is already in progress for this channel.",
    "migrate.error.timeout": "This is taking longer than expected. Reload the page to check the status.",
    "migrate.error.generic": "Something went wrong. Please try again.",
    "errors.migrate.active": "An import is already in progress for this channel.",
    "errors.migrate.not_staged": "This import is not ready to apply yet.",
    "errors.page.403_title": "No access",
    "errors.page.403_message": "You don't have permission to open this page on this channel.",
    "errors.page.404_title": "Page not found",
    "errors.page.404_message": "The page you're looking for doesn't exist or has moved.",
    "errors.page.419_message": "Your session expired. Please try again.",
    "errors.page.500_title": "Something went wrong",
    "errors.page.500_message": "The server ran into an error. Please try again in a moment.",
    "errors.page.503_title": "Temporarily unavailable",
    "errors.page.503_message": "Streambridge is being updated. Please try again in a few minutes.",
    "errors.page.default_title": "Something went wrong",
    "errors.page.default_message": "The request could not be completed. Please try again.",
    "errors.page.back_home": "Back to start",
    "errors.events.unknown_provider": "Unknown provider.",
    "errors.events.event_not_on_provider": "Event :event is not available on this provider.",
    "errors.events.trigger_not_simple": "Trigger not available in simple mode.",
    "errors.events.reaction_graph_managed": "This graph reaction is managed by the linked graph. Open the graph editor to remove its trigger or delete the whole graph.",
    "errors.scopes.owner_only": "Only the property owner can grant Twitch scopes.",
    "errors.scopes.owner_only_additional": "Only the property owner can grant additional Twitch scopes.",
    "errors.graph.auto_create_cap": "auto-create cap exceeded for :type (:count > :cap)",
    "errors.package.not_approved": "Package is not approved.",
    "errors.package.not_listed": "Package is not publicly listed.",
    "errors.package.not_installed": "Package is not installed for this property.",
    "errors.package.version_not_approved": "Package version is not approved.",
    "errors.package.version_unavailable": "Version not available.",
    "errors.package.feature_app_via_extensions": "Feature apps are managed as extensions.",
    "errors.package.deleted": "Its author deleted this package. It can't be installed any more.",
    "errors.package.deleted_no_release": "This package was deleted. It gets no new release.",
    "errors.package.deleted_no_draft": "This package was deleted, so it gets no draft.",
    "errors.package.unavailable": "This version of the package is no longer available. It can't be installed.",
    "errors.sample_variant.unknown": "The event :event has no sample variant \":sample_variant\".",
    "errors.sample_variant.chat_line": "A chat line is said as typed and takes no sample variant.",
    "errors.package_settings.forbidden": "You may not change this package's settings.",
    "errors.package_settings.undeclared": "\":setting\" is not a setting of this package.",
    "errors.package_settings.not_writable": "Only people allowed to change settings may set \":setting\", not the package itself.",
    "errors.package_settings.invalid": "This value does not fit the type of \":setting\".",
    "errors.package_settings.below_min": "This value is below the minimum of \":setting\".",
    "errors.package_settings.above_max": "This value is above the maximum of \":setting\".",
    "errors.package_settings.too_large": "This value is too large for \":setting\" (at most 4 KB).",
    "errors.package_settings.not_owned": "':setting' names nothing of this channel.",
    "errors.package_settings.conflict": "A setting changed in the meantime. Read it again and send it with the new revision to overwrite it.",
    "errors.package_settings.outside_package": "Only a package's flow reads package settings: run it as a flow of its package (packageId) to pass state.settings.",
    "validation.array": "The :attribute field must be an array.",
    "validation.exists": "The selected :attribute is invalid.",
    "errors.oauth.invalid_state": "Invalid OAuth state",
    "errors.oauth.scope_denied": "Scope grant was denied",
    "errors.oauth.token_exchange_failed": "Token exchange failed",
    "errors.access.not_granted": "Access not granted",
    "errors.access.forbidden": "Forbidden",
    "errors.auth.bad_request": "Bad Request",
    "errors.token.audience_mismatch": "Token audience mismatch.",
    "errors.binding.secret_missing": "hmac secret not configured",
    "errors.binding.missing": "missing property binding",
    "errors.binding.malformed": "malformed property binding",
    "errors.binding.timestamp_out_of_range": "binding timestamp out of range",
    "errors.binding.signature_mismatch": "binding signature mismatch",
    "errors.binding.property_mismatch": "binding does not match request property_id",
    "library.nav.title": "Library",
    "library.index.empty": "Your library is still empty.",
    "library.index.empty_discover": "Discover in the marketplace",
    "library.index.update_available": "Update available",
    "library.index.update_notes": "New in :version: :notes",
    "library.index.setup_incomplete": "Setup incomplete",
    "library.index.search_placeholder": "Search apps…",
    "library.index.view_grid": "Grid",
    "library.index.view_list": "List",
    "library.index.no_results": "No apps match your filter.",
    "library.index.open": "Open app",
    "library.surface.back": "Back to the app",
    "library.surface.connected": "Live",
    "library.surface.connecting": "Connecting",
    "library.resource.custom_event": "Custom event",
    "library.settings.uninstall": "Uninstall",
    "library.settings.uninstall_confirm": "Uninstall “:name”?",
    "library.entry.paused_banner": "This app is paused: settings and placements are kept, but it won't run until you re-enable it.",
    "library.entry.open_external": "Open in a new window",
    "library.check.scopes": "Twitch permissions",
    "library.check.widget_placed": "Widget placed",
    "library.check.stage": "Stage set up",
    "library.check.ref_bound": "Resource chosen",
    "library.check.scene_instantiated": "Scene added",
    "library.check.detail_widget": "Widget: :key",
    "library.check.detail_scene": "Scene: :key",
    "library.chip.paused": "Paused",
    "library.notify.flows_converted_title": "An app was moved over",
    "library.notify.flows_converted": "“:name” was moved over in the background: :changes",
    "library.notify.flows_lagging": "it now runs the version you have installed",
    "library.notify.flows_dropped": "a part this version no longer has was removed",
    "library.notify.flows_on": "a part that was switched off runs again",
    "library.notify.compositions_converted_title": "Compositions moved over",
    "library.notify.compositions_converted": "“:name” was moved over in the background: :changes",
    "library.notify.compositions_lagging": "it now shows the version you have installed",
    "library.notify.compositions_dropped": "a composition this version no longer has was removed",
    "library.uninstall.scenes": "Removes its widget from the scene :list|Removes its widgets from the scenes :list",
    "library.uninstall.custom_event_flows": "Your flow :list uses an event of this app, which then goes quiet.|Your flows :list use an event of this app, which then goes quiet.",
    "library.uninstall.composition_uses": "Your content uses a composition of this app and goes quiet: :list",
    "library.uninstall.scenes_kept": "The scenes themselves stay: their browser-source URLs keep working.",
    "scenes.editor.unknown_package": "Unknown package: :package",
    "scenes.widget_name_alert_stage": "Alert Stage",
    "scenes.widget_name_composition_widget": "Composition widget",
    "scenes.widget_name_media_player": "Media Player",
    "library.chip.unavailable": "Not available",
    "library.chip.warnings": ":count warning|:count warnings",
    "library.toggle.enabled_flash": ":name enabled",
    "library.toggle.paused_flash": ":name paused",
    "library.entry.deleted_banner": "Its author deleted this app. It keeps running with your settings, but no new versions will come.",
    "library.entry.release_missing_banner": "The files of this app's version are missing, so its widgets can't load. You can uninstall it.",
    "library.chip.deleted": "Deleted",
    "library.chip.release_missing": "Files missing",
    "library.uninstall.deleted": "Its author deleted it: once uninstalled, it can't be installed again.",
    "library.pin.add": "Pin to nav",
    "library.pin.remove": "Remove from nav",
    "library.permission.access.label": "Open and use",
    "library.permission.access.description": "Open this app and its web app. Using its surface can change the values it shows.",
    "library.permission.configure.label": "Change settings",
    "library.permission.configure.description": "Change this app's settings.",
    "library.settings.package_settings": "Package settings",
    "library.settings.previews_title": "Preview",
    "library.settings.save": "Save",
    "library.settings.save_failed": "Save failed. Please try again.",
    "library.settings.changed_by": ":writer, :source",
    "library.settings.changed_unnamed": "Last changed :source",
    "library.settings.source_settings_page": "on the package's page",
    "library.settings.source_surface": "through the surface",
    "library.settings.source_widget": "by a widget",
    "library.settings.source_mcp": "over MCP",
    "library.settings.source_install": "at install",
    "library.settings.source_switch": "at a version switch",
    "library.settings.missing": "No value yet. This setting needs one.",
    "library.settings.unbound": "Nothing chosen yet: the flow does not start.",
    "library.settings.ref_readonly": "A resource is a package setting: choose it under Package settings.",
    "library.settings.conflict_title": "A value has changed",
    "library.settings.conflict_line": ":writer changed \":field\" to :value :source while you were editing. Save :mine anyway?",
    "library.settings.conflict_line_unnamed": "\":field\" was changed to :value :source while you were editing. Save :mine anyway?",
    "library.settings.conflict_confirm": "Save anyway",
    "library.settings.error_value_type_mismatch": "Invalid value type.",
    "library.settings.error_value_below_min": "Value is too low.",
    "library.settings.error_value_above_max": "Value is too high.",
    "library.settings.error_value_too_large": "Value is too large.",
    "library.placement.unknown_key": "This widget has no such field.",
    "library.page.widgets_in_scenes": "Widgets in scenes",
    "library.page.not_placed": "Not in any scene yet",
    "library.page.not_placed_hint": "Place the widget in the scene editor, or add one of the package's scenes.",
    "library.page.open_scenes": "Go to scenes",
    "library.page.search_scenes": "Search scenes",
    "library.page.no_scene_match": "No scene matches.",
    "library.page.status": "Status & version",
    "library.page.fix": "Fix",
    "library.page.unsaved": "Not saved",
    "library.page.settings_sub": "Applies to the whole package, in every scene.",
    "library.page.settings_no_configure": "Only members who may change this app's settings see and change these values.",
    "library.page.surface_off": "The surface runs once the app is active and its setup is done. Status & version says what is missing.",
    "library.page.leave_title": "Discard unsaved changes?",
    "library.page.leave_message": "At least one item has changes that are not saved yet.",
    "library.page.leave_confirm": "Leave",
    "library.placement.only_in": "Only in the scene",
    "library.placement.open_editor": "Open in the scene editor",
    "library.placement.variants": ":count variant|:count variants",
    "library.placement.read_only": "Only members who may edit scenes can change these values.",
    "library.placement.unsaved": ":count unsaved change|:count unsaved changes",
    "library.placement.all_saved": "All saved",
    "library.placement.discard": "Discard",
    "library.placement.conflict_title": "The scene has changed",
    "library.placement.conflict_line": "\":field\" is now :value; you entered :mine.",
    "library.placement.conflict_confirm": "Save my values",
    "library.placement.conflict_empty": "empty",
    "library.feature.uninstall_failed": "Uninstall failed.",
    "permissions.property.group": "Property",
    "permissions.property.media_manage": "Manage media",
    "permissions.property.media_manage_help": "Upload, rename and delete files in the Media Center.",
    "permissions.property.apps_manage": "Manage apps",
    "permissions.property.apps_manage_help": "Install, uninstall and pause apps from the Marketplace and the Library.",
    "media.modal.title": "Media Center",
    "media.modal.use_asset": "Use this asset",
    "media.modal.select_hint": "Select an asset to see its details.",
    "media.modal.name": "Name",
    "media.modal.kind": "Kind",
    "media.modal.storage": "Storage",
    "media.modal.size": "Size",
    "media.modal.used_by": "Used by",
    "media.preview.animated": "Animated",
    "media.preview.play": "Play",
    "media.preview.pause": "Pause",
    "graphs.ref_picker.browse": "Browse media",
    "graphs.ref_picker.clear": "Remove",
    "graphs.ref_picker.drop_wrong_kind": "This file does not fit this field.",
    "media.delete.used_by_compositions": "This asset is used by compositions :names.",
    "media.delete.used_by_flows": "This asset is used by flows :names.",
    "extensions.commands.delete_confirm_aliases": "All :n aliases drop with it, plus every linked action.",
    "extensions.commands.delete_confirm_actions": "Every linked action drops with it.",
    "extensions.counters.mode_persistent_option": "Persistent: survives indefinitely",
    "extensions.counters.mode_session_option": "Per stream: resets to default when the stream goes online",
    "extensions.counters.delete_confirm": "Delete counter",
    "extensions.counters.new_title": "New Counter",
    "extensions.counters.edit_title": "Edit counter :name",
    "extensions.counters.save": "Save Counter",
    "extensions.counters.name_placeholder": "e.g. Death Count",
    "extensions.counters.stored_as_identifier": "Stored as identifier:",
    "extensions.counters.identifier": "Identifier:",
    "extensions.counters.immutable_after_create": "immutable after create",
    "extensions.counters.default_value": "Default value",
    "extensions.counters.default_value_help": "Used when the counter has never been set, and (for Per-Stream counters) every time the stream goes online.",
    "extensions.counters.persistence": "Persistence",
    "extensions.counters.title": "Counters",
    "extensions.counters.empty": "No counters yet. Create one to keep a number around: visit-count, deaths, points, anything.",
    "extensions.counters.mode_session": "per stream",
    "extensions.counters.mode_persistent": "persistent",
    "extensions.counters.default_chip": "default :n",
    "extensions.discord.webhooks": "Webhooks",
    "extensions.events.owner_scope_hint": "Only the property owner can grant new scopes. Please ask them to sign in and complete this step.",
    "extensions.events.remove_action_message": "It will stop firing immediately.",
    "extensions.events.remove_action": "Remove action",
    "extensions.keywords.delete_confirm_actions": "Every linked action drops with it.",
    "extensions.keywords.delete_confirm": "Delete keyword",
    "extensions.loyalty.title": "Loyalty",
    "extensions.loyalty.viewer_groups": "Viewer Groups",
    "extensions.loyalty.group_delete_title": "Delete group \":name\"?",
    "extensions.loyalty.group_delete_message": "All :n members will be removed. This cannot be undone.",
    "extensions.loyalty.group_delete_confirm": "Delete group",
    "extensions.loyalty.groups_title": "Loyalty: Viewer Groups",
    "extensions.loyalty.group_new": "New Group",
    "extensions.loyalty.groups_empty": "No viewer groups yet. Create one to segment your audience for Audience Rules.",
    "extensions.loyalty.group_members": ":n members",
    "extensions.loyalty.group_delete_aria": "Delete group :name",
    "extensions.loyalty.group_add_search": "Search viewers to add…",
    "extensions.loyalty.group_create_title": "New Viewer Group",
    "extensions.loyalty.group_slug": "Slug",
    "extensions.loyalty.group_slug_help": "Lowercase letters, digits, hyphens only. Used as the identifier in EventGraph nodes.",
    "extensions.loyalty.group_description": "Description (optional)",
    "extensions.loyalty.group_create": "Create Group",
    "extensions.loyalty.group_rename_title": "Rename :name",
    "extensions.loyalty.viewers_total": ":total viewers",
    "extensions.loyalty.viewers_title": "Loyalty: Viewers",
    "extensions.loyalty.search_placeholder": "Search by username…",
    "extensions.loyalty.no_match": "No viewers match your search.",
    "extensions.loyalty.empty": "No viewer data yet. Loyalty tracking starts once the extension is active.",
    "extensions.loyalty.col_username": "Username",
    "extensions.loyalty.col_words": "Words",
    "extensions.loyalty.col_emotes": "Emotes",
    "extensions.loyalty.col_last_seen": "Last seen",
    "extensions.loyalty.bot_badge": "Bot",
    "extensions.loyalty.mark_bot_aria": "Mark :name as bot",
    "extensions.loyalty.scope_active": "Active viewers (seen in last 90 s)",
    "extensions.loyalty.scope_chatters": "Current chatters",
    "extensions.loyalty.scope_all": "All known viewers",
    "extensions.loyalty.slot_balance": "Balance command",
    "extensions.loyalty.slot_balance_about": "Shows the caller's current point balance. Runs silently if the viewer has no balance yet.",
    "extensions.loyalty.slot_watchtime": "Watchtime command",
    "extensions.loyalty.slot_watchtime_about": "Shows the caller's accumulated watchtime. Output is formatted as hours and minutes.",
    "extensions.loyalty.slot_rank": "Rank command",
    "extensions.loyalty.slot_rank_about": "Shows the caller's rank on the leaderboard. Bots are excluded from ranking.",
    "extensions.loyalty.slot_top": "Top command",
    "extensions.loyalty.slot_top_about": "Lists the top N viewers by balance. The default count is configured above.",
    "extensions.loyalty.slot_give": "Give command",
    "extensions.loyalty.slot_give_about": "Lets any viewer transfer points to another. Fails when the sender has insufficient balance.",
    "extensions.loyalty.slot_gift": "Gift command",
    "extensions.loyalty.slot_gift_about": "Mods-only by default: gifts points to one or more named viewers from the property's pool.",
    "extensions.loyalty.slot_bonus": "Bonus command",
    "extensions.loyalty.slot_bonus_about": "Mods-only by default: distributes a bonus to active / chatting / all viewers at once.",
    "extensions.loyalty.settings_title": "Loyalty: Settings",
    "extensions.loyalty.viewers": "Viewers",
    "extensions.loyalty.currency_section": "Currency Naming",
    "extensions.loyalty.currency_help": "The name of the virtual currency shown in chat responses. The icon appears next to balances in the viewer table.",
    "extensions.loyalty.currency_name_help": "E.g. (points), used in chat responses: You have 42 points.",
    "extensions.loyalty.currency_icon_label": "Icon (optional)",
    "extensions.loyalty.currency_icon_help": "A single emoji or short symbol shown next to balances. Leave empty to show none.",
    "extensions.loyalty.earn_section": "Earn Rates",
    "extensions.loyalty.earn_help": "How many points viewers earn automatically. The watchtime credit runs on a background tick every few minutes.",
    "extensions.loyalty.points_per_minute": "Points per minute",
    "extensions.loyalty.points_per_minute_help": "Awarded to all viewers seen in the last credit window. Set to 0 to disable passive earning.",
    "extensions.loyalty.chat_bonus": "Chat bonus per message",
    "extensions.loyalty.chat_bonus_help": "Extra points each chat message earns on top of the passive rate. Set to 0 to disable.",
    "extensions.loyalty.bonus_section": "Bonus Distribution",
    "extensions.loyalty.bonus_help": "Controls the behaviour of the !bonus slot command when mods distribute points to viewers in bulk.",
    "extensions.loyalty.bonus_max": "Maximum bonus amount",
    "extensions.loyalty.bonus_max_help": "Upper bound for the amount argument. Prevents typos from minting extreme balances.",
    "extensions.loyalty.bonus_cooldown": "Cooldown (seconds)",
    "extensions.loyalty.bonus_cooldown_help": "Minimum gap between two bonus distributions. 0 = no cooldown.",
    "extensions.loyalty.bonus_scope": "Default scope",
    "extensions.loyalty.bonus_scope_help": "Which viewers receive the bonus when no explicit scope is provided in chat.",
    "extensions.loyalty.milestones": "Milestones",
    "extensions.loyalty.milestones_help": "When a viewer's balance first crosses one of these thresholds, the loyalty.milestone event fires. Add as many as you need; they are sorted automatically.",
    "extensions.loyalty.milestones_add": "Add threshold",
    "extensions.loyalty.top_section": "Top Command Defaults",
    "extensions.loyalty.top_count": "Default top count",
    "extensions.loyalty.top_count_help": "How many viewers the !top command lists when called without an explicit number. Range: 1–100.",
    "extensions.loyalty.slots_intro": "Each slot below materialises as a chat trigger plus an editable graph. Add only the ones you want. Open the graph to customise the response.",
    "extensions.loyalty.membership_remove_title": "Remove from :group?",
    "extensions.loyalty.membership_remove_message": "The viewer will no longer be a member of this group.",
    "extensions.loyalty.stats": "Stats",
    "extensions.loyalty.user_login": "User Login",
    "extensions.loyalty.last_seen": "Last Seen",
    "extensions.loyalty.last_credited": "Last Credited",
    "extensions.loyalty.last_milestone": "Last Milestone",
    "extensions.loyalty.bot_section": "Bot Flag",
    "extensions.loyalty.mark_bot": "Mark as bot",
    "extensions.loyalty.mark_bot_help": "Bots are excluded from leaderboards and bonus distributions.",
    "extensions.loyalty.override_section": "Manual Balance Override",
    "extensions.loyalty.override_help": "Directly set this viewer's balance. The change is logged in the audit log.",
    "extensions.loyalty.override_balance": "New Balance",
    "extensions.loyalty.override_reason": "Reason (optional)",
    "extensions.loyalty.override_apply": "Apply Override",
    "extensions.loyalty.memberships": "Group Memberships",
    "extensions.loyalty.memberships_empty": "Not a member of any Viewer Group.",
    "extensions.loyalty.membership_remove_aria": "Remove from :group",
    "extensions.loyalty.audit_title": "Audit Log (last 20)",
    "extensions.loyalty.audit_empty": "No audit entries for this viewer.",
    "extensions.mod.module_config": "Module configuration",
    "extensions.mod.strike_window": "Strike window (s)",
    "extensions.mod.exceptions_title": "Exceptions",
    "extensions.mod.exceptions_help": "Selected viewers are exempt from this module (same matrix as Commands).",
    "extensions.mod.sender_title": "Sender for reason echo",
    "extensions.mod.sender_account": "Account",
    "extensions.mod.sender_help": "Used only when one of the Echo reason in chat toggles is on.",
    "extensions.mod.title": "Mod Tools",
    "extensions.mod.toggle_aria": "Toggle :name",
    "extensions.mod.shared_chat": "Shared Chat",
    "extensions.mod.shared_chat_label": "Shared Chat behaviour",
    "extensions.mod.shared_chat_help": "Decide how the Mod Tools react when your channel is in a Twitch Shared Chat session.",
    "extensions.mod.shared_chat_own_only": "Moderate only my own channel",
    "extensions.mod.shared_chat_pause_all": "Pause all modules during Shared Chat",
    "extensions.mod.caps_min_length": "Minimum message length",
    "extensions.mod.caps_min_length_help": "Skip messages shorter than this: caps in “OK” isn’t spam.",
    "extensions.mod.caps_max_share": "Max caps share",
    "extensions.mod.caps_max_share_help": "Percent of letters that may be uppercase before the rule fires.",
    "extensions.mod.emotes_max": "Max emotes per message",
    "extensions.mod.emotes_max_help": "Counts Twitch first-party emotes. BTTV / FFZ are not yet inspected.",
    "extensions.mod.links_allow": "Whitelist domain or pattern",
    "extensions.mod.links_allow_placeholder": "e.g. clips.twitch.tv or *.twitch.tv/clip/*",
    "extensions.mod.links_allow_help": "Patterns: host or host/path*. Wildcards: *. as subdomain, * at the path end.",
    "extensions.mod.spam_max_repeats": "Max identical messages",
    "extensions.mod.spam_max_repeats_help": "Catches bypass-tricks like trailing dots or spaces (normalised before comparing).",
    "extensions.mod.spam_window": "Repeat window (s)",
    "extensions.mod.spam_window_help": "Sliding window the repeat counter uses.",
    "extensions.mod.spam_max_rate": "Max messages per minute",
    "extensions.mod.spam_max_rate_help": "Floods at any speed, independent from the repeat-window above.",
    "extensions.mod.words_add": "Add word or phrase",
    "extensions.mod.words_placeholder": "e.g. spoiler",
    "common.import": "Import",
    "extensions.quotes.settings_intro": "Each command below materialises as a chat trigger plus an editable graph. Add only the ones you want. Open the graph to customise.",
    "extensions.quotes.import_no_file": "Pick a .csv or .json file first.",
    "extensions.quotes.import_title": "Import quotes",
    "extensions.quotes.import_help": "Pick a .csv or .json file. Imported quotes keep their historical date and are assigned new sequential numbers starting after your last quote.",
    "extensions.quotes.import_format": "File format",
    "extensions.rewards.prompt_help": "Optional. Up to 200 characters, shown above the redeem button on Twitch. Required when Require user input is on.",
    "extensions.rewards.skip_queue": "Skip request queue",
    "extensions.rewards.skip_queue_help": "Redemptions are auto-marked Fulfilled instead of landing in the moderator queue.",
    "extensions.rewards.limits": "Limits",
    "extensions.rewards.limit_per_stream": "Limit redemptions per stream",
    "extensions.rewards.max_per_stream": "Max per stream",
    "extensions.rewards.limit_per_user": "Limit redemptions per user per stream",
    "extensions.rewards.max_per_user": "Max per user per stream",
    "extensions.rewards.cooldown": "Cooldown",
    "extensions.rewards.cooldown_enable": "Enable global cooldown",
    "extensions.rewards.cooldown_seconds": "Cooldown (seconds)",
    "extensions.rewards.cooldown_help": "Twitch shows cooldowns in the UI only when set to 60 seconds or more.",
    "extensions.scenes.audio_out_new_title": "New Audio Out",
    "extensions.scenes.audio_out_name_help": "Internal label: shown in the scenes list, not in OBS.",
    "extensions.scenes.audio_out_delete_title": "Delete Audio Out :name?",
    "extensions.scenes.audio_out_delete_message": "Audio events routed here will silently no-op afterwards. The OBS browsersource using this URL will go blank.",
    "extensions.scenes.audio_out_delete": "Delete Audio Out",
    "extensions.scenes.audio_out_active_help": "Pause audio output without deleting the scene. Disabled scenes do not receive events.",
    "extensions.scenes.browsersource": "Browsersource",
    "extensions.scenes.browsersource_url": "OBS Browser Source URL",
    "extensions.scenes.audio_out_url_help": "Paste this URL into OBS as a Browser Source. Audio plays whenever this scene is active in OBS.",
    "extensions.scenes.edit_title": "Edit scene :name",
    "extensions.scenes.title": "Widgets",
    "extensions.scenes.kind_scene": "Scene: multi-widget canvas with editor (next phase)",
    "extensions.scenes.kind_quick_widget": "Quick Widget: single widget, no canvas",
    "extensions.scenes.background_none": "None (empty background)",
    "extensions.scenes.background_thumbnail": "Live stream thumbnail (Twitch)",
    "extensions.scenes.background_asset": "Custom asset (upload an image)",
    "extensions.scenes.delete_confirm": "Delete scene",
    "extensions.scenes.rotate_title": "Rotate token for :name?",
    "extensions.scenes.rotate_message": "Any OBS browsersource using the current URL will be disconnected immediately and you'll need to paste the new URL.",
    "extensions.scenes.new_title": "New Scene",
    "extensions.scenes.save": "Save Scene",
    "extensions.scenes.name_placeholder": "e.g. Main Stream Layout",
    "extensions.scenes.template": "Template",
    "extensions.scenes.template_prefix": "Template:",
    "extensions.scenes.immutable_after_create": "immutable after create",
    "extensions.scenes.canvas": "Canvas",
    "extensions.scenes.width": "Width (px)",
    "extensions.scenes.height": "Height (px)",
    "extensions.scenes.canvas_help": "Default 1920×1080. The Browsersource SPA scales the canvas uniformly to fit OBS.",
    "extensions.scenes.audio_enable": "Enable audio",
    "extensions.scenes.audio_enable_help": "Allows widgets in this scene to play sound. Required for the future Soundalerts pipeline; safe to leave off for video-only overlays.",
    "extensions.scenes.background": "Background",
    "extensions.scenes.background_help": "Background is purely a layout reference for the editor. OBS only sees what your widgets show.",
    "extensions.scenes.background_change": "Change background",
    "extensions.scenes.background_choose": "Choose background",
    "extensions.scenes.background_selected": "Selected:",
    "extensions.scenes.browsersource_help": "Paste into a new OBS Browser Source. The token is read-only: it can only stream events, not modify settings. If it leaks, rotate the token below.",
    "extensions.scenes.audio_out": "Audio Out",
    "extensions.scenes.scene": "Scene",
    "extensions.scenes.audio_output": "Audio Output",
    "extensions.scenes.widget_count": ":n widgets",
    "extensions.scenes.quick_widget": "Quick widget",
    "extensions.scenes.copy_url_title": "Copy this URL",
    "extensions.scenes.copy_url_help": "Your browser blocked clipboard access (this often happens on http:// URLs). Select the URL below and copy it manually.",
    "extensions.timers.delete_confirm_actions": "The schedule and every linked action drop with it.",
    "extensions.timers.delete_confirm": "Delete timer",
    "extensions.timers.new_title": "New Timer",
    "extensions.timers.edit_title": "Edit timer :name",
    "extensions.timers.save": "Save Timer",
    "extensions.timers.name_placeholder": "e.g. Welcome message",
    "extensions.timers.interval": "Interval (minutes)",
    "extensions.timers.conditions": "Conditions",
    "extensions.timers.min_chat_lines": "Minimum chat lines since last fire",
    "extensions.timers.min_chat_lines_help": "Timer waits until this many chat messages have been seen since the previous fire. Use 0 to disable the chat-activity gate.",
    "extensions.timers.min_chat_lines_placeholder": "0 = no minimum",
    "extensions.timers.expert": "Expert",
    "extensions.timers.start_offset": "Start offset (minutes)",
    "extensions.timers.start_offset_help": "Wait this many minutes after stream start (or timer creation, depending on Reset on Stream Start) before the first fire.",
    "extensions.timers.reset_on_start": "Reset on stream start",
    "extensions.timers.reset_on_start_help": "When the stream goes online, clear the last-fired timestamp so the start offset and interval count fresh from now.",
    "extensions.timers.pause_shared_chat": "Pause during Shared Chat",
    "extensions.timers.pause_shared_chat_help": "When active, this timer does not fire while your channel is in a Twitch Shared Chat session.",
    "extensions.timers.title": "Timers",
    "extensions.timers.empty": "No timers yet. Create one to schedule a recurring action.",
    "extensions.timers.every_n_min": "every :n min",
    "extensions.timers.min_chat_lines_chip": "min :n chat lines",
    "builder.events.type_string": "string",
    "builder.events.type_number": "number",
    "builder.events.type_boolean": "boolean",
    "builder.events.type_object": "object",
    "builder.events.type_array": "array",
    "builder.events.type_any": "any",
    "builder.events.emit_key_format": "Use the form key@version, e.g. my.event@1",
    "builder.form_builder.key_charset": "Lowercase letters, digits, underscore. Must start with a letter.",
    "common.collapse": "Collapse",
    "common.expand": "Expand",
    "builder.events.no_key": "(no key)",
    "builder.events.remove_emit": "Remove emit",
    "builder.form_builder.human_label": "Human-readable label",
    "builder.events.emit_description_placeholder": "What this event signals + when it fires.",
    "builder.events.data_fields": "Data fields",
    "builder.events.add_data_field": "+ Add Data Field",
    "builder.events.field_id_placeholder": "id (e.g. user_id)",
    "builder.form_builder.label_optional": "label (optional)",
    "builder.events.data_fields_empty": "No data fields declared. Add one to document the data this emit carries.",
    "common.default": "Default",
    "common.min": "Min",
    "common.max": "Max",
    "builder.form_builder.default_value": "Default value",
    "builder.form_builder.add_option": "+ Add Option",
    "builder.form_builder.value_placeholder": "value",
    "builder.form_builder.remove_option": "Remove option",
    "builder.form_builder.enum_options_empty": "Add at least one option for an enum field.",
    "builder.form_builder.no_default": "No default",
    "builder.form_builder.default_color": "Default color",
    "builder.form_builder.default_asset": "Default",
    "builder.form_builder.default_asset_help": "One of the package's media files of this kind. The widget shows it while nothing else is picked. Without a default the field stays empty.",
    "builder.form_builder.default_font": "Default font",
    "builder.form_builder.font_placeholder": "e.g. Inter, sans-serif",
    "common.help": "Help",
    "builder.form_builder.help_placeholder": "Hint shown under the field in the install settings UI.",
    "builder.form_builder.intro": "Settings the property owner configures at install time. Each field appears as a form control in the install dialog.",
    "builder.assets.uploading": "Uploading…",
    "builder.packages.published": "Published",
    "builder.inspector.search_tags": "Search tags…",
    "builder.inspector.tags_empty": "No tags yet. Add one to a reward first.",
    "builder.inspector.pick_tag": "Pick a tag…",
    "builder.packages.title": "Packages",
    "builder.permissions.host_invalid": "Host must contain a dot and may only use single-segment wildcards (e.g. api.example.com or *.example.com).",
    "builder.permissions.host_unservable": "A host and its path may hold letters, digits, dots, hyphens, slashes and colons only. Leave out \"_\", \"%\", \"~\", a query and a fragment.",
    "builder.permissions.badges_hint": "Twitch chat badges (img-src adds static-cdn.jtvnw.net).",
    "builder.permissions.emotes_hint": "Twitch emotes (img-src adds static-cdn.jtvnw.net).",
    "builder.permissions.emotes_bttv_hint": "BetterTTV emotes from chat messages (img-src adds cdn.betterttv.net).",
    "builder.permissions.emotes_7tv_hint": "7TV emotes from chat messages (img-src adds cdn.7tv.app).",
    "builder.permissions.gifs_hint": "GIPHY GIFs from chat messages (img-src adds *.giphy.com).",
    "builder.permissions.cheermotes_hint": "Twitch cheermotes from chat messages (img-src adds d3aqoihi2n8ty8.cloudfront.net).",
    "builder.permissions.audio_hint": "Play audio (media-src adds 'self' and data:).",
    "builder.permissions.storage_hint": "localStorage access: no CSP effect (declarative-only).",
    "builder.permissions.fetch_hint": "Fetch from third-party hosts (connect-src). Declare each host separately.",
    "builder.permissions.remove_host": "Remove host",
    "builder.permissions.add_host": "+ Add Host",
    "builder.permissions.csp_preview": "Content-Security-Policy (preview):",
    "builder.events.subscribes": "Subscribes",
    "builder.events.subscribes_intro": "Events your widget listens to. The runtime will route matching events to your bundle via window.sb.on().",
    "builder.events.emits": "Emits",
    "builder.events.emits_intro": "Custom events your widget produces (window.sb.emit()). Declare each one so consumers know what to bind to.",
    "builder.events.add_emit": "+ Add Emit",
    "builder.events.emits_empty": "No emits declared yet. Add one if your widget produces events for other parts of the app to react to.",
    "builder.permissions.intro": "Browser Sandbox Capabilities (CSP). Declare exactly what your widget needs. Anything not listed is blocked by the browser at runtime.",
    "builder.theme.group_color": "Colors",
    "builder.theme.group_font": "Typography",
    "builder.theme.group_radius": "Geometry · Radius",
    "builder.theme.group_shadow": "Geometry · Shadow",
    "builder.theme.group_spacing": "Geometry · Spacing",
    "builder.theme.group_anim": "Animation",
    "builder.theme.consumes_title": "Theme tokens consumed",
    "builder.theme.consumes_intro": "Pick the v1 tokens your widget reads via CSS custom properties. Authors of theme packages know to provide them when targeting your widget.",
    "builder.theme.overridable": "Allow user overrides",
    "builder.theme.overridable_help": "When enabled, the property owner can override individual tokens in their widget instance (useful when a single brand color should follow them across widgets).",
    "builder.tokens.title": "Tokens",
    "builder.tokens.intro": "The values your theme provides for each v1 token. Widgets read them via CSS custom properties at runtime.",
    "builder.tokens.add": "+ Add Token",
    "builder.tokens.empty": "No tokens declared yet. Add one for each v1 vocab key your theme defines.",
    "builder.events.range_caret": "^ caret (≥X.0.0, <(X+1).0.0)",
    "builder.events.range_tilde": "~ tilde (≥X.Y.0, <X.(Y+1).0)",
    "builder.events.range_exact": "exact",
    "builder.events.version_format": "Use a numeric version, e.g. 1, 1.0, 1.0.0, or 1.x.",
    "builder.events.subscribes_label": "Subscribes to events",
    "builder.events.catalog_loading": "Loading catalog…",
    "builder.events.search": "Search by key or name…",
    "builder.events.range_help": "Each pick defaults to caret-major (e.g. ^1). Switch to ~minor or exact per-row below.",
    "builder.events.scopes": "Scopes:",
    "builder.tokens.unknown_hint": "Not in v1 vocab: widgets that consume it must opt in via theme_consumes.",
    "builder.tokens.remove": "Remove token",
    "builder.coming_soon.docs_hint": "Until then, the widget runtime types are documented in widget-runtime.d.ts.",
    "builder.coming_soon.title": ":slot (coming soon)",
    "builder.coming_soon.body": "This Builder slot is reserved for an upcoming sub-spec. The nav entry stays here so the workspace structure does not shift when the page lands.",
    "builder.packages.drafts": "Unpublished",
    "builder.dashboard.installs": "Installs",
    "builder.dashboard.approved": ":name was approved",
    "builder.notify.approved": "Release approved",
    "builder.notify.rejected": "Release rejected",
    "builder.notify.approved_body": "“:name” :version was reviewed and approved.",
    "builder.notify.rejected_body": "“:name” :version was rejected in review.",
    "builder.notify.note": "Note: :note",
    "builder.notify.invitation_accepted": "Invitation accepted",
    "builder.notify.invitation_accepted_body": ":actor accepted the invitation and builds “:name” with you now.",
    "builder.notify.invitation_declined": "Invitation declined",
    "builder.notify.invitation_declined_body": ":actor declined the invitation to build “:name”.",
    "builder.notify.hand_on_accepted": "Hand-on accepted",
    "builder.notify.hand_on_accepted_body": ":actor accepted. “:name” is theirs now, and you still build with them.",
    "builder.notify.hand_on_accepted_admin_body": ":actor accepted the hand-on the platform offered. “:name” is theirs now, and you still build with them.",
    "builder.notify.hand_on_declined": "Hand-on declined",
    "builder.notify.hand_on_declined_body": ":actor declined. “:name” stays yours.",
    "builder.notify.hand_on_declined_admin_body": ":actor declined the hand-on the platform offered. “:name” stays yours.",
    "builder.notify.passed_on": "Package changed hands",
    "builder.notify.passed_on_body": "“:name” belongs to :owner now. You still build with them.",
    "builder.notify.passed_on_admin_body": "“:name” belongs to :owner now: the platform offered the hand-on. You still build with them.",
    "builder.notify.passed_on_deleted_body": "The owner's account was deleted. “:name” belongs to :owner now.",
    "builder.notify.passed_on_you_body": "The owner's account was deleted. “:name” is yours now: you have built it with them the longest.",
    "builder.notify.author_removed": "Removed from a package",
    "builder.notify.author_removed_body": ":actor removed you from “:name”. What you built stays in the package.",
    "builder.notify.author_left": "An author left",
    "builder.notify.author_left_body": ":actor left “:name”. What they built stays in the package.",
    "builder.notify.author_gone_body": ":actor no longer builds “:name” with you. What they built stays in the package.",
    "builder.notify.package_deleted": "Package deleted",
    "builder.notify.package_deleted_body": ":actor deleted “:name”.",
    "builder.notify.package_deleted_nobody_body": "“:name” was deleted.",
    "builder.notify.release_published": "New release",
    "builder.notify.release_published_body": ":actor published “:name” :version (:visibility).",
    "builder.notify.listing_approved": "Listing change approved",
    "builder.notify.listing_approved_body": "The change to the listing of “:name” was reviewed and approved.",
    "builder.notify.listing_rejected": "Listing change rejected",
    "builder.notify.listing_rejected_body": "The change to the listing of “:name” was rejected in review.",
    "builder.notify.taken_down": "Package taken down",
    "builder.notify.taken_down_body": "The platform took “:name” down. Nobody can install it until that is lifted.",
    "builder.notify.restored": "Takedown lifted",
    "builder.notify.restored_body": "The takedown of “:name” was lifted. It can be installed again.",
    "builder.notify.version_discarded": "Your version was discarded",
    "builder.notify.discarded_save_mine_body": ":actor saved over your version in “:name”. It is kept under Discarded.|:actor saved over :count of your versions in “:name”. They are kept under Discarded.",
    "builder.notify.discarded_restore_body": ":actor brought an earlier version back in “:name”, over yours. Yours is kept under Discarded.|:actor brought an earlier version back in “:name”, over :count of yours. They are kept under Discarded.",
    "builder.notify.discarded_delete_body": ":actor deleted something you saved last in “:name”. Your version is kept under Discarded.|:actor deleted :count things you saved last in “:name”. Your versions are kept under Discarded.",
    "builder.notify.discarded_replace_body": ":actor replaced a file that was last yours in “:name”. Yours is kept under Discarded.|:actor replaced :count files that were last yours in “:name”. Yours are kept under Discarded.",
    "builder.notify.discarded_take_over_body": ":actor took content over again in “:name”, over your version. Yours is kept under Discarded.|:actor took content over again in “:name”, over :count of your versions. They are kept under Discarded.",
    "builder.notify.discarded_nobody_body": "Your version in “:name” was replaced. It is kept under Discarded.|:count of your versions in “:name” were replaced. They are kept under Discarded.",
    "builder.review.mail_approved_subject": "Your package was approved",
    "builder.review.mail_approved_line": "The release :version of “:name” was reviewed and approved. It is live in the marketplace now.",
    "builder.review.mail_rejected_subject": "Your package needs revisions",
    "builder.review.mail_rejected_line": "The release :version of “:name” was rejected in review.",
    "builder.review.mail_note": "Reviewer note: :note",
    "builder.review.mail_action": "Open the versions",
    "builder.listing.mail_approved_subject": "Your listing change was approved",
    "builder.listing.mail_approved_line": "The change to the listing of “:name” was reviewed and approved. It is live now.",
    "builder.listing.mail_rejected_subject": "Your listing change needs revisions",
    "builder.listing.mail_rejected_line": "The change to the listing of “:name” was rejected in review. The live listing stays as it is.",
    "builder.listing.mail_action": "Open the listing",
    "builder.notify.author_invitation": "Invitation to build a package",
    "builder.notify.author_invitation_body": ":sender invites you to build “:name” with them.",
    "builder.authors.invite_not_member": "This person is not a Builder member.",
    "builder.authors.invite_already_author": "This person already builds this package.",
    "builder.authors.invite_already_invited": "This person is already invited.",
    "builder.authors.owner_cannot_leave": "As the owner you cannot leave the package. Hand it on to an author first.",
    "builder.authors.mail_subject": "You are invited to build a package",
    "builder.authors.mail_line": ":sender invites you to build the package “:name” with them.",
    "builder.authors.mail_action": "Open the Builder",
    "builder.authors.mail_answer": "You can accept or decline the invitation in the Builder.",
    "builder.notify.hand_on_offer": "Hand-on offered",
    "builder.notify.hand_on_offer_body": ":sender offers you “:name” to take over as its owner.",
    "builder.notify.hand_on_offer_admin_body": ":sender offers you “:name” on behalf of the platform, to take over as its owner.",
    "builder.hand_on.not_author": "This person does not build this package. You can hand it on to an author only.",
    "builder.hand_on.already_owner": "This person already owns the package.",
    "builder.hand_on.already_open": "A hand-on is already open for this package. Withdraw it first.",
    "builder.hand_on.mail_subject": "You are offered a package to take over",
    "builder.hand_on.mail_line": ":sender offers you the package “:name” to take over as its owner.",
    "builder.hand_on.mail_line_admin": ":sender offers you the package “:name” on behalf of the platform, to take over as its owner.",
    "builder.hand_on.mail_action": "Open the Builder",
    "builder.hand_on.mail_answer": "You can accept or decline the hand-on in the Builder. Nothing changes until then.",
    "builder.dashboard.rejected": ":name was rejected",
    "builder.dashboard.recent_activity": "Recent activity",
    "builder.dashboard.activity_empty": "No reviewer activity yet. Submitted packages will show approval and rejection notes here.",
    "builder.distribution.tab_direct_send": "Direct-Send",
    "builder.distribution.tab_import_links": "Import-Links",
    "builder.distribution.tab_install_requests": "Install-Requests",
    "builder.distribution.title": "Distribution",
    "builder.distribution.coming_soon_title": ":label (coming soon)",
    "builder.distribution.coming_soon_body": "This distribution mechanism lands in a later phase of Sub-Spec C. The tab stays here so the workspace structure does not shift when it ships.",
    "builder.distribution.direct_send_title": "Send a package directly to a Property-Owner",
    "builder.distribution.direct_send_needs_published": "Publish at least one package first: Direct-Send requires a published version.",
    "builder.distribution.package": "Package",
    "builder.distribution.pick_package": "Pick a package",
    "builder.distribution.recipient": "Recipient",
    "builder.distribution.recipient_help": "Search by Twitch login or display name. We resolve the user-id for you.",
    "builder.distribution.send_invitation": "Send Invitation",
    "builder.distribution.outgoing_title": "Outgoing Invitations",
    "builder.distribution.invitations_empty": "No invitations sent yet.",
    "builder.distribution.to": "to",
    "builder.distribution.sent": "sent",
    "builder.distribution.expires": "expires",
    "builder.distribution.import_link_title": "Generate a single-use Import-Link",
    "builder.distribution.import_links_need_published": "Publish at least one package first: Import-Links require a published version.",
    "builder.distribution.link_once": "Your link (visible once):",
    "common.copy": "Copy",
    "builder.distribution.single_use_hint": "Single-use: the first authenticated user who opens this URL installs the package and consumes the link.",
    "builder.distribution.expiry": "Optional expiry",
    "builder.distribution.expiry_help": "If set, unredeemed links past this date are automatically marked expired by a daily cron.",
    "builder.distribution.generate_link": "Generate Link",
    "builder.distribution.generated_title": "Generated Links",
    "builder.distribution.import_links_empty": "No Import-Links generated yet.",
    "builder.distribution.generated": "generated",
    "builder.distribution.redeemed": "redeemed",
    "common.revoke": "Revoke",
    "builder.packages.delete_title": "Delete package :name?",
    "builder.packages.delete_message": "Nobody can install it any more, and no new version will come. Everything you changed since its last release is removed.",
    "builder.packages.delete_installs": "{0} No other channel has it installed.|[1,1] 1 other channel has it installed and keeps running it, without updates.|[2,*] :count other channels have it installed and keep running it, without updates.",
    "builder.packages.delete_confirm": "Delete package",
    "builder.packages.empty": "No packages yet. Click New package to start one.",
    "builder.packages.open_editor_aria": "Open editor for :name",
    "builder.packages.delete_aria": "Delete package :name",
    "builder.submissions.reviewer_note": "Reviewer note:",
    "common.restore": "Restore",
    "builder.settings.json_invalid": "JSON has parse errors.",
    "builder.settings.name_required": "Name is required.",
    "builder.settings.page_title": "Builder Settings",
    "builder.notifications.title": "Notifications",
    "builder.notifications.on_approval": "Email me when a submission is approved",
    "builder.notifications.on_rejection": "Email me when a submission is rejected",
    "builder.notifications.hint": "Approval and rejection notices always appear in the in-app bell. These toggles only control the additional email.",
    "builder.settings.save": "Save settings",
    "builder.settings.saved": "Settings saved.",
    "builder.submissions.title": "Submissions",
    "builder.submissions.empty": "No submissions yet. Choose Public when you publish a package to have it reviewed.",
    "builder.submissions.resubmit_aria": "Edit and re-submit :name",
    "builder.submissions.resubmit": "Edit & Resubmit",
    "builder.submissions.draft_deleted": "Package deleted",
    "extensions.counters.saved": "Counter saved",
    "extensions.counters.updated": "Counter updated",
    "extensions.counters.removed": "Counter removed",
    "extensions.counters.var_value_help": "Insert the current value of a Counter resource (managed under Extensions → Counters).",
    "extensions.counters.name_needs_alnum": "The name must contain at least one letter or digit.",
    "extensions.counters.slug_taken": "A counter with that identifier already exists (:slug).",
    "extensions.events.unpinned": "Event :key unpinned",
    "extensions.events.pin_sync_delayed": "Pinned, but downstream sync was delayed. It will retry on the next trigger.",
    "extensions.events.pinned_partial": ":ok pinned, :n need attention (missing scopes)",
    "extensions.events.pinned_one": "Event pinned",
    "extensions.events.pinned_many": ":n events pinned",
    "extensions.loyalty.slot_command_saved": "Loyalty :slot command saved",
    "extensions.loyalty.slot_command_removed": "Loyalty :slot command removed",
    "extensions.loyalty.settings_saved": "Loyalty settings saved",
    "extensions.mod.module_saved": ":module saved",
    "extensions.mod.module_enabled": ":module enabled",
    "extensions.mod.module_disabled": ":module disabled",
    "extensions.mod.var_category": "Moderation Violation",
    "extensions.mod.var_user_login": "User Login",
    "extensions.mod.var_user_display_name": "User Display Name",
    "extensions.mod.var_strike_count": "Strike Count",
    "extensions.mod.var_module": "Module",
    "extensions.mod.var_action": "Action",
    "extensions.mod.timeout_duration_required": "Timeout action requires a duration.",
    "extensions.mod.settings_saved": "Mod Tools settings saved",
    "extensions.quotes.import_no_rows": "No rows found in the uploaded file.",
    "extensions.quotes.imported": ":n quotes imported.",
    "extensions.rewards.no_primary_connection": "Property has no primary Twitch connection.",
    "extensions.rewards.free_tier_cap": "Free tier is limited to 3 category-bound rewards. Upgrade to Premium for unlimited bindings.",
    "extensions.scenes.created": "Scene created",
    "extensions.scenes.saved": "Scene saved",
    "extensions.scenes.updated": "Scene updated",
    "extensions.scenes.removed": "Scene removed",
    "extensions.scenes.token_rotated": "Scene token rotated",
    "extensions.timers.saved": "Timer saved",
    "extensions.timers.updated": "Timer updated",
    "extensions.timers.removed": "Timer removed",
    "admin.marketplace.package_installed": "Package :id@:version installed.",
    "admin.marketplace.invalid_streampkg": "The uploaded file is not a valid .streampkg ZIP.",
    "graphs.history.restored_version": "Graph restored from version #:n",
    "extensions.lifecycle.enabled": "Extension :alias enabled",
    "extensions.lifecycle.paused": "Extension :alias paused",
    "graphs.editor.saved_missing_scopes": "Graph saved, but :n trigger(s) need scopes: :keys",
    "dashboard.members.added": "Member :name added",
    "dashboard.members.updated": "Member :name updated",
    "dashboard.members.removed": "Member :name removed",
    "media.upload.type_not_allowed": "File type not allowed for :kind.",
    "media.upload.image_corrupted": "Image file is corrupted or not a real image.",
    "media.upload.quota_exceeded": "Asset quota exceeded. Delete some assets first.",
    "media.upload.too_large": "A file may be at most :max.",
    "ui.property_switch.switched": "Switched to :name",
    "ui.property_switch.no_access": "You do not have access to this property.",
    "dashboard.roles.not_in_property": "The selected role does not belong to this property.",
    "extensions.lifecycle.already_installed": "Extension :alias is already installed",
    "extensions.lifecycle.not_installed": "Extension :alias is not installed",
    "admin.marketplace.already_reviewed": "This submission was already :status by another reviewer.",
    "admin.marketplace.replaced": ":version was replaced by :by and is no longer up for review.",
    "admin.marketplace.withdrawn": ":version was withdrawn and is no longer up for review.",
    "admin.marketplace.listing_with_release": "This listing is reviewed with version :version. Decide on the version.",
    "admin.marketplace.listing_nothing_waits": "No listing change is waiting any more.",
    "admin.marketplace.listing_review_title": "Listing change",
    "admin.marketplace.listing_live": "Live",
    "admin.marketplace.listing_new": "New",
    "admin.marketplace.listing_goes_with": "The listing goes live with version :version. Decide on the version.",
    "admin.marketplace.owner": "Owner",
    "admin.marketplace.hand_on_title": "Hand-on",
    "admin.marketplace.hand_on_action": "Hand on…",
    "admin.marketplace.hand_on_hint": "Offer the package to one of its authors in the owner's place. Nothing changes until they accept.",
    "admin.marketplace.hand_on_hint_ownerless": "This package has no owner. Offer it to a Builder member. It gets a draft when they accept.",
    "admin.marketplace.hand_on_no_authors": "Nobody but the owner builds this package. It can be handed on to an author only.",
    "admin.marketplace.hand_on_no_members": "The Builder has no members the package could be offered to.",
    "admin.marketplace.hand_on_unfit": "The newest version cannot fill a draft (:reason). The accept is refused until that is fixed.",
    "admin.marketplace.hand_on_open": "The owner offered the hand-on to :name. Nothing changes until they accept.",
    "admin.marketplace.hand_on_open_admin": "Hand-on offered to :name on behalf of the platform. Nothing changes until they accept.",
    "admin.marketplace.hand_on_withdraw": "Withdraw",
    "admin.marketplace.hand_on_dialog_title": "Hand on “:name”",
    "admin.marketplace.hand_on_prompt": "The person is told by the bell and by e-mail. The package is theirs only once they accept. Its id, listing, installs and versions stay.",
    "admin.marketplace.hand_on_pick_author": "Author",
    "admin.marketplace.hand_on_pick_member": "Builder member",
    "admin.marketplace.hand_on_confirm": "Offer the hand-on",
    "admin.marketplace.hand_on_not_author": "This person does not build this package. It can be offered to one of its authors only.",
    "admin.marketplace.hand_on_not_member": "This person is not a Builder member.",
    "admin.marketplace.hand_on_deleted": "This package was deleted and can no longer be handed on.",
    "admin.marketplace.hand_on_not_authored": "Only a package from the Builder can be handed on.",
    "admin.marketplace.hand_on_not_seated": "This package's owner is not seated yet. Run packages:seat-authors first.",
    "admin.marketplace.submitted_by": "Submitted by",
    "admin.marketplace.listing_approve": "Approve the listing",
    "admin.marketplace.listing_reject": "Reject the listing",
    "admin.marketplace.listing_reject_note": "Reason, for the person who built the package",
    "admin.marketplace.listing_reject_confirm": "Send the rejection",
    "admin.cloudbot.title": "Cloud Bot",
    "admin.extensions.tier_free": "Free",
    "admin.extensions.tier_premium": "Premium",
    "admin.extensions.pricing_tier": "Pricing Tier",
    "admin.extensions.pricing_tier_help": "Minimum pricing tier the property owner needs to install or use this extension. Promo-flip Premium → Free temporarily; extensions:sync respects the override.",
    "admin.marketplace.title": "Marketplace Review",
    "admin.marketplace.pick_package": "Pick a package to inspect.",
    "admin.marketplace.pick_preview": "Select a package to preview.",
    "admin.marketplace.no_widget_preview": "This release has no widget to preview.",
    "admin.marketplace.uninstall_confirm_title": "Uninstall :name?",
    "admin.marketplace.uninstall_confirm_message": "The release is removed from the catalog. A release a channel has installed cannot be deleted.",
    "admin.marketplace.bundle_source": "Bundle source",
    "admin.marketplace.bundle_loading": "Loading bundle…",
    "admin.marketplace.file_new": "new",
    "admin.marketplace.file_changed": "changed",
    "admin.marketplace.file_unchanged": "unchanged",
    "admin.marketplace.file_baseline": "Compared with version :version, the last one approved.",
    "admin.marketplace.file_no_baseline": "No approved version to compare with: everything is new.",
    "admin.marketplace.subscribes_to": "Subscribes to",
    "admin.marketplace.config_keys": "Config keys",
    "admin.marketplace.filter_published": "Published",
    "admin.marketplace.filter_unsubmitted": "Authored-Unsubmitted",
    "admin.marketplace.filter_released": "Live without review",
    "admin.marketplace.filter_withdrawn": "Withdrawn",
    "admin.marketplace.filter_unreleased": "Not yet published",
    "admin.marketplace.state_draft": "Draft",
    "admin.marketplace.no_release": "This package has no release yet. Its quota applies to the draft.",
    "admin.marketplace.asset_quota": "Package quota",
    "admin.marketplace.asset_quota_used": ":used of :limit · :count of :total assets",
    "admin.marketplace.asset_quota_mb": "Storage in MB",
    "admin.marketplace.asset_quota_count": "Assets",
    "admin.marketplace.asset_quota_save": "Save quota",
    "admin.marketplace.asset_quota_no_draft": "This package has no draft.",
    "admin.marketplace.store_usage": "Published",
    "admin.marketplace.store_usage_test": "In the store (channel test)",
    "admin.marketplace.store_folders": "Release folders",
    "admin.marketplace.store_blobs": "Files in the store",
    "admin.marketplace.store_bytes": "Occupied",
    "admin.marketplace.store_copies": "As copies",
    "admin.marketplace.store_measured": "Measured",
    "admin.marketplace.store_none": "Not measured in the store yet.",
    "admin.marketplace.storage": "Storage",
    "admin.marketplace.storage_hint": "Each file of a package lies once in its store, and a release folder only names it. \"As copies\" is what the folders would occupy without the store.",
    "admin.marketplace.storage_owners": "Owners",
    "admin.marketplace.storage_owners_cut": "The :limit owners with the most storage.",
    "admin.marketplace.storage_no_owner": "No owner",
    "admin.marketplace.storage_package_count": ":count package|:count packages",
    "admin.marketplace.storage_empty": "No package has a store yet.",
    "admin.marketplace.release_notes": "What's new (for streamers)",
    "admin.marketplace.upload_package": "Upload package",
    "admin.marketplace.packages": "Packages",
    "admin.marketplace.no_packages": "No packages installed yet.",
    "admin.marketplace.queue_empty": "Nothing waits for review.",
    "admin.marketplace.filter_empty": "No packages in this view.",
    "admin.marketplace.listing_waits": "Listing change waits",
    "common.preview": "Preview",
    "admin.marketplace.reject_note_required": "Review note is required when rejecting.",
    "admin.marketplace.review_actions": "Review actions",
    "admin.marketplace.reject_title": "Reject submission",
    "admin.marketplace.reject_prompt": "Provide a reviewer note. The author sees this on their Drafts tab so they can fix and resubmit a new version.",
    "admin.marketplace.review_note": "Review note",
    "admin.marketplace.reject_placeholder": "Why is this submission being rejected?",
    "admin.marketplace.upload_pick_first": "Pick a .streampkg file first.",
    "admin.marketplace.upload_title": "Upload widget package",
    "admin.marketplace.upload_hint": "Pick a .streampkg file (a ZIP with manifest.json at the root).",
    "admin.users.identity": "Identity",
    "admin.users.deactivated_at": "Deactivated at",
    "admin.users.twitch_login": "Twitch login",
    "admin.users.display_name": "Display name",
    "admin.users.property_id": "Property ID",
    "admin.users.tier": "Tier",
    "admin.users.user_groups": "User groups",
    "common.created": "Created",
    "admin.users.last_login": "Last login",
    "admin.users.connections": "Connections",
    "admin.users.token_expired": "Token expired",
    "admin.users.token_valid": "Token valid",
    "admin.users.no_connections": "No connections",
    "admin.users.live_status": "Live status",
    "admin.users.live_state_failed": "Could not load live state:",
    "common.retry": "Retry",
    "common.refresh": "Refresh",
    "admin.users.events_total": "Total",
    "admin.users.events_pending": "Pending",
    "admin.users.events_failed": "Failed",
    "admin.users.events_revoked": "Revoked",
    "admin.users.events_needs_reregister": "Needs reregister",
    "admin.users.event_error": "error",
    "admin.users.no_event_registrations": "No event registrations",
    "common.disabled": "Disabled",
    "admin.users.tier_blocked": "Blocked: requires",
    "admin.users.roles_suffix": "role(s)",
    "admin.users.no_extensions": "No extensions installed",
    "admin.users.audit_search": "Search action…",
    "admin.users.audit_all_actions": "All actions",
    "admin.users.audit_any_actor": "Any actor",
    "admin.users.hide_details": "Hide details",
    "admin.users.show_details": "Show details",
    "admin.users.audit_no_match": "No audit entries match the filters",
    "admin.users.load_more": "Load more",
    "admin.users.tier_free": "Free",
    "admin.users.tier_premium": "Premium",
    "admin.users.pricing_tier": "Pricing Tier",
    "admin.users.pricing_tier_help": "Premium unlocks tier-gated extensions for this user (treated as the property owner).",
    "extensions.actions.empty": "No actions yet. Add one below to make this trigger do something.",
    "graphs.action_form.default_sender": "Default sender",
    "graphs.action_form.primary": "primary",
    "graphs.scopes.action_missing_title": "Missing Twitch scopes",
    "graphs.scopes.action_missing_body": "This action needs scopes the property has not granted yet. Without them, Twitch will reject the call silently when the action fires.",
    "graphs.scopes.grant_required": "Grant required scopes",
    "graphs.action_form.literal_placeholder": "Literal value",
    "graphs.action_form.graph_editor_only": "Param \":key\" (type \":type\") is editable only in the Graph editor.",
    "graphs.action_form.no_params": "This action has no editable parameters.",
    "graphs.action_form.unknown_node": "Unknown action node \":type\" (catalog entry missing).",
    "events.action_row.empty": "(empty)",
    "events.action_row.missing_scopes": "Missing Twitch scopes: :scopes",
    "extensions.command_slots.remove_title": "Remove this command?",
    "extensions.command_slots.remove_message": "The auto-generated graph drops with it; the underlying chat command stays only if it was already yours before.",
    "extensions.command_slots.keyword_exists": "A command !:keyword already exists. Switch to Link existing to attach the graph to it without changing its current settings.",
    "extensions.command_slots.no_linkable": "No top-level commands available to link.",
    "extensions.command_slots.link_help": "The graph will fire alongside any existing actions on this command.",
    "extensions.scope_banner.runtime_hint": "Without these, the :name actions will fail at runtime.",
    "extensions.scope_banner.owner_only": "Only the property owner can grant these scopes. Please ask them to sign in and complete the grant.",
    "extensions.scope_banner.grant": "Grant scopes",
    "graphs.editor.grant_scopes_title": "Grant: :scopes",
    "graphs.editor.grant_missing_one": "Grant 1 missing scope",
    "graphs.editor.grant_missing_many": "Grant :n missing scopes",
    "graphs.editor.undo": "Undo (Ctrl+Z)",
    "graphs.editor.redo": "Redo (Ctrl+Shift+Z)",
    "graphs.history.title": "Version history",
    "graphs.inspector.audio_out_missing": "No Audio Out scene yet. We'll create one for you on save.",
    "graphs.inspector.audio_out_paused": "All your Audio Out scenes are paused. Audio won't play until you re-enable one.",
    "graphs.inspector.open_widgets": "Open Widgets",
    "graphs.share.expires": "Expires",
    "graphs.counter_modal.mode_persistent": "Persistent (survives across runs)",
    "graphs.counter_modal.mode_session": "Session (resets each stream)",
    "graphs.counter_modal.delete_title": "Delete counter :name?",
    "graphs.counter_modal.delete_message": "This will permanently remove the counter and its current value.",
    "graphs.counter_modal.delete_confirm": "Delete counter",
    "graphs.counter_modal.title_edit": "Edit counter:",
    "graphs.counter_modal.title_new": "New Counter",
    "graphs.counter_modal.name_placeholder": "e.g. Hype Points",
    "graphs.counter_modal.default_label": "Default value",
    "graphs.counter_modal.mode_label": "Persistence",
    "graphs.scopes.node_missing": "This node needs scopes the property has not granted yet:",
    "graphs.inspector.pick_widget": "Pick a widget",
    "graphs.inspector.pick_emit": "Pick an emit",
    "graphs.inspector.any_instance": "Any instance",
    "graphs.inspector.missing_custom_event": "Custom event no longer exists",
    "graphs.inspector.no_instances": "No instances of this widget on any scene yet. Drop one first to scope.",
    "graphs.inspector.no_emit_bundles": "No widget bundles with emits installed on this property yet.",
    "graphs.inspector.match_placeholder": "Match value (exact string)",
    "common.add": "Add",
    "graphs.history.restore_title": "Restore version #:n?",
    "graphs.history.restore_message": "Current changes will be saved as a new version automatically.",
    "graphs.history.restore_confirm": "Restore version",
    "graphs.history.restore_failed": "Restore failed",
    "graphs.history.empty": "No versions yet. Saving the graph creates the first one.",
    "graphs.timer_modal.delete_title": "Delete timer :name?",
    "graphs.timer_modal.delete_message": "This will also remove the auto-generated chat-send graph if one was created from the Settings page.",
    "graphs.timer_modal.delete_confirm": "Delete timer",
    "graphs.timer_modal.title_edit": "Edit timer:",
    "graphs.timer_modal.title_new": "New Timer",
    "graphs.timer_modal.name_placeholder": "e.g. Welcome message",
    "graphs.timer_modal.interval_label": "Interval (minutes)",
    "graphs.timer_modal.min_chat_lines_label": "Minimum chat lines since last fire",
    "graphs.timer_modal.min_chat_lines_placeholder": "0 = no minimum",
    "graphs.timer_modal.expert": "Expert",
    "graphs.timer_modal.start_offset_label": "Start offset (minutes)",
    "graphs.timer_modal.reset_on_stream_start": "Reset on stream start",
    "events.user_event.delete_title": "Delete this custom event?",
    "events.user_event.delete_message": "This cannot be undone.",
    "events.user_event.delete_confirm": "Delete event",
    "graphs.inputtext.var_synthetic_help": "generated by the normaliser",
    "graphs.inputtext.var_available_in": "only present in :triggers",
    "graphs.channel_vars.title": "Channel Title",
    "graphs.channel_vars.category": "Channel Category",
    "graphs.channel_vars.login": "Channel Login",
    "graphs.channel_vars.display_name": "Channel Display Name",
    "graphs.channel_vars.language": "Channel Language",
    "graphs.channel_vars.delay": "Stream Delay (s)",
    "graphs.channel_vars.category_since_help": "When the channel entered its current category. Use the Date formatter (preset Relative) to show e.g. \"2 hours ago\". Resets on category change and stream start.",
    "graphs.stream_vars.started_at_help": "When the current stream started, empty while offline. Use the Date formatter with the preset Uptime to answer !uptime with e.g. \"3 hours 24 minutes\".",
    "ui.property_selector.moderating": "Moderating",
    "ui.scope_setup.needed_by": "needed by: :exts",
    "ui.scope_setup.grant_all": "Grant all scopes",
    "ui.user_menu.tier": "Tier",
    "ui.user_menu.premium": "Premium",
    "ui.user_menu.free": "Free",
    "ui.nav.builder": "Builder",
    "marketplace.install.installing": "Installing…",
    "marketplace.teaser.load_failed": "Could not load marketplace.",
    "marketplace.teaser.title": "From the Marketplace",
    "marketplace.teaser.empty": "Nothing published yet.",
    "marketplace.teaser.browse_all": "Browse all in Marketplace →",
    "widgets.editor.rail_empty": "No widgets yet. Use + to add one.",
    "widgets.editor.add_widget": "Add widget",
    "ui.admin_nav.marketplace_review": "Marketplace Review",
    "ui.admin_nav.cloud_bot": "Cloud Bot",
    "ui.builder_nav.packages": "Packages",
    "ui.builder_nav.submissions": "Submissions",
    "ui.builder_nav.distribution": "Distribution",
    "ui.builder_nav.documentation": "Documentation",
    "ui.builder_nav.analytics": "Analytics",
    "marketplace.import_link.page_title": "Install package",
    "marketplace.import_link.deleted": "Its author deleted this package, so this link no longer installs it.",
    "marketplace.sender.sent_by": "Sent by :name",
    "marketplace.notify.invitation": "Package invitation",
    "marketplace.notify.invitation_from": ":sender sent you the package :id v:version.",
    "marketplace.notify.invitation_body": "You received the package :id v:version.",
    "marketplace.index.no_match": "No packages match those filters.",
    "marketplace.invitations.page_title": "Marketplace · Invitations",
    "marketplace.invitations.title": "Invitations",
    "marketplace.invitations.subtitle": "Packages sent to you directly by their authors.",
    "marketplace.invitations.empty": "No pending invitations.",
    "marketplace.invitations.mail_subject": "You received a package invitation",
    "marketplace.invitations.mail_line": "You have a package invitation: :sender sent you the package :id v:version.",
    "marketplace.invitations.mail_action": "Open Marketplace inbox",
    "marketplace.invitations.mail_answer": "You can accept or decline from your Marketplace inbox.",
    "marketplace.invitations.from": "from",
    "marketplace.invitations.sent": "sent",
    "marketplace.invitations.expires": "expires",
    "marketplace.invitations.deleted": "Its author deleted this package. It can't be installed.",
    "marketplace.invitations.unavailable": "This version of the package is no longer available. It can't be installed.",
    "common.decline": "Decline",
    "common.or": "or",
    "dashboard.members.remove_confirm": "Remove :name from this property?",
    "dashboard.members.add": "Add Member",
    "dashboard.members.edit_title": "Edit Member: :name",
    "dashboard.members.user": "User",
    "dashboard.members.no_roles": "No roles defined yet.",
    "dashboard.members.create_role": "Create one",
    "dashboard.members.direct_permissions": "Direct Permissions: :name",
    "dashboard.members.remove": "Remove Member",
    "dashboard.members.owner": "Owner",
    "dashboard.members.direct": "direct",
    "ui.confirm.title": "Are you sure?",
    "builder.binding.type_mismatch": "The setting \":setting\" is a :type; this field binds only a :expected setting.",
    "builder.binding.unbindable": "\":param\" cannot be a package setting.",
    "builder.binding.chip_options": "\":param\" cannot become a setting: a setting's text holds only {path} placeholders, no format, counter or random choice, and no literal text that reads as one.",
    "builder.binding.key_pattern": "A setting key starts with a lowercase letter and holds only lowercase letters, digits and underscores, at most 64.",
    "builder.binding.too_many": "A package has at most :max settings.",
    "builder.binding.own_flow": "Only a package's flow reads package settings. Take the flow over into a package to bind this field.",
    "builder.manifest.id_fixed": "The package id is fixed since creation (:id) and cannot be changed.",
    "builder.release.no_draft": "This package has nothing to edit in the Builder, and none of its releases can be restored there.",
    "builder.release.not_yours": "This package id is none of your packages.",
    "builder.release.flow_saved_by_other": "The flow “:flow” was saved last by :name (:time). Ask your human first; then take_over_from_channel with confirm: true, then publish_package.",
    "builder.manifest.version_projection": "The version follows from your newest release (:version). A new version comes from “Publish…” (over MCP: publish_package).",
    "builder.manifest.listing_projection": "This belongs to the package's listing. Change it under Listing (over MCP: update_listing).",
    "builder.versions.nothing_waits": "No version is waiting for review.",
    "builder.manifest.assets_projection": "The package writes its asset list itself. Change assets under Assets.",
    "builder.manifest.requires_projection": "The package writes the apps it needs itself, from its content.",
    "builder.manifest.setting_bound": "A package flow still binds this setting: :bindings. Bind those fields elsewhere first, or keep the setting with its type.",
    "builder.manifest.custom_event_in_use": "The event ':key' is still used by a flow.",
    "builder.visibility.private": "Private",
    "builder.visibility.unlisted": "By link",
    "builder.visibility.public_open": "Public",
    "builder.frame.section_content": "Content",
    "builder.frame.section_content_sub": "What your package contains",
    "builder.frame.section_assets": "Assets",
    "builder.frame.section_assets_sub": "Images, sounds and videos your package brings along",
    "builder.frame.section_test": "Test",
    "builder.frame.section_test_sub": "Try your package without anything reaching your channel",
    "builder.frame.section_listing": "Listing",
    "builder.frame.section_listing_sub": "What streamers see of your package",
    "builder.frame.section_versions": "Versions",
    "builder.frame.section_versions_sub": "What you have published",
    "builder.frame.section_expert": "Expert",
    "builder.frame.section_expert_sub": "For developers",
    "builder.frame.nav_label": "Package navigation",
    "builder.frame.listing_incomplete": "Something is still missing for Public",
    "builder.frame.state_published": "Published: :version · :visibility",
    "builder.frame.state_unpublished": "Not published yet",
    "builder.property_trial.version_reserved": "The version :version belongs to the test on your channel. Choose another one.",
    "builder.property_trial.not_on": "Switch on “Try it on my channel” first.",
    "builder.property_trial.label": "Try it on my channel",
    "builder.property_trial.off": "Off · none of it on your channel",
    "builder.property_trial.off_release": "Off · your channel uses :version",
    "builder.property_trial.on": "On · follows every save",
    "builder.property_trial.on_waiting": "On · your changes are on their way",
    "builder.property_trial.paused": "Paused while you are live",
    "builder.property_trial.paused_pending": "Paused: you are live, changes are waiting",
    "builder.property_trial.failed": "The last state could not be installed",
    "builder.property_trial.refresh": "Update now",
    "builder.property_trial.playing": ":base + changes · Test, saved :when by :who",
    "builder.property_trial.playing_unpublished": "Unpublished · Test, saved :when by :who",
    "builder.property_trial.unbound": ":count setting not bound|:count settings not bound",
    "builder.property_trial.bind_title": "Bind for your channel",
    "builder.property_trial.bind_intro": "The package needs something of your channel for these. The test runs without them: what hangs on one does not start.",
    "builder.property_trial.bind_later": "Later",
    "builder.property_trial.bind_submit": "Bind",
    "builder.property_trial.bind_failed": "That could not be bound. Try again.",
    "builder.content.add": "Add content",
    "builder.content.add_kind": "What do you want to add?",
    "builder.content.take_over": "Take over from my channel",
    "builder.content.take_over_hint": "Tick what goes into the package. What it needs comes along, with its images and sounds.",
    "builder.take_over.cap": "A package holds at most :cap :kind.",
    "builder.take_over.count": ":count of :cap",
    "builder.take_over.comes_along": "comes along",
    "builder.take_over.submit": "Take over :count",
    "builder.take_over.empty": "There is nothing on your channel to take over yet.",
    "builder.take_over.on_event": "on :event_name",
    "builder.take_over.holds": "holds :names",
    "builder.take_over.plays": "plays :names",
    "builder.take_over.done": "Taken over: :names.",
    "builder.take_over.adopted": "Copied from your library: :names.",
    "builder.take_over.failed": "Taking over failed.",
    "builder.take_over.confirm_title": "Take over from your channel",
    "builder.take_over.confirm_message": "Takes :names over from your channel again.",
    "builder.take_over.confirm_replaces": "Replaces: :items.",
    "builder.take_over.confirm_hint": "What you saved last, through your agent too, is replaced without asking. Replaced versions stay under Discarded.",
    "builder.take_over.confirm": "Take over",
    "builder.content.empty": "Your package is still empty. Add content or take it over from your channel.",
    "builder.content.kind_composition": "Compositions",
    "builder.content.kind_composition_help": "Image, text and sound that play together, such as an alert.",
    "builder.content.kind_scene": "Scenes",
    "builder.content.kind_scene_help": "A canvas for OBS that holds your compositions and widgets.",
    "builder.content.kind_flow": "Flows",
    "builder.content.kind_flow_help": "React to an event such as a follow and trigger actions.",
    "builder.content.kind_widget": "Code widgets",
    "builder.content.kind_widget_help": "Your own HTML, CSS and JavaScript, for the overlay or the dashboard.",
    "builder.content.saved": "saved :when · :name",
    "builder.content.one_composition": "Composition",
    "builder.content.one_scene": "Scene",
    "builder.content.one_flow": "Flow",
    "builder.content.one_widget": "Code widget",
    "builder.assets.section_empty": "No assets yet. Upload images, sounds or videos, or take them over from your library.",
    "builder.listing.field_name": "Name",
    "builder.listing.field_tagline": "Tagline",
    "builder.listing.field_description": "Description",
    "builder.listing.field_cover": "Cover",
    "builder.listing.field_gallery": "Gallery",
    "builder.listing.field_instructions": "Instructions for streamers",
    "builder.listing.required": "Required",
    "builder.listing.required_public": "Required for Public",
    "builder.listing.optional": "optional",
    "builder.listing.hint_name": "up to 60 characters",
    "builder.listing.hint_tagline": "one line, up to 80 characters, shown on the card",
    "builder.listing.hint_cover": "16:9 as on the card, from the assets; any other shape is cropped to its centre",
    "builder.listing.hint_description": "shown on the detail page",
    "builder.listing.hint_gallery": "up to 8 images, each in its own shape",
    "builder.listing.hint_instructions": "Markdown, for streamers after they install",
    "builder.listing.gallery_count": ":count image|:count images",
    "builder.listing.pick": "Pick from assets",
    "builder.listing.remove_image": "Remove image",
    "builder.listing.needs_name": "needs only the name",
    "builder.listing.complete": "complete",
    "builder.listing.missing_short": "missing: :fields",
    "builder.listing.detail": "View the detail page",
    "builder.listing.against_live": "Against the live listing",
    "builder.listing.no_change": "No change.",
    "builder.listing.applies_now": ":visibility: a change applies at once.",
    "builder.listing.waits_review": "Public: a change is reviewed before it goes live. Until then the old listing stays.",
    "builder.listing.waiting": "Sent for review: your change waits, and the old listing stays live until then.",
    "builder.listing.rejected": "Not accepted: :note",
    "builder.listing.save": "Save listing",
    "builder.listing.submit": "Send for review",
    "builder.listing.discard": "Discard the change",
    "builder.listing.submitted": "Sent for review",
    "builder.listing.discarded": "Change discarded",
    "builder.listing.save_failed": "Saving failed",
    "builder.listing.saved": "Listing saved",
    "builder.listing.nothing_waits": "No listing change is waiting.",
    "builder.listing.image_only": "Pick an image from the package's assets.",
    "builder.listing.asset_missing": "This image is not one of the package's assets.",
    "builder.expert.hint": "For developers. Every technical setting has exactly one place, and this is the index to them.",
    "builder.expert.code": "Code",
    "builder.expert.files_count": ":count file|:count files",
    "builder.expert.events": "Events",
    "builder.expert.config": "Configuration",
    "builder.expert.package_settings": "Package settings",
    "builder.expert.theme": "Theme",
    "builder.expert.permissions": "Permissions",
    "builder.expert.subscribed": "subscribed: :events",
    "builder.expert.nothing_subscribed": "nothing subscribed yet",
    "builder.expert.open_in_widget": "open in the widget",
    "builder.expert.no_widgets": "Your package has no code widget.",
    "builder.expert.package": "The whole package",
    "builder.expert.package_id": "Package id",
    "builder.expert.id_fixed": "fixed since creation",
    "builder.expert.manifest": "Manifest",
    "builder.expert.json_view": "View as JSON",
    "builder.expert.json_edit": "Edit as JSON",
    "builder.expert.manifest_hint": "follows from the sections, edit it in JSON mode as before",
    "builder.expert.tokens_edit": "Edit",
    "builder.expert.files": "Files",
    "builder.expert.files_in_package": ":count file in the package|:count files in the package",
    "builder.expert.json_edit_title": "Edit manifest.json",
    "builder.expert.json_view_title": "manifest.json",
    "builder.expert.outline": "Outline",
    "builder.expert.json_note": "What you save here also shows in Listing, Content and the widget panes. The package id (:id) and the asset paths are fixed.",
    "builder.expert.saved": "Saved",
    "builder.frame.tree_fold": "Fold the package navigation",
    "builder.frame.tree_unfold": "Unfold the package navigation",
    "builder.widgets.code_autosaves": "Code saves automatically",
    "builder.widgets.saving": "Saving…",
    "builder.test_area.plain_stage": "Stage without a scene",
    "builder.test_area.stage_hint": "this is how it looks in OBS",
    "builder.test_area.no_stage": "Your package has nothing yet that plays on a stage. You can still test flows here: their replies land in the chat.",
    "builder.test_area.no_alert_stage": "The stage without a scene needs the Compositions app on your channel.",
    "builder.test_area.desk": "Event desk",
    "builder.test_area.more_events": "More events",
    "builder.test_area.fire": "Fire",
    "builder.test_area.values": "Values",
    "builder.test_area.values_hint": "The values last for this test session only and are never saved.",
    "builder.test_area.chat_title": "Stream chat",
    "builder.test_area.chat_hint": "Test, nothing is sent",
    "builder.test_area.chat_placeholder": "Write as :name …",
    "builder.test_area.chat_empty": "Fire an event or write as a viewer. A “!command” fires the flows that listen for it.",
    "builder.test_area.not_sent": "not sent",
    "builder.test_area.not_done": "not carried out",
    "builder.test_area.record": "What happened",
    "builder.test_area.record_events": "{0} :count events|{1} :count event|[2,*] :count events",
    "builder.test_area.counter_line": "Counter :name: :from → :to",
    "builder.test_area.plays_on": ":name plays on :stage",
    "builder.test_area.widget_gets": ":name receives the event",
    "builder.test_area.reply": "Reply in chat: :text",
    "builder.test_area.flow_failed": "Flow :name failed: :error",
    "builder.test_area.routed": "Custom event :name, routed back into the test",
    "builder.test_area.command": "Command :name",
    "builder.test_area.nothing": "Nothing reacted to it.",
    "builder.test_area.reset": "Reset",
    "builder.test_area.bot": "Bot",
    "builder.test_area.counters": "Counters",
    "builder.test_area.failed": "The test failed.",
    "builder.settings_report.unnamed_refs": "One \":type_label\" setting without a name of its own.|:count \":type_label\" settings without a name of their own. Do they mean the same one?",
    "builder.settings_report.unread": "Nothing reads \":key\": no widget names it, no flow binds or reads it, no composition prints it.",
    "builder.settings_report.config_default": "The default of \":key\" reads placement config (:fields). A package setting reads only {settings.*}: make those fields package settings.",
    "builder.settings_report.undeclared": "\":key\" is not declared, but read by :compositions.",
    "builder.settings_report.removed_setting": "\":key\" is removed: stored values rest, and switching back restores them.",
    "builder.settings_report.retyped_setting": "\":key\" changes its type: a stored value reads as the default.",
    "builder.settings_report.narrowed_setting": "\":key\" narrows: a value outside it reads as the default.",
    "builder.settings_report.removed_field": "\":key\" of :widget is removed: the placements' values rest.",
    "builder.settings_report.retyped_field": "\":key\" of :widget changes its type: a placement's value reads as the default.",
    "builder.settings_report.narrowed_field": "\":key\" of :widget narrows: a value outside it reads as the default.",
    "builder.settings_report.moved_to_settings": "\":key\" of :widget becomes a package setting: it takes the value the placements share.",
    "builder.settings_report.moved_state_to_settings": "\":key\" of :widget becomes a package setting: it takes the state a placement saved last.",
    "builder.settings_report.moved_to_config": "\":key\" becomes placement config of :widget: its value is copied into every placement.",
    "builder.settings_report.rename_hint": "A renamed key is a removal plus an addition: change its label instead.",
    "builder.frame.section_package_settings": "Settings",
    "builder.frame.section_package_settings_sub": "What streamers set for the whole package, in this order. Widgets get only what they name; flows read everything.",
    "builder.frame.settings_warn": "Publishing would warn",
    "builder.package_settings.writable": "Widgets may write",
    "builder.package_settings.required": "Required",
    "builder.package_settings.key_released": "Released since :version: the key stays, change the label.",
    "builder.package_settings.read_by": "Read by",
    "builder.package_settings.read_by_none": "Nothing reads it.",
    "builder.package_settings.same_as": "The same as …",
    "builder.form_builder.field_command": "Command",
    "builder.form_builder.field_counter": "Counter",
    "builder.form_builder.field_timer": "Timer",
    "builder.form_builder.field_keyword": "Keyword",
    "builder.form_builder.field_reward": "Reward",
    "builder.form_builder.field_viewer_group": "Viewer group",
    "builder.package_settings.merge_open": "Merge…",
    "builder.package_settings.merge_title": "Merge into one setting",
    "builder.package_settings.merge_intro": "Every param then reads the same setting. The other keys go; streamers who picked something there see what rests when they switch.",
    "builder.package_settings.merge_keep": "Keep key: :key",
    "builder.package_settings.merge_label": "Name for streamers",
    "builder.package_settings.merge_submit": "Merge",
    "builder.package_settings.merge_refused": "\":key\" cannot be merged here: it must be a declared resource setting of the same type.",
    "builder.package_settings.save_first": "Save your changes first: a merge writes the saved state.",
    "builder.package_settings.distinct_refused": "\":key\" is not declared.",
    "builder.package_settings.hints": "Notes",
    "builder.package_settings.changes": "What changes for streamers who switch",
    "builder.package_settings.view": "View",
    "builder.package_settings.major_proposed": "A key goes: a major change, streamers switch themselves.",
    "builder.package_settings.first_unnamed": "Before the first release a merge costs nothing, after it a major.",
    "builder.package_settings.merge_now": "Merge now",
    "builder.package_settings.distinct": "They differ",
    "builder.package_settings.answer_first": "Answer the question above first.",
    "builder.package_settings.pane_intro": "Only ticked ones arrive: as sb.settings in code and as {settings.*} in templates. A template that uses one ticks it itself.",
    "builder.package_settings.pane_empty": "The package has no settings yet.",
    "builder.package_settings.widget_writes": "Widget writes",
    "builder.package_settings.template_uses": "used by a template",
    "builder.package_settings.move": "Make it a package setting",
    "builder.package_settings.move_help": "Then it holds for every placement. The widget names it, {config.:key} becomes {settings.:key}.",
    "builder.package_settings.move_done": "{0} \":name\" is now a package setting :widget names. No placeholder rewritten.|[1,1] \":name\" is now a package setting :widget names. :count placeholder rewritten.|[2,*] \":name\" is now a package setting :widget names. :count placeholders rewritten.",
    "builder.package_settings.move_lines": "In the code, not rewritten (that stays yours):",
    "builder.package_settings.move_refused": "\":key\" cannot move: the widget has no such field, or the setting exists already.",
    "builder.package_settings.move_shown_if": "\":key\" shows only when \":field\" matches. Make \":field\" a package setting first, or remove the condition.",
    "builder.package_settings.move_shows": "\":field\" shows only when \":key\" matches. Move \":field\" first, or remove its condition.",
    "builder.package_settings.streamer_sets": "The streamer sets this",
    "builder.package_settings.package_setting": "Package setting",
    "builder.package_settings.new_setting": "+ New setting",
    "builder.package_settings.label_for_streamers": "Label for streamers",
    "builder.package_settings.help_for_streamers": "Help",
    "builder.package_settings.same_setting": "The same setting is read by:",
    "builder.package_settings.same_setting_all": "Label and help hold for all of them.",
    "builder.package_settings.resource_always": "A resource is always a package setting.",
    "builder.package_settings.open_settings": "Open in Settings",
    "ui.emotes.title": "Emotes",
    "ui.emotes.card_description": "BetterTTV and 7TV emotes in your chat: what is loaded, and a reload.",
    "ui.emotes.intro": "Streambridge loads your channel's BetterTTV and 7TV emotes on its own while you are live or somebody is chatting.",
    "ui.emotes.state_loaded": ":count emote, last updated :time|:count emotes, last updated :time",
    "ui.emotes.state_no_account": "No account at this provider, global emotes only",
    "ui.emotes.state_not_loaded": "Not loaded yet: the channel is offline and nobody has chatted",
    "ui.emotes.state_unreachable_since": "Unreachable, showing the emotes from :time",
    "ui.emotes.state_unreachable_none": "Unreachable, no emotes loaded",
    "ui.emotes.state_off": "Turned off by Streambridge",
    "ui.emotes.reload": "Reload emotes",
    "ui.emotes.reload_wait": "You can reload once a minute.",
    "ui.emotes.reload_failed": "Could not ask for a reload. Try again in a moment.",
    "builder.packages.waiting_title": "Waiting for you",
    "builder.packages.owned_title": "Yours",
    "builder.packages.shared_title": "You build with others",
    "builder.packages.waiting_invitation": "Invitation from :sender to build it with them",
    "builder.packages.waiting_hand_on": ":sender wants to hand it on to you",
    "builder.packages.waiting_hand_on_admin": ":sender offers it to you on behalf of the platform",
    "builder.packages.decline": "Decline",
    "builder.packages.decline_aria": "Decline :name",
    "builder.packages.accept": "Accept…",
    "builder.packages.accept_aria": "Accept the invitation to :name",
    "builder.packages.take_over": "Take over…",
    "builder.packages.take_over_aria": "Take over :name",
    "builder.packages.owned_by": "owned by :owner",
    "builder.packages.hand_on_open": "Hand-on to :name open",
    "builder.packages.hand_on_to_you": "Hand-on to you open",
    "builder.packages.leave": "Leave",
    "builder.packages.leave_aria": "Leave package :name",
    "builder.packages.builds_with": "Builds it with you: :names",
    "builder.people.invite_accept_title": "Build “:name” with them?",
    "builder.people.invite_accept_lead": ":sender invites you to build “:name” with them.",
    "builder.people.invite_accept_body": "As an author you build content and assets, test on your channel, publish, and invite streamers. Inviting and removing authors, handing the package on and deleting it stay with its owner.",
    "builder.people.invite_accept_confirm": "Accept",
    "builder.people.hand_on_accept_title": "Take over “:name”?",
    "builder.people.hand_on_accept_lead": ":sender wants to hand the package on to you.",
    "builder.people.hand_on_accept_lead_admin": ":sender offers you the package on behalf of the platform.",
    "builder.people.hand_on_accept_body": "You become the owner: you decide who builds it with you, and whether it is handed on or deleted. Its owner so far stays an author.",
    "builder.people.hand_on_accept_confirm": "Take over",
    "builder.people.keeps_hint": "The id :id, the listing and all installs stay.",
    "builder.people.leave_title": "Leave “:name”?",
    "builder.people.leave_work": "Your work stays in the package.",
    "builder.people.leave_ends": "Your channel test is switched off, your preview address stops working, and uploads you started are refused. What you installed stays.",
    "builder.people.leave_return": "You can come back only with a new invitation from :owner.",
    "builder.people.leave_confirm": "Leave",
    "builder.people.remove_return": "The way back is a new invitation only.",
    "builder.people.title": "People on :name",
    "builder.people.cluster_aria": "{1} Show the people on :name: 1 author|[2,*] Show the people on :name: :count authors",
    "builder.people.invite_aria": "Invite an author",
    "builder.people.you": "(you)",
    "builder.people.test_on": "Channel test on",
    "builder.people.test_waiting": "Channel test on · live, waiting",
    "builder.people.test_off": "Channel test off",
    "builder.people.menu_aria": "Actions for :name",
    "builder.people.hand_on_to": "Hand on to :name…",
    "builder.people.remove": "Remove…",
    "builder.people.invited": "invited on :date, not accepted yet",
    "builder.people.withdraw": "Withdraw",
    "builder.people.withdraw_invitation_aria": "Withdraw the invitation to :name",
    "builder.people.withdraw_offer_aria": "Withdraw the hand-on to :name",
    "builder.people.invite_label": "Invite an author: Twitch name",
    "builder.people.invite_placeholder": "Search by Twitch name…",
    "builder.people.not_member": "not a Builder member",
    "builder.people.offer_open": "Hand-on offered to :name on :date. Nothing changes until they accept.",
    "builder.people.offer_open_admin": "The hand-on was offered to :name on behalf of the platform on :date. Nothing changes until they accept.",
    "builder.people.offer_to_you": "You are offered this package to take over. You can answer in the package list under “Waiting for you”.",
    "builder.people.offer_answer": "Open the package list",
    "builder.people.only_owner": "Only :name can invite, remove, hand on and delete.",
    "builder.people.leave_owner": "Leave…",
    "builder.people.leave_author": "Leave package…",
    "builder.people.delete": "Delete package…",
    "builder.people.remove_title": "Remove :name as an author?",
    "builder.people.remove_work": "What :name built stays in the package.",
    "builder.people.remove_ends": "The channel test on :name's channel is switched off at once, also in the middle of a stream. The package's preview address is renewed, and uploads they started are refused. Installed releases stay.",
    "builder.people.remove_confirm": "Remove",
    "builder.people.owner_leave_title": "You are the owner of “:name”",
    "builder.people.owner_leave_body": "Hand it on to an author first, then you can leave.",
    "builder.people.owner_leave_action": "Hand on…",
    "builder.people.owner_leave_alone": "You build it alone. You cannot leave it, only delete it.",
    "builder.people.owner_leave_offered": "You offered the hand-on to :name. Once it is accepted, you can leave.",
    "builder.people.hand_on_title": "Hand on “:name”",
    "builder.people.hand_on_whom": "To whom? Only somebody who already builds it can get it.",
    "builder.people.hand_on_until": "Nothing changes until it is accepted, and you can withdraw the offer. After that you are an author and can leave.",
    "builder.people.hand_on_send": "Send the offer to :name",
    "builder.people.hand_on_send_none": "Send the offer",
    "builder.people.delete_loses": "builds it too and loses it as well.",
    "builder.people.delete_invitations": "{1} One open author invitation lapses.|[2,*] :count open author invitations lapse.",
    "builder.people.delete_hand_on": "The open hand-on to :name lapses.",
    "builder.people.delete_releases": "The releases stay.",
    "builder.people.delete_instead": "Rather pass it on?",
    "builder.people.delete_instead_action": "Hand it on to an author…",
    "builder.presence.here": "here",
    "builder.presence.here_in": "here · in :item since :time",
    "builder.presence.away": "away",
    "builder.presence.away_since": "away · building it since :date",
    "builder.presence.here_count": ":count is here|:count are here",
    "builder.presence.your_agent": "your agent · :ago",
    "builder.presence.your_agent_in": "your agent · in :item, :ago",
    "builder.presence.agent": "Agent · :ago",
    "builder.presence.agent_in": "Agent · in :item, :ago",
    "builder.presence.open": ":names has this open|:names have this open",
    "builder.presence.open_also": ":names has this open too|:names have this open too",
    "builder.presence.your_agent_works": "your agent is working on this",
    "builder.presence.agent_works": ":name is working on this",
    "builder.presence.gone_title": "You no longer build this package",
    "builder.presence.gone_body": "You are no longer an author of :name, or the package was deleted. What you still have open here can no longer be saved.",
    "builder.presence.gone_action": "To my packages",
    "builder.distribution.by": "by :name",
    "builder.distribution.by_you": "by you",
    "builder.distribution.link_for": "Install link for v:version",
    "builder.distribution.status_pending": "pending",
    "builder.distribution.status_accepted": "accepted",
    "builder.distribution.status_declined": "declined",
    "builder.distribution.status_cancelled": "cancelled",
    "builder.distribution.status_expired": "expired",
    "builder.distribution.status_unredeemed": "not redeemed",
    "builder.distribution.status_redeemed": "redeemed",
    "builder.distribution.status_revoked": "revoked",
    "builder.distribution.cancel_aria": "Cancel: invitation to :name",
    "builder.distribution.copy_aria": "Copy URL: install link for v:version, by :name",
    "builder.distribution.revoke_aria": "Revoke: install link for v:version, by :name"
}
