Files
orion/app/modules/loyalty/locales/en.json
Samir Boulahtit 5f2885023c
Some checks failed
CI / ruff (push) Successful in 19s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has been cancelled
fix(loyalty-admin): require at least one terms field on program form
If a merchant saves a loyalty program with both terms_text and
terms_cms_page_slug empty, the storefront enrollment page renders the
"Terms & Conditions" link as a non-clickable <span> (see enroll.html
template branch) — customers can't read what they're agreeing to.

Two changes to the shared program-form to make this impossible to ship
by accident:

1. Yellow warning banner inside the Terms section, visible only when
   both fields are empty. Tells the admin what the storefront will
   look like and what to fix.
2. Save button is disabled until at least one of the two terms
   fields is filled. The button gets a localised :title tooltip
   explaining why it's disabled, and disabled:cursor-not-allowed so
   the disabled state is obvious on hover.

Added three i18n keys (terms_required_warning, terms_text_hint,
terms_required_tooltip) in en/fr/de/lb, plus a small "either this or
the slug above is required" hint under the textarea so each field is
self-explanatory in isolation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 23:36:14 +02:00

984 lines
45 KiB
JSON

{
"loyalty": {
"module": {
"name": "Loyalty Programs",
"description": "Stamp-based and points-based loyalty programs with wallet integration"
},
"program": {
"title": "Loyalty Program",
"create": "Create Program",
"edit": "Edit Program",
"activate": "Activate",
"deactivate": "Deactivate",
"type": {
"stamps": "Stamps",
"points": "Points",
"hybrid": "Hybrid"
}
},
"card": {
"title": "Loyalty Card",
"number": "Card Number",
"qr_code": "QR Code",
"enroll": "Enroll Customer",
"deactivate": "Deactivate Card"
},
"stamp": {
"title": "Stamps",
"add": "Add Stamp",
"redeem": "Redeem Reward",
"count": "{current} of {target}",
"until_reward": "{count} until reward"
},
"points": {
"title": "Points",
"earn": "Earn Points",
"redeem": "Redeem Points",
"balance": "{count} points",
"per_euro": "{points} points per euro"
},
"pin": {
"title": "Staff PINs",
"create": "Create PIN",
"edit": "Edit PIN",
"unlock": "Unlock PIN",
"locked": "PIN locked until {time}"
},
"wallet": {
"google": "Add to Google Wallet",
"apple": "Add to Apple Wallet"
},
"stats": {
"title": "Statistics",
"total_cards": "Total Cards",
"active_cards": "Active Cards",
"stamps_issued": "Stamps Issued",
"rewards_redeemed": "Rewards Redeemed"
},
"errors": {
"program_not_found": "Loyalty program not found",
"program_inactive": "Loyalty program is not active",
"card_not_found": "Loyalty card not found",
"card_inactive": "Loyalty card is not active",
"cooldown": "Please wait {minutes} minutes before next stamp",
"daily_limit": "Daily stamp limit of {limit} reached",
"insufficient_stamps": "Need {required} stamps, have {current}",
"insufficient_points": "Need {required} points, have {current}",
"pin_required": "Staff PIN is required",
"pin_invalid": "Invalid staff PIN",
"pin_locked": "PIN locked due to too many failed attempts"
}
},
"permissions": {
"view_programs": "View Programs",
"view_programs_desc": "View loyalty programs and details",
"manage_programs": "Manage Programs",
"manage_programs_desc": "Create and configure loyalty programs",
"view_rewards": "View Rewards",
"view_rewards_desc": "View loyalty rewards and redemptions",
"manage_rewards": "Manage Rewards",
"manage_rewards_desc": "Create and manage loyalty rewards"
},
"menu": {
"loyalty": "Loyalty",
"loyalty_programs": "Loyalty Programs",
"programs": "Programs",
"analytics": "Analytics",
"dashboard": "Dashboard",
"terminal": "Terminal",
"customer_cards": "Customer Cards",
"statistics": "Statistics",
"program": "Program",
"overview": "Overview",
"settings": "Settings",
"wallet_debug": "Wallet Debug",
"staff_pins": "Staff PINs",
"transactions": "Transactions",
"terminal_devices": "Terminal Devices"
},
"onboarding": {
"create_program": {
"title": "Create a loyalty program",
"description": "Set up your first stamp or points program"
}
},
"enrollment": {
"title": "Join Our Rewards Program!",
"subtitle": "Earn {points} point for every EUR you spend",
"not_available_title": "Program Not Available",
"not_available_message": "This store doesn't have a loyalty program set up yet.",
"welcome_bonus": "Get {points} bonus points when you join!",
"already_member": "Already a member? Your points are linked to your email.",
"form": {
"email": "Email",
"first_name": "First Name",
"last_name": "Last Name",
"phone": "Phone (optional)",
"birthday": "Birthday (optional)",
"birthday_hint": "For special birthday rewards",
"terms_agree": "I agree to the",
"terms": "Terms & Conditions",
"marketing_consent": "Send me news and special offers",
"joining": "Joining...",
"join_button": "Join & Get {points} Points"
},
"privacy_policy": "Privacy Policy",
"close": "Close",
"success": {
"title": "Welcome!",
"message": "You're now a member of our rewards program.",
"card_number": "Your Card Number",
"wallet_prompt": "Save your card to your phone for easy access:",
"next_steps_title": "What's Next?",
"step_earn": "Show your card number when making purchases to earn points",
"step_balance": "Check your balance online or in the app",
"step_redeem": "Redeem points for rewards at any of our locations",
"view_dashboard": "View My Loyalty Dashboard",
"back_to_home": "Back to Home"
},
"already_enrolled_title": "You're already a member!",
"cross_location_message": "Your card works at all our locations:",
"single_location_message": "Your card is registered at {store_name}",
"available_locations": "Use your card at all our locations:",
"errors": {
"load_failed": "Failed to load program information",
"email_exists": "This email is already registered in our loyalty program.",
"failed": "Enrollment failed. Please try again."
}
},
"common": {
"activate": "Activate",
"active": "Active",
"add": "Add",
"all_stores": "All Stores",
"at": "at",
"back": "Back",
"cancel": "Cancel",
"confirm": "Confirm",
"continue": "Continue",
"copy": "Copy",
"deactivate": "Deactivate",
"delete": "Delete",
"disabled": "Disabled",
"edit": "Edit",
"enabled": "Enabled",
"inactive": "Inactive",
"loading": "Loading...",
"minutes": "minutes",
"never": "Never",
"no": "No",
"none": "None",
"or": "or",
"points": "points",
"program_not_setup": "Loyalty program not set up",
"program_not_setup_desc": "Please set up a loyalty program to get started",
"refresh": "Refresh",
"save": "Save",
"saving": "Saving...",
"total": "TOTAL",
"view": "View",
"yes": "Yes",
"contact_admin_setup": "Contact your administrator to set up the loyalty program",
"setup_program": "Set Up Program",
"unknown": "Unknown"
},
"transactions": {
"card_created": "Enrolled",
"welcome_bonus": "Welcome Bonus",
"stamp_earned": "Stamp Earned",
"stamp_redeemed": "Stamp Redeemed",
"stamp_voided": "Stamp Voided",
"stamp_adjustment": "Stamp Adjusted",
"points_earned": "Points Earned",
"points_redeemed": "Points Redeemed",
"points_voided": "Points Voided",
"points_adjustment": "Points Adjusted",
"points_expired": "Points Expired",
"card_deactivated": "Deactivated",
"reward_redeemed": "Reward Redeemed",
"welcome_bonus_note": "Welcome bonus on enrollment"
},
"shared": {
"analytics": {
"total_programs": "Total Programs",
"total_members": "Total Members",
"active_members": "Active Members",
"points_issued_30d": "Points Issued (30d)",
"transactions_30d": "Transactions (30d)",
"x_active": "{count} active",
"points_overview": "Points Overview",
"points_issued_vs_redeemed": "Points Issued vs Redeemed (30d)",
"issued": "Issued:",
"redeemed": "Redeemed:",
"redemption_rate": "Redemption Rate",
"outstanding_balance": "Outstanding Balance",
"member_activity": "Member Activity",
"active_members_30d": "Active Members (30d)",
"new_this_month": "New This Month",
"merchants_with_programs": "Merchants with Programs",
"avg_points_per_member": "Avg Points Per Member",
"all_time_statistics": "All-Time Statistics",
"total_points_issued": "Total Points Issued",
"total_points_redeemed": "Total Points Redeemed",
"points_redeemed_30d": "Points Redeemed (30d)",
"outstanding_liability": "Outstanding Liability",
"location_breakdown": "Location Breakdown",
"store": "Store",
"enrolled": "Enrolled",
"points_earned": "Points Earned",
"points_redeemed": "Points Redeemed"
},
"program_view": {
"program_configuration": "Program Configuration",
"program_name": "Program Name",
"card_name": "Card Name",
"stamps_configuration": "Stamps Configuration",
"stamps_target": "Stamps Target",
"reward_description": "Reward Description",
"reward_value": "Reward Value",
"points_configuration": "Points Configuration",
"points_per_eur": "Points per EUR",
"welcome_bonus": "Welcome Bonus",
"x_points": "{count} points",
"minimum_redemption": "Minimum Redemption",
"minimum_purchase": "Minimum Purchase",
"points_expiration": "Points Expiration",
"x_days_inactivity": "{days} days of inactivity",
"redemption_rewards": "Redemption Rewards",
"reward": "Reward",
"points_required": "Points Required",
"description": "Description",
"anti_fraud": "Anti-Fraud",
"cooldown": "Cooldown",
"x_minutes": "{count} minutes",
"max_daily_stamps": "Max Daily Stamps",
"staff_pin_required": "Staff PIN Required",
"branding": "Branding",
"primary_color": "Primary Color",
"secondary_color": "Secondary Color",
"logo_url": "Logo URL",
"hero_image_url": "Hero Image URL",
"terms_privacy": "Terms & Privacy",
"terms_conditions": "Terms & Conditions",
"privacy_policy_url": "Privacy Policy URL"
},
"cards": {
"total_members": "Total Members",
"active_30d": "Active (30d)",
"new_this_month": "New This Month",
"total_points_balance": "Total Points Balance",
"search_placeholder": "Search by name, email, phone, or card number...",
"all_status": "All Status",
"all_stores": "All Stores",
"col_member": "Member",
"col_card_number": "Card Number",
"col_points_balance": "Points Balance",
"col_last_activity": "Last Activity",
"col_status": "Status",
"col_actions": "Actions",
"no_members": "No members found",
"adjust_search": "Try adjusting your search criteria"
},
"card_detail": {
"title": "Card Detail",
"loading": "Loading card details...",
"error_loading": "Error loading card details",
"points_balance": "Points Balance",
"total_earned": "Total Earned",
"total_redeemed": "Total Redeemed",
"member_since": "Member Since",
"customer_information": "Customer Information",
"name": "Name",
"email": "Email",
"phone": "Phone",
"birthday": "Birthday",
"card_details": "Card Details",
"card_number": "Card Number",
"status": "Status",
"last_activity": "Last Activity",
"enrolled_at": "Enrolled At",
"transaction_history": "Transaction History",
"col_date": "Date",
"col_type": "Type",
"col_points": "Points",
"col_location": "Location",
"col_notes": "Notes",
"no_transactions": "No transactions found"
},
"transactions": {
"title": "Transactions",
"subtitle": "View all loyalty transactions",
"adjust_filters": "Try adjusting your filters",
"loading": "Loading transactions...",
"error_loading": "Error loading transactions",
"search_placeholder": "Search transactions...",
"all_types": "All Types",
"all_stores": "All Stores",
"col_date": "Date",
"col_customer": "Customer",
"col_type": "Type",
"col_points": "Points",
"col_location": "Location",
"col_notes": "Notes",
"no_transactions": "No transactions found",
"type_adjust": "Adjust",
"type_earn": "Earn",
"type_expire": "Expire",
"type_redeem": "Redeem"
},
"pins": {
"title": "Staff PINs",
"subtitle": "Manage staff authentication PINs",
"loading": "Loading PINs...",
"error_loading": "Error loading PINs",
"total_pins": "Total PINs",
"active_pins": "Active",
"locked_pins": "Locked",
"all_stores": "All Stores",
"all_status": "All Status",
"status_active": "Active",
"status_inactive": "Inactive",
"status_locked": "Locked",
"col_name": "Name",
"col_staff_id": "Staff ID",
"col_store": "Store",
"col_status": "Status",
"col_locked": "Locked",
"col_last_used": "Last Used",
"col_actions": "Actions",
"no_pins": "No staff PINs found",
"create_pin": "Create PIN",
"edit_pin": "Edit PIN",
"delete_pin": "Delete PIN",
"unlock_pin": "Unlock",
"confirm_delete": "Are you sure you want to delete this PIN?",
"pin_name": "Staff member name",
"pin_staff_id": "Employee ID (optional)",
"pin_code": "PIN Code",
"pin_code_hint": "4-6 digit PIN",
"pin_edit_hint": "Leave blank to keep current PIN",
"pin_edit_placeholder": "New PIN (optional)",
"pin_store": "Store",
"select_store": "Select store",
"pin_created": "PIN created successfully",
"pin_updated": "PIN updated successfully",
"pin_deleted": "PIN deleted successfully",
"pin_unlocked": "PIN unlocked successfully",
"save": "Save",
"cancel": "Cancel",
"read_only_notice": "PINs are read-only in admin view",
"save_changes": "Save Changes",
"unlock": "Unlock",
"no_staff_found": "No staff members found"
},
"program_form": {
"program_type": "Program Type",
"points_type_desc": "Earn points per EUR spent",
"stamps_type_desc": "Collect N stamps, get reward",
"hybrid_type_desc": "Both stamps and points",
"stamps_configuration": "Stamps Configuration",
"stamps_target": "Stamps Target",
"stamps_target_help": "Number of stamps needed for reward",
"reward_description": "Reward Description",
"reward_value_cents": "Reward Value (cents)",
"points_configuration": "Points Configuration",
"points_per_eur": "Points per EUR spent",
"eur_equals_points": "1 EUR = {points} point(s)",
"welcome_bonus_points": "Welcome Bonus Points",
"welcome_bonus_help": "Bonus points awarded on enrollment",
"minimum_redemption_points": "Minimum Redemption Points",
"minimum_purchase_cents": "Minimum Purchase (cents)",
"minimum_purchase_help": "Minimum purchase amount to earn points (0 = no minimum)",
"points_expiration_days": "Points Expiration (days)",
"points_expiration_help": "Days of inactivity before points expire (0 = never)",
"redemption_rewards": "Redemption Rewards",
"add_reward": "Add Reward",
"no_rewards_configured": "No rewards configured. Add a reward to allow customers to redeem points.",
"reward_name": "Reward Name",
"points_required": "Points Required",
"description": "Description",
"anti_fraud_settings": "Anti-Fraud Settings",
"cooldown_minutes": "Cooldown (minutes)",
"cooldown_help": "Time between stamps from the same card",
"max_daily_stamps": "Max Daily Stamps",
"max_daily_stamps_help": "Maximum stamps per card per day",
"require_staff_pin": "Require Staff PIN",
"branding": "Branding",
"card_name": "Card Name",
"primary_color": "Primary Color",
"secondary_color": "Secondary Color",
"logo_url": "Logo URL",
"logo_url_help": "Required for Google Wallet integration. Must be a publicly accessible image URL (PNG or JPG).",
"hero_image_url": "Hero Image URL",
"terms_privacy": "Terms & Privacy",
"terms_cms_page": "CMS Page Slug",
"terms_cms_page_hint": "Enter a CMS page slug (e.g. terms-and-conditions) to display full T&C from the CMS module",
"terms_conditions": "Terms & Conditions (fallback)",
"terms_fallback_hint": "Used when no CMS page slug is set",
"terms_text_hint": "Plain-text fallback. Either this field OR the CMS page slug above is required so customers can read the terms on the enrollment page.",
"terms_required_warning": "Customers must be able to read your terms before accepting them. Fill in either the CMS page slug above or the plain-text fallback below — until you do, the 'Terms & Conditions' link on the storefront enrollment page is not clickable.",
"terms_required_tooltip": "Fill in either the CMS page slug or the plain-text terms before saving.",
"privacy_policy_url": "Privacy Policy URL",
"program_status": "Program Status",
"program_active": "Program Active",
"program_active_help": "When disabled, customers cannot earn or redeem",
"delete_program": "Delete Program",
"create_program": "Create Program",
"save_changes": "Save Changes"
}
},
"admin": {
"programs": {
"title": "Loyalty Programs",
"create_program": "Create Program",
"loading": "Loading loyalty programs...",
"error_loading": "Error loading loyalty programs",
"total_programs": "Total Programs",
"active": "Active",
"total_members": "Total Members",
"transactions_30d": "Transactions (30d)",
"search_placeholder": "Search by merchant name...",
"all_status": "All Status",
"table_merchant": "Merchant",
"table_program_type": "Program Type",
"table_members": "Members",
"table_points_issued": "Points Issued",
"table_status": "Status",
"table_created": "Created",
"table_actions": "Actions",
"no_programs": "No loyalty programs found",
"adjust_filters": "Try adjusting your search or filters",
"no_merchants_yet": "No merchants have set up loyalty programs yet",
"x_active": "({count} active)",
"x_redeemed": "{count} redeemed",
"pt_per_eur": "pt/EUR",
"delete_title": "Delete Loyalty Program",
"delete_message": "Delete the loyalty program for \"{name}\"? This will permanently remove all associated data (cards, transactions, rewards). This cannot be undone.",
"delete_confirm": "Delete Program",
"create_title": "Create Loyalty Program",
"create_description": "Select a merchant to create a loyalty program for.",
"search_merchant": "Search Merchant",
"type_merchant_name": "Type merchant name...",
"no_merchants_found": "No merchants found",
"existing_program_warning": "This merchant already has a loyalty program.",
"view_edit_existing": "View / Edit existing program"
},
"merchant_detail": {
"title": "Merchant Loyalty Details",
"loading": "Loading merchant loyalty details...",
"error_loading": "Error loading merchant loyalty",
"program_active": "Loyalty Program Active",
"no_program_subtitle": "No Loyalty Program",
"quick_actions": "Quick Actions",
"edit_program": "Edit Program",
"admin_policy": "Admin Policy",
"view_merchant": "View Merchant",
"total_members": "Total Members",
"active_30d": "Active (30d)",
"points_issued_30d": "Points Issued (30d)",
"points_redeemed_30d": "Points Redeemed (30d)",
"no_program": "No Loyalty Program",
"no_program_desc": "This merchant has not set up a loyalty program yet.",
"create_program": "Create Program",
"delete_title": "Delete Loyalty Program",
"delete_message": "This will permanently delete the loyalty program and all associated data. This action cannot be undone.",
"delete_confirm": "Delete Program",
"location_breakdown": "Location Breakdown",
"table_location": "Location",
"table_enrolled": "Enrolled",
"table_points_earned": "Points Earned",
"table_points_redeemed": "Points Redeemed",
"table_transactions_30d": "Transactions (30d)",
"transaction_categories": "Transaction Categories",
"select_store": "Select a store...",
"no_categories": "No categories configured. Click Add to create one.",
"delete_category_message": "Are you sure you want to delete this category? Existing transactions will keep the category reference but it will no longer be available for new transactions.",
"admin_policy_settings": "Admin Policy Settings",
"staff_pin_policy": "Staff PIN Policy",
"self_enrollment": "Self Enrollment",
"cross_location_redemption": "Cross-Location Redemption",
"allowed": "Allowed",
"disabled": "Disabled",
"modify_policy": "Modify admin policy",
"view_cards": "View Cards",
"view_transactions": "View Transactions",
"view_pins": "View PINs"
},
"merchant_cards": {
"title": "Merchant Cards",
"subtitle": "View loyalty cards for this merchant",
"loading": "Loading cards...",
"error_loading": "Error loading cards"
},
"merchant_card_detail": {
"title": "Card Detail",
"error_loading": "Error loading card",
"loading": "Loading card details..."
},
"merchant_transactions": {
"title": "Merchant Transactions",
"subtitle": "View all transactions for this merchant",
"loading": "Loading transactions...",
"error_loading": "Error loading transactions"
},
"merchant_pins": {
"title": "Merchant Staff PINs",
"subtitle": "View staff PINs for this merchant (read-only)",
"loading": "Loading PINs...",
"error_loading": "Error loading PINs"
},
"merchant_settings": {
"title": "Merchant Loyalty Settings",
"loading": "Loading settings...",
"error_loading": "Error loading settings",
"admin_controlled": "Admin-controlled settings for this merchant's loyalty program",
"staff_pin_policy": "Staff PIN Policy",
"staff_pin_description": "Control whether staff members at this merchant's locations must enter a PIN to process loyalty transactions.",
"required": "Required",
"required_desc": "Staff must enter their PIN for every transaction. Recommended for security.",
"optional": "Optional",
"optional_desc": "Stores can choose whether to require PINs at their locations.",
"pin_disabled": "Disabled",
"pin_disabled_desc": "Staff PINs are not used. Any staff member can process transactions.",
"pin_lockout_settings": "PIN Lockout Settings",
"max_failed_attempts": "Max Failed Attempts",
"max_failed_attempts_help": "Number of wrong attempts before lockout (3-10)",
"lockout_duration": "Lockout Duration (minutes)",
"lockout_duration_help": "How long to lock out after failed attempts (5-120 minutes)",
"enrollment_settings": "Enrollment Settings",
"allow_self_enrollment": "Allow Self-Service Enrollment",
"self_enrollment_desc": "Customers can sign up via QR code without staff assistance",
"transaction_settings": "Transaction Settings",
"allow_cross_location": "Allow Cross-Location Redemption",
"cross_location_desc": "Customers can redeem points at any merchant location",
"allow_void": "Allow Void Transactions",
"void_desc": "Staff can void points/stamps for returns",
"save_settings": "Save Settings"
},
"analytics": {
"title": "Loyalty Analytics",
"subtitle": "Platform-wide loyalty program statistics",
"loading": "Loading analytics...",
"error_loading": "Error loading analytics",
"filter_by_merchant": "Filter by Merchant",
"search_merchants_placeholder": "Search merchants by name...",
"showing_stats_for": "Showing stats for:",
"wallet_status": "Wallet Integration Status",
"google_wallet": "Google Wallet",
"apple_wallet": "Apple Wallet",
"connected": "Connected",
"error": "Error",
"not_configured": "Not Configured",
"issuer_id": "Issuer ID",
"project": "Project",
"wallet_objects": "Wallet Objects",
"loyalty_classes": "Loyalty Classes",
"pass_type_id": "Pass Type ID",
"team_id": "Team ID",
"active_passes": "Active Passes",
"quick_actions": "Quick Actions",
"view_all_programs": "View All Programs",
"manage_merchants": "Manage Merchants"
},
"program_edit": {
"title": "Program Configuration",
"loading": "Loading program configuration...",
"error_loading": "Error loading program configuration",
"create_subtitle": "Create a loyalty program for this merchant",
"edit_subtitle": "Edit program configuration",
"delete_title": "Delete Loyalty Program",
"delete_message": "This will permanently delete the loyalty program and all associated data (cards, transactions, rewards). This action cannot be undone.",
"delete_confirm": "Delete Program"
}
},
"merchant": {
"program": {
"title": "Loyalty Program",
"subtitle": "Your loyalty program configuration.",
"edit_program": "Edit Program",
"no_program": "No Loyalty Program",
"no_program_desc": "Your loyalty program hasn't been set up yet. Create one to start rewarding your customers.",
"create_program": "Create Program"
},
"program_edit": {
"title": "Loyalty Settings",
"page_title": "Loyalty Program Settings",
"subtitle": "Configure your loyalty program",
"loading": "Loading settings...",
"error_loading": "Error loading settings",
"delete_title": "Delete Loyalty Program",
"delete_message": "This will permanently delete your loyalty program and all associated data (cards, transactions, rewards). This action cannot be undone.",
"delete_confirm": "Delete Program"
},
"cards": {
"title": "Customer Cards",
"subtitle": "View and manage loyalty members across all locations",
"error_loading": "Error loading cards",
"loading": "Loading cards..."
},
"card_detail": {
"title": "Card Detail",
"card_label": "Card",
"error_loading": "Error loading card",
"loading": "Loading card details..."
},
"transactions": {
"title": "Transactions",
"subtitle": "View all loyalty transactions across locations",
"error_loading": "Error loading transactions",
"loading": "Loading transactions..."
},
"pins": {
"title": "Staff PINs",
"subtitle": "Manage staff PINs across all locations",
"error_loading": "Error loading PINs",
"loading": "Loading PINs..."
},
"settings": {
"title": "Loyalty Settings",
"subtitle": "View loyalty program settings",
"admin_controlled": "These settings are managed by the platform administrator",
"error_loading": "Error loading settings",
"loading": "Loading settings...",
"lockout_attempts": "Lockout Attempts",
"lockout_minutes": "Lockout Duration (min)",
"permissions": "Enrollment & Permissions",
"pin_policy": "PIN Policy",
"staff_pin_policy": "Staff PIN Policy",
"self_enrollment": "Self Enrollment",
"cross_location": "Cross-Location Redemption",
"void_transactions": "Allow Void Transactions",
"enabled": "Enabled",
"disabled": "Disabled",
"required": "Required",
"optional": "Optional"
},
"analytics": {
"title": "Loyalty Analytics",
"subtitle": "Loyalty program statistics across all your stores",
"loading": "Loading analytics...",
"error_loading": "Error loading analytics",
"no_program": "No Loyalty Program",
"no_program_desc": "Set up a loyalty program to see analytics here.",
"create_program": "Create Program",
"quick_actions": "Quick Actions",
"view_program": "View Program",
"edit_program": "Edit Program"
}
},
"store": {
"terminal": {
"title": "Loyalty Terminal",
"subtitle": "Process loyalty transactions",
"members": "Members",
"analytics": "Analytics",
"loading": "Loading loyalty terminal...",
"error_loading": "Error loading terminal",
"not_setup": "Loyalty Program Not Set Up",
"not_setup_desc": "Your merchant doesn't have a loyalty program configured yet.",
"setup_program": "Set Up Loyalty Program",
"contact_admin": "Contact your administrator to complete the setup.",
"find_customer": "Find Customer",
"search_placeholder": "Email, phone, or card number...",
"looking_up": "Looking up...",
"look_up_customer": "Look Up Customer",
"enroll_new_customer": "Enroll New Customer",
"customer_found": "Customer Found",
"points_balance": "Points Balance",
"stamps": "Stamps",
"x_more_for_reward": "{count} more for reward",
"ready_to_redeem": "Ready to redeem!",
"add_stamp": "Add Stamp",
"current": "Current:",
"cooldown_active": "Cooldown active",
"redeem_stamps": "Redeem Stamps",
"not_enough_stamps": "Not enough stamps yet",
"earn_points": "Earn Points",
"purchase_amount": "Purchase Amount",
"points_to_award": "Points to award:",
"award_points": "Award Points",
"redeem_reward": "Redeem Reward",
"select_reward": "Select Reward",
"select_reward_placeholder": "Select reward...",
"points_after": "Points after:",
"search_to_process": "Search for a customer to process a transaction",
"recent_transactions": "Recent Transactions at This Location",
"col_time": "Time",
"col_customer": "Customer",
"col_type": "Type",
"col_points": "Points",
"col_notes": "Notes",
"no_recent_transactions": "No recent transactions",
"enter_staff_pin": "Enter Staff PIN",
"pin_authorize": "Enter your staff PIN to authorize this transaction.",
"clear": "Clear",
"processing": "Processing...",
"customer_not_found": "Customer not found. You can enroll them as a new member.",
"error_lookup": "Error looking up customer: {message}",
"transaction_failed": "Transaction failed: {message}",
"stamp_added": "Stamp added!",
"stamps_redeemed": "Stamps redeemed! Reward earned.",
"x_points_awarded": "{points} points awarded!",
"reward_redeemed": "Reward redeemed: {name}",
"card_label": "Card",
"confirm": "Confirm",
"select_category": "Category (what was sold)",
"pin_authorize_text": "Enter your staff PIN to authorize this transaction",
"free_item": "Free item",
"reward_label": "Reward",
"search_empty_state": "Search for a customer to get started"
},
"cards": {
"title": "Loyalty Members",
"subtitle": "View and manage your loyalty program members",
"enroll_new": "Enroll New",
"loading": "Loading members...",
"error_loading": "Error loading members",
"total_members": "Total Members",
"active_30d": "Active (30d)",
"new_this_month": "New This Month",
"total_points_balance": "Total Points Balance",
"search_placeholder": "Search by name, email, phone, or card...",
"all_status": "All Status",
"col_member": "Member",
"col_card_number": "Card Number",
"col_points_balance": "Points Balance",
"col_last_activity": "Last Activity",
"col_status": "Status",
"col_actions": "Actions",
"no_members": "No members found",
"adjust_search": "Try adjusting your search",
"enroll_first": "Enroll your first customer to get started"
},
"card_detail": {
"title": "Member Details",
"loading": "Loading member details...",
"error_loading": "Error loading member",
"points_balance": "Points Balance",
"total_earned": "Total Earned",
"total_redeemed": "Total Redeemed",
"member_since": "Member Since",
"customer_information": "Customer Information",
"name": "Name",
"email": "Email",
"phone": "Phone",
"birthday": "Birthday",
"card_details": "Card Details",
"card_number": "Card Number",
"status": "Status",
"last_activity": "Last Activity",
"enrolled_at": "Enrolled At",
"transaction_history": "Transaction History",
"col_date": "Date",
"col_type": "Type",
"col_points": "Points",
"col_location": "Location",
"col_notes": "Notes",
"no_transactions": "No transactions yet",
"card_label": "Card",
"page_x_of_y": "Page {page} of {pages}"
},
"enroll": {
"title": "Enroll Customer",
"page_title": "Enroll New Customer",
"subtitle": "Add a new member to your loyalty program",
"loading": "Loading...",
"error_loading": "Error loading enrollment form",
"customer_information": "Customer Information",
"first_name": "First Name",
"last_name": "Last Name",
"email": "Email",
"phone": "Phone",
"birthday": "Birthday",
"birthday_help": "For birthday rewards (optional)",
"communication_preferences": "Communication Preferences",
"send_emails": "Send promotional emails",
"send_sms": "Send promotional SMS",
"welcome_bonus": "Welcome Bonus",
"welcome_bonus_desc": "Customer will receive {points} bonus points!",
"enroll_customer": "Enroll Customer",
"enrolling": "Enrolling...",
"customer_enrolled": "Customer Enrolled!",
"starting_balance": "Starting Balance:",
"x_points": "{count} points",
"back_to_terminal": "Back to Terminal",
"enroll_another": "Enroll Another",
"enrollment_failed": "Enrollment failed: {message}",
"bonus_points": "Bonus Points",
"card_number_label": "Card Number",
"points": "points"
},
"analytics": {
"title": "Loyalty Analytics",
"subtitle": "Track your loyalty program performance",
"loading": "Loading analytics...",
"error_loading": "Error loading analytics",
"quick_actions": "Quick Actions",
"open_terminal": "Open Terminal",
"view_members": "View Members",
"view_program": "View Program",
"revenue_title": "Points & Customers",
"at_risk_title": "At-Risk Members",
"cards_at_risk": "members at risk of churn",
"no_at_risk": "All members are active!",
"cohort_title": "Cohort Retention",
"cohort_month": "Enrollment Month",
"cohort_enrolled": "Enrolled",
"no_data_yet": "Not enough data yet. Analytics will appear as customers enroll and transact."
},
"program": {
"title": "Loyalty Program",
"subtitle": "Your loyalty program configuration",
"edit_program": "Edit Program",
"loading": "Loading program...",
"error_loading": "Error loading program",
"no_program": "No Loyalty Program",
"no_program_desc": "Your merchant doesn't have a loyalty program configured yet.",
"create_program": "Create Program",
"contact_admin": "Contact your administrator to set up a loyalty program."
},
"pins": {
"title": "Staff PINs",
"subtitle": "Manage staff authentication PINs for this location",
"loading": "Loading PINs...",
"error_loading": "Error loading PINs"
},
"settings": {
"title": "Loyalty Settings",
"page_title": "Loyalty Program Settings",
"subtitle": "Configure your loyalty program",
"back_to_program": "Back to Program",
"loading": "Loading settings...",
"error_loading": "Error loading settings",
"access_restricted": "Access Restricted",
"owner_only": "Only the merchant owner can manage loyalty program settings.",
"delete_title": "Delete Loyalty Program",
"delete_message": "This will permanently delete the loyalty program and all associated data (cards, transactions, rewards). This action cannot be undone.",
"delete_confirm": "Delete Program",
"program_created": "Program created successfully",
"program_updated": "Program updated successfully",
"program_deleted": "Loyalty program deleted",
"save_failed": "Failed to save: {message}",
"delete_failed": "Failed to delete: {message}",
"access_restricted_desc": "Only the merchant owner can modify program settings",
"delete_program_confirm": "Delete",
"delete_program_desc": "This will permanently delete the loyalty program and all associated data",
"delete_program_title": "Delete Loyalty Program?"
}
},
"storefront": {
"dashboard": {
"back_to_account": "Back to Account",
"my_loyalty": "My Loyalty",
"join_title": "Join Our Rewards Program!",
"join_subtitle": "Earn points on every purchase and redeem for rewards.",
"join_now": "Join Now",
"points_balance": "Points Balance",
"card_number": "Card Number",
"show_card": "Show Card",
"total_earned": "Total Earned",
"total_redeemed": "Total Redeemed",
"available_rewards": "Available Rewards",
"no_rewards_yet": "No rewards available yet",
"ready_to_redeem": "Ready to redeem",
"x_more_to_go": "{count} more to go",
"redeem_hint": "Show your card to staff to redeem rewards in-store.",
"recent_activity": "Recent Activity",
"view_all": "View All",
"no_transactions": "No transactions yet. Make a purchase to start earning points!",
"earn_redeem_locations": "Earn & Redeem Locations",
"your_loyalty_card": "Your Loyalty Card",
"show_to_staff": "Show this to staff when making a purchase or redeeming rewards."
},
"history": {
"back_to_loyalty": "Back to Loyalty",
"title": "Transaction History",
"subtitle": "View all your loyalty point transactions",
"current_balance": "Current Balance",
"total_earned": "Total Earned",
"total_redeemed": "Total Redeemed",
"no_transactions": "No transactions yet",
"balance": "Balance:",
"previous": "Previous",
"next": "Next",
"page_x_of_y": "Page {page} of {pages}"
},
"account": {
"loyalty": "Loyalty Rewards"
}
},
"toasts": {
"program_activated": "Program activated successfully",
"program_deactivated": "Program deactivated successfully",
"activate_failed": "Failed to activate program: {message}",
"deactivate_failed": "Failed to deactivate program: {message}",
"program_deleted": "Program deleted successfully",
"delete_failed": "Failed to delete program: {message}",
"program_created": "Program created successfully",
"program_updated": "Program updated successfully",
"loyalty_program_created": "Loyalty program created",
"loyalty_program_deleted": "Loyalty program deleted",
"settings_saved": "Settings saved successfully",
"save_failed": "Failed to save: {message}",
"settings_save_failed": "Failed to save settings: {message}",
"create_failed": "Failed to create program: {message}",
"logo_required": "Logo URL is required for wallet integration.",
"pin_created": "PIN created successfully",
"pin_updated": "PIN updated successfully",
"pin_deleted": "PIN deleted successfully",
"pin_unlocked": "PIN unlocked successfully",
"pin_create_error": "Failed to create PIN",
"pin_update_error": "Failed to update PIN",
"pin_delete_error": "Failed to delete PIN",
"pin_unlock_error": "Failed to unlock PIN"
},
"terminal_devices": {
"title": "Terminal Devices",
"subtitle": "Pair POS tablets to each store. The setup QR is shown only once at pairing time.",
"admin_subtitle": "Pair POS tablets on behalf of this merchant.",
"loading": "Loading devices...",
"error_loading": "Failed to load devices",
"no_devices": "No devices paired yet",
"show_revoked": "Include revoked",
"pair_device": "Pair Tablet",
"pair_hint": "A long-lived setup QR is generated. The tablet scans it once and connects from then on.",
"pairing_qr": "Tablet Pairing QR",
"qr_warning_title": "Save this now —",
"qr_warning_body": "this QR is shown only this time. If you close it before pairing, you will need to revoke and pair again.",
"qr_done": "I've paired the tablet",
"show_payload": "Show raw payload",
"label_field": "Device label",
"label_placeholder": "e.g. Counter 1",
"store_field": "Store",
"select_store": "Select store...",
"revoke": "Revoke",
"revoke_title": "Revoke device?",
"confirm_revoke": "Revoke device '{label}'? Its tablet will stop working immediately.",
"delete_title": "Delete device?",
"confirm_delete": "Permanently delete device '{label}'? This cannot be undone.",
"col_label": "Label",
"col_store": "Store",
"col_status": "Status",
"col_last_seen": "Last seen",
"col_expires": "Expires",
"col_actions": "Actions",
"status_active": "Active",
"status_revoked": "Revoked",
"status_expired": "Expired",
"toasts": {
"paired": "Tablet paired — show the QR to the device",
"revoked": "Device revoked",
"deleted": "Device deleted"
},
"errors": {
"store_required": "Please select a store",
"pair_failed": "Failed to pair device",
"revoke_failed": "Failed to revoke device",
"delete_failed": "Failed to delete device"
}
},
"errors": {
"card_not_found": "Card not found"
}
}